From 3128bf196c7e19b2a0425f346813c8384aea4f3c Mon Sep 17 00:00:00 2001 From: Victoria E Date: Fri, 17 Apr 2026 20:09:57 +0300 Subject: [PATCH 01/11] add cocoon --- api/openapi.json | 504 +- api/openapi.yml | 195 +- go.mod | 3 +- go.sum | 4 + pkg/api/cocoon_handlers.go | 83 + pkg/api/cocoon_pool.go | 70 + pkg/api/handler.go | 9 + pkg/oas/oas_client_gen.go | 310 +- pkg/oas/oas_handlers_gen.go | 340 +- pkg/oas/oas_interfaces_gen.go | 10 + pkg/oas/oas_json_gen.go | 871 ++- pkg/oas/oas_operations_gen.go | 2 + pkg/oas/oas_parameters_gen.go | 410 +- pkg/oas/oas_request_decoders_gen.go | 73 + pkg/oas/oas_request_encoders_gen.go | 16 + pkg/oas/oas_response_decoders_gen.go | 315 + pkg/oas/oas_response_encoders_gen.go | 92 + pkg/oas/oas_router_gen.go | 9927 +++++++++++++------------- pkg/oas/oas_schemas_gen.go | 280 +- pkg/oas/oas_server_gen.go | 18 +- pkg/oas/oas_unimplemented_gen.go | 24 +- pkg/oas/oas_validators_gen.go | 155 + 22 files changed, 8134 insertions(+), 5577 deletions(-) create mode 100644 pkg/api/cocoon_handlers.go create mode 100644 pkg/api/cocoon_pool.go create mode 100644 pkg/oas/oas_interfaces_gen.go diff --git a/api/openapi.json b/api/openapi.json index e4a5a945e..36b20a72e 100644 --- a/api/openapi.json +++ b/api/openapi.json @@ -2796,6 +2796,63 @@ }, "type": "array" }, + "CocoonWorkerInstance": { + "properties": { + "active_requests": { + "format": "int64", + "minimum": 0, + "type": "integer" + }, + "coefficient": { + "format": "int64", + "minimum": 0, + "type": "integer" + }, + "max_active_requests": { + "format": "int64", + "minimum": 0, + "type": "integer" + } + }, + "required": [ + "coefficient", + "active_requests", + "max_active_requests" + ], + "type": "object" + }, + "CocoonWorkerType": { + "properties": { + "name": { + "type": "string" + }, + "workers": { + "items": { + "$ref": "#/components/schemas/CocoonWorkerInstance" + }, + "type": "array" + } + }, + "required": [ + "name", + "workers" + ], + "type": "object" + }, + "CocoonWorkersResponse": { + "properties": { + "types": { + "items": { + "$ref": "#/components/schemas/CocoonWorkerType" + }, + "type": "array" + } + }, + "required": [ + "types" + ], + "type": "object" + }, "ComputePhase": { "properties": { "exit_code": { @@ -6874,7 +6931,7 @@ "type": "integer", "x-js-format": "bigint" }, - "election_id": { + "elect_at": { "description": "Election ID (electAt timestamp).", "example": 1740053384, "format": "int64", @@ -7711,6 +7768,139 @@ }, "openapi": "3.0.0", "paths": { + "/cocoon/query": { + "post": { + "description": "Proxy arbitrary OpenAI-style JSON to Cocoon (POST)", + "operationId": "postCocoonQuery", + "parameters": [ + { + "description": "Cocoon worker model name passed to the proxy.", + "in": "query", + "name": "model", + "schema": { + "type": "string" + } + }, + { + "description": "HTTP path on the Cocoon worker (e.g. /v1/chat/completions).", + "in": "query", + "name": "path", + "schema": { + "default": "/query", + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": {} + } + }, + "required": true + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": {} + } + }, + "description": "Successful response" + }, + "401": { + "content": { + "application/json": { + "schema": { + "properties": { + "error": { + "properties": { + "message": { + "type": "string" + }, + "type": { + "type": "string" + } + }, + "type": "object" + } + }, + "type": "object" + } + } + }, + "description": "Unauthorized" + }, + "501": { + "content": { + "application/json": { + "schema": { + "type": "object" + } + } + }, + "description": "Not implemented" + }, + "default": { + "$ref": "#/components/responses/Error" + } + } + } + }, + "/cocoon/workers": { + "get": { + "description": "Cocoon worker types (same shape as gocoon Connection.GetWorkerTypes)", + "operationId": "getCocoonWorkers", + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CocoonWorkersResponse" + } + } + }, + "description": "Successful response" + }, + "401": { + "content": { + "application/json": { + "schema": { + "properties": { + "error": { + "properties": { + "message": { + "type": "string" + }, + "type": { + "type": "string" + } + }, + "type": "object" + } + }, + "type": "object" + } + } + }, + "description": "Unauthorized" + }, + "501": { + "content": { + "application/json": { + "schema": { + "type": "object" + } + } + }, + "description": "Not implemented" + }, + "default": { + "$ref": "#/components/responses/Error" + } + } + } + }, "/v2/accounts/_bulk": { "post": { "description": "Get human-friendly information about several accounts without low-level details.", @@ -11785,187 +11975,6 @@ ] } }, - "/v2/rewards/round-rewards": { - "get": { - "description": "Computes per-validator and per-nominator reward distribution for a finished validation round using the elector's bonuses value.\n", - "operationId": "getRoundRewards", - "parameters": [ - { - "description": "Election ID of the finished round. Mutually exclusive with `block` and `unixtime`.\n", - "in": "query", - "name": "election_id", - "required": false, - "schema": { - "format": "int64", - "type": "integer" - } - }, - { - "description": "Masterchain block seqno within the finished round. Mutually exclusive with `election_id` and `unixtime`.\n", - "in": "query", - "name": "block", - "required": false, - "schema": { - "format": "uint32", - "type": "integer" - } - }, - { - "description": "Unix timestamp (seconds). Looks up the masterchain block at this time and uses it as the anchor. Mutually exclusive with `election_id` and `block`.\n", - "in": "query", - "name": "unixtime", - "required": false, - "schema": { - "format": "uint32", - "type": "integer" - } - }, - { - "description": "Set to `1` to return only basic validator info (rank, pubkey, effective_stake, weight, reward, pool). Skips pool type detection, owner/validator addresses, nominator data, and returned-stake lookup — significantly faster.\n", - "in": "query", - "name": "shallow", - "required": false, - "schema": { - "default": false, - "type": "boolean" - } - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/RoundRewardsResponse" - } - } - }, - "description": "Successful response" - }, - "default": { - "$ref": "#/components/responses/Error" - } - }, - "summary": "Get per-validator reward distribution for a finished round", - "tags": [ - "Rewards" - ] - } - }, - "/v2/rewards/validation-rounds": { - "get": { - "description": "Returns past and current validation rounds with boundaries, stakes, and bonuses. Always uses the latest masterchain block.\n", - "operationId": "getValidationRounds", - "parameters": [ - { - "description": "Return the single round matching this election ID. Mutually exclusive with `block` and `unixtime`.\n", - "in": "query", - "name": "election_id", - "required": false, - "schema": { - "format": "int64", - "type": "integer" - } - }, - { - "description": "Find the round containing this masterchain block seqno and return it plus up to `limit-1` older rounds. Mutually exclusive with `election_id` and `unixtime`.\n", - "in": "query", - "name": "block", - "required": false, - "schema": { - "format": "uint32", - "type": "integer" - } - }, - { - "description": "Unix timestamp (seconds). Looks up the masterchain block at this time and uses it as the anchor. Mutually exclusive with `election_id` and `block`.\n", - "in": "query", - "name": "unixtime", - "required": false, - "schema": { - "format": "uint32", - "type": "integer" - } - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ValidationRoundsResponse" - } - } - }, - "description": "Successful response" - }, - "default": { - "$ref": "#/components/responses/Error" - } - }, - "summary": "Get validation round metadata", - "tags": [ - "Rewards" - ] - } - }, - "/v2/rewards/validators": { - "get": { - "description": "Returns all current validators with stakes, rewards, pool addresses, and (optionally) nominator breakdowns.\n", - "operationId": "getValidators", - "parameters": [ - { - "description": "Masterchain block seqno. Defaults to latest. Mutually exclusive with `unixtime`.\n", - "in": "query", - "name": "seqno", - "required": false, - "schema": { - "format": "uint32", - "type": "integer" - } - }, - { - "description": "Unix timestamp (seconds). Looks up the masterchain block at this time and uses it as the anchor. Mutually exclusive with `seqno`.\n", - "in": "query", - "name": "unixtime", - "required": false, - "schema": { - "format": "uint32", - "type": "integer" - } - }, - { - "description": "Set to `1` to return only basic validator info (rank, pubkey, effective_stake, weight, reward, pool). Skips pool type detection, owner/validator addresses, nominator data, and returned-stake lookup — significantly faster.\n", - "in": "query", - "name": "shallow", - "required": false, - "schema": { - "default": false, - "type": "boolean" - } - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ValidatorsResponse" - } - } - }, - "description": "Successful response" - }, - "default": { - "$ref": "#/components/responses/Error" - } - }, - "summary": "Get all current validators", - "tags": [ - "Rewards" - ] - } - }, "/v2/staking/nominator/{account_id}/pools": { "get": { "description": "All pools where account participates", @@ -12358,6 +12367,137 @@ ] } }, + "/v2/validation/rewards": { + "get": { + "description": "Computes per-validator and per-nominator reward distribution for a finished validation round using the elector's bonuses value.\n", + "operationId": "getRoundRewards", + "parameters": [ + { + "description": "Election ID of the finished round. Mutually exclusive with `block`.\n", + "in": "query", + "name": "election_id", + "required": false, + "schema": { + "format": "int64", + "type": "integer" + } + }, + { + "description": "Masterchain block seqno within the finished round. Mutually exclusive with `election_id`.\n", + "in": "query", + "name": "block", + "required": false, + "schema": { + "format": "uint32", + "type": "integer" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RoundRewardsResponse" + } + } + }, + "description": "Successful response" + }, + "default": { + "$ref": "#/components/responses/Error" + } + }, + "summary": "Get per-validator reward distribution for a finished round", + "tags": [ + "Validation" + ] + } + }, + "/v2/validation/rounds": { + "get": { + "description": "Returns past and current validation rounds with boundaries, stakes, and bonuses. Always uses the latest masterchain block.\n", + "operationId": "getValidationRounds", + "parameters": [ + { + "description": "Return the single round matching this election ID. Mutually exclusive with `block`.\n", + "in": "query", + "name": "election_id", + "required": false, + "schema": { + "format": "int64", + "type": "integer" + } + }, + { + "description": "Find the round containing this masterchain block seqno and return it plus up to `limit-1` older rounds. Mutually exclusive with `election_id`.\n", + "in": "query", + "name": "block", + "required": false, + "schema": { + "format": "uint32", + "type": "integer" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ValidationRoundsResponse" + } + } + }, + "description": "Successful response" + }, + "default": { + "$ref": "#/components/responses/Error" + } + }, + "summary": "Get validation round metadata", + "tags": [ + "Validation" + ] + } + }, + "/v2/validation/validators": { + "get": { + "description": "Returns all current validators with stakes, rewards, pool addresses, and (optionally) nominator breakdowns.\n", + "operationId": "getValidators", + "parameters": [ + { + "description": "Masterchain block seqno. Defaults to latest.", + "in": "query", + "name": "seqno", + "required": false, + "schema": { + "format": "uint32", + "type": "integer" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ValidatorsResponse" + } + } + }, + "description": "Successful response" + }, + "default": { + "$ref": "#/components/responses/Error" + } + }, + "summary": "Get all current validators", + "tags": [ + "Validation" + ] + } + }, "/v2/wallet/auth/proof": { "post": { "description": "Account verification and token issuance", diff --git a/api/openapi.yml b/api/openapi.yml index 6ddd03fa7..864f52369 100644 --- a/api/openapi.yml +++ b/api/openapi.yml @@ -2978,11 +2978,11 @@ paths: $ref: '#/components/schemas/AccountPurchases' 'default': $ref: '#/components/responses/Error' - /v2/rewards/validators: + /v2/validation/validators: get: operationId: getValidators tags: - - Rewards + - Validation summary: Get all current validators description: > Returns all current validators with stakes, rewards, pool addresses, @@ -2990,33 +2990,11 @@ paths: parameters: - name: seqno in: query - description: > - Masterchain block seqno. Defaults to latest. - Mutually exclusive with `unixtime`. - required: false - schema: - type: integer - format: uint32 - - name: unixtime - in: query - description: > - Unix timestamp (seconds). Looks up the masterchain block at this - time and uses it as the anchor. Mutually exclusive with `seqno`. + description: Masterchain block seqno. Defaults to latest. required: false schema: type: integer format: uint32 - - name: shallow - in: query - description: > - Set to `1` to return only basic validator info (rank, pubkey, - effective_stake, weight, reward, pool). Skips pool type detection, - owner/validator addresses, nominator data, and returned-stake - lookup — significantly faster. - required: false - schema: - type: boolean - default: false responses: '200': description: Successful response @@ -3026,11 +3004,11 @@ paths: $ref: "#/components/schemas/ValidatorsResponse" 'default': $ref: '#/components/responses/Error' - /v2/rewards/validation-rounds: + /v2/validation/rounds: get: operationId: getValidationRounds tags: - - Rewards + - Validation summary: Get validation round metadata description: > Returns past and current validation rounds with boundaries, stakes, @@ -3040,7 +3018,7 @@ paths: in: query description: > Return the single round matching this election ID. - Mutually exclusive with `block` and `unixtime`. + Mutually exclusive with `block`. required: false schema: type: integer @@ -3050,17 +3028,7 @@ paths: description: > Find the round containing this masterchain block seqno and return it plus up to `limit-1` older rounds. Mutually exclusive with - `election_id` and `unixtime`. - required: false - schema: - type: integer - format: uint32 - - name: unixtime - in: query - description: > - Unix timestamp (seconds). Looks up the masterchain block at this - time and uses it as the anchor. Mutually exclusive with - `election_id` and `block`. + `election_id`. required: false schema: type: integer @@ -3074,11 +3042,11 @@ paths: $ref: "#/components/schemas/ValidationRoundsResponse" 'default': $ref: '#/components/responses/Error' - /v2/rewards/round-rewards: + /v2/validation/rewards: get: operationId: getRoundRewards tags: - - Rewards + - Validation summary: Get per-validator reward distribution for a finished round description: > Computes per-validator and per-nominator reward distribution for a @@ -3087,7 +3055,7 @@ paths: - name: election_id in: query description: > - Election ID of the finished round. Mutually exclusive with `block` and `unixtime`. + Election ID of the finished round. Mutually exclusive with `block`. required: false schema: type: integer @@ -3096,39 +3064,102 @@ paths: in: query description: > Masterchain block seqno within the finished round. - Mutually exclusive with `election_id` and `unixtime`. + Mutually exclusive with `election_id`. required: false schema: type: integer format: uint32 - - name: unixtime + responses: + '200': + description: Successful response + content: + application/json: + schema: + $ref: "#/components/schemas/RoundRewardsResponse" + 'default': + $ref: '#/components/responses/Error' + + /cocoon/workers: + get: + operationId: getCocoonWorkers + description: Cocoon worker types (same shape as gocoon Connection.GetWorkerTypes) + responses: + '200': + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/CocoonWorkersResponse' + '401': + description: Unauthorized + content: + application/json: + schema: + type: object + properties: + error: + type: object + properties: + message: + type: string + type: + type: string + '501': + description: Not implemented + content: + application/json: + schema: + type: object + 'default': + $ref: '#/components/responses/Error' + + /cocoon/query: + post: + operationId: postCocoonQuery + description: Proxy arbitrary OpenAI-style JSON to Cocoon (POST) + parameters: + - name: model in: query - description: > - Unix timestamp (seconds). Looks up the masterchain block at this - time and uses it as the anchor. Mutually exclusive with - `election_id` and `block`. - required: false + description: Cocoon worker model name passed to the proxy. schema: - type: integer - format: uint32 - - name: shallow + type: string + - name: path in: query - description: > - Set to `1` to return only basic validator info (rank, pubkey, - effective_stake, weight, reward, pool). Skips pool type detection, - owner/validator addresses, nominator data, and returned-stake - lookup — significantly faster. - required: false + description: HTTP path on the Cocoon worker (e.g. /v1/chat/completions). schema: - type: boolean - default: false + type: string + default: "/query" + requestBody: + required: true + content: + application/json: + schema: { } # Free-form JSON value responses: '200': description: Successful response + content: + application/json: + schema: { } # Free-form JSON value + '401': + description: Unauthorized content: application/json: schema: - $ref: "#/components/schemas/RoundRewardsResponse" + type: object + properties: + error: + type: object + properties: + message: + type: string + type: + type: string + '501': + description: Not implemented + content: + application/json: + schema: + type: object 'default': $ref: '#/components/responses/Error' components: @@ -3704,6 +3735,46 @@ components: error: type: string example: error description + CocoonWorkerInstance: + type: object + required: + - coefficient + - active_requests + - max_active_requests + properties: + coefficient: + type: integer + format: int64 + minimum: 0 + active_requests: + type: integer + format: int64 + minimum: 0 + max_active_requests: + type: integer + format: int64 + minimum: 0 + CocoonWorkerType: + type: object + required: + - name + - workers + properties: + name: + type: string + workers: + type: array + items: + $ref: '#/components/schemas/CocoonWorkerInstance' + CocoonWorkersResponse: + type: object + required: + - types + properties: + types: + type: array + items: + $ref: '#/components/schemas/CocoonWorkerType' AccountAddress: type: object required: @@ -8608,7 +8679,7 @@ components: type: object required: [election_id, start, end, start_block, finished] properties: - election_id: + elect_at: type: integer format: int64 description: Election ID (electAt timestamp). diff --git a/go.mod b/go.mod index 5c2dd1d73..ca0f91c40 100644 --- a/go.mod +++ b/go.mod @@ -25,7 +25,7 @@ require ( github.com/sourcegraph/conc v0.3.0 github.com/stretchr/testify v1.11.1 github.com/tonkeeper/scam_backoffice_rules v0.0.11 - github.com/tonkeeper/tongo v1.19.0 + github.com/tonkeeper/tongo v1.19.1-0.20260417135212-97ef83ef6640 go.opentelemetry.io/otel v1.43.0 go.opentelemetry.io/otel/metric v1.43.0 go.opentelemetry.io/otel/trace v1.43.0 @@ -59,6 +59,7 @@ require ( github.com/prometheus/procfs v0.20.1 // indirect github.com/segmentio/asm v1.2.1 // indirect github.com/snksoft/crc v1.1.0 // indirect + github.com/tonkeeper/gocoon v0.0.0-20260417144551-b6d55ffca6ae // indirect github.com/valyala/bytebufferpool v1.0.0 // indirect github.com/valyala/fasttemplate v1.2.2 // indirect go.opentelemetry.io/auto/sdk v1.2.1 // indirect diff --git a/go.sum b/go.sum index 00a2596ab..238e71267 100644 --- a/go.sum +++ b/go.sum @@ -137,6 +137,8 @@ github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/tonkeeper/gocoon v0.0.0-20260417144551-b6d55ffca6ae h1:XNzBpvURYjDohMHbjKVeEMptrz7mjNuX635wAgp6xPk= +github.com/tonkeeper/gocoon v0.0.0-20260417144551-b6d55ffca6ae/go.mod h1:PEua00og1/0ywrf0aB3sAcxDSM2G1nbD4t12PFuyAHk= github.com/tonkeeper/scam_backoffice_rules v0.0.11 h1:VXbNNyTO49OArvQwPRCU+1WUEyfQgkqG7Q8NVhQ7320= github.com/tonkeeper/scam_backoffice_rules v0.0.11/go.mod h1:SqZXYO9vbID8ku+xnnaKXeNGmehxigODGrk5V1KqbRA= github.com/tonkeeper/tongo v1.18.4 h1:R5OvAvthY5bE/2ROF7/ni07tmOAPBWHlPHIjrS4Kh7g= @@ -145,6 +147,8 @@ github.com/tonkeeper/tongo v1.18.5-0.20260414170540-4a73e4b7f8a4 h1:j0tAEZF4M8Ft github.com/tonkeeper/tongo v1.18.5-0.20260414170540-4a73e4b7f8a4/go.mod h1:nHmdEXPfT0/EvkEaBzPiY599/0OYjQSW4dWR7aX+OII= github.com/tonkeeper/tongo v1.19.0 h1:ZX+vvTQPH20MvoWSrjQnSDWpZ+v2CaGipj+M6ga93Fk= github.com/tonkeeper/tongo v1.19.0/go.mod h1:nHmdEXPfT0/EvkEaBzPiY599/0OYjQSW4dWR7aX+OII= +github.com/tonkeeper/tongo v1.19.1-0.20260417135212-97ef83ef6640 h1:U4npFMpt3aY4TZcM6v3+0OUxJvHMxo3j5WdAZydtaag= +github.com/tonkeeper/tongo v1.19.1-0.20260417135212-97ef83ef6640/go.mod h1:nHmdEXPfT0/EvkEaBzPiY599/0OYjQSW4dWR7aX+OII= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= diff --git a/pkg/api/cocoon_handlers.go b/pkg/api/cocoon_handlers.go new file mode 100644 index 000000000..ef4caf670 --- /dev/null +++ b/pkg/api/cocoon_handlers.go @@ -0,0 +1,83 @@ +package api + +import ( + "context" + "encoding/json" + "net/http" + + "github.com/go-faster/jx" + gocoon "github.com/tonkeeper/gocoon/pkg/client" + + "github.com/tonkeeper/opentonapi/pkg/oas" +) + +func (h *Handler) PostCocoonQuery(ctx context.Context, req jx.Raw, params oas.PostCocoonQueryParams) (oas.PostCocoonQueryRes, error) { + if h.cocoonPool == nil { + return &oas.PostCocoonQueryNotImplemented{}, nil + } + conn, err := h.cocoonPool.pick(ctx) + if err != nil { + return nil, toError(http.StatusInternalServerError, err) + } + + body := []byte(req) + if len(body) == 0 { + body = []byte("{}") + } + + model := "" + if params.Model.Set { + model = params.Model.Value + } + var obj map[string]any + if err := json.Unmarshal(body, &obj); err == nil && obj != nil { + if model != "" { + obj["model"] = model + } else if s, ok := obj["model"].(string); ok { + model = s + } + if b, err := json.Marshal(obj); err == nil { + body = b + } + } + + upstreamPath := params.Path.Value + respBody, err := conn.POST(ctx, model, upstreamPath, body) + if err != nil { + return nil, toError(http.StatusBadGateway, err) + } + + ok := oas.PostCocoonQueryOKApplicationJSON(jx.Raw(respBody)) + return &ok, nil +} + +func (h *Handler) GetCocoonWorkers(ctx context.Context) (oas.GetCocoonWorkersRes, error) { + if h.cocoonPool == nil { + return &oas.GetCocoonWorkersNotImplemented{}, nil + } + conn, err := h.cocoonPool.pick(ctx) + if err != nil { + return nil, toError(http.StatusInternalServerError, err) + } + types, err := conn.GetWorkerTypes(ctx) + if err != nil { + return nil, toError(http.StatusBadGateway, err) + } + return workerTypesToResponse(types), nil +} + +func workerTypesToResponse(types []gocoon.WorkerType) *oas.CocoonWorkersResponse { + out := make([]oas.CocoonWorkerType, 0, len(types)) + for _, wt := range types { + ws := make([]oas.CocoonWorkerInstance, 0, len(wt.Workers)) + for _, w := range wt.Workers { + ws = append(ws, oas.CocoonWorkerInstance{ + Coefficient: int64(w.Coefficient), + ActiveRequests: int64(w.ActiveRequests), + MaxActiveRequests: int64(w.MaxActiveRequests), + }) + } + out = append(out, oas.CocoonWorkerType{Name: wt.Name, Workers: ws}) + } + return &oas.CocoonWorkersResponse{Types: out} +} diff --git a/pkg/api/cocoon_pool.go b/pkg/api/cocoon_pool.go new file mode 100644 index 000000000..da0c5e004 --- /dev/null +++ b/pkg/api/cocoon_pool.go @@ -0,0 +1,70 @@ +package api + +import ( + "context" + "math/rand/v2" + "sync" + + gocoon "github.com/tonkeeper/gocoon/pkg/client" + "go.uber.org/zap" +) + +type CocoonDialer interface { + Connect(ctx context.Context, logger *zap.Logger) (*gocoon.Connection, error) +} + +type CocoonPool struct { + mu sync.Mutex + size int + client CocoonDialer + logger *zap.Logger + conns []*gocoon.Connection +} + +func NewCocoonPool(client CocoonDialer, logger *zap.Logger, size int) *CocoonPool { + if size <= 0 { + size = 3 + } + return &CocoonPool{ + client: client, + logger: logger, + size: size, + conns: make([]*gocoon.Connection, size), + } +} + +func (p *CocoonPool) StartAsync() { + for slot := range p.size { + go func(slot int) { + ctx := context.Background() + conn, err := p.client.Connect(ctx, p.logger) + if err != nil { + if p.logger != nil { + p.logger.Warn("cocoon pool: connect failed", zap.Int("slot", slot), zap.Error(err)) + } + return + } + p.mu.Lock() + p.conns[slot] = conn + p.mu.Unlock() + if p.logger != nil { + p.logger.Info("cocoon pool: connection ready", zap.Int("slot", slot)) + } + }(slot) + } +} + +func (p *CocoonPool) pick(ctx context.Context) (*gocoon.Connection, error) { + p.mu.Lock() + ready := make([]*gocoon.Connection, 0, p.size) + for _, c := range p.conns { + if c != nil { + ready = append(ready, c) + } + } + p.mu.Unlock() + if len(ready) > 0 { + return ready[rand.IntN(len(ready))], nil + } + return p.client.Connect(ctx, p.logger) +} diff --git a/pkg/api/handler.go b/pkg/api/handler.go index 82e0a06df..d1a0ed7f6 100644 --- a/pkg/api/handler.go +++ b/pkg/api/handler.go @@ -74,6 +74,7 @@ type Handler struct { mu sync.Mutex dns *dns.DNS // todo: update when blockchain config changes configPool *sync.Pool + cocoonPool *CocoonPool } func (h *Handler) NewError(ctx context.Context, err error) *oas.ErrorStatusCode { @@ -97,6 +98,7 @@ type Options struct { score scoreSource parallelTraceProcessing bool rewardsLiteServers []config.LiteServer + cocoonPool *CocoonPool } type Option func(o *Options) @@ -190,6 +192,12 @@ func WithRewards(s []config.LiteServer) Option { } } +func WithCocoonPool(pool *CocoonPool) Option { + return func(o *Options) { + o.cocoonPool = pool + } +} + func NewHandler(logger *zap.Logger, opts ...Option) (*Handler, error) { options := &Options{} for _, o := range opts { @@ -287,6 +295,7 @@ func NewHandler(logger *zap.Logger, opts ...Option) (*Handler, error) { tonConnect: tonConnect, configPool: configPool, rewards: rwd, + cocoonPool: options.cocoonPool, }, nil } diff --git a/pkg/oas/oas_client_gen.go b/pkg/oas/oas_client_gen.go index ed0ed501c..912d1aa40 100644 --- a/pkg/oas/oas_client_gen.go +++ b/pkg/oas/oas_client_gen.go @@ -345,6 +345,12 @@ type Invoker interface { // // GET /v2/rates/chart GetChartRates(ctx context.Context, params GetChartRatesParams) (*GetChartRatesOK, error) + // GetCocoonWorkers invokes getCocoonWorkers operation. + // + // Cocoon worker types (same shape as gocoon Connection.GetWorkerTypes). + // + // GET /cocoon/workers + GetCocoonWorkers(ctx context.Context) (GetCocoonWorkersRes, error) // GetDnsInfo invokes getDnsInfo operation. // // Get full information about domain name. @@ -616,7 +622,7 @@ type Invoker interface { // Computes per-validator and per-nominator reward distribution for a finished validation round using // the elector's bonuses value. // - // GET /v2/rewards/round-rewards + // GET /v2/validation/rewards GetRoundRewards(ctx context.Context, params GetRoundRewardsParams) (*RoundRewardsResponse, error) // GetStakingPoolHistory invokes getStakingPoolHistory operation. // @@ -659,14 +665,14 @@ type Invoker interface { // Returns past and current validation rounds with boundaries, stakes, and bonuses. Always uses the // latest masterchain block. // - // GET /v2/rewards/validation-rounds + // GET /v2/validation/rounds GetValidationRounds(ctx context.Context, params GetValidationRoundsParams) (*ValidationRoundsResponse, error) // GetValidators invokes getValidators operation. // // Returns all current validators with stakes, rewards, pool addresses, and (optionally) nominator // breakdowns. // - // GET /v2/rewards/validators + // GET /v2/validation/validators GetValidators(ctx context.Context, params GetValidatorsParams) (*ValidatorsResponse, error) // GetWalletInfo invokes getWalletInfo operation. // @@ -686,6 +692,12 @@ type Invoker interface { // // POST /v2/pubkeys/wallets/_bulk GetWalletsByPublicKeyBulk(ctx context.Context, request OptGetWalletsByPublicKeyBulkReq) (*WalletsByPublicKeys, error) + // PostCocoonQuery invokes postCocoonQuery operation. + // + // Proxy arbitrary OpenAI-style JSON to Cocoon (POST). + // + // POST /cocoon/query + PostCocoonQuery(ctx context.Context, request jx.Raw, params PostCocoonQueryParams) (PostCocoonQueryRes, error) // ReindexAccount invokes reindexAccount operation. // // Update internal cache for a particular account. @@ -6605,6 +6617,80 @@ func (c *Client) sendGetChartRates(ctx context.Context, params GetChartRatesPara return result, nil } +// GetCocoonWorkers invokes getCocoonWorkers operation. +// +// Cocoon worker types (same shape as gocoon Connection.GetWorkerTypes). +// +// GET /cocoon/workers +func (c *Client) GetCocoonWorkers(ctx context.Context) (GetCocoonWorkersRes, error) { + res, err := c.sendGetCocoonWorkers(ctx) + return res, err +} + +func (c *Client) sendGetCocoonWorkers(ctx context.Context) (res GetCocoonWorkersRes, err error) { + otelAttrs := []attribute.KeyValue{ + otelogen.OperationID("getCocoonWorkers"), + semconv.HTTPRequestMethodKey.String("GET"), + semconv.URLTemplateKey.String("/cocoon/workers"), + } + otelAttrs = append(otelAttrs, c.cfg.Attributes...) + + // Run stopwatch. + startTime := time.Now() + defer func() { + // Use floating point division here for higher precision (instead of Millisecond method). + elapsedDuration := time.Since(startTime) + c.duration.Record(ctx, float64(elapsedDuration)/float64(time.Millisecond), metric.WithAttributes(otelAttrs...)) + }() + + // Increment request counter. + c.requests.Add(ctx, 1, metric.WithAttributes(otelAttrs...)) + + // Start a span for this request. + ctx, span := c.cfg.Tracer.Start(ctx, GetCocoonWorkersOperation, + trace.WithAttributes(otelAttrs...), + clientSpanKind, + ) + // Track stage for error reporting. + var stage string + defer func() { + if err != nil { + span.RecordError(err) + span.SetStatus(codes.Error, stage) + c.errors.Add(ctx, 1, metric.WithAttributes(otelAttrs...)) + } + span.End() + }() + + stage = "BuildURL" + u := uri.Clone(c.requestURL(ctx)) + var pathParts [1]string + pathParts[0] = "/cocoon/workers" + uri.AddPathParts(u, pathParts[:]...) + + stage = "EncodeRequest" + r, err := ht.NewRequest(ctx, "GET", u) + if err != nil { + return res, errors.Wrap(err, "create request") + } + + stage = "SendRequest" + resp, err := c.cfg.Client.Do(r) + if err != nil { + return res, errors.Wrap(err, "do request") + } + body := resp.Body + defer body.Close() + + stage = "DecodeResponse" + result, err := decodeGetCocoonWorkersResponse(resp) + if err != nil { + return res, errors.Wrap(err, "decode response") + } + + return result, nil +} + // GetDnsInfo invokes getDnsInfo operation. // // Get full information about domain name. @@ -11085,7 +11171,7 @@ func (c *Client) sendGetReducedBlockchainBlocks(ctx context.Context, params GetR // Computes per-validator and per-nominator reward distribution for a finished validation round using // the elector's bonuses value. // -// GET /v2/rewards/round-rewards +// GET /v2/validation/rewards func (c *Client) GetRoundRewards(ctx context.Context, params GetRoundRewardsParams) (*RoundRewardsResponse, error) { res, err := c.sendGetRoundRewards(ctx, params) return res, err @@ -11095,7 +11181,7 @@ func (c *Client) sendGetRoundRewards(ctx context.Context, params GetRoundRewards otelAttrs := []attribute.KeyValue{ otelogen.OperationID("getRoundRewards"), semconv.HTTPRequestMethodKey.String("GET"), - semconv.URLTemplateKey.String("/v2/rewards/round-rewards"), + semconv.URLTemplateKey.String("/v2/validation/rewards"), } otelAttrs = append(otelAttrs, c.cfg.Attributes...) @@ -11129,7 +11215,7 @@ func (c *Client) sendGetRoundRewards(ctx context.Context, params GetRoundRewards stage = "BuildURL" u := uri.Clone(c.requestURL(ctx)) var pathParts [1]string - pathParts[0] = "/v2/rewards/round-rewards" + pathParts[0] = "/v2/validation/rewards" uri.AddPathParts(u, pathParts[:]...) stage = "EncodeQueryParams" @@ -11168,40 +11254,6 @@ func (c *Client) sendGetRoundRewards(ctx context.Context, params GetRoundRewards return res, errors.Wrap(err, "encode query") } } - { - // Encode "unixtime" parameter. - cfg := uri.QueryParameterEncodingConfig{ - Name: "unixtime", - Style: uri.QueryStyleForm, - Explode: true, - } - - if err := q.EncodeParam(cfg, func(e uri.Encoder) error { - if val, ok := params.Unixtime.Get(); ok { - return e.EncodeValue(conv.Uint32ToString(val)) - } - return nil - }); err != nil { - return res, errors.Wrap(err, "encode query") - } - } - { - // Encode "shallow" parameter. - cfg := uri.QueryParameterEncodingConfig{ - Name: "shallow", - Style: uri.QueryStyleForm, - Explode: true, - } - - if err := q.EncodeParam(cfg, func(e uri.Encoder) error { - if val, ok := params.Shallow.Get(); ok { - return e.EncodeValue(conv.BoolToString(val)) - } - return nil - }); err != nil { - return res, errors.Wrap(err, "encode query") - } - } u.RawQuery = q.Values().Encode() stage = "EncodeRequest" @@ -11841,7 +11893,7 @@ func (c *Client) sendGetTrace(ctx context.Context, params GetTraceParams) (res * // Returns past and current validation rounds with boundaries, stakes, and bonuses. Always uses the // latest masterchain block. // -// GET /v2/rewards/validation-rounds +// GET /v2/validation/rounds func (c *Client) GetValidationRounds(ctx context.Context, params GetValidationRoundsParams) (*ValidationRoundsResponse, error) { res, err := c.sendGetValidationRounds(ctx, params) return res, err @@ -11851,7 +11903,7 @@ func (c *Client) sendGetValidationRounds(ctx context.Context, params GetValidati otelAttrs := []attribute.KeyValue{ otelogen.OperationID("getValidationRounds"), semconv.HTTPRequestMethodKey.String("GET"), - semconv.URLTemplateKey.String("/v2/rewards/validation-rounds"), + semconv.URLTemplateKey.String("/v2/validation/rounds"), } otelAttrs = append(otelAttrs, c.cfg.Attributes...) @@ -11885,7 +11937,7 @@ func (c *Client) sendGetValidationRounds(ctx context.Context, params GetValidati stage = "BuildURL" u := uri.Clone(c.requestURL(ctx)) var pathParts [1]string - pathParts[0] = "/v2/rewards/validation-rounds" + pathParts[0] = "/v2/validation/rounds" uri.AddPathParts(u, pathParts[:]...) stage = "EncodeQueryParams" @@ -11924,23 +11976,6 @@ func (c *Client) sendGetValidationRounds(ctx context.Context, params GetValidati return res, errors.Wrap(err, "encode query") } } - { - // Encode "unixtime" parameter. - cfg := uri.QueryParameterEncodingConfig{ - Name: "unixtime", - Style: uri.QueryStyleForm, - Explode: true, - } - - if err := q.EncodeParam(cfg, func(e uri.Encoder) error { - if val, ok := params.Unixtime.Get(); ok { - return e.EncodeValue(conv.Uint32ToString(val)) - } - return nil - }); err != nil { - return res, errors.Wrap(err, "encode query") - } - } u.RawQuery = q.Values().Encode() stage = "EncodeRequest" @@ -11971,7 +12006,7 @@ func (c *Client) sendGetValidationRounds(ctx context.Context, params GetValidati // Returns all current validators with stakes, rewards, pool addresses, and (optionally) nominator // breakdowns. // -// GET /v2/rewards/validators +// GET /v2/validation/validators func (c *Client) GetValidators(ctx context.Context, params GetValidatorsParams) (*ValidatorsResponse, error) { res, err := c.sendGetValidators(ctx, params) return res, err @@ -11981,7 +12016,7 @@ func (c *Client) sendGetValidators(ctx context.Context, params GetValidatorsPara otelAttrs := []attribute.KeyValue{ otelogen.OperationID("getValidators"), semconv.HTTPRequestMethodKey.String("GET"), - semconv.URLTemplateKey.String("/v2/rewards/validators"), + semconv.URLTemplateKey.String("/v2/validation/validators"), } otelAttrs = append(otelAttrs, c.cfg.Attributes...) @@ -12015,7 +12050,7 @@ func (c *Client) sendGetValidators(ctx context.Context, params GetValidatorsPara stage = "BuildURL" u := uri.Clone(c.requestURL(ctx)) var pathParts [1]string - pathParts[0] = "/v2/rewards/validators" + pathParts[0] = "/v2/validation/validators" uri.AddPathParts(u, pathParts[:]...) stage = "EncodeQueryParams" @@ -12037,40 +12072,6 @@ func (c *Client) sendGetValidators(ctx context.Context, params GetValidatorsPara return res, errors.Wrap(err, "encode query") } } - { - // Encode "unixtime" parameter. - cfg := uri.QueryParameterEncodingConfig{ - Name: "unixtime", - Style: uri.QueryStyleForm, - Explode: true, - } - - if err := q.EncodeParam(cfg, func(e uri.Encoder) error { - if val, ok := params.Unixtime.Get(); ok { - return e.EncodeValue(conv.Uint32ToString(val)) - } - return nil - }); err != nil { - return res, errors.Wrap(err, "encode query") - } - } - { - // Encode "shallow" parameter. - cfg := uri.QueryParameterEncodingConfig{ - Name: "shallow", - Style: uri.QueryStyleForm, - Explode: true, - } - - if err := q.EncodeParam(cfg, func(e uri.Encoder) error { - if val, ok := params.Shallow.Get(); ok { - return e.EncodeValue(conv.BoolToString(val)) - } - return nil - }); err != nil { - return res, errors.Wrap(err, "encode query") - } - } u.RawQuery = q.Values().Encode() stage = "EncodeRequest" @@ -12358,6 +12359,121 @@ func (c *Client) sendGetWalletsByPublicKeyBulk(ctx context.Context, request OptG return result, nil } +// PostCocoonQuery invokes postCocoonQuery operation. +// +// Proxy arbitrary OpenAI-style JSON to Cocoon (POST). +// +// POST /cocoon/query +func (c *Client) PostCocoonQuery(ctx context.Context, request jx.Raw, params PostCocoonQueryParams) (PostCocoonQueryRes, error) { + res, err := c.sendPostCocoonQuery(ctx, request, params) + return res, err +} + +func (c *Client) sendPostCocoonQuery(ctx context.Context, request jx.Raw, params PostCocoonQueryParams) (res PostCocoonQueryRes, err error) { + otelAttrs := []attribute.KeyValue{ + otelogen.OperationID("postCocoonQuery"), + semconv.HTTPRequestMethodKey.String("POST"), + semconv.URLTemplateKey.String("/cocoon/query"), + } + otelAttrs = append(otelAttrs, c.cfg.Attributes...) + + // Run stopwatch. + startTime := time.Now() + defer func() { + // Use floating point division here for higher precision (instead of Millisecond method). + elapsedDuration := time.Since(startTime) + c.duration.Record(ctx, float64(elapsedDuration)/float64(time.Millisecond), metric.WithAttributes(otelAttrs...)) + }() + + // Increment request counter. + c.requests.Add(ctx, 1, metric.WithAttributes(otelAttrs...)) + + // Start a span for this request. + ctx, span := c.cfg.Tracer.Start(ctx, PostCocoonQueryOperation, + trace.WithAttributes(otelAttrs...), + clientSpanKind, + ) + // Track stage for error reporting. + var stage string + defer func() { + if err != nil { + span.RecordError(err) + span.SetStatus(codes.Error, stage) + c.errors.Add(ctx, 1, metric.WithAttributes(otelAttrs...)) + } + span.End() + }() + + stage = "BuildURL" + u := uri.Clone(c.requestURL(ctx)) + var pathParts [1]string + pathParts[0] = "/cocoon/query" + uri.AddPathParts(u, pathParts[:]...) + + stage = "EncodeQueryParams" + q := uri.NewQueryEncoder() + { + // Encode "model" parameter. + cfg := uri.QueryParameterEncodingConfig{ + Name: "model", + Style: uri.QueryStyleForm, + Explode: true, + } + + if err := q.EncodeParam(cfg, func(e uri.Encoder) error { + if val, ok := params.Model.Get(); ok { + return e.EncodeValue(conv.StringToString(val)) + } + return nil + }); err != nil { + return res, errors.Wrap(err, "encode query") + } + } + { + // Encode "path" parameter. + cfg := uri.QueryParameterEncodingConfig{ + Name: "path", + Style: uri.QueryStyleForm, + Explode: true, + } + + if err := q.EncodeParam(cfg, func(e uri.Encoder) error { + if val, ok := params.Path.Get(); ok { + return e.EncodeValue(conv.StringToString(val)) + } + return nil + }); err != nil { + return res, errors.Wrap(err, "encode query") + } + } + u.RawQuery = q.Values().Encode() + + stage = "EncodeRequest" + r, err := ht.NewRequest(ctx, "POST", u) + if err != nil { + return res, errors.Wrap(err, "create request") + } + if err := encodePostCocoonQueryRequest(request, r); err != nil { + return res, errors.Wrap(err, "encode request") + } + + stage = "SendRequest" + resp, err := c.cfg.Client.Do(r) + if err != nil { + return res, errors.Wrap(err, "do request") + } + body := resp.Body + defer body.Close() + + stage = "DecodeResponse" + result, err := decodePostCocoonQueryResponse(resp) + if err != nil { + return res, errors.Wrap(err, "decode response") + } + + return result, nil +} + // ReindexAccount invokes reindexAccount operation. // // Update internal cache for a particular account. diff --git a/pkg/oas/oas_handlers_gen.go b/pkg/oas/oas_handlers_gen.go index e80afa6de..accac9296 100644 --- a/pkg/oas/oas_handlers_gen.go +++ b/pkg/oas/oas_handlers_gen.go @@ -8184,6 +8184,141 @@ func (s *Server) handleGetChartRatesRequest(args [0]string, argsEscaped bool, w } } +// handleGetCocoonWorkersRequest handles getCocoonWorkers operation. +// +// Cocoon worker types (same shape as gocoon Connection.GetWorkerTypes). +// +// GET /cocoon/workers +func (s *Server) handleGetCocoonWorkersRequest(args [0]string, argsEscaped bool, w http.ResponseWriter, r *http.Request) { + statusWriter := &codeRecorder{ResponseWriter: w} + w = statusWriter + otelAttrs := []attribute.KeyValue{ + otelogen.OperationID("getCocoonWorkers"), + semconv.HTTPRequestMethodKey.String("GET"), + semconv.HTTPRouteKey.String("/cocoon/workers"), + } + // Add attributes from config. + otelAttrs = append(otelAttrs, s.cfg.Attributes...) + + // Start a span for this request. + ctx, span := s.cfg.Tracer.Start(r.Context(), GetCocoonWorkersOperation, + trace.WithAttributes(otelAttrs...), + serverSpanKind, + ) + defer span.End() + + // Add Labeler to context. + labeler := &Labeler{attrs: otelAttrs} + ctx = contextWithLabeler(ctx, labeler) + + // Run stopwatch. + startTime := time.Now() + defer func() { + elapsedDuration := time.Since(startTime) + + attrSet := labeler.AttributeSet() + attrs := attrSet.ToSlice() + code := statusWriter.status + if code != 0 { + codeAttr := semconv.HTTPResponseStatusCode(code) + attrs = append(attrs, codeAttr) + span.SetAttributes(codeAttr) + } + attrOpt := metric.WithAttributes(attrs...) + + // Increment request counter. + s.requests.Add(ctx, 1, attrOpt) + + // Use floating point division here for higher precision (instead of Millisecond method). + s.duration.Record(ctx, float64(elapsedDuration)/float64(time.Millisecond), attrOpt) + }() + + var ( + recordError = func(stage string, err error) { + span.RecordError(err) + + // https://opentelemetry.io/docs/specs/semconv/http/http-spans/#status + // Span Status MUST be left unset if HTTP status code was in the 1xx, 2xx or 3xx ranges, + // unless there was another error (e.g., network error receiving the response body; or 3xx codes with + // max redirects exceeded), in which case status MUST be set to Error. + code := statusWriter.status + if code < 100 || code >= 500 { + span.SetStatus(codes.Error, stage) + } + + attrSet := labeler.AttributeSet() + attrs := attrSet.ToSlice() + if code != 0 { + attrs = append(attrs, semconv.HTTPResponseStatusCode(code)) + } + + s.errors.Add(ctx, 1, metric.WithAttributes(attrs...)) + } + err error + ) + + var rawBody []byte + + var response GetCocoonWorkersRes + if m := s.cfg.Middleware; m != nil { + mreq := middleware.Request{ + Context: ctx, + OperationName: GetCocoonWorkersOperation, + OperationSummary: "", + OperationID: "getCocoonWorkers", + Body: nil, + RawBody: rawBody, + Params: middleware.Parameters{}, + Raw: r, + } + + type ( + Request = struct{} + Params = struct{} + Response = GetCocoonWorkersRes + ) + response, err = middleware.HookMiddleware[ + Request, + Params, + Response, + ]( + m, + mreq, + nil, + func(ctx context.Context, request Request, params Params) (response Response, err error) { + response, err = s.h.GetCocoonWorkers(ctx) + return response, err + }, + ) + } else { + response, err = s.h.GetCocoonWorkers(ctx) + } + if err != nil { + if errRes, ok := errors.Into[*ErrorStatusCode](err); ok { + if err := encodeErrorResponse(errRes, w, span); err != nil { + defer recordError("Internal", err) + } + return + } + if errors.Is(err, ht.ErrNotImplemented) { + s.cfg.ErrorHandler(ctx, w, r, err) + return + } + if err := encodeErrorResponse(s.h.NewError(ctx, err), w, span); err != nil { + defer recordError("Internal", err) + } + return + } + + if err := encodeGetCocoonWorkersResponse(response, w, span); err != nil { + defer recordError("EncodeResponse", err) + if !errors.Is(err, ht.ErrInternalServerErrorResponse) { + s.cfg.ErrorHandler(ctx, w, r, err) + } + return + } +} + // handleGetDnsInfoRequest handles getDnsInfo operation. // // Get full information about domain name. @@ -14838,14 +14973,14 @@ func (s *Server) handleGetReducedBlockchainBlocksRequest(args [0]string, argsEsc // Computes per-validator and per-nominator reward distribution for a finished validation round using // the elector's bonuses value. // -// GET /v2/rewards/round-rewards +// GET /v2/validation/rewards func (s *Server) handleGetRoundRewardsRequest(args [0]string, argsEscaped bool, w http.ResponseWriter, r *http.Request) { statusWriter := &codeRecorder{ResponseWriter: w} w = statusWriter otelAttrs := []attribute.KeyValue{ otelogen.OperationID("getRoundRewards"), semconv.HTTPRequestMethodKey.String("GET"), - semconv.HTTPRouteKey.String("/v2/rewards/round-rewards"), + semconv.HTTPRouteKey.String("/v2/validation/rewards"), } // Add attributes from config. otelAttrs = append(otelAttrs, s.cfg.Attributes...) @@ -14941,14 +15076,6 @@ func (s *Server) handleGetRoundRewardsRequest(args [0]string, argsEscaped bool, Name: "block", In: "query", }: params.Block, - { - Name: "unixtime", - In: "query", - }: params.Unixtime, - { - Name: "shallow", - In: "query", - }: params.Shallow, }, Raw: r, } @@ -15911,14 +16038,14 @@ func (s *Server) handleGetTraceRequest(args [1]string, argsEscaped bool, w http. // Returns past and current validation rounds with boundaries, stakes, and bonuses. Always uses the // latest masterchain block. // -// GET /v2/rewards/validation-rounds +// GET /v2/validation/rounds func (s *Server) handleGetValidationRoundsRequest(args [0]string, argsEscaped bool, w http.ResponseWriter, r *http.Request) { statusWriter := &codeRecorder{ResponseWriter: w} w = statusWriter otelAttrs := []attribute.KeyValue{ otelogen.OperationID("getValidationRounds"), semconv.HTTPRequestMethodKey.String("GET"), - semconv.HTTPRouteKey.String("/v2/rewards/validation-rounds"), + semconv.HTTPRouteKey.String("/v2/validation/rounds"), } // Add attributes from config. otelAttrs = append(otelAttrs, s.cfg.Attributes...) @@ -16014,10 +16141,6 @@ func (s *Server) handleGetValidationRoundsRequest(args [0]string, argsEscaped bo Name: "block", In: "query", }: params.Block, - { - Name: "unixtime", - In: "query", - }: params.Unixtime, }, Raw: r, } @@ -16074,14 +16197,14 @@ func (s *Server) handleGetValidationRoundsRequest(args [0]string, argsEscaped bo // Returns all current validators with stakes, rewards, pool addresses, and (optionally) nominator // breakdowns. // -// GET /v2/rewards/validators +// GET /v2/validation/validators func (s *Server) handleGetValidatorsRequest(args [0]string, argsEscaped bool, w http.ResponseWriter, r *http.Request) { statusWriter := &codeRecorder{ResponseWriter: w} w = statusWriter otelAttrs := []attribute.KeyValue{ otelogen.OperationID("getValidators"), semconv.HTTPRequestMethodKey.String("GET"), - semconv.HTTPRouteKey.String("/v2/rewards/validators"), + semconv.HTTPRouteKey.String("/v2/validation/validators"), } // Add attributes from config. otelAttrs = append(otelAttrs, s.cfg.Attributes...) @@ -16173,14 +16296,6 @@ func (s *Server) handleGetValidatorsRequest(args [0]string, argsEscaped bool, w Name: "seqno", In: "query", }: params.Seqno, - { - Name: "unixtime", - In: "query", - }: params.Unixtime, - { - Name: "shallow", - In: "query", - }: params.Shallow, }, Raw: r, } @@ -16694,6 +16809,179 @@ func (s *Server) handleGetWalletsByPublicKeyBulkRequest(args [0]string, argsEsca } } +// handlePostCocoonQueryRequest handles postCocoonQuery operation. +// +// Proxy arbitrary OpenAI-style JSON to Cocoon (POST). +// +// POST /cocoon/query +func (s *Server) handlePostCocoonQueryRequest(args [0]string, argsEscaped bool, w http.ResponseWriter, r *http.Request) { + statusWriter := &codeRecorder{ResponseWriter: w} + w = statusWriter + otelAttrs := []attribute.KeyValue{ + otelogen.OperationID("postCocoonQuery"), + semconv.HTTPRequestMethodKey.String("POST"), + semconv.HTTPRouteKey.String("/cocoon/query"), + } + // Add attributes from config. + otelAttrs = append(otelAttrs, s.cfg.Attributes...) + + // Start a span for this request. + ctx, span := s.cfg.Tracer.Start(r.Context(), PostCocoonQueryOperation, + trace.WithAttributes(otelAttrs...), + serverSpanKind, + ) + defer span.End() + + // Add Labeler to context. + labeler := &Labeler{attrs: otelAttrs} + ctx = contextWithLabeler(ctx, labeler) + + // Run stopwatch. + startTime := time.Now() + defer func() { + elapsedDuration := time.Since(startTime) + + attrSet := labeler.AttributeSet() + attrs := attrSet.ToSlice() + code := statusWriter.status + if code != 0 { + codeAttr := semconv.HTTPResponseStatusCode(code) + attrs = append(attrs, codeAttr) + span.SetAttributes(codeAttr) + } + attrOpt := metric.WithAttributes(attrs...) + + // Increment request counter. + s.requests.Add(ctx, 1, attrOpt) + + // Use floating point division here for higher precision (instead of Millisecond method). + s.duration.Record(ctx, float64(elapsedDuration)/float64(time.Millisecond), attrOpt) + }() + + var ( + recordError = func(stage string, err error) { + span.RecordError(err) + + // https://opentelemetry.io/docs/specs/semconv/http/http-spans/#status + // Span Status MUST be left unset if HTTP status code was in the 1xx, 2xx or 3xx ranges, + // unless there was another error (e.g., network error receiving the response body; or 3xx codes with + // max redirects exceeded), in which case status MUST be set to Error. + code := statusWriter.status + if code < 100 || code >= 500 { + span.SetStatus(codes.Error, stage) + } + + attrSet := labeler.AttributeSet() + attrs := attrSet.ToSlice() + if code != 0 { + attrs = append(attrs, semconv.HTTPResponseStatusCode(code)) + } + + s.errors.Add(ctx, 1, metric.WithAttributes(attrs...)) + } + err error + opErrContext = ogenerrors.OperationContext{ + Name: PostCocoonQueryOperation, + ID: "postCocoonQuery", + } + ) + params, err := decodePostCocoonQueryParams(args, argsEscaped, r) + if err != nil { + err = &ogenerrors.DecodeParamsError{ + OperationContext: opErrContext, + Err: err, + } + defer recordError("DecodeParams", err) + s.cfg.ErrorHandler(ctx, w, r, err) + return + } + + var rawBody []byte + request, rawBody, close, err := s.decodePostCocoonQueryRequest(r) + if err != nil { + err = &ogenerrors.DecodeRequestError{ + OperationContext: opErrContext, + Err: err, + } + defer recordError("DecodeRequest", err) + s.cfg.ErrorHandler(ctx, w, r, err) + return + } + defer func() { + if err := close(); err != nil { + recordError("CloseRequest", err) + } + }() + + var response PostCocoonQueryRes + if m := s.cfg.Middleware; m != nil { + mreq := middleware.Request{ + Context: ctx, + OperationName: PostCocoonQueryOperation, + OperationSummary: "", + OperationID: "postCocoonQuery", + Body: request, + RawBody: rawBody, + Params: middleware.Parameters{ + { + Name: "model", + In: "query", + }: params.Model, + { + Name: "path", + In: "query", + }: params.Path, + }, + Raw: r, + } + + type ( + Request = jx.Raw + Params = PostCocoonQueryParams + Response = PostCocoonQueryRes + ) + response, err = middleware.HookMiddleware[ + Request, + Params, + Response, + ]( + m, + mreq, + unpackPostCocoonQueryParams, + func(ctx context.Context, request Request, params Params) (response Response, err error) { + response, err = s.h.PostCocoonQuery(ctx, request, params) + return response, err + }, + ) + } else { + response, err = s.h.PostCocoonQuery(ctx, request, params) + } + if err != nil { + if errRes, ok := errors.Into[*ErrorStatusCode](err); ok { + if err := encodeErrorResponse(errRes, w, span); err != nil { + defer recordError("Internal", err) + } + return + } + if errors.Is(err, ht.ErrNotImplemented) { + s.cfg.ErrorHandler(ctx, w, r, err) + return + } + if err := encodeErrorResponse(s.h.NewError(ctx, err), w, span); err != nil { + defer recordError("Internal", err) + } + return + } + + if err := encodePostCocoonQueryResponse(response, w, span); err != nil { + defer recordError("EncodeResponse", err) + if !errors.Is(err, ht.ErrInternalServerErrorResponse) { + s.cfg.ErrorHandler(ctx, w, r, err) + } + return + } +} + // handleReindexAccountRequest handles reindexAccount operation. // // Update internal cache for a particular account. diff --git a/pkg/oas/oas_interfaces_gen.go b/pkg/oas/oas_interfaces_gen.go new file mode 100644 index 000000000..5d143208b --- /dev/null +++ b/pkg/oas/oas_interfaces_gen.go @@ -0,0 +1,10 @@ +// Code generated by ogen, DO NOT EDIT. +package oas + +type GetCocoonWorkersRes interface { + getCocoonWorkersRes() +} + +type PostCocoonQueryRes interface { + postCocoonQueryRes() +} diff --git a/pkg/oas/oas_json_gen.go b/pkg/oas/oas_json_gen.go index 99c0d5e07..9015a4955 100644 --- a/pkg/oas/oas_json_gen.go +++ b/pkg/oas/oas_json_gen.go @@ -11859,6 +11859,365 @@ func (s *ChartPoints) UnmarshalJSON(data []byte) error { return s.Decode(d) } +// Encode implements json.Marshaler. +func (s *CocoonWorkerInstance) Encode(e *jx.Encoder) { + e.ObjStart() + s.encodeFields(e) + e.ObjEnd() +} + +// encodeFields encodes fields. +func (s *CocoonWorkerInstance) encodeFields(e *jx.Encoder) { + { + e.FieldStart("coefficient") + e.Int64(s.Coefficient) + } + { + e.FieldStart("active_requests") + e.Int64(s.ActiveRequests) + } + { + e.FieldStart("max_active_requests") + e.Int64(s.MaxActiveRequests) + } +} + +var jsonFieldsNameOfCocoonWorkerInstance = [3]string{ + 0: "coefficient", + 1: "active_requests", + 2: "max_active_requests", +} + +// Decode decodes CocoonWorkerInstance from json. +func (s *CocoonWorkerInstance) Decode(d *jx.Decoder) error { + if s == nil { + return errors.New("invalid: unable to decode CocoonWorkerInstance to nil") + } + var requiredBitSet [1]uint8 + + if err := d.ObjBytes(func(d *jx.Decoder, k []byte) error { + switch string(k) { + case "coefficient": + requiredBitSet[0] |= 1 << 0 + if err := func() error { + v, err := d.Int64() + s.Coefficient = int64(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"coefficient\"") + } + case "active_requests": + requiredBitSet[0] |= 1 << 1 + if err := func() error { + v, err := d.Int64() + s.ActiveRequests = int64(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"active_requests\"") + } + case "max_active_requests": + requiredBitSet[0] |= 1 << 2 + if err := func() error { + v, err := d.Int64() + s.MaxActiveRequests = int64(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"max_active_requests\"") + } + default: + return d.Skip() + } + return nil + }); err != nil { + return errors.Wrap(err, "decode CocoonWorkerInstance") + } + // Validate required fields. + var failures []validate.FieldError + for i, mask := range [1]uint8{ + 0b00000111, + } { + if result := (requiredBitSet[i] & mask) ^ mask; result != 0 { + // Mask only required fields and check equality to mask using XOR. + // + // If XOR result is not zero, result is not equal to expected, so some fields are missed. + // Bits of fields which would be set are actually bits of missed fields. + missed := bits.OnesCount8(result) + for bitN := 0; bitN < missed; bitN++ { + bitIdx := bits.TrailingZeros8(result) + fieldIdx := i*8 + bitIdx + var name string + if fieldIdx < len(jsonFieldsNameOfCocoonWorkerInstance) { + name = jsonFieldsNameOfCocoonWorkerInstance[fieldIdx] + } else { + name = strconv.Itoa(fieldIdx) + } + failures = append(failures, validate.FieldError{ + Name: name, + Error: validate.ErrFieldRequired, + }) + // Reset bit. + result &^= 1 << bitIdx + } + } + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + + return nil +} + +// MarshalJSON implements stdjson.Marshaler. +func (s *CocoonWorkerInstance) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *CocoonWorkerInstance) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + +// Encode implements json.Marshaler. +func (s *CocoonWorkerType) Encode(e *jx.Encoder) { + e.ObjStart() + s.encodeFields(e) + e.ObjEnd() +} + +// encodeFields encodes fields. +func (s *CocoonWorkerType) encodeFields(e *jx.Encoder) { + { + e.FieldStart("name") + e.Str(s.Name) + } + { + e.FieldStart("workers") + e.ArrStart() + for _, elem := range s.Workers { + elem.Encode(e) + } + e.ArrEnd() + } +} + +var jsonFieldsNameOfCocoonWorkerType = [2]string{ + 0: "name", + 1: "workers", +} + +// Decode decodes CocoonWorkerType from json. +func (s *CocoonWorkerType) Decode(d *jx.Decoder) error { + if s == nil { + return errors.New("invalid: unable to decode CocoonWorkerType to nil") + } + var requiredBitSet [1]uint8 + + if err := d.ObjBytes(func(d *jx.Decoder, k []byte) error { + switch string(k) { + case "name": + requiredBitSet[0] |= 1 << 0 + if err := func() error { + v, err := d.Str() + s.Name = string(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"name\"") + } + case "workers": + requiredBitSet[0] |= 1 << 1 + if err := func() error { + s.Workers = make([]CocoonWorkerInstance, 0) + if err := d.Arr(func(d *jx.Decoder) error { + var elem CocoonWorkerInstance + if err := elem.Decode(d); err != nil { + return err + } + s.Workers = append(s.Workers, elem) + return nil + }); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"workers\"") + } + default: + return d.Skip() + } + return nil + }); err != nil { + return errors.Wrap(err, "decode CocoonWorkerType") + } + // Validate required fields. + var failures []validate.FieldError + for i, mask := range [1]uint8{ + 0b00000011, + } { + if result := (requiredBitSet[i] & mask) ^ mask; result != 0 { + // Mask only required fields and check equality to mask using XOR. + // + // If XOR result is not zero, result is not equal to expected, so some fields are missed. + // Bits of fields which would be set are actually bits of missed fields. + missed := bits.OnesCount8(result) + for bitN := 0; bitN < missed; bitN++ { + bitIdx := bits.TrailingZeros8(result) + fieldIdx := i*8 + bitIdx + var name string + if fieldIdx < len(jsonFieldsNameOfCocoonWorkerType) { + name = jsonFieldsNameOfCocoonWorkerType[fieldIdx] + } else { + name = strconv.Itoa(fieldIdx) + } + failures = append(failures, validate.FieldError{ + Name: name, + Error: validate.ErrFieldRequired, + }) + // Reset bit. + result &^= 1 << bitIdx + } + } + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + + return nil +} + +// MarshalJSON implements stdjson.Marshaler. +func (s *CocoonWorkerType) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *CocoonWorkerType) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + +// Encode implements json.Marshaler. +func (s *CocoonWorkersResponse) Encode(e *jx.Encoder) { + e.ObjStart() + s.encodeFields(e) + e.ObjEnd() +} + +// encodeFields encodes fields. +func (s *CocoonWorkersResponse) encodeFields(e *jx.Encoder) { + { + e.FieldStart("types") + e.ArrStart() + for _, elem := range s.Types { + elem.Encode(e) + } + e.ArrEnd() + } +} + +var jsonFieldsNameOfCocoonWorkersResponse = [1]string{ + 0: "types", +} + +// Decode decodes CocoonWorkersResponse from json. +func (s *CocoonWorkersResponse) Decode(d *jx.Decoder) error { + if s == nil { + return errors.New("invalid: unable to decode CocoonWorkersResponse to nil") + } + var requiredBitSet [1]uint8 + + if err := d.ObjBytes(func(d *jx.Decoder, k []byte) error { + switch string(k) { + case "types": + requiredBitSet[0] |= 1 << 0 + if err := func() error { + s.Types = make([]CocoonWorkerType, 0) + if err := d.Arr(func(d *jx.Decoder) error { + var elem CocoonWorkerType + if err := elem.Decode(d); err != nil { + return err + } + s.Types = append(s.Types, elem) + return nil + }); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"types\"") + } + default: + return d.Skip() + } + return nil + }); err != nil { + return errors.Wrap(err, "decode CocoonWorkersResponse") + } + // Validate required fields. + var failures []validate.FieldError + for i, mask := range [1]uint8{ + 0b00000001, + } { + if result := (requiredBitSet[i] & mask) ^ mask; result != 0 { + // Mask only required fields and check equality to mask using XOR. + // + // If XOR result is not zero, result is not equal to expected, so some fields are missed. + // Bits of fields which would be set are actually bits of missed fields. + missed := bits.OnesCount8(result) + for bitN := 0; bitN < missed; bitN++ { + bitIdx := bits.TrailingZeros8(result) + fieldIdx := i*8 + bitIdx + var name string + if fieldIdx < len(jsonFieldsNameOfCocoonWorkersResponse) { + name = jsonFieldsNameOfCocoonWorkersResponse[fieldIdx] + } else { + name = strconv.Itoa(fieldIdx) + } + failures = append(failures, validate.FieldError{ + Name: name, + Error: validate.ErrFieldRequired, + }) + // Reset bit. + result &^= 1 << bitIdx + } + } + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + + return nil +} + +// MarshalJSON implements stdjson.Marshaler. +func (s *CocoonWorkersResponse) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *CocoonWorkersResponse) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + // Encode implements json.Marshaler. func (s *ComputePhase) Encode(e *jx.Encoder) { e.ObjStart() @@ -19234,23 +19593,210 @@ func (s *GetChartRatesOK) Decode(d *jx.Decoder) error { result &^= 1 << bitIdx } } - } - if len(failures) > 0 { - return &validate.Error{Fields: failures} + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + + return nil +} + +// MarshalJSON implements stdjson.Marshaler. +func (s *GetChartRatesOK) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *GetChartRatesOK) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + +// Encode implements json.Marshaler. +func (s *GetCocoonWorkersNotImplemented) Encode(e *jx.Encoder) { + e.ObjStart() + s.encodeFields(e) + e.ObjEnd() +} + +// encodeFields encodes fields. +func (s *GetCocoonWorkersNotImplemented) encodeFields(e *jx.Encoder) { +} + +var jsonFieldsNameOfGetCocoonWorkersNotImplemented = [0]string{} + +// Decode decodes GetCocoonWorkersNotImplemented from json. +func (s *GetCocoonWorkersNotImplemented) Decode(d *jx.Decoder) error { + if s == nil { + return errors.New("invalid: unable to decode GetCocoonWorkersNotImplemented to nil") + } + + if err := d.ObjBytes(func(d *jx.Decoder, k []byte) error { + switch string(k) { + default: + return d.Skip() + } + }); err != nil { + return errors.Wrap(err, "decode GetCocoonWorkersNotImplemented") + } + + return nil +} + +// MarshalJSON implements stdjson.Marshaler. +func (s *GetCocoonWorkersNotImplemented) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *GetCocoonWorkersNotImplemented) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + +// Encode implements json.Marshaler. +func (s *GetCocoonWorkersUnauthorized) Encode(e *jx.Encoder) { + e.ObjStart() + s.encodeFields(e) + e.ObjEnd() +} + +// encodeFields encodes fields. +func (s *GetCocoonWorkersUnauthorized) encodeFields(e *jx.Encoder) { + { + if s.Error.Set { + e.FieldStart("error") + s.Error.Encode(e) + } + } +} + +var jsonFieldsNameOfGetCocoonWorkersUnauthorized = [1]string{ + 0: "error", +} + +// Decode decodes GetCocoonWorkersUnauthorized from json. +func (s *GetCocoonWorkersUnauthorized) Decode(d *jx.Decoder) error { + if s == nil { + return errors.New("invalid: unable to decode GetCocoonWorkersUnauthorized to nil") + } + + if err := d.ObjBytes(func(d *jx.Decoder, k []byte) error { + switch string(k) { + case "error": + if err := func() error { + s.Error.Reset() + if err := s.Error.Decode(d); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"error\"") + } + default: + return d.Skip() + } + return nil + }); err != nil { + return errors.Wrap(err, "decode GetCocoonWorkersUnauthorized") + } + + return nil +} + +// MarshalJSON implements stdjson.Marshaler. +func (s *GetCocoonWorkersUnauthorized) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *GetCocoonWorkersUnauthorized) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + +// Encode implements json.Marshaler. +func (s *GetCocoonWorkersUnauthorizedError) Encode(e *jx.Encoder) { + e.ObjStart() + s.encodeFields(e) + e.ObjEnd() +} + +// encodeFields encodes fields. +func (s *GetCocoonWorkersUnauthorizedError) encodeFields(e *jx.Encoder) { + { + if s.Message.Set { + e.FieldStart("message") + s.Message.Encode(e) + } + } + { + if s.Type.Set { + e.FieldStart("type") + s.Type.Encode(e) + } + } +} + +var jsonFieldsNameOfGetCocoonWorkersUnauthorizedError = [2]string{ + 0: "message", + 1: "type", +} + +// Decode decodes GetCocoonWorkersUnauthorizedError from json. +func (s *GetCocoonWorkersUnauthorizedError) Decode(d *jx.Decoder) error { + if s == nil { + return errors.New("invalid: unable to decode GetCocoonWorkersUnauthorizedError to nil") + } + + if err := d.ObjBytes(func(d *jx.Decoder, k []byte) error { + switch string(k) { + case "message": + if err := func() error { + s.Message.Reset() + if err := s.Message.Decode(d); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"message\"") + } + case "type": + if err := func() error { + s.Type.Reset() + if err := s.Type.Decode(d); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"type\"") + } + default: + return d.Skip() + } + return nil + }); err != nil { + return errors.Wrap(err, "decode GetCocoonWorkersUnauthorizedError") } return nil } // MarshalJSON implements stdjson.Marshaler. -func (s *GetChartRatesOK) MarshalJSON() ([]byte, error) { +func (s *GetCocoonWorkersUnauthorizedError) MarshalJSON() ([]byte, error) { e := jx.Encoder{} s.Encode(&e) return e.Bytes(), nil } // UnmarshalJSON implements stdjson.Unmarshaler. -func (s *GetChartRatesOK) UnmarshalJSON(data []byte) error { +func (s *GetCocoonWorkersUnauthorizedError) UnmarshalJSON(data []byte) error { d := jx.DecodeBytes(data) return s.Decode(d) } @@ -33712,6 +34258,39 @@ func (s *OptGetAccountsReq) UnmarshalJSON(data []byte) error { return s.Decode(d) } +// Encode encodes GetCocoonWorkersUnauthorizedError as json. +func (o OptGetCocoonWorkersUnauthorizedError) Encode(e *jx.Encoder) { + if !o.Set { + return + } + o.Value.Encode(e) +} + +// Decode decodes GetCocoonWorkersUnauthorizedError from json. +func (o *OptGetCocoonWorkersUnauthorizedError) Decode(d *jx.Decoder) error { + if o == nil { + return errors.New("invalid: unable to decode OptGetCocoonWorkersUnauthorizedError to nil") + } + o.Set = true + if err := o.Value.Decode(d); err != nil { + return err + } + return nil +} + +// MarshalJSON implements stdjson.Marshaler. +func (s OptGetCocoonWorkersUnauthorizedError) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *OptGetCocoonWorkersUnauthorizedError) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + // Encode encodes GetJettonInfosByAddressesReq as json. func (o OptGetJettonInfosByAddressesReq) Encode(e *jx.Encoder) { if !o.Set { @@ -34562,6 +35141,39 @@ func (s *OptPictureDNS) UnmarshalJSON(data []byte) error { return s.Decode(d) } +// Encode encodes PostCocoonQueryUnauthorizedError as json. +func (o OptPostCocoonQueryUnauthorizedError) Encode(e *jx.Encoder) { + if !o.Set { + return + } + o.Value.Encode(e) +} + +// Decode decodes PostCocoonQueryUnauthorizedError from json. +func (o *OptPostCocoonQueryUnauthorizedError) Decode(d *jx.Decoder) error { + if o == nil { + return errors.New("invalid: unable to decode OptPostCocoonQueryUnauthorizedError to nil") + } + o.Set = true + if err := o.Value.Decode(d); err != nil { + return err + } + return nil +} + +// MarshalJSON implements stdjson.Marshaler. +func (s OptPostCocoonQueryUnauthorizedError) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *OptPostCocoonQueryUnauthorizedError) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + // Encode encodes Price as json. func (o OptPrice) Encode(e *jx.Encoder) { if !o.Set { @@ -36467,6 +37079,235 @@ func (s *PoolInfo) UnmarshalJSON(data []byte) error { return s.Decode(d) } +// Encode implements json.Marshaler. +func (s *PostCocoonQueryNotImplemented) Encode(e *jx.Encoder) { + e.ObjStart() + s.encodeFields(e) + e.ObjEnd() +} + +// encodeFields encodes fields. +func (s *PostCocoonQueryNotImplemented) encodeFields(e *jx.Encoder) { +} + +var jsonFieldsNameOfPostCocoonQueryNotImplemented = [0]string{} + +// Decode decodes PostCocoonQueryNotImplemented from json. +func (s *PostCocoonQueryNotImplemented) Decode(d *jx.Decoder) error { + if s == nil { + return errors.New("invalid: unable to decode PostCocoonQueryNotImplemented to nil") + } + + if err := d.ObjBytes(func(d *jx.Decoder, k []byte) error { + switch string(k) { + default: + return d.Skip() + } + }); err != nil { + return errors.Wrap(err, "decode PostCocoonQueryNotImplemented") + } + + return nil +} + +// MarshalJSON implements stdjson.Marshaler. +func (s *PostCocoonQueryNotImplemented) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *PostCocoonQueryNotImplemented) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + +// Encode encodes PostCocoonQueryOKApplicationJSON as json. +func (s PostCocoonQueryOKApplicationJSON) Encode(e *jx.Encoder) { + unwrapped := jx.Raw(s) + + if len(unwrapped) != 0 { + e.Raw(unwrapped) + } +} + +// Decode decodes PostCocoonQueryOKApplicationJSON from json. +func (s *PostCocoonQueryOKApplicationJSON) Decode(d *jx.Decoder) error { + if s == nil { + return errors.New("invalid: unable to decode PostCocoonQueryOKApplicationJSON to nil") + } + var unwrapped jx.Raw + if err := func() error { + v, err := d.RawAppend(nil) + unwrapped = jx.Raw(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "alias") + } + *s = PostCocoonQueryOKApplicationJSON(unwrapped) + return nil +} + +// MarshalJSON implements stdjson.Marshaler. +func (s PostCocoonQueryOKApplicationJSON) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *PostCocoonQueryOKApplicationJSON) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + +// Encode implements json.Marshaler. +func (s *PostCocoonQueryUnauthorized) Encode(e *jx.Encoder) { + e.ObjStart() + s.encodeFields(e) + e.ObjEnd() +} + +// encodeFields encodes fields. +func (s *PostCocoonQueryUnauthorized) encodeFields(e *jx.Encoder) { + { + if s.Error.Set { + e.FieldStart("error") + s.Error.Encode(e) + } + } +} + +var jsonFieldsNameOfPostCocoonQueryUnauthorized = [1]string{ + 0: "error", +} + +// Decode decodes PostCocoonQueryUnauthorized from json. +func (s *PostCocoonQueryUnauthorized) Decode(d *jx.Decoder) error { + if s == nil { + return errors.New("invalid: unable to decode PostCocoonQueryUnauthorized to nil") + } + + if err := d.ObjBytes(func(d *jx.Decoder, k []byte) error { + switch string(k) { + case "error": + if err := func() error { + s.Error.Reset() + if err := s.Error.Decode(d); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"error\"") + } + default: + return d.Skip() + } + return nil + }); err != nil { + return errors.Wrap(err, "decode PostCocoonQueryUnauthorized") + } + + return nil +} + +// MarshalJSON implements stdjson.Marshaler. +func (s *PostCocoonQueryUnauthorized) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *PostCocoonQueryUnauthorized) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + +// Encode implements json.Marshaler. +func (s *PostCocoonQueryUnauthorizedError) Encode(e *jx.Encoder) { + e.ObjStart() + s.encodeFields(e) + e.ObjEnd() +} + +// encodeFields encodes fields. +func (s *PostCocoonQueryUnauthorizedError) encodeFields(e *jx.Encoder) { + { + if s.Message.Set { + e.FieldStart("message") + s.Message.Encode(e) + } + } + { + if s.Type.Set { + e.FieldStart("type") + s.Type.Encode(e) + } + } +} + +var jsonFieldsNameOfPostCocoonQueryUnauthorizedError = [2]string{ + 0: "message", + 1: "type", +} + +// Decode decodes PostCocoonQueryUnauthorizedError from json. +func (s *PostCocoonQueryUnauthorizedError) Decode(d *jx.Decoder) error { + if s == nil { + return errors.New("invalid: unable to decode PostCocoonQueryUnauthorizedError to nil") + } + + if err := d.ObjBytes(func(d *jx.Decoder, k []byte) error { + switch string(k) { + case "message": + if err := func() error { + s.Message.Reset() + if err := s.Message.Decode(d); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"message\"") + } + case "type": + if err := func() error { + s.Type.Reset() + if err := s.Type.Decode(d); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"type\"") + } + default: + return d.Skip() + } + return nil + }); err != nil { + return errors.Wrap(err, "decode PostCocoonQueryUnauthorizedError") + } + + return nil +} + +// MarshalJSON implements stdjson.Marshaler. +func (s *PostCocoonQueryUnauthorizedError) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *PostCocoonQueryUnauthorizedError) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + // Encode implements json.Marshaler. func (s *Price) Encode(e *jx.Encoder) { e.ObjStart() @@ -43988,8 +44829,10 @@ func (s *ValidationRound) Encode(e *jx.Encoder) { // encodeFields encodes fields. func (s *ValidationRound) encodeFields(e *jx.Encoder) { { - e.FieldStart("election_id") - e.Int64(s.ElectionID) + if s.ElectAt.Set { + e.FieldStart("elect_at") + s.ElectAt.Encode(e) + } } { if s.StartUtime.Set { @@ -44044,7 +44887,7 @@ func (s *ValidationRound) encodeFields(e *jx.Encoder) { } var jsonFieldsNameOfValidationRound = [10]string{ - 0: "election_id", + 0: "elect_at", 1: "start_utime", 2: "end_utime", 3: "start_block", @@ -44065,17 +44908,15 @@ func (s *ValidationRound) Decode(d *jx.Decoder) error { if err := d.ObjBytes(func(d *jx.Decoder, k []byte) error { switch string(k) { - case "election_id": - requiredBitSet[0] |= 1 << 0 + case "elect_at": if err := func() error { - v, err := d.Int64() - s.ElectionID = int64(v) - if err != nil { + s.ElectAt.Reset() + if err := s.ElectAt.Decode(d); err != nil { return err } return nil }(); err != nil { - return errors.Wrap(err, "decode field \"election_id\"") + return errors.Wrap(err, "decode field \"elect_at\"") } case "start_utime": if err := func() error { @@ -44181,7 +45022,7 @@ func (s *ValidationRound) Decode(d *jx.Decoder) error { // Validate required fields. var failures []validate.FieldError for i, mask := range [2]uint8{ - 0b00001001, + 0b00001000, 0b00000010, } { if result := (requiredBitSet[i] & mask) ^ mask; result != 0 { diff --git a/pkg/oas/oas_operations_gen.go b/pkg/oas/oas_operations_gen.go index f80b2e8b6..9c0c0c350 100644 --- a/pkg/oas/oas_operations_gen.go +++ b/pkg/oas/oas_operations_gen.go @@ -57,6 +57,7 @@ const ( GetBlockchainTransactionByMessageHashOperation OperationName = "GetBlockchainTransactionByMessageHash" GetBlockchainValidatorsOperation OperationName = "GetBlockchainValidators" GetChartRatesOperation OperationName = "GetChartRates" + GetCocoonWorkersOperation OperationName = "GetCocoonWorkers" GetDnsInfoOperation OperationName = "GetDnsInfo" GetDomainBidsOperation OperationName = "GetDomainBids" GetEventOperation OperationName = "GetEvent" @@ -112,6 +113,7 @@ const ( GetWalletInfoOperation OperationName = "GetWalletInfo" GetWalletsByPublicKeyOperation OperationName = "GetWalletsByPublicKey" GetWalletsByPublicKeyBulkOperation OperationName = "GetWalletsByPublicKeyBulk" + PostCocoonQueryOperation OperationName = "PostCocoonQuery" ReindexAccountOperation OperationName = "ReindexAccount" SearchAccountsOperation OperationName = "SearchAccounts" SendBlockchainMessageOperation OperationName = "SendBlockchainMessage" diff --git a/pkg/oas/oas_parameters_gen.go b/pkg/oas/oas_parameters_gen.go index eb18e33aa..9ea5ad984 100644 --- a/pkg/oas/oas_parameters_gen.go +++ b/pkg/oas/oas_parameters_gen.go @@ -11378,18 +11378,10 @@ func decodeGetReducedBlockchainBlocksParams(args [0]string, argsEscaped bool, r // GetRoundRewardsParams is parameters of getRoundRewards operation. type GetRoundRewardsParams struct { - // Election ID of the finished round. Mutually exclusive with `block` and `unixtime`. + // Election ID of the finished round. Mutually exclusive with `block`. ElectionID OptInt64 `json:",omitempty,omitzero"` - // Masterchain block seqno within the finished round. Mutually exclusive with `election_id` and - // `unixtime`. + // Masterchain block seqno within the finished round. Mutually exclusive with `election_id`. Block OptUint32 `json:",omitempty,omitzero"` - // Unix timestamp (seconds). Looks up the masterchain block at this time and uses it as the anchor. - // Mutually exclusive with `election_id` and `block`. - Unixtime OptUint32 `json:",omitempty,omitzero"` - // Set to `1` to return only basic validator info (rank, pubkey, effective_stake, weight, reward, - // pool). Skips pool type detection, owner/validator addresses, nominator data, and returned-stake - // lookup — significantly faster. - Shallow OptBool `json:",omitempty,omitzero"` } func unpackGetRoundRewardsParams(packed middleware.Parameters) (params GetRoundRewardsParams) { @@ -11411,24 +11403,6 @@ func unpackGetRoundRewardsParams(packed middleware.Parameters) (params GetRoundR params.Block = v.(OptUint32) } } - { - key := middleware.ParameterKey{ - Name: "unixtime", - In: "query", - } - if v, ok := packed[key]; ok { - params.Unixtime = v.(OptUint32) - } - } - { - key := middleware.ParameterKey{ - Name: "shallow", - In: "query", - } - if v, ok := packed[key]; ok { - params.Shallow = v.(OptBool) - } - } return params } @@ -11516,93 +11490,6 @@ func decodeGetRoundRewardsParams(args [0]string, argsEscaped bool, r *http.Reque Err: err, } } - // Decode query: unixtime. - if err := func() error { - cfg := uri.QueryParameterDecodingConfig{ - Name: "unixtime", - Style: uri.QueryStyleForm, - Explode: true, - } - - if err := q.HasParam(cfg); err == nil { - if err := q.DecodeParam(cfg, func(d uri.Decoder) error { - var paramsDotUnixtimeVal uint32 - if err := func() error { - val, err := d.DecodeValue() - if err != nil { - return err - } - - c, err := conv.ToUint32(val) - if err != nil { - return err - } - - paramsDotUnixtimeVal = c - return nil - }(); err != nil { - return err - } - params.Unixtime.SetTo(paramsDotUnixtimeVal) - return nil - }); err != nil { - return err - } - } - return nil - }(); err != nil { - return params, &ogenerrors.DecodeParamError{ - Name: "unixtime", - In: "query", - Err: err, - } - } - // Set default value for query: shallow. - { - val := bool(false) - params.Shallow.SetTo(val) - } - // Decode query: shallow. - if err := func() error { - cfg := uri.QueryParameterDecodingConfig{ - Name: "shallow", - Style: uri.QueryStyleForm, - Explode: true, - } - - if err := q.HasParam(cfg); err == nil { - if err := q.DecodeParam(cfg, func(d uri.Decoder) error { - var paramsDotShallowVal bool - if err := func() error { - val, err := d.DecodeValue() - if err != nil { - return err - } - - c, err := conv.ToBool(val) - if err != nil { - return err - } - - paramsDotShallowVal = c - return nil - }(); err != nil { - return err - } - params.Shallow.SetTo(paramsDotShallowVal) - return nil - }); err != nil { - return err - } - } - return nil - }(); err != nil { - return params, &ogenerrors.DecodeParamError{ - Name: "shallow", - In: "query", - Err: err, - } - } return params, nil } @@ -12167,14 +12054,11 @@ func decodeGetTraceParams(args [1]string, argsEscaped bool, r *http.Request) (pa // GetValidationRoundsParams is parameters of getValidationRounds operation. type GetValidationRoundsParams struct { - // Return the single round matching this election ID. Mutually exclusive with `block` and `unixtime`. + // Return the single round matching this election ID. Mutually exclusive with `block`. ElectionID OptInt64 `json:",omitempty,omitzero"` // Find the round containing this masterchain block seqno and return it plus up to `limit-1` older - // rounds. Mutually exclusive with `election_id` and `unixtime`. + // rounds. Mutually exclusive with `election_id`. Block OptUint32 `json:",omitempty,omitzero"` - // Unix timestamp (seconds). Looks up the masterchain block at this time and uses it as the anchor. - // Mutually exclusive with `election_id` and `block`. - Unixtime OptUint32 `json:",omitempty,omitzero"` } func unpackGetValidationRoundsParams(packed middleware.Parameters) (params GetValidationRoundsParams) { @@ -12196,15 +12080,6 @@ func unpackGetValidationRoundsParams(packed middleware.Parameters) (params GetVa params.Block = v.(OptUint32) } } - { - key := middleware.ParameterKey{ - Name: "unixtime", - In: "query", - } - if v, ok := packed[key]; ok { - params.Unixtime = v.(OptUint32) - } - } return params } @@ -12292,61 +12167,13 @@ func decodeGetValidationRoundsParams(args [0]string, argsEscaped bool, r *http.R Err: err, } } - // Decode query: unixtime. - if err := func() error { - cfg := uri.QueryParameterDecodingConfig{ - Name: "unixtime", - Style: uri.QueryStyleForm, - Explode: true, - } - - if err := q.HasParam(cfg); err == nil { - if err := q.DecodeParam(cfg, func(d uri.Decoder) error { - var paramsDotUnixtimeVal uint32 - if err := func() error { - val, err := d.DecodeValue() - if err != nil { - return err - } - - c, err := conv.ToUint32(val) - if err != nil { - return err - } - - paramsDotUnixtimeVal = c - return nil - }(); err != nil { - return err - } - params.Unixtime.SetTo(paramsDotUnixtimeVal) - return nil - }); err != nil { - return err - } - } - return nil - }(); err != nil { - return params, &ogenerrors.DecodeParamError{ - Name: "unixtime", - In: "query", - Err: err, - } - } return params, nil } // GetValidatorsParams is parameters of getValidators operation. type GetValidatorsParams struct { - // Masterchain block seqno. Defaults to latest. Mutually exclusive with `unixtime`. + // Masterchain block seqno. Defaults to latest. Seqno OptUint32 `json:",omitempty,omitzero"` - // Unix timestamp (seconds). Looks up the masterchain block at this time and uses it as the anchor. - // Mutually exclusive with `seqno`. - Unixtime OptUint32 `json:",omitempty,omitzero"` - // Set to `1` to return only basic validator info (rank, pubkey, effective_stake, weight, reward, - // pool). Skips pool type detection, owner/validator addresses, nominator data, and returned-stake - // lookup — significantly faster. - Shallow OptBool `json:",omitempty,omitzero"` } func unpackGetValidatorsParams(packed middleware.Parameters) (params GetValidatorsParams) { @@ -12359,24 +12186,6 @@ func unpackGetValidatorsParams(packed middleware.Parameters) (params GetValidato params.Seqno = v.(OptUint32) } } - { - key := middleware.ParameterKey{ - Name: "unixtime", - In: "query", - } - if v, ok := packed[key]; ok { - params.Unixtime = v.(OptUint32) - } - } - { - key := middleware.ParameterKey{ - Name: "shallow", - In: "query", - } - if v, ok := packed[key]; ok { - params.Shallow = v.(OptBool) - } - } return params } @@ -12423,93 +12232,6 @@ func decodeGetValidatorsParams(args [0]string, argsEscaped bool, r *http.Request Err: err, } } - // Decode query: unixtime. - if err := func() error { - cfg := uri.QueryParameterDecodingConfig{ - Name: "unixtime", - Style: uri.QueryStyleForm, - Explode: true, - } - - if err := q.HasParam(cfg); err == nil { - if err := q.DecodeParam(cfg, func(d uri.Decoder) error { - var paramsDotUnixtimeVal uint32 - if err := func() error { - val, err := d.DecodeValue() - if err != nil { - return err - } - - c, err := conv.ToUint32(val) - if err != nil { - return err - } - - paramsDotUnixtimeVal = c - return nil - }(); err != nil { - return err - } - params.Unixtime.SetTo(paramsDotUnixtimeVal) - return nil - }); err != nil { - return err - } - } - return nil - }(); err != nil { - return params, &ogenerrors.DecodeParamError{ - Name: "unixtime", - In: "query", - Err: err, - } - } - // Set default value for query: shallow. - { - val := bool(false) - params.Shallow.SetTo(val) - } - // Decode query: shallow. - if err := func() error { - cfg := uri.QueryParameterDecodingConfig{ - Name: "shallow", - Style: uri.QueryStyleForm, - Explode: true, - } - - if err := q.HasParam(cfg); err == nil { - if err := q.DecodeParam(cfg, func(d uri.Decoder) error { - var paramsDotShallowVal bool - if err := func() error { - val, err := d.DecodeValue() - if err != nil { - return err - } - - c, err := conv.ToBool(val) - if err != nil { - return err - } - - paramsDotShallowVal = c - return nil - }(); err != nil { - return err - } - params.Shallow.SetTo(paramsDotShallowVal) - return nil - }); err != nil { - return err - } - } - return nil - }(); err != nil { - return params, &ogenerrors.DecodeParamError{ - Name: "shallow", - In: "query", - Err: err, - } - } return params, nil } @@ -12644,6 +12366,128 @@ func decodeGetWalletsByPublicKeyParams(args [1]string, argsEscaped bool, r *http return params, nil } +// PostCocoonQueryParams is parameters of postCocoonQuery operation. +type PostCocoonQueryParams struct { + // Cocoon worker model name passed to the proxy. + Model OptString `json:",omitempty,omitzero"` + // HTTP path on the Cocoon worker (e.g. /v1/chat/completions). + Path OptString `json:",omitempty,omitzero"` +} + +func unpackPostCocoonQueryParams(packed middleware.Parameters) (params PostCocoonQueryParams) { + { + key := middleware.ParameterKey{ + Name: "model", + In: "query", + } + if v, ok := packed[key]; ok { + params.Model = v.(OptString) + } + } + { + key := middleware.ParameterKey{ + Name: "path", + In: "query", + } + if v, ok := packed[key]; ok { + params.Path = v.(OptString) + } + } + return params +} + +func decodePostCocoonQueryParams(args [0]string, argsEscaped bool, r *http.Request) (params PostCocoonQueryParams, _ error) { + q := uri.NewQueryDecoder(r.URL.Query()) + // Decode query: model. + if err := func() error { + cfg := uri.QueryParameterDecodingConfig{ + Name: "model", + Style: uri.QueryStyleForm, + Explode: true, + } + + if err := q.HasParam(cfg); err == nil { + if err := q.DecodeParam(cfg, func(d uri.Decoder) error { + var paramsDotModelVal string + if err := func() error { + val, err := d.DecodeValue() + if err != nil { + return err + } + + c, err := conv.ToString(val) + if err != nil { + return err + } + + paramsDotModelVal = c + return nil + }(); err != nil { + return err + } + params.Model.SetTo(paramsDotModelVal) + return nil + }); err != nil { + return err + } + } + return nil + }(); err != nil { + return params, &ogenerrors.DecodeParamError{ + Name: "model", + In: "query", + Err: err, + } + } + // Set default value for query: path. + { + val := string("/query") + params.Path.SetTo(val) + } + // Decode query: path. + if err := func() error { + cfg := uri.QueryParameterDecodingConfig{ + Name: "path", + Style: uri.QueryStyleForm, + Explode: true, + } + + if err := q.HasParam(cfg); err == nil { + if err := q.DecodeParam(cfg, func(d uri.Decoder) error { + var paramsDotPathVal string + if err := func() error { + val, err := d.DecodeValue() + if err != nil { + return err + } + + c, err := conv.ToString(val) + if err != nil { + return err + } + + paramsDotPathVal = c + return nil + }(); err != nil { + return err + } + params.Path.SetTo(paramsDotPathVal) + return nil + }); err != nil { + return err + } + } + return nil + }(); err != nil { + return params, &ogenerrors.DecodeParamError{ + Name: "path", + In: "query", + Err: err, + } + } + return params, nil +} + // ReindexAccountParams is parameters of reindexAccount operation. type ReindexAccountParams struct { // Account ID. diff --git a/pkg/oas/oas_request_decoders_gen.go b/pkg/oas/oas_request_decoders_gen.go index 2578d856b..a53d59933 100644 --- a/pkg/oas/oas_request_decoders_gen.go +++ b/pkg/oas/oas_request_decoders_gen.go @@ -1130,6 +1130,79 @@ func (s *Server) decodeGetWalletsByPublicKeyBulkRequest(r *http.Request) ( } } +func (s *Server) decodePostCocoonQueryRequest(r *http.Request) ( + req jx.Raw, + rawBody []byte, + close func() error, + rerr error, +) { + var closers []func() error + close = func() error { + var merr error + // Close in reverse order, to match defer behavior. + for i := len(closers) - 1; i >= 0; i-- { + c := closers[i] + merr = errors.Join(merr, c()) + } + return merr + } + defer func() { + if rerr != nil { + rerr = errors.Join(rerr, close()) + } + }() + ct, _, err := mime.ParseMediaType(r.Header.Get("Content-Type")) + if err != nil { + return req, rawBody, close, errors.Wrap(err, "parse media type") + } + switch { + case ct == "application/json": + if r.ContentLength == 0 { + return req, rawBody, close, validate.ErrBodyRequired + } + buf, err := io.ReadAll(r.Body) + defer func() { + _ = r.Body.Close() + }() + if err != nil { + return req, rawBody, close, err + } + + // Reset the body to allow for downstream reading. + r.Body = io.NopCloser(bytes.NewBuffer(buf)) + + if len(buf) == 0 { + return req, rawBody, close, validate.ErrBodyRequired + } + + rawBody = append(rawBody, buf...) + d := jx.DecodeBytes(buf) + + var request jx.Raw + if err := func() error { + v, err := d.RawAppend(nil) + request = jx.Raw(v) + if err != nil { + return err + } + if err := d.Skip(); err != io.EOF { + return errors.New("unexpected trailing data") + } + return nil + }(); err != nil { + err = &ogenerrors.DecodeBodyError{ + ContentType: ct, + Body: buf, + Err: err, + } + return req, rawBody, close, err + } + return request, rawBody, close, nil + default: + return req, rawBody, close, validate.InvalidContentType(ct) + } +} + func (s *Server) decodeSendBlockchainMessageRequest(r *http.Request) ( req *SendBlockchainMessageReq, rawBody []byte, diff --git a/pkg/oas/oas_request_encoders_gen.go b/pkg/oas/oas_request_encoders_gen.go index ab550d159..d961e1678 100644 --- a/pkg/oas/oas_request_encoders_gen.go +++ b/pkg/oas/oas_request_encoders_gen.go @@ -242,6 +242,22 @@ func encodeGetWalletsByPublicKeyBulkRequest( return nil } +func encodePostCocoonQueryRequest( + req jx.Raw, + r *http.Request, +) error { + const contentType = "application/json" + e := new(jx.Encoder) + { + if len(req) != 0 { + e.Raw(req) + } + } + encoded := e.Bytes() + ht.SetBody(r, bytes.NewReader(encoded), contentType) + return nil +} + func encodeSendBlockchainMessageRequest( req *SendBlockchainMessageReq, r *http.Request, diff --git a/pkg/oas/oas_response_decoders_gen.go b/pkg/oas/oas_response_decoders_gen.go index dd54265d5..198e4e0d1 100644 --- a/pkg/oas/oas_response_decoders_gen.go +++ b/pkg/oas/oas_response_decoders_gen.go @@ -4660,6 +4660,168 @@ func decodeGetChartRatesResponse(resp *http.Response) (res *GetChartRatesOK, _ e return res, errors.Wrap(defRes, "error") } +func decodeGetCocoonWorkersResponse(resp *http.Response) (res GetCocoonWorkersRes, _ error) { + switch resp.StatusCode { + case 200: + // Code 200. + ct, _, err := mime.ParseMediaType(resp.Header.Get("Content-Type")) + if err != nil { + return res, errors.Wrap(err, "parse media type") + } + switch { + case ct == "application/json": + buf, err := io.ReadAll(resp.Body) + if err != nil { + return res, err + } + d := jx.DecodeBytes(buf) + + var response CocoonWorkersResponse + if err := func() error { + if err := response.Decode(d); err != nil { + return err + } + if err := d.Skip(); err != io.EOF { + return errors.New("unexpected trailing data") + } + return nil + }(); err != nil { + err = &ogenerrors.DecodeBodyError{ + ContentType: ct, + Body: buf, + Err: err, + } + return res, err + } + // Validate response. + if err := func() error { + if err := response.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + return res, errors.Wrap(err, "validate") + } + return &response, nil + default: + return res, validate.InvalidContentType(ct) + } + case 401: + // Code 401. + ct, _, err := mime.ParseMediaType(resp.Header.Get("Content-Type")) + if err != nil { + return res, errors.Wrap(err, "parse media type") + } + switch { + case ct == "application/json": + buf, err := io.ReadAll(resp.Body) + if err != nil { + return res, err + } + d := jx.DecodeBytes(buf) + + var response GetCocoonWorkersUnauthorized + if err := func() error { + if err := response.Decode(d); err != nil { + return err + } + if err := d.Skip(); err != io.EOF { + return errors.New("unexpected trailing data") + } + return nil + }(); err != nil { + err = &ogenerrors.DecodeBodyError{ + ContentType: ct, + Body: buf, + Err: err, + } + return res, err + } + return &response, nil + default: + return res, validate.InvalidContentType(ct) + } + case 501: + // Code 501. + ct, _, err := mime.ParseMediaType(resp.Header.Get("Content-Type")) + if err != nil { + return res, errors.Wrap(err, "parse media type") + } + switch { + case ct == "application/json": + buf, err := io.ReadAll(resp.Body) + if err != nil { + return res, err + } + d := jx.DecodeBytes(buf) + + var response GetCocoonWorkersNotImplemented + if err := func() error { + if err := response.Decode(d); err != nil { + return err + } + if err := d.Skip(); err != io.EOF { + return errors.New("unexpected trailing data") + } + return nil + }(); err != nil { + err = &ogenerrors.DecodeBodyError{ + ContentType: ct, + Body: buf, + Err: err, + } + return res, err + } + return &response, nil + default: + return res, validate.InvalidContentType(ct) + } + } + // Convenient error response. + defRes, err := func() (res *ErrorStatusCode, err error) { + ct, _, err := mime.ParseMediaType(resp.Header.Get("Content-Type")) + if err != nil { + return res, errors.Wrap(err, "parse media type") + } + switch { + case ct == "application/json": + buf, err := io.ReadAll(resp.Body) + if err != nil { + return res, err + } + d := jx.DecodeBytes(buf) + + var response Error + if err := func() error { + if err := response.Decode(d); err != nil { + return err + } + if err := d.Skip(); err != io.EOF { + return errors.New("unexpected trailing data") + } + return nil + }(); err != nil { + err = &ogenerrors.DecodeBodyError{ + ContentType: ct, + Body: buf, + Err: err, + } + return res, err + } + return &ErrorStatusCode{ + StatusCode: resp.StatusCode, + Response: response, + }, nil + default: + return res, validate.InvalidContentType(ct) + } + }() + if err != nil { + return res, errors.Wrapf(err, "default (code %d)", resp.StatusCode) + } + return res, errors.Wrap(defRes, "error") +} + func decodeGetDnsInfoResponse(resp *http.Response) (res *DomainInfo, _ error) { switch resp.StatusCode { case 200: @@ -9553,6 +9715,159 @@ func decodeGetWalletsByPublicKeyBulkResponse(resp *http.Response) (res *WalletsB return res, errors.Wrap(defRes, "error") } +func decodePostCocoonQueryResponse(resp *http.Response) (res PostCocoonQueryRes, _ error) { + switch resp.StatusCode { + case 200: + // Code 200. + ct, _, err := mime.ParseMediaType(resp.Header.Get("Content-Type")) + if err != nil { + return res, errors.Wrap(err, "parse media type") + } + switch { + case ct == "application/json": + buf, err := io.ReadAll(resp.Body) + if err != nil { + return res, err + } + d := jx.DecodeBytes(buf) + + var response PostCocoonQueryOKApplicationJSON + if err := func() error { + if err := response.Decode(d); err != nil { + return err + } + if err := d.Skip(); err != io.EOF { + return errors.New("unexpected trailing data") + } + return nil + }(); err != nil { + err = &ogenerrors.DecodeBodyError{ + ContentType: ct, + Body: buf, + Err: err, + } + return res, err + } + return &response, nil + default: + return res, validate.InvalidContentType(ct) + } + case 401: + // Code 401. + ct, _, err := mime.ParseMediaType(resp.Header.Get("Content-Type")) + if err != nil { + return res, errors.Wrap(err, "parse media type") + } + switch { + case ct == "application/json": + buf, err := io.ReadAll(resp.Body) + if err != nil { + return res, err + } + d := jx.DecodeBytes(buf) + + var response PostCocoonQueryUnauthorized + if err := func() error { + if err := response.Decode(d); err != nil { + return err + } + if err := d.Skip(); err != io.EOF { + return errors.New("unexpected trailing data") + } + return nil + }(); err != nil { + err = &ogenerrors.DecodeBodyError{ + ContentType: ct, + Body: buf, + Err: err, + } + return res, err + } + return &response, nil + default: + return res, validate.InvalidContentType(ct) + } + case 501: + // Code 501. + ct, _, err := mime.ParseMediaType(resp.Header.Get("Content-Type")) + if err != nil { + return res, errors.Wrap(err, "parse media type") + } + switch { + case ct == "application/json": + buf, err := io.ReadAll(resp.Body) + if err != nil { + return res, err + } + d := jx.DecodeBytes(buf) + + var response PostCocoonQueryNotImplemented + if err := func() error { + if err := response.Decode(d); err != nil { + return err + } + if err := d.Skip(); err != io.EOF { + return errors.New("unexpected trailing data") + } + return nil + }(); err != nil { + err = &ogenerrors.DecodeBodyError{ + ContentType: ct, + Body: buf, + Err: err, + } + return res, err + } + return &response, nil + default: + return res, validate.InvalidContentType(ct) + } + } + // Convenient error response. + defRes, err := func() (res *ErrorStatusCode, err error) { + ct, _, err := mime.ParseMediaType(resp.Header.Get("Content-Type")) + if err != nil { + return res, errors.Wrap(err, "parse media type") + } + switch { + case ct == "application/json": + buf, err := io.ReadAll(resp.Body) + if err != nil { + return res, err + } + d := jx.DecodeBytes(buf) + + var response Error + if err := func() error { + if err := response.Decode(d); err != nil { + return err + } + if err := d.Skip(); err != io.EOF { + return errors.New("unexpected trailing data") + } + return nil + }(); err != nil { + err = &ogenerrors.DecodeBodyError{ + ContentType: ct, + Body: buf, + Err: err, + } + return res, err + } + return &ErrorStatusCode{ + StatusCode: resp.StatusCode, + Response: response, + }, nil + default: + return res, validate.InvalidContentType(ct) + } + }() + if err != nil { + return res, errors.Wrapf(err, "default (code %d)", resp.StatusCode) + } + return res, errors.Wrap(defRes, "error") +} + func decodeReindexAccountResponse(resp *http.Response) (res *ReindexAccountOK, _ error) { switch resp.StatusCode { case 200: diff --git a/pkg/oas/oas_response_encoders_gen.go b/pkg/oas/oas_response_encoders_gen.go index 6708a821f..246647526 100644 --- a/pkg/oas/oas_response_encoders_gen.go +++ b/pkg/oas/oas_response_encoders_gen.go @@ -751,6 +751,52 @@ func encodeGetChartRatesResponse(response *GetChartRatesOK, w http.ResponseWrite return nil } +func encodeGetCocoonWorkersResponse(response GetCocoonWorkersRes, w http.ResponseWriter, span trace.Span) error { + switch response := response.(type) { + case *CocoonWorkersResponse: + w.Header().Set("Content-Type", "application/json; charset=utf-8") + w.WriteHeader(200) + span.SetStatus(codes.Ok, http.StatusText(200)) + + e := new(jx.Encoder) + response.Encode(e) + if _, err := e.WriteTo(w); err != nil { + return errors.Wrap(err, "write") + } + + return nil + + case *GetCocoonWorkersUnauthorized: + w.Header().Set("Content-Type", "application/json; charset=utf-8") + w.WriteHeader(401) + span.SetStatus(codes.Error, http.StatusText(401)) + + e := new(jx.Encoder) + response.Encode(e) + if _, err := e.WriteTo(w); err != nil { + return errors.Wrap(err, "write") + } + + return nil + + case *GetCocoonWorkersNotImplemented: + w.Header().Set("Content-Type", "application/json; charset=utf-8") + w.WriteHeader(501) + span.SetStatus(codes.Error, http.StatusText(501)) + + e := new(jx.Encoder) + response.Encode(e) + if _, err := e.WriteTo(w); err != nil { + return errors.Wrap(err, "write") + } + + return nil + + default: + return errors.Errorf("unexpected response type: %T", response) + } +} + func encodeGetDnsInfoResponse(response *DomainInfo, w http.ResponseWriter, span trace.Span) error { w.Header().Set("Content-Type", "application/json; charset=utf-8") w.WriteHeader(200) @@ -1525,6 +1571,52 @@ func encodeGetWalletsByPublicKeyBulkResponse(response *WalletsByPublicKeys, w ht return nil } +func encodePostCocoonQueryResponse(response PostCocoonQueryRes, w http.ResponseWriter, span trace.Span) error { + switch response := response.(type) { + case *PostCocoonQueryOKApplicationJSON: + w.Header().Set("Content-Type", "application/json; charset=utf-8") + w.WriteHeader(200) + span.SetStatus(codes.Ok, http.StatusText(200)) + + e := new(jx.Encoder) + response.Encode(e) + if _, err := e.WriteTo(w); err != nil { + return errors.Wrap(err, "write") + } + + return nil + + case *PostCocoonQueryUnauthorized: + w.Header().Set("Content-Type", "application/json; charset=utf-8") + w.WriteHeader(401) + span.SetStatus(codes.Error, http.StatusText(401)) + + e := new(jx.Encoder) + response.Encode(e) + if _, err := e.WriteTo(w); err != nil { + return errors.Wrap(err, "write") + } + + return nil + + case *PostCocoonQueryNotImplemented: + w.Header().Set("Content-Type", "application/json; charset=utf-8") + w.WriteHeader(501) + span.SetStatus(codes.Error, http.StatusText(501)) + + e := new(jx.Encoder) + response.Encode(e) + if _, err := e.WriteTo(w); err != nil { + return errors.Wrap(err, "write") + } + + return nil + + default: + return errors.Errorf("unexpected response type: %T", response) + } +} + func encodeReindexAccountResponse(response *ReindexAccountOK, w http.ResponseWriter, span trace.Span) error { w.WriteHeader(200) span.SetStatus(codes.Ok, http.StatusText(200)) diff --git a/pkg/oas/oas_router_gen.go b/pkg/oas/oas_router_gen.go index 0ed39090c..fc1236e49 100644 --- a/pkg/oas/oas_router_gen.go +++ b/pkg/oas/oas_router_gen.go @@ -11,6 +11,9 @@ import ( ) var ( + rn192AllowedHeaders = map[string]string{ + "POST": "Content-Type", + } rn63AllowedHeaders = map[string]string{ "POST": "Content-Type", } @@ -35,16 +38,16 @@ var ( rn27AllowedHeaders = map[string]string{ "POST": "Content-Type", } - rn192AllowedHeaders = map[string]string{ + rn195AllowedHeaders = map[string]string{ "POST": "Content-Type", } rn22AllowedHeaders = map[string]string{ "POST": "Accept-Language,Content-Type", } - rn91AllowedHeaders = map[string]string{ + rn93AllowedHeaders = map[string]string{ "GET": "Accept-Language", } - rn110AllowedHeaders = map[string]string{ + rn112AllowedHeaders = map[string]string{ "GET": "Accept-Language", } rn31AllowedHeaders = map[string]string{ @@ -53,31 +56,31 @@ var ( rn32AllowedHeaders = map[string]string{ "POST": "Content-Type", } - rn105AllowedHeaders = map[string]string{ + rn107AllowedHeaders = map[string]string{ "POST": "Content-Type", } - rn193AllowedHeaders = map[string]string{ + rn196AllowedHeaders = map[string]string{ "POST": "Content-Type", } rn12AllowedHeaders = map[string]string{ "POST": "Content-Type", } - rn125AllowedHeaders = map[string]string{ + rn127AllowedHeaders = map[string]string{ "POST": "Content-Type", } - rn120AllowedHeaders = map[string]string{ + rn122AllowedHeaders = map[string]string{ "POST": "Content-Type", } - rn124AllowedHeaders = map[string]string{ + rn126AllowedHeaders = map[string]string{ "GET": "Accept-Language", } - rn189AllowedHeaders = map[string]string{ + rn190AllowedHeaders = map[string]string{ "POST": "Content-Type", } - rn171AllowedHeaders = map[string]string{ + rn172AllowedHeaders = map[string]string{ "GET": "Accept-Language", } - rn174AllowedHeaders = map[string]string{ + rn175AllowedHeaders = map[string]string{ "GET": "Accept-Language", } rn45AllowedHeaders = map[string]string{ @@ -86,7 +89,7 @@ var ( rn23AllowedHeaders = map[string]string{ "POST": "Content-Type", } - rn196AllowedHeaders = map[string]string{ + rn199AllowedHeaders = map[string]string{ "POST": "Content-Type", } rn24AllowedHeaders = map[string]string{ @@ -133,9 +136,9 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { break } switch elem[0] { - case '/': // Prefix: "/v2/" + case '/': // Prefix: "/" - if l := len("/v2/"); len(elem) >= l && elem[0:l] == "/v2/" { + if l := len("/"); len(elem) >= l && elem[0:l] == "/" { elem = elem[l:] } else { break @@ -145,9 +148,9 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { break } switch elem[0] { - case 'a': // Prefix: "a" + case 'c': // Prefix: "cocoon/" - if l := len("a"); len(elem) >= l && elem[0:l] == "a" { + if l := len("cocoon/"); len(elem) >= l && elem[0:l] == "cocoon/" { elem = elem[l:] } else { break @@ -157,86 +160,44 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { break } switch elem[0] { - case 'c': // Prefix: "ccounts/" + case 'q': // Prefix: "query" - if l := len("ccounts/"); len(elem) >= l && elem[0:l] == "ccounts/" { + if l := len("query"); len(elem) >= l && elem[0:l] == "query" { elem = elem[l:] } else { break } if len(elem) == 0 { - break - } - switch elem[0] { - case '_': // Prefix: "_bulk" - origElem := elem - if l := len("_bulk"); len(elem) >= l && elem[0:l] == "_bulk" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "POST": - s.handleGetAccountsRequest([0]string{}, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "POST", - allowedHeaders: rn63AllowedHeaders, - acceptPost: "application/json", - acceptPatch: "", - }) - } - - return - } - - elem = origElem - case 's': // Prefix: "search" - origElem := elem - if l := len("search"); len(elem) >= l && elem[0:l] == "search" { - elem = elem[l:] - } else { - break + // Leaf node. + switch r.Method { + case "POST": + s.handlePostCocoonQueryRequest([0]string{}, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "POST", + allowedHeaders: rn192AllowedHeaders, + acceptPost: "application/json", + acceptPatch: "", + }) } - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "GET": - s.handleSearchAccountsRequest([0]string{}, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "GET", - allowedHeaders: nil, - acceptPost: "", - acceptPatch: "", - }) - } + return + } - return - } + case 'w': // Prefix: "workers" - elem = origElem - } - // Param: "account_id" - // Match until "/" - idx := strings.IndexByte(elem, '/') - if idx < 0 { - idx = len(elem) + if l := len("workers"); len(elem) >= l && elem[0:l] == "workers" { + elem = elem[l:] + } else { + break } - args[0] = elem[:idx] - elem = elem[idx:] if len(elem) == 0 { + // Leaf node. switch r.Method { case "GET": - s.handleGetAccountRequest([1]string{ - args[0], - }, elemIsEscaped, w, r) + s.handleGetCocoonWorkersRequest([0]string{}, elemIsEscaped, w, r) default: s.notAllowed(w, r, notAllowedParams{ allowedMethods: "GET", @@ -248,10 +209,36 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { return } + + } + + case 'v': // Prefix: "v2/" + + if l := len("v2/"); len(elem) >= l && elem[0:l] == "v2/" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + break + } + switch elem[0] { + case 'a': // Prefix: "a" + + if l := len("a"); len(elem) >= l && elem[0:l] == "a" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + break + } switch elem[0] { - case '/': // Prefix: "/" + case 'c': // Prefix: "ccounts/" - if l := len("/"); len(elem) >= l && elem[0:l] == "/" { + if l := len("ccounts/"); len(elem) >= l && elem[0:l] == "ccounts/" { elem = elem[l:] } else { break @@ -261,48 +248,101 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { break } switch elem[0] { - case 'd': // Prefix: "d" - - if l := len("d"); len(elem) >= l && elem[0:l] == "d" { + case '_': // Prefix: "_bulk" + origElem := elem + if l := len("_bulk"); len(elem) >= l && elem[0:l] == "_bulk" { elem = elem[l:] } else { break } if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "POST": + s.handleGetAccountsRequest([0]string{}, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "POST", + allowedHeaders: rn63AllowedHeaders, + acceptPost: "application/json", + acceptPatch: "", + }) + } + + return + } + + elem = origElem + case 's': // Prefix: "search" + origElem := elem + if l := len("search"); len(elem) >= l && elem[0:l] == "search" { + elem = elem[l:] + } else { break } - switch elem[0] { - case 'i': // Prefix: "iff" - if l := len("iff"); len(elem) >= l && elem[0:l] == "iff" { - elem = elem[l:] - } else { - break + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "GET": + s.handleSearchAccountsRequest([0]string{}, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: nil, + acceptPost: "", + acceptPatch: "", + }) } - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "GET": - s.handleGetAccountDiffRequest([1]string{ - args[0], - }, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "GET", - allowedHeaders: nil, - acceptPost: "", - acceptPatch: "", - }) - } + return + } - return - } + elem = origElem + } + // Param: "account_id" + // Match until "/" + idx := strings.IndexByte(elem, '/') + if idx < 0 { + idx = len(elem) + } + args[0] = elem[:idx] + elem = elem[idx:] + + if len(elem) == 0 { + switch r.Method { + case "GET": + s.handleGetAccountRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: nil, + acceptPost: "", + acceptPatch: "", + }) + } + + return + } + switch elem[0] { + case '/': // Prefix: "/" + + if l := len("/"); len(elem) >= l && elem[0:l] == "/" { + elem = elem[l:] + } else { + break + } - case 'n': // Prefix: "ns/" + if len(elem) == 0 { + break + } + switch elem[0] { + case 'd': // Prefix: "d" - if l := len("ns/"); len(elem) >= l && elem[0:l] == "ns/" { + if l := len("d"); len(elem) >= l && elem[0:l] == "d" { elem = elem[l:] } else { break @@ -312,9 +352,9 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { break } switch elem[0] { - case 'b': // Prefix: "backresolve" + case 'i': // Prefix: "iff" - if l := len("backresolve"); len(elem) >= l && elem[0:l] == "backresolve" { + if l := len("iff"); len(elem) >= l && elem[0:l] == "iff" { elem = elem[l:] } else { break @@ -324,7 +364,7 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { // Leaf node. switch r.Method { case "GET": - s.handleAccountDnsBackResolveRequest([1]string{ + s.handleGetAccountDiffRequest([1]string{ args[0], }, elemIsEscaped, w, r) default: @@ -339,107 +379,65 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { return } - case 'e': // Prefix: "expiring" + case 'n': // Prefix: "ns/" - if l := len("expiring"); len(elem) >= l && elem[0:l] == "expiring" { + if l := len("ns/"); len(elem) >= l && elem[0:l] == "ns/" { elem = elem[l:] } else { break } if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "GET": - s.handleGetAccountDnsExpiringRequest([1]string{ - args[0], - }, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "GET", - allowedHeaders: nil, - acceptPost: "", - acceptPatch: "", - }) - } - - return + break } + switch elem[0] { + case 'b': // Prefix: "backresolve" - } - - } + if l := len("backresolve"); len(elem) >= l && elem[0:l] == "backresolve" { + elem = elem[l:] + } else { + break + } - case 'e': // Prefix: "e" + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "GET": + s.handleAccountDnsBackResolveRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: nil, + acceptPost: "", + acceptPatch: "", + }) + } - if l := len("e"); len(elem) >= l && elem[0:l] == "e" { - elem = elem[l:] - } else { - break - } + return + } - if len(elem) == 0 { - break - } - switch elem[0] { - case 'v': // Prefix: "vents" + case 'e': // Prefix: "expiring" - if l := len("vents"); len(elem) >= l && elem[0:l] == "vents" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - switch r.Method { - case "GET": - s.handleGetAccountEventsRequest([1]string{ - args[0], - }, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "GET", - allowedHeaders: rn39AllowedHeaders, - acceptPost: "", - acceptPatch: "", - }) - } - - return - } - switch elem[0] { - case '/': // Prefix: "/" - - if l := len("/"); len(elem) >= l && elem[0:l] == "/" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - break - } - switch elem[0] { - case 'e': // Prefix: "emulate" - origElem := elem - if l := len("emulate"); len(elem) >= l && elem[0:l] == "emulate" { - elem = elem[l:] - } else { - break - } + if l := len("expiring"); len(elem) >= l && elem[0:l] == "expiring" { + elem = elem[l:] + } else { + break + } if len(elem) == 0 { // Leaf node. switch r.Method { - case "POST": - s.handleEmulateMessageToAccountEventRequest([1]string{ + case "GET": + s.handleGetAccountDnsExpiringRequest([1]string{ args[0], }, elemIsEscaped, w, r) default: s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "POST", - allowedHeaders: rn21AllowedHeaders, - acceptPost: "application/json", + allowedMethods: "GET", + allowedHeaders: nil, + acceptPost: "", acceptPatch: "", }) } @@ -447,80 +445,40 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { return } - elem = origElem - } - // Param: "event_id" - // Leaf parameter, slashes are prohibited - idx := strings.IndexByte(elem, '/') - if idx >= 0 { - break - } - args[1] = elem - elem = "" - - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "GET": - s.handleGetAccountEventRequest([2]string{ - args[0], - args[1], - }, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "GET", - allowedHeaders: rn38AllowedHeaders, - acceptPost: "", - acceptPatch: "", - }) - } - - return } } - case 'x': // Prefix: "xtra-currency/" + case 'e': // Prefix: "e" - if l := len("xtra-currency/"); len(elem) >= l && elem[0:l] == "xtra-currency/" { + if l := len("e"); len(elem) >= l && elem[0:l] == "e" { elem = elem[l:] } else { break } - // Param: "id" - // Match until "/" - idx := strings.IndexByte(elem, '/') - if idx < 0 { - idx = len(elem) - } - args[1] = elem[:idx] - elem = elem[idx:] - if len(elem) == 0 { break } switch elem[0] { - case '/': // Prefix: "/history" + case 'v': // Prefix: "vents" - if l := len("/history"); len(elem) >= l && elem[0:l] == "/history" { + if l := len("vents"); len(elem) >= l && elem[0:l] == "vents" { elem = elem[l:] } else { break } if len(elem) == 0 { - // Leaf node. switch r.Method { case "GET": - s.handleGetAccountExtraCurrencyHistoryByIDRequest([2]string{ + s.handleGetAccountEventsRequest([1]string{ args[0], - args[1], }, elemIsEscaped, w, r) default: s.notAllowed(w, r, notAllowedParams{ allowedMethods: "GET", - allowedHeaders: rn43AllowedHeaders, + allowedHeaders: rn39AllowedHeaders, acceptPost: "", acceptPatch: "", }) @@ -528,93 +486,145 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { return } + switch elem[0] { + case '/': // Prefix: "/" - } + if l := len("/"); len(elem) >= l && elem[0:l] == "/" { + elem = elem[l:] + } else { + break + } - } + if len(elem) == 0 { + break + } + switch elem[0] { + case 'e': // Prefix: "emulate" + origElem := elem + if l := len("emulate"); len(elem) >= l && elem[0:l] == "emulate" { + elem = elem[l:] + } else { + break + } - case 'j': // Prefix: "jettons" + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "POST": + s.handleEmulateMessageToAccountEventRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "POST", + allowedHeaders: rn21AllowedHeaders, + acceptPost: "application/json", + acceptPatch: "", + }) + } - if l := len("jettons"); len(elem) >= l && elem[0:l] == "jettons" { - elem = elem[l:] - } else { - break - } + return + } - if len(elem) == 0 { - switch r.Method { - case "GET": - s.handleGetAccountJettonsBalancesRequest([1]string{ - args[0], - }, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "GET", - allowedHeaders: nil, - acceptPost: "", - acceptPatch: "", - }) - } + elem = origElem + } + // Param: "event_id" + // Leaf parameter, slashes are prohibited + idx := strings.IndexByte(elem, '/') + if idx >= 0 { + break + } + args[1] = elem + elem = "" - return - } - switch elem[0] { - case '/': // Prefix: "/" + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "GET": + s.handleGetAccountEventRequest([2]string{ + args[0], + args[1], + }, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: rn38AllowedHeaders, + acceptPost: "", + acceptPatch: "", + }) + } - if l := len("/"); len(elem) >= l && elem[0:l] == "/" { - elem = elem[l:] - } else { - break - } + return + } - if len(elem) == 0 { - break - } - switch elem[0] { - case 'h': // Prefix: "history" - origElem := elem - if l := len("history"); len(elem) >= l && elem[0:l] == "history" { + } + + case 'x': // Prefix: "xtra-currency/" + + if l := len("xtra-currency/"); len(elem) >= l && elem[0:l] == "xtra-currency/" { elem = elem[l:] } else { break } + // Param: "id" + // Match until "/" + idx := strings.IndexByte(elem, '/') + if idx < 0 { + idx = len(elem) + } + args[1] = elem[:idx] + elem = elem[idx:] + if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "GET": - s.handleGetAccountJettonsHistoryRequest([1]string{ - args[0], - }, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "GET", - allowedHeaders: nil, - acceptPost: "", - acceptPatch: "", - }) + break + } + switch elem[0] { + case '/': // Prefix: "/history" + + if l := len("/history"); len(elem) >= l && elem[0:l] == "/history" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "GET": + s.handleGetAccountExtraCurrencyHistoryByIDRequest([2]string{ + args[0], + args[1], + }, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: rn43AllowedHeaders, + acceptPost: "", + acceptPatch: "", + }) + } + + return } - return } - elem = origElem } - // Param: "jetton_id" - // Match until "/" - idx := strings.IndexByte(elem, '/') - if idx < 0 { - idx = len(elem) + + case 'j': // Prefix: "jettons" + + if l := len("jettons"); len(elem) >= l && elem[0:l] == "jettons" { + elem = elem[l:] + } else { + break } - args[1] = elem[:idx] - elem = elem[idx:] if len(elem) == 0 { switch r.Method { case "GET": - s.handleGetAccountJettonBalanceRequest([2]string{ + s.handleGetAccountJettonsBalancesRequest([1]string{ args[0], - args[1], }, elemIsEscaped, w, r) default: s.notAllowed(w, r, notAllowedParams{ @@ -628,26 +638,67 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { return } switch elem[0] { - case '/': // Prefix: "/history" + case '/': // Prefix: "/" - if l := len("/history"); len(elem) >= l && elem[0:l] == "/history" { + if l := len("/"); len(elem) >= l && elem[0:l] == "/" { elem = elem[l:] } else { break } if len(elem) == 0 { - // Leaf node. + break + } + switch elem[0] { + case 'h': // Prefix: "history" + origElem := elem + if l := len("history"); len(elem) >= l && elem[0:l] == "history" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "GET": + s.handleGetAccountJettonsHistoryRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: nil, + acceptPost: "", + acceptPatch: "", + }) + } + + return + } + + elem = origElem + } + // Param: "jetton_id" + // Match until "/" + idx := strings.IndexByte(elem, '/') + if idx < 0 { + idx = len(elem) + } + args[1] = elem[:idx] + elem = elem[idx:] + + if len(elem) == 0 { switch r.Method { case "GET": - s.handleGetAccountJettonHistoryByIDRequest([2]string{ + s.handleGetAccountJettonBalanceRequest([2]string{ args[0], args[1], }, elemIsEscaped, w, r) default: s.notAllowed(w, r, notAllowedParams{ allowedMethods: "GET", - allowedHeaders: rn48AllowedHeaders, + allowedHeaders: nil, acceptPost: "", acceptPatch: "", }) @@ -655,67 +706,124 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { return } + switch elem[0] { + case '/': // Prefix: "/history" - } + if l := len("/history"); len(elem) >= l && elem[0:l] == "/history" { + elem = elem[l:] + } else { + break + } - } + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "GET": + s.handleGetAccountJettonHistoryByIDRequest([2]string{ + args[0], + args[1], + }, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: rn48AllowedHeaders, + acceptPost: "", + acceptPatch: "", + }) + } - case 'm': // Prefix: "multisigs" + return + } - if l := len("multisigs"); len(elem) >= l && elem[0:l] == "multisigs" { - elem = elem[l:] - } else { - break - } + } - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "GET": - s.handleGetAccountMultisigsRequest([1]string{ - args[0], - }, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "GET", - allowedHeaders: nil, - acceptPost: "", - acceptPatch: "", - }) } - return - } + case 'm': // Prefix: "multisigs" - case 'n': // Prefix: "nfts" + if l := len("multisigs"); len(elem) >= l && elem[0:l] == "multisigs" { + elem = elem[l:] + } else { + break + } - if l := len("nfts"); len(elem) >= l && elem[0:l] == "nfts" { - elem = elem[l:] - } else { - break - } + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "GET": + s.handleGetAccountMultisigsRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: nil, + acceptPost: "", + acceptPatch: "", + }) + } - if len(elem) == 0 { - switch r.Method { - case "GET": - s.handleGetAccountNftItemsRequest([1]string{ - args[0], - }, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "GET", - allowedHeaders: nil, - acceptPost: "", - acceptPatch: "", - }) + return } - return - } - switch elem[0] { - case '/': // Prefix: "/history" + case 'n': // Prefix: "nfts" + + if l := len("nfts"); len(elem) >= l && elem[0:l] == "nfts" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + switch r.Method { + case "GET": + s.handleGetAccountNftItemsRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: nil, + acceptPost: "", + acceptPatch: "", + }) + } + + return + } + switch elem[0] { + case '/': // Prefix: "/history" + + if l := len("/history"); len(elem) >= l && elem[0:l] == "/history" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "GET": + s.handleGetAccountNftHistoryRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: rn52AllowedHeaders, + acceptPost: "", + acceptPatch: "", + }) + } + + return + } + + } - if l := len("/history"); len(elem) >= l && elem[0:l] == "/history" { + case 'p': // Prefix: "publickey" + + if l := len("publickey"); len(elem) >= l && elem[0:l] == "publickey" { elem = elem[l:] } else { break @@ -725,13 +833,13 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { // Leaf node. switch r.Method { case "GET": - s.handleGetAccountNftHistoryRequest([1]string{ + s.handleGetAccountPublicKeyRequest([1]string{ args[0], }, elemIsEscaped, w, r) default: s.notAllowed(w, r, notAllowedParams{ allowedMethods: "GET", - allowedHeaders: rn52AllowedHeaders, + allowedHeaders: nil, acceptPost: "", acceptPatch: "", }) @@ -740,92 +848,115 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { return } - } + case 'r': // Prefix: "reindex" - case 'p': // Prefix: "publickey" + if l := len("reindex"); len(elem) >= l && elem[0:l] == "reindex" { + elem = elem[l:] + } else { + break + } - if l := len("publickey"); len(elem) >= l && elem[0:l] == "publickey" { - elem = elem[l:] - } else { - break - } + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "POST": + s.handleReindexAccountRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "POST", + allowedHeaders: nil, + acceptPost: "", + acceptPatch: "", + }) + } - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "GET": - s.handleGetAccountPublicKeyRequest([1]string{ - args[0], - }, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "GET", - allowedHeaders: nil, - acceptPost: "", - acceptPatch: "", - }) + return } - return - } + case 's': // Prefix: "subscriptions" - case 'r': // Prefix: "reindex" + if l := len("subscriptions"); len(elem) >= l && elem[0:l] == "subscriptions" { + elem = elem[l:] + } else { + break + } - if l := len("reindex"); len(elem) >= l && elem[0:l] == "reindex" { - elem = elem[l:] - } else { - break - } + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "GET": + s.handleGetAccountSubscriptionsRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: nil, + acceptPost: "", + acceptPatch: "", + }) + } - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "POST": - s.handleReindexAccountRequest([1]string{ - args[0], - }, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "POST", - allowedHeaders: nil, - acceptPost: "", - acceptPatch: "", - }) + return } - return - } + case 't': // Prefix: "traces" - case 's': // Prefix: "subscriptions" + if l := len("traces"); len(elem) >= l && elem[0:l] == "traces" { + elem = elem[l:] + } else { + break + } - if l := len("subscriptions"); len(elem) >= l && elem[0:l] == "subscriptions" { - elem = elem[l:] - } else { - break - } + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "GET": + s.handleGetAccountTracesRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: nil, + acceptPost: "", + acceptPatch: "", + }) + } - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "GET": - s.handleGetAccountSubscriptionsRequest([1]string{ - args[0], - }, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "GET", - allowedHeaders: nil, - acceptPost: "", - acceptPatch: "", - }) + return } - return } - case 't': // Prefix: "traces" + } + + case 'd': // Prefix: "ddress/" + + if l := len("ddress/"); len(elem) >= l && elem[0:l] == "ddress/" { + elem = elem[l:] + } else { + break + } + + // Param: "account_id" + // Match until "/" + idx := strings.IndexByte(elem, '/') + if idx < 0 { + idx = len(elem) + } + args[0] = elem[:idx] + elem = elem[idx:] + + if len(elem) == 0 { + break + } + switch elem[0] { + case '/': // Prefix: "/parse" - if l := len("traces"); len(elem) >= l && elem[0:l] == "traces" { + if l := len("/parse"); len(elem) >= l && elem[0:l] == "/parse" { elem = elem[l:] } else { break @@ -835,7 +966,7 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { // Leaf node. switch r.Method { case "GET": - s.handleGetAccountTracesRequest([1]string{ + s.handleAddressParseRequest([1]string{ args[0], }, elemIsEscaped, w, r) default: @@ -854,40 +985,39 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { } - case 'd': // Prefix: "ddress/" + case 'b': // Prefix: "blockchain/" - if l := len("ddress/"); len(elem) >= l && elem[0:l] == "ddress/" { + if l := len("blockchain/"); len(elem) >= l && elem[0:l] == "blockchain/" { elem = elem[l:] } else { break } - // Param: "account_id" - // Match until "/" - idx := strings.IndexByte(elem, '/') - if idx < 0 { - idx = len(elem) - } - args[0] = elem[:idx] - elem = elem[idx:] - if len(elem) == 0 { break } switch elem[0] { - case '/': // Prefix: "/parse" + case 'a': // Prefix: "accounts/" - if l := len("/parse"); len(elem) >= l && elem[0:l] == "/parse" { + if l := len("accounts/"); len(elem) >= l && elem[0:l] == "accounts/" { elem = elem[l:] } else { break } + // Param: "account_id" + // Match until "/" + idx := strings.IndexByte(elem, '/') + if idx < 0 { + idx = len(elem) + } + args[0] = elem[:idx] + elem = elem[idx:] + if len(elem) == 0 { - // Leaf node. switch r.Method { case "GET": - s.handleAddressParseRequest([1]string{ + s.handleGetBlockchainRawAccountRequest([1]string{ args[0], }, elemIsEscaped, w, r) default: @@ -901,247 +1031,251 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { return } + switch elem[0] { + case '/': // Prefix: "/" - } + if l := len("/"); len(elem) >= l && elem[0:l] == "/" { + elem = elem[l:] + } else { + break + } - } + if len(elem) == 0 { + break + } + switch elem[0] { + case 'i': // Prefix: "inspect" - case 'b': // Prefix: "blockchain/" + if l := len("inspect"); len(elem) >= l && elem[0:l] == "inspect" { + elem = elem[l:] + } else { + break + } - if l := len("blockchain/"); len(elem) >= l && elem[0:l] == "blockchain/" { - elem = elem[l:] - } else { - break - } + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "GET": + s.handleBlockchainAccountInspectRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: nil, + acceptPost: "", + acceptPatch: "", + }) + } - if len(elem) == 0 { - break - } - switch elem[0] { - case 'a': // Prefix: "accounts/" + return + } - if l := len("accounts/"); len(elem) >= l && elem[0:l] == "accounts/" { - elem = elem[l:] - } else { - break - } + case 'm': // Prefix: "methods/" - // Param: "account_id" - // Match until "/" - idx := strings.IndexByte(elem, '/') - if idx < 0 { - idx = len(elem) - } - args[0] = elem[:idx] - elem = elem[idx:] + if l := len("methods/"); len(elem) >= l && elem[0:l] == "methods/" { + elem = elem[l:] + } else { + break + } - if len(elem) == 0 { - switch r.Method { - case "GET": - s.handleGetBlockchainRawAccountRequest([1]string{ - args[0], - }, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "GET", - allowedHeaders: nil, - acceptPost: "", - acceptPatch: "", - }) - } + // Param: "method_name" + // Leaf parameter, slashes are prohibited + idx := strings.IndexByte(elem, '/') + if idx >= 0 { + break + } + args[1] = elem + elem = "" - return - } - switch elem[0] { - case '/': // Prefix: "/" + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "GET": + s.handleExecGetMethodForBlockchainAccountRequest([2]string{ + args[0], + args[1], + }, elemIsEscaped, w, r) + case "POST": + s.handleExecGetMethodWithBodyForBlockchainAccountRequest([2]string{ + args[0], + args[1], + }, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET,POST", + allowedHeaders: rn27AllowedHeaders, + acceptPost: "application/json", + acceptPatch: "", + }) + } - if l := len("/"); len(elem) >= l && elem[0:l] == "/" { - elem = elem[l:] - } else { - break - } + return + } - if len(elem) == 0 { - break - } - switch elem[0] { - case 'i': // Prefix: "inspect" + case 't': // Prefix: "transactions" - if l := len("inspect"); len(elem) >= l && elem[0:l] == "inspect" { - elem = elem[l:] - } else { - break - } + if l := len("transactions"); len(elem) >= l && elem[0:l] == "transactions" { + elem = elem[l:] + } else { + break + } - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "GET": - s.handleBlockchainAccountInspectRequest([1]string{ - args[0], - }, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "GET", - allowedHeaders: nil, - acceptPost: "", - acceptPatch: "", - }) + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "GET": + s.handleGetBlockchainAccountTransactionsRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: nil, + acceptPost: "", + acceptPatch: "", + }) + } + + return } - return } - case 'm': // Prefix: "methods/" + } - if l := len("methods/"); len(elem) >= l && elem[0:l] == "methods/" { - elem = elem[l:] - } else { - break - } + case 'b': // Prefix: "blocks/" - // Param: "method_name" - // Leaf parameter, slashes are prohibited - idx := strings.IndexByte(elem, '/') - if idx >= 0 { - break - } - args[1] = elem - elem = "" + if l := len("blocks/"); len(elem) >= l && elem[0:l] == "blocks/" { + elem = elem[l:] + } else { + break + } - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "GET": - s.handleExecGetMethodForBlockchainAccountRequest([2]string{ - args[0], - args[1], - }, elemIsEscaped, w, r) - case "POST": - s.handleExecGetMethodWithBodyForBlockchainAccountRequest([2]string{ - args[0], - args[1], - }, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "GET,POST", - allowedHeaders: rn27AllowedHeaders, - acceptPost: "application/json", - acceptPatch: "", - }) - } + // Param: "block_id" + // Match until "/" + idx := strings.IndexByte(elem, '/') + if idx < 0 { + idx = len(elem) + } + args[0] = elem[:idx] + elem = elem[idx:] - return + if len(elem) == 0 { + switch r.Method { + case "GET": + s.handleGetBlockchainBlockRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: nil, + acceptPost: "", + acceptPatch: "", + }) } - case 't': // Prefix: "transactions" + return + } + switch elem[0] { + case '/': // Prefix: "/" - if l := len("transactions"); len(elem) >= l && elem[0:l] == "transactions" { + if l := len("/"); len(elem) >= l && elem[0:l] == "/" { elem = elem[l:] } else { break } if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "GET": - s.handleGetBlockchainAccountTransactionsRequest([1]string{ - args[0], - }, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "GET", - allowedHeaders: nil, - acceptPost: "", - acceptPatch: "", - }) - } - - return + break } + switch elem[0] { + case 'b': // Prefix: "boc" - } + if l := len("boc"); len(elem) >= l && elem[0:l] == "boc" { + elem = elem[l:] + } else { + break + } - } + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "GET": + s.handleDownloadBlockchainBlockBocRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: nil, + acceptPost: "", + acceptPatch: "", + }) + } - case 'b': // Prefix: "blocks/" + return + } - if l := len("blocks/"); len(elem) >= l && elem[0:l] == "blocks/" { - elem = elem[l:] - } else { - break - } + case 't': // Prefix: "transactions" - // Param: "block_id" - // Match until "/" - idx := strings.IndexByte(elem, '/') - if idx < 0 { - idx = len(elem) - } - args[0] = elem[:idx] - elem = elem[idx:] + if l := len("transactions"); len(elem) >= l && elem[0:l] == "transactions" { + elem = elem[l:] + } else { + break + } - if len(elem) == 0 { - switch r.Method { - case "GET": - s.handleGetBlockchainBlockRequest([1]string{ - args[0], - }, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "GET", - allowedHeaders: nil, - acceptPost: "", - acceptPatch: "", - }) - } + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "GET": + s.handleGetBlockchainBlockTransactionsRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: nil, + acceptPost: "", + acceptPatch: "", + }) + } - return - } - switch elem[0] { - case '/': // Prefix: "/" + return + } - if l := len("/"); len(elem) >= l && elem[0:l] == "/" { - elem = elem[l:] - } else { - break - } + } - if len(elem) == 0 { - break } - switch elem[0] { - case 'b': // Prefix: "boc" - if l := len("boc"); len(elem) >= l && elem[0:l] == "boc" { - elem = elem[l:] - } else { - break - } + case 'c': // Prefix: "config" - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "GET": - s.handleDownloadBlockchainBlockBocRequest([1]string{ - args[0], - }, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "GET", - allowedHeaders: nil, - acceptPost: "", - acceptPatch: "", - }) - } + if l := len("config"); len(elem) >= l && elem[0:l] == "config" { + elem = elem[l:] + } else { + break + } - return + if len(elem) == 0 { + switch r.Method { + case "GET": + s.handleGetBlockchainConfigRequest([0]string{}, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: nil, + acceptPost: "", + acceptPatch: "", + }) } - case 't': // Prefix: "transactions" + return + } + switch elem[0] { + case '/': // Prefix: "/raw" - if l := len("transactions"); len(elem) >= l && elem[0:l] == "transactions" { + if l := len("/raw"); len(elem) >= l && elem[0:l] == "/raw" { elem = elem[l:] } else { break @@ -1151,9 +1285,7 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { // Leaf node. switch r.Method { case "GET": - s.handleGetBlockchainBlockTransactionsRequest([1]string{ - args[0], - }, elemIsEscaped, w, r) + s.handleGetRawBlockchainConfigRequest([0]string{}, elemIsEscaped, w, r) default: s.notAllowed(w, r, notAllowedParams{ allowedMethods: "GET", @@ -1168,45 +1300,30 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { } - } - - case 'c': // Prefix: "config" - - if l := len("config"); len(elem) >= l && elem[0:l] == "config" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - switch r.Method { - case "GET": - s.handleGetBlockchainConfigRequest([0]string{}, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "GET", - allowedHeaders: nil, - acceptPost: "", - acceptPatch: "", - }) - } - - return - } - switch elem[0] { - case '/': // Prefix: "/raw" + case 'l': // Prefix: "libraries/" - if l := len("/raw"); len(elem) >= l && elem[0:l] == "/raw" { + if l := len("libraries/"); len(elem) >= l && elem[0:l] == "libraries/" { elem = elem[l:] } else { break } + // Param: "hash" + // Leaf parameter, slashes are prohibited + idx := strings.IndexByte(elem, '/') + if idx >= 0 { + break + } + args[0] = elem + elem = "" + if len(elem) == 0 { // Leaf node. switch r.Method { case "GET": - s.handleGetRawBlockchainConfigRequest([0]string{}, elemIsEscaped, w, r) + s.handleGetLibraryByHashRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) default: s.notAllowed(w, r, notAllowedParams{ allowedMethods: "GET", @@ -1219,129 +1336,278 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { return } - } + case 'm': // Prefix: "m" - case 'l': // Prefix: "libraries/" + if l := len("m"); len(elem) >= l && elem[0:l] == "m" { + elem = elem[l:] + } else { + break + } - if l := len("libraries/"); len(elem) >= l && elem[0:l] == "libraries/" { - elem = elem[l:] - } else { - break - } + if len(elem) == 0 { + break + } + switch elem[0] { + case 'a': // Prefix: "asterchain" - // Param: "hash" - // Leaf parameter, slashes are prohibited - idx := strings.IndexByte(elem, '/') - if idx >= 0 { - break - } - args[0] = elem - elem = "" + if l := len("asterchain"); len(elem) >= l && elem[0:l] == "asterchain" { + elem = elem[l:] + } else { + break + } - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "GET": - s.handleGetLibraryByHashRequest([1]string{ - args[0], - }, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "GET", - allowedHeaders: nil, - acceptPost: "", - acceptPatch: "", - }) - } + if len(elem) == 0 { + break + } + switch elem[0] { + case '-': // Prefix: "-head" - return - } + if l := len("-head"); len(elem) >= l && elem[0:l] == "-head" { + elem = elem[l:] + } else { + break + } - case 'm': // Prefix: "m" + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "GET": + s.handleGetBlockchainMasterchainHeadRequest([0]string{}, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: nil, + acceptPost: "", + acceptPatch: "", + }) + } - if l := len("m"); len(elem) >= l && elem[0:l] == "m" { - elem = elem[l:] - } else { - break - } + return + } - if len(elem) == 0 { - break - } - switch elem[0] { - case 'a': // Prefix: "asterchain" + case '/': // Prefix: "/" + + if l := len("/"); len(elem) >= l && elem[0:l] == "/" { + elem = elem[l:] + } else { + break + } + + // Param: "masterchain_seqno" + // Match until "/" + idx := strings.IndexByte(elem, '/') + if idx < 0 { + idx = len(elem) + } + args[0] = elem[:idx] + elem = elem[idx:] + + if len(elem) == 0 { + break + } + switch elem[0] { + case '/': // Prefix: "/" + + if l := len("/"); len(elem) >= l && elem[0:l] == "/" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + break + } + switch elem[0] { + case 'b': // Prefix: "blocks" + + if l := len("blocks"); len(elem) >= l && elem[0:l] == "blocks" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "GET": + s.handleGetBlockchainMasterchainBlocksRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: nil, + acceptPost: "", + acceptPatch: "", + }) + } + + return + } + + case 'c': // Prefix: "config" + + if l := len("config"); len(elem) >= l && elem[0:l] == "config" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + switch r.Method { + case "GET": + s.handleGetBlockchainConfigFromBlockRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: nil, + acceptPost: "", + acceptPatch: "", + }) + } + + return + } + switch elem[0] { + case '/': // Prefix: "/raw" + + if l := len("/raw"); len(elem) >= l && elem[0:l] == "/raw" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "GET": + s.handleGetRawBlockchainConfigFromBlockRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: nil, + acceptPost: "", + acceptPatch: "", + }) + } + + return + } + + } + + case 's': // Prefix: "shards" + + if l := len("shards"); len(elem) >= l && elem[0:l] == "shards" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "GET": + s.handleGetBlockchainMasterchainShardsRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: nil, + acceptPost: "", + acceptPatch: "", + }) + } + + return + } + + case 't': // Prefix: "transactions" + + if l := len("transactions"); len(elem) >= l && elem[0:l] == "transactions" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "GET": + s.handleGetBlockchainMasterchainTransactionsRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: nil, + acceptPost: "", + acceptPatch: "", + }) + } + + return + } + + } - if l := len("asterchain"); len(elem) >= l && elem[0:l] == "asterchain" { - elem = elem[l:] - } else { - break - } + } - if len(elem) == 0 { - break - } - switch elem[0] { - case '-': // Prefix: "-head" + } + + case 'e': // Prefix: "essage" - if l := len("-head"); len(elem) >= l && elem[0:l] == "-head" { + if l := len("essage"); len(elem) >= l && elem[0:l] == "essage" { elem = elem[l:] } else { break } if len(elem) == 0 { - // Leaf node. switch r.Method { - case "GET": - s.handleGetBlockchainMasterchainHeadRequest([0]string{}, elemIsEscaped, w, r) + case "POST": + s.handleSendBlockchainMessageRequest([0]string{}, elemIsEscaped, w, r) default: s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "GET", - allowedHeaders: nil, - acceptPost: "", + allowedMethods: "POST", + allowedHeaders: rn195AllowedHeaders, + acceptPost: "application/json", acceptPatch: "", }) } return } - - case '/': // Prefix: "/" - - if l := len("/"); len(elem) >= l && elem[0:l] == "/" { - elem = elem[l:] - } else { - break - } - - // Param: "masterchain_seqno" - // Match until "/" - idx := strings.IndexByte(elem, '/') - if idx < 0 { - idx = len(elem) - } - args[0] = elem[:idx] - elem = elem[idx:] - - if len(elem) == 0 { - break - } switch elem[0] { - case '/': // Prefix: "/" + case 's': // Prefix: "s/" - if l := len("/"); len(elem) >= l && elem[0:l] == "/" { + if l := len("s/"); len(elem) >= l && elem[0:l] == "s/" { elem = elem[l:] } else { break } + // Param: "msg_id" + // Match until "/" + idx := strings.IndexByte(elem, '/') + if idx < 0 { + idx = len(elem) + } + args[0] = elem[:idx] + elem = elem[idx:] + if len(elem) == 0 { break } switch elem[0] { - case 'b': // Prefix: "blocks" + case '/': // Prefix: "/transaction" - if l := len("blocks"); len(elem) >= l && elem[0:l] == "blocks" { + if l := len("/transaction"); len(elem) >= l && elem[0:l] == "/transaction" { elem = elem[l:] } else { break @@ -1351,7 +1617,7 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { // Leaf node. switch r.Method { case "GET": - s.handleGetBlockchainMasterchainBlocksRequest([1]string{ + s.handleGetBlockchainTransactionByMessageHashRequest([1]string{ args[0], }, elemIsEscaped, w, r) default: @@ -1366,356 +1632,384 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { return } - case 'c': // Prefix: "config" + } - if l := len("config"); len(elem) >= l && elem[0:l] == "config" { - elem = elem[l:] - } else { - break - } + } - if len(elem) == 0 { - switch r.Method { - case "GET": - s.handleGetBlockchainConfigFromBlockRequest([1]string{ - args[0], - }, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "GET", - allowedHeaders: nil, - acceptPost: "", - acceptPatch: "", - }) - } + } - return - } - switch elem[0] { - case '/': // Prefix: "/raw" + case 'r': // Prefix: "reduced/blocks" - if l := len("/raw"); len(elem) >= l && elem[0:l] == "/raw" { - elem = elem[l:] - } else { - break - } + if l := len("reduced/blocks"); len(elem) >= l && elem[0:l] == "reduced/blocks" { + elem = elem[l:] + } else { + break + } - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "GET": - s.handleGetRawBlockchainConfigFromBlockRequest([1]string{ - args[0], - }, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "GET", - allowedHeaders: nil, - acceptPost: "", - acceptPatch: "", - }) - } + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "GET": + s.handleGetReducedBlockchainBlocksRequest([0]string{}, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: nil, + acceptPost: "", + acceptPatch: "", + }) + } - return - } + return + } - } + case 't': // Prefix: "transactions/" - case 's': // Prefix: "shards" + if l := len("transactions/"); len(elem) >= l && elem[0:l] == "transactions/" { + elem = elem[l:] + } else { + break + } - if l := len("shards"); len(elem) >= l && elem[0:l] == "shards" { - elem = elem[l:] - } else { - break - } + // Param: "transaction_id" + // Leaf parameter, slashes are prohibited + idx := strings.IndexByte(elem, '/') + if idx >= 0 { + break + } + args[0] = elem + elem = "" - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "GET": - s.handleGetBlockchainMasterchainShardsRequest([1]string{ - args[0], - }, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "GET", - allowedHeaders: nil, - acceptPost: "", - acceptPatch: "", - }) - } + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "GET": + s.handleGetBlockchainTransactionRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: nil, + acceptPost: "", + acceptPatch: "", + }) + } - return - } + return + } - case 't': // Prefix: "transactions" + case 'v': // Prefix: "validators" - if l := len("transactions"); len(elem) >= l && elem[0:l] == "transactions" { - elem = elem[l:] - } else { - break - } + if l := len("validators"); len(elem) >= l && elem[0:l] == "validators" { + elem = elem[l:] + } else { + break + } - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "GET": - s.handleGetBlockchainMasterchainTransactionsRequest([1]string{ - args[0], - }, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "GET", - allowedHeaders: nil, - acceptPost: "", - acceptPatch: "", - }) - } + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "GET": + s.handleGetBlockchainValidatorsRequest([0]string{}, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: nil, + acceptPost: "", + acceptPatch: "", + }) + } - return - } + return + } - } + } + + case 'd': // Prefix: "dns/" + + if l := len("dns/"); len(elem) >= l && elem[0:l] == "dns/" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + break + } + switch elem[0] { + case 'a': // Prefix: "auctions" + origElem := elem + if l := len("auctions"); len(elem) >= l && elem[0:l] == "auctions" { + elem = elem[l:] + } else { + break + } + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "GET": + s.handleGetAllAuctionsRequest([0]string{}, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: nil, + acceptPost: "", + acceptPatch: "", + }) } + return + } + + elem = origElem + } + // Param: "domain_name" + // Match until "/" + idx := strings.IndexByte(elem, '/') + if idx < 0 { + idx = len(elem) + } + args[0] = elem[:idx] + elem = elem[idx:] + + if len(elem) == 0 { + switch r.Method { + case "GET": + s.handleGetDnsInfoRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: nil, + acceptPost: "", + acceptPatch: "", + }) } - case 'e': // Prefix: "essage" + return + } + switch elem[0] { + case '/': // Prefix: "/" - if l := len("essage"); len(elem) >= l && elem[0:l] == "essage" { + if l := len("/"); len(elem) >= l && elem[0:l] == "/" { elem = elem[l:] } else { break } if len(elem) == 0 { - switch r.Method { - case "POST": - s.handleSendBlockchainMessageRequest([0]string{}, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "POST", - allowedHeaders: rn192AllowedHeaders, - acceptPost: "application/json", - acceptPatch: "", - }) - } - - return + break } switch elem[0] { - case 's': // Prefix: "s/" + case 'b': // Prefix: "bids" - if l := len("s/"); len(elem) >= l && elem[0:l] == "s/" { + if l := len("bids"); len(elem) >= l && elem[0:l] == "bids" { elem = elem[l:] } else { break } - // Param: "msg_id" - // Match until "/" - idx := strings.IndexByte(elem, '/') - if idx < 0 { - idx = len(elem) - } - args[0] = elem[:idx] - elem = elem[idx:] - if len(elem) == 0 { - break + // Leaf node. + switch r.Method { + case "GET": + s.handleGetDomainBidsRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: nil, + acceptPost: "", + acceptPatch: "", + }) + } + + return } - switch elem[0] { - case '/': // Prefix: "/transaction" - if l := len("/transaction"); len(elem) >= l && elem[0:l] == "/transaction" { - elem = elem[l:] - } else { - break - } + case 'r': // Prefix: "resolve" - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "GET": - s.handleGetBlockchainTransactionByMessageHashRequest([1]string{ - args[0], - }, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "GET", - allowedHeaders: nil, - acceptPost: "", - acceptPatch: "", - }) - } + if l := len("resolve"); len(elem) >= l && elem[0:l] == "resolve" { + elem = elem[l:] + } else { + break + } - return + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "GET": + s.handleDnsResolveRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: nil, + acceptPost: "", + acceptPatch: "", + }) } + return } } } - case 'r': // Prefix: "reduced/blocks" + case 'e': // Prefix: "e" - if l := len("reduced/blocks"); len(elem) >= l && elem[0:l] == "reduced/blocks" { + if l := len("e"); len(elem) >= l && elem[0:l] == "e" { elem = elem[l:] } else { break } if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "GET": - s.handleGetReducedBlockchainBlocksRequest([0]string{}, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "GET", - allowedHeaders: nil, - acceptPost: "", - acceptPatch: "", - }) - } - - return - } - - case 't': // Prefix: "transactions/" - - if l := len("transactions/"); len(elem) >= l && elem[0:l] == "transactions/" { - elem = elem[l:] - } else { break } + switch elem[0] { + case 'v': // Prefix: "vents/" - // Param: "transaction_id" - // Leaf parameter, slashes are prohibited - idx := strings.IndexByte(elem, '/') - if idx >= 0 { - break - } - args[0] = elem - elem = "" + if l := len("vents/"); len(elem) >= l && elem[0:l] == "vents/" { + elem = elem[l:] + } else { + break + } - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "GET": - s.handleGetBlockchainTransactionRequest([1]string{ - args[0], - }, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "GET", - allowedHeaders: nil, - acceptPost: "", - acceptPatch: "", - }) + if len(elem) == 0 { + break } + switch elem[0] { + case 'e': // Prefix: "emulate" + origElem := elem + if l := len("emulate"); len(elem) >= l && elem[0:l] == "emulate" { + elem = elem[l:] + } else { + break + } - return - } + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "POST": + s.handleEmulateMessageToEventRequest([0]string{}, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "POST", + allowedHeaders: rn22AllowedHeaders, + acceptPost: "application/json", + acceptPatch: "", + }) + } - case 'v': // Prefix: "validators" + return + } - if l := len("validators"); len(elem) >= l && elem[0:l] == "validators" { - elem = elem[l:] - } else { - break - } + elem = origElem + } + // Param: "event_id" + // Match until "/" + idx := strings.IndexByte(elem, '/') + if idx < 0 { + idx = len(elem) + } + args[0] = elem[:idx] + elem = elem[idx:] - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "GET": - s.handleGetBlockchainValidatorsRequest([0]string{}, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "GET", - allowedHeaders: nil, - acceptPost: "", - acceptPatch: "", - }) + if len(elem) == 0 { + switch r.Method { + case "GET": + s.handleGetEventRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: rn93AllowedHeaders, + acceptPost: "", + acceptPatch: "", + }) + } + + return } + switch elem[0] { + case '/': // Prefix: "/jettons" - return - } + if l := len("/jettons"); len(elem) >= l && elem[0:l] == "/jettons" { + elem = elem[l:] + } else { + break + } - } + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "GET": + s.handleGetJettonsEventsRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: rn112AllowedHeaders, + acceptPost: "", + acceptPatch: "", + }) + } - case 'd': // Prefix: "dns/" + return + } - if l := len("dns/"); len(elem) >= l && elem[0:l] == "dns/" { - elem = elem[l:] - } else { - break - } + } - if len(elem) == 0 { - break - } - switch elem[0] { - case 'a': // Prefix: "auctions" - origElem := elem - if l := len("auctions"); len(elem) >= l && elem[0:l] == "auctions" { - elem = elem[l:] - } else { - break - } + case 'x': // Prefix: "xtra-currency/" - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "GET": - s.handleGetAllAuctionsRequest([0]string{}, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "GET", - allowedHeaders: nil, - acceptPost: "", - acceptPatch: "", - }) + if l := len("xtra-currency/"); len(elem) >= l && elem[0:l] == "xtra-currency/" { + elem = elem[l:] + } else { + break } - return - } + // Param: "id" + // Leaf parameter, slashes are prohibited + idx := strings.IndexByte(elem, '/') + if idx >= 0 { + break + } + args[0] = elem + elem = "" - elem = origElem - } - // Param: "domain_name" - // Match until "/" - idx := strings.IndexByte(elem, '/') - if idx < 0 { - idx = len(elem) - } - args[0] = elem[:idx] - elem = elem[idx:] + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "GET": + s.handleGetExtraCurrencyInfoRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: nil, + acceptPost: "", + acceptPatch: "", + }) + } - if len(elem) == 0 { - switch r.Method { - case "GET": - s.handleGetDnsInfoRequest([1]string{ - args[0], - }, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "GET", - allowedHeaders: nil, - acceptPost: "", - acceptPatch: "", - }) - } + return + } - return - } - switch elem[0] { - case '/': // Prefix: "/" + } - if l := len("/"); len(elem) >= l && elem[0:l] == "/" { + case 'g': // Prefix: "gasless/" + + if l := len("gasless/"); len(elem) >= l && elem[0:l] == "gasless/" { elem = elem[l:] } else { break @@ -1725,9 +2019,9 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { break } switch elem[0] { - case 'b': // Prefix: "bids" + case 'c': // Prefix: "config" - if l := len("bids"); len(elem) >= l && elem[0:l] == "bids" { + if l := len("config"); len(elem) >= l && elem[0:l] == "config" { elem = elem[l:] } else { break @@ -1737,9 +2031,7 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { // Leaf node. switch r.Method { case "GET": - s.handleGetDomainBidsRequest([1]string{ - args[0], - }, elemIsEscaped, w, r) + s.handleGaslessConfigRequest([0]string{}, elemIsEscaped, w, r) default: s.notAllowed(w, r, notAllowedParams{ allowedMethods: "GET", @@ -1752,26 +2044,35 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { return } - case 'r': // Prefix: "resolve" + case 'e': // Prefix: "estimate/" - if l := len("resolve"); len(elem) >= l && elem[0:l] == "resolve" { + if l := len("estimate/"); len(elem) >= l && elem[0:l] == "estimate/" { elem = elem[l:] } else { break } + // Param: "master_id" + // Leaf parameter, slashes are prohibited + idx := strings.IndexByte(elem, '/') + if idx >= 0 { + break + } + args[0] = elem + elem = "" + if len(elem) == 0 { // Leaf node. switch r.Method { - case "GET": - s.handleDnsResolveRequest([1]string{ + case "POST": + s.handleGaslessEstimateRequest([1]string{ args[0], }, elemIsEscaped, w, r) default: s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "GET", - allowedHeaders: nil, - acceptPost: "", + allowedMethods: "POST", + allowedHeaders: rn31AllowedHeaders, + acceptPost: "application/json", acceptPatch: "", }) } @@ -1779,37 +2080,9 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { return } - } - - } - - case 'e': // Prefix: "e" - - if l := len("e"); len(elem) >= l && elem[0:l] == "e" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - break - } - switch elem[0] { - case 'v': // Prefix: "vents/" - - if l := len("vents/"); len(elem) >= l && elem[0:l] == "vents/" { - elem = elem[l:] - } else { - break - } + case 's': // Prefix: "send" - if len(elem) == 0 { - break - } - switch elem[0] { - case 'e': // Prefix: "emulate" - origElem := elem - if l := len("emulate"); len(elem) >= l && elem[0:l] == "emulate" { + if l := len("send"); len(elem) >= l && elem[0:l] == "send" { elem = elem[l:] } else { break @@ -1819,11 +2092,11 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { // Leaf node. switch r.Method { case "POST": - s.handleEmulateMessageToEventRequest([0]string{}, elemIsEscaped, w, r) + s.handleGaslessSendRequest([0]string{}, elemIsEscaped, w, r) default: s.notAllowed(w, r, notAllowedParams{ allowedMethods: "POST", - allowedHeaders: rn22AllowedHeaders, + allowedHeaders: rn32AllowedHeaders, acceptPost: "application/json", acceptPatch: "", }) @@ -1832,27 +2105,24 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { return } - elem = origElem } - // Param: "event_id" - // Match until "/" - idx := strings.IndexByte(elem, '/') - if idx < 0 { - idx = len(elem) + + case 'j': // Prefix: "jettons" + + if l := len("jettons"); len(elem) >= l && elem[0:l] == "jettons" { + elem = elem[l:] + } else { + break } - args[0] = elem[:idx] - elem = elem[idx:] if len(elem) == 0 { switch r.Method { case "GET": - s.handleGetEventRequest([1]string{ - args[0], - }, elemIsEscaped, w, r) + s.handleGetJettonsRequest([0]string{}, elemIsEscaped, w, r) default: s.notAllowed(w, r, notAllowedParams{ allowedMethods: "GET", - allowedHeaders: rn91AllowedHeaders, + allowedHeaders: nil, acceptPost: "", acceptPatch: "", }) @@ -1861,25 +2131,64 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { return } switch elem[0] { - case '/': // Prefix: "/jettons" + case '/': // Prefix: "/" - if l := len("/jettons"); len(elem) >= l && elem[0:l] == "/jettons" { + if l := len("/"); len(elem) >= l && elem[0:l] == "/" { elem = elem[l:] } else { break } if len(elem) == 0 { - // Leaf node. + break + } + switch elem[0] { + case '_': // Prefix: "_bulk" + origElem := elem + if l := len("_bulk"); len(elem) >= l && elem[0:l] == "_bulk" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "POST": + s.handleGetJettonInfosByAddressesRequest([0]string{}, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "POST", + allowedHeaders: rn107AllowedHeaders, + acceptPost: "application/json", + acceptPatch: "", + }) + } + + return + } + + elem = origElem + } + // Param: "jetton_id" + // Match until "/" + idx := strings.IndexByte(elem, '/') + if idx < 0 { + idx = len(elem) + } + args[0] = elem[:idx] + elem = elem[idx:] + + if len(elem) == 0 { switch r.Method { case "GET": - s.handleGetJettonsEventsRequest([1]string{ + s.handleGetJettonInfoRequest([1]string{ args[0], }, elemIsEscaped, w, r) default: s.notAllowed(w, r, notAllowedParams{ allowedMethods: "GET", - allowedHeaders: rn110AllowedHeaders, + allowedHeaders: nil, acceptPost: "", acceptPatch: "", }) @@ -1887,174 +2196,157 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { return } + switch elem[0] { + case '/': // Prefix: "/" - } - - case 'x': // Prefix: "xtra-currency/" - - if l := len("xtra-currency/"); len(elem) >= l && elem[0:l] == "xtra-currency/" { - elem = elem[l:] - } else { - break - } + if l := len("/"); len(elem) >= l && elem[0:l] == "/" { + elem = elem[l:] + } else { + break + } - // Param: "id" - // Leaf parameter, slashes are prohibited - idx := strings.IndexByte(elem, '/') - if idx >= 0 { - break - } - args[0] = elem - elem = "" + if len(elem) == 0 { + break + } + switch elem[0] { + case 'a': // Prefix: "accounts/" - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "GET": - s.handleGetExtraCurrencyInfoRequest([1]string{ - args[0], - }, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "GET", - allowedHeaders: nil, - acceptPost: "", - acceptPatch: "", - }) - } + if l := len("accounts/"); len(elem) >= l && elem[0:l] == "accounts/" { + elem = elem[l:] + } else { + break + } - return - } + // Param: "account_id" + // Match until "/" + idx := strings.IndexByte(elem, '/') + if idx < 0 { + idx = len(elem) + } + args[1] = elem[:idx] + elem = elem[idx:] - } + if len(elem) == 0 { + break + } + switch elem[0] { + case '/': // Prefix: "/history" - case 'g': // Prefix: "gasless/" + if l := len("/history"); len(elem) >= l && elem[0:l] == "/history" { + elem = elem[l:] + } else { + break + } - if l := len("gasless/"); len(elem) >= l && elem[0:l] == "gasless/" { - elem = elem[l:] - } else { - break - } + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "GET": + s.handleGetJettonAccountHistoryByIDRequest([2]string{ + args[0], + args[1], + }, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: nil, + acceptPost: "", + acceptPatch: "", + }) + } - if len(elem) == 0 { - break - } - switch elem[0] { - case 'c': // Prefix: "config" + return + } - if l := len("config"); len(elem) >= l && elem[0:l] == "config" { - elem = elem[l:] - } else { - break - } + } - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "GET": - s.handleGaslessConfigRequest([0]string{}, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "GET", - allowedHeaders: nil, - acceptPost: "", - acceptPatch: "", - }) - } + case 'h': // Prefix: "holders" - return - } + if l := len("holders"); len(elem) >= l && elem[0:l] == "holders" { + elem = elem[l:] + } else { + break + } - case 'e': // Prefix: "estimate/" + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "GET": + s.handleGetJettonHoldersRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: nil, + acceptPost: "", + acceptPatch: "", + }) + } - if l := len("estimate/"); len(elem) >= l && elem[0:l] == "estimate/" { - elem = elem[l:] - } else { - break - } + return + } - // Param: "master_id" - // Leaf parameter, slashes are prohibited - idx := strings.IndexByte(elem, '/') - if idx >= 0 { - break - } - args[0] = elem - elem = "" + case 't': // Prefix: "transfer/" - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "POST": - s.handleGaslessEstimateRequest([1]string{ - args[0], - }, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "POST", - allowedHeaders: rn31AllowedHeaders, - acceptPost: "application/json", - acceptPatch: "", - }) - } + if l := len("transfer/"); len(elem) >= l && elem[0:l] == "transfer/" { + elem = elem[l:] + } else { + break + } - return - } + // Param: "account_id" + // Match until "/" + idx := strings.IndexByte(elem, '/') + if idx < 0 { + idx = len(elem) + } + args[1] = elem[:idx] + elem = elem[idx:] - case 's': // Prefix: "send" + if len(elem) == 0 { + break + } + switch elem[0] { + case '/': // Prefix: "/payload" - if l := len("send"); len(elem) >= l && elem[0:l] == "send" { - elem = elem[l:] - } else { - break - } + if l := len("/payload"); len(elem) >= l && elem[0:l] == "/payload" { + elem = elem[l:] + } else { + break + } - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "POST": - s.handleGaslessSendRequest([0]string{}, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "POST", - allowedHeaders: rn32AllowedHeaders, - acceptPost: "application/json", - acceptPatch: "", - }) - } + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "GET": + s.handleGetJettonTransferPayloadRequest([2]string{ + args[0], + args[1], + }, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: nil, + acceptPost: "", + acceptPatch: "", + }) + } - return - } + return + } - } + } - case 'j': // Prefix: "jettons" + } - if l := len("jettons"); len(elem) >= l && elem[0:l] == "jettons" { - elem = elem[l:] - } else { - break - } + } - if len(elem) == 0 { - switch r.Method { - case "GET": - s.handleGetJettonsRequest([0]string{}, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "GET", - allowedHeaders: nil, - acceptPost: "", - acceptPatch: "", - }) } - return - } - switch elem[0] { - case '/': // Prefix: "/" + case 'l': // Prefix: "liteserver/" - if l := len("/"); len(elem) >= l && elem[0:l] == "/" { + if l := len("liteserver/"); len(elem) >= l && elem[0:l] == "liteserver/" { elem = elem[l:] } else { break @@ -2064,63 +2356,9 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { break } switch elem[0] { - case '_': // Prefix: "_bulk" - origElem := elem - if l := len("_bulk"); len(elem) >= l && elem[0:l] == "_bulk" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "POST": - s.handleGetJettonInfosByAddressesRequest([0]string{}, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "POST", - allowedHeaders: rn105AllowedHeaders, - acceptPost: "application/json", - acceptPatch: "", - }) - } - - return - } - - elem = origElem - } - // Param: "jetton_id" - // Match until "/" - idx := strings.IndexByte(elem, '/') - if idx < 0 { - idx = len(elem) - } - args[0] = elem[:idx] - elem = elem[idx:] - - if len(elem) == 0 { - switch r.Method { - case "GET": - s.handleGetJettonInfoRequest([1]string{ - args[0], - }, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "GET", - allowedHeaders: nil, - acceptPost: "", - acceptPatch: "", - }) - } - - return - } - switch elem[0] { - case '/': // Prefix: "/" + case 'g': // Prefix: "get_" - if l := len("/"); len(elem) >= l && elem[0:l] == "/" { + if l := len("get_"); len(elem) >= l && elem[0:l] == "get_" { elem = elem[l:] } else { break @@ -2130,42 +2368,41 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { break } switch elem[0] { - case 'a': // Prefix: "accounts/" + case 'a': // Prefix: "a" - if l := len("accounts/"); len(elem) >= l && elem[0:l] == "accounts/" { + if l := len("a"); len(elem) >= l && elem[0:l] == "a" { elem = elem[l:] } else { break } - // Param: "account_id" - // Match until "/" - idx := strings.IndexByte(elem, '/') - if idx < 0 { - idx = len(elem) - } - args[1] = elem[:idx] - elem = elem[idx:] - if len(elem) == 0 { break } switch elem[0] { - case '/': // Prefix: "/history" + case 'c': // Prefix: "ccount_state/" - if l := len("/history"); len(elem) >= l && elem[0:l] == "/history" { + if l := len("ccount_state/"); len(elem) >= l && elem[0:l] == "ccount_state/" { elem = elem[l:] } else { break } + // Param: "account_id" + // Leaf parameter, slashes are prohibited + idx := strings.IndexByte(elem, '/') + if idx >= 0 { + break + } + args[0] = elem + elem = "" + if len(elem) == 0 { // Leaf node. switch r.Method { case "GET": - s.handleGetJettonAccountHistoryByIDRequest([2]string{ + s.handleGetRawAccountStateRequest([1]string{ args[0], - args[1], }, elemIsEscaped, w, r) default: s.notAllowed(w, r, notAllowedParams{ @@ -2179,71 +2416,79 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { return } - } + case 'l': // Prefix: "ll_shards_info/" + + if l := len("ll_shards_info/"); len(elem) >= l && elem[0:l] == "ll_shards_info/" { + elem = elem[l:] + } else { + break + } - case 'h': // Prefix: "holders" + // Param: "block_id" + // Leaf parameter, slashes are prohibited + idx := strings.IndexByte(elem, '/') + if idx >= 0 { + break + } + args[0] = elem + elem = "" - if l := len("holders"); len(elem) >= l && elem[0:l] == "holders" { - elem = elem[l:] - } else { - break - } + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "GET": + s.handleGetAllRawShardsInfoRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: nil, + acceptPost: "", + acceptPatch: "", + }) + } - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "GET": - s.handleGetJettonHoldersRequest([1]string{ - args[0], - }, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "GET", - allowedHeaders: nil, - acceptPost: "", - acceptPatch: "", - }) + return } - return } - case 't': // Prefix: "transfer/" + case 'b': // Prefix: "block" - if l := len("transfer/"); len(elem) >= l && elem[0:l] == "transfer/" { + if l := len("block"); len(elem) >= l && elem[0:l] == "block" { elem = elem[l:] } else { break } - // Param: "account_id" - // Match until "/" - idx := strings.IndexByte(elem, '/') - if idx < 0 { - idx = len(elem) - } - args[1] = elem[:idx] - elem = elem[idx:] - if len(elem) == 0 { break } switch elem[0] { - case '/': // Prefix: "/payload" + case '/': // Prefix: "/" - if l := len("/payload"); len(elem) >= l && elem[0:l] == "/payload" { + if l := len("/"); len(elem) >= l && elem[0:l] == "/" { elem = elem[l:] } else { break } + // Param: "block_id" + // Leaf parameter, slashes are prohibited + idx := strings.IndexByte(elem, '/') + if idx >= 0 { + break + } + args[0] = elem + elem = "" + if len(elem) == 0 { // Leaf node. switch r.Method { case "GET": - s.handleGetJettonTransferPayloadRequest([2]string{ + s.handleGetRawBlockchainBlockRequest([1]string{ args[0], - args[1], }, elemIsEscaped, w, r) default: s.notAllowed(w, r, notAllowedParams{ @@ -2257,59 +2502,92 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { return } - } + case '_': // Prefix: "_" - } + if l := len("_"); len(elem) >= l && elem[0:l] == "_" { + elem = elem[l:] + } else { + break + } - } + if len(elem) == 0 { + break + } + switch elem[0] { + case 'h': // Prefix: "header/" - } + if l := len("header/"); len(elem) >= l && elem[0:l] == "header/" { + elem = elem[l:] + } else { + break + } - case 'l': // Prefix: "liteserver/" + // Param: "block_id" + // Leaf parameter, slashes are prohibited + idx := strings.IndexByte(elem, '/') + if idx >= 0 { + break + } + args[0] = elem + elem = "" - if l := len("liteserver/"); len(elem) >= l && elem[0:l] == "liteserver/" { - elem = elem[l:] - } else { - break - } + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "GET": + s.handleGetRawBlockchainBlockHeaderRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: nil, + acceptPost: "", + acceptPatch: "", + }) + } - if len(elem) == 0 { - break - } - switch elem[0] { - case 'g': // Prefix: "get_" + return + } + + case 'p': // Prefix: "proof" + + if l := len("proof"); len(elem) >= l && elem[0:l] == "proof" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "GET": + s.handleGetRawBlockProofRequest([0]string{}, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: nil, + acceptPost: "", + acceptPatch: "", + }) + } - if l := len("get_"); len(elem) >= l && elem[0:l] == "get_" { - elem = elem[l:] - } else { - break - } + return + } - if len(elem) == 0 { - break - } - switch elem[0] { - case 'a': // Prefix: "a" + } - if l := len("a"); len(elem) >= l && elem[0:l] == "a" { - elem = elem[l:] - } else { - break - } + } - if len(elem) == 0 { - break - } - switch elem[0] { - case 'c': // Prefix: "ccount_state/" + case 'c': // Prefix: "config_all/" - if l := len("ccount_state/"); len(elem) >= l && elem[0:l] == "ccount_state/" { + if l := len("config_all/"); len(elem) >= l && elem[0:l] == "config_all/" { elem = elem[l:] } else { break } - // Param: "account_id" + // Param: "block_id" // Leaf parameter, slashes are prohibited idx := strings.IndexByte(elem, '/') if idx >= 0 { @@ -2322,7 +2600,7 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { // Leaf node. switch r.Method { case "GET": - s.handleGetRawAccountStateRequest([1]string{ + s.handleGetRawConfigRequest([1]string{ args[0], }, elemIsEscaped, w, r) default: @@ -2337,30 +2615,18 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { return } - case 'l': // Prefix: "ll_shards_info/" + case 'm': // Prefix: "masterchain_info" - if l := len("ll_shards_info/"); len(elem) >= l && elem[0:l] == "ll_shards_info/" { + if l := len("masterchain_info"); len(elem) >= l && elem[0:l] == "masterchain_info" { elem = elem[l:] } else { break } - // Param: "block_id" - // Leaf parameter, slashes are prohibited - idx := strings.IndexByte(elem, '/') - if idx >= 0 { - break - } - args[0] = elem - elem = "" - if len(elem) == 0 { - // Leaf node. switch r.Method { case "GET": - s.handleGetAllRawShardsInfoRequest([1]string{ - args[0], - }, elemIsEscaped, w, r) + s.handleGetRawMasterchainInfoRequest([0]string{}, elemIsEscaped, w, r) default: s.notAllowed(w, r, notAllowedParams{ allowedMethods: "GET", @@ -2372,45 +2638,47 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { return } + switch elem[0] { + case '_': // Prefix: "_ext" - } + if l := len("_ext"); len(elem) >= l && elem[0:l] == "_ext" { + elem = elem[l:] + } else { + break + } - case 'b': // Prefix: "block" + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "GET": + s.handleGetRawMasterchainInfoExtRequest([0]string{}, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: nil, + acceptPost: "", + acceptPatch: "", + }) + } - if l := len("block"); len(elem) >= l && elem[0:l] == "block" { - elem = elem[l:] - } else { - break - } + return + } - if len(elem) == 0 { - break - } - switch elem[0] { - case '/': // Prefix: "/" + } - if l := len("/"); len(elem) >= l && elem[0:l] == "/" { + case 'o': // Prefix: "out_msg_queue_sizes" + + if l := len("out_msg_queue_sizes"); len(elem) >= l && elem[0:l] == "out_msg_queue_sizes" { elem = elem[l:] } else { break } - // Param: "block_id" - // Leaf parameter, slashes are prohibited - idx := strings.IndexByte(elem, '/') - if idx >= 0 { - break - } - args[0] = elem - elem = "" - if len(elem) == 0 { // Leaf node. switch r.Method { case "GET": - s.handleGetRawBlockchainBlockRequest([1]string{ - args[0], - }, elemIsEscaped, w, r) + s.handleGetOutMsgQueueSizesRequest([0]string{}, elemIsEscaped, w, r) default: s.notAllowed(w, r, notAllowedParams{ allowedMethods: "GET", @@ -2423,9 +2691,9 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { return } - case '_': // Prefix: "_" + case 's': // Prefix: "s" - if l := len("_"); len(elem) >= l && elem[0:l] == "_" { + if l := len("s"); len(elem) >= l && elem[0:l] == "s" { elem = elem[l:] } else { break @@ -2435,198 +2703,133 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { break } switch elem[0] { - case 'h': // Prefix: "header/" + case 'h': // Prefix: "hard_" - if l := len("header/"); len(elem) >= l && elem[0:l] == "header/" { + if l := len("hard_"); len(elem) >= l && elem[0:l] == "hard_" { elem = elem[l:] } else { break } - // Param: "block_id" - // Leaf parameter, slashes are prohibited - idx := strings.IndexByte(elem, '/') - if idx >= 0 { - break - } - args[0] = elem - elem = "" - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "GET": - s.handleGetRawBlockchainBlockHeaderRequest([1]string{ - args[0], - }, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "GET", - allowedHeaders: nil, - acceptPost: "", - acceptPatch: "", - }) - } - - return - } - - case 'p': // Prefix: "proof" - - if l := len("proof"); len(elem) >= l && elem[0:l] == "proof" { - elem = elem[l:] - } else { break } + switch elem[0] { + case 'b': // Prefix: "block_proof/" - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "GET": - s.handleGetRawBlockProofRequest([0]string{}, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "GET", - allowedHeaders: nil, - acceptPost: "", - acceptPatch: "", - }) + if l := len("block_proof/"); len(elem) >= l && elem[0:l] == "block_proof/" { + elem = elem[l:] + } else { + break } - return - } - - } - - } - - case 'c': // Prefix: "config_all/" + // Param: "block_id" + // Leaf parameter, slashes are prohibited + idx := strings.IndexByte(elem, '/') + if idx >= 0 { + break + } + args[0] = elem + elem = "" - if l := len("config_all/"); len(elem) >= l && elem[0:l] == "config_all/" { - elem = elem[l:] - } else { - break - } + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "GET": + s.handleGetRawShardBlockProofRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: nil, + acceptPost: "", + acceptPatch: "", + }) + } - // Param: "block_id" - // Leaf parameter, slashes are prohibited - idx := strings.IndexByte(elem, '/') - if idx >= 0 { - break - } - args[0] = elem - elem = "" + return + } - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "GET": - s.handleGetRawConfigRequest([1]string{ - args[0], - }, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "GET", - allowedHeaders: nil, - acceptPost: "", - acceptPatch: "", - }) - } + case 'i': // Prefix: "info/" - return - } + if l := len("info/"); len(elem) >= l && elem[0:l] == "info/" { + elem = elem[l:] + } else { + break + } - case 'm': // Prefix: "masterchain_info" + // Param: "block_id" + // Leaf parameter, slashes are prohibited + idx := strings.IndexByte(elem, '/') + if idx >= 0 { + break + } + args[0] = elem + elem = "" - if l := len("masterchain_info"); len(elem) >= l && elem[0:l] == "masterchain_info" { - elem = elem[l:] - } else { - break - } + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "GET": + s.handleGetRawShardInfoRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: nil, + acceptPost: "", + acceptPatch: "", + }) + } - if len(elem) == 0 { - switch r.Method { - case "GET": - s.handleGetRawMasterchainInfoRequest([0]string{}, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "GET", - allowedHeaders: nil, - acceptPost: "", - acceptPatch: "", - }) - } + return + } - return - } - switch elem[0] { - case '_': // Prefix: "_ext" + } - if l := len("_ext"); len(elem) >= l && elem[0:l] == "_ext" { - elem = elem[l:] - } else { - break - } + case 't': // Prefix: "tate/" - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "GET": - s.handleGetRawMasterchainInfoExtRequest([0]string{}, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "GET", - allowedHeaders: nil, - acceptPost: "", - acceptPatch: "", - }) + if l := len("tate/"); len(elem) >= l && elem[0:l] == "tate/" { + elem = elem[l:] + } else { + break } - return - } - - } + // Param: "block_id" + // Leaf parameter, slashes are prohibited + idx := strings.IndexByte(elem, '/') + if idx >= 0 { + break + } + args[0] = elem + elem = "" - case 'o': // Prefix: "out_msg_queue_sizes" + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "GET": + s.handleGetRawBlockchainBlockStateRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: nil, + acceptPost: "", + acceptPatch: "", + }) + } - if l := len("out_msg_queue_sizes"); len(elem) >= l && elem[0:l] == "out_msg_queue_sizes" { - elem = elem[l:] - } else { - break - } + return + } - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "GET": - s.handleGetOutMsgQueueSizesRequest([0]string{}, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "GET", - allowedHeaders: nil, - acceptPost: "", - acceptPatch: "", - }) } - return - } - - case 's': // Prefix: "s" - - if l := len("s"); len(elem) >= l && elem[0:l] == "s" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - break - } - switch elem[0] { - case 'h': // Prefix: "hard_" + case 't': // Prefix: "t" - if l := len("hard_"); len(elem) >= l && elem[0:l] == "hard_" { + if l := len("t"); len(elem) >= l && elem[0:l] == "t" { elem = elem[l:] } else { break @@ -2636,30 +2839,19 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { break } switch elem[0] { - case 'b': // Prefix: "block_proof/" + case 'i': // Prefix: "ime" - if l := len("block_proof/"); len(elem) >= l && elem[0:l] == "block_proof/" { + if l := len("ime"); len(elem) >= l && elem[0:l] == "ime" { elem = elem[l:] } else { break } - // Param: "block_id" - // Leaf parameter, slashes are prohibited - idx := strings.IndexByte(elem, '/') - if idx >= 0 { - break - } - args[0] = elem - elem = "" - if len(elem) == 0 { // Leaf node. switch r.Method { case "GET": - s.handleGetRawShardBlockProofRequest([1]string{ - args[0], - }, elemIsEscaped, w, r) + s.handleGetRawTimeRequest([0]string{}, elemIsEscaped, w, r) default: s.notAllowed(w, r, notAllowedParams{ allowedMethods: "GET", @@ -2672,15 +2864,15 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { return } - case 'i': // Prefix: "info/" + case 'r': // Prefix: "ransactions/" - if l := len("info/"); len(elem) >= l && elem[0:l] == "info/" { + if l := len("ransactions/"); len(elem) >= l && elem[0:l] == "ransactions/" { elem = elem[l:] } else { break } - // Param: "block_id" + // Param: "account_id" // Leaf parameter, slashes are prohibited idx := strings.IndexByte(elem, '/') if idx >= 0 { @@ -2693,7 +2885,7 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { // Leaf node. switch r.Method { case "GET": - s.handleGetRawShardInfoRequest([1]string{ + s.handleGetRawTransactionsRequest([1]string{ args[0], }, elemIsEscaped, w, r) default: @@ -2710,224 +2902,74 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { } - case 't': // Prefix: "tate/" - - if l := len("tate/"); len(elem) >= l && elem[0:l] == "tate/" { - elem = elem[l:] - } else { - break - } - - // Param: "block_id" - // Leaf parameter, slashes are prohibited - idx := strings.IndexByte(elem, '/') - if idx >= 0 { - break - } - args[0] = elem - elem = "" - - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "GET": - s.handleGetRawBlockchainBlockStateRequest([1]string{ - args[0], - }, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "GET", - allowedHeaders: nil, - acceptPost: "", - acceptPatch: "", - }) - } - - return - } - } - case 't': // Prefix: "t" + case 'l': // Prefix: "list_block_transactions/" - if l := len("t"); len(elem) >= l && elem[0:l] == "t" { + if l := len("list_block_transactions/"); len(elem) >= l && elem[0:l] == "list_block_transactions/" { elem = elem[l:] } else { break } - if len(elem) == 0 { + // Param: "block_id" + // Leaf parameter, slashes are prohibited + idx := strings.IndexByte(elem, '/') + if idx >= 0 { break } - switch elem[0] { - case 'i': // Prefix: "ime" - - if l := len("ime"); len(elem) >= l && elem[0:l] == "ime" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "GET": - s.handleGetRawTimeRequest([0]string{}, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "GET", - allowedHeaders: nil, - acceptPost: "", - acceptPatch: "", - }) - } - - return - } - - case 'r': // Prefix: "ransactions/" - - if l := len("ransactions/"); len(elem) >= l && elem[0:l] == "ransactions/" { - elem = elem[l:] - } else { - break - } - - // Param: "account_id" - // Leaf parameter, slashes are prohibited - idx := strings.IndexByte(elem, '/') - if idx >= 0 { - break - } - args[0] = elem - elem = "" - - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "GET": - s.handleGetRawTransactionsRequest([1]string{ - args[0], - }, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "GET", - allowedHeaders: nil, - acceptPost: "", - acceptPatch: "", - }) - } + args[0] = elem + elem = "" - return + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "GET": + s.handleGetRawListBlockTransactionsRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: nil, + acceptPost: "", + acceptPatch: "", + }) } + return } - } - - case 'l': // Prefix: "list_block_transactions/" - - if l := len("list_block_transactions/"); len(elem) >= l && elem[0:l] == "list_block_transactions/" { - elem = elem[l:] - } else { - break - } - - // Param: "block_id" - // Leaf parameter, slashes are prohibited - idx := strings.IndexByte(elem, '/') - if idx >= 0 { - break - } - args[0] = elem - elem = "" - - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "GET": - s.handleGetRawListBlockTransactionsRequest([1]string{ - args[0], - }, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "GET", - allowedHeaders: nil, - acceptPost: "", - acceptPatch: "", - }) - } - - return - } - - case 's': // Prefix: "send_message" - - if l := len("send_message"); len(elem) >= l && elem[0:l] == "send_message" { - elem = elem[l:] - } else { - break - } + case 's': // Prefix: "send_message" - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "POST": - s.handleSendRawMessageRequest([0]string{}, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "POST", - allowedHeaders: rn193AllowedHeaders, - acceptPost: "application/json", - acceptPatch: "", - }) + if l := len("send_message"); len(elem) >= l && elem[0:l] == "send_message" { + elem = elem[l:] + } else { + break } - return - } - - } - - case 'm': // Prefix: "m" - - if l := len("m"); len(elem) >= l && elem[0:l] == "m" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - break - } - switch elem[0] { - case 'e': // Prefix: "essage/decode" - - if l := len("essage/decode"); len(elem) >= l && elem[0:l] == "essage/decode" { - elem = elem[l:] - } else { - break - } + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "POST": + s.handleSendRawMessageRequest([0]string{}, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "POST", + allowedHeaders: rn196AllowedHeaders, + acceptPost: "application/json", + acceptPatch: "", + }) + } - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "POST": - s.handleDecodeMessageRequest([0]string{}, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "POST", - allowedHeaders: rn12AllowedHeaders, - acceptPost: "application/json", - acceptPatch: "", - }) + return } - return } - case 'u': // Prefix: "ultisig/" + case 'm': // Prefix: "m" - if l := len("ultisig/"); len(elem) >= l && elem[0:l] == "ultisig/" { + if l := len("m"); len(elem) >= l && elem[0:l] == "m" { elem = elem[l:] } else { break @@ -2937,14 +2979,81 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { break } switch elem[0] { - case 'o': // Prefix: "order/" - origElem := elem - if l := len("order/"); len(elem) >= l && elem[0:l] == "order/" { + case 'e': // Prefix: "essage/decode" + + if l := len("essage/decode"); len(elem) >= l && elem[0:l] == "essage/decode" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "POST": + s.handleDecodeMessageRequest([0]string{}, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "POST", + allowedHeaders: rn12AllowedHeaders, + acceptPost: "application/json", + acceptPatch: "", + }) + } + + return + } + + case 'u': // Prefix: "ultisig/" + + if l := len("ultisig/"); len(elem) >= l && elem[0:l] == "ultisig/" { elem = elem[l:] } else { break } + if len(elem) == 0 { + break + } + switch elem[0] { + case 'o': // Prefix: "order/" + origElem := elem + if l := len("order/"); len(elem) >= l && elem[0:l] == "order/" { + elem = elem[l:] + } else { + break + } + + // Param: "account_id" + // Leaf parameter, slashes are prohibited + idx := strings.IndexByte(elem, '/') + if idx >= 0 { + break + } + args[0] = elem + elem = "" + + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "GET": + s.handleGetMultisigOrderRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: nil, + acceptPost: "", + acceptPatch: "", + }) + } + + return + } + + elem = origElem + } // Param: "account_id" // Leaf parameter, slashes are prohibited idx := strings.IndexByte(elem, '/') @@ -2958,7 +3067,7 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { // Leaf node. switch r.Method { case "GET": - s.handleGetMultisigOrderRequest([1]string{ + s.handleGetMultisigAccountRequest([1]string{ args[0], }, elemIsEscaped, w, r) default: @@ -2973,154 +3082,58 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { return } - elem = origElem - } - // Param: "account_id" - // Leaf parameter, slashes are prohibited - idx := strings.IndexByte(elem, '/') - if idx >= 0 { - break - } - args[0] = elem - elem = "" - - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "GET": - s.handleGetMultisigAccountRequest([1]string{ - args[0], - }, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "GET", - allowedHeaders: nil, - acceptPost: "", - acceptPatch: "", - }) - } - - return } - } - - case 'n': // Prefix: "nfts/" + case 'n': // Prefix: "nfts/" - if l := len("nfts/"); len(elem) >= l && elem[0:l] == "nfts/" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - break - } - switch elem[0] { - case '_': // Prefix: "_bulk" - origElem := elem - if l := len("_bulk"); len(elem) >= l && elem[0:l] == "_bulk" { + if l := len("nfts/"); len(elem) >= l && elem[0:l] == "nfts/" { elem = elem[l:] } else { break } if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "POST": - s.handleGetNftItemsByAddressesRequest([0]string{}, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "POST", - allowedHeaders: rn125AllowedHeaders, - acceptPost: "application/json", - acceptPatch: "", - }) - } - - return - } - - elem = origElem - case 'c': // Prefix: "collections" - origElem := elem - if l := len("collections"); len(elem) >= l && elem[0:l] == "collections" { - elem = elem[l:] - } else { break } - - if len(elem) == 0 { - switch r.Method { - case "GET": - s.handleGetNftCollectionsRequest([0]string{}, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "GET", - allowedHeaders: nil, - acceptPost: "", - acceptPatch: "", - }) - } - - return - } switch elem[0] { - case '/': // Prefix: "/" - - if l := len("/"); len(elem) >= l && elem[0:l] == "/" { + case '_': // Prefix: "_bulk" + origElem := elem + if l := len("_bulk"); len(elem) >= l && elem[0:l] == "_bulk" { elem = elem[l:] } else { break } if len(elem) == 0 { - break - } - switch elem[0] { - case '_': // Prefix: "_bulk" - origElem := elem - if l := len("_bulk"); len(elem) >= l && elem[0:l] == "_bulk" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "POST": - s.handleGetNftCollectionItemsByAddressesRequest([0]string{}, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "POST", - allowedHeaders: rn120AllowedHeaders, - acceptPost: "application/json", - acceptPatch: "", - }) - } - - return + // Leaf node. + switch r.Method { + case "POST": + s.handleGetNftItemsByAddressesRequest([0]string{}, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "POST", + allowedHeaders: rn127AllowedHeaders, + acceptPost: "application/json", + acceptPatch: "", + }) } - elem = origElem + return } - // Param: "account_id" - // Match until "/" - idx := strings.IndexByte(elem, '/') - if idx < 0 { - idx = len(elem) + + elem = origElem + case 'c': // Prefix: "collections" + origElem := elem + if l := len("collections"); len(elem) >= l && elem[0:l] == "collections" { + elem = elem[l:] + } else { + break } - args[0] = elem[:idx] - elem = elem[idx:] if len(elem) == 0 { switch r.Method { case "GET": - s.handleGetNftCollectionRequest([1]string{ - args[0], - }, elemIsEscaped, w, r) + s.handleGetNftCollectionsRequest([0]string{}, elemIsEscaped, w, r) default: s.notAllowed(w, r, notAllowedParams{ allowedMethods: "GET", @@ -3133,19 +3146,58 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { return } switch elem[0] { - case '/': // Prefix: "/items" + case '/': // Prefix: "/" - if l := len("/items"); len(elem) >= l && elem[0:l] == "/items" { + if l := len("/"); len(elem) >= l && elem[0:l] == "/" { elem = elem[l:] } else { break } if len(elem) == 0 { - // Leaf node. + break + } + switch elem[0] { + case '_': // Prefix: "_bulk" + origElem := elem + if l := len("_bulk"); len(elem) >= l && elem[0:l] == "_bulk" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "POST": + s.handleGetNftCollectionItemsByAddressesRequest([0]string{}, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "POST", + allowedHeaders: rn122AllowedHeaders, + acceptPost: "application/json", + acceptPatch: "", + }) + } + + return + } + + elem = origElem + } + // Param: "account_id" + // Match until "/" + idx := strings.IndexByte(elem, '/') + if idx < 0 { + idx = len(elem) + } + args[0] = elem[:idx] + elem = elem[idx:] + + if len(elem) == 0 { switch r.Method { case "GET": - s.handleGetItemsFromCollectionRequest([1]string{ + s.handleGetNftCollectionRequest([1]string{ args[0], }, elemIsEscaped, w, r) default: @@ -3157,121 +3209,57 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { }) } - return - } - - } - - } - - elem = origElem - } - // Param: "account_id" - // Match until "/" - idx := strings.IndexByte(elem, '/') - if idx < 0 { - idx = len(elem) - } - args[0] = elem[:idx] - elem = elem[idx:] - - if len(elem) == 0 { - switch r.Method { - case "GET": - s.handleGetNftItemByAddressRequest([1]string{ - args[0], - }, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "GET", - allowedHeaders: nil, - acceptPost: "", - acceptPatch: "", - }) - } - - return - } - switch elem[0] { - case '/': // Prefix: "/history" - - if l := len("/history"); len(elem) >= l && elem[0:l] == "/history" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "GET": - s.handleGetNftHistoryByIDRequest([1]string{ - args[0], - }, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "GET", - allowedHeaders: rn124AllowedHeaders, - acceptPost: "", - acceptPatch: "", - }) - } - - return - } - - } + return + } + switch elem[0] { + case '/': // Prefix: "/items" - case 'o': // Prefix: "openapi." + if l := len("/items"); len(elem) >= l && elem[0:l] == "/items" { + elem = elem[l:] + } else { + break + } - if l := len("openapi."); len(elem) >= l && elem[0:l] == "openapi." { - elem = elem[l:] - } else { - break - } + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "GET": + s.handleGetItemsFromCollectionRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: nil, + acceptPost: "", + acceptPatch: "", + }) + } - if len(elem) == 0 { - break - } - switch elem[0] { - case 'j': // Prefix: "json" + return + } - if l := len("json"); len(elem) >= l && elem[0:l] == "json" { - elem = elem[l:] - } else { - break - } + } - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "GET": - s.handleGetOpenapiJsonRequest([0]string{}, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "GET", - allowedHeaders: nil, - acceptPost: "", - acceptPatch: "", - }) } - return + elem = origElem } - - case 'y': // Prefix: "yml" - - if l := len("yml"); len(elem) >= l && elem[0:l] == "yml" { - elem = elem[l:] - } else { - break + // Param: "account_id" + // Match until "/" + idx := strings.IndexByte(elem, '/') + if idx < 0 { + idx = len(elem) } + args[0] = elem[:idx] + elem = elem[idx:] if len(elem) == 0 { - // Leaf node. switch r.Method { case "GET": - s.handleGetOpenapiYmlRequest([0]string{}, elemIsEscaped, w, r) + s.handleGetNftItemByAddressRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) default: s.notAllowed(w, r, notAllowedParams{ allowedMethods: "GET", @@ -3283,36 +3271,10 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { return } - - } - - case 'p': // Prefix: "pu" - - if l := len("pu"); len(elem) >= l && elem[0:l] == "pu" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - break - } - switch elem[0] { - case 'b': // Prefix: "bkeys/" - - if l := len("bkeys/"); len(elem) >= l && elem[0:l] == "bkeys/" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - break - } switch elem[0] { - case 'w': // Prefix: "wallets/_bulk" - origElem := elem - if l := len("wallets/_bulk"); len(elem) >= l && elem[0:l] == "wallets/_bulk" { + case '/': // Prefix: "/history" + + if l := len("/history"); len(elem) >= l && elem[0:l] == "/history" { elem = elem[l:] } else { break @@ -3321,13 +3283,15 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { if len(elem) == 0 { // Leaf node. switch r.Method { - case "POST": - s.handleGetWalletsByPublicKeyBulkRequest([0]string{}, elemIsEscaped, w, r) + case "GET": + s.handleGetNftHistoryByIDRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) default: s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "POST", - allowedHeaders: rn189AllowedHeaders, - acceptPost: "application/json", + allowedMethods: "GET", + allowedHeaders: rn126AllowedHeaders, + acceptPost: "", acceptPatch: "", }) } @@ -3335,24 +3299,23 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { return } - elem = origElem } - // Param: "public_key" - // Match until "/" - idx := strings.IndexByte(elem, '/') - if idx < 0 { - idx = len(elem) + + case 'o': // Prefix: "openapi." + + if l := len("openapi."); len(elem) >= l && elem[0:l] == "openapi." { + elem = elem[l:] + } else { + break } - args[0] = elem[:idx] - elem = elem[idx:] if len(elem) == 0 { break } switch elem[0] { - case '/': // Prefix: "/wallets" + case 'j': // Prefix: "json" - if l := len("/wallets"); len(elem) >= l && elem[0:l] == "/wallets" { + if l := len("json"); len(elem) >= l && elem[0:l] == "json" { elem = elem[l:] } else { break @@ -3362,9 +3325,7 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { // Leaf node. switch r.Method { case "GET": - s.handleGetWalletsByPublicKeyRequest([1]string{ - args[0], - }, elemIsEscaped, w, r) + s.handleGetOpenapiJsonRequest([0]string{}, elemIsEscaped, w, r) default: s.notAllowed(w, r, notAllowedParams{ allowedMethods: "GET", @@ -3377,32 +3338,9 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { return } - } - - case 'r': // Prefix: "rchases/" - - if l := len("rchases/"); len(elem) >= l && elem[0:l] == "rchases/" { - elem = elem[l:] - } else { - break - } - - // Param: "account_id" - // Match until "/" - idx := strings.IndexByte(elem, '/') - if idx < 0 { - idx = len(elem) - } - args[0] = elem[:idx] - elem = elem[idx:] - - if len(elem) == 0 { - break - } - switch elem[0] { - case '/': // Prefix: "/history" + case 'y': // Prefix: "yml" - if l := len("/history"); len(elem) >= l && elem[0:l] == "/history" { + if l := len("yml"); len(elem) >= l && elem[0:l] == "yml" { elem = elem[l:] } else { break @@ -3412,9 +3350,7 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { // Leaf node. switch r.Method { case "GET": - s.handleGetPurchaseHistoryRequest([1]string{ - args[0], - }, elemIsEscaped, w, r) + s.handleGetOpenapiYmlRequest([0]string{}, elemIsEscaped, w, r) default: s.notAllowed(w, r, notAllowedParams{ allowedMethods: "GET", @@ -3429,47 +3365,21 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { } - } - - case 'r': // Prefix: "r" - - if l := len("r"); len(elem) >= l && elem[0:l] == "r" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - break - } - switch elem[0] { - case 'a': // Prefix: "ates" + case 'p': // Prefix: "pu" - if l := len("ates"); len(elem) >= l && elem[0:l] == "ates" { + if l := len("pu"); len(elem) >= l && elem[0:l] == "pu" { elem = elem[l:] } else { break } if len(elem) == 0 { - switch r.Method { - case "GET": - s.handleGetRatesRequest([0]string{}, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "GET", - allowedHeaders: nil, - acceptPost: "", - acceptPatch: "", - }) - } - - return + break } switch elem[0] { - case '/': // Prefix: "/" + case 'b': // Prefix: "bkeys/" - if l := len("/"); len(elem) >= l && elem[0:l] == "/" { + if l := len("bkeys/"); len(elem) >= l && elem[0:l] == "bkeys/" { elem = elem[l:] } else { break @@ -3479,9 +3389,49 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { break } switch elem[0] { - case 'c': // Prefix: "chart" + case 'w': // Prefix: "wallets/_bulk" + origElem := elem + if l := len("wallets/_bulk"); len(elem) >= l && elem[0:l] == "wallets/_bulk" { + elem = elem[l:] + } else { + break + } - if l := len("chart"); len(elem) >= l && elem[0:l] == "chart" { + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "POST": + s.handleGetWalletsByPublicKeyBulkRequest([0]string{}, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "POST", + allowedHeaders: rn190AllowedHeaders, + acceptPost: "application/json", + acceptPatch: "", + }) + } + + return + } + + elem = origElem + } + // Param: "public_key" + // Match until "/" + idx := strings.IndexByte(elem, '/') + if idx < 0 { + idx = len(elem) + } + args[0] = elem[:idx] + elem = elem[idx:] + + if len(elem) == 0 { + break + } + switch elem[0] { + case '/': // Prefix: "/wallets" + + if l := len("/wallets"); len(elem) >= l && elem[0:l] == "/wallets" { elem = elem[l:] } else { break @@ -3491,7 +3441,9 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { // Leaf node. switch r.Method { case "GET": - s.handleGetChartRatesRequest([0]string{}, elemIsEscaped, w, r) + s.handleGetWalletsByPublicKeyRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) default: s.notAllowed(w, r, notAllowedParams{ allowedMethods: "GET", @@ -3504,9 +3456,32 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { return } - case 'm': // Prefix: "markets" + } - if l := len("markets"); len(elem) >= l && elem[0:l] == "markets" { + case 'r': // Prefix: "rchases/" + + if l := len("rchases/"); len(elem) >= l && elem[0:l] == "rchases/" { + elem = elem[l:] + } else { + break + } + + // Param: "account_id" + // Match until "/" + idx := strings.IndexByte(elem, '/') + if idx < 0 { + idx = len(elem) + } + args[0] = elem[:idx] + elem = elem[idx:] + + if len(elem) == 0 { + break + } + switch elem[0] { + case '/': // Prefix: "/history" + + if l := len("/history"); len(elem) >= l && elem[0:l] == "/history" { elem = elem[l:] } else { break @@ -3516,7 +3491,9 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { // Leaf node. switch r.Method { case "GET": - s.handleGetMarketsRatesRequest([0]string{}, elemIsEscaped, w, r) + s.handleGetPurchaseHistoryRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) default: s.notAllowed(w, r, notAllowedParams{ allowedMethods: "GET", @@ -3533,46 +3510,33 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { } - case 'e': // Prefix: "ewards/" + case 'r': // Prefix: "rates" - if l := len("ewards/"); len(elem) >= l && elem[0:l] == "ewards/" { + if l := len("rates"); len(elem) >= l && elem[0:l] == "rates" { elem = elem[l:] } else { break } if len(elem) == 0 { - break - } - switch elem[0] { - case 'r': // Prefix: "round-rewards" - - if l := len("round-rewards"); len(elem) >= l && elem[0:l] == "round-rewards" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "GET": - s.handleGetRoundRewardsRequest([0]string{}, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "GET", - allowedHeaders: nil, - acceptPost: "", - acceptPatch: "", - }) - } - - return + switch r.Method { + case "GET": + s.handleGetRatesRequest([0]string{}, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: nil, + acceptPost: "", + acceptPatch: "", + }) } - case 'v': // Prefix: "validat" + return + } + switch elem[0] { + case '/': // Prefix: "/" - if l := len("validat"); len(elem) >= l && elem[0:l] == "validat" { + if l := len("/"); len(elem) >= l && elem[0:l] == "/" { elem = elem[l:] } else { break @@ -3582,9 +3546,9 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { break } switch elem[0] { - case 'i': // Prefix: "ion-rounds" + case 'c': // Prefix: "chart" - if l := len("ion-rounds"); len(elem) >= l && elem[0:l] == "ion-rounds" { + if l := len("chart"); len(elem) >= l && elem[0:l] == "chart" { elem = elem[l:] } else { break @@ -3594,7 +3558,7 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { // Leaf node. switch r.Method { case "GET": - s.handleGetValidationRoundsRequest([0]string{}, elemIsEscaped, w, r) + s.handleGetChartRatesRequest([0]string{}, elemIsEscaped, w, r) default: s.notAllowed(w, r, notAllowedParams{ allowedMethods: "GET", @@ -3607,9 +3571,9 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { return } - case 'o': // Prefix: "ors" + case 'm': // Prefix: "markets" - if l := len("ors"); len(elem) >= l && elem[0:l] == "ors" { + if l := len("markets"); len(elem) >= l && elem[0:l] == "markets" { elem = elem[l:] } else { break @@ -3619,7 +3583,7 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { // Leaf node. switch r.Method { case "GET": - s.handleGetValidatorsRequest([0]string{}, elemIsEscaped, w, r) + s.handleGetMarketsRatesRequest([0]string{}, elemIsEscaped, w, r) default: s.notAllowed(w, r, notAllowedParams{ allowedMethods: "GET", @@ -3636,23 +3600,9 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { } - } - - case 's': // Prefix: "st" - - if l := len("st"); len(elem) >= l && elem[0:l] == "st" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - break - } - switch elem[0] { - case 'a': // Prefix: "a" + case 's': // Prefix: "st" - if l := len("a"); len(elem) >= l && elem[0:l] == "a" { + if l := len("st"); len(elem) >= l && elem[0:l] == "st" { elem = elem[l:] } else { break @@ -3662,9 +3612,9 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { break } switch elem[0] { - case 'k': // Prefix: "king/" + case 'a': // Prefix: "a" - if l := len("king/"); len(elem) >= l && elem[0:l] == "king/" { + if l := len("a"); len(elem) >= l && elem[0:l] == "a" { elem = elem[l:] } else { break @@ -3674,174 +3624,358 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { break } switch elem[0] { - case 'n': // Prefix: "nominator/" + case 'k': // Prefix: "king/" - if l := len("nominator/"); len(elem) >= l && elem[0:l] == "nominator/" { + if l := len("king/"); len(elem) >= l && elem[0:l] == "king/" { elem = elem[l:] } else { break } - // Param: "account_id" - // Match until "/" - idx := strings.IndexByte(elem, '/') - if idx < 0 { - idx = len(elem) - } - args[0] = elem[:idx] - elem = elem[idx:] - if len(elem) == 0 { break } switch elem[0] { - case '/': // Prefix: "/pools" + case 'n': // Prefix: "nominator/" - if l := len("/pools"); len(elem) >= l && elem[0:l] == "/pools" { + if l := len("nominator/"); len(elem) >= l && elem[0:l] == "nominator/" { elem = elem[l:] } else { break } - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "GET": - s.handleGetAccountNominatorsPoolsRequest([1]string{ - args[0], - }, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "GET", - allowedHeaders: nil, - acceptPost: "", - acceptPatch: "", - }) - } + // Param: "account_id" + // Match until "/" + idx := strings.IndexByte(elem, '/') + if idx < 0 { + idx = len(elem) + } + args[0] = elem[:idx] + elem = elem[idx:] - return + if len(elem) == 0 { + break } + switch elem[0] { + case '/': // Prefix: "/pools" - } + if l := len("/pools"); len(elem) >= l && elem[0:l] == "/pools" { + elem = elem[l:] + } else { + break + } - case 'p': // Prefix: "pool" + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "GET": + s.handleGetAccountNominatorsPoolsRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: nil, + acceptPost: "", + acceptPatch: "", + }) + } - if l := len("pool"); len(elem) >= l && elem[0:l] == "pool" { - elem = elem[l:] - } else { - break - } + return + } - if len(elem) == 0 { - break - } - switch elem[0] { - case '/': // Prefix: "/" + } - if l := len("/"); len(elem) >= l && elem[0:l] == "/" { + case 'p': // Prefix: "pool" + + if l := len("pool"); len(elem) >= l && elem[0:l] == "pool" { elem = elem[l:] } else { break } - // Param: "account_id" - // Match until "/" - idx := strings.IndexByte(elem, '/') - if idx < 0 { - idx = len(elem) - } - args[0] = elem[:idx] - elem = elem[idx:] - if len(elem) == 0 { - switch r.Method { - case "GET": - s.handleGetStakingPoolInfoRequest([1]string{ - args[0], - }, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "GET", - allowedHeaders: rn171AllowedHeaders, - acceptPost: "", - acceptPatch: "", - }) - } - - return + break } switch elem[0] { - case '/': // Prefix: "/history" + case '/': // Prefix: "/" - if l := len("/history"); len(elem) >= l && elem[0:l] == "/history" { + if l := len("/"); len(elem) >= l && elem[0:l] == "/" { elem = elem[l:] } else { break } + // Param: "account_id" + // Match until "/" + idx := strings.IndexByte(elem, '/') + if idx < 0 { + idx = len(elem) + } + args[0] = elem[:idx] + elem = elem[idx:] + if len(elem) == 0 { - // Leaf node. switch r.Method { case "GET": - s.handleGetStakingPoolHistoryRequest([1]string{ + s.handleGetStakingPoolInfoRequest([1]string{ args[0], }, elemIsEscaped, w, r) default: s.notAllowed(w, r, notAllowedParams{ allowedMethods: "GET", - allowedHeaders: nil, + allowedHeaders: rn172AllowedHeaders, + acceptPost: "", + acceptPatch: "", + }) + } + + return + } + switch elem[0] { + case '/': // Prefix: "/history" + + if l := len("/history"); len(elem) >= l && elem[0:l] == "/history" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "GET": + s.handleGetStakingPoolHistoryRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: nil, + acceptPost: "", + acceptPatch: "", + }) + } + + return + } + + } + + case 's': // Prefix: "s" + + if l := len("s"); len(elem) >= l && elem[0:l] == "s" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "GET": + s.handleGetStakingPoolsRequest([0]string{}, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: rn175AllowedHeaders, acceptPost: "", acceptPatch: "", }) } - return - } + return + } + + } + + } + + case 't': // Prefix: "tus" + + if l := len("tus"); len(elem) >= l && elem[0:l] == "tus" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "GET": + s.handleStatusRequest([0]string{}, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: nil, + acceptPost: "", + acceptPatch: "", + }) + } + + return + } + + } + + case 'o': // Prefix: "orage/providers" + + if l := len("orage/providers"); len(elem) >= l && elem[0:l] == "orage/providers" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "GET": + s.handleGetStorageProvidersRequest([0]string{}, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: nil, + acceptPost: "", + acceptPatch: "", + }) + } + + return + } + + } + + case 't': // Prefix: "t" + + if l := len("t"); len(elem) >= l && elem[0:l] == "t" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + break + } + switch elem[0] { + case 'o': // Prefix: "onconnect/" + + if l := len("onconnect/"); len(elem) >= l && elem[0:l] == "onconnect/" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + break + } + switch elem[0] { + case 'p': // Prefix: "payload" + + if l := len("payload"); len(elem) >= l && elem[0:l] == "payload" { + elem = elem[l:] + } else { + break + } + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "GET": + s.handleGetTonConnectPayloadRequest([0]string{}, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: nil, + acceptPost: "", + acceptPatch: "", + }) } - case 's': // Prefix: "s" + return + } - if l := len("s"); len(elem) >= l && elem[0:l] == "s" { - elem = elem[l:] - } else { - break - } + case 's': // Prefix: "stateinit" - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "GET": - s.handleGetStakingPoolsRequest([0]string{}, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "GET", - allowedHeaders: rn174AllowedHeaders, - acceptPost: "", - acceptPatch: "", - }) - } + if l := len("stateinit"); len(elem) >= l && elem[0:l] == "stateinit" { + elem = elem[l:] + } else { + break + } - return + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "POST": + s.handleGetAccountInfoByStateInitRequest([0]string{}, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "POST", + allowedHeaders: rn45AllowedHeaders, + acceptPost: "application/json", + acceptPatch: "", + }) } + return } } - case 't': // Prefix: "tus" + case 'r': // Prefix: "races/" - if l := len("tus"); len(elem) >= l && elem[0:l] == "tus" { + if l := len("races/"); len(elem) >= l && elem[0:l] == "races/" { elem = elem[l:] } else { break } + if len(elem) == 0 { + break + } + switch elem[0] { + case 'e': // Prefix: "emulate" + origElem := elem + if l := len("emulate"); len(elem) >= l && elem[0:l] == "emulate" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "POST": + s.handleEmulateMessageToTraceRequest([0]string{}, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "POST", + allowedHeaders: rn23AllowedHeaders, + acceptPost: "application/json", + acceptPatch: "", + }) + } + + return + } + + elem = origElem + } + // Param: "trace_id" + // Leaf parameter, slashes are prohibited + idx := strings.IndexByte(elem, '/') + if idx >= 0 { + break + } + args[0] = elem + elem = "" + if len(elem) == 0 { // Leaf node. switch r.Method { case "GET": - s.handleStatusRequest([0]string{}, elemIsEscaped, w, r) + s.handleGetTraceRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) default: s.notAllowed(w, r, notAllowedParams{ allowedMethods: "GET", @@ -3856,48 +3990,9 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { } - case 'o': // Prefix: "orage/providers" - - if l := len("orage/providers"); len(elem) >= l && elem[0:l] == "orage/providers" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "GET": - s.handleGetStorageProvidersRequest([0]string{}, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "GET", - allowedHeaders: nil, - acceptPost: "", - acceptPatch: "", - }) - } - - return - } - - } - - case 't': // Prefix: "t" - - if l := len("t"); len(elem) >= l && elem[0:l] == "t" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - break - } - switch elem[0] { - case 'o': // Prefix: "onconnect/" + case 'v': // Prefix: "validation/" - if l := len("onconnect/"); len(elem) >= l && elem[0:l] == "onconnect/" { + if l := len("validation/"); len(elem) >= l && elem[0:l] == "validation/" { elem = elem[l:] } else { break @@ -3907,34 +4002,73 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { break } switch elem[0] { - case 'p': // Prefix: "payload" + case 'r': // Prefix: "r" - if l := len("payload"); len(elem) >= l && elem[0:l] == "payload" { + if l := len("r"); len(elem) >= l && elem[0:l] == "r" { elem = elem[l:] } else { break } if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "GET": - s.handleGetTonConnectPayloadRequest([0]string{}, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "GET", - allowedHeaders: nil, - acceptPost: "", - acceptPatch: "", - }) + break + } + switch elem[0] { + case 'e': // Prefix: "ewards" + + if l := len("ewards"); len(elem) >= l && elem[0:l] == "ewards" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "GET": + s.handleGetRoundRewardsRequest([0]string{}, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: nil, + acceptPost: "", + acceptPatch: "", + }) + } + + return + } + + case 'o': // Prefix: "ounds" + + if l := len("ounds"); len(elem) >= l && elem[0:l] == "ounds" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "GET": + s.handleGetValidationRoundsRequest([0]string{}, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: nil, + acceptPost: "", + acceptPatch: "", + }) + } + + return } - return } - case 's': // Prefix: "stateinit" + case 'v': // Prefix: "validators" - if l := len("stateinit"); len(elem) >= l && elem[0:l] == "stateinit" { + if l := len("validators"); len(elem) >= l && elem[0:l] == "validators" { elem = elem[l:] } else { break @@ -3943,13 +4077,13 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { if len(elem) == 0 { // Leaf node. switch r.Method { - case "POST": - s.handleGetAccountInfoByStateInitRequest([0]string{}, elemIsEscaped, w, r) + case "GET": + s.handleGetValidatorsRequest([0]string{}, elemIsEscaped, w, r) default: s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "POST", - allowedHeaders: rn45AllowedHeaders, - acceptPost: "application/json", + allowedMethods: "GET", + allowedHeaders: nil, + acceptPost: "", acceptPatch: "", }) } @@ -3959,9 +4093,9 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { } - case 'r': // Prefix: "races/" + case 'w': // Prefix: "wallet/" - if l := len("races/"); len(elem) >= l && elem[0:l] == "races/" { + if l := len("wallet/"); len(elem) >= l && elem[0:l] == "wallet/" { elem = elem[l:] } else { break @@ -3971,9 +4105,9 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { break } switch elem[0] { - case 'e': // Prefix: "emulate" + case 'a': // Prefix: "auth/proof" origElem := elem - if l := len("emulate"); len(elem) >= l && elem[0:l] == "emulate" { + if l := len("auth/proof"); len(elem) >= l && elem[0:l] == "auth/proof" { elem = elem[l:] } else { break @@ -3983,156 +4117,60 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { // Leaf node. switch r.Method { case "POST": - s.handleEmulateMessageToTraceRequest([0]string{}, elemIsEscaped, w, r) + s.handleTonConnectProofRequest([0]string{}, elemIsEscaped, w, r) default: s.notAllowed(w, r, notAllowedParams{ allowedMethods: "POST", - allowedHeaders: rn23AllowedHeaders, + allowedHeaders: rn199AllowedHeaders, acceptPost: "application/json", acceptPatch: "", }) - } - - return - } - - elem = origElem - } - // Param: "trace_id" - // Leaf parameter, slashes are prohibited - idx := strings.IndexByte(elem, '/') - if idx >= 0 { - break - } - args[0] = elem - elem = "" - - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "GET": - s.handleGetTraceRequest([1]string{ - args[0], - }, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "GET", - allowedHeaders: nil, - acceptPost: "", - acceptPatch: "", - }) - } - - return - } - - } - - case 'w': // Prefix: "wallet/" - - if l := len("wallet/"); len(elem) >= l && elem[0:l] == "wallet/" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - break - } - switch elem[0] { - case 'a': // Prefix: "auth/proof" - origElem := elem - if l := len("auth/proof"); len(elem) >= l && elem[0:l] == "auth/proof" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "POST": - s.handleTonConnectProofRequest([0]string{}, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "POST", - allowedHeaders: rn196AllowedHeaders, - acceptPost: "application/json", - acceptPatch: "", - }) - } - - return - } - - elem = origElem - case 'e': // Prefix: "emulate" - origElem := elem - if l := len("emulate"); len(elem) >= l && elem[0:l] == "emulate" { - elem = elem[l:] - } else { - break - } + } - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "POST": - s.handleEmulateMessageToWalletRequest([0]string{}, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "POST", - allowedHeaders: rn24AllowedHeaders, - acceptPost: "application/json", - acceptPatch: "", - }) + return } - return - } - - elem = origElem - } - // Param: "account_id" - // Match until "/" - idx := strings.IndexByte(elem, '/') - if idx < 0 { - idx = len(elem) - } - args[0] = elem[:idx] - elem = elem[idx:] + elem = origElem + case 'e': // Prefix: "emulate" + origElem := elem + if l := len("emulate"); len(elem) >= l && elem[0:l] == "emulate" { + elem = elem[l:] + } else { + break + } - if len(elem) == 0 { - switch r.Method { - case "GET": - s.handleGetWalletInfoRequest([1]string{ - args[0], - }, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "GET", - allowedHeaders: nil, - acceptPost: "", - acceptPatch: "", - }) - } + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "POST": + s.handleEmulateMessageToWalletRequest([0]string{}, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "POST", + allowedHeaders: rn24AllowedHeaders, + acceptPost: "application/json", + acceptPatch: "", + }) + } - return - } - switch elem[0] { - case '/': // Prefix: "/seqno" + return + } - if l := len("/seqno"); len(elem) >= l && elem[0:l] == "/seqno" { - elem = elem[l:] - } else { - break + elem = origElem + } + // Param: "account_id" + // Match until "/" + idx := strings.IndexByte(elem, '/') + if idx < 0 { + idx = len(elem) } + args[0] = elem[:idx] + elem = elem[idx:] if len(elem) == 0 { - // Leaf node. switch r.Method { case "GET": - s.handleGetAccountSeqnoRequest([1]string{ + s.handleGetWalletInfoRequest([1]string{ args[0], }, elemIsEscaped, w, r) default: @@ -4146,6 +4184,35 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { return } + switch elem[0] { + case '/': // Prefix: "/seqno" + + if l := len("/seqno"); len(elem) >= l && elem[0:l] == "/seqno" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "GET": + s.handleGetAccountSeqnoRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: nil, + acceptPost: "", + acceptPatch: "", + }) + } + + return + } + + } } @@ -4237,9 +4304,9 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { break } switch elem[0] { - case '/': // Prefix: "/v2/" + case '/': // Prefix: "/" - if l := len("/v2/"); len(elem) >= l && elem[0:l] == "/v2/" { + if l := len("/"); len(elem) >= l && elem[0:l] == "/" { elem = elem[l:] } else { break @@ -4249,9 +4316,9 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { break } switch elem[0] { - case 'a': // Prefix: "a" + case 'c': // Prefix: "cocoon/" - if l := len("a"); len(elem) >= l && elem[0:l] == "a" { + if l := len("cocoon/"); len(elem) >= l && elem[0:l] == "cocoon/" { elem = elem[l:] } else { break @@ -4261,99 +4328,85 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { break } switch elem[0] { - case 'c': // Prefix: "ccounts/" + case 'q': // Prefix: "query" - if l := len("ccounts/"); len(elem) >= l && elem[0:l] == "ccounts/" { + if l := len("query"); len(elem) >= l && elem[0:l] == "query" { elem = elem[l:] } else { break } if len(elem) == 0 { - break - } - switch elem[0] { - case '_': // Prefix: "_bulk" - origElem := elem - if l := len("_bulk"); len(elem) >= l && elem[0:l] == "_bulk" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - // Leaf node. - switch method { - case "POST": - r.name = GetAccountsOperation - r.summary = "" - r.operationID = "getAccounts" - r.operationGroup = "" - r.pathPattern = "/v2/accounts/_bulk" - r.args = args - r.count = 0 - return r, true - default: - return - } - } - - elem = origElem - case 's': // Prefix: "search" - origElem := elem - if l := len("search"); len(elem) >= l && elem[0:l] == "search" { - elem = elem[l:] - } else { - break + // Leaf node. + switch method { + case "POST": + r.name = PostCocoonQueryOperation + r.summary = "" + r.operationID = "postCocoonQuery" + r.operationGroup = "" + r.pathPattern = "/cocoon/query" + r.args = args + r.count = 0 + return r, true + default: + return } + } - if len(elem) == 0 { - // Leaf node. - switch method { - case "GET": - r.name = SearchAccountsOperation - r.summary = "" - r.operationID = "searchAccounts" - r.operationGroup = "" - r.pathPattern = "/v2/accounts/search" - r.args = args - r.count = 0 - return r, true - default: - return - } - } + case 'w': // Prefix: "workers" - elem = origElem - } - // Param: "account_id" - // Match until "/" - idx := strings.IndexByte(elem, '/') - if idx < 0 { - idx = len(elem) + if l := len("workers"); len(elem) >= l && elem[0:l] == "workers" { + elem = elem[l:] + } else { + break } - args[0] = elem[:idx] - elem = elem[idx:] if len(elem) == 0 { + // Leaf node. switch method { case "GET": - r.name = GetAccountOperation + r.name = GetCocoonWorkersOperation r.summary = "" - r.operationID = "getAccount" + r.operationID = "getCocoonWorkers" r.operationGroup = "" - r.pathPattern = "/v2/accounts/{account_id}" + r.pathPattern = "/cocoon/workers" r.args = args - r.count = 1 + r.count = 0 return r, true default: return } } + + } + + case 'v': // Prefix: "v2/" + + if l := len("v2/"); len(elem) >= l && elem[0:l] == "v2/" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + break + } + switch elem[0] { + case 'a': // Prefix: "a" + + if l := len("a"); len(elem) >= l && elem[0:l] == "a" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + break + } switch elem[0] { - case '/': // Prefix: "/" + case 'c': // Prefix: "ccounts/" - if l := len("/"); len(elem) >= l && elem[0:l] == "/" { + if l := len("ccounts/"); len(elem) >= l && elem[0:l] == "ccounts/" { elem = elem[l:] } else { break @@ -4363,46 +4416,99 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { break } switch elem[0] { - case 'd': // Prefix: "d" - - if l := len("d"); len(elem) >= l && elem[0:l] == "d" { + case '_': // Prefix: "_bulk" + origElem := elem + if l := len("_bulk"); len(elem) >= l && elem[0:l] == "_bulk" { elem = elem[l:] } else { break } if len(elem) == 0 { + // Leaf node. + switch method { + case "POST": + r.name = GetAccountsOperation + r.summary = "" + r.operationID = "getAccounts" + r.operationGroup = "" + r.pathPattern = "/v2/accounts/_bulk" + r.args = args + r.count = 0 + return r, true + default: + return + } + } + + elem = origElem + case 's': // Prefix: "search" + origElem := elem + if l := len("search"); len(elem) >= l && elem[0:l] == "search" { + elem = elem[l:] + } else { break } - switch elem[0] { - case 'i': // Prefix: "iff" - if l := len("iff"); len(elem) >= l && elem[0:l] == "iff" { - elem = elem[l:] - } else { - break + if len(elem) == 0 { + // Leaf node. + switch method { + case "GET": + r.name = SearchAccountsOperation + r.summary = "" + r.operationID = "searchAccounts" + r.operationGroup = "" + r.pathPattern = "/v2/accounts/search" + r.args = args + r.count = 0 + return r, true + default: + return } + } - if len(elem) == 0 { - // Leaf node. - switch method { - case "GET": - r.name = GetAccountDiffOperation - r.summary = "" - r.operationID = "getAccountDiff" - r.operationGroup = "" - r.pathPattern = "/v2/accounts/{account_id}/diff" - r.args = args - r.count = 1 - return r, true - default: - return - } - } + elem = origElem + } + // Param: "account_id" + // Match until "/" + idx := strings.IndexByte(elem, '/') + if idx < 0 { + idx = len(elem) + } + args[0] = elem[:idx] + elem = elem[idx:] + + if len(elem) == 0 { + switch method { + case "GET": + r.name = GetAccountOperation + r.summary = "" + r.operationID = "getAccount" + r.operationGroup = "" + r.pathPattern = "/v2/accounts/{account_id}" + r.args = args + r.count = 1 + return r, true + default: + return + } + } + switch elem[0] { + case '/': // Prefix: "/" + + if l := len("/"); len(elem) >= l && elem[0:l] == "/" { + elem = elem[l:] + } else { + break + } - case 'n': // Prefix: "ns/" + if len(elem) == 0 { + break + } + switch elem[0] { + case 'd': // Prefix: "d" - if l := len("ns/"); len(elem) >= l && elem[0:l] == "ns/" { + if l := len("d"); len(elem) >= l && elem[0:l] == "d" { elem = elem[l:] } else { break @@ -4412,9 +4518,9 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { break } switch elem[0] { - case 'b': // Prefix: "backresolve" + case 'i': // Prefix: "iff" - if l := len("backresolve"); len(elem) >= l && elem[0:l] == "backresolve" { + if l := len("iff"); len(elem) >= l && elem[0:l] == "iff" { elem = elem[l:] } else { break @@ -4424,11 +4530,11 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { // Leaf node. switch method { case "GET": - r.name = AccountDnsBackResolveOperation + r.name = GetAccountDiffOperation r.summary = "" - r.operationID = "accountDnsBackResolve" + r.operationID = "getAccountDiff" r.operationGroup = "" - r.pathPattern = "/v2/accounts/{account_id}/dns/backresolve" + r.pathPattern = "/v2/accounts/{account_id}/diff" r.args = args r.count = 1 return r, true @@ -4437,23 +4543,100 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { } } - case 'e': // Prefix: "expiring" + case 'n': // Prefix: "ns/" - if l := len("expiring"); len(elem) >= l && elem[0:l] == "expiring" { + if l := len("ns/"); len(elem) >= l && elem[0:l] == "ns/" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + break + } + switch elem[0] { + case 'b': // Prefix: "backresolve" + + if l := len("backresolve"); len(elem) >= l && elem[0:l] == "backresolve" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch method { + case "GET": + r.name = AccountDnsBackResolveOperation + r.summary = "" + r.operationID = "accountDnsBackResolve" + r.operationGroup = "" + r.pathPattern = "/v2/accounts/{account_id}/dns/backresolve" + r.args = args + r.count = 1 + return r, true + default: + return + } + } + + case 'e': // Prefix: "expiring" + + if l := len("expiring"); len(elem) >= l && elem[0:l] == "expiring" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch method { + case "GET": + r.name = GetAccountDnsExpiringOperation + r.summary = "" + r.operationID = "getAccountDnsExpiring" + r.operationGroup = "" + r.pathPattern = "/v2/accounts/{account_id}/dns/expiring" + r.args = args + r.count = 1 + return r, true + default: + return + } + } + + } + + } + + case 'e': // Prefix: "e" + + if l := len("e"); len(elem) >= l && elem[0:l] == "e" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + break + } + switch elem[0] { + case 'v': // Prefix: "vents" + + if l := len("vents"); len(elem) >= l && elem[0:l] == "vents" { elem = elem[l:] } else { break } if len(elem) == 0 { - // Leaf node. switch method { case "GET": - r.name = GetAccountDnsExpiringOperation + r.name = GetAccountEventsOperation r.summary = "" - r.operationID = "getAccountDnsExpiring" + r.operationID = "getAccountEvents" r.operationGroup = "" - r.pathPattern = "/v2/accounts/{account_id}/dns/expiring" + r.pathPattern = "/v2/accounts/{account_id}/events" r.args = args r.count = 1 return r, true @@ -4461,26 +4644,127 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { return } } + switch elem[0] { + case '/': // Prefix: "/" - } + if l := len("/"); len(elem) >= l && elem[0:l] == "/" { + elem = elem[l:] + } else { + break + } - } + if len(elem) == 0 { + break + } + switch elem[0] { + case 'e': // Prefix: "emulate" + origElem := elem + if l := len("emulate"); len(elem) >= l && elem[0:l] == "emulate" { + elem = elem[l:] + } else { + break + } - case 'e': // Prefix: "e" + if len(elem) == 0 { + // Leaf node. + switch method { + case "POST": + r.name = EmulateMessageToAccountEventOperation + r.summary = "" + r.operationID = "emulateMessageToAccountEvent" + r.operationGroup = "" + r.pathPattern = "/v2/accounts/{account_id}/events/emulate" + r.args = args + r.count = 1 + return r, true + default: + return + } + } - if l := len("e"); len(elem) >= l && elem[0:l] == "e" { - elem = elem[l:] - } else { - break - } + elem = origElem + } + // Param: "event_id" + // Leaf parameter, slashes are prohibited + idx := strings.IndexByte(elem, '/') + if idx >= 0 { + break + } + args[1] = elem + elem = "" - if len(elem) == 0 { - break - } - switch elem[0] { - case 'v': // Prefix: "vents" + if len(elem) == 0 { + // Leaf node. + switch method { + case "GET": + r.name = GetAccountEventOperation + r.summary = "" + r.operationID = "getAccountEvent" + r.operationGroup = "" + r.pathPattern = "/v2/accounts/{account_id}/events/{event_id}" + r.args = args + r.count = 2 + return r, true + default: + return + } + } + + } + + case 'x': // Prefix: "xtra-currency/" + + if l := len("xtra-currency/"); len(elem) >= l && elem[0:l] == "xtra-currency/" { + elem = elem[l:] + } else { + break + } + + // Param: "id" + // Match until "/" + idx := strings.IndexByte(elem, '/') + if idx < 0 { + idx = len(elem) + } + args[1] = elem[:idx] + elem = elem[idx:] + + if len(elem) == 0 { + break + } + switch elem[0] { + case '/': // Prefix: "/history" + + if l := len("/history"); len(elem) >= l && elem[0:l] == "/history" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch method { + case "GET": + r.name = GetAccountExtraCurrencyHistoryByIDOperation + r.summary = "" + r.operationID = "getAccountExtraCurrencyHistoryByID" + r.operationGroup = "" + r.pathPattern = "/v2/accounts/{account_id}/extra-currency/{id}/history" + r.args = args + r.count = 2 + return r, true + default: + return + } + } + + } + + } + + case 'j': // Prefix: "jettons" - if l := len("vents"); len(elem) >= l && elem[0:l] == "vents" { + if l := len("jettons"); len(elem) >= l && elem[0:l] == "jettons" { elem = elem[l:] } else { break @@ -4489,11 +4773,11 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { if len(elem) == 0 { switch method { case "GET": - r.name = GetAccountEventsOperation + r.name = GetAccountJettonsBalancesOperation r.summary = "" - r.operationID = "getAccountEvents" + r.operationID = "getAccountJettonsBalances" r.operationGroup = "" - r.pathPattern = "/v2/accounts/{account_id}/events" + r.pathPattern = "/v2/accounts/{account_id}/jettons" r.args = args r.count = 1 return r, true @@ -4514,9 +4798,9 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { break } switch elem[0] { - case 'e': // Prefix: "emulate" + case 'h': // Prefix: "history" origElem := elem - if l := len("emulate"); len(elem) >= l && elem[0:l] == "emulate" { + if l := len("history"); len(elem) >= l && elem[0:l] == "history" { elem = elem[l:] } else { break @@ -4525,12 +4809,12 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { if len(elem) == 0 { // Leaf node. switch method { - case "POST": - r.name = EmulateMessageToAccountEventOperation + case "GET": + r.name = GetAccountJettonsHistoryOperation r.summary = "" - r.operationID = "emulateMessageToAccountEvent" + r.operationID = "getAccountJettonsHistory" r.operationGroup = "" - r.pathPattern = "/v2/accounts/{account_id}/events/emulate" + r.pathPattern = "/v2/accounts/{account_id}/jettons/history" r.args = args r.count = 1 return r, true @@ -4541,24 +4825,23 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { elem = origElem } - // Param: "event_id" - // Leaf parameter, slashes are prohibited + // Param: "jetton_id" + // Match until "/" idx := strings.IndexByte(elem, '/') - if idx >= 0 { - break + if idx < 0 { + idx = len(elem) } - args[1] = elem - elem = "" + args[1] = elem[:idx] + elem = elem[idx:] if len(elem) == 0 { - // Leaf node. switch method { case "GET": - r.name = GetAccountEventOperation + r.name = GetAccountJettonBalanceOperation r.summary = "" - r.operationID = "getAccountEvent" + r.operationID = "getAccountJettonBalance" r.operationGroup = "" - r.pathPattern = "/v2/accounts/{account_id}/events/{event_id}" + r.pathPattern = "/v2/accounts/{account_id}/jettons/{jetton_id}" r.args = args r.count = 2 return r, true @@ -4566,141 +4849,79 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { return } } + switch elem[0] { + case '/': // Prefix: "/history" - } - - case 'x': // Prefix: "xtra-currency/" - - if l := len("xtra-currency/"); len(elem) >= l && elem[0:l] == "xtra-currency/" { - elem = elem[l:] - } else { - break - } - - // Param: "id" - // Match until "/" - idx := strings.IndexByte(elem, '/') - if idx < 0 { - idx = len(elem) - } - args[1] = elem[:idx] - elem = elem[idx:] - - if len(elem) == 0 { - break - } - switch elem[0] { - case '/': // Prefix: "/history" - - if l := len("/history"); len(elem) >= l && elem[0:l] == "/history" { - elem = elem[l:] - } else { - break - } + if l := len("/history"); len(elem) >= l && elem[0:l] == "/history" { + elem = elem[l:] + } else { + break + } - if len(elem) == 0 { - // Leaf node. - switch method { - case "GET": - r.name = GetAccountExtraCurrencyHistoryByIDOperation - r.summary = "" - r.operationID = "getAccountExtraCurrencyHistoryByID" - r.operationGroup = "" - r.pathPattern = "/v2/accounts/{account_id}/extra-currency/{id}/history" - r.args = args - r.count = 2 - return r, true - default: - return + if len(elem) == 0 { + // Leaf node. + switch method { + case "GET": + r.name = GetAccountJettonHistoryByIDOperation + r.summary = "" + r.operationID = "getAccountJettonHistoryByID" + r.operationGroup = "" + r.pathPattern = "/v2/accounts/{account_id}/jettons/{jetton_id}/history" + r.args = args + r.count = 2 + return r, true + default: + return + } } + } } - } - - case 'j': // Prefix: "jettons" - - if l := len("jettons"); len(elem) >= l && elem[0:l] == "jettons" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - switch method { - case "GET": - r.name = GetAccountJettonsBalancesOperation - r.summary = "" - r.operationID = "getAccountJettonsBalances" - r.operationGroup = "" - r.pathPattern = "/v2/accounts/{account_id}/jettons" - r.args = args - r.count = 1 - return r, true - default: - return - } - } - switch elem[0] { - case '/': // Prefix: "/" + case 'm': // Prefix: "multisigs" - if l := len("/"); len(elem) >= l && elem[0:l] == "/" { + if l := len("multisigs"); len(elem) >= l && elem[0:l] == "multisigs" { elem = elem[l:] } else { break } if len(elem) == 0 { - break - } - switch elem[0] { - case 'h': // Prefix: "history" - origElem := elem - if l := len("history"); len(elem) >= l && elem[0:l] == "history" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - // Leaf node. - switch method { - case "GET": - r.name = GetAccountJettonsHistoryOperation - r.summary = "" - r.operationID = "getAccountJettonsHistory" - r.operationGroup = "" - r.pathPattern = "/v2/accounts/{account_id}/jettons/history" - r.args = args - r.count = 1 - return r, true - default: - return - } + // Leaf node. + switch method { + case "GET": + r.name = GetAccountMultisigsOperation + r.summary = "" + r.operationID = "getAccountMultisigs" + r.operationGroup = "" + r.pathPattern = "/v2/accounts/{account_id}/multisigs" + r.args = args + r.count = 1 + return r, true + default: + return } - - elem = origElem } - // Param: "jetton_id" - // Match until "/" - idx := strings.IndexByte(elem, '/') - if idx < 0 { - idx = len(elem) + + case 'n': // Prefix: "nfts" + + if l := len("nfts"); len(elem) >= l && elem[0:l] == "nfts" { + elem = elem[l:] + } else { + break } - args[1] = elem[:idx] - elem = elem[idx:] if len(elem) == 0 { switch method { case "GET": - r.name = GetAccountJettonBalanceOperation + r.name = GetAccountNftItemsOperation r.summary = "" - r.operationID = "getAccountJettonBalance" + r.operationID = "getAccountNftItems" r.operationGroup = "" - r.pathPattern = "/v2/accounts/{account_id}/jettons/{jetton_id}" + r.pathPattern = "/v2/accounts/{account_id}/nfts" r.args = args - r.count = 2 + r.count = 1 return r, true default: return @@ -4719,13 +4940,13 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { // Leaf node. switch method { case "GET": - r.name = GetAccountJettonHistoryByIDOperation + r.name = GetAccountNftHistoryOperation r.summary = "" - r.operationID = "getAccountJettonHistoryByID" + r.operationID = "getAccountNftHistory" r.operationGroup = "" - r.pathPattern = "/v2/accounts/{account_id}/jettons/{jetton_id}/history" + r.pathPattern = "/v2/accounts/{account_id}/nfts/history" r.args = args - r.count = 2 + r.count = 1 return r, true default: return @@ -4734,60 +4955,9 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { } - } - - case 'm': // Prefix: "multisigs" - - if l := len("multisigs"); len(elem) >= l && elem[0:l] == "multisigs" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - // Leaf node. - switch method { - case "GET": - r.name = GetAccountMultisigsOperation - r.summary = "" - r.operationID = "getAccountMultisigs" - r.operationGroup = "" - r.pathPattern = "/v2/accounts/{account_id}/multisigs" - r.args = args - r.count = 1 - return r, true - default: - return - } - } - - case 'n': // Prefix: "nfts" - - if l := len("nfts"); len(elem) >= l && elem[0:l] == "nfts" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - switch method { - case "GET": - r.name = GetAccountNftItemsOperation - r.summary = "" - r.operationID = "getAccountNftItems" - r.operationGroup = "" - r.pathPattern = "/v2/accounts/{account_id}/nfts" - r.args = args - r.count = 1 - return r, true - default: - return - } - } - switch elem[0] { - case '/': // Prefix: "/history" + case 'p': // Prefix: "publickey" - if l := len("/history"); len(elem) >= l && elem[0:l] == "/history" { + if l := len("publickey"); len(elem) >= l && elem[0:l] == "publickey" { elem = elem[l:] } else { break @@ -4797,11 +4967,11 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { // Leaf node. switch method { case "GET": - r.name = GetAccountNftHistoryOperation + r.name = GetAccountPublicKeyOperation r.summary = "" - r.operationID = "getAccountNftHistory" + r.operationID = "getAccountPublicKey" r.operationGroup = "" - r.pathPattern = "/v2/accounts/{account_id}/nfts/history" + r.pathPattern = "/v2/accounts/{account_id}/publickey" r.args = args r.count = 1 return r, true @@ -4810,222 +4980,109 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { } } - } - - case 'p': // Prefix: "publickey" - - if l := len("publickey"); len(elem) >= l && elem[0:l] == "publickey" { - elem = elem[l:] - } else { - break - } + case 'r': // Prefix: "reindex" - if len(elem) == 0 { - // Leaf node. - switch method { - case "GET": - r.name = GetAccountPublicKeyOperation - r.summary = "" - r.operationID = "getAccountPublicKey" - r.operationGroup = "" - r.pathPattern = "/v2/accounts/{account_id}/publickey" - r.args = args - r.count = 1 - return r, true - default: - return + if l := len("reindex"); len(elem) >= l && elem[0:l] == "reindex" { + elem = elem[l:] + } else { + break } - } - - case 'r': // Prefix: "reindex" - - if l := len("reindex"); len(elem) >= l && elem[0:l] == "reindex" { - elem = elem[l:] - } else { - break - } - if len(elem) == 0 { - // Leaf node. - switch method { - case "POST": - r.name = ReindexAccountOperation - r.summary = "" - r.operationID = "reindexAccount" - r.operationGroup = "" - r.pathPattern = "/v2/accounts/{account_id}/reindex" - r.args = args - r.count = 1 - return r, true - default: - return + if len(elem) == 0 { + // Leaf node. + switch method { + case "POST": + r.name = ReindexAccountOperation + r.summary = "" + r.operationID = "reindexAccount" + r.operationGroup = "" + r.pathPattern = "/v2/accounts/{account_id}/reindex" + r.args = args + r.count = 1 + return r, true + default: + return + } } - } - case 's': // Prefix: "subscriptions" - - if l := len("subscriptions"); len(elem) >= l && elem[0:l] == "subscriptions" { - elem = elem[l:] - } else { - break - } + case 's': // Prefix: "subscriptions" - if len(elem) == 0 { - // Leaf node. - switch method { - case "GET": - r.name = GetAccountSubscriptionsOperation - r.summary = "" - r.operationID = "getAccountSubscriptions" - r.operationGroup = "" - r.pathPattern = "/v2/accounts/{account_id}/subscriptions" - r.args = args - r.count = 1 - return r, true - default: - return + if l := len("subscriptions"); len(elem) >= l && elem[0:l] == "subscriptions" { + elem = elem[l:] + } else { + break } - } - - case 't': // Prefix: "traces" - - if l := len("traces"); len(elem) >= l && elem[0:l] == "traces" { - elem = elem[l:] - } else { - break - } - if len(elem) == 0 { - // Leaf node. - switch method { - case "GET": - r.name = GetAccountTracesOperation - r.summary = "" - r.operationID = "getAccountTraces" - r.operationGroup = "" - r.pathPattern = "/v2/accounts/{account_id}/traces" - r.args = args - r.count = 1 - return r, true - default: - return + if len(elem) == 0 { + // Leaf node. + switch method { + case "GET": + r.name = GetAccountSubscriptionsOperation + r.summary = "" + r.operationID = "getAccountSubscriptions" + r.operationGroup = "" + r.pathPattern = "/v2/accounts/{account_id}/subscriptions" + r.args = args + r.count = 1 + return r, true + default: + return + } } - } - - } - - } - - case 'd': // Prefix: "ddress/" - - if l := len("ddress/"); len(elem) >= l && elem[0:l] == "ddress/" { - elem = elem[l:] - } else { - break - } - - // Param: "account_id" - // Match until "/" - idx := strings.IndexByte(elem, '/') - if idx < 0 { - idx = len(elem) - } - args[0] = elem[:idx] - elem = elem[idx:] - - if len(elem) == 0 { - break - } - switch elem[0] { - case '/': // Prefix: "/parse" - - if l := len("/parse"); len(elem) >= l && elem[0:l] == "/parse" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - // Leaf node. - switch method { - case "GET": - r.name = AddressParseOperation - r.summary = "" - r.operationID = "addressParse" - r.operationGroup = "" - r.pathPattern = "/v2/address/{account_id}/parse" - r.args = args - r.count = 1 - return r, true - default: - return - } - } - - } - - } - - case 'b': // Prefix: "blockchain/" - if l := len("blockchain/"); len(elem) >= l && elem[0:l] == "blockchain/" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - break - } - switch elem[0] { - case 'a': // Prefix: "accounts/" + case 't': // Prefix: "traces" - if l := len("accounts/"); len(elem) >= l && elem[0:l] == "accounts/" { - elem = elem[l:] - } else { - break - } + if l := len("traces"); len(elem) >= l && elem[0:l] == "traces" { + elem = elem[l:] + } else { + break + } - // Param: "account_id" - // Match until "/" - idx := strings.IndexByte(elem, '/') - if idx < 0 { - idx = len(elem) - } - args[0] = elem[:idx] - elem = elem[idx:] + if len(elem) == 0 { + // Leaf node. + switch method { + case "GET": + r.name = GetAccountTracesOperation + r.summary = "" + r.operationID = "getAccountTraces" + r.operationGroup = "" + r.pathPattern = "/v2/accounts/{account_id}/traces" + r.args = args + r.count = 1 + return r, true + default: + return + } + } + + } - if len(elem) == 0 { - switch method { - case "GET": - r.name = GetBlockchainRawAccountOperation - r.summary = "" - r.operationID = "getBlockchainRawAccount" - r.operationGroup = "" - r.pathPattern = "/v2/blockchain/accounts/{account_id}" - r.args = args - r.count = 1 - return r, true - default: - return } - } - switch elem[0] { - case '/': // Prefix: "/" - if l := len("/"); len(elem) >= l && elem[0:l] == "/" { + case 'd': // Prefix: "ddress/" + + if l := len("ddress/"); len(elem) >= l && elem[0:l] == "ddress/" { elem = elem[l:] } else { break } + // Param: "account_id" + // Match until "/" + idx := strings.IndexByte(elem, '/') + if idx < 0 { + idx = len(elem) + } + args[0] = elem[:idx] + elem = elem[idx:] + if len(elem) == 0 { break } switch elem[0] { - case 'i': // Prefix: "inspect" + case '/': // Prefix: "/parse" - if l := len("inspect"); len(elem) >= l && elem[0:l] == "inspect" { + if l := len("/parse"); len(elem) >= l && elem[0:l] == "/parse" { elem = elem[l:] } else { break @@ -5035,11 +5092,11 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { // Leaf node. switch method { case "GET": - r.name = BlockchainAccountInspectOperation + r.name = AddressParseOperation r.summary = "" - r.operationID = "blockchainAccountInspect" + r.operationID = "addressParse" r.operationGroup = "" - r.pathPattern = "/v2/blockchain/accounts/{account_id}/inspect" + r.pathPattern = "/v2/address/{account_id}/parse" r.args = args r.count = 1 return r, true @@ -5048,151 +5105,290 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { } } - case 'm': // Prefix: "methods/" + } + + } + + case 'b': // Prefix: "blockchain/" + + if l := len("blockchain/"); len(elem) >= l && elem[0:l] == "blockchain/" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + break + } + switch elem[0] { + case 'a': // Prefix: "accounts/" + + if l := len("accounts/"); len(elem) >= l && elem[0:l] == "accounts/" { + elem = elem[l:] + } else { + break + } + + // Param: "account_id" + // Match until "/" + idx := strings.IndexByte(elem, '/') + if idx < 0 { + idx = len(elem) + } + args[0] = elem[:idx] + elem = elem[idx:] + + if len(elem) == 0 { + switch method { + case "GET": + r.name = GetBlockchainRawAccountOperation + r.summary = "" + r.operationID = "getBlockchainRawAccount" + r.operationGroup = "" + r.pathPattern = "/v2/blockchain/accounts/{account_id}" + r.args = args + r.count = 1 + return r, true + default: + return + } + } + switch elem[0] { + case '/': // Prefix: "/" - if l := len("methods/"); len(elem) >= l && elem[0:l] == "methods/" { + if l := len("/"); len(elem) >= l && elem[0:l] == "/" { elem = elem[l:] } else { break } - // Param: "method_name" - // Leaf parameter, slashes are prohibited - idx := strings.IndexByte(elem, '/') - if idx >= 0 { + if len(elem) == 0 { break } - args[1] = elem - elem = "" + switch elem[0] { + case 'i': // Prefix: "inspect" - if len(elem) == 0 { - // Leaf node. - switch method { - case "GET": - r.name = ExecGetMethodForBlockchainAccountOperation - r.summary = "" - r.operationID = "execGetMethodForBlockchainAccount" - r.operationGroup = "" - r.pathPattern = "/v2/blockchain/accounts/{account_id}/methods/{method_name}" - r.args = args - r.count = 2 - return r, true - case "POST": - r.name = ExecGetMethodWithBodyForBlockchainAccountOperation - r.summary = "" - r.operationID = "execGetMethodWithBodyForBlockchainAccount" - r.operationGroup = "" - r.pathPattern = "/v2/blockchain/accounts/{account_id}/methods/{method_name}" - r.args = args - r.count = 2 - return r, true - default: - return + if l := len("inspect"); len(elem) >= l && elem[0:l] == "inspect" { + elem = elem[l:] + } else { + break } - } - case 't': // Prefix: "transactions" + if len(elem) == 0 { + // Leaf node. + switch method { + case "GET": + r.name = BlockchainAccountInspectOperation + r.summary = "" + r.operationID = "blockchainAccountInspect" + r.operationGroup = "" + r.pathPattern = "/v2/blockchain/accounts/{account_id}/inspect" + r.args = args + r.count = 1 + return r, true + default: + return + } + } - if l := len("transactions"); len(elem) >= l && elem[0:l] == "transactions" { - elem = elem[l:] - } else { - break - } + case 'm': // Prefix: "methods/" - if len(elem) == 0 { - // Leaf node. - switch method { - case "GET": - r.name = GetBlockchainAccountTransactionsOperation - r.summary = "" - r.operationID = "getBlockchainAccountTransactions" - r.operationGroup = "" - r.pathPattern = "/v2/blockchain/accounts/{account_id}/transactions" - r.args = args - r.count = 1 - return r, true - default: - return + if l := len("methods/"); len(elem) >= l && elem[0:l] == "methods/" { + elem = elem[l:] + } else { + break } - } - } + // Param: "method_name" + // Leaf parameter, slashes are prohibited + idx := strings.IndexByte(elem, '/') + if idx >= 0 { + break + } + args[1] = elem + elem = "" - } + if len(elem) == 0 { + // Leaf node. + switch method { + case "GET": + r.name = ExecGetMethodForBlockchainAccountOperation + r.summary = "" + r.operationID = "execGetMethodForBlockchainAccount" + r.operationGroup = "" + r.pathPattern = "/v2/blockchain/accounts/{account_id}/methods/{method_name}" + r.args = args + r.count = 2 + return r, true + case "POST": + r.name = ExecGetMethodWithBodyForBlockchainAccountOperation + r.summary = "" + r.operationID = "execGetMethodWithBodyForBlockchainAccount" + r.operationGroup = "" + r.pathPattern = "/v2/blockchain/accounts/{account_id}/methods/{method_name}" + r.args = args + r.count = 2 + return r, true + default: + return + } + } - case 'b': // Prefix: "blocks/" + case 't': // Prefix: "transactions" - if l := len("blocks/"); len(elem) >= l && elem[0:l] == "blocks/" { - elem = elem[l:] - } else { - break - } + if l := len("transactions"); len(elem) >= l && elem[0:l] == "transactions" { + elem = elem[l:] + } else { + break + } - // Param: "block_id" - // Match until "/" - idx := strings.IndexByte(elem, '/') - if idx < 0 { - idx = len(elem) - } - args[0] = elem[:idx] - elem = elem[idx:] + if len(elem) == 0 { + // Leaf node. + switch method { + case "GET": + r.name = GetBlockchainAccountTransactionsOperation + r.summary = "" + r.operationID = "getBlockchainAccountTransactions" + r.operationGroup = "" + r.pathPattern = "/v2/blockchain/accounts/{account_id}/transactions" + r.args = args + r.count = 1 + return r, true + default: + return + } + } + + } - if len(elem) == 0 { - switch method { - case "GET": - r.name = GetBlockchainBlockOperation - r.summary = "" - r.operationID = "getBlockchainBlock" - r.operationGroup = "" - r.pathPattern = "/v2/blockchain/blocks/{block_id}" - r.args = args - r.count = 1 - return r, true - default: - return } - } - switch elem[0] { - case '/': // Prefix: "/" - if l := len("/"); len(elem) >= l && elem[0:l] == "/" { + case 'b': // Prefix: "blocks/" + + if l := len("blocks/"); len(elem) >= l && elem[0:l] == "blocks/" { elem = elem[l:] } else { break } + // Param: "block_id" + // Match until "/" + idx := strings.IndexByte(elem, '/') + if idx < 0 { + idx = len(elem) + } + args[0] = elem[:idx] + elem = elem[idx:] + if len(elem) == 0 { - break + switch method { + case "GET": + r.name = GetBlockchainBlockOperation + r.summary = "" + r.operationID = "getBlockchainBlock" + r.operationGroup = "" + r.pathPattern = "/v2/blockchain/blocks/{block_id}" + r.args = args + r.count = 1 + return r, true + default: + return + } } switch elem[0] { - case 'b': // Prefix: "boc" + case '/': // Prefix: "/" - if l := len("boc"); len(elem) >= l && elem[0:l] == "boc" { + if l := len("/"); len(elem) >= l && elem[0:l] == "/" { elem = elem[l:] } else { break } if len(elem) == 0 { - // Leaf node. - switch method { - case "GET": - r.name = DownloadBlockchainBlockBocOperation - r.summary = "" - r.operationID = "downloadBlockchainBlockBoc" - r.operationGroup = "" - r.pathPattern = "/v2/blockchain/blocks/{block_id}/boc" - r.args = args - r.count = 1 - return r, true - default: - return + break + } + switch elem[0] { + case 'b': // Prefix: "boc" + + if l := len("boc"); len(elem) >= l && elem[0:l] == "boc" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch method { + case "GET": + r.name = DownloadBlockchainBlockBocOperation + r.summary = "" + r.operationID = "downloadBlockchainBlockBoc" + r.operationGroup = "" + r.pathPattern = "/v2/blockchain/blocks/{block_id}/boc" + r.args = args + r.count = 1 + return r, true + default: + return + } + } + + case 't': // Prefix: "transactions" + + if l := len("transactions"); len(elem) >= l && elem[0:l] == "transactions" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch method { + case "GET": + r.name = GetBlockchainBlockTransactionsOperation + r.summary = "" + r.operationID = "getBlockchainBlockTransactions" + r.operationGroup = "" + r.pathPattern = "/v2/blockchain/blocks/{block_id}/transactions" + r.args = args + r.count = 1 + return r, true + default: + return + } } + } - case 't': // Prefix: "transactions" + } + + case 'c': // Prefix: "config" + + if l := len("config"); len(elem) >= l && elem[0:l] == "config" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + switch method { + case "GET": + r.name = GetBlockchainConfigOperation + r.summary = "" + r.operationID = "getBlockchainConfig" + r.operationGroup = "" + r.pathPattern = "/v2/blockchain/config" + r.args = args + r.count = 0 + return r, true + default: + return + } + } + switch elem[0] { + case '/': // Prefix: "/raw" - if l := len("transactions"); len(elem) >= l && elem[0:l] == "transactions" { + if l := len("/raw"); len(elem) >= l && elem[0:l] == "/raw" { elem = elem[l:] } else { break @@ -5202,13 +5398,13 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { // Leaf node. switch method { case "GET": - r.name = GetBlockchainBlockTransactionsOperation + r.name = GetRawBlockchainConfigOperation r.summary = "" - r.operationID = "getBlockchainBlockTransactions" + r.operationID = "getRawBlockchainConfig" r.operationGroup = "" - r.pathPattern = "/v2/blockchain/blocks/{block_id}/transactions" + r.pathPattern = "/v2/blockchain/config/raw" r.args = args - r.count = 1 + r.count = 0 return r, true default: return @@ -5217,108 +5413,43 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { } - } - - case 'c': // Prefix: "config" - - if l := len("config"); len(elem) >= l && elem[0:l] == "config" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - switch method { - case "GET": - r.name = GetBlockchainConfigOperation - r.summary = "" - r.operationID = "getBlockchainConfig" - r.operationGroup = "" - r.pathPattern = "/v2/blockchain/config" - r.args = args - r.count = 0 - return r, true - default: - return - } - } - switch elem[0] { - case '/': // Prefix: "/raw" + case 'l': // Prefix: "libraries/" - if l := len("/raw"); len(elem) >= l && elem[0:l] == "/raw" { + if l := len("libraries/"); len(elem) >= l && elem[0:l] == "libraries/" { elem = elem[l:] } else { break } + // Param: "hash" + // Leaf parameter, slashes are prohibited + idx := strings.IndexByte(elem, '/') + if idx >= 0 { + break + } + args[0] = elem + elem = "" + if len(elem) == 0 { // Leaf node. switch method { case "GET": - r.name = GetRawBlockchainConfigOperation + r.name = GetLibraryByHashOperation r.summary = "" - r.operationID = "getRawBlockchainConfig" + r.operationID = "getLibraryByHash" r.operationGroup = "" - r.pathPattern = "/v2/blockchain/config/raw" + r.pathPattern = "/v2/blockchain/libraries/{hash}" r.args = args - r.count = 0 + r.count = 1 return r, true default: return } } - } - - case 'l': // Prefix: "libraries/" - - if l := len("libraries/"); len(elem) >= l && elem[0:l] == "libraries/" { - elem = elem[l:] - } else { - break - } - - // Param: "hash" - // Leaf parameter, slashes are prohibited - idx := strings.IndexByte(elem, '/') - if idx >= 0 { - break - } - args[0] = elem - elem = "" - - if len(elem) == 0 { - // Leaf node. - switch method { - case "GET": - r.name = GetLibraryByHashOperation - r.summary = "" - r.operationID = "getLibraryByHash" - r.operationGroup = "" - r.pathPattern = "/v2/blockchain/libraries/{hash}" - r.args = args - r.count = 1 - return r, true - default: - return - } - } - - case 'm': // Prefix: "m" - - if l := len("m"); len(elem) >= l && elem[0:l] == "m" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - break - } - switch elem[0] { - case 'a': // Prefix: "asterchain" + case 'm': // Prefix: "m" - if l := len("asterchain"); len(elem) >= l && elem[0:l] == "asterchain" { + if l := len("m"); len(elem) >= l && elem[0:l] == "m" { elem = elem[l:] } else { break @@ -5328,52 +5459,43 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { break } switch elem[0] { - case '-': // Prefix: "-head" + case 'a': // Prefix: "asterchain" - if l := len("-head"); len(elem) >= l && elem[0:l] == "-head" { + if l := len("asterchain"); len(elem) >= l && elem[0:l] == "asterchain" { elem = elem[l:] } else { break } if len(elem) == 0 { - // Leaf node. - switch method { - case "GET": - r.name = GetBlockchainMasterchainHeadOperation - r.summary = "" - r.operationID = "getBlockchainMasterchainHead" - r.operationGroup = "" - r.pathPattern = "/v2/blockchain/masterchain-head" - r.args = args - r.count = 0 - return r, true - default: - return - } - } - - case '/': // Prefix: "/" - - if l := len("/"); len(elem) >= l && elem[0:l] == "/" { - elem = elem[l:] - } else { break } + switch elem[0] { + case '-': // Prefix: "-head" - // Param: "masterchain_seqno" - // Match until "/" - idx := strings.IndexByte(elem, '/') - if idx < 0 { - idx = len(elem) - } - args[0] = elem[:idx] - elem = elem[idx:] + if l := len("-head"); len(elem) >= l && elem[0:l] == "-head" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch method { + case "GET": + r.name = GetBlockchainMasterchainHeadOperation + r.summary = "" + r.operationID = "getBlockchainMasterchainHead" + r.operationGroup = "" + r.pathPattern = "/v2/blockchain/masterchain-head" + r.args = args + r.count = 0 + return r, true + default: + return + } + } - if len(elem) == 0 { - break - } - switch elem[0] { case '/': // Prefix: "/" if l := len("/"); len(elem) >= l && elem[0:l] == "/" { @@ -5382,62 +5504,135 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { break } + // Param: "masterchain_seqno" + // Match until "/" + idx := strings.IndexByte(elem, '/') + if idx < 0 { + idx = len(elem) + } + args[0] = elem[:idx] + elem = elem[idx:] + if len(elem) == 0 { break } switch elem[0] { - case 'b': // Prefix: "blocks" + case '/': // Prefix: "/" - if l := len("blocks"); len(elem) >= l && elem[0:l] == "blocks" { + if l := len("/"); len(elem) >= l && elem[0:l] == "/" { elem = elem[l:] } else { break } if len(elem) == 0 { - // Leaf node. - switch method { - case "GET": - r.name = GetBlockchainMasterchainBlocksOperation - r.summary = "" - r.operationID = "getBlockchainMasterchainBlocks" - r.operationGroup = "" - r.pathPattern = "/v2/blockchain/masterchain/{masterchain_seqno}/blocks" - r.args = args - r.count = 1 - return r, true - default: - return - } + break } + switch elem[0] { + case 'b': // Prefix: "blocks" - case 'c': // Prefix: "config" + if l := len("blocks"); len(elem) >= l && elem[0:l] == "blocks" { + elem = elem[l:] + } else { + break + } - if l := len("config"); len(elem) >= l && elem[0:l] == "config" { - elem = elem[l:] - } else { - break - } + if len(elem) == 0 { + // Leaf node. + switch method { + case "GET": + r.name = GetBlockchainMasterchainBlocksOperation + r.summary = "" + r.operationID = "getBlockchainMasterchainBlocks" + r.operationGroup = "" + r.pathPattern = "/v2/blockchain/masterchain/{masterchain_seqno}/blocks" + r.args = args + r.count = 1 + return r, true + default: + return + } + } - if len(elem) == 0 { - switch method { - case "GET": - r.name = GetBlockchainConfigFromBlockOperation - r.summary = "" - r.operationID = "getBlockchainConfigFromBlock" - r.operationGroup = "" - r.pathPattern = "/v2/blockchain/masterchain/{masterchain_seqno}/config" - r.args = args - r.count = 1 - return r, true - default: - return + case 'c': // Prefix: "config" + + if l := len("config"); len(elem) >= l && elem[0:l] == "config" { + elem = elem[l:] + } else { + break } - } - switch elem[0] { - case '/': // Prefix: "/raw" - if l := len("/raw"); len(elem) >= l && elem[0:l] == "/raw" { + if len(elem) == 0 { + switch method { + case "GET": + r.name = GetBlockchainConfigFromBlockOperation + r.summary = "" + r.operationID = "getBlockchainConfigFromBlock" + r.operationGroup = "" + r.pathPattern = "/v2/blockchain/masterchain/{masterchain_seqno}/config" + r.args = args + r.count = 1 + return r, true + default: + return + } + } + switch elem[0] { + case '/': // Prefix: "/raw" + + if l := len("/raw"); len(elem) >= l && elem[0:l] == "/raw" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch method { + case "GET": + r.name = GetRawBlockchainConfigFromBlockOperation + r.summary = "" + r.operationID = "getRawBlockchainConfigFromBlock" + r.operationGroup = "" + r.pathPattern = "/v2/blockchain/masterchain/{masterchain_seqno}/config/raw" + r.args = args + r.count = 1 + return r, true + default: + return + } + } + + } + + case 's': // Prefix: "shards" + + if l := len("shards"); len(elem) >= l && elem[0:l] == "shards" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch method { + case "GET": + r.name = GetBlockchainMasterchainShardsOperation + r.summary = "" + r.operationID = "getBlockchainMasterchainShards" + r.operationGroup = "" + r.pathPattern = "/v2/blockchain/masterchain/{masterchain_seqno}/shards" + r.args = args + r.count = 1 + return r, true + default: + return + } + } + + case 't': // Prefix: "transactions" + + if l := len("transactions"); len(elem) >= l && elem[0:l] == "transactions" { elem = elem[l:] } else { break @@ -5447,11 +5642,11 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { // Leaf node. switch method { case "GET": - r.name = GetRawBlockchainConfigFromBlockOperation + r.name = GetBlockchainMasterchainTransactionsOperation r.summary = "" - r.operationID = "getRawBlockchainConfigFromBlock" + r.operationID = "getBlockchainMasterchainTransactions" r.operationGroup = "" - r.pathPattern = "/v2/blockchain/masterchain/{masterchain_seqno}/config/raw" + r.pathPattern = "/v2/blockchain/masterchain/{masterchain_seqno}/transactions" r.args = args r.count = 1 return r, true @@ -5462,34 +5657,58 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { } - case 's': // Prefix: "shards" + } + + } + + case 'e': // Prefix: "essage" + + if l := len("essage"); len(elem) >= l && elem[0:l] == "essage" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + switch method { + case "POST": + r.name = SendBlockchainMessageOperation + r.summary = "" + r.operationID = "sendBlockchainMessage" + r.operationGroup = "" + r.pathPattern = "/v2/blockchain/message" + r.args = args + r.count = 0 + return r, true + default: + return + } + } + switch elem[0] { + case 's': // Prefix: "s/" - if l := len("shards"); len(elem) >= l && elem[0:l] == "shards" { - elem = elem[l:] - } else { - break - } + if l := len("s/"); len(elem) >= l && elem[0:l] == "s/" { + elem = elem[l:] + } else { + break + } - if len(elem) == 0 { - // Leaf node. - switch method { - case "GET": - r.name = GetBlockchainMasterchainShardsOperation - r.summary = "" - r.operationID = "getBlockchainMasterchainShards" - r.operationGroup = "" - r.pathPattern = "/v2/blockchain/masterchain/{masterchain_seqno}/shards" - r.args = args - r.count = 1 - return r, true - default: - return - } - } + // Param: "msg_id" + // Match until "/" + idx := strings.IndexByte(elem, '/') + if idx < 0 { + idx = len(elem) + } + args[0] = elem[:idx] + elem = elem[idx:] - case 't': // Prefix: "transactions" + if len(elem) == 0 { + break + } + switch elem[0] { + case '/': // Prefix: "/transaction" - if l := len("transactions"); len(elem) >= l && elem[0:l] == "transactions" { + if l := len("/transaction"); len(elem) >= l && elem[0:l] == "/transaction" { elem = elem[l:] } else { break @@ -5499,11 +5718,11 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { // Leaf node. switch method { case "GET": - r.name = GetBlockchainMasterchainTransactionsOperation + r.name = GetBlockchainTransactionByMessageHashOperation r.summary = "" - r.operationID = "getBlockchainMasterchainTransactions" + r.operationID = "getBlockchainTransactionByMessageHash" r.operationGroup = "" - r.pathPattern = "/v2/blockchain/masterchain/{masterchain_seqno}/transactions" + r.pathPattern = "/v2/blockchain/messages/{msg_id}/transaction" r.args = args r.count = 1 return r, true @@ -5518,22 +5737,23 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { } - case 'e': // Prefix: "essage" + case 'r': // Prefix: "reduced/blocks" - if l := len("essage"); len(elem) >= l && elem[0:l] == "essage" { + if l := len("reduced/blocks"); len(elem) >= l && elem[0:l] == "reduced/blocks" { elem = elem[l:] } else { break } if len(elem) == 0 { + // Leaf node. switch method { - case "POST": - r.name = SendBlockchainMessageOperation + case "GET": + r.name = GetReducedBlockchainBlocksOperation r.summary = "" - r.operationID = "sendBlockchainMessage" + r.operationID = "getReducedBlockchainBlocks" r.operationGroup = "" - r.pathPattern = "/v2/blockchain/message" + r.pathPattern = "/v2/blockchain/reduced/blocks" r.args = args r.count = 0 return r, true @@ -5541,110 +5761,124 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { return } } - switch elem[0] { - case 's': // Prefix: "s/" - if l := len("s/"); len(elem) >= l && elem[0:l] == "s/" { - elem = elem[l:] - } else { - break - } + case 't': // Prefix: "transactions/" - // Param: "msg_id" - // Match until "/" - idx := strings.IndexByte(elem, '/') - if idx < 0 { - idx = len(elem) - } - args[0] = elem[:idx] - elem = elem[idx:] + if l := len("transactions/"); len(elem) >= l && elem[0:l] == "transactions/" { + elem = elem[l:] + } else { + break + } - if len(elem) == 0 { - break + // Param: "transaction_id" + // Leaf parameter, slashes are prohibited + idx := strings.IndexByte(elem, '/') + if idx >= 0 { + break + } + args[0] = elem + elem = "" + + if len(elem) == 0 { + // Leaf node. + switch method { + case "GET": + r.name = GetBlockchainTransactionOperation + r.summary = "" + r.operationID = "getBlockchainTransaction" + r.operationGroup = "" + r.pathPattern = "/v2/blockchain/transactions/{transaction_id}" + r.args = args + r.count = 1 + return r, true + default: + return } - switch elem[0] { - case '/': // Prefix: "/transaction" + } - if l := len("/transaction"); len(elem) >= l && elem[0:l] == "/transaction" { - elem = elem[l:] - } else { - break - } + case 'v': // Prefix: "validators" - if len(elem) == 0 { - // Leaf node. - switch method { - case "GET": - r.name = GetBlockchainTransactionByMessageHashOperation - r.summary = "" - r.operationID = "getBlockchainTransactionByMessageHash" - r.operationGroup = "" - r.pathPattern = "/v2/blockchain/messages/{msg_id}/transaction" - r.args = args - r.count = 1 - return r, true - default: - return - } - } + if l := len("validators"); len(elem) >= l && elem[0:l] == "validators" { + elem = elem[l:] + } else { + break + } + if len(elem) == 0 { + // Leaf node. + switch method { + case "GET": + r.name = GetBlockchainValidatorsOperation + r.summary = "" + r.operationID = "getBlockchainValidators" + r.operationGroup = "" + r.pathPattern = "/v2/blockchain/validators" + r.args = args + r.count = 0 + return r, true + default: + return } - } } - case 'r': // Prefix: "reduced/blocks" + case 'd': // Prefix: "dns/" - if l := len("reduced/blocks"); len(elem) >= l && elem[0:l] == "reduced/blocks" { + if l := len("dns/"); len(elem) >= l && elem[0:l] == "dns/" { elem = elem[l:] } else { break } if len(elem) == 0 { - // Leaf node. - switch method { - case "GET": - r.name = GetReducedBlockchainBlocksOperation - r.summary = "" - r.operationID = "getReducedBlockchainBlocks" - r.operationGroup = "" - r.pathPattern = "/v2/blockchain/reduced/blocks" - r.args = args - r.count = 0 - return r, true - default: - return - } + break } + switch elem[0] { + case 'a': // Prefix: "auctions" + origElem := elem + if l := len("auctions"); len(elem) >= l && elem[0:l] == "auctions" { + elem = elem[l:] + } else { + break + } - case 't': // Prefix: "transactions/" + if len(elem) == 0 { + // Leaf node. + switch method { + case "GET": + r.name = GetAllAuctionsOperation + r.summary = "" + r.operationID = "getAllAuctions" + r.operationGroup = "" + r.pathPattern = "/v2/dns/auctions" + r.args = args + r.count = 0 + return r, true + default: + return + } + } - if l := len("transactions/"); len(elem) >= l && elem[0:l] == "transactions/" { - elem = elem[l:] - } else { - break + elem = origElem } - - // Param: "transaction_id" - // Leaf parameter, slashes are prohibited + // Param: "domain_name" + // Match until "/" idx := strings.IndexByte(elem, '/') - if idx >= 0 { - break + if idx < 0 { + idx = len(elem) } - args[0] = elem - elem = "" + args[0] = elem[:idx] + elem = elem[idx:] if len(elem) == 0 { - // Leaf node. switch method { case "GET": - r.name = GetBlockchainTransactionOperation + r.name = GetDnsInfoOperation r.summary = "" - r.operationID = "getBlockchainTransaction" + r.operationID = "getDnsInfo" r.operationGroup = "" - r.pathPattern = "/v2/blockchain/transactions/{transaction_id}" + r.pathPattern = "/v2/dns/{domain_name}" r.args = args r.count = 1 return r, true @@ -5652,101 +5886,76 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { return } } + switch elem[0] { + case '/': // Prefix: "/" - case 'v': // Prefix: "validators" - - if l := len("validators"); len(elem) >= l && elem[0:l] == "validators" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - // Leaf node. - switch method { - case "GET": - r.name = GetBlockchainValidatorsOperation - r.summary = "" - r.operationID = "getBlockchainValidators" - r.operationGroup = "" - r.pathPattern = "/v2/blockchain/validators" - r.args = args - r.count = 0 - return r, true - default: - return + if l := len("/"); len(elem) >= l && elem[0:l] == "/" { + elem = elem[l:] + } else { + break } - } - } + if len(elem) == 0 { + break + } + switch elem[0] { + case 'b': // Prefix: "bids" - case 'd': // Prefix: "dns/" + if l := len("bids"); len(elem) >= l && elem[0:l] == "bids" { + elem = elem[l:] + } else { + break + } - if l := len("dns/"); len(elem) >= l && elem[0:l] == "dns/" { - elem = elem[l:] - } else { - break - } + if len(elem) == 0 { + // Leaf node. + switch method { + case "GET": + r.name = GetDomainBidsOperation + r.summary = "" + r.operationID = "getDomainBids" + r.operationGroup = "" + r.pathPattern = "/v2/dns/{domain_name}/bids" + r.args = args + r.count = 1 + return r, true + default: + return + } + } - if len(elem) == 0 { - break - } - switch elem[0] { - case 'a': // Prefix: "auctions" - origElem := elem - if l := len("auctions"); len(elem) >= l && elem[0:l] == "auctions" { - elem = elem[l:] - } else { - break - } + case 'r': // Prefix: "resolve" - if len(elem) == 0 { - // Leaf node. - switch method { - case "GET": - r.name = GetAllAuctionsOperation - r.summary = "" - r.operationID = "getAllAuctions" - r.operationGroup = "" - r.pathPattern = "/v2/dns/auctions" - r.args = args - r.count = 0 - return r, true - default: - return - } - } + if l := len("resolve"); len(elem) >= l && elem[0:l] == "resolve" { + elem = elem[l:] + } else { + break + } - elem = origElem - } - // Param: "domain_name" - // Match until "/" - idx := strings.IndexByte(elem, '/') - if idx < 0 { - idx = len(elem) - } - args[0] = elem[:idx] - elem = elem[idx:] + if len(elem) == 0 { + // Leaf node. + switch method { + case "GET": + r.name = DnsResolveOperation + r.summary = "" + r.operationID = "dnsResolve" + r.operationGroup = "" + r.pathPattern = "/v2/dns/{domain_name}/resolve" + r.args = args + r.count = 1 + return r, true + default: + return + } + } + + } - if len(elem) == 0 { - switch method { - case "GET": - r.name = GetDnsInfoOperation - r.summary = "" - r.operationID = "getDnsInfo" - r.operationGroup = "" - r.pathPattern = "/v2/dns/{domain_name}" - r.args = args - r.count = 1 - return r, true - default: - return } - } - switch elem[0] { - case '/': // Prefix: "/" - if l := len("/"); len(elem) >= l && elem[0:l] == "/" { + case 'e': // Prefix: "e" + + if l := len("e"); len(elem) >= l && elem[0:l] == "e" { elem = elem[l:] } else { break @@ -5756,23 +5965,62 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { break } switch elem[0] { - case 'b': // Prefix: "bids" + case 'v': // Prefix: "vents/" - if l := len("bids"); len(elem) >= l && elem[0:l] == "bids" { + if l := len("vents/"); len(elem) >= l && elem[0:l] == "vents/" { elem = elem[l:] } else { break } if len(elem) == 0 { - // Leaf node. + break + } + switch elem[0] { + case 'e': // Prefix: "emulate" + origElem := elem + if l := len("emulate"); len(elem) >= l && elem[0:l] == "emulate" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch method { + case "POST": + r.name = EmulateMessageToEventOperation + r.summary = "" + r.operationID = "emulateMessageToEvent" + r.operationGroup = "" + r.pathPattern = "/v2/events/emulate" + r.args = args + r.count = 0 + return r, true + default: + return + } + } + + elem = origElem + } + // Param: "event_id" + // Match until "/" + idx := strings.IndexByte(elem, '/') + if idx < 0 { + idx = len(elem) + } + args[0] = elem[:idx] + elem = elem[idx:] + + if len(elem) == 0 { switch method { case "GET": - r.name = GetDomainBidsOperation + r.name = GetEventOperation r.summary = "" - r.operationID = "getDomainBids" + r.operationID = "getEvent" r.operationGroup = "" - r.pathPattern = "/v2/dns/{domain_name}/bids" + r.pathPattern = "/v2/events/{event_id}" r.args = args r.count = 1 return r, true @@ -5780,24 +6028,60 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { return } } + switch elem[0] { + case '/': // Prefix: "/jettons" + + if l := len("/jettons"); len(elem) >= l && elem[0:l] == "/jettons" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch method { + case "GET": + r.name = GetJettonsEventsOperation + r.summary = "" + r.operationID = "getJettonsEvents" + r.operationGroup = "" + r.pathPattern = "/v2/events/{event_id}/jettons" + r.args = args + r.count = 1 + return r, true + default: + return + } + } + + } - case 'r': // Prefix: "resolve" + case 'x': // Prefix: "xtra-currency/" - if l := len("resolve"); len(elem) >= l && elem[0:l] == "resolve" { + if l := len("xtra-currency/"); len(elem) >= l && elem[0:l] == "xtra-currency/" { elem = elem[l:] } else { break } + // Param: "id" + // Leaf parameter, slashes are prohibited + idx := strings.IndexByte(elem, '/') + if idx >= 0 { + break + } + args[0] = elem + elem = "" + if len(elem) == 0 { // Leaf node. switch method { case "GET": - r.name = DnsResolveOperation + r.name = GetExtraCurrencyInfoOperation r.summary = "" - r.operationID = "dnsResolve" + r.operationID = "getExtraCurrencyInfo" r.operationGroup = "" - r.pathPattern = "/v2/dns/{domain_name}/resolve" + r.pathPattern = "/v2/extra-currency/{id}" r.args = args r.count = 1 return r, true @@ -5808,23 +6092,9 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { } - } - - case 'e': // Prefix: "e" - - if l := len("e"); len(elem) >= l && elem[0:l] == "e" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - break - } - switch elem[0] { - case 'v': // Prefix: "vents/" + case 'g': // Prefix: "gasless/" - if l := len("vents/"); len(elem) >= l && elem[0:l] == "vents/" { + if l := len("gasless/"); len(elem) >= l && elem[0:l] == "gasless/" { elem = elem[l:] } else { break @@ -5834,9 +6104,9 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { break } switch elem[0] { - case 'e': // Prefix: "emulate" - origElem := elem - if l := len("emulate"); len(elem) >= l && elem[0:l] == "emulate" { + case 'c': // Prefix: "config" + + if l := len("config"); len(elem) >= l && elem[0:l] == "config" { elem = elem[l:] } else { break @@ -5845,12 +6115,12 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { if len(elem) == 0 { // Leaf node. switch method { - case "POST": - r.name = EmulateMessageToEventOperation + case "GET": + r.name = GaslessConfigOperation r.summary = "" - r.operationID = "emulateMessageToEvent" + r.operationID = "gaslessConfig" r.operationGroup = "" - r.pathPattern = "/v2/events/emulate" + r.pathPattern = "/v2/gasless/config" r.args = args r.count = 0 return r, true @@ -5859,36 +6129,43 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { } } - elem = origElem - } - // Param: "event_id" - // Match until "/" - idx := strings.IndexByte(elem, '/') - if idx < 0 { - idx = len(elem) - } - args[0] = elem[:idx] - elem = elem[idx:] + case 'e': // Prefix: "estimate/" - if len(elem) == 0 { - switch method { - case "GET": - r.name = GetEventOperation - r.summary = "" - r.operationID = "getEvent" - r.operationGroup = "" - r.pathPattern = "/v2/events/{event_id}" - r.args = args - r.count = 1 - return r, true - default: - return + if l := len("estimate/"); len(elem) >= l && elem[0:l] == "estimate/" { + elem = elem[l:] + } else { + break } - } - switch elem[0] { - case '/': // Prefix: "/jettons" - if l := len("/jettons"); len(elem) >= l && elem[0:l] == "/jettons" { + // Param: "master_id" + // Leaf parameter, slashes are prohibited + idx := strings.IndexByte(elem, '/') + if idx >= 0 { + break + } + args[0] = elem + elem = "" + + if len(elem) == 0 { + // Leaf node. + switch method { + case "POST": + r.name = GaslessEstimateOperation + r.summary = "" + r.operationID = "gaslessEstimate" + r.operationGroup = "" + r.pathPattern = "/v2/gasless/estimate/{master_id}" + r.args = args + r.count = 1 + return r, true + default: + return + } + } + + case 's': // Prefix: "send" + + if l := len("send"); len(elem) >= l && elem[0:l] == "send" { elem = elem[l:] } else { break @@ -5897,14 +6174,14 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { if len(elem) == 0 { // Leaf node. switch method { - case "GET": - r.name = GetJettonsEventsOperation + case "POST": + r.name = GaslessSendOperation r.summary = "" - r.operationID = "getJettonsEvents" + r.operationID = "gaslessSend" r.operationGroup = "" - r.pathPattern = "/v2/events/{event_id}/jettons" + r.pathPattern = "/v2/gasless/send" r.args = args - r.count = 1 + r.count = 0 return r, true default: return @@ -5913,167 +6190,236 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { } - case 'x': // Prefix: "xtra-currency/" + case 'j': // Prefix: "jettons" - if l := len("xtra-currency/"); len(elem) >= l && elem[0:l] == "xtra-currency/" { + if l := len("jettons"); len(elem) >= l && elem[0:l] == "jettons" { elem = elem[l:] } else { break } - // Param: "id" - // Leaf parameter, slashes are prohibited - idx := strings.IndexByte(elem, '/') - if idx >= 0 { - break - } - args[0] = elem - elem = "" - if len(elem) == 0 { - // Leaf node. switch method { case "GET": - r.name = GetExtraCurrencyInfoOperation + r.name = GetJettonsOperation r.summary = "" - r.operationID = "getExtraCurrencyInfo" + r.operationID = "getJettons" r.operationGroup = "" - r.pathPattern = "/v2/extra-currency/{id}" + r.pathPattern = "/v2/jettons" r.args = args - r.count = 1 + r.count = 0 return r, true default: return } } + switch elem[0] { + case '/': // Prefix: "/" - } + if l := len("/"); len(elem) >= l && elem[0:l] == "/" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + break + } + switch elem[0] { + case '_': // Prefix: "_bulk" + origElem := elem + if l := len("_bulk"); len(elem) >= l && elem[0:l] == "_bulk" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch method { + case "POST": + r.name = GetJettonInfosByAddressesOperation + r.summary = "" + r.operationID = "getJettonInfosByAddresses" + r.operationGroup = "" + r.pathPattern = "/v2/jettons/_bulk" + r.args = args + r.count = 0 + return r, true + default: + return + } + } - case 'g': // Prefix: "gasless/" + elem = origElem + } + // Param: "jetton_id" + // Match until "/" + idx := strings.IndexByte(elem, '/') + if idx < 0 { + idx = len(elem) + } + args[0] = elem[:idx] + elem = elem[idx:] - if l := len("gasless/"); len(elem) >= l && elem[0:l] == "gasless/" { - elem = elem[l:] - } else { - break - } + if len(elem) == 0 { + switch method { + case "GET": + r.name = GetJettonInfoOperation + r.summary = "" + r.operationID = "getJettonInfo" + r.operationGroup = "" + r.pathPattern = "/v2/jettons/{account_id}" + r.args = args + r.count = 1 + return r, true + default: + return + } + } + switch elem[0] { + case '/': // Prefix: "/" + + if l := len("/"); len(elem) >= l && elem[0:l] == "/" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + break + } + switch elem[0] { + case 'a': // Prefix: "accounts/" + + if l := len("accounts/"); len(elem) >= l && elem[0:l] == "accounts/" { + elem = elem[l:] + } else { + break + } + + // Param: "account_id" + // Match until "/" + idx := strings.IndexByte(elem, '/') + if idx < 0 { + idx = len(elem) + } + args[1] = elem[:idx] + elem = elem[idx:] + + if len(elem) == 0 { + break + } + switch elem[0] { + case '/': // Prefix: "/history" + + if l := len("/history"); len(elem) >= l && elem[0:l] == "/history" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch method { + case "GET": + r.name = GetJettonAccountHistoryByIDOperation + r.summary = "" + r.operationID = "getJettonAccountHistoryByID" + r.operationGroup = "" + r.pathPattern = "/v2/jettons/{jetton_id}/accounts/{account_id}/history" + r.args = args + r.count = 2 + return r, true + default: + return + } + } - if len(elem) == 0 { - break - } - switch elem[0] { - case 'c': // Prefix: "config" + } - if l := len("config"); len(elem) >= l && elem[0:l] == "config" { - elem = elem[l:] - } else { - break - } + case 'h': // Prefix: "holders" - if len(elem) == 0 { - // Leaf node. - switch method { - case "GET": - r.name = GaslessConfigOperation - r.summary = "" - r.operationID = "gaslessConfig" - r.operationGroup = "" - r.pathPattern = "/v2/gasless/config" - r.args = args - r.count = 0 - return r, true - default: - return - } - } + if l := len("holders"); len(elem) >= l && elem[0:l] == "holders" { + elem = elem[l:] + } else { + break + } - case 'e': // Prefix: "estimate/" + if len(elem) == 0 { + // Leaf node. + switch method { + case "GET": + r.name = GetJettonHoldersOperation + r.summary = "" + r.operationID = "getJettonHolders" + r.operationGroup = "" + r.pathPattern = "/v2/jettons/{account_id}/holders" + r.args = args + r.count = 1 + return r, true + default: + return + } + } - if l := len("estimate/"); len(elem) >= l && elem[0:l] == "estimate/" { - elem = elem[l:] - } else { - break - } + case 't': // Prefix: "transfer/" - // Param: "master_id" - // Leaf parameter, slashes are prohibited - idx := strings.IndexByte(elem, '/') - if idx >= 0 { - break - } - args[0] = elem - elem = "" + if l := len("transfer/"); len(elem) >= l && elem[0:l] == "transfer/" { + elem = elem[l:] + } else { + break + } - if len(elem) == 0 { - // Leaf node. - switch method { - case "POST": - r.name = GaslessEstimateOperation - r.summary = "" - r.operationID = "gaslessEstimate" - r.operationGroup = "" - r.pathPattern = "/v2/gasless/estimate/{master_id}" - r.args = args - r.count = 1 - return r, true - default: - return - } - } + // Param: "account_id" + // Match until "/" + idx := strings.IndexByte(elem, '/') + if idx < 0 { + idx = len(elem) + } + args[1] = elem[:idx] + elem = elem[idx:] - case 's': // Prefix: "send" + if len(elem) == 0 { + break + } + switch elem[0] { + case '/': // Prefix: "/payload" - if l := len("send"); len(elem) >= l && elem[0:l] == "send" { - elem = elem[l:] - } else { - break - } + if l := len("/payload"); len(elem) >= l && elem[0:l] == "/payload" { + elem = elem[l:] + } else { + break + } - if len(elem) == 0 { - // Leaf node. - switch method { - case "POST": - r.name = GaslessSendOperation - r.summary = "" - r.operationID = "gaslessSend" - r.operationGroup = "" - r.pathPattern = "/v2/gasless/send" - r.args = args - r.count = 0 - return r, true - default: - return - } - } + if len(elem) == 0 { + // Leaf node. + switch method { + case "GET": + r.name = GetJettonTransferPayloadOperation + r.summary = "" + r.operationID = "getJettonTransferPayload" + r.operationGroup = "" + r.pathPattern = "/v2/jettons/{jetton_id}/transfer/{account_id}/payload" + r.args = args + r.count = 2 + return r, true + default: + return + } + } - } + } - case 'j': // Prefix: "jettons" + } - if l := len("jettons"); len(elem) >= l && elem[0:l] == "jettons" { - elem = elem[l:] - } else { - break - } + } - if len(elem) == 0 { - switch method { - case "GET": - r.name = GetJettonsOperation - r.summary = "" - r.operationID = "getJettons" - r.operationGroup = "" - r.pathPattern = "/v2/jettons" - r.args = args - r.count = 0 - return r, true - default: - return } - } - switch elem[0] { - case '/': // Prefix: "/" - if l := len("/"); len(elem) >= l && elem[0:l] == "/" { + case 'l': // Prefix: "liteserver/" + + if l := len("liteserver/"); len(elem) >= l && elem[0:l] == "liteserver/" { elem = elem[l:] } else { break @@ -6083,61 +6429,9 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { break } switch elem[0] { - case '_': // Prefix: "_bulk" - origElem := elem - if l := len("_bulk"); len(elem) >= l && elem[0:l] == "_bulk" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - // Leaf node. - switch method { - case "POST": - r.name = GetJettonInfosByAddressesOperation - r.summary = "" - r.operationID = "getJettonInfosByAddresses" - r.operationGroup = "" - r.pathPattern = "/v2/jettons/_bulk" - r.args = args - r.count = 0 - return r, true - default: - return - } - } - - elem = origElem - } - // Param: "jetton_id" - // Match until "/" - idx := strings.IndexByte(elem, '/') - if idx < 0 { - idx = len(elem) - } - args[0] = elem[:idx] - elem = elem[idx:] - - if len(elem) == 0 { - switch method { - case "GET": - r.name = GetJettonInfoOperation - r.summary = "" - r.operationID = "getJettonInfo" - r.operationGroup = "" - r.pathPattern = "/v2/jettons/{account_id}" - r.args = args - r.count = 1 - return r, true - default: - return - } - } - switch elem[0] { - case '/': // Prefix: "/" + case 'g': // Prefix: "get_" - if l := len("/"); len(elem) >= l && elem[0:l] == "/" { + if l := len("get_"); len(elem) >= l && elem[0:l] == "get_" { elem = elem[l:] } else { break @@ -6147,178 +6441,218 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { break } switch elem[0] { - case 'a': // Prefix: "accounts/" + case 'a': // Prefix: "a" - if l := len("accounts/"); len(elem) >= l && elem[0:l] == "accounts/" { + if l := len("a"); len(elem) >= l && elem[0:l] == "a" { elem = elem[l:] } else { break } - // Param: "account_id" - // Match until "/" - idx := strings.IndexByte(elem, '/') - if idx < 0 { - idx = len(elem) - } - args[1] = elem[:idx] - elem = elem[idx:] - if len(elem) == 0 { break } switch elem[0] { - case '/': // Prefix: "/history" + case 'c': // Prefix: "ccount_state/" - if l := len("/history"); len(elem) >= l && elem[0:l] == "/history" { + if l := len("ccount_state/"); len(elem) >= l && elem[0:l] == "ccount_state/" { elem = elem[l:] } else { break } + // Param: "account_id" + // Leaf parameter, slashes are prohibited + idx := strings.IndexByte(elem, '/') + if idx >= 0 { + break + } + args[0] = elem + elem = "" + if len(elem) == 0 { // Leaf node. switch method { case "GET": - r.name = GetJettonAccountHistoryByIDOperation + r.name = GetRawAccountStateOperation r.summary = "" - r.operationID = "getJettonAccountHistoryByID" + r.operationID = "getRawAccountState" r.operationGroup = "" - r.pathPattern = "/v2/jettons/{jetton_id}/accounts/{account_id}/history" + r.pathPattern = "/v2/liteserver/get_account_state/{account_id}" r.args = args - r.count = 2 + r.count = 1 return r, true default: return } } - } + case 'l': // Prefix: "ll_shards_info/" - case 'h': // Prefix: "holders" + if l := len("ll_shards_info/"); len(elem) >= l && elem[0:l] == "ll_shards_info/" { + elem = elem[l:] + } else { + break + } - if l := len("holders"); len(elem) >= l && elem[0:l] == "holders" { - elem = elem[l:] - } else { - break - } + // Param: "block_id" + // Leaf parameter, slashes are prohibited + idx := strings.IndexByte(elem, '/') + if idx >= 0 { + break + } + args[0] = elem + elem = "" - if len(elem) == 0 { - // Leaf node. - switch method { - case "GET": - r.name = GetJettonHoldersOperation - r.summary = "" - r.operationID = "getJettonHolders" - r.operationGroup = "" - r.pathPattern = "/v2/jettons/{account_id}/holders" - r.args = args - r.count = 1 - return r, true - default: - return + if len(elem) == 0 { + // Leaf node. + switch method { + case "GET": + r.name = GetAllRawShardsInfoOperation + r.summary = "" + r.operationID = "getAllRawShardsInfo" + r.operationGroup = "" + r.pathPattern = "/v2/liteserver/get_all_shards_info/{block_id}" + r.args = args + r.count = 1 + return r, true + default: + return + } } + } - case 't': // Prefix: "transfer/" + case 'b': // Prefix: "block" - if l := len("transfer/"); len(elem) >= l && elem[0:l] == "transfer/" { + if l := len("block"); len(elem) >= l && elem[0:l] == "block" { elem = elem[l:] } else { break } - // Param: "account_id" - // Match until "/" - idx := strings.IndexByte(elem, '/') - if idx < 0 { - idx = len(elem) - } - args[1] = elem[:idx] - elem = elem[idx:] - if len(elem) == 0 { break } switch elem[0] { - case '/': // Prefix: "/payload" + case '/': // Prefix: "/" - if l := len("/payload"); len(elem) >= l && elem[0:l] == "/payload" { + if l := len("/"); len(elem) >= l && elem[0:l] == "/" { elem = elem[l:] } else { break } + // Param: "block_id" + // Leaf parameter, slashes are prohibited + idx := strings.IndexByte(elem, '/') + if idx >= 0 { + break + } + args[0] = elem + elem = "" + if len(elem) == 0 { // Leaf node. switch method { case "GET": - r.name = GetJettonTransferPayloadOperation + r.name = GetRawBlockchainBlockOperation r.summary = "" - r.operationID = "getJettonTransferPayload" + r.operationID = "getRawBlockchainBlock" r.operationGroup = "" - r.pathPattern = "/v2/jettons/{jetton_id}/transfer/{account_id}/payload" + r.pathPattern = "/v2/liteserver/get_block/{block_id}" r.args = args - r.count = 2 + r.count = 1 return r, true default: return } } - } + case '_': // Prefix: "_" + + if l := len("_"); len(elem) >= l && elem[0:l] == "_" { + elem = elem[l:] + } else { + break + } - } + if len(elem) == 0 { + break + } + switch elem[0] { + case 'h': // Prefix: "header/" - } + if l := len("header/"); len(elem) >= l && elem[0:l] == "header/" { + elem = elem[l:] + } else { + break + } - } + // Param: "block_id" + // Leaf parameter, slashes are prohibited + idx := strings.IndexByte(elem, '/') + if idx >= 0 { + break + } + args[0] = elem + elem = "" - case 'l': // Prefix: "liteserver/" + if len(elem) == 0 { + // Leaf node. + switch method { + case "GET": + r.name = GetRawBlockchainBlockHeaderOperation + r.summary = "" + r.operationID = "getRawBlockchainBlockHeader" + r.operationGroup = "" + r.pathPattern = "/v2/liteserver/get_block_header/{block_id}" + r.args = args + r.count = 1 + return r, true + default: + return + } + } - if l := len("liteserver/"); len(elem) >= l && elem[0:l] == "liteserver/" { - elem = elem[l:] - } else { - break - } + case 'p': // Prefix: "proof" - if len(elem) == 0 { - break - } - switch elem[0] { - case 'g': // Prefix: "get_" + if l := len("proof"); len(elem) >= l && elem[0:l] == "proof" { + elem = elem[l:] + } else { + break + } - if l := len("get_"); len(elem) >= l && elem[0:l] == "get_" { - elem = elem[l:] - } else { - break - } + if len(elem) == 0 { + // Leaf node. + switch method { + case "GET": + r.name = GetRawBlockProofOperation + r.summary = "" + r.operationID = "getRawBlockProof" + r.operationGroup = "" + r.pathPattern = "/v2/liteserver/get_block_proof" + r.args = args + r.count = 0 + return r, true + default: + return + } + } - if len(elem) == 0 { - break - } - switch elem[0] { - case 'a': // Prefix: "a" + } - if l := len("a"); len(elem) >= l && elem[0:l] == "a" { - elem = elem[l:] - } else { - break - } + } - if len(elem) == 0 { - break - } - switch elem[0] { - case 'c': // Prefix: "ccount_state/" + case 'c': // Prefix: "config_all/" - if l := len("ccount_state/"); len(elem) >= l && elem[0:l] == "ccount_state/" { + if l := len("config_all/"); len(elem) >= l && elem[0:l] == "config_all/" { elem = elem[l:] } else { break } - // Param: "account_id" + // Param: "block_id" // Leaf parameter, slashes are prohibited idx := strings.IndexByte(elem, '/') if idx >= 0 { @@ -6331,11 +6665,11 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { // Leaf node. switch method { case "GET": - r.name = GetRawAccountStateOperation + r.name = GetRawConfigOperation r.summary = "" - r.operationID = "getRawAccountState" + r.operationID = "getRawConfig" r.operationGroup = "" - r.pathPattern = "/v2/liteserver/get_account_state/{account_id}" + r.pathPattern = "/v2/liteserver/get_config_all/{block_id}" r.args = args r.count = 1 return r, true @@ -6344,91 +6678,85 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { } } - case 'l': // Prefix: "ll_shards_info/" + case 'm': // Prefix: "masterchain_info" - if l := len("ll_shards_info/"); len(elem) >= l && elem[0:l] == "ll_shards_info/" { + if l := len("masterchain_info"); len(elem) >= l && elem[0:l] == "masterchain_info" { elem = elem[l:] } else { break } - // Param: "block_id" - // Leaf parameter, slashes are prohibited - idx := strings.IndexByte(elem, '/') - if idx >= 0 { - break - } - args[0] = elem - elem = "" - if len(elem) == 0 { - // Leaf node. switch method { case "GET": - r.name = GetAllRawShardsInfoOperation + r.name = GetRawMasterchainInfoOperation r.summary = "" - r.operationID = "getAllRawShardsInfo" + r.operationID = "getRawMasterchainInfo" r.operationGroup = "" - r.pathPattern = "/v2/liteserver/get_all_shards_info/{block_id}" + r.pathPattern = "/v2/liteserver/get_masterchain_info" r.args = args - r.count = 1 + r.count = 0 return r, true default: return } } + switch elem[0] { + case '_': // Prefix: "_ext" - } + if l := len("_ext"); len(elem) >= l && elem[0:l] == "_ext" { + elem = elem[l:] + } else { + break + } - case 'b': // Prefix: "block" + if len(elem) == 0 { + // Leaf node. + switch method { + case "GET": + r.name = GetRawMasterchainInfoExtOperation + r.summary = "" + r.operationID = "getRawMasterchainInfoExt" + r.operationGroup = "" + r.pathPattern = "/v2/liteserver/get_masterchain_info_ext" + r.args = args + r.count = 0 + return r, true + default: + return + } + } - if l := len("block"); len(elem) >= l && elem[0:l] == "block" { - elem = elem[l:] - } else { - break - } + } - if len(elem) == 0 { - break - } - switch elem[0] { - case '/': // Prefix: "/" + case 'o': // Prefix: "out_msg_queue_sizes" - if l := len("/"); len(elem) >= l && elem[0:l] == "/" { + if l := len("out_msg_queue_sizes"); len(elem) >= l && elem[0:l] == "out_msg_queue_sizes" { elem = elem[l:] } else { break } - // Param: "block_id" - // Leaf parameter, slashes are prohibited - idx := strings.IndexByte(elem, '/') - if idx >= 0 { - break - } - args[0] = elem - elem = "" - if len(elem) == 0 { // Leaf node. switch method { case "GET": - r.name = GetRawBlockchainBlockOperation + r.name = GetOutMsgQueueSizesOperation r.summary = "" - r.operationID = "getRawBlockchainBlock" + r.operationID = "getOutMsgQueueSizes" r.operationGroup = "" - r.pathPattern = "/v2/liteserver/get_block/{block_id}" + r.pathPattern = "/v2/liteserver/get_out_msg_queue_sizes" r.args = args - r.count = 1 + r.count = 0 return r, true default: return } } - case '_': // Prefix: "_" + case 's': // Prefix: "s" - if l := len("_"); len(elem) >= l && elem[0:l] == "_" { + if l := len("s"); len(elem) >= l && elem[0:l] == "s" { elem = elem[l:] } else { break @@ -6438,194 +6766,127 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { break } switch elem[0] { - case 'h': // Prefix: "header/" + case 'h': // Prefix: "hard_" - if l := len("header/"); len(elem) >= l && elem[0:l] == "header/" { + if l := len("hard_"); len(elem) >= l && elem[0:l] == "hard_" { elem = elem[l:] } else { break } - // Param: "block_id" - // Leaf parameter, slashes are prohibited - idx := strings.IndexByte(elem, '/') - if idx >= 0 { - break - } - args[0] = elem - elem = "" - if len(elem) == 0 { - // Leaf node. - switch method { - case "GET": - r.name = GetRawBlockchainBlockHeaderOperation - r.summary = "" - r.operationID = "getRawBlockchainBlockHeader" - r.operationGroup = "" - r.pathPattern = "/v2/liteserver/get_block_header/{block_id}" - r.args = args - r.count = 1 - return r, true - default: - return - } - } - - case 'p': // Prefix: "proof" - - if l := len("proof"); len(elem) >= l && elem[0:l] == "proof" { - elem = elem[l:] - } else { break } + switch elem[0] { + case 'b': // Prefix: "block_proof/" - if len(elem) == 0 { - // Leaf node. - switch method { - case "GET": - r.name = GetRawBlockProofOperation - r.summary = "" - r.operationID = "getRawBlockProof" - r.operationGroup = "" - r.pathPattern = "/v2/liteserver/get_block_proof" - r.args = args - r.count = 0 - return r, true - default: - return + if l := len("block_proof/"); len(elem) >= l && elem[0:l] == "block_proof/" { + elem = elem[l:] + } else { + break } - } - - } - - } - - case 'c': // Prefix: "config_all/" - if l := len("config_all/"); len(elem) >= l && elem[0:l] == "config_all/" { - elem = elem[l:] - } else { - break - } - - // Param: "block_id" - // Leaf parameter, slashes are prohibited - idx := strings.IndexByte(elem, '/') - if idx >= 0 { - break - } - args[0] = elem - elem = "" + // Param: "block_id" + // Leaf parameter, slashes are prohibited + idx := strings.IndexByte(elem, '/') + if idx >= 0 { + break + } + args[0] = elem + elem = "" - if len(elem) == 0 { - // Leaf node. - switch method { - case "GET": - r.name = GetRawConfigOperation - r.summary = "" - r.operationID = "getRawConfig" - r.operationGroup = "" - r.pathPattern = "/v2/liteserver/get_config_all/{block_id}" - r.args = args - r.count = 1 - return r, true - default: - return - } - } + if len(elem) == 0 { + // Leaf node. + switch method { + case "GET": + r.name = GetRawShardBlockProofOperation + r.summary = "" + r.operationID = "getRawShardBlockProof" + r.operationGroup = "" + r.pathPattern = "/v2/liteserver/get_shard_block_proof/{block_id}" + r.args = args + r.count = 1 + return r, true + default: + return + } + } - case 'm': // Prefix: "masterchain_info" + case 'i': // Prefix: "info/" - if l := len("masterchain_info"); len(elem) >= l && elem[0:l] == "masterchain_info" { - elem = elem[l:] - } else { - break - } + if l := len("info/"); len(elem) >= l && elem[0:l] == "info/" { + elem = elem[l:] + } else { + break + } - if len(elem) == 0 { - switch method { - case "GET": - r.name = GetRawMasterchainInfoOperation - r.summary = "" - r.operationID = "getRawMasterchainInfo" - r.operationGroup = "" - r.pathPattern = "/v2/liteserver/get_masterchain_info" - r.args = args - r.count = 0 - return r, true - default: - return - } - } - switch elem[0] { - case '_': // Prefix: "_ext" + // Param: "block_id" + // Leaf parameter, slashes are prohibited + idx := strings.IndexByte(elem, '/') + if idx >= 0 { + break + } + args[0] = elem + elem = "" - if l := len("_ext"); len(elem) >= l && elem[0:l] == "_ext" { - elem = elem[l:] - } else { - break - } + if len(elem) == 0 { + // Leaf node. + switch method { + case "GET": + r.name = GetRawShardInfoOperation + r.summary = "" + r.operationID = "getRawShardInfo" + r.operationGroup = "" + r.pathPattern = "/v2/liteserver/get_shard_info/{block_id}" + r.args = args + r.count = 1 + return r, true + default: + return + } + } - if len(elem) == 0 { - // Leaf node. - switch method { - case "GET": - r.name = GetRawMasterchainInfoExtOperation - r.summary = "" - r.operationID = "getRawMasterchainInfoExt" - r.operationGroup = "" - r.pathPattern = "/v2/liteserver/get_masterchain_info_ext" - r.args = args - r.count = 0 - return r, true - default: - return } - } - - } - case 'o': // Prefix: "out_msg_queue_sizes" + case 't': // Prefix: "tate/" - if l := len("out_msg_queue_sizes"); len(elem) >= l && elem[0:l] == "out_msg_queue_sizes" { - elem = elem[l:] - } else { - break - } + if l := len("tate/"); len(elem) >= l && elem[0:l] == "tate/" { + elem = elem[l:] + } else { + break + } - if len(elem) == 0 { - // Leaf node. - switch method { - case "GET": - r.name = GetOutMsgQueueSizesOperation - r.summary = "" - r.operationID = "getOutMsgQueueSizes" - r.operationGroup = "" - r.pathPattern = "/v2/liteserver/get_out_msg_queue_sizes" - r.args = args - r.count = 0 - return r, true - default: - return - } - } + // Param: "block_id" + // Leaf parameter, slashes are prohibited + idx := strings.IndexByte(elem, '/') + if idx >= 0 { + break + } + args[0] = elem + elem = "" - case 's': // Prefix: "s" + if len(elem) == 0 { + // Leaf node. + switch method { + case "GET": + r.name = GetRawBlockchainBlockStateOperation + r.summary = "" + r.operationID = "getRawBlockchainBlockState" + r.operationGroup = "" + r.pathPattern = "/v2/liteserver/get_state/{block_id}" + r.args = args + r.count = 1 + return r, true + default: + return + } + } - if l := len("s"); len(elem) >= l && elem[0:l] == "s" { - elem = elem[l:] - } else { - break - } + } - if len(elem) == 0 { - break - } - switch elem[0] { - case 'h': // Prefix: "hard_" + case 't': // Prefix: "t" - if l := len("hard_"); len(elem) >= l && elem[0:l] == "hard_" { + if l := len("t"); len(elem) >= l && elem[0:l] == "t" { elem = elem[l:] } else { break @@ -6635,49 +6896,40 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { break } switch elem[0] { - case 'b': // Prefix: "block_proof/" + case 'i': // Prefix: "ime" - if l := len("block_proof/"); len(elem) >= l && elem[0:l] == "block_proof/" { + if l := len("ime"); len(elem) >= l && elem[0:l] == "ime" { elem = elem[l:] } else { break } - // Param: "block_id" - // Leaf parameter, slashes are prohibited - idx := strings.IndexByte(elem, '/') - if idx >= 0 { - break - } - args[0] = elem - elem = "" - if len(elem) == 0 { // Leaf node. switch method { case "GET": - r.name = GetRawShardBlockProofOperation + r.name = GetRawTimeOperation r.summary = "" - r.operationID = "getRawShardBlockProof" + r.operationID = "getRawTime" r.operationGroup = "" - r.pathPattern = "/v2/liteserver/get_shard_block_proof/{block_id}" + r.pathPattern = "/v2/liteserver/get_time" r.args = args - r.count = 1 + r.count = 0 return r, true default: return } } - case 'i': // Prefix: "info/" + case 'r': // Prefix: "ransactions/" - if l := len("info/"); len(elem) >= l && elem[0:l] == "info/" { + if l := len("ransactions/"); len(elem) >= l && elem[0:l] == "ransactions/" { elem = elem[l:] } else { break } - // Param: "block_id" + // Param: "account_id" // Leaf parameter, slashes are prohibited idx := strings.IndexByte(elem, '/') if idx >= 0 { @@ -6690,11 +6942,11 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { // Leaf node. switch method { case "GET": - r.name = GetRawShardInfoOperation + r.name = GetRawTransactionsOperation r.summary = "" - r.operationID = "getRawShardInfo" + r.operationID = "getRawTransactions" r.operationGroup = "" - r.pathPattern = "/v2/liteserver/get_shard_info/{block_id}" + r.pathPattern = "/v2/liteserver/get_transactions/{account_id}" r.args = args r.count = 1 return r, true @@ -6705,236 +6957,17 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { } - case 't': // Prefix: "tate/" - - if l := len("tate/"); len(elem) >= l && elem[0:l] == "tate/" { - elem = elem[l:] - } else { - break - } - - // Param: "block_id" - // Leaf parameter, slashes are prohibited - idx := strings.IndexByte(elem, '/') - if idx >= 0 { - break - } - args[0] = elem - elem = "" - - if len(elem) == 0 { - // Leaf node. - switch method { - case "GET": - r.name = GetRawBlockchainBlockStateOperation - r.summary = "" - r.operationID = "getRawBlockchainBlockState" - r.operationGroup = "" - r.pathPattern = "/v2/liteserver/get_state/{block_id}" - r.args = args - r.count = 1 - return r, true - default: - return - } - } - - } - - case 't': // Prefix: "t" - - if l := len("t"); len(elem) >= l && elem[0:l] == "t" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - break - } - switch elem[0] { - case 'i': // Prefix: "ime" - - if l := len("ime"); len(elem) >= l && elem[0:l] == "ime" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - // Leaf node. - switch method { - case "GET": - r.name = GetRawTimeOperation - r.summary = "" - r.operationID = "getRawTime" - r.operationGroup = "" - r.pathPattern = "/v2/liteserver/get_time" - r.args = args - r.count = 0 - return r, true - default: - return - } - } - - case 'r': // Prefix: "ransactions/" - - if l := len("ransactions/"); len(elem) >= l && elem[0:l] == "ransactions/" { - elem = elem[l:] - } else { - break - } - - // Param: "account_id" - // Leaf parameter, slashes are prohibited - idx := strings.IndexByte(elem, '/') - if idx >= 0 { - break - } - args[0] = elem - elem = "" - - if len(elem) == 0 { - // Leaf node. - switch method { - case "GET": - r.name = GetRawTransactionsOperation - r.summary = "" - r.operationID = "getRawTransactions" - r.operationGroup = "" - r.pathPattern = "/v2/liteserver/get_transactions/{account_id}" - r.args = args - r.count = 1 - return r, true - default: - return - } - } - - } - - } - - case 'l': // Prefix: "list_block_transactions/" - - if l := len("list_block_transactions/"); len(elem) >= l && elem[0:l] == "list_block_transactions/" { - elem = elem[l:] - } else { - break - } - - // Param: "block_id" - // Leaf parameter, slashes are prohibited - idx := strings.IndexByte(elem, '/') - if idx >= 0 { - break - } - args[0] = elem - elem = "" - - if len(elem) == 0 { - // Leaf node. - switch method { - case "GET": - r.name = GetRawListBlockTransactionsOperation - r.summary = "" - r.operationID = "getRawListBlockTransactions" - r.operationGroup = "" - r.pathPattern = "/v2/liteserver/list_block_transactions/{block_id}" - r.args = args - r.count = 1 - return r, true - default: - return - } - } - - case 's': // Prefix: "send_message" - - if l := len("send_message"); len(elem) >= l && elem[0:l] == "send_message" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - // Leaf node. - switch method { - case "POST": - r.name = SendRawMessageOperation - r.summary = "" - r.operationID = "sendRawMessage" - r.operationGroup = "" - r.pathPattern = "/v2/liteserver/send_message" - r.args = args - r.count = 0 - return r, true - default: - return - } - } - - } - - case 'm': // Prefix: "m" - - if l := len("m"); len(elem) >= l && elem[0:l] == "m" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - break - } - switch elem[0] { - case 'e': // Prefix: "essage/decode" - - if l := len("essage/decode"); len(elem) >= l && elem[0:l] == "essage/decode" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - // Leaf node. - switch method { - case "POST": - r.name = DecodeMessageOperation - r.summary = "" - r.operationID = "decodeMessage" - r.operationGroup = "" - r.pathPattern = "/v2/message/decode" - r.args = args - r.count = 0 - return r, true - default: - return } - } - - case 'u': // Prefix: "ultisig/" - if l := len("ultisig/"); len(elem) >= l && elem[0:l] == "ultisig/" { - elem = elem[l:] - } else { - break - } + case 'l': // Prefix: "list_block_transactions/" - if len(elem) == 0 { - break - } - switch elem[0] { - case 'o': // Prefix: "order/" - origElem := elem - if l := len("order/"); len(elem) >= l && elem[0:l] == "order/" { + if l := len("list_block_transactions/"); len(elem) >= l && elem[0:l] == "list_block_transactions/" { elem = elem[l:] } else { break } - // Param: "account_id" + // Param: "block_id" // Leaf parameter, slashes are prohibited idx := strings.IndexByte(elem, '/') if idx >= 0 { @@ -6947,11 +6980,11 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { // Leaf node. switch method { case "GET": - r.name = GetMultisigOrderOperation + r.name = GetRawListBlockTransactionsOperation r.summary = "" - r.operationID = "getMultisigOrder" + r.operationID = "getRawListBlockTransactions" r.operationGroup = "" - r.pathPattern = "/v2/multisig/order/{account_id}" + r.pathPattern = "/v2/liteserver/list_block_transactions/{block_id}" r.args = args r.count = 1 return r, true @@ -6960,101 +6993,73 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { } } - elem = origElem - } - // Param: "account_id" - // Leaf parameter, slashes are prohibited - idx := strings.IndexByte(elem, '/') - if idx >= 0 { - break - } - args[0] = elem - elem = "" + case 's': // Prefix: "send_message" - if len(elem) == 0 { - // Leaf node. - switch method { - case "GET": - r.name = GetMultisigAccountOperation - r.summary = "" - r.operationID = "getMultisigAccount" - r.operationGroup = "" - r.pathPattern = "/v2/multisig/{account_id}" - r.args = args - r.count = 1 - return r, true - default: - return + if l := len("send_message"); len(elem) >= l && elem[0:l] == "send_message" { + elem = elem[l:] + } else { + break } - } - } + if len(elem) == 0 { + // Leaf node. + switch method { + case "POST": + r.name = SendRawMessageOperation + r.summary = "" + r.operationID = "sendRawMessage" + r.operationGroup = "" + r.pathPattern = "/v2/liteserver/send_message" + r.args = args + r.count = 0 + return r, true + default: + return + } + } - case 'n': // Prefix: "nfts/" + } - if l := len("nfts/"); len(elem) >= l && elem[0:l] == "nfts/" { - elem = elem[l:] - } else { - break - } + case 'm': // Prefix: "m" - if len(elem) == 0 { - break - } - switch elem[0] { - case '_': // Prefix: "_bulk" - origElem := elem - if l := len("_bulk"); len(elem) >= l && elem[0:l] == "_bulk" { + if l := len("m"); len(elem) >= l && elem[0:l] == "m" { elem = elem[l:] } else { break } if len(elem) == 0 { - // Leaf node. - switch method { - case "POST": - r.name = GetNftItemsByAddressesOperation - r.summary = "" - r.operationID = "getNftItemsByAddresses" - r.operationGroup = "" - r.pathPattern = "/v2/nfts/_bulk" - r.args = args - r.count = 0 - return r, true - default: - return - } - } - - elem = origElem - case 'c': // Prefix: "collections" - origElem := elem - if l := len("collections"); len(elem) >= l && elem[0:l] == "collections" { - elem = elem[l:] - } else { break } + switch elem[0] { + case 'e': // Prefix: "essage/decode" - if len(elem) == 0 { - switch method { - case "GET": - r.name = GetNftCollectionsOperation - r.summary = "" - r.operationID = "getNftCollections" - r.operationGroup = "" - r.pathPattern = "/v2/nfts/collections" - r.args = args - r.count = 0 - return r, true - default: - return + if l := len("essage/decode"); len(elem) >= l && elem[0:l] == "essage/decode" { + elem = elem[l:] + } else { + break } - } - switch elem[0] { - case '/': // Prefix: "/" - if l := len("/"); len(elem) >= l && elem[0:l] == "/" { + if len(elem) == 0 { + // Leaf node. + switch method { + case "POST": + r.name = DecodeMessageOperation + r.summary = "" + r.operationID = "decodeMessage" + r.operationGroup = "" + r.pathPattern = "/v2/message/decode" + r.args = args + r.count = 0 + return r, true + default: + return + } + } + + case 'u': // Prefix: "ultisig/" + + if l := len("ultisig/"); len(elem) >= l && elem[0:l] == "ultisig/" { elem = elem[l:] } else { break @@ -7064,25 +7069,34 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { break } switch elem[0] { - case '_': // Prefix: "_bulk" + case 'o': // Prefix: "order/" origElem := elem - if l := len("_bulk"); len(elem) >= l && elem[0:l] == "_bulk" { + if l := len("order/"); len(elem) >= l && elem[0:l] == "order/" { elem = elem[l:] } else { break } + // Param: "account_id" + // Leaf parameter, slashes are prohibited + idx := strings.IndexByte(elem, '/') + if idx >= 0 { + break + } + args[0] = elem + elem = "" + if len(elem) == 0 { // Leaf node. switch method { - case "POST": - r.name = GetNftCollectionItemsByAddressesOperation + case "GET": + r.name = GetMultisigOrderOperation r.summary = "" - r.operationID = "getNftCollectionItemsByAddresses" + r.operationID = "getMultisigOrder" r.operationGroup = "" - r.pathPattern = "/v2/nfts/collections/_bulk" + r.pathPattern = "/v2/multisig/order/{account_id}" r.args = args - r.count = 0 + r.count = 1 return r, true default: return @@ -7092,22 +7106,23 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { elem = origElem } // Param: "account_id" - // Match until "/" + // Leaf parameter, slashes are prohibited idx := strings.IndexByte(elem, '/') - if idx < 0 { - idx = len(elem) + if idx >= 0 { + break } - args[0] = elem[:idx] - elem = elem[idx:] + args[0] = elem + elem = "" if len(elem) == 0 { + // Leaf node. switch method { case "GET": - r.name = GetNftCollectionOperation + r.name = GetMultisigAccountOperation r.summary = "" - r.operationID = "getNftCollection" + r.operationID = "getMultisigAccount" r.operationGroup = "" - r.pathPattern = "/v2/nfts/collections/{account_id}" + r.pathPattern = "/v2/multisig/{account_id}" r.args = args r.count = 1 return r, true @@ -7115,195 +7130,63 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { return } } - switch elem[0] { - case '/': // Prefix: "/items" - - if l := len("/items"); len(elem) >= l && elem[0:l] == "/items" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - // Leaf node. - switch method { - case "GET": - r.name = GetItemsFromCollectionOperation - r.summary = "" - r.operationID = "getItemsFromCollection" - r.operationGroup = "" - r.pathPattern = "/v2/nfts/collections/{account_id}/items" - r.args = args - r.count = 1 - return r, true - default: - return - } - } - - } - - } - - elem = origElem - } - // Param: "account_id" - // Match until "/" - idx := strings.IndexByte(elem, '/') - if idx < 0 { - idx = len(elem) - } - args[0] = elem[:idx] - elem = elem[idx:] - - if len(elem) == 0 { - switch method { - case "GET": - r.name = GetNftItemByAddressOperation - r.summary = "" - r.operationID = "getNftItemByAddress" - r.operationGroup = "" - r.pathPattern = "/v2/nfts/{account_id}" - r.args = args - r.count = 1 - return r, true - default: - return - } - } - switch elem[0] { - case '/': // Prefix: "/history" - - if l := len("/history"); len(elem) >= l && elem[0:l] == "/history" { - elem = elem[l:] - } else { - break - } - if len(elem) == 0 { - // Leaf node. - switch method { - case "GET": - r.name = GetNftHistoryByIDOperation - r.summary = "" - r.operationID = "getNftHistoryByID" - r.operationGroup = "" - r.pathPattern = "/v2/nfts/{account_id}/history" - r.args = args - r.count = 1 - return r, true - default: - return - } } - } - - case 'o': // Prefix: "openapi." - - if l := len("openapi."); len(elem) >= l && elem[0:l] == "openapi." { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - break - } - switch elem[0] { - case 'j': // Prefix: "json" + case 'n': // Prefix: "nfts/" - if l := len("json"); len(elem) >= l && elem[0:l] == "json" { + if l := len("nfts/"); len(elem) >= l && elem[0:l] == "nfts/" { elem = elem[l:] } else { break } if len(elem) == 0 { - // Leaf node. - switch method { - case "GET": - r.name = GetOpenapiJsonOperation - r.summary = "" - r.operationID = "getOpenapiJson" - r.operationGroup = "" - r.pathPattern = "/v2/openapi.json" - r.args = args - r.count = 0 - return r, true - default: - return - } - } - - case 'y': // Prefix: "yml" - - if l := len("yml"); len(elem) >= l && elem[0:l] == "yml" { - elem = elem[l:] - } else { break } - - if len(elem) == 0 { - // Leaf node. - switch method { - case "GET": - r.name = GetOpenapiYmlOperation - r.summary = "" - r.operationID = "getOpenapiYml" - r.operationGroup = "" - r.pathPattern = "/v2/openapi.yml" - r.args = args - r.count = 0 - return r, true - default: - return + switch elem[0] { + case '_': // Prefix: "_bulk" + origElem := elem + if l := len("_bulk"); len(elem) >= l && elem[0:l] == "_bulk" { + elem = elem[l:] + } else { + break } - } - - } - - case 'p': // Prefix: "pu" - - if l := len("pu"); len(elem) >= l && elem[0:l] == "pu" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - break - } - switch elem[0] { - case 'b': // Prefix: "bkeys/" - if l := len("bkeys/"); len(elem) >= l && elem[0:l] == "bkeys/" { - elem = elem[l:] - } else { - break - } + if len(elem) == 0 { + // Leaf node. + switch method { + case "POST": + r.name = GetNftItemsByAddressesOperation + r.summary = "" + r.operationID = "getNftItemsByAddresses" + r.operationGroup = "" + r.pathPattern = "/v2/nfts/_bulk" + r.args = args + r.count = 0 + return r, true + default: + return + } + } - if len(elem) == 0 { - break - } - switch elem[0] { - case 'w': // Prefix: "wallets/_bulk" + elem = origElem + case 'c': // Prefix: "collections" origElem := elem - if l := len("wallets/_bulk"); len(elem) >= l && elem[0:l] == "wallets/_bulk" { + if l := len("collections"); len(elem) >= l && elem[0:l] == "collections" { elem = elem[l:] } else { break } if len(elem) == 0 { - // Leaf node. switch method { - case "POST": - r.name = GetWalletsByPublicKeyBulkOperation + case "GET": + r.name = GetNftCollectionsOperation r.summary = "" - r.operationID = "getWalletsByPublicKeyBulk" + r.operationID = "getNftCollections" r.operationGroup = "" - r.pathPattern = "/v2/pubkeys/wallets/_bulk" + r.pathPattern = "/v2/nfts/collections" r.args = args r.count = 0 return r, true @@ -7311,10 +7194,103 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { return } } + switch elem[0] { + case '/': // Prefix: "/" + + if l := len("/"); len(elem) >= l && elem[0:l] == "/" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + break + } + switch elem[0] { + case '_': // Prefix: "_bulk" + origElem := elem + if l := len("_bulk"); len(elem) >= l && elem[0:l] == "_bulk" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch method { + case "POST": + r.name = GetNftCollectionItemsByAddressesOperation + r.summary = "" + r.operationID = "getNftCollectionItemsByAddresses" + r.operationGroup = "" + r.pathPattern = "/v2/nfts/collections/_bulk" + r.args = args + r.count = 0 + return r, true + default: + return + } + } + + elem = origElem + } + // Param: "account_id" + // Match until "/" + idx := strings.IndexByte(elem, '/') + if idx < 0 { + idx = len(elem) + } + args[0] = elem[:idx] + elem = elem[idx:] + + if len(elem) == 0 { + switch method { + case "GET": + r.name = GetNftCollectionOperation + r.summary = "" + r.operationID = "getNftCollection" + r.operationGroup = "" + r.pathPattern = "/v2/nfts/collections/{account_id}" + r.args = args + r.count = 1 + return r, true + default: + return + } + } + switch elem[0] { + case '/': // Prefix: "/items" + + if l := len("/items"); len(elem) >= l && elem[0:l] == "/items" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch method { + case "GET": + r.name = GetItemsFromCollectionOperation + r.summary = "" + r.operationID = "getItemsFromCollection" + r.operationGroup = "" + r.pathPattern = "/v2/nfts/collections/{account_id}/items" + r.args = args + r.count = 1 + return r, true + default: + return + } + } + + } + + } elem = origElem } - // Param: "public_key" + // Param: "account_id" // Match until "/" idx := strings.IndexByte(elem, '/') if idx < 0 { @@ -7324,12 +7300,24 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { elem = elem[idx:] if len(elem) == 0 { - break + switch method { + case "GET": + r.name = GetNftItemByAddressOperation + r.summary = "" + r.operationID = "getNftItemByAddress" + r.operationGroup = "" + r.pathPattern = "/v2/nfts/{account_id}" + r.args = args + r.count = 1 + return r, true + default: + return + } } switch elem[0] { - case '/': // Prefix: "/wallets" + case '/': // Prefix: "/history" - if l := len("/wallets"); len(elem) >= l && elem[0:l] == "/wallets" { + if l := len("/history"); len(elem) >= l && elem[0:l] == "/history" { elem = elem[l:] } else { break @@ -7339,11 +7327,11 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { // Leaf node. switch method { case "GET": - r.name = GetWalletsByPublicKeyOperation + r.name = GetNftHistoryByIDOperation r.summary = "" - r.operationID = "getWalletsByPublicKey" + r.operationID = "getNftHistoryByID" r.operationGroup = "" - r.pathPattern = "/v2/pubkeys/{public_key}/wallets" + r.pathPattern = "/v2/nfts/{account_id}/history" r.args = args r.count = 1 return r, true @@ -7354,30 +7342,21 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { } - case 'r': // Prefix: "rchases/" + case 'o': // Prefix: "openapi." - if l := len("rchases/"); len(elem) >= l && elem[0:l] == "rchases/" { + if l := len("openapi."); len(elem) >= l && elem[0:l] == "openapi." { elem = elem[l:] } else { break } - // Param: "account_id" - // Match until "/" - idx := strings.IndexByte(elem, '/') - if idx < 0 { - idx = len(elem) - } - args[0] = elem[:idx] - elem = elem[idx:] - if len(elem) == 0 { break } switch elem[0] { - case '/': // Prefix: "/history" + case 'j': // Prefix: "json" - if l := len("/history"); len(elem) >= l && elem[0:l] == "/history" { + if l := len("json"); len(elem) >= l && elem[0:l] == "json" { elem = elem[l:] } else { break @@ -7387,62 +7366,61 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { // Leaf node. switch method { case "GET": - r.name = GetPurchaseHistoryOperation + r.name = GetOpenapiJsonOperation r.summary = "" - r.operationID = "getPurchaseHistory" + r.operationID = "getOpenapiJson" r.operationGroup = "" - r.pathPattern = "/v2/purchases/{account_id}/history" + r.pathPattern = "/v2/openapi.json" r.args = args - r.count = 1 + r.count = 0 return r, true default: return } } - } + case 'y': // Prefix: "yml" - } + if l := len("yml"); len(elem) >= l && elem[0:l] == "yml" { + elem = elem[l:] + } else { + break + } - case 'r': // Prefix: "r" + if len(elem) == 0 { + // Leaf node. + switch method { + case "GET": + r.name = GetOpenapiYmlOperation + r.summary = "" + r.operationID = "getOpenapiYml" + r.operationGroup = "" + r.pathPattern = "/v2/openapi.yml" + r.args = args + r.count = 0 + return r, true + default: + return + } + } - if l := len("r"); len(elem) >= l && elem[0:l] == "r" { - elem = elem[l:] - } else { - break - } + } - if len(elem) == 0 { - break - } - switch elem[0] { - case 'a': // Prefix: "ates" + case 'p': // Prefix: "pu" - if l := len("ates"); len(elem) >= l && elem[0:l] == "ates" { + if l := len("pu"); len(elem) >= l && elem[0:l] == "pu" { elem = elem[l:] } else { break } if len(elem) == 0 { - switch method { - case "GET": - r.name = GetRatesOperation - r.summary = "" - r.operationID = "getRates" - r.operationGroup = "" - r.pathPattern = "/v2/rates" - r.args = args - r.count = 0 - return r, true - default: - return - } + break } switch elem[0] { - case '/': // Prefix: "/" + case 'b': // Prefix: "bkeys/" - if l := len("/"); len(elem) >= l && elem[0:l] == "/" { + if l := len("bkeys/"); len(elem) >= l && elem[0:l] == "bkeys/" { elem = elem[l:] } else { break @@ -7452,9 +7430,49 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { break } switch elem[0] { - case 'c': // Prefix: "chart" + case 'w': // Prefix: "wallets/_bulk" + origElem := elem + if l := len("wallets/_bulk"); len(elem) >= l && elem[0:l] == "wallets/_bulk" { + elem = elem[l:] + } else { + break + } - if l := len("chart"); len(elem) >= l && elem[0:l] == "chart" { + if len(elem) == 0 { + // Leaf node. + switch method { + case "POST": + r.name = GetWalletsByPublicKeyBulkOperation + r.summary = "" + r.operationID = "getWalletsByPublicKeyBulk" + r.operationGroup = "" + r.pathPattern = "/v2/pubkeys/wallets/_bulk" + r.args = args + r.count = 0 + return r, true + default: + return + } + } + + elem = origElem + } + // Param: "public_key" + // Match until "/" + idx := strings.IndexByte(elem, '/') + if idx < 0 { + idx = len(elem) + } + args[0] = elem[:idx] + elem = elem[idx:] + + if len(elem) == 0 { + break + } + switch elem[0] { + case '/': // Prefix: "/wallets" + + if l := len("/wallets"); len(elem) >= l && elem[0:l] == "/wallets" { elem = elem[l:] } else { break @@ -7464,22 +7482,45 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { // Leaf node. switch method { case "GET": - r.name = GetChartRatesOperation + r.name = GetWalletsByPublicKeyOperation r.summary = "" - r.operationID = "getChartRates" + r.operationID = "getWalletsByPublicKey" r.operationGroup = "" - r.pathPattern = "/v2/rates/chart" + r.pathPattern = "/v2/pubkeys/{public_key}/wallets" r.args = args - r.count = 0 + r.count = 1 return r, true default: return } } - case 'm': // Prefix: "markets" + } - if l := len("markets"); len(elem) >= l && elem[0:l] == "markets" { + case 'r': // Prefix: "rchases/" + + if l := len("rchases/"); len(elem) >= l && elem[0:l] == "rchases/" { + elem = elem[l:] + } else { + break + } + + // Param: "account_id" + // Match until "/" + idx := strings.IndexByte(elem, '/') + if idx < 0 { + idx = len(elem) + } + args[0] = elem[:idx] + elem = elem[idx:] + + if len(elem) == 0 { + break + } + switch elem[0] { + case '/': // Prefix: "/history" + + if l := len("/history"); len(elem) >= l && elem[0:l] == "/history" { elem = elem[l:] } else { break @@ -7489,13 +7530,13 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { // Leaf node. switch method { case "GET": - r.name = GetMarketsRatesOperation + r.name = GetPurchaseHistoryOperation r.summary = "" - r.operationID = "getMarketsRates" + r.operationID = "getPurchaseHistory" r.operationGroup = "" - r.pathPattern = "/v2/rates/markets" + r.pathPattern = "/v2/purchases/{account_id}/history" r.args = args - r.count = 0 + r.count = 1 return r, true default: return @@ -7506,46 +7547,33 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { } - case 'e': // Prefix: "ewards/" + case 'r': // Prefix: "rates" - if l := len("ewards/"); len(elem) >= l && elem[0:l] == "ewards/" { + if l := len("rates"); len(elem) >= l && elem[0:l] == "rates" { elem = elem[l:] } else { break } if len(elem) == 0 { - break - } - switch elem[0] { - case 'r': // Prefix: "round-rewards" - - if l := len("round-rewards"); len(elem) >= l && elem[0:l] == "round-rewards" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - // Leaf node. - switch method { - case "GET": - r.name = GetRoundRewardsOperation - r.summary = "Get per-validator reward distribution for a finished round" - r.operationID = "getRoundRewards" - r.operationGroup = "" - r.pathPattern = "/v2/rewards/round-rewards" - r.args = args - r.count = 0 - return r, true - default: - return - } + switch method { + case "GET": + r.name = GetRatesOperation + r.summary = "" + r.operationID = "getRates" + r.operationGroup = "" + r.pathPattern = "/v2/rates" + r.args = args + r.count = 0 + return r, true + default: + return } + } + switch elem[0] { + case '/': // Prefix: "/" - case 'v': // Prefix: "validat" - - if l := len("validat"); len(elem) >= l && elem[0:l] == "validat" { + if l := len("/"); len(elem) >= l && elem[0:l] == "/" { elem = elem[l:] } else { break @@ -7555,9 +7583,9 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { break } switch elem[0] { - case 'i': // Prefix: "ion-rounds" + case 'c': // Prefix: "chart" - if l := len("ion-rounds"); len(elem) >= l && elem[0:l] == "ion-rounds" { + if l := len("chart"); len(elem) >= l && elem[0:l] == "chart" { elem = elem[l:] } else { break @@ -7567,11 +7595,11 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { // Leaf node. switch method { case "GET": - r.name = GetValidationRoundsOperation - r.summary = "Get validation round metadata" - r.operationID = "getValidationRounds" + r.name = GetChartRatesOperation + r.summary = "" + r.operationID = "getChartRates" r.operationGroup = "" - r.pathPattern = "/v2/rewards/validation-rounds" + r.pathPattern = "/v2/rates/chart" r.args = args r.count = 0 return r, true @@ -7580,9 +7608,9 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { } } - case 'o': // Prefix: "ors" + case 'm': // Prefix: "markets" - if l := len("ors"); len(elem) >= l && elem[0:l] == "ors" { + if l := len("markets"); len(elem) >= l && elem[0:l] == "markets" { elem = elem[l:] } else { break @@ -7592,11 +7620,11 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { // Leaf node. switch method { case "GET": - r.name = GetValidatorsOperation - r.summary = "Get all current validators" - r.operationID = "getValidators" + r.name = GetMarketsRatesOperation + r.summary = "" + r.operationID = "getMarketsRates" r.operationGroup = "" - r.pathPattern = "/v2/rewards/validators" + r.pathPattern = "/v2/rates/markets" r.args = args r.count = 0 return r, true @@ -7609,23 +7637,9 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { } - } - - case 's': // Prefix: "st" - - if l := len("st"); len(elem) >= l && elem[0:l] == "st" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - break - } - switch elem[0] { - case 'a': // Prefix: "a" + case 's': // Prefix: "st" - if l := len("a"); len(elem) >= l && elem[0:l] == "a" { + if l := len("st"); len(elem) >= l && elem[0:l] == "st" { elem = elem[l:] } else { break @@ -7635,9 +7649,9 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { break } switch elem[0] { - case 'k': // Prefix: "king/" + case 'a': // Prefix: "a" - if l := len("king/"); len(elem) >= l && elem[0:l] == "king/" { + if l := len("a"); len(elem) >= l && elem[0:l] == "a" { elem = elem[l:] } else { break @@ -7647,57 +7661,9 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { break } switch elem[0] { - case 'n': // Prefix: "nominator/" - - if l := len("nominator/"); len(elem) >= l && elem[0:l] == "nominator/" { - elem = elem[l:] - } else { - break - } - - // Param: "account_id" - // Match until "/" - idx := strings.IndexByte(elem, '/') - if idx < 0 { - idx = len(elem) - } - args[0] = elem[:idx] - elem = elem[idx:] - - if len(elem) == 0 { - break - } - switch elem[0] { - case '/': // Prefix: "/pools" - - if l := len("/pools"); len(elem) >= l && elem[0:l] == "/pools" { - elem = elem[l:] - } else { - break - } + case 'k': // Prefix: "king/" - if len(elem) == 0 { - // Leaf node. - switch method { - case "GET": - r.name = GetAccountNominatorsPoolsOperation - r.summary = "" - r.operationID = "getAccountNominatorsPools" - r.operationGroup = "" - r.pathPattern = "/v2/staking/nominator/{account_id}/pools" - r.args = args - r.count = 1 - return r, true - default: - return - } - } - - } - - case 'p': // Prefix: "pool" - - if l := len("pool"); len(elem) >= l && elem[0:l] == "pool" { + if l := len("king/"); len(elem) >= l && elem[0:l] == "king/" { elem = elem[l:] } else { break @@ -7707,9 +7673,9 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { break } switch elem[0] { - case '/': // Prefix: "/" + case 'n': // Prefix: "nominator/" - if l := len("/"); len(elem) >= l && elem[0:l] == "/" { + if l := len("nominator/"); len(elem) >= l && elem[0:l] == "nominator/" { elem = elem[l:] } else { break @@ -7725,24 +7691,12 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { elem = elem[idx:] if len(elem) == 0 { - switch method { - case "GET": - r.name = GetStakingPoolInfoOperation - r.summary = "" - r.operationID = "getStakingPoolInfo" - r.operationGroup = "" - r.pathPattern = "/v2/staking/pool/{account_id}" - r.args = args - r.count = 1 - return r, true - default: - return - } + break } switch elem[0] { - case '/': // Prefix: "/history" + case '/': // Prefix: "/pools" - if l := len("/history"); len(elem) >= l && elem[0:l] == "/history" { + if l := len("/pools"); len(elem) >= l && elem[0:l] == "/pools" { elem = elem[l:] } else { break @@ -7752,11 +7706,11 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { // Leaf node. switch method { case "GET": - r.name = GetStakingPoolHistoryOperation + r.name = GetAccountNominatorsPoolsOperation r.summary = "" - r.operationID = "getStakingPoolHistory" + r.operationID = "getAccountNominatorsPools" r.operationGroup = "" - r.pathPattern = "/v2/staking/pool/{account_id}/history" + r.pathPattern = "/v2/staking/nominator/{account_id}/pools" r.args = args r.count = 1 return r, true @@ -7767,54 +7721,296 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { } - case 's': // Prefix: "s" + case 'p': // Prefix: "pool" - if l := len("s"); len(elem) >= l && elem[0:l] == "s" { + if l := len("pool"); len(elem) >= l && elem[0:l] == "pool" { elem = elem[l:] } else { break } if len(elem) == 0 { - // Leaf node. - switch method { - case "GET": - r.name = GetStakingPoolsOperation - r.summary = "" - r.operationID = "getStakingPools" - r.operationGroup = "" - r.pathPattern = "/v2/staking/pools" - r.args = args - r.count = 0 - return r, true - default: - return + break + } + switch elem[0] { + case '/': // Prefix: "/" + + if l := len("/"); len(elem) >= l && elem[0:l] == "/" { + elem = elem[l:] + } else { + break + } + + // Param: "account_id" + // Match until "/" + idx := strings.IndexByte(elem, '/') + if idx < 0 { + idx = len(elem) + } + args[0] = elem[:idx] + elem = elem[idx:] + + if len(elem) == 0 { + switch method { + case "GET": + r.name = GetStakingPoolInfoOperation + r.summary = "" + r.operationID = "getStakingPoolInfo" + r.operationGroup = "" + r.pathPattern = "/v2/staking/pool/{account_id}" + r.args = args + r.count = 1 + return r, true + default: + return + } + } + switch elem[0] { + case '/': // Prefix: "/history" + + if l := len("/history"); len(elem) >= l && elem[0:l] == "/history" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch method { + case "GET": + r.name = GetStakingPoolHistoryOperation + r.summary = "" + r.operationID = "getStakingPoolHistory" + r.operationGroup = "" + r.pathPattern = "/v2/staking/pool/{account_id}/history" + r.args = args + r.count = 1 + return r, true + default: + return + } + } + + } + + case 's': // Prefix: "s" + + if l := len("s"); len(elem) >= l && elem[0:l] == "s" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch method { + case "GET": + r.name = GetStakingPoolsOperation + r.summary = "" + r.operationID = "getStakingPools" + r.operationGroup = "" + r.pathPattern = "/v2/staking/pools" + r.args = args + r.count = 0 + return r, true + default: + return + } } + + } + + } + + case 't': // Prefix: "tus" + + if l := len("tus"); len(elem) >= l && elem[0:l] == "tus" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch method { + case "GET": + r.name = StatusOperation + r.summary = "" + r.operationID = "status" + r.operationGroup = "" + r.pathPattern = "/v2/status" + r.args = args + r.count = 0 + return r, true + default: + return + } + } + + } + + case 'o': // Prefix: "orage/providers" + + if l := len("orage/providers"); len(elem) >= l && elem[0:l] == "orage/providers" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch method { + case "GET": + r.name = GetStorageProvidersOperation + r.summary = "" + r.operationID = "getStorageProviders" + r.operationGroup = "" + r.pathPattern = "/v2/storage/providers" + r.args = args + r.count = 0 + return r, true + default: + return + } + } + + } + + case 't': // Prefix: "t" + + if l := len("t"); len(elem) >= l && elem[0:l] == "t" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + break + } + switch elem[0] { + case 'o': // Prefix: "onconnect/" + + if l := len("onconnect/"); len(elem) >= l && elem[0:l] == "onconnect/" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + break + } + switch elem[0] { + case 'p': // Prefix: "payload" + + if l := len("payload"); len(elem) >= l && elem[0:l] == "payload" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch method { + case "GET": + r.name = GetTonConnectPayloadOperation + r.summary = "" + r.operationID = "getTonConnectPayload" + r.operationGroup = "" + r.pathPattern = "/v2/tonconnect/payload" + r.args = args + r.count = 0 + return r, true + default: + return } + } + + case 's': // Prefix: "stateinit" + + if l := len("stateinit"); len(elem) >= l && elem[0:l] == "stateinit" { + elem = elem[l:] + } else { + break + } + if len(elem) == 0 { + // Leaf node. + switch method { + case "POST": + r.name = GetAccountInfoByStateInitOperation + r.summary = "" + r.operationID = "getAccountInfoByStateInit" + r.operationGroup = "" + r.pathPattern = "/v2/tonconnect/stateinit" + r.args = args + r.count = 0 + return r, true + default: + return + } } } - case 't': // Prefix: "tus" + case 'r': // Prefix: "races/" - if l := len("tus"); len(elem) >= l && elem[0:l] == "tus" { + if l := len("races/"); len(elem) >= l && elem[0:l] == "races/" { elem = elem[l:] } else { break } + if len(elem) == 0 { + break + } + switch elem[0] { + case 'e': // Prefix: "emulate" + origElem := elem + if l := len("emulate"); len(elem) >= l && elem[0:l] == "emulate" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch method { + case "POST": + r.name = EmulateMessageToTraceOperation + r.summary = "" + r.operationID = "emulateMessageToTrace" + r.operationGroup = "" + r.pathPattern = "/v2/traces/emulate" + r.args = args + r.count = 0 + return r, true + default: + return + } + } + + elem = origElem + } + // Param: "trace_id" + // Leaf parameter, slashes are prohibited + idx := strings.IndexByte(elem, '/') + if idx >= 0 { + break + } + args[0] = elem + elem = "" + if len(elem) == 0 { // Leaf node. switch method { case "GET": - r.name = StatusOperation + r.name = GetTraceOperation r.summary = "" - r.operationID = "status" + r.operationID = "getTrace" r.operationGroup = "" - r.pathPattern = "/v2/status" + r.pathPattern = "/v2/traces/{trace_id}" r.args = args - r.count = 0 + r.count = 1 return r, true default: return @@ -7823,60 +8019,85 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { } - case 'o': // Prefix: "orage/providers" + case 'v': // Prefix: "validation/" - if l := len("orage/providers"); len(elem) >= l && elem[0:l] == "orage/providers" { + if l := len("validation/"); len(elem) >= l && elem[0:l] == "validation/" { elem = elem[l:] } else { break } if len(elem) == 0 { - // Leaf node. - switch method { - case "GET": - r.name = GetStorageProvidersOperation - r.summary = "" - r.operationID = "getStorageProviders" - r.operationGroup = "" - r.pathPattern = "/v2/storage/providers" - r.args = args - r.count = 0 - return r, true - default: - return - } + break } + switch elem[0] { + case 'r': // Prefix: "r" - } + if l := len("r"); len(elem) >= l && elem[0:l] == "r" { + elem = elem[l:] + } else { + break + } - case 't': // Prefix: "t" + if len(elem) == 0 { + break + } + switch elem[0] { + case 'e': // Prefix: "ewards" - if l := len("t"); len(elem) >= l && elem[0:l] == "t" { - elem = elem[l:] - } else { - break - } + if l := len("ewards"); len(elem) >= l && elem[0:l] == "ewards" { + elem = elem[l:] + } else { + break + } - if len(elem) == 0 { - break - } - switch elem[0] { - case 'o': // Prefix: "onconnect/" + if len(elem) == 0 { + // Leaf node. + switch method { + case "GET": + r.name = GetRoundRewardsOperation + r.summary = "Get per-validator reward distribution for a finished round" + r.operationID = "getRoundRewards" + r.operationGroup = "" + r.pathPattern = "/v2/validation/rewards" + r.args = args + r.count = 0 + return r, true + default: + return + } + } - if l := len("onconnect/"); len(elem) >= l && elem[0:l] == "onconnect/" { - elem = elem[l:] - } else { - break - } + case 'o': // Prefix: "ounds" - if len(elem) == 0 { - break - } - switch elem[0] { - case 'p': // Prefix: "payload" + if l := len("ounds"); len(elem) >= l && elem[0:l] == "ounds" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch method { + case "GET": + r.name = GetValidationRoundsOperation + r.summary = "Get validation round metadata" + r.operationID = "getValidationRounds" + r.operationGroup = "" + r.pathPattern = "/v2/validation/rounds" + r.args = args + r.count = 0 + return r, true + default: + return + } + } + + } + + case 'v': // Prefix: "validators" - if l := len("payload"); len(elem) >= l && elem[0:l] == "payload" { + if l := len("validators"); len(elem) >= l && elem[0:l] == "validators" { elem = elem[l:] } else { break @@ -7886,11 +8107,11 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { // Leaf node. switch method { case "GET": - r.name = GetTonConnectPayloadOperation - r.summary = "" - r.operationID = "getTonConnectPayload" + r.name = GetValidatorsOperation + r.summary = "Get all current validators" + r.operationID = "getValidators" r.operationGroup = "" - r.pathPattern = "/v2/tonconnect/payload" + r.pathPattern = "/v2/validation/validators" r.args = args r.count = 0 return r, true @@ -7899,9 +8120,23 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { } } - case 's': // Prefix: "stateinit" + } + + case 'w': // Prefix: "wallet/" + + if l := len("wallet/"); len(elem) >= l && elem[0:l] == "wallet/" { + elem = elem[l:] + } else { + break + } - if l := len("stateinit"); len(elem) >= l && elem[0:l] == "stateinit" { + if len(elem) == 0 { + break + } + switch elem[0] { + case 'a': // Prefix: "auth/proof" + origElem := elem + if l := len("auth/proof"); len(elem) >= l && elem[0:l] == "auth/proof" { elem = elem[l:] } else { break @@ -7911,11 +8146,11 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { // Leaf node. switch method { case "POST": - r.name = GetAccountInfoByStateInitOperation + r.name = TonConnectProofOperation r.summary = "" - r.operationID = "getAccountInfoByStateInit" + r.operationID = "tonConnectProof" r.operationGroup = "" - r.pathPattern = "/v2/tonconnect/stateinit" + r.pathPattern = "/v2/wallet/auth/proof" r.args = args r.count = 0 return r, true @@ -7924,20 +8159,7 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { } } - } - - case 'r': // Prefix: "races/" - - if l := len("races/"); len(elem) >= l && elem[0:l] == "races/" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - break - } - switch elem[0] { + elem = origElem case 'e': // Prefix: "emulate" origElem := elem if l := len("emulate"); len(elem) >= l && elem[0:l] == "emulate" { @@ -7950,11 +8172,11 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { // Leaf node. switch method { case "POST": - r.name = EmulateMessageToTraceOperation + r.name = EmulateMessageToWalletOperation r.summary = "" - r.operationID = "emulateMessageToTrace" + r.operationID = "emulateMessageToWallet" r.operationGroup = "" - r.pathPattern = "/v2/traces/emulate" + r.pathPattern = "/v2/wallet/emulate" r.args = args r.count = 0 return r, true @@ -7965,24 +8187,23 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { elem = origElem } - // Param: "trace_id" - // Leaf parameter, slashes are prohibited + // Param: "account_id" + // Match until "/" idx := strings.IndexByte(elem, '/') - if idx >= 0 { - break + if idx < 0 { + idx = len(elem) } - args[0] = elem - elem = "" + args[0] = elem[:idx] + elem = elem[idx:] if len(elem) == 0 { - // Leaf node. switch method { case "GET": - r.name = GetTraceOperation + r.name = GetWalletInfoOperation r.summary = "" - r.operationID = "getTrace" + r.operationID = "getWalletInfo" r.operationGroup = "" - r.pathPattern = "/v2/traces/{trace_id}" + r.pathPattern = "/v2/wallet/{account_id}" r.args = args r.count = 1 return r, true @@ -7990,122 +8211,32 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { return } } + switch elem[0] { + case '/': // Prefix: "/seqno" - } - - case 'w': // Prefix: "wallet/" - - if l := len("wallet/"); len(elem) >= l && elem[0:l] == "wallet/" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - break - } - switch elem[0] { - case 'a': // Prefix: "auth/proof" - origElem := elem - if l := len("auth/proof"); len(elem) >= l && elem[0:l] == "auth/proof" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - // Leaf node. - switch method { - case "POST": - r.name = TonConnectProofOperation - r.summary = "" - r.operationID = "tonConnectProof" - r.operationGroup = "" - r.pathPattern = "/v2/wallet/auth/proof" - r.args = args - r.count = 0 - return r, true - default: - return + if l := len("/seqno"); len(elem) >= l && elem[0:l] == "/seqno" { + elem = elem[l:] + } else { + break } - } - - elem = origElem - case 'e': // Prefix: "emulate" - origElem := elem - if l := len("emulate"); len(elem) >= l && elem[0:l] == "emulate" { - elem = elem[l:] - } else { - break - } - if len(elem) == 0 { - // Leaf node. - switch method { - case "POST": - r.name = EmulateMessageToWalletOperation - r.summary = "" - r.operationID = "emulateMessageToWallet" - r.operationGroup = "" - r.pathPattern = "/v2/wallet/emulate" - r.args = args - r.count = 0 - return r, true - default: - return + if len(elem) == 0 { + // Leaf node. + switch method { + case "GET": + r.name = GetAccountSeqnoOperation + r.summary = "" + r.operationID = "getAccountSeqno" + r.operationGroup = "" + r.pathPattern = "/v2/wallet/{account_id}/seqno" + r.args = args + r.count = 1 + return r, true + default: + return + } } - } - - elem = origElem - } - // Param: "account_id" - // Match until "/" - idx := strings.IndexByte(elem, '/') - if idx < 0 { - idx = len(elem) - } - args[0] = elem[:idx] - elem = elem[idx:] - - if len(elem) == 0 { - switch method { - case "GET": - r.name = GetWalletInfoOperation - r.summary = "" - r.operationID = "getWalletInfo" - r.operationGroup = "" - r.pathPattern = "/v2/wallet/{account_id}" - r.args = args - r.count = 1 - return r, true - default: - return - } - } - switch elem[0] { - case '/': // Prefix: "/seqno" - - if l := len("/seqno"); len(elem) >= l && elem[0:l] == "/seqno" { - elem = elem[l:] - } else { - break - } - if len(elem) == 0 { - // Leaf node. - switch method { - case "GET": - r.name = GetAccountSeqnoOperation - r.summary = "" - r.operationID = "getAccountSeqno" - r.operationGroup = "" - r.pathPattern = "/v2/wallet/{account_id}/seqno" - r.args = args - r.count = 1 - return r, true - default: - return - } } } diff --git a/pkg/oas/oas_schemas_gen.go b/pkg/oas/oas_schemas_gen.go index 7b1f6cc6c..055de38e6 100644 --- a/pkg/oas/oas_schemas_gen.go +++ b/pkg/oas/oas_schemas_gen.go @@ -4411,6 +4411,86 @@ func (s *BouncePhaseType) UnmarshalText(data []byte) error { type ChartPoints [][]float64 +// Ref: #/components/schemas/CocoonWorkerInstance +type CocoonWorkerInstance struct { + Coefficient int64 `json:"coefficient"` + ActiveRequests int64 `json:"active_requests"` + MaxActiveRequests int64 `json:"max_active_requests"` +} + +// GetCoefficient returns the value of Coefficient. +func (s *CocoonWorkerInstance) GetCoefficient() int64 { + return s.Coefficient +} + +// GetActiveRequests returns the value of ActiveRequests. +func (s *CocoonWorkerInstance) GetActiveRequests() int64 { + return s.ActiveRequests +} + +// GetMaxActiveRequests returns the value of MaxActiveRequests. +func (s *CocoonWorkerInstance) GetMaxActiveRequests() int64 { + return s.MaxActiveRequests +} + +// SetCoefficient sets the value of Coefficient. +func (s *CocoonWorkerInstance) SetCoefficient(val int64) { + s.Coefficient = val +} + +// SetActiveRequests sets the value of ActiveRequests. +func (s *CocoonWorkerInstance) SetActiveRequests(val int64) { + s.ActiveRequests = val +} + +// SetMaxActiveRequests sets the value of MaxActiveRequests. +func (s *CocoonWorkerInstance) SetMaxActiveRequests(val int64) { + s.MaxActiveRequests = val +} + +// Ref: #/components/schemas/CocoonWorkerType +type CocoonWorkerType struct { + Name string `json:"name"` + Workers []CocoonWorkerInstance `json:"workers"` +} + +// GetName returns the value of Name. +func (s *CocoonWorkerType) GetName() string { + return s.Name +} + +// GetWorkers returns the value of Workers. +func (s *CocoonWorkerType) GetWorkers() []CocoonWorkerInstance { + return s.Workers +} + +// SetName sets the value of Name. +func (s *CocoonWorkerType) SetName(val string) { + s.Name = val +} + +// SetWorkers sets the value of Workers. +func (s *CocoonWorkerType) SetWorkers(val []CocoonWorkerInstance) { + s.Workers = val +} + +// Ref: #/components/schemas/CocoonWorkersResponse +type CocoonWorkersResponse struct { + Types []CocoonWorkerType `json:"types"` +} + +// GetTypes returns the value of Types. +func (s *CocoonWorkersResponse) GetTypes() []CocoonWorkerType { + return s.Types +} + +// SetTypes sets the value of Types. +func (s *CocoonWorkersResponse) SetTypes(val []CocoonWorkerType) { + s.Types = val +} + +func (*CocoonWorkersResponse) getCocoonWorkersRes() {} + // Ref: #/components/schemas/ComputePhase type ComputePhase struct { Skipped bool `json:"skipped"` @@ -6784,6 +6864,51 @@ func (s *GetChartRatesOK) SetPoints(val ChartPoints) { s.Points = val } +type GetCocoonWorkersNotImplemented struct{} + +func (*GetCocoonWorkersNotImplemented) getCocoonWorkersRes() {} + +type GetCocoonWorkersUnauthorized struct { + Error OptGetCocoonWorkersUnauthorizedError `json:"error"` +} + +// GetError returns the value of Error. +func (s *GetCocoonWorkersUnauthorized) GetError() OptGetCocoonWorkersUnauthorizedError { + return s.Error +} + +// SetError sets the value of Error. +func (s *GetCocoonWorkersUnauthorized) SetError(val OptGetCocoonWorkersUnauthorizedError) { + s.Error = val +} + +func (*GetCocoonWorkersUnauthorized) getCocoonWorkersRes() {} + +type GetCocoonWorkersUnauthorizedError struct { + Message OptString `json:"message"` + Type OptString `json:"type"` +} + +// GetMessage returns the value of Message. +func (s *GetCocoonWorkersUnauthorizedError) GetMessage() OptString { + return s.Message +} + +// GetType returns the value of Type. +func (s *GetCocoonWorkersUnauthorizedError) GetType() OptString { + return s.Type +} + +// SetMessage sets the value of Message. +func (s *GetCocoonWorkersUnauthorizedError) SetMessage(val OptString) { + s.Message = val +} + +// SetType sets the value of Type. +func (s *GetCocoonWorkersUnauthorizedError) SetType(val OptString) { + s.Type = val +} + type GetJettonInfosByAddressesReq struct { AccountIds []string `json:"account_ids"` } @@ -13927,6 +14052,52 @@ func (o OptGetBlockchainAccountTransactionsSortOrder) Or(d GetBlockchainAccountT return d } +// NewOptGetCocoonWorkersUnauthorizedError returns new OptGetCocoonWorkersUnauthorizedError with value set to v. +func NewOptGetCocoonWorkersUnauthorizedError(v GetCocoonWorkersUnauthorizedError) OptGetCocoonWorkersUnauthorizedError { + return OptGetCocoonWorkersUnauthorizedError{ + Value: v, + Set: true, + } +} + +// OptGetCocoonWorkersUnauthorizedError is optional GetCocoonWorkersUnauthorizedError. +type OptGetCocoonWorkersUnauthorizedError struct { + Value GetCocoonWorkersUnauthorizedError + Set bool +} + +// IsSet returns true if OptGetCocoonWorkersUnauthorizedError was set. +func (o OptGetCocoonWorkersUnauthorizedError) IsSet() bool { return o.Set } + +// Reset unsets value. +func (o *OptGetCocoonWorkersUnauthorizedError) Reset() { + var v GetCocoonWorkersUnauthorizedError + o.Value = v + o.Set = false +} + +// SetTo sets value to v. +func (o *OptGetCocoonWorkersUnauthorizedError) SetTo(v GetCocoonWorkersUnauthorizedError) { + o.Set = true + o.Value = v +} + +// Get returns value and boolean that denotes whether value was set. +func (o OptGetCocoonWorkersUnauthorizedError) Get() (v GetCocoonWorkersUnauthorizedError, ok bool) { + if !o.Set { + return v, false + } + return o.Value, true +} + +// Or returns value if set, or given parameter if does not. +func (o OptGetCocoonWorkersUnauthorizedError) Or(d GetCocoonWorkersUnauthorizedError) GetCocoonWorkersUnauthorizedError { + if v, ok := o.Get(); ok { + return v + } + return d +} + // NewOptGetJettonInfosByAddressesReq returns new OptGetJettonInfosByAddressesReq with value set to v. func NewOptGetJettonInfosByAddressesReq(v GetJettonInfosByAddressesReq) OptGetJettonInfosByAddressesReq { return OptGetJettonInfosByAddressesReq{ @@ -15094,6 +15265,52 @@ func (o OptPictureDNS) Or(d PictureDNS) PictureDNS { return d } +// NewOptPostCocoonQueryUnauthorizedError returns new OptPostCocoonQueryUnauthorizedError with value set to v. +func NewOptPostCocoonQueryUnauthorizedError(v PostCocoonQueryUnauthorizedError) OptPostCocoonQueryUnauthorizedError { + return OptPostCocoonQueryUnauthorizedError{ + Value: v, + Set: true, + } +} + +// OptPostCocoonQueryUnauthorizedError is optional PostCocoonQueryUnauthorizedError. +type OptPostCocoonQueryUnauthorizedError struct { + Value PostCocoonQueryUnauthorizedError + Set bool +} + +// IsSet returns true if OptPostCocoonQueryUnauthorizedError was set. +func (o OptPostCocoonQueryUnauthorizedError) IsSet() bool { return o.Set } + +// Reset unsets value. +func (o *OptPostCocoonQueryUnauthorizedError) Reset() { + var v PostCocoonQueryUnauthorizedError + o.Value = v + o.Set = false +} + +// SetTo sets value to v. +func (o *OptPostCocoonQueryUnauthorizedError) SetTo(v PostCocoonQueryUnauthorizedError) { + o.Set = true + o.Value = v +} + +// Get returns value and boolean that denotes whether value was set. +func (o OptPostCocoonQueryUnauthorizedError) Get() (v PostCocoonQueryUnauthorizedError, ok bool) { + if !o.Set { + return v, false + } + return o.Value, true +} + +// Or returns value if set, or given parameter if does not. +func (o OptPostCocoonQueryUnauthorizedError) Or(d PostCocoonQueryUnauthorizedError) PostCocoonQueryUnauthorizedError { + if v, ok := o.Get(); ok { + return v + } + return d +} + // NewOptPrice returns new OptPrice with value set to v. func NewOptPrice(v Price) OptPrice { return OptPrice{ @@ -16811,6 +17028,55 @@ func (s *PoolInfo) SetCycleLength(val OptInt64) { s.CycleLength = val } +type PostCocoonQueryNotImplemented struct{} + +func (*PostCocoonQueryNotImplemented) postCocoonQueryRes() {} + +type PostCocoonQueryOKApplicationJSON jx.Raw + +func (*PostCocoonQueryOKApplicationJSON) postCocoonQueryRes() {} + +type PostCocoonQueryUnauthorized struct { + Error OptPostCocoonQueryUnauthorizedError `json:"error"` +} + +// GetError returns the value of Error. +func (s *PostCocoonQueryUnauthorized) GetError() OptPostCocoonQueryUnauthorizedError { + return s.Error +} + +// SetError sets the value of Error. +func (s *PostCocoonQueryUnauthorized) SetError(val OptPostCocoonQueryUnauthorizedError) { + s.Error = val +} + +func (*PostCocoonQueryUnauthorized) postCocoonQueryRes() {} + +type PostCocoonQueryUnauthorizedError struct { + Message OptString `json:"message"` + Type OptString `json:"type"` +} + +// GetMessage returns the value of Message. +func (s *PostCocoonQueryUnauthorizedError) GetMessage() OptString { + return s.Message +} + +// GetType returns the value of Type. +func (s *PostCocoonQueryUnauthorizedError) GetType() OptString { + return s.Type +} + +// SetMessage sets the value of Message. +func (s *PostCocoonQueryUnauthorizedError) SetMessage(val OptString) { + s.Message = val +} + +// SetType sets the value of Type. +func (s *PostCocoonQueryUnauthorizedError) SetType(val OptString) { + s.Type = val +} + // Ref: #/components/schemas/Price type Price struct { CurrencyType CurrencyType `json:"currency_type"` @@ -19557,7 +19823,7 @@ func (s *UnSubscriptionAction) SetAdmin(val AccountAddress) { // Ref: #/components/schemas/ValidationRound type ValidationRound struct { // Election ID (electAt timestamp). - ElectionID int64 `json:"election_id"` + ElectAt OptInt64 `json:"elect_at"` StartUtime OptInt64 `json:"start_utime"` EndUtime OptInt64 `json:"end_utime"` // Masterchain block seqno at (or nearest to) round start. @@ -19577,9 +19843,9 @@ type ValidationRound struct { Finished bool `json:"finished"` } -// GetElectionID returns the value of ElectionID. -func (s *ValidationRound) GetElectionID() int64 { - return s.ElectionID +// GetElectAt returns the value of ElectAt. +func (s *ValidationRound) GetElectAt() OptInt64 { + return s.ElectAt } // GetStartUtime returns the value of StartUtime. @@ -19627,9 +19893,9 @@ func (s *ValidationRound) GetFinished() bool { return s.Finished } -// SetElectionID sets the value of ElectionID. -func (s *ValidationRound) SetElectionID(val int64) { - s.ElectionID = val +// SetElectAt sets the value of ElectAt. +func (s *ValidationRound) SetElectAt(val OptInt64) { + s.ElectAt = val } // SetStartUtime sets the value of StartUtime. diff --git a/pkg/oas/oas_server_gen.go b/pkg/oas/oas_server_gen.go index c90b10b69..f0c2d0bb5 100644 --- a/pkg/oas/oas_server_gen.go +++ b/pkg/oas/oas_server_gen.go @@ -327,6 +327,12 @@ type Handler interface { // // GET /v2/rates/chart GetChartRates(ctx context.Context, params GetChartRatesParams) (*GetChartRatesOK, error) + // GetCocoonWorkers implements getCocoonWorkers operation. + // + // Cocoon worker types (same shape as gocoon Connection.GetWorkerTypes). + // + // GET /cocoon/workers + GetCocoonWorkers(ctx context.Context) (GetCocoonWorkersRes, error) // GetDnsInfo implements getDnsInfo operation. // // Get full information about domain name. @@ -598,7 +604,7 @@ type Handler interface { // Computes per-validator and per-nominator reward distribution for a finished validation round using // the elector's bonuses value. // - // GET /v2/rewards/round-rewards + // GET /v2/validation/rewards GetRoundRewards(ctx context.Context, params GetRoundRewardsParams) (*RoundRewardsResponse, error) // GetStakingPoolHistory implements getStakingPoolHistory operation. // @@ -641,14 +647,14 @@ type Handler interface { // Returns past and current validation rounds with boundaries, stakes, and bonuses. Always uses the // latest masterchain block. // - // GET /v2/rewards/validation-rounds + // GET /v2/validation/rounds GetValidationRounds(ctx context.Context, params GetValidationRoundsParams) (*ValidationRoundsResponse, error) // GetValidators implements getValidators operation. // // Returns all current validators with stakes, rewards, pool addresses, and (optionally) nominator // breakdowns. // - // GET /v2/rewards/validators + // GET /v2/validation/validators GetValidators(ctx context.Context, params GetValidatorsParams) (*ValidatorsResponse, error) // GetWalletInfo implements getWalletInfo operation. // @@ -668,6 +674,12 @@ type Handler interface { // // POST /v2/pubkeys/wallets/_bulk GetWalletsByPublicKeyBulk(ctx context.Context, req OptGetWalletsByPublicKeyBulkReq) (*WalletsByPublicKeys, error) + // PostCocoonQuery implements postCocoonQuery operation. + // + // Proxy arbitrary OpenAI-style JSON to Cocoon (POST). + // + // POST /cocoon/query + PostCocoonQuery(ctx context.Context, req jx.Raw, params PostCocoonQueryParams) (PostCocoonQueryRes, error) // ReindexAccount implements reindexAccount operation. // // Update internal cache for a particular account. diff --git a/pkg/oas/oas_unimplemented_gen.go b/pkg/oas/oas_unimplemented_gen.go index 4abc549a1..ef4901e76 100644 --- a/pkg/oas/oas_unimplemented_gen.go +++ b/pkg/oas/oas_unimplemented_gen.go @@ -484,6 +484,15 @@ func (UnimplementedHandler) GetChartRates(ctx context.Context, params GetChartRa return r, ht.ErrNotImplemented } +// GetCocoonWorkers implements getCocoonWorkers operation. +// +// Cocoon worker types (same shape as gocoon Connection.GetWorkerTypes). +// +// GET /cocoon/workers +func (UnimplementedHandler) GetCocoonWorkers(ctx context.Context) (r GetCocoonWorkersRes, _ error) { + return r, ht.ErrNotImplemented +} + // GetDnsInfo implements getDnsInfo operation. // // Get full information about domain name. @@ -884,7 +893,7 @@ func (UnimplementedHandler) GetReducedBlockchainBlocks(ctx context.Context, para // Computes per-validator and per-nominator reward distribution for a finished validation round using // the elector's bonuses value. // -// GET /v2/rewards/round-rewards +// GET /v2/validation/rewards func (UnimplementedHandler) GetRoundRewards(ctx context.Context, params GetRoundRewardsParams) (r *RoundRewardsResponse, _ error) { return r, ht.ErrNotImplemented } @@ -948,7 +957,7 @@ func (UnimplementedHandler) GetTrace(ctx context.Context, params GetTraceParams) // Returns past and current validation rounds with boundaries, stakes, and bonuses. Always uses the // latest masterchain block. // -// GET /v2/rewards/validation-rounds +// GET /v2/validation/rounds func (UnimplementedHandler) GetValidationRounds(ctx context.Context, params GetValidationRoundsParams) (r *ValidationRoundsResponse, _ error) { return r, ht.ErrNotImplemented } @@ -958,7 +967,7 @@ func (UnimplementedHandler) GetValidationRounds(ctx context.Context, params GetV // Returns all current validators with stakes, rewards, pool addresses, and (optionally) nominator // breakdowns. // -// GET /v2/rewards/validators +// GET /v2/validation/validators func (UnimplementedHandler) GetValidators(ctx context.Context, params GetValidatorsParams) (r *ValidatorsResponse, _ error) { return r, ht.ErrNotImplemented } @@ -990,6 +999,15 @@ func (UnimplementedHandler) GetWalletsByPublicKeyBulk(ctx context.Context, req O return r, ht.ErrNotImplemented } +// PostCocoonQuery implements postCocoonQuery operation. +// +// Proxy arbitrary OpenAI-style JSON to Cocoon (POST). +// +// POST /cocoon/query +func (UnimplementedHandler) PostCocoonQuery(ctx context.Context, req jx.Raw, params PostCocoonQueryParams) (r PostCocoonQueryRes, _ error) { + return r, ht.ErrNotImplemented +} + // ReindexAccount implements reindexAccount operation. // // Update internal cache for a particular account. diff --git a/pkg/oas/oas_validators_gen.go b/pkg/oas/oas_validators_gen.go index bf277171d..c8f94f715 100644 --- a/pkg/oas/oas_validators_gen.go +++ b/pkg/oas/oas_validators_gen.go @@ -2012,6 +2012,161 @@ func (s ChartPoints) Validate() error { return nil } +func (s *CocoonWorkerInstance) Validate() error { + if s == nil { + return validate.ErrNilPointer + } + + var failures []validate.FieldError + if err := func() error { + if err := (validate.Int{ + MinSet: true, + Min: 0, + MaxSet: false, + Max: 0, + MinExclusive: false, + MaxExclusive: false, + MultipleOfSet: false, + MultipleOf: 0, + Pattern: nil, + }).Validate(int64(s.Coefficient)); err != nil { + return errors.Wrap(err, "int") + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "coefficient", + Error: err, + }) + } + if err := func() error { + if err := (validate.Int{ + MinSet: true, + Min: 0, + MaxSet: false, + Max: 0, + MinExclusive: false, + MaxExclusive: false, + MultipleOfSet: false, + MultipleOf: 0, + Pattern: nil, + }).Validate(int64(s.ActiveRequests)); err != nil { + return errors.Wrap(err, "int") + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "active_requests", + Error: err, + }) + } + if err := func() error { + if err := (validate.Int{ + MinSet: true, + Min: 0, + MaxSet: false, + Max: 0, + MinExclusive: false, + MaxExclusive: false, + MultipleOfSet: false, + MultipleOf: 0, + Pattern: nil, + }).Validate(int64(s.MaxActiveRequests)); err != nil { + return errors.Wrap(err, "int") + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "max_active_requests", + Error: err, + }) + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + return nil +} + +func (s *CocoonWorkerType) Validate() error { + if s == nil { + return validate.ErrNilPointer + } + + var failures []validate.FieldError + if err := func() error { + if s.Workers == nil { + return errors.New("nil is invalid value") + } + var failures []validate.FieldError + for i, elem := range s.Workers { + if err := func() error { + if err := elem.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: fmt.Sprintf("[%d]", i), + Error: err, + }) + } + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "workers", + Error: err, + }) + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + return nil +} + +func (s *CocoonWorkersResponse) Validate() error { + if s == nil { + return validate.ErrNilPointer + } + + var failures []validate.FieldError + if err := func() error { + if s.Types == nil { + return errors.New("nil is invalid value") + } + var failures []validate.FieldError + for i, elem := range s.Types { + if err := func() error { + if err := elem.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: fmt.Sprintf("[%d]", i), + Error: err, + }) + } + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "types", + Error: err, + }) + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + return nil +} + func (s *ComputePhase) Validate() error { if s == nil { return validate.ErrNilPointer From 352807e5dd6ef00d4b855d165b726a79e31abc82 Mon Sep 17 00:00:00 2001 From: Victoria E Date: Fri, 17 Apr 2026 20:17:16 +0300 Subject: [PATCH 02/11] refactor --- api/openapi.json | 314 +++++++++------- api/openapi.yml | 78 +++- pkg/oas/oas_client_gen.go | 109 +++++- pkg/oas/oas_handlers_gen.go | 32 +- pkg/oas/oas_json_gen.go | 20 +- pkg/oas/oas_parameters_gen.go | 288 ++++++++++++++- pkg/oas/oas_router_gen.go | 612 ++++++++++++++++--------------- pkg/oas/oas_schemas_gen.go | 14 +- pkg/oas/oas_server_gen.go | 6 +- pkg/oas/oas_unimplemented_gen.go | 6 +- 10 files changed, 996 insertions(+), 483 deletions(-) diff --git a/api/openapi.json b/api/openapi.json index 36b20a72e..7da1c1851 100644 --- a/api/openapi.json +++ b/api/openapi.json @@ -6931,7 +6931,7 @@ "type": "integer", "x-js-format": "bigint" }, - "elect_at": { + "election_id": { "description": "Election ID (electAt timestamp).", "example": 1740053384, "format": "int64", @@ -11975,6 +11975,187 @@ ] } }, + "/v2/rewards/round-rewards": { + "get": { + "description": "Computes per-validator and per-nominator reward distribution for a finished validation round using the elector's bonuses value.\n", + "operationId": "getRoundRewards", + "parameters": [ + { + "description": "Election ID of the finished round. Mutually exclusive with `block` and `unixtime`.\n", + "in": "query", + "name": "election_id", + "required": false, + "schema": { + "format": "int64", + "type": "integer" + } + }, + { + "description": "Masterchain block seqno within the finished round. Mutually exclusive with `election_id` and `unixtime`.\n", + "in": "query", + "name": "block", + "required": false, + "schema": { + "format": "uint32", + "type": "integer" + } + }, + { + "description": "Unix timestamp (seconds). Looks up the masterchain block at this time and uses it as the anchor. Mutually exclusive with `election_id` and `block`.\n", + "in": "query", + "name": "unixtime", + "required": false, + "schema": { + "format": "uint32", + "type": "integer" + } + }, + { + "description": "Set to `1` to return only basic validator info (rank, pubkey, effective_stake, weight, reward, pool). Skips pool type detection, owner/validator addresses, nominator data, and returned-stake lookup — significantly faster.\n", + "in": "query", + "name": "shallow", + "required": false, + "schema": { + "default": false, + "type": "boolean" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RoundRewardsResponse" + } + } + }, + "description": "Successful response" + }, + "default": { + "$ref": "#/components/responses/Error" + } + }, + "summary": "Get per-validator reward distribution for a finished round", + "tags": [ + "Rewards" + ] + } + }, + "/v2/rewards/validation-rounds": { + "get": { + "description": "Returns past and current validation rounds with boundaries, stakes, and bonuses. Always uses the latest masterchain block.\n", + "operationId": "getValidationRounds", + "parameters": [ + { + "description": "Return the single round matching this election ID. Mutually exclusive with `block` and `unixtime`.\n", + "in": "query", + "name": "election_id", + "required": false, + "schema": { + "format": "int64", + "type": "integer" + } + }, + { + "description": "Find the round containing this masterchain block seqno and return it plus up to `limit-1` older rounds. Mutually exclusive with `election_id` and `unixtime`.\n", + "in": "query", + "name": "block", + "required": false, + "schema": { + "format": "uint32", + "type": "integer" + } + }, + { + "description": "Unix timestamp (seconds). Looks up the masterchain block at this time and uses it as the anchor. Mutually exclusive with `election_id` and `block`.\n", + "in": "query", + "name": "unixtime", + "required": false, + "schema": { + "format": "uint32", + "type": "integer" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ValidationRoundsResponse" + } + } + }, + "description": "Successful response" + }, + "default": { + "$ref": "#/components/responses/Error" + } + }, + "summary": "Get validation round metadata", + "tags": [ + "Rewards" + ] + } + }, + "/v2/rewards/validators": { + "get": { + "description": "Returns all current validators with stakes, rewards, pool addresses, and (optionally) nominator breakdowns.\n", + "operationId": "getValidators", + "parameters": [ + { + "description": "Masterchain block seqno. Defaults to latest. Mutually exclusive with `unixtime`.\n", + "in": "query", + "name": "seqno", + "required": false, + "schema": { + "format": "uint32", + "type": "integer" + } + }, + { + "description": "Unix timestamp (seconds). Looks up the masterchain block at this time and uses it as the anchor. Mutually exclusive with `seqno`.\n", + "in": "query", + "name": "unixtime", + "required": false, + "schema": { + "format": "uint32", + "type": "integer" + } + }, + { + "description": "Set to `1` to return only basic validator info (rank, pubkey, effective_stake, weight, reward, pool). Skips pool type detection, owner/validator addresses, nominator data, and returned-stake lookup — significantly faster.\n", + "in": "query", + "name": "shallow", + "required": false, + "schema": { + "default": false, + "type": "boolean" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ValidatorsResponse" + } + } + }, + "description": "Successful response" + }, + "default": { + "$ref": "#/components/responses/Error" + } + }, + "summary": "Get all current validators", + "tags": [ + "Rewards" + ] + } + }, "/v2/staking/nominator/{account_id}/pools": { "get": { "description": "All pools where account participates", @@ -12367,137 +12548,6 @@ ] } }, - "/v2/validation/rewards": { - "get": { - "description": "Computes per-validator and per-nominator reward distribution for a finished validation round using the elector's bonuses value.\n", - "operationId": "getRoundRewards", - "parameters": [ - { - "description": "Election ID of the finished round. Mutually exclusive with `block`.\n", - "in": "query", - "name": "election_id", - "required": false, - "schema": { - "format": "int64", - "type": "integer" - } - }, - { - "description": "Masterchain block seqno within the finished round. Mutually exclusive with `election_id`.\n", - "in": "query", - "name": "block", - "required": false, - "schema": { - "format": "uint32", - "type": "integer" - } - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/RoundRewardsResponse" - } - } - }, - "description": "Successful response" - }, - "default": { - "$ref": "#/components/responses/Error" - } - }, - "summary": "Get per-validator reward distribution for a finished round", - "tags": [ - "Validation" - ] - } - }, - "/v2/validation/rounds": { - "get": { - "description": "Returns past and current validation rounds with boundaries, stakes, and bonuses. Always uses the latest masterchain block.\n", - "operationId": "getValidationRounds", - "parameters": [ - { - "description": "Return the single round matching this election ID. Mutually exclusive with `block`.\n", - "in": "query", - "name": "election_id", - "required": false, - "schema": { - "format": "int64", - "type": "integer" - } - }, - { - "description": "Find the round containing this masterchain block seqno and return it plus up to `limit-1` older rounds. Mutually exclusive with `election_id`.\n", - "in": "query", - "name": "block", - "required": false, - "schema": { - "format": "uint32", - "type": "integer" - } - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ValidationRoundsResponse" - } - } - }, - "description": "Successful response" - }, - "default": { - "$ref": "#/components/responses/Error" - } - }, - "summary": "Get validation round metadata", - "tags": [ - "Validation" - ] - } - }, - "/v2/validation/validators": { - "get": { - "description": "Returns all current validators with stakes, rewards, pool addresses, and (optionally) nominator breakdowns.\n", - "operationId": "getValidators", - "parameters": [ - { - "description": "Masterchain block seqno. Defaults to latest.", - "in": "query", - "name": "seqno", - "required": false, - "schema": { - "format": "uint32", - "type": "integer" - } - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ValidatorsResponse" - } - } - }, - "description": "Successful response" - }, - "default": { - "$ref": "#/components/responses/Error" - } - }, - "summary": "Get all current validators", - "tags": [ - "Validation" - ] - } - }, "/v2/wallet/auth/proof": { "post": { "description": "Account verification and token issuance", diff --git a/api/openapi.yml b/api/openapi.yml index 864f52369..39869d53e 100644 --- a/api/openapi.yml +++ b/api/openapi.yml @@ -2978,11 +2978,11 @@ paths: $ref: '#/components/schemas/AccountPurchases' 'default': $ref: '#/components/responses/Error' - /v2/validation/validators: + /v2/rewards/validators: get: operationId: getValidators tags: - - Validation + - Rewards summary: Get all current validators description: > Returns all current validators with stakes, rewards, pool addresses, @@ -2990,11 +2990,33 @@ paths: parameters: - name: seqno in: query - description: Masterchain block seqno. Defaults to latest. + description: > + Masterchain block seqno. Defaults to latest. + Mutually exclusive with `unixtime`. required: false schema: type: integer format: uint32 + - name: unixtime + in: query + description: > + Unix timestamp (seconds). Looks up the masterchain block at this + time and uses it as the anchor. Mutually exclusive with `seqno`. + required: false + schema: + type: integer + format: uint32 + - name: shallow + in: query + description: > + Set to `1` to return only basic validator info (rank, pubkey, + effective_stake, weight, reward, pool). Skips pool type detection, + owner/validator addresses, nominator data, and returned-stake + lookup — significantly faster. + required: false + schema: + type: boolean + default: false responses: '200': description: Successful response @@ -3004,11 +3026,11 @@ paths: $ref: "#/components/schemas/ValidatorsResponse" 'default': $ref: '#/components/responses/Error' - /v2/validation/rounds: + /v2/rewards/validation-rounds: get: operationId: getValidationRounds tags: - - Validation + - Rewards summary: Get validation round metadata description: > Returns past and current validation rounds with boundaries, stakes, @@ -3018,7 +3040,7 @@ paths: in: query description: > Return the single round matching this election ID. - Mutually exclusive with `block`. + Mutually exclusive with `block` and `unixtime`. required: false schema: type: integer @@ -3028,7 +3050,17 @@ paths: description: > Find the round containing this masterchain block seqno and return it plus up to `limit-1` older rounds. Mutually exclusive with - `election_id`. + `election_id` and `unixtime`. + required: false + schema: + type: integer + format: uint32 + - name: unixtime + in: query + description: > + Unix timestamp (seconds). Looks up the masterchain block at this + time and uses it as the anchor. Mutually exclusive with + `election_id` and `block`. required: false schema: type: integer @@ -3042,11 +3074,11 @@ paths: $ref: "#/components/schemas/ValidationRoundsResponse" 'default': $ref: '#/components/responses/Error' - /v2/validation/rewards: + /v2/rewards/round-rewards: get: operationId: getRoundRewards tags: - - Validation + - Rewards summary: Get per-validator reward distribution for a finished round description: > Computes per-validator and per-nominator reward distribution for a @@ -3055,7 +3087,7 @@ paths: - name: election_id in: query description: > - Election ID of the finished round. Mutually exclusive with `block`. + Election ID of the finished round. Mutually exclusive with `block` and `unixtime`. required: false schema: type: integer @@ -3064,11 +3096,32 @@ paths: in: query description: > Masterchain block seqno within the finished round. - Mutually exclusive with `election_id`. + Mutually exclusive with `election_id` and `unixtime`. required: false schema: type: integer format: uint32 + - name: unixtime + in: query + description: > + Unix timestamp (seconds). Looks up the masterchain block at this + time and uses it as the anchor. Mutually exclusive with + `election_id` and `block`. + required: false + schema: + type: integer + format: uint32 + - name: shallow + in: query + description: > + Set to `1` to return only basic validator info (rank, pubkey, + effective_stake, weight, reward, pool). Skips pool type detection, + owner/validator addresses, nominator data, and returned-stake + lookup — significantly faster. + required: false + schema: + type: boolean + default: false responses: '200': description: Successful response @@ -3078,7 +3131,6 @@ paths: $ref: "#/components/schemas/RoundRewardsResponse" 'default': $ref: '#/components/responses/Error' - /cocoon/workers: get: operationId: getCocoonWorkers @@ -8679,7 +8731,7 @@ components: type: object required: [election_id, start, end, start_block, finished] properties: - elect_at: + election_id: type: integer format: int64 description: Election ID (electAt timestamp). diff --git a/pkg/oas/oas_client_gen.go b/pkg/oas/oas_client_gen.go index 912d1aa40..c1455429f 100644 --- a/pkg/oas/oas_client_gen.go +++ b/pkg/oas/oas_client_gen.go @@ -622,7 +622,7 @@ type Invoker interface { // Computes per-validator and per-nominator reward distribution for a finished validation round using // the elector's bonuses value. // - // GET /v2/validation/rewards + // GET /v2/rewards/round-rewards GetRoundRewards(ctx context.Context, params GetRoundRewardsParams) (*RoundRewardsResponse, error) // GetStakingPoolHistory invokes getStakingPoolHistory operation. // @@ -665,14 +665,14 @@ type Invoker interface { // Returns past and current validation rounds with boundaries, stakes, and bonuses. Always uses the // latest masterchain block. // - // GET /v2/validation/rounds + // GET /v2/rewards/validation-rounds GetValidationRounds(ctx context.Context, params GetValidationRoundsParams) (*ValidationRoundsResponse, error) // GetValidators invokes getValidators operation. // // Returns all current validators with stakes, rewards, pool addresses, and (optionally) nominator // breakdowns. // - // GET /v2/validation/validators + // GET /v2/rewards/validators GetValidators(ctx context.Context, params GetValidatorsParams) (*ValidatorsResponse, error) // GetWalletInfo invokes getWalletInfo operation. // @@ -11171,7 +11171,7 @@ func (c *Client) sendGetReducedBlockchainBlocks(ctx context.Context, params GetR // Computes per-validator and per-nominator reward distribution for a finished validation round using // the elector's bonuses value. // -// GET /v2/validation/rewards +// GET /v2/rewards/round-rewards func (c *Client) GetRoundRewards(ctx context.Context, params GetRoundRewardsParams) (*RoundRewardsResponse, error) { res, err := c.sendGetRoundRewards(ctx, params) return res, err @@ -11181,7 +11181,7 @@ func (c *Client) sendGetRoundRewards(ctx context.Context, params GetRoundRewards otelAttrs := []attribute.KeyValue{ otelogen.OperationID("getRoundRewards"), semconv.HTTPRequestMethodKey.String("GET"), - semconv.URLTemplateKey.String("/v2/validation/rewards"), + semconv.URLTemplateKey.String("/v2/rewards/round-rewards"), } otelAttrs = append(otelAttrs, c.cfg.Attributes...) @@ -11215,7 +11215,7 @@ func (c *Client) sendGetRoundRewards(ctx context.Context, params GetRoundRewards stage = "BuildURL" u := uri.Clone(c.requestURL(ctx)) var pathParts [1]string - pathParts[0] = "/v2/validation/rewards" + pathParts[0] = "/v2/rewards/round-rewards" uri.AddPathParts(u, pathParts[:]...) stage = "EncodeQueryParams" @@ -11254,6 +11254,40 @@ func (c *Client) sendGetRoundRewards(ctx context.Context, params GetRoundRewards return res, errors.Wrap(err, "encode query") } } + { + // Encode "unixtime" parameter. + cfg := uri.QueryParameterEncodingConfig{ + Name: "unixtime", + Style: uri.QueryStyleForm, + Explode: true, + } + + if err := q.EncodeParam(cfg, func(e uri.Encoder) error { + if val, ok := params.Unixtime.Get(); ok { + return e.EncodeValue(conv.Uint32ToString(val)) + } + return nil + }); err != nil { + return res, errors.Wrap(err, "encode query") + } + } + { + // Encode "shallow" parameter. + cfg := uri.QueryParameterEncodingConfig{ + Name: "shallow", + Style: uri.QueryStyleForm, + Explode: true, + } + + if err := q.EncodeParam(cfg, func(e uri.Encoder) error { + if val, ok := params.Shallow.Get(); ok { + return e.EncodeValue(conv.BoolToString(val)) + } + return nil + }); err != nil { + return res, errors.Wrap(err, "encode query") + } + } u.RawQuery = q.Values().Encode() stage = "EncodeRequest" @@ -11893,7 +11927,7 @@ func (c *Client) sendGetTrace(ctx context.Context, params GetTraceParams) (res * // Returns past and current validation rounds with boundaries, stakes, and bonuses. Always uses the // latest masterchain block. // -// GET /v2/validation/rounds +// GET /v2/rewards/validation-rounds func (c *Client) GetValidationRounds(ctx context.Context, params GetValidationRoundsParams) (*ValidationRoundsResponse, error) { res, err := c.sendGetValidationRounds(ctx, params) return res, err @@ -11903,7 +11937,7 @@ func (c *Client) sendGetValidationRounds(ctx context.Context, params GetValidati otelAttrs := []attribute.KeyValue{ otelogen.OperationID("getValidationRounds"), semconv.HTTPRequestMethodKey.String("GET"), - semconv.URLTemplateKey.String("/v2/validation/rounds"), + semconv.URLTemplateKey.String("/v2/rewards/validation-rounds"), } otelAttrs = append(otelAttrs, c.cfg.Attributes...) @@ -11937,7 +11971,7 @@ func (c *Client) sendGetValidationRounds(ctx context.Context, params GetValidati stage = "BuildURL" u := uri.Clone(c.requestURL(ctx)) var pathParts [1]string - pathParts[0] = "/v2/validation/rounds" + pathParts[0] = "/v2/rewards/validation-rounds" uri.AddPathParts(u, pathParts[:]...) stage = "EncodeQueryParams" @@ -11976,6 +12010,23 @@ func (c *Client) sendGetValidationRounds(ctx context.Context, params GetValidati return res, errors.Wrap(err, "encode query") } } + { + // Encode "unixtime" parameter. + cfg := uri.QueryParameterEncodingConfig{ + Name: "unixtime", + Style: uri.QueryStyleForm, + Explode: true, + } + + if err := q.EncodeParam(cfg, func(e uri.Encoder) error { + if val, ok := params.Unixtime.Get(); ok { + return e.EncodeValue(conv.Uint32ToString(val)) + } + return nil + }); err != nil { + return res, errors.Wrap(err, "encode query") + } + } u.RawQuery = q.Values().Encode() stage = "EncodeRequest" @@ -12006,7 +12057,7 @@ func (c *Client) sendGetValidationRounds(ctx context.Context, params GetValidati // Returns all current validators with stakes, rewards, pool addresses, and (optionally) nominator // breakdowns. // -// GET /v2/validation/validators +// GET /v2/rewards/validators func (c *Client) GetValidators(ctx context.Context, params GetValidatorsParams) (*ValidatorsResponse, error) { res, err := c.sendGetValidators(ctx, params) return res, err @@ -12016,7 +12067,7 @@ func (c *Client) sendGetValidators(ctx context.Context, params GetValidatorsPara otelAttrs := []attribute.KeyValue{ otelogen.OperationID("getValidators"), semconv.HTTPRequestMethodKey.String("GET"), - semconv.URLTemplateKey.String("/v2/validation/validators"), + semconv.URLTemplateKey.String("/v2/rewards/validators"), } otelAttrs = append(otelAttrs, c.cfg.Attributes...) @@ -12050,7 +12101,7 @@ func (c *Client) sendGetValidators(ctx context.Context, params GetValidatorsPara stage = "BuildURL" u := uri.Clone(c.requestURL(ctx)) var pathParts [1]string - pathParts[0] = "/v2/validation/validators" + pathParts[0] = "/v2/rewards/validators" uri.AddPathParts(u, pathParts[:]...) stage = "EncodeQueryParams" @@ -12072,6 +12123,40 @@ func (c *Client) sendGetValidators(ctx context.Context, params GetValidatorsPara return res, errors.Wrap(err, "encode query") } } + { + // Encode "unixtime" parameter. + cfg := uri.QueryParameterEncodingConfig{ + Name: "unixtime", + Style: uri.QueryStyleForm, + Explode: true, + } + + if err := q.EncodeParam(cfg, func(e uri.Encoder) error { + if val, ok := params.Unixtime.Get(); ok { + return e.EncodeValue(conv.Uint32ToString(val)) + } + return nil + }); err != nil { + return res, errors.Wrap(err, "encode query") + } + } + { + // Encode "shallow" parameter. + cfg := uri.QueryParameterEncodingConfig{ + Name: "shallow", + Style: uri.QueryStyleForm, + Explode: true, + } + + if err := q.EncodeParam(cfg, func(e uri.Encoder) error { + if val, ok := params.Shallow.Get(); ok { + return e.EncodeValue(conv.BoolToString(val)) + } + return nil + }); err != nil { + return res, errors.Wrap(err, "encode query") + } + } u.RawQuery = q.Values().Encode() stage = "EncodeRequest" diff --git a/pkg/oas/oas_handlers_gen.go b/pkg/oas/oas_handlers_gen.go index accac9296..382fef235 100644 --- a/pkg/oas/oas_handlers_gen.go +++ b/pkg/oas/oas_handlers_gen.go @@ -14973,14 +14973,14 @@ func (s *Server) handleGetReducedBlockchainBlocksRequest(args [0]string, argsEsc // Computes per-validator and per-nominator reward distribution for a finished validation round using // the elector's bonuses value. // -// GET /v2/validation/rewards +// GET /v2/rewards/round-rewards func (s *Server) handleGetRoundRewardsRequest(args [0]string, argsEscaped bool, w http.ResponseWriter, r *http.Request) { statusWriter := &codeRecorder{ResponseWriter: w} w = statusWriter otelAttrs := []attribute.KeyValue{ otelogen.OperationID("getRoundRewards"), semconv.HTTPRequestMethodKey.String("GET"), - semconv.HTTPRouteKey.String("/v2/validation/rewards"), + semconv.HTTPRouteKey.String("/v2/rewards/round-rewards"), } // Add attributes from config. otelAttrs = append(otelAttrs, s.cfg.Attributes...) @@ -15076,6 +15076,14 @@ func (s *Server) handleGetRoundRewardsRequest(args [0]string, argsEscaped bool, Name: "block", In: "query", }: params.Block, + { + Name: "unixtime", + In: "query", + }: params.Unixtime, + { + Name: "shallow", + In: "query", + }: params.Shallow, }, Raw: r, } @@ -16038,14 +16046,14 @@ func (s *Server) handleGetTraceRequest(args [1]string, argsEscaped bool, w http. // Returns past and current validation rounds with boundaries, stakes, and bonuses. Always uses the // latest masterchain block. // -// GET /v2/validation/rounds +// GET /v2/rewards/validation-rounds func (s *Server) handleGetValidationRoundsRequest(args [0]string, argsEscaped bool, w http.ResponseWriter, r *http.Request) { statusWriter := &codeRecorder{ResponseWriter: w} w = statusWriter otelAttrs := []attribute.KeyValue{ otelogen.OperationID("getValidationRounds"), semconv.HTTPRequestMethodKey.String("GET"), - semconv.HTTPRouteKey.String("/v2/validation/rounds"), + semconv.HTTPRouteKey.String("/v2/rewards/validation-rounds"), } // Add attributes from config. otelAttrs = append(otelAttrs, s.cfg.Attributes...) @@ -16141,6 +16149,10 @@ func (s *Server) handleGetValidationRoundsRequest(args [0]string, argsEscaped bo Name: "block", In: "query", }: params.Block, + { + Name: "unixtime", + In: "query", + }: params.Unixtime, }, Raw: r, } @@ -16197,14 +16209,14 @@ func (s *Server) handleGetValidationRoundsRequest(args [0]string, argsEscaped bo // Returns all current validators with stakes, rewards, pool addresses, and (optionally) nominator // breakdowns. // -// GET /v2/validation/validators +// GET /v2/rewards/validators func (s *Server) handleGetValidatorsRequest(args [0]string, argsEscaped bool, w http.ResponseWriter, r *http.Request) { statusWriter := &codeRecorder{ResponseWriter: w} w = statusWriter otelAttrs := []attribute.KeyValue{ otelogen.OperationID("getValidators"), semconv.HTTPRequestMethodKey.String("GET"), - semconv.HTTPRouteKey.String("/v2/validation/validators"), + semconv.HTTPRouteKey.String("/v2/rewards/validators"), } // Add attributes from config. otelAttrs = append(otelAttrs, s.cfg.Attributes...) @@ -16296,6 +16308,14 @@ func (s *Server) handleGetValidatorsRequest(args [0]string, argsEscaped bool, w Name: "seqno", In: "query", }: params.Seqno, + { + Name: "unixtime", + In: "query", + }: params.Unixtime, + { + Name: "shallow", + In: "query", + }: params.Shallow, }, Raw: r, } diff --git a/pkg/oas/oas_json_gen.go b/pkg/oas/oas_json_gen.go index 9015a4955..56b6822b0 100644 --- a/pkg/oas/oas_json_gen.go +++ b/pkg/oas/oas_json_gen.go @@ -44829,10 +44829,8 @@ func (s *ValidationRound) Encode(e *jx.Encoder) { // encodeFields encodes fields. func (s *ValidationRound) encodeFields(e *jx.Encoder) { { - if s.ElectAt.Set { - e.FieldStart("elect_at") - s.ElectAt.Encode(e) - } + e.FieldStart("election_id") + e.Int64(s.ElectionID) } { if s.StartUtime.Set { @@ -44887,7 +44885,7 @@ func (s *ValidationRound) encodeFields(e *jx.Encoder) { } var jsonFieldsNameOfValidationRound = [10]string{ - 0: "elect_at", + 0: "election_id", 1: "start_utime", 2: "end_utime", 3: "start_block", @@ -44908,15 +44906,17 @@ func (s *ValidationRound) Decode(d *jx.Decoder) error { if err := d.ObjBytes(func(d *jx.Decoder, k []byte) error { switch string(k) { - case "elect_at": + case "election_id": + requiredBitSet[0] |= 1 << 0 if err := func() error { - s.ElectAt.Reset() - if err := s.ElectAt.Decode(d); err != nil { + v, err := d.Int64() + s.ElectionID = int64(v) + if err != nil { return err } return nil }(); err != nil { - return errors.Wrap(err, "decode field \"elect_at\"") + return errors.Wrap(err, "decode field \"election_id\"") } case "start_utime": if err := func() error { @@ -45022,7 +45022,7 @@ func (s *ValidationRound) Decode(d *jx.Decoder) error { // Validate required fields. var failures []validate.FieldError for i, mask := range [2]uint8{ - 0b00001000, + 0b00001001, 0b00000010, } { if result := (requiredBitSet[i] & mask) ^ mask; result != 0 { diff --git a/pkg/oas/oas_parameters_gen.go b/pkg/oas/oas_parameters_gen.go index 9ea5ad984..e5bb38a60 100644 --- a/pkg/oas/oas_parameters_gen.go +++ b/pkg/oas/oas_parameters_gen.go @@ -11378,10 +11378,18 @@ func decodeGetReducedBlockchainBlocksParams(args [0]string, argsEscaped bool, r // GetRoundRewardsParams is parameters of getRoundRewards operation. type GetRoundRewardsParams struct { - // Election ID of the finished round. Mutually exclusive with `block`. + // Election ID of the finished round. Mutually exclusive with `block` and `unixtime`. ElectionID OptInt64 `json:",omitempty,omitzero"` - // Masterchain block seqno within the finished round. Mutually exclusive with `election_id`. + // Masterchain block seqno within the finished round. Mutually exclusive with `election_id` and + // `unixtime`. Block OptUint32 `json:",omitempty,omitzero"` + // Unix timestamp (seconds). Looks up the masterchain block at this time and uses it as the anchor. + // Mutually exclusive with `election_id` and `block`. + Unixtime OptUint32 `json:",omitempty,omitzero"` + // Set to `1` to return only basic validator info (rank, pubkey, effective_stake, weight, reward, + // pool). Skips pool type detection, owner/validator addresses, nominator data, and returned-stake + // lookup — significantly faster. + Shallow OptBool `json:",omitempty,omitzero"` } func unpackGetRoundRewardsParams(packed middleware.Parameters) (params GetRoundRewardsParams) { @@ -11403,6 +11411,24 @@ func unpackGetRoundRewardsParams(packed middleware.Parameters) (params GetRoundR params.Block = v.(OptUint32) } } + { + key := middleware.ParameterKey{ + Name: "unixtime", + In: "query", + } + if v, ok := packed[key]; ok { + params.Unixtime = v.(OptUint32) + } + } + { + key := middleware.ParameterKey{ + Name: "shallow", + In: "query", + } + if v, ok := packed[key]; ok { + params.Shallow = v.(OptBool) + } + } return params } @@ -11490,6 +11516,93 @@ func decodeGetRoundRewardsParams(args [0]string, argsEscaped bool, r *http.Reque Err: err, } } + // Decode query: unixtime. + if err := func() error { + cfg := uri.QueryParameterDecodingConfig{ + Name: "unixtime", + Style: uri.QueryStyleForm, + Explode: true, + } + + if err := q.HasParam(cfg); err == nil { + if err := q.DecodeParam(cfg, func(d uri.Decoder) error { + var paramsDotUnixtimeVal uint32 + if err := func() error { + val, err := d.DecodeValue() + if err != nil { + return err + } + + c, err := conv.ToUint32(val) + if err != nil { + return err + } + + paramsDotUnixtimeVal = c + return nil + }(); err != nil { + return err + } + params.Unixtime.SetTo(paramsDotUnixtimeVal) + return nil + }); err != nil { + return err + } + } + return nil + }(); err != nil { + return params, &ogenerrors.DecodeParamError{ + Name: "unixtime", + In: "query", + Err: err, + } + } + // Set default value for query: shallow. + { + val := bool(false) + params.Shallow.SetTo(val) + } + // Decode query: shallow. + if err := func() error { + cfg := uri.QueryParameterDecodingConfig{ + Name: "shallow", + Style: uri.QueryStyleForm, + Explode: true, + } + + if err := q.HasParam(cfg); err == nil { + if err := q.DecodeParam(cfg, func(d uri.Decoder) error { + var paramsDotShallowVal bool + if err := func() error { + val, err := d.DecodeValue() + if err != nil { + return err + } + + c, err := conv.ToBool(val) + if err != nil { + return err + } + + paramsDotShallowVal = c + return nil + }(); err != nil { + return err + } + params.Shallow.SetTo(paramsDotShallowVal) + return nil + }); err != nil { + return err + } + } + return nil + }(); err != nil { + return params, &ogenerrors.DecodeParamError{ + Name: "shallow", + In: "query", + Err: err, + } + } return params, nil } @@ -12054,11 +12167,14 @@ func decodeGetTraceParams(args [1]string, argsEscaped bool, r *http.Request) (pa // GetValidationRoundsParams is parameters of getValidationRounds operation. type GetValidationRoundsParams struct { - // Return the single round matching this election ID. Mutually exclusive with `block`. + // Return the single round matching this election ID. Mutually exclusive with `block` and `unixtime`. ElectionID OptInt64 `json:",omitempty,omitzero"` // Find the round containing this masterchain block seqno and return it plus up to `limit-1` older - // rounds. Mutually exclusive with `election_id`. + // rounds. Mutually exclusive with `election_id` and `unixtime`. Block OptUint32 `json:",omitempty,omitzero"` + // Unix timestamp (seconds). Looks up the masterchain block at this time and uses it as the anchor. + // Mutually exclusive with `election_id` and `block`. + Unixtime OptUint32 `json:",omitempty,omitzero"` } func unpackGetValidationRoundsParams(packed middleware.Parameters) (params GetValidationRoundsParams) { @@ -12080,6 +12196,15 @@ func unpackGetValidationRoundsParams(packed middleware.Parameters) (params GetVa params.Block = v.(OptUint32) } } + { + key := middleware.ParameterKey{ + Name: "unixtime", + In: "query", + } + if v, ok := packed[key]; ok { + params.Unixtime = v.(OptUint32) + } + } return params } @@ -12167,13 +12292,61 @@ func decodeGetValidationRoundsParams(args [0]string, argsEscaped bool, r *http.R Err: err, } } + // Decode query: unixtime. + if err := func() error { + cfg := uri.QueryParameterDecodingConfig{ + Name: "unixtime", + Style: uri.QueryStyleForm, + Explode: true, + } + + if err := q.HasParam(cfg); err == nil { + if err := q.DecodeParam(cfg, func(d uri.Decoder) error { + var paramsDotUnixtimeVal uint32 + if err := func() error { + val, err := d.DecodeValue() + if err != nil { + return err + } + + c, err := conv.ToUint32(val) + if err != nil { + return err + } + + paramsDotUnixtimeVal = c + return nil + }(); err != nil { + return err + } + params.Unixtime.SetTo(paramsDotUnixtimeVal) + return nil + }); err != nil { + return err + } + } + return nil + }(); err != nil { + return params, &ogenerrors.DecodeParamError{ + Name: "unixtime", + In: "query", + Err: err, + } + } return params, nil } // GetValidatorsParams is parameters of getValidators operation. type GetValidatorsParams struct { - // Masterchain block seqno. Defaults to latest. + // Masterchain block seqno. Defaults to latest. Mutually exclusive with `unixtime`. Seqno OptUint32 `json:",omitempty,omitzero"` + // Unix timestamp (seconds). Looks up the masterchain block at this time and uses it as the anchor. + // Mutually exclusive with `seqno`. + Unixtime OptUint32 `json:",omitempty,omitzero"` + // Set to `1` to return only basic validator info (rank, pubkey, effective_stake, weight, reward, + // pool). Skips pool type detection, owner/validator addresses, nominator data, and returned-stake + // lookup — significantly faster. + Shallow OptBool `json:",omitempty,omitzero"` } func unpackGetValidatorsParams(packed middleware.Parameters) (params GetValidatorsParams) { @@ -12186,6 +12359,24 @@ func unpackGetValidatorsParams(packed middleware.Parameters) (params GetValidato params.Seqno = v.(OptUint32) } } + { + key := middleware.ParameterKey{ + Name: "unixtime", + In: "query", + } + if v, ok := packed[key]; ok { + params.Unixtime = v.(OptUint32) + } + } + { + key := middleware.ParameterKey{ + Name: "shallow", + In: "query", + } + if v, ok := packed[key]; ok { + params.Shallow = v.(OptBool) + } + } return params } @@ -12232,6 +12423,93 @@ func decodeGetValidatorsParams(args [0]string, argsEscaped bool, r *http.Request Err: err, } } + // Decode query: unixtime. + if err := func() error { + cfg := uri.QueryParameterDecodingConfig{ + Name: "unixtime", + Style: uri.QueryStyleForm, + Explode: true, + } + + if err := q.HasParam(cfg); err == nil { + if err := q.DecodeParam(cfg, func(d uri.Decoder) error { + var paramsDotUnixtimeVal uint32 + if err := func() error { + val, err := d.DecodeValue() + if err != nil { + return err + } + + c, err := conv.ToUint32(val) + if err != nil { + return err + } + + paramsDotUnixtimeVal = c + return nil + }(); err != nil { + return err + } + params.Unixtime.SetTo(paramsDotUnixtimeVal) + return nil + }); err != nil { + return err + } + } + return nil + }(); err != nil { + return params, &ogenerrors.DecodeParamError{ + Name: "unixtime", + In: "query", + Err: err, + } + } + // Set default value for query: shallow. + { + val := bool(false) + params.Shallow.SetTo(val) + } + // Decode query: shallow. + if err := func() error { + cfg := uri.QueryParameterDecodingConfig{ + Name: "shallow", + Style: uri.QueryStyleForm, + Explode: true, + } + + if err := q.HasParam(cfg); err == nil { + if err := q.DecodeParam(cfg, func(d uri.Decoder) error { + var paramsDotShallowVal bool + if err := func() error { + val, err := d.DecodeValue() + if err != nil { + return err + } + + c, err := conv.ToBool(val) + if err != nil { + return err + } + + paramsDotShallowVal = c + return nil + }(); err != nil { + return err + } + params.Shallow.SetTo(paramsDotShallowVal) + return nil + }); err != nil { + return err + } + } + return nil + }(); err != nil { + return params, &ogenerrors.DecodeParamError{ + Name: "shallow", + In: "query", + Err: err, + } + } return params, nil } diff --git a/pkg/oas/oas_router_gen.go b/pkg/oas/oas_router_gen.go index fc1236e49..cfee5fa59 100644 --- a/pkg/oas/oas_router_gen.go +++ b/pkg/oas/oas_router_gen.go @@ -11,7 +11,7 @@ import ( ) var ( - rn192AllowedHeaders = map[string]string{ + rn193AllowedHeaders = map[string]string{ "POST": "Content-Type", } rn63AllowedHeaders = map[string]string{ @@ -38,7 +38,7 @@ var ( rn27AllowedHeaders = map[string]string{ "POST": "Content-Type", } - rn195AllowedHeaders = map[string]string{ + rn196AllowedHeaders = map[string]string{ "POST": "Content-Type", } rn22AllowedHeaders = map[string]string{ @@ -59,7 +59,7 @@ var ( rn107AllowedHeaders = map[string]string{ "POST": "Content-Type", } - rn196AllowedHeaders = map[string]string{ + rn197AllowedHeaders = map[string]string{ "POST": "Content-Type", } rn12AllowedHeaders = map[string]string{ @@ -74,13 +74,13 @@ var ( rn126AllowedHeaders = map[string]string{ "GET": "Accept-Language", } - rn190AllowedHeaders = map[string]string{ + rn191AllowedHeaders = map[string]string{ "POST": "Content-Type", } - rn172AllowedHeaders = map[string]string{ + rn173AllowedHeaders = map[string]string{ "GET": "Accept-Language", } - rn175AllowedHeaders = map[string]string{ + rn176AllowedHeaders = map[string]string{ "GET": "Accept-Language", } rn45AllowedHeaders = map[string]string{ @@ -89,7 +89,7 @@ var ( rn23AllowedHeaders = map[string]string{ "POST": "Content-Type", } - rn199AllowedHeaders = map[string]string{ + rn200AllowedHeaders = map[string]string{ "POST": "Content-Type", } rn24AllowedHeaders = map[string]string{ @@ -176,7 +176,7 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { default: s.notAllowed(w, r, notAllowedParams{ allowedMethods: "POST", - allowedHeaders: rn192AllowedHeaders, + allowedHeaders: rn193AllowedHeaders, acceptPost: "application/json", acceptPatch: "", }) @@ -1575,7 +1575,7 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { default: s.notAllowed(w, r, notAllowedParams{ allowedMethods: "POST", - allowedHeaders: rn195AllowedHeaders, + allowedHeaders: rn196AllowedHeaders, acceptPost: "application/json", acceptPatch: "", }) @@ -2956,7 +2956,7 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { default: s.notAllowed(w, r, notAllowedParams{ allowedMethods: "POST", - allowedHeaders: rn196AllowedHeaders, + allowedHeaders: rn197AllowedHeaders, acceptPost: "application/json", acceptPatch: "", }) @@ -3405,7 +3405,7 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { default: s.notAllowed(w, r, notAllowedParams{ allowedMethods: "POST", - allowedHeaders: rn190AllowedHeaders, + allowedHeaders: rn191AllowedHeaders, acceptPost: "application/json", acceptPatch: "", }) @@ -3510,33 +3510,111 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { } - case 'r': // Prefix: "rates" + case 'r': // Prefix: "r" - if l := len("rates"); len(elem) >= l && elem[0:l] == "rates" { + if l := len("r"); len(elem) >= l && elem[0:l] == "r" { elem = elem[l:] } else { break } if len(elem) == 0 { - switch r.Method { - case "GET": - s.handleGetRatesRequest([0]string{}, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "GET", - allowedHeaders: nil, - acceptPost: "", - acceptPatch: "", - }) - } - - return + break } switch elem[0] { - case '/': // Prefix: "/" + case 'a': // Prefix: "ates" - if l := len("/"); len(elem) >= l && elem[0:l] == "/" { + if l := len("ates"); len(elem) >= l && elem[0:l] == "ates" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + switch r.Method { + case "GET": + s.handleGetRatesRequest([0]string{}, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: nil, + acceptPost: "", + acceptPatch: "", + }) + } + + return + } + switch elem[0] { + case '/': // Prefix: "/" + + if l := len("/"); len(elem) >= l && elem[0:l] == "/" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + break + } + switch elem[0] { + case 'c': // Prefix: "chart" + + if l := len("chart"); len(elem) >= l && elem[0:l] == "chart" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "GET": + s.handleGetChartRatesRequest([0]string{}, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: nil, + acceptPost: "", + acceptPatch: "", + }) + } + + return + } + + case 'm': // Prefix: "markets" + + if l := len("markets"); len(elem) >= l && elem[0:l] == "markets" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "GET": + s.handleGetMarketsRatesRequest([0]string{}, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: nil, + acceptPost: "", + acceptPatch: "", + }) + } + + return + } + + } + + } + + case 'e': // Prefix: "ewards/" + + if l := len("ewards/"); len(elem) >= l && elem[0:l] == "ewards/" { elem = elem[l:] } else { break @@ -3546,9 +3624,9 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { break } switch elem[0] { - case 'c': // Prefix: "chart" + case 'r': // Prefix: "round-rewards" - if l := len("chart"); len(elem) >= l && elem[0:l] == "chart" { + if l := len("round-rewards"); len(elem) >= l && elem[0:l] == "round-rewards" { elem = elem[l:] } else { break @@ -3558,7 +3636,7 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { // Leaf node. switch r.Method { case "GET": - s.handleGetChartRatesRequest([0]string{}, elemIsEscaped, w, r) + s.handleGetRoundRewardsRequest([0]string{}, elemIsEscaped, w, r) default: s.notAllowed(w, r, notAllowedParams{ allowedMethods: "GET", @@ -3571,29 +3649,68 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { return } - case 'm': // Prefix: "markets" + case 'v': // Prefix: "validat" - if l := len("markets"); len(elem) >= l && elem[0:l] == "markets" { + if l := len("validat"); len(elem) >= l && elem[0:l] == "validat" { elem = elem[l:] } else { break } if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "GET": - s.handleGetMarketsRatesRequest([0]string{}, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "GET", - allowedHeaders: nil, - acceptPost: "", - acceptPatch: "", - }) + break + } + switch elem[0] { + case 'i': // Prefix: "ion-rounds" + + if l := len("ion-rounds"); len(elem) >= l && elem[0:l] == "ion-rounds" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "GET": + s.handleGetValidationRoundsRequest([0]string{}, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: nil, + acceptPost: "", + acceptPatch: "", + }) + } + + return + } + + case 'o': // Prefix: "ors" + + if l := len("ors"); len(elem) >= l && elem[0:l] == "ors" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "GET": + s.handleGetValidatorsRequest([0]string{}, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: nil, + acceptPost: "", + acceptPatch: "", + }) + } + + return } - return } } @@ -3724,7 +3841,7 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { default: s.notAllowed(w, r, notAllowedParams{ allowedMethods: "GET", - allowedHeaders: rn172AllowedHeaders, + allowedHeaders: rn173AllowedHeaders, acceptPost: "", acceptPatch: "", }) @@ -3778,7 +3895,7 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { default: s.notAllowed(w, r, notAllowedParams{ allowedMethods: "GET", - allowedHeaders: rn175AllowedHeaders, + allowedHeaders: rn176AllowedHeaders, acceptPost: "", acceptPatch: "", }) @@ -3990,109 +4107,6 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { } - case 'v': // Prefix: "validation/" - - if l := len("validation/"); len(elem) >= l && elem[0:l] == "validation/" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - break - } - switch elem[0] { - case 'r': // Prefix: "r" - - if l := len("r"); len(elem) >= l && elem[0:l] == "r" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - break - } - switch elem[0] { - case 'e': // Prefix: "ewards" - - if l := len("ewards"); len(elem) >= l && elem[0:l] == "ewards" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "GET": - s.handleGetRoundRewardsRequest([0]string{}, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "GET", - allowedHeaders: nil, - acceptPost: "", - acceptPatch: "", - }) - } - - return - } - - case 'o': // Prefix: "ounds" - - if l := len("ounds"); len(elem) >= l && elem[0:l] == "ounds" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "GET": - s.handleGetValidationRoundsRequest([0]string{}, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "GET", - allowedHeaders: nil, - acceptPost: "", - acceptPatch: "", - }) - } - - return - } - - } - - case 'v': // Prefix: "validators" - - if l := len("validators"); len(elem) >= l && elem[0:l] == "validators" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "GET": - s.handleGetValidatorsRequest([0]string{}, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "GET", - allowedHeaders: nil, - acceptPost: "", - acceptPatch: "", - }) - } - - return - } - - } - case 'w': // Prefix: "wallet/" if l := len("wallet/"); len(elem) >= l && elem[0:l] == "wallet/" { @@ -4121,7 +4135,7 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { default: s.notAllowed(w, r, notAllowedParams{ allowedMethods: "POST", - allowedHeaders: rn199AllowedHeaders, + allowedHeaders: rn200AllowedHeaders, acceptPost: "application/json", acceptPatch: "", }) @@ -7547,33 +7561,111 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { } - case 'r': // Prefix: "rates" + case 'r': // Prefix: "r" - if l := len("rates"); len(elem) >= l && elem[0:l] == "rates" { + if l := len("r"); len(elem) >= l && elem[0:l] == "r" { elem = elem[l:] } else { break } if len(elem) == 0 { - switch method { - case "GET": - r.name = GetRatesOperation - r.summary = "" - r.operationID = "getRates" - r.operationGroup = "" - r.pathPattern = "/v2/rates" - r.args = args - r.count = 0 - return r, true - default: - return - } + break } switch elem[0] { - case '/': // Prefix: "/" + case 'a': // Prefix: "ates" - if l := len("/"); len(elem) >= l && elem[0:l] == "/" { + if l := len("ates"); len(elem) >= l && elem[0:l] == "ates" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + switch method { + case "GET": + r.name = GetRatesOperation + r.summary = "" + r.operationID = "getRates" + r.operationGroup = "" + r.pathPattern = "/v2/rates" + r.args = args + r.count = 0 + return r, true + default: + return + } + } + switch elem[0] { + case '/': // Prefix: "/" + + if l := len("/"); len(elem) >= l && elem[0:l] == "/" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + break + } + switch elem[0] { + case 'c': // Prefix: "chart" + + if l := len("chart"); len(elem) >= l && elem[0:l] == "chart" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch method { + case "GET": + r.name = GetChartRatesOperation + r.summary = "" + r.operationID = "getChartRates" + r.operationGroup = "" + r.pathPattern = "/v2/rates/chart" + r.args = args + r.count = 0 + return r, true + default: + return + } + } + + case 'm': // Prefix: "markets" + + if l := len("markets"); len(elem) >= l && elem[0:l] == "markets" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch method { + case "GET": + r.name = GetMarketsRatesOperation + r.summary = "" + r.operationID = "getMarketsRates" + r.operationGroup = "" + r.pathPattern = "/v2/rates/markets" + r.args = args + r.count = 0 + return r, true + default: + return + } + } + + } + + } + + case 'e': // Prefix: "ewards/" + + if l := len("ewards/"); len(elem) >= l && elem[0:l] == "ewards/" { elem = elem[l:] } else { break @@ -7583,9 +7675,9 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { break } switch elem[0] { - case 'c': // Prefix: "chart" + case 'r': // Prefix: "round-rewards" - if l := len("chart"); len(elem) >= l && elem[0:l] == "chart" { + if l := len("round-rewards"); len(elem) >= l && elem[0:l] == "round-rewards" { elem = elem[l:] } else { break @@ -7595,11 +7687,11 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { // Leaf node. switch method { case "GET": - r.name = GetChartRatesOperation - r.summary = "" - r.operationID = "getChartRates" + r.name = GetRoundRewardsOperation + r.summary = "Get per-validator reward distribution for a finished round" + r.operationID = "getRoundRewards" r.operationGroup = "" - r.pathPattern = "/v2/rates/chart" + r.pathPattern = "/v2/rewards/round-rewards" r.args = args r.count = 0 return r, true @@ -7608,29 +7700,68 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { } } - case 'm': // Prefix: "markets" + case 'v': // Prefix: "validat" - if l := len("markets"); len(elem) >= l && elem[0:l] == "markets" { + if l := len("validat"); len(elem) >= l && elem[0:l] == "validat" { elem = elem[l:] } else { break } if len(elem) == 0 { - // Leaf node. - switch method { - case "GET": - r.name = GetMarketsRatesOperation - r.summary = "" - r.operationID = "getMarketsRates" - r.operationGroup = "" - r.pathPattern = "/v2/rates/markets" - r.args = args - r.count = 0 - return r, true - default: - return + break + } + switch elem[0] { + case 'i': // Prefix: "ion-rounds" + + if l := len("ion-rounds"); len(elem) >= l && elem[0:l] == "ion-rounds" { + elem = elem[l:] + } else { + break } + + if len(elem) == 0 { + // Leaf node. + switch method { + case "GET": + r.name = GetValidationRoundsOperation + r.summary = "Get validation round metadata" + r.operationID = "getValidationRounds" + r.operationGroup = "" + r.pathPattern = "/v2/rewards/validation-rounds" + r.args = args + r.count = 0 + return r, true + default: + return + } + } + + case 'o': // Prefix: "ors" + + if l := len("ors"); len(elem) >= l && elem[0:l] == "ors" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch method { + case "GET": + r.name = GetValidatorsOperation + r.summary = "Get all current validators" + r.operationID = "getValidators" + r.operationGroup = "" + r.pathPattern = "/v2/rewards/validators" + r.args = args + r.count = 0 + return r, true + default: + return + } + } + } } @@ -8019,109 +8150,6 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { } - case 'v': // Prefix: "validation/" - - if l := len("validation/"); len(elem) >= l && elem[0:l] == "validation/" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - break - } - switch elem[0] { - case 'r': // Prefix: "r" - - if l := len("r"); len(elem) >= l && elem[0:l] == "r" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - break - } - switch elem[0] { - case 'e': // Prefix: "ewards" - - if l := len("ewards"); len(elem) >= l && elem[0:l] == "ewards" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - // Leaf node. - switch method { - case "GET": - r.name = GetRoundRewardsOperation - r.summary = "Get per-validator reward distribution for a finished round" - r.operationID = "getRoundRewards" - r.operationGroup = "" - r.pathPattern = "/v2/validation/rewards" - r.args = args - r.count = 0 - return r, true - default: - return - } - } - - case 'o': // Prefix: "ounds" - - if l := len("ounds"); len(elem) >= l && elem[0:l] == "ounds" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - // Leaf node. - switch method { - case "GET": - r.name = GetValidationRoundsOperation - r.summary = "Get validation round metadata" - r.operationID = "getValidationRounds" - r.operationGroup = "" - r.pathPattern = "/v2/validation/rounds" - r.args = args - r.count = 0 - return r, true - default: - return - } - } - - } - - case 'v': // Prefix: "validators" - - if l := len("validators"); len(elem) >= l && elem[0:l] == "validators" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - // Leaf node. - switch method { - case "GET": - r.name = GetValidatorsOperation - r.summary = "Get all current validators" - r.operationID = "getValidators" - r.operationGroup = "" - r.pathPattern = "/v2/validation/validators" - r.args = args - r.count = 0 - return r, true - default: - return - } - } - - } - case 'w': // Prefix: "wallet/" if l := len("wallet/"); len(elem) >= l && elem[0:l] == "wallet/" { diff --git a/pkg/oas/oas_schemas_gen.go b/pkg/oas/oas_schemas_gen.go index 055de38e6..ab41019d1 100644 --- a/pkg/oas/oas_schemas_gen.go +++ b/pkg/oas/oas_schemas_gen.go @@ -19823,7 +19823,7 @@ func (s *UnSubscriptionAction) SetAdmin(val AccountAddress) { // Ref: #/components/schemas/ValidationRound type ValidationRound struct { // Election ID (electAt timestamp). - ElectAt OptInt64 `json:"elect_at"` + ElectionID int64 `json:"election_id"` StartUtime OptInt64 `json:"start_utime"` EndUtime OptInt64 `json:"end_utime"` // Masterchain block seqno at (or nearest to) round start. @@ -19843,9 +19843,9 @@ type ValidationRound struct { Finished bool `json:"finished"` } -// GetElectAt returns the value of ElectAt. -func (s *ValidationRound) GetElectAt() OptInt64 { - return s.ElectAt +// GetElectionID returns the value of ElectionID. +func (s *ValidationRound) GetElectionID() int64 { + return s.ElectionID } // GetStartUtime returns the value of StartUtime. @@ -19893,9 +19893,9 @@ func (s *ValidationRound) GetFinished() bool { return s.Finished } -// SetElectAt sets the value of ElectAt. -func (s *ValidationRound) SetElectAt(val OptInt64) { - s.ElectAt = val +// SetElectionID sets the value of ElectionID. +func (s *ValidationRound) SetElectionID(val int64) { + s.ElectionID = val } // SetStartUtime sets the value of StartUtime. diff --git a/pkg/oas/oas_server_gen.go b/pkg/oas/oas_server_gen.go index f0c2d0bb5..9d151f790 100644 --- a/pkg/oas/oas_server_gen.go +++ b/pkg/oas/oas_server_gen.go @@ -604,7 +604,7 @@ type Handler interface { // Computes per-validator and per-nominator reward distribution for a finished validation round using // the elector's bonuses value. // - // GET /v2/validation/rewards + // GET /v2/rewards/round-rewards GetRoundRewards(ctx context.Context, params GetRoundRewardsParams) (*RoundRewardsResponse, error) // GetStakingPoolHistory implements getStakingPoolHistory operation. // @@ -647,14 +647,14 @@ type Handler interface { // Returns past and current validation rounds with boundaries, stakes, and bonuses. Always uses the // latest masterchain block. // - // GET /v2/validation/rounds + // GET /v2/rewards/validation-rounds GetValidationRounds(ctx context.Context, params GetValidationRoundsParams) (*ValidationRoundsResponse, error) // GetValidators implements getValidators operation. // // Returns all current validators with stakes, rewards, pool addresses, and (optionally) nominator // breakdowns. // - // GET /v2/validation/validators + // GET /v2/rewards/validators GetValidators(ctx context.Context, params GetValidatorsParams) (*ValidatorsResponse, error) // GetWalletInfo implements getWalletInfo operation. // diff --git a/pkg/oas/oas_unimplemented_gen.go b/pkg/oas/oas_unimplemented_gen.go index ef4901e76..1e48ded30 100644 --- a/pkg/oas/oas_unimplemented_gen.go +++ b/pkg/oas/oas_unimplemented_gen.go @@ -893,7 +893,7 @@ func (UnimplementedHandler) GetReducedBlockchainBlocks(ctx context.Context, para // Computes per-validator and per-nominator reward distribution for a finished validation round using // the elector's bonuses value. // -// GET /v2/validation/rewards +// GET /v2/rewards/round-rewards func (UnimplementedHandler) GetRoundRewards(ctx context.Context, params GetRoundRewardsParams) (r *RoundRewardsResponse, _ error) { return r, ht.ErrNotImplemented } @@ -957,7 +957,7 @@ func (UnimplementedHandler) GetTrace(ctx context.Context, params GetTraceParams) // Returns past and current validation rounds with boundaries, stakes, and bonuses. Always uses the // latest masterchain block. // -// GET /v2/validation/rounds +// GET /v2/rewards/validation-rounds func (UnimplementedHandler) GetValidationRounds(ctx context.Context, params GetValidationRoundsParams) (r *ValidationRoundsResponse, _ error) { return r, ht.ErrNotImplemented } @@ -967,7 +967,7 @@ func (UnimplementedHandler) GetValidationRounds(ctx context.Context, params GetV // Returns all current validators with stakes, rewards, pool addresses, and (optionally) nominator // breakdowns. // -// GET /v2/validation/validators +// GET /v2/rewards/validators func (UnimplementedHandler) GetValidators(ctx context.Context, params GetValidatorsParams) (r *ValidatorsResponse, _ error) { return r, ht.ErrNotImplemented } From d6efdf2dea93141acd23b1c6bd9221e171cb1a37 Mon Sep 17 00:00:00 2001 From: Victoria E Date: Fri, 17 Apr 2026 21:37:38 +0300 Subject: [PATCH 03/11] refresh cocoon connections --- pkg/api/cocoon_pool.go | 92 +++++++++++++++++++++++++++++------------- 1 file changed, 65 insertions(+), 27 deletions(-) diff --git a/pkg/api/cocoon_pool.go b/pkg/api/cocoon_pool.go index da0c5e004..0be1db13f 100644 --- a/pkg/api/cocoon_pool.go +++ b/pkg/api/cocoon_pool.go @@ -4,65 +4,103 @@ import ( "context" "math/rand/v2" "sync" + "time" gocoon "github.com/tonkeeper/gocoon/pkg/client" "go.uber.org/zap" ) +const defaultCocoonPoolRefreshInterval = 30 * time.Second + type CocoonDialer interface { Connect(ctx context.Context, logger *zap.Logger) (*gocoon.Connection, error) } type CocoonPool struct { - mu sync.Mutex - size int - client CocoonDialer - logger *zap.Logger - conns []*gocoon.Connection + mu sync.RWMutex + size int + client CocoonDialer + logger *zap.Logger + conns []*gocoon.Connection + refreshInterval time.Duration } -func NewCocoonPool(client CocoonDialer, logger *zap.Logger, size int) *CocoonPool { +func NewCocoonPool(client CocoonDialer, logger *zap.Logger, size int, refreshInterval time.Duration) *CocoonPool { if size <= 0 { size = 3 } + if refreshInterval <= 0 { + refreshInterval = defaultCocoonPoolRefreshInterval + } return &CocoonPool{ - client: client, - logger: logger, - size: size, - conns: make([]*gocoon.Connection, size), + client: client, + logger: logger, + size: size, + conns: make([]*gocoon.Connection, size), + refreshInterval: refreshInterval, } } func (p *CocoonPool) StartAsync() { for slot := range p.size { - go func(slot int) { - ctx := context.Background() - conn, err := p.client.Connect(ctx, p.logger) - if err != nil { - if p.logger != nil { - p.logger.Warn("cocoon pool: connect failed", zap.Int("slot", slot), zap.Error(err)) - } - return - } - p.mu.Lock() - p.conns[slot] = conn - p.mu.Unlock() - if p.logger != nil { - p.logger.Info("cocoon pool: connection ready", zap.Int("slot", slot)) + go p.fillSlot(slot) + } + if p.logger != nil { + p.logger.Info("cocoon pool: periodic connection refresh", zap.Duration("interval", p.refreshInterval)) + } + go p.refreshLoop() +} + +func (p *CocoonPool) refreshLoop() { + t := time.NewTicker(p.refreshInterval) + defer t.Stop() + for range t.C { + p.mu.Lock() + for i := range p.conns { + if c := p.conns[i]; c != nil { + _ = c.Close() + p.conns[i] = nil } - }(slot) + } + p.mu.Unlock() + if p.logger != nil { + p.logger.Info("cocoon pool: closing all connections for refresh") + } + for slot := range p.size { + go p.fillSlot(slot) + } } } -func (p *CocoonPool) pick(ctx context.Context) (*gocoon.Connection, error) { +func (p *CocoonPool) fillSlot(slot int) { + ctx := context.Background() + conn, err := p.client.Connect(ctx, p.logger) + if err != nil { + if p.logger != nil { + p.logger.Warn("cocoon pool: connect failed", zap.Int("slot", slot), zap.Error(err)) + } + return + } p.mu.Lock() + if old := p.conns[slot]; old != nil { + _ = old.Close() + } + p.conns[slot] = conn + p.mu.Unlock() + if p.logger != nil { + p.logger.Info("cocoon pool: connection ready", zap.Int("slot", slot)) + } +} + +func (p *CocoonPool) pick(ctx context.Context) (*gocoon.Connection, error) { + p.mu.RLock() ready := make([]*gocoon.Connection, 0, p.size) for _, c := range p.conns { if c != nil { ready = append(ready, c) } } - p.mu.Unlock() + p.mu.RUnlock() if len(ready) > 0 { return ready[rand.IntN(len(ready))], nil } From 83fefb7ee46625b9f1cc16299a892baef9e1fd4a Mon Sep 17 00:00:00 2001 From: Victoria E Date: Sat, 18 Apr 2026 10:34:42 +0300 Subject: [PATCH 04/11] /v1/chat/completions --- api/openapi.json | 60 ++++++ api/openapi.yml | 39 ++++ pkg/api/cocoon_handlers.go | 93 ++++++++-- pkg/oas/oas_client_gen.go | 89 +++++++++ pkg/oas/oas_handlers_gen.go | 157 ++++++++++++++++ pkg/oas/oas_interfaces_gen.go | 4 + pkg/oas/oas_json_gen.go | 262 +++++++++++++++++++++++++++ pkg/oas/oas_operations_gen.go | 1 + pkg/oas/oas_request_decoders_gen.go | 73 ++++++++ pkg/oas/oas_request_encoders_gen.go | 16 ++ pkg/oas/oas_response_decoders_gen.go | 153 ++++++++++++++++ pkg/oas/oas_response_encoders_gen.go | 46 +++++ pkg/oas/oas_router_gen.go | 65 ++++++- pkg/oas/oas_schemas_gen.go | 95 ++++++++++ pkg/oas/oas_server_gen.go | 9 + pkg/oas/oas_unimplemented_gen.go | 12 ++ 16 files changed, 1154 insertions(+), 20 deletions(-) diff --git a/api/openapi.json b/api/openapi.json index 7da1c1851..76a859cf3 100644 --- a/api/openapi.json +++ b/api/openapi.json @@ -7847,6 +7847,66 @@ } } }, + "/cocoon/v1/chat/completions": { + "post": { + "description": "OpenAI-compatible [Create chat completion](https://developers.openai.com/api/reference/resources/chat/subresources/completions/methods/create).\nForwards the JSON body to Cocoon as `POST /v1/chat/completions` (same as `/cocoon/query` with `path=/v1/chat/completions`).\n", + "operationId": "postCocoonV1ChatCompletions", + "requestBody": { + "content": { + "application/json": { + "schema": {} + } + }, + "required": true + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": {} + } + }, + "description": "Successful response" + }, + "401": { + "content": { + "application/json": { + "schema": { + "properties": { + "error": { + "properties": { + "message": { + "type": "string" + }, + "type": { + "type": "string" + } + }, + "type": "object" + } + }, + "type": "object" + } + } + }, + "description": "Unauthorized" + }, + "501": { + "content": { + "application/json": { + "schema": { + "type": "object" + } + } + }, + "description": "Not implemented" + }, + "default": { + "$ref": "#/components/responses/Error" + } + } + } + }, "/cocoon/workers": { "get": { "description": "Cocoon worker types (same shape as gocoon Connection.GetWorkerTypes)", diff --git a/api/openapi.yml b/api/openapi.yml index 39869d53e..15bd15641 100644 --- a/api/openapi.yml +++ b/api/openapi.yml @@ -3214,6 +3214,45 @@ paths: type: object 'default': $ref: '#/components/responses/Error' + + /cocoon/v1/chat/completions: + post: + operationId: postCocoonV1ChatCompletions + description: | + OpenAI-compatible [Create chat completion](https://developers.openai.com/api/reference/resources/chat/subresources/completions/methods/create). + requestBody: + required: true + content: + application/json: + schema: { } # OpenAI-style chat completion request + responses: + '200': + description: Successful response + content: + application/json: + schema: { } # OpenAI-style chat completion response + '401': + description: Unauthorized + content: + application/json: + schema: + type: object + properties: + error: + type: object + properties: + message: + type: string + type: + type: string + '501': + description: Not implemented + content: + application/json: + schema: + type: object + 'default': + $ref: '#/components/responses/Error' components: parameters: masterchainSeqno: diff --git a/pkg/api/cocoon_handlers.go b/pkg/api/cocoon_handlers.go index ef4caf670..3b067ed3a 100644 --- a/pkg/api/cocoon_handlers.go +++ b/pkg/api/cocoon_handlers.go @@ -1,8 +1,12 @@ package api import ( + "bufio" + "bytes" "context" "encoding/json" + "fmt" + "io" "net/http" "github.com/go-faster/jx" @@ -11,23 +15,48 @@ import ( "github.com/tonkeeper/opentonapi/pkg/oas" ) -func (h *Handler) PostCocoonQuery(ctx context.Context, req jx.Raw, params oas.PostCocoonQueryParams) (oas.PostCocoonQueryRes, error) { - if h.cocoonPool == nil { - return &oas.PostCocoonQueryNotImplemented{}, nil +func cocoonResponseAsJSON(resp []byte) ([]byte, error) { + if len(resp) == 0 { + return nil, fmt.Errorf("empty cocoon response") } - conn, err := h.cocoonPool.pick(ctx) - if err != nil { - return nil, toError(http.StatusInternalServerError, err) + trim := bytes.TrimLeft(resp, " \t\r\n") + body := resp + if bytes.HasPrefix(trim, []byte("HTTP/")) { + httpRes, err := http.ReadResponse(bufio.NewReader(bytes.NewReader(resp)), nil) + if err != nil { + return nil, fmt.Errorf("parse cocoon http response: %w", err) + } + defer httpRes.Body.Close() + b, err := io.ReadAll(httpRes.Body) + if err != nil { + return nil, err + } + body = bytes.TrimSpace(b) + } else { + i := bytes.IndexFunc(trim, func(c rune) bool { return c == '{' || c == '[' }) + if i < 0 { + return nil, fmt.Errorf("no JSON value in cocoon response") + } + off := len(resp) - len(trim) + i + body = bytes.TrimSpace(resp[off:]) + } + body = bytes.TrimPrefix(body, []byte{0xEF, 0xBB, 0xBF}) + dec := json.NewDecoder(bytes.NewReader(body)) + var out json.RawMessage + if err := dec.Decode(&out); err != nil { + return nil, fmt.Errorf("cocoon response is not valid JSON: %w", err) } + return []byte(out), nil +} - body := []byte(req) +func mergeCocoonModelIntoBody(req jx.Raw, modelQuery oas.OptString) (body []byte, model string) { + body = []byte(req) if len(body) == 0 { body = []byte("{}") } - - model := "" - if params.Model.Set { - model = params.Model.Value + model = "" + if modelQuery.Set { + model = modelQuery.Value } var obj map[string]any if err := json.Unmarshal(body, &obj); err == nil && obj != nil { @@ -40,14 +69,50 @@ func (h *Handler) PostCocoonQuery(ctx context.Context, req jx.Raw, params oas.Po body = b } } + return body, model +} - upstreamPath := params.Path.Value +func (h *Handler) PostCocoonQuery(ctx context.Context, req jx.Raw, params oas.PostCocoonQueryParams) (oas.PostCocoonQueryRes, error) { + //if h.cocoonPool == nil { + // return &oas.PostCocoonQueryNotImplemented{}, nil + //} + //body, model := mergeCocoonModelIntoBody(req, params.Model) + //conn, err := h.cocoonPool.pick(ctx) + //if err != nil { + // return nil, toError(http.StatusInternalServerError, err) + //} + //respBody, err := conn.POST(ctx, model, params.Path.Value, body) + //if err != nil { + // return nil, toError(http.StatusBadGateway, err) + //} + //jsonBody, err := cocoonResponseAsJSON(respBody) + //if err != nil { + // return nil, toError(http.StatusBadGateway, err) + //} + //ok := oas.PostCocoonQueryOKApplicationJSON(jx.Raw(jsonBody)) + //return &ok, nil + return &oas.PostCocoonQueryNotImplemented{}, nil +} + +func (h *Handler) PostCocoonV1ChatCompletions(ctx context.Context, req jx.Raw) (oas.PostCocoonV1ChatCompletionsRes, error) { + if h.cocoonPool == nil { + return &oas.PostCocoonV1ChatCompletionsNotImplemented{}, nil + } + body, model := mergeCocoonModelIntoBody(req, oas.OptString{}) + conn, err := h.cocoonPool.pick(ctx) + if err != nil { + return nil, toError(http.StatusInternalServerError, err) + } + const upstreamPath = "/v1/chat/completions" respBody, err := conn.POST(ctx, model, upstreamPath, body) if err != nil { return nil, toError(http.StatusBadGateway, err) } - - ok := oas.PostCocoonQueryOKApplicationJSON(jx.Raw(respBody)) + jsonBody, err := cocoonResponseAsJSON(respBody) + if err != nil { + return nil, toError(http.StatusBadGateway, err) + } + ok := oas.PostCocoonV1ChatCompletionsOKApplicationJSON(jx.Raw(jsonBody)) return &ok, nil } diff --git a/pkg/oas/oas_client_gen.go b/pkg/oas/oas_client_gen.go index c1455429f..e8fca6649 100644 --- a/pkg/oas/oas_client_gen.go +++ b/pkg/oas/oas_client_gen.go @@ -698,6 +698,15 @@ type Invoker interface { // // POST /cocoon/query PostCocoonQuery(ctx context.Context, request jx.Raw, params PostCocoonQueryParams) (PostCocoonQueryRes, error) + // PostCocoonV1ChatCompletions invokes postCocoonV1ChatCompletions operation. + // + // OpenAI-compatible [Create chat completion](https://developers.openai. + // com/api/reference/resources/chat/subresources/completions/methods/create). + // Forwards the JSON body to Cocoon as `POST /v1/chat/completions` (same as `/cocoon/query` with + // `path=/v1/chat/completions`). + // + // POST /cocoon/v1/chat/completions + PostCocoonV1ChatCompletions(ctx context.Context, request jx.Raw) (PostCocoonV1ChatCompletionsRes, error) // ReindexAccount invokes reindexAccount operation. // // Update internal cache for a particular account. @@ -12559,6 +12568,86 @@ func (c *Client) sendPostCocoonQuery(ctx context.Context, request jx.Raw, params return result, nil } +// PostCocoonV1ChatCompletions invokes postCocoonV1ChatCompletions operation. +// +// OpenAI-compatible [Create chat completion](https://developers.openai. +// com/api/reference/resources/chat/subresources/completions/methods/create). +// Forwards the JSON body to Cocoon as `POST /v1/chat/completions` (same as `/cocoon/query` with +// `path=/v1/chat/completions`). +// +// POST /cocoon/v1/chat/completions +func (c *Client) PostCocoonV1ChatCompletions(ctx context.Context, request jx.Raw) (PostCocoonV1ChatCompletionsRes, error) { + res, err := c.sendPostCocoonV1ChatCompletions(ctx, request) + return res, err +} + +func (c *Client) sendPostCocoonV1ChatCompletions(ctx context.Context, request jx.Raw) (res PostCocoonV1ChatCompletionsRes, err error) { + otelAttrs := []attribute.KeyValue{ + otelogen.OperationID("postCocoonV1ChatCompletions"), + semconv.HTTPRequestMethodKey.String("POST"), + semconv.URLTemplateKey.String("/cocoon/v1/chat/completions"), + } + otelAttrs = append(otelAttrs, c.cfg.Attributes...) + + // Run stopwatch. + startTime := time.Now() + defer func() { + // Use floating point division here for higher precision (instead of Millisecond method). + elapsedDuration := time.Since(startTime) + c.duration.Record(ctx, float64(elapsedDuration)/float64(time.Millisecond), metric.WithAttributes(otelAttrs...)) + }() + + // Increment request counter. + c.requests.Add(ctx, 1, metric.WithAttributes(otelAttrs...)) + + // Start a span for this request. + ctx, span := c.cfg.Tracer.Start(ctx, PostCocoonV1ChatCompletionsOperation, + trace.WithAttributes(otelAttrs...), + clientSpanKind, + ) + // Track stage for error reporting. + var stage string + defer func() { + if err != nil { + span.RecordError(err) + span.SetStatus(codes.Error, stage) + c.errors.Add(ctx, 1, metric.WithAttributes(otelAttrs...)) + } + span.End() + }() + + stage = "BuildURL" + u := uri.Clone(c.requestURL(ctx)) + var pathParts [1]string + pathParts[0] = "/cocoon/v1/chat/completions" + uri.AddPathParts(u, pathParts[:]...) + + stage = "EncodeRequest" + r, err := ht.NewRequest(ctx, "POST", u) + if err != nil { + return res, errors.Wrap(err, "create request") + } + if err := encodePostCocoonV1ChatCompletionsRequest(request, r); err != nil { + return res, errors.Wrap(err, "encode request") + } + + stage = "SendRequest" + resp, err := c.cfg.Client.Do(r) + if err != nil { + return res, errors.Wrap(err, "do request") + } + body := resp.Body + defer body.Close() + + stage = "DecodeResponse" + result, err := decodePostCocoonV1ChatCompletionsResponse(resp) + if err != nil { + return res, errors.Wrap(err, "decode response") + } + + return result, nil +} + // ReindexAccount invokes reindexAccount operation. // // Update internal cache for a particular account. diff --git a/pkg/oas/oas_handlers_gen.go b/pkg/oas/oas_handlers_gen.go index 382fef235..cd467d4fe 100644 --- a/pkg/oas/oas_handlers_gen.go +++ b/pkg/oas/oas_handlers_gen.go @@ -17002,6 +17002,163 @@ func (s *Server) handlePostCocoonQueryRequest(args [0]string, argsEscaped bool, } } +// handlePostCocoonV1ChatCompletionsRequest handles postCocoonV1ChatCompletions operation. +// +// OpenAI-compatible [Create chat completion](https://developers.openai. +// com/api/reference/resources/chat/subresources/completions/methods/create). +// Forwards the JSON body to Cocoon as `POST /v1/chat/completions` (same as `/cocoon/query` with +// `path=/v1/chat/completions`). +// +// POST /cocoon/v1/chat/completions +func (s *Server) handlePostCocoonV1ChatCompletionsRequest(args [0]string, argsEscaped bool, w http.ResponseWriter, r *http.Request) { + statusWriter := &codeRecorder{ResponseWriter: w} + w = statusWriter + otelAttrs := []attribute.KeyValue{ + otelogen.OperationID("postCocoonV1ChatCompletions"), + semconv.HTTPRequestMethodKey.String("POST"), + semconv.HTTPRouteKey.String("/cocoon/v1/chat/completions"), + } + // Add attributes from config. + otelAttrs = append(otelAttrs, s.cfg.Attributes...) + + // Start a span for this request. + ctx, span := s.cfg.Tracer.Start(r.Context(), PostCocoonV1ChatCompletionsOperation, + trace.WithAttributes(otelAttrs...), + serverSpanKind, + ) + defer span.End() + + // Add Labeler to context. + labeler := &Labeler{attrs: otelAttrs} + ctx = contextWithLabeler(ctx, labeler) + + // Run stopwatch. + startTime := time.Now() + defer func() { + elapsedDuration := time.Since(startTime) + + attrSet := labeler.AttributeSet() + attrs := attrSet.ToSlice() + code := statusWriter.status + if code != 0 { + codeAttr := semconv.HTTPResponseStatusCode(code) + attrs = append(attrs, codeAttr) + span.SetAttributes(codeAttr) + } + attrOpt := metric.WithAttributes(attrs...) + + // Increment request counter. + s.requests.Add(ctx, 1, attrOpt) + + // Use floating point division here for higher precision (instead of Millisecond method). + s.duration.Record(ctx, float64(elapsedDuration)/float64(time.Millisecond), attrOpt) + }() + + var ( + recordError = func(stage string, err error) { + span.RecordError(err) + + // https://opentelemetry.io/docs/specs/semconv/http/http-spans/#status + // Span Status MUST be left unset if HTTP status code was in the 1xx, 2xx or 3xx ranges, + // unless there was another error (e.g., network error receiving the response body; or 3xx codes with + // max redirects exceeded), in which case status MUST be set to Error. + code := statusWriter.status + if code < 100 || code >= 500 { + span.SetStatus(codes.Error, stage) + } + + attrSet := labeler.AttributeSet() + attrs := attrSet.ToSlice() + if code != 0 { + attrs = append(attrs, semconv.HTTPResponseStatusCode(code)) + } + + s.errors.Add(ctx, 1, metric.WithAttributes(attrs...)) + } + err error + opErrContext = ogenerrors.OperationContext{ + Name: PostCocoonV1ChatCompletionsOperation, + ID: "postCocoonV1ChatCompletions", + } + ) + + var rawBody []byte + request, rawBody, close, err := s.decodePostCocoonV1ChatCompletionsRequest(r) + if err != nil { + err = &ogenerrors.DecodeRequestError{ + OperationContext: opErrContext, + Err: err, + } + defer recordError("DecodeRequest", err) + s.cfg.ErrorHandler(ctx, w, r, err) + return + } + defer func() { + if err := close(); err != nil { + recordError("CloseRequest", err) + } + }() + + var response PostCocoonV1ChatCompletionsRes + if m := s.cfg.Middleware; m != nil { + mreq := middleware.Request{ + Context: ctx, + OperationName: PostCocoonV1ChatCompletionsOperation, + OperationSummary: "", + OperationID: "postCocoonV1ChatCompletions", + Body: request, + RawBody: rawBody, + Params: middleware.Parameters{}, + Raw: r, + } + + type ( + Request = jx.Raw + Params = struct{} + Response = PostCocoonV1ChatCompletionsRes + ) + response, err = middleware.HookMiddleware[ + Request, + Params, + Response, + ]( + m, + mreq, + nil, + func(ctx context.Context, request Request, params Params) (response Response, err error) { + response, err = s.h.PostCocoonV1ChatCompletions(ctx, request) + return response, err + }, + ) + } else { + response, err = s.h.PostCocoonV1ChatCompletions(ctx, request) + } + if err != nil { + if errRes, ok := errors.Into[*ErrorStatusCode](err); ok { + if err := encodeErrorResponse(errRes, w, span); err != nil { + defer recordError("Internal", err) + } + return + } + if errors.Is(err, ht.ErrNotImplemented) { + s.cfg.ErrorHandler(ctx, w, r, err) + return + } + if err := encodeErrorResponse(s.h.NewError(ctx, err), w, span); err != nil { + defer recordError("Internal", err) + } + return + } + + if err := encodePostCocoonV1ChatCompletionsResponse(response, w, span); err != nil { + defer recordError("EncodeResponse", err) + if !errors.Is(err, ht.ErrInternalServerErrorResponse) { + s.cfg.ErrorHandler(ctx, w, r, err) + } + return + } +} + // handleReindexAccountRequest handles reindexAccount operation. // // Update internal cache for a particular account. diff --git a/pkg/oas/oas_interfaces_gen.go b/pkg/oas/oas_interfaces_gen.go index 5d143208b..adb6bb769 100644 --- a/pkg/oas/oas_interfaces_gen.go +++ b/pkg/oas/oas_interfaces_gen.go @@ -8,3 +8,7 @@ type GetCocoonWorkersRes interface { type PostCocoonQueryRes interface { postCocoonQueryRes() } + +type PostCocoonV1ChatCompletionsRes interface { + postCocoonV1ChatCompletionsRes() +} diff --git a/pkg/oas/oas_json_gen.go b/pkg/oas/oas_json_gen.go index 56b6822b0..2452f9af8 100644 --- a/pkg/oas/oas_json_gen.go +++ b/pkg/oas/oas_json_gen.go @@ -35174,6 +35174,39 @@ func (s *OptPostCocoonQueryUnauthorizedError) UnmarshalJSON(data []byte) error { return s.Decode(d) } +// Encode encodes PostCocoonV1ChatCompletionsUnauthorizedError as json. +func (o OptPostCocoonV1ChatCompletionsUnauthorizedError) Encode(e *jx.Encoder) { + if !o.Set { + return + } + o.Value.Encode(e) +} + +// Decode decodes PostCocoonV1ChatCompletionsUnauthorizedError from json. +func (o *OptPostCocoonV1ChatCompletionsUnauthorizedError) Decode(d *jx.Decoder) error { + if o == nil { + return errors.New("invalid: unable to decode OptPostCocoonV1ChatCompletionsUnauthorizedError to nil") + } + o.Set = true + if err := o.Value.Decode(d); err != nil { + return err + } + return nil +} + +// MarshalJSON implements stdjson.Marshaler. +func (s OptPostCocoonV1ChatCompletionsUnauthorizedError) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *OptPostCocoonV1ChatCompletionsUnauthorizedError) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + // Encode encodes Price as json. func (o OptPrice) Encode(e *jx.Encoder) { if !o.Set { @@ -37308,6 +37341,235 @@ func (s *PostCocoonQueryUnauthorizedError) UnmarshalJSON(data []byte) error { return s.Decode(d) } +// Encode implements json.Marshaler. +func (s *PostCocoonV1ChatCompletionsNotImplemented) Encode(e *jx.Encoder) { + e.ObjStart() + s.encodeFields(e) + e.ObjEnd() +} + +// encodeFields encodes fields. +func (s *PostCocoonV1ChatCompletionsNotImplemented) encodeFields(e *jx.Encoder) { +} + +var jsonFieldsNameOfPostCocoonV1ChatCompletionsNotImplemented = [0]string{} + +// Decode decodes PostCocoonV1ChatCompletionsNotImplemented from json. +func (s *PostCocoonV1ChatCompletionsNotImplemented) Decode(d *jx.Decoder) error { + if s == nil { + return errors.New("invalid: unable to decode PostCocoonV1ChatCompletionsNotImplemented to nil") + } + + if err := d.ObjBytes(func(d *jx.Decoder, k []byte) error { + switch string(k) { + default: + return d.Skip() + } + }); err != nil { + return errors.Wrap(err, "decode PostCocoonV1ChatCompletionsNotImplemented") + } + + return nil +} + +// MarshalJSON implements stdjson.Marshaler. +func (s *PostCocoonV1ChatCompletionsNotImplemented) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *PostCocoonV1ChatCompletionsNotImplemented) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + +// Encode encodes PostCocoonV1ChatCompletionsOKApplicationJSON as json. +func (s PostCocoonV1ChatCompletionsOKApplicationJSON) Encode(e *jx.Encoder) { + unwrapped := jx.Raw(s) + + if len(unwrapped) != 0 { + e.Raw(unwrapped) + } +} + +// Decode decodes PostCocoonV1ChatCompletionsOKApplicationJSON from json. +func (s *PostCocoonV1ChatCompletionsOKApplicationJSON) Decode(d *jx.Decoder) error { + if s == nil { + return errors.New("invalid: unable to decode PostCocoonV1ChatCompletionsOKApplicationJSON to nil") + } + var unwrapped jx.Raw + if err := func() error { + v, err := d.RawAppend(nil) + unwrapped = jx.Raw(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "alias") + } + *s = PostCocoonV1ChatCompletionsOKApplicationJSON(unwrapped) + return nil +} + +// MarshalJSON implements stdjson.Marshaler. +func (s PostCocoonV1ChatCompletionsOKApplicationJSON) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *PostCocoonV1ChatCompletionsOKApplicationJSON) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + +// Encode implements json.Marshaler. +func (s *PostCocoonV1ChatCompletionsUnauthorized) Encode(e *jx.Encoder) { + e.ObjStart() + s.encodeFields(e) + e.ObjEnd() +} + +// encodeFields encodes fields. +func (s *PostCocoonV1ChatCompletionsUnauthorized) encodeFields(e *jx.Encoder) { + { + if s.Error.Set { + e.FieldStart("error") + s.Error.Encode(e) + } + } +} + +var jsonFieldsNameOfPostCocoonV1ChatCompletionsUnauthorized = [1]string{ + 0: "error", +} + +// Decode decodes PostCocoonV1ChatCompletionsUnauthorized from json. +func (s *PostCocoonV1ChatCompletionsUnauthorized) Decode(d *jx.Decoder) error { + if s == nil { + return errors.New("invalid: unable to decode PostCocoonV1ChatCompletionsUnauthorized to nil") + } + + if err := d.ObjBytes(func(d *jx.Decoder, k []byte) error { + switch string(k) { + case "error": + if err := func() error { + s.Error.Reset() + if err := s.Error.Decode(d); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"error\"") + } + default: + return d.Skip() + } + return nil + }); err != nil { + return errors.Wrap(err, "decode PostCocoonV1ChatCompletionsUnauthorized") + } + + return nil +} + +// MarshalJSON implements stdjson.Marshaler. +func (s *PostCocoonV1ChatCompletionsUnauthorized) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *PostCocoonV1ChatCompletionsUnauthorized) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + +// Encode implements json.Marshaler. +func (s *PostCocoonV1ChatCompletionsUnauthorizedError) Encode(e *jx.Encoder) { + e.ObjStart() + s.encodeFields(e) + e.ObjEnd() +} + +// encodeFields encodes fields. +func (s *PostCocoonV1ChatCompletionsUnauthorizedError) encodeFields(e *jx.Encoder) { + { + if s.Message.Set { + e.FieldStart("message") + s.Message.Encode(e) + } + } + { + if s.Type.Set { + e.FieldStart("type") + s.Type.Encode(e) + } + } +} + +var jsonFieldsNameOfPostCocoonV1ChatCompletionsUnauthorizedError = [2]string{ + 0: "message", + 1: "type", +} + +// Decode decodes PostCocoonV1ChatCompletionsUnauthorizedError from json. +func (s *PostCocoonV1ChatCompletionsUnauthorizedError) Decode(d *jx.Decoder) error { + if s == nil { + return errors.New("invalid: unable to decode PostCocoonV1ChatCompletionsUnauthorizedError to nil") + } + + if err := d.ObjBytes(func(d *jx.Decoder, k []byte) error { + switch string(k) { + case "message": + if err := func() error { + s.Message.Reset() + if err := s.Message.Decode(d); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"message\"") + } + case "type": + if err := func() error { + s.Type.Reset() + if err := s.Type.Decode(d); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"type\"") + } + default: + return d.Skip() + } + return nil + }); err != nil { + return errors.Wrap(err, "decode PostCocoonV1ChatCompletionsUnauthorizedError") + } + + return nil +} + +// MarshalJSON implements stdjson.Marshaler. +func (s *PostCocoonV1ChatCompletionsUnauthorizedError) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *PostCocoonV1ChatCompletionsUnauthorizedError) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + // Encode implements json.Marshaler. func (s *Price) Encode(e *jx.Encoder) { e.ObjStart() diff --git a/pkg/oas/oas_operations_gen.go b/pkg/oas/oas_operations_gen.go index 9c0c0c350..9a32118a8 100644 --- a/pkg/oas/oas_operations_gen.go +++ b/pkg/oas/oas_operations_gen.go @@ -114,6 +114,7 @@ const ( GetWalletsByPublicKeyOperation OperationName = "GetWalletsByPublicKey" GetWalletsByPublicKeyBulkOperation OperationName = "GetWalletsByPublicKeyBulk" PostCocoonQueryOperation OperationName = "PostCocoonQuery" + PostCocoonV1ChatCompletionsOperation OperationName = "PostCocoonV1ChatCompletions" ReindexAccountOperation OperationName = "ReindexAccount" SearchAccountsOperation OperationName = "SearchAccounts" SendBlockchainMessageOperation OperationName = "SendBlockchainMessage" diff --git a/pkg/oas/oas_request_decoders_gen.go b/pkg/oas/oas_request_decoders_gen.go index a53d59933..2e11aac59 100644 --- a/pkg/oas/oas_request_decoders_gen.go +++ b/pkg/oas/oas_request_decoders_gen.go @@ -1203,6 +1203,79 @@ func (s *Server) decodePostCocoonQueryRequest(r *http.Request) ( } } +func (s *Server) decodePostCocoonV1ChatCompletionsRequest(r *http.Request) ( + req jx.Raw, + rawBody []byte, + close func() error, + rerr error, +) { + var closers []func() error + close = func() error { + var merr error + // Close in reverse order, to match defer behavior. + for i := len(closers) - 1; i >= 0; i-- { + c := closers[i] + merr = errors.Join(merr, c()) + } + return merr + } + defer func() { + if rerr != nil { + rerr = errors.Join(rerr, close()) + } + }() + ct, _, err := mime.ParseMediaType(r.Header.Get("Content-Type")) + if err != nil { + return req, rawBody, close, errors.Wrap(err, "parse media type") + } + switch { + case ct == "application/json": + if r.ContentLength == 0 { + return req, rawBody, close, validate.ErrBodyRequired + } + buf, err := io.ReadAll(r.Body) + defer func() { + _ = r.Body.Close() + }() + if err != nil { + return req, rawBody, close, err + } + + // Reset the body to allow for downstream reading. + r.Body = io.NopCloser(bytes.NewBuffer(buf)) + + if len(buf) == 0 { + return req, rawBody, close, validate.ErrBodyRequired + } + + rawBody = append(rawBody, buf...) + d := jx.DecodeBytes(buf) + + var request jx.Raw + if err := func() error { + v, err := d.RawAppend(nil) + request = jx.Raw(v) + if err != nil { + return err + } + if err := d.Skip(); err != io.EOF { + return errors.New("unexpected trailing data") + } + return nil + }(); err != nil { + err = &ogenerrors.DecodeBodyError{ + ContentType: ct, + Body: buf, + Err: err, + } + return req, rawBody, close, err + } + return request, rawBody, close, nil + default: + return req, rawBody, close, validate.InvalidContentType(ct) + } +} + func (s *Server) decodeSendBlockchainMessageRequest(r *http.Request) ( req *SendBlockchainMessageReq, rawBody []byte, diff --git a/pkg/oas/oas_request_encoders_gen.go b/pkg/oas/oas_request_encoders_gen.go index d961e1678..1b76e735f 100644 --- a/pkg/oas/oas_request_encoders_gen.go +++ b/pkg/oas/oas_request_encoders_gen.go @@ -258,6 +258,22 @@ func encodePostCocoonQueryRequest( return nil } +func encodePostCocoonV1ChatCompletionsRequest( + req jx.Raw, + r *http.Request, +) error { + const contentType = "application/json" + e := new(jx.Encoder) + { + if len(req) != 0 { + e.Raw(req) + } + } + encoded := e.Bytes() + ht.SetBody(r, bytes.NewReader(encoded), contentType) + return nil +} + func encodeSendBlockchainMessageRequest( req *SendBlockchainMessageReq, r *http.Request, diff --git a/pkg/oas/oas_response_decoders_gen.go b/pkg/oas/oas_response_decoders_gen.go index 198e4e0d1..34cc992fe 100644 --- a/pkg/oas/oas_response_decoders_gen.go +++ b/pkg/oas/oas_response_decoders_gen.go @@ -9868,6 +9868,159 @@ func decodePostCocoonQueryResponse(resp *http.Response) (res PostCocoonQueryRes, return res, errors.Wrap(defRes, "error") } +func decodePostCocoonV1ChatCompletionsResponse(resp *http.Response) (res PostCocoonV1ChatCompletionsRes, _ error) { + switch resp.StatusCode { + case 200: + // Code 200. + ct, _, err := mime.ParseMediaType(resp.Header.Get("Content-Type")) + if err != nil { + return res, errors.Wrap(err, "parse media type") + } + switch { + case ct == "application/json": + buf, err := io.ReadAll(resp.Body) + if err != nil { + return res, err + } + d := jx.DecodeBytes(buf) + + var response PostCocoonV1ChatCompletionsOKApplicationJSON + if err := func() error { + if err := response.Decode(d); err != nil { + return err + } + if err := d.Skip(); err != io.EOF { + return errors.New("unexpected trailing data") + } + return nil + }(); err != nil { + err = &ogenerrors.DecodeBodyError{ + ContentType: ct, + Body: buf, + Err: err, + } + return res, err + } + return &response, nil + default: + return res, validate.InvalidContentType(ct) + } + case 401: + // Code 401. + ct, _, err := mime.ParseMediaType(resp.Header.Get("Content-Type")) + if err != nil { + return res, errors.Wrap(err, "parse media type") + } + switch { + case ct == "application/json": + buf, err := io.ReadAll(resp.Body) + if err != nil { + return res, err + } + d := jx.DecodeBytes(buf) + + var response PostCocoonV1ChatCompletionsUnauthorized + if err := func() error { + if err := response.Decode(d); err != nil { + return err + } + if err := d.Skip(); err != io.EOF { + return errors.New("unexpected trailing data") + } + return nil + }(); err != nil { + err = &ogenerrors.DecodeBodyError{ + ContentType: ct, + Body: buf, + Err: err, + } + return res, err + } + return &response, nil + default: + return res, validate.InvalidContentType(ct) + } + case 501: + // Code 501. + ct, _, err := mime.ParseMediaType(resp.Header.Get("Content-Type")) + if err != nil { + return res, errors.Wrap(err, "parse media type") + } + switch { + case ct == "application/json": + buf, err := io.ReadAll(resp.Body) + if err != nil { + return res, err + } + d := jx.DecodeBytes(buf) + + var response PostCocoonV1ChatCompletionsNotImplemented + if err := func() error { + if err := response.Decode(d); err != nil { + return err + } + if err := d.Skip(); err != io.EOF { + return errors.New("unexpected trailing data") + } + return nil + }(); err != nil { + err = &ogenerrors.DecodeBodyError{ + ContentType: ct, + Body: buf, + Err: err, + } + return res, err + } + return &response, nil + default: + return res, validate.InvalidContentType(ct) + } + } + // Convenient error response. + defRes, err := func() (res *ErrorStatusCode, err error) { + ct, _, err := mime.ParseMediaType(resp.Header.Get("Content-Type")) + if err != nil { + return res, errors.Wrap(err, "parse media type") + } + switch { + case ct == "application/json": + buf, err := io.ReadAll(resp.Body) + if err != nil { + return res, err + } + d := jx.DecodeBytes(buf) + + var response Error + if err := func() error { + if err := response.Decode(d); err != nil { + return err + } + if err := d.Skip(); err != io.EOF { + return errors.New("unexpected trailing data") + } + return nil + }(); err != nil { + err = &ogenerrors.DecodeBodyError{ + ContentType: ct, + Body: buf, + Err: err, + } + return res, err + } + return &ErrorStatusCode{ + StatusCode: resp.StatusCode, + Response: response, + }, nil + default: + return res, validate.InvalidContentType(ct) + } + }() + if err != nil { + return res, errors.Wrapf(err, "default (code %d)", resp.StatusCode) + } + return res, errors.Wrap(defRes, "error") +} + func decodeReindexAccountResponse(resp *http.Response) (res *ReindexAccountOK, _ error) { switch resp.StatusCode { case 200: diff --git a/pkg/oas/oas_response_encoders_gen.go b/pkg/oas/oas_response_encoders_gen.go index 246647526..7a95a6690 100644 --- a/pkg/oas/oas_response_encoders_gen.go +++ b/pkg/oas/oas_response_encoders_gen.go @@ -1617,6 +1617,52 @@ func encodePostCocoonQueryResponse(response PostCocoonQueryRes, w http.ResponseW } } +func encodePostCocoonV1ChatCompletionsResponse(response PostCocoonV1ChatCompletionsRes, w http.ResponseWriter, span trace.Span) error { + switch response := response.(type) { + case *PostCocoonV1ChatCompletionsOKApplicationJSON: + w.Header().Set("Content-Type", "application/json; charset=utf-8") + w.WriteHeader(200) + span.SetStatus(codes.Ok, http.StatusText(200)) + + e := new(jx.Encoder) + response.Encode(e) + if _, err := e.WriteTo(w); err != nil { + return errors.Wrap(err, "write") + } + + return nil + + case *PostCocoonV1ChatCompletionsUnauthorized: + w.Header().Set("Content-Type", "application/json; charset=utf-8") + w.WriteHeader(401) + span.SetStatus(codes.Error, http.StatusText(401)) + + e := new(jx.Encoder) + response.Encode(e) + if _, err := e.WriteTo(w); err != nil { + return errors.Wrap(err, "write") + } + + return nil + + case *PostCocoonV1ChatCompletionsNotImplemented: + w.Header().Set("Content-Type", "application/json; charset=utf-8") + w.WriteHeader(501) + span.SetStatus(codes.Error, http.StatusText(501)) + + e := new(jx.Encoder) + response.Encode(e) + if _, err := e.WriteTo(w); err != nil { + return errors.Wrap(err, "write") + } + + return nil + + default: + return errors.Errorf("unexpected response type: %T", response) + } +} + func encodeReindexAccountResponse(response *ReindexAccountOK, w http.ResponseWriter, span trace.Span) error { w.WriteHeader(200) span.SetStatus(codes.Ok, http.StatusText(200)) diff --git a/pkg/oas/oas_router_gen.go b/pkg/oas/oas_router_gen.go index cfee5fa59..eb9e91aef 100644 --- a/pkg/oas/oas_router_gen.go +++ b/pkg/oas/oas_router_gen.go @@ -14,6 +14,9 @@ var ( rn193AllowedHeaders = map[string]string{ "POST": "Content-Type", } + rn194AllowedHeaders = map[string]string{ + "POST": "Content-Type", + } rn63AllowedHeaders = map[string]string{ "POST": "Content-Type", } @@ -38,7 +41,7 @@ var ( rn27AllowedHeaders = map[string]string{ "POST": "Content-Type", } - rn196AllowedHeaders = map[string]string{ + rn197AllowedHeaders = map[string]string{ "POST": "Content-Type", } rn22AllowedHeaders = map[string]string{ @@ -59,7 +62,7 @@ var ( rn107AllowedHeaders = map[string]string{ "POST": "Content-Type", } - rn197AllowedHeaders = map[string]string{ + rn198AllowedHeaders = map[string]string{ "POST": "Content-Type", } rn12AllowedHeaders = map[string]string{ @@ -89,7 +92,7 @@ var ( rn23AllowedHeaders = map[string]string{ "POST": "Content-Type", } - rn200AllowedHeaders = map[string]string{ + rn201AllowedHeaders = map[string]string{ "POST": "Content-Type", } rn24AllowedHeaders = map[string]string{ @@ -185,6 +188,31 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { return } + case 'v': // Prefix: "v1/chat/completions" + + if l := len("v1/chat/completions"); len(elem) >= l && elem[0:l] == "v1/chat/completions" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "POST": + s.handlePostCocoonV1ChatCompletionsRequest([0]string{}, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "POST", + allowedHeaders: rn194AllowedHeaders, + acceptPost: "application/json", + acceptPatch: "", + }) + } + + return + } + case 'w': // Prefix: "workers" if l := len("workers"); len(elem) >= l && elem[0:l] == "workers" { @@ -1575,7 +1603,7 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { default: s.notAllowed(w, r, notAllowedParams{ allowedMethods: "POST", - allowedHeaders: rn196AllowedHeaders, + allowedHeaders: rn197AllowedHeaders, acceptPost: "application/json", acceptPatch: "", }) @@ -2956,7 +2984,7 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { default: s.notAllowed(w, r, notAllowedParams{ allowedMethods: "POST", - allowedHeaders: rn197AllowedHeaders, + allowedHeaders: rn198AllowedHeaders, acceptPost: "application/json", acceptPatch: "", }) @@ -4135,7 +4163,7 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { default: s.notAllowed(w, r, notAllowedParams{ allowedMethods: "POST", - allowedHeaders: rn200AllowedHeaders, + allowedHeaders: rn201AllowedHeaders, acceptPost: "application/json", acceptPatch: "", }) @@ -4367,6 +4395,31 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { } } + case 'v': // Prefix: "v1/chat/completions" + + if l := len("v1/chat/completions"); len(elem) >= l && elem[0:l] == "v1/chat/completions" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch method { + case "POST": + r.name = PostCocoonV1ChatCompletionsOperation + r.summary = "" + r.operationID = "postCocoonV1ChatCompletions" + r.operationGroup = "" + r.pathPattern = "/cocoon/v1/chat/completions" + r.args = args + r.count = 0 + return r, true + default: + return + } + } + case 'w': // Prefix: "workers" if l := len("workers"); len(elem) >= l && elem[0:l] == "workers" { diff --git a/pkg/oas/oas_schemas_gen.go b/pkg/oas/oas_schemas_gen.go index ab41019d1..1734564f8 100644 --- a/pkg/oas/oas_schemas_gen.go +++ b/pkg/oas/oas_schemas_gen.go @@ -15311,6 +15311,52 @@ func (o OptPostCocoonQueryUnauthorizedError) Or(d PostCocoonQueryUnauthorizedErr return d } +// NewOptPostCocoonV1ChatCompletionsUnauthorizedError returns new OptPostCocoonV1ChatCompletionsUnauthorizedError with value set to v. +func NewOptPostCocoonV1ChatCompletionsUnauthorizedError(v PostCocoonV1ChatCompletionsUnauthorizedError) OptPostCocoonV1ChatCompletionsUnauthorizedError { + return OptPostCocoonV1ChatCompletionsUnauthorizedError{ + Value: v, + Set: true, + } +} + +// OptPostCocoonV1ChatCompletionsUnauthorizedError is optional PostCocoonV1ChatCompletionsUnauthorizedError. +type OptPostCocoonV1ChatCompletionsUnauthorizedError struct { + Value PostCocoonV1ChatCompletionsUnauthorizedError + Set bool +} + +// IsSet returns true if OptPostCocoonV1ChatCompletionsUnauthorizedError was set. +func (o OptPostCocoonV1ChatCompletionsUnauthorizedError) IsSet() bool { return o.Set } + +// Reset unsets value. +func (o *OptPostCocoonV1ChatCompletionsUnauthorizedError) Reset() { + var v PostCocoonV1ChatCompletionsUnauthorizedError + o.Value = v + o.Set = false +} + +// SetTo sets value to v. +func (o *OptPostCocoonV1ChatCompletionsUnauthorizedError) SetTo(v PostCocoonV1ChatCompletionsUnauthorizedError) { + o.Set = true + o.Value = v +} + +// Get returns value and boolean that denotes whether value was set. +func (o OptPostCocoonV1ChatCompletionsUnauthorizedError) Get() (v PostCocoonV1ChatCompletionsUnauthorizedError, ok bool) { + if !o.Set { + return v, false + } + return o.Value, true +} + +// Or returns value if set, or given parameter if does not. +func (o OptPostCocoonV1ChatCompletionsUnauthorizedError) Or(d PostCocoonV1ChatCompletionsUnauthorizedError) PostCocoonV1ChatCompletionsUnauthorizedError { + if v, ok := o.Get(); ok { + return v + } + return d +} + // NewOptPrice returns new OptPrice with value set to v. func NewOptPrice(v Price) OptPrice { return OptPrice{ @@ -17077,6 +17123,55 @@ func (s *PostCocoonQueryUnauthorizedError) SetType(val OptString) { s.Type = val } +type PostCocoonV1ChatCompletionsNotImplemented struct{} + +func (*PostCocoonV1ChatCompletionsNotImplemented) postCocoonV1ChatCompletionsRes() {} + +type PostCocoonV1ChatCompletionsOKApplicationJSON jx.Raw + +func (*PostCocoonV1ChatCompletionsOKApplicationJSON) postCocoonV1ChatCompletionsRes() {} + +type PostCocoonV1ChatCompletionsUnauthorized struct { + Error OptPostCocoonV1ChatCompletionsUnauthorizedError `json:"error"` +} + +// GetError returns the value of Error. +func (s *PostCocoonV1ChatCompletionsUnauthorized) GetError() OptPostCocoonV1ChatCompletionsUnauthorizedError { + return s.Error +} + +// SetError sets the value of Error. +func (s *PostCocoonV1ChatCompletionsUnauthorized) SetError(val OptPostCocoonV1ChatCompletionsUnauthorizedError) { + s.Error = val +} + +func (*PostCocoonV1ChatCompletionsUnauthorized) postCocoonV1ChatCompletionsRes() {} + +type PostCocoonV1ChatCompletionsUnauthorizedError struct { + Message OptString `json:"message"` + Type OptString `json:"type"` +} + +// GetMessage returns the value of Message. +func (s *PostCocoonV1ChatCompletionsUnauthorizedError) GetMessage() OptString { + return s.Message +} + +// GetType returns the value of Type. +func (s *PostCocoonV1ChatCompletionsUnauthorizedError) GetType() OptString { + return s.Type +} + +// SetMessage sets the value of Message. +func (s *PostCocoonV1ChatCompletionsUnauthorizedError) SetMessage(val OptString) { + s.Message = val +} + +// SetType sets the value of Type. +func (s *PostCocoonV1ChatCompletionsUnauthorizedError) SetType(val OptString) { + s.Type = val +} + // Ref: #/components/schemas/Price type Price struct { CurrencyType CurrencyType `json:"currency_type"` diff --git a/pkg/oas/oas_server_gen.go b/pkg/oas/oas_server_gen.go index 9d151f790..caf78fb82 100644 --- a/pkg/oas/oas_server_gen.go +++ b/pkg/oas/oas_server_gen.go @@ -680,6 +680,15 @@ type Handler interface { // // POST /cocoon/query PostCocoonQuery(ctx context.Context, req jx.Raw, params PostCocoonQueryParams) (PostCocoonQueryRes, error) + // PostCocoonV1ChatCompletions implements postCocoonV1ChatCompletions operation. + // + // OpenAI-compatible [Create chat completion](https://developers.openai. + // com/api/reference/resources/chat/subresources/completions/methods/create). + // Forwards the JSON body to Cocoon as `POST /v1/chat/completions` (same as `/cocoon/query` with + // `path=/v1/chat/completions`). + // + // POST /cocoon/v1/chat/completions + PostCocoonV1ChatCompletions(ctx context.Context, req jx.Raw) (PostCocoonV1ChatCompletionsRes, error) // ReindexAccount implements reindexAccount operation. // // Update internal cache for a particular account. diff --git a/pkg/oas/oas_unimplemented_gen.go b/pkg/oas/oas_unimplemented_gen.go index 1e48ded30..ee23630b3 100644 --- a/pkg/oas/oas_unimplemented_gen.go +++ b/pkg/oas/oas_unimplemented_gen.go @@ -1008,6 +1008,18 @@ func (UnimplementedHandler) PostCocoonQuery(ctx context.Context, req jx.Raw, par return r, ht.ErrNotImplemented } +// PostCocoonV1ChatCompletions implements postCocoonV1ChatCompletions operation. +// +// OpenAI-compatible [Create chat completion](https://developers.openai. +// com/api/reference/resources/chat/subresources/completions/methods/create). +// Forwards the JSON body to Cocoon as `POST /v1/chat/completions` (same as `/cocoon/query` with +// `path=/v1/chat/completions`). +// +// POST /cocoon/v1/chat/completions +func (UnimplementedHandler) PostCocoonV1ChatCompletions(ctx context.Context, req jx.Raw) (r PostCocoonV1ChatCompletionsRes, _ error) { + return r, ht.ErrNotImplemented +} + // ReindexAccount implements reindexAccount operation. // // Update internal cache for a particular account. From 755957bf63209dc4d8acc2383c4d69138fb1565e Mon Sep 17 00:00:00 2001 From: Victoria E Date: Sat, 18 Apr 2026 10:56:44 +0300 Subject: [PATCH 05/11] add v2 prefix --- api/openapi.json | 386 +- api/openapi.yml | 6 +- pkg/oas/oas_client_gen.go | 28 +- pkg/oas/oas_handlers_gen.go | 14 +- pkg/oas/oas_router_gen.go | 10008 ++++++++++++++--------------- pkg/oas/oas_server_gen.go | 8 +- pkg/oas/oas_unimplemented_gen.go | 8 +- 7 files changed, 5210 insertions(+), 5248 deletions(-) diff --git a/api/openapi.json b/api/openapi.json index 76a859cf3..cba4d1d12 100644 --- a/api/openapi.json +++ b/api/openapi.json @@ -7768,199 +7768,6 @@ }, "openapi": "3.0.0", "paths": { - "/cocoon/query": { - "post": { - "description": "Proxy arbitrary OpenAI-style JSON to Cocoon (POST)", - "operationId": "postCocoonQuery", - "parameters": [ - { - "description": "Cocoon worker model name passed to the proxy.", - "in": "query", - "name": "model", - "schema": { - "type": "string" - } - }, - { - "description": "HTTP path on the Cocoon worker (e.g. /v1/chat/completions).", - "in": "query", - "name": "path", - "schema": { - "default": "/query", - "type": "string" - } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": {} - } - }, - "required": true - }, - "responses": { - "200": { - "content": { - "application/json": { - "schema": {} - } - }, - "description": "Successful response" - }, - "401": { - "content": { - "application/json": { - "schema": { - "properties": { - "error": { - "properties": { - "message": { - "type": "string" - }, - "type": { - "type": "string" - } - }, - "type": "object" - } - }, - "type": "object" - } - } - }, - "description": "Unauthorized" - }, - "501": { - "content": { - "application/json": { - "schema": { - "type": "object" - } - } - }, - "description": "Not implemented" - }, - "default": { - "$ref": "#/components/responses/Error" - } - } - } - }, - "/cocoon/v1/chat/completions": { - "post": { - "description": "OpenAI-compatible [Create chat completion](https://developers.openai.com/api/reference/resources/chat/subresources/completions/methods/create).\nForwards the JSON body to Cocoon as `POST /v1/chat/completions` (same as `/cocoon/query` with `path=/v1/chat/completions`).\n", - "operationId": "postCocoonV1ChatCompletions", - "requestBody": { - "content": { - "application/json": { - "schema": {} - } - }, - "required": true - }, - "responses": { - "200": { - "content": { - "application/json": { - "schema": {} - } - }, - "description": "Successful response" - }, - "401": { - "content": { - "application/json": { - "schema": { - "properties": { - "error": { - "properties": { - "message": { - "type": "string" - }, - "type": { - "type": "string" - } - }, - "type": "object" - } - }, - "type": "object" - } - } - }, - "description": "Unauthorized" - }, - "501": { - "content": { - "application/json": { - "schema": { - "type": "object" - } - } - }, - "description": "Not implemented" - }, - "default": { - "$ref": "#/components/responses/Error" - } - } - } - }, - "/cocoon/workers": { - "get": { - "description": "Cocoon worker types (same shape as gocoon Connection.GetWorkerTypes)", - "operationId": "getCocoonWorkers", - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CocoonWorkersResponse" - } - } - }, - "description": "Successful response" - }, - "401": { - "content": { - "application/json": { - "schema": { - "properties": { - "error": { - "properties": { - "message": { - "type": "string" - }, - "type": { - "type": "string" - } - }, - "type": "object" - } - }, - "type": "object" - } - } - }, - "description": "Unauthorized" - }, - "501": { - "content": { - "application/json": { - "schema": { - "type": "object" - } - } - }, - "description": "Not implemented" - }, - "default": { - "$ref": "#/components/responses/Error" - } - } - } - }, "/v2/accounts/_bulk": { "post": { "description": "Get human-friendly information about several accounts without low-level details.", @@ -9731,6 +9538,199 @@ ] } }, + "/v2/cocoon/query": { + "post": { + "description": "Proxy arbitrary OpenAI-style JSON to Cocoon (POST)", + "operationId": "postCocoonQuery", + "parameters": [ + { + "description": "Cocoon worker model name passed to the proxy.", + "in": "query", + "name": "model", + "schema": { + "type": "string" + } + }, + { + "description": "HTTP path on the Cocoon worker (e.g. /v1/chat/completions).", + "in": "query", + "name": "path", + "schema": { + "default": "/query", + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": {} + } + }, + "required": true + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": {} + } + }, + "description": "Successful response" + }, + "401": { + "content": { + "application/json": { + "schema": { + "properties": { + "error": { + "properties": { + "message": { + "type": "string" + }, + "type": { + "type": "string" + } + }, + "type": "object" + } + }, + "type": "object" + } + } + }, + "description": "Unauthorized" + }, + "501": { + "content": { + "application/json": { + "schema": { + "type": "object" + } + } + }, + "description": "Not implemented" + }, + "default": { + "$ref": "#/components/responses/Error" + } + } + } + }, + "/v2/cocoon/v1/chat/completions": { + "post": { + "description": "OpenAI-compatible [Create chat completion](https://developers.openai.com/api/reference/resources/chat/subresources/completions/methods/create).\n", + "operationId": "postCocoonV1ChatCompletions", + "requestBody": { + "content": { + "application/json": { + "schema": {} + } + }, + "required": true + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": {} + } + }, + "description": "Successful response" + }, + "401": { + "content": { + "application/json": { + "schema": { + "properties": { + "error": { + "properties": { + "message": { + "type": "string" + }, + "type": { + "type": "string" + } + }, + "type": "object" + } + }, + "type": "object" + } + } + }, + "description": "Unauthorized" + }, + "501": { + "content": { + "application/json": { + "schema": { + "type": "object" + } + } + }, + "description": "Not implemented" + }, + "default": { + "$ref": "#/components/responses/Error" + } + } + } + }, + "/v2/cocoon/workers": { + "get": { + "description": "Cocoon worker types (same shape as gocoon Connection.GetWorkerTypes)", + "operationId": "getCocoonWorkers", + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CocoonWorkersResponse" + } + } + }, + "description": "Successful response" + }, + "401": { + "content": { + "application/json": { + "schema": { + "properties": { + "error": { + "properties": { + "message": { + "type": "string" + }, + "type": { + "type": "string" + } + }, + "type": "object" + } + }, + "type": "object" + } + } + }, + "description": "Unauthorized" + }, + "501": { + "content": { + "application/json": { + "schema": { + "type": "object" + } + } + }, + "description": "Not implemented" + }, + "default": { + "$ref": "#/components/responses/Error" + } + } + } + }, "/v2/dns/auctions": { "get": { "description": "Get all auctions", diff --git a/api/openapi.yml b/api/openapi.yml index 15bd15641..0b6c8556d 100644 --- a/api/openapi.yml +++ b/api/openapi.yml @@ -3131,7 +3131,7 @@ paths: $ref: "#/components/schemas/RoundRewardsResponse" 'default': $ref: '#/components/responses/Error' - /cocoon/workers: + /v2/cocoon/workers: get: operationId: getCocoonWorkers description: Cocoon worker types (same shape as gocoon Connection.GetWorkerTypes) @@ -3165,7 +3165,7 @@ paths: 'default': $ref: '#/components/responses/Error' - /cocoon/query: + /v2/cocoon/query: post: operationId: postCocoonQuery description: Proxy arbitrary OpenAI-style JSON to Cocoon (POST) @@ -3215,7 +3215,7 @@ paths: 'default': $ref: '#/components/responses/Error' - /cocoon/v1/chat/completions: + /v2/cocoon/v1/chat/completions: post: operationId: postCocoonV1ChatCompletions description: | diff --git a/pkg/oas/oas_client_gen.go b/pkg/oas/oas_client_gen.go index e8fca6649..6f3eb9224 100644 --- a/pkg/oas/oas_client_gen.go +++ b/pkg/oas/oas_client_gen.go @@ -349,7 +349,7 @@ type Invoker interface { // // Cocoon worker types (same shape as gocoon Connection.GetWorkerTypes). // - // GET /cocoon/workers + // GET /v2/cocoon/workers GetCocoonWorkers(ctx context.Context) (GetCocoonWorkersRes, error) // GetDnsInfo invokes getDnsInfo operation. // @@ -696,16 +696,14 @@ type Invoker interface { // // Proxy arbitrary OpenAI-style JSON to Cocoon (POST). // - // POST /cocoon/query + // POST /v2/cocoon/query PostCocoonQuery(ctx context.Context, request jx.Raw, params PostCocoonQueryParams) (PostCocoonQueryRes, error) // PostCocoonV1ChatCompletions invokes postCocoonV1ChatCompletions operation. // // OpenAI-compatible [Create chat completion](https://developers.openai. // com/api/reference/resources/chat/subresources/completions/methods/create). - // Forwards the JSON body to Cocoon as `POST /v1/chat/completions` (same as `/cocoon/query` with - // `path=/v1/chat/completions`). // - // POST /cocoon/v1/chat/completions + // POST /v2/cocoon/v1/chat/completions PostCocoonV1ChatCompletions(ctx context.Context, request jx.Raw) (PostCocoonV1ChatCompletionsRes, error) // ReindexAccount invokes reindexAccount operation. // @@ -6630,7 +6628,7 @@ func (c *Client) sendGetChartRates(ctx context.Context, params GetChartRatesPara // // Cocoon worker types (same shape as gocoon Connection.GetWorkerTypes). // -// GET /cocoon/workers +// GET /v2/cocoon/workers func (c *Client) GetCocoonWorkers(ctx context.Context) (GetCocoonWorkersRes, error) { res, err := c.sendGetCocoonWorkers(ctx) return res, err @@ -6640,7 +6638,7 @@ func (c *Client) sendGetCocoonWorkers(ctx context.Context) (res GetCocoonWorkers otelAttrs := []attribute.KeyValue{ otelogen.OperationID("getCocoonWorkers"), semconv.HTTPRequestMethodKey.String("GET"), - semconv.URLTemplateKey.String("/cocoon/workers"), + semconv.URLTemplateKey.String("/v2/cocoon/workers"), } otelAttrs = append(otelAttrs, c.cfg.Attributes...) @@ -6674,7 +6672,7 @@ func (c *Client) sendGetCocoonWorkers(ctx context.Context) (res GetCocoonWorkers stage = "BuildURL" u := uri.Clone(c.requestURL(ctx)) var pathParts [1]string - pathParts[0] = "/cocoon/workers" + pathParts[0] = "/v2/cocoon/workers" uri.AddPathParts(u, pathParts[:]...) stage = "EncodeRequest" @@ -12457,7 +12455,7 @@ func (c *Client) sendGetWalletsByPublicKeyBulk(ctx context.Context, request OptG // // Proxy arbitrary OpenAI-style JSON to Cocoon (POST). // -// POST /cocoon/query +// POST /v2/cocoon/query func (c *Client) PostCocoonQuery(ctx context.Context, request jx.Raw, params PostCocoonQueryParams) (PostCocoonQueryRes, error) { res, err := c.sendPostCocoonQuery(ctx, request, params) return res, err @@ -12467,7 +12465,7 @@ func (c *Client) sendPostCocoonQuery(ctx context.Context, request jx.Raw, params otelAttrs := []attribute.KeyValue{ otelogen.OperationID("postCocoonQuery"), semconv.HTTPRequestMethodKey.String("POST"), - semconv.URLTemplateKey.String("/cocoon/query"), + semconv.URLTemplateKey.String("/v2/cocoon/query"), } otelAttrs = append(otelAttrs, c.cfg.Attributes...) @@ -12501,7 +12499,7 @@ func (c *Client) sendPostCocoonQuery(ctx context.Context, request jx.Raw, params stage = "BuildURL" u := uri.Clone(c.requestURL(ctx)) var pathParts [1]string - pathParts[0] = "/cocoon/query" + pathParts[0] = "/v2/cocoon/query" uri.AddPathParts(u, pathParts[:]...) stage = "EncodeQueryParams" @@ -12572,10 +12570,8 @@ func (c *Client) sendPostCocoonQuery(ctx context.Context, request jx.Raw, params // // OpenAI-compatible [Create chat completion](https://developers.openai. // com/api/reference/resources/chat/subresources/completions/methods/create). -// Forwards the JSON body to Cocoon as `POST /v1/chat/completions` (same as `/cocoon/query` with -// `path=/v1/chat/completions`). // -// POST /cocoon/v1/chat/completions +// POST /v2/cocoon/v1/chat/completions func (c *Client) PostCocoonV1ChatCompletions(ctx context.Context, request jx.Raw) (PostCocoonV1ChatCompletionsRes, error) { res, err := c.sendPostCocoonV1ChatCompletions(ctx, request) return res, err @@ -12585,7 +12581,7 @@ func (c *Client) sendPostCocoonV1ChatCompletions(ctx context.Context, request jx otelAttrs := []attribute.KeyValue{ otelogen.OperationID("postCocoonV1ChatCompletions"), semconv.HTTPRequestMethodKey.String("POST"), - semconv.URLTemplateKey.String("/cocoon/v1/chat/completions"), + semconv.URLTemplateKey.String("/v2/cocoon/v1/chat/completions"), } otelAttrs = append(otelAttrs, c.cfg.Attributes...) @@ -12619,7 +12615,7 @@ func (c *Client) sendPostCocoonV1ChatCompletions(ctx context.Context, request jx stage = "BuildURL" u := uri.Clone(c.requestURL(ctx)) var pathParts [1]string - pathParts[0] = "/cocoon/v1/chat/completions" + pathParts[0] = "/v2/cocoon/v1/chat/completions" uri.AddPathParts(u, pathParts[:]...) stage = "EncodeRequest" diff --git a/pkg/oas/oas_handlers_gen.go b/pkg/oas/oas_handlers_gen.go index cd467d4fe..38c5b9523 100644 --- a/pkg/oas/oas_handlers_gen.go +++ b/pkg/oas/oas_handlers_gen.go @@ -8188,14 +8188,14 @@ func (s *Server) handleGetChartRatesRequest(args [0]string, argsEscaped bool, w // // Cocoon worker types (same shape as gocoon Connection.GetWorkerTypes). // -// GET /cocoon/workers +// GET /v2/cocoon/workers func (s *Server) handleGetCocoonWorkersRequest(args [0]string, argsEscaped bool, w http.ResponseWriter, r *http.Request) { statusWriter := &codeRecorder{ResponseWriter: w} w = statusWriter otelAttrs := []attribute.KeyValue{ otelogen.OperationID("getCocoonWorkers"), semconv.HTTPRequestMethodKey.String("GET"), - semconv.HTTPRouteKey.String("/cocoon/workers"), + semconv.HTTPRouteKey.String("/v2/cocoon/workers"), } // Add attributes from config. otelAttrs = append(otelAttrs, s.cfg.Attributes...) @@ -16833,14 +16833,14 @@ func (s *Server) handleGetWalletsByPublicKeyBulkRequest(args [0]string, argsEsca // // Proxy arbitrary OpenAI-style JSON to Cocoon (POST). // -// POST /cocoon/query +// POST /v2/cocoon/query func (s *Server) handlePostCocoonQueryRequest(args [0]string, argsEscaped bool, w http.ResponseWriter, r *http.Request) { statusWriter := &codeRecorder{ResponseWriter: w} w = statusWriter otelAttrs := []attribute.KeyValue{ otelogen.OperationID("postCocoonQuery"), semconv.HTTPRequestMethodKey.String("POST"), - semconv.HTTPRouteKey.String("/cocoon/query"), + semconv.HTTPRouteKey.String("/v2/cocoon/query"), } // Add attributes from config. otelAttrs = append(otelAttrs, s.cfg.Attributes...) @@ -17006,17 +17006,15 @@ func (s *Server) handlePostCocoonQueryRequest(args [0]string, argsEscaped bool, // // OpenAI-compatible [Create chat completion](https://developers.openai. // com/api/reference/resources/chat/subresources/completions/methods/create). -// Forwards the JSON body to Cocoon as `POST /v1/chat/completions` (same as `/cocoon/query` with -// `path=/v1/chat/completions`). // -// POST /cocoon/v1/chat/completions +// POST /v2/cocoon/v1/chat/completions func (s *Server) handlePostCocoonV1ChatCompletionsRequest(args [0]string, argsEscaped bool, w http.ResponseWriter, r *http.Request) { statusWriter := &codeRecorder{ResponseWriter: w} w = statusWriter otelAttrs := []attribute.KeyValue{ otelogen.OperationID("postCocoonV1ChatCompletions"), semconv.HTTPRequestMethodKey.String("POST"), - semconv.HTTPRouteKey.String("/cocoon/v1/chat/completions"), + semconv.HTTPRouteKey.String("/v2/cocoon/v1/chat/completions"), } // Add attributes from config. otelAttrs = append(otelAttrs, s.cfg.Attributes...) diff --git a/pkg/oas/oas_router_gen.go b/pkg/oas/oas_router_gen.go index eb9e91aef..d51d9704f 100644 --- a/pkg/oas/oas_router_gen.go +++ b/pkg/oas/oas_router_gen.go @@ -11,12 +11,6 @@ import ( ) var ( - rn193AllowedHeaders = map[string]string{ - "POST": "Content-Type", - } - rn194AllowedHeaders = map[string]string{ - "POST": "Content-Type", - } rn63AllowedHeaders = map[string]string{ "POST": "Content-Type", } @@ -41,16 +35,22 @@ var ( rn27AllowedHeaders = map[string]string{ "POST": "Content-Type", } - rn197AllowedHeaders = map[string]string{ + rn196AllowedHeaders = map[string]string{ + "POST": "Content-Type", + } + rn192AllowedHeaders = map[string]string{ + "POST": "Content-Type", + } + rn193AllowedHeaders = map[string]string{ "POST": "Content-Type", } rn22AllowedHeaders = map[string]string{ "POST": "Accept-Language,Content-Type", } - rn93AllowedHeaders = map[string]string{ + rn92AllowedHeaders = map[string]string{ "GET": "Accept-Language", } - rn112AllowedHeaders = map[string]string{ + rn111AllowedHeaders = map[string]string{ "GET": "Accept-Language", } rn31AllowedHeaders = map[string]string{ @@ -59,31 +59,31 @@ var ( rn32AllowedHeaders = map[string]string{ "POST": "Content-Type", } - rn107AllowedHeaders = map[string]string{ + rn106AllowedHeaders = map[string]string{ "POST": "Content-Type", } - rn198AllowedHeaders = map[string]string{ + rn197AllowedHeaders = map[string]string{ "POST": "Content-Type", } rn12AllowedHeaders = map[string]string{ "POST": "Content-Type", } - rn127AllowedHeaders = map[string]string{ + rn126AllowedHeaders = map[string]string{ "POST": "Content-Type", } - rn122AllowedHeaders = map[string]string{ + rn121AllowedHeaders = map[string]string{ "POST": "Content-Type", } - rn126AllowedHeaders = map[string]string{ + rn125AllowedHeaders = map[string]string{ "GET": "Accept-Language", } - rn191AllowedHeaders = map[string]string{ + rn190AllowedHeaders = map[string]string{ "POST": "Content-Type", } - rn173AllowedHeaders = map[string]string{ + rn172AllowedHeaders = map[string]string{ "GET": "Accept-Language", } - rn176AllowedHeaders = map[string]string{ + rn175AllowedHeaders = map[string]string{ "GET": "Accept-Language", } rn45AllowedHeaders = map[string]string{ @@ -92,7 +92,7 @@ var ( rn23AllowedHeaders = map[string]string{ "POST": "Content-Type", } - rn201AllowedHeaders = map[string]string{ + rn200AllowedHeaders = map[string]string{ "POST": "Content-Type", } rn24AllowedHeaders = map[string]string{ @@ -139,9 +139,9 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { break } switch elem[0] { - case '/': // Prefix: "/" + case '/': // Prefix: "/v2/" - if l := len("/"); len(elem) >= l && elem[0:l] == "/" { + if l := len("/v2/"); len(elem) >= l && elem[0:l] == "/v2/" { elem = elem[l:] } else { break @@ -151,9 +151,9 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { break } switch elem[0] { - case 'c': // Prefix: "cocoon/" + case 'a': // Prefix: "a" - if l := len("cocoon/"); len(elem) >= l && elem[0:l] == "cocoon/" { + if l := len("a"); len(elem) >= l && elem[0:l] == "a" { elem = elem[l:] } else { break @@ -163,69 +163,86 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { break } switch elem[0] { - case 'q': // Prefix: "query" + case 'c': // Prefix: "ccounts/" - if l := len("query"); len(elem) >= l && elem[0:l] == "query" { + if l := len("ccounts/"); len(elem) >= l && elem[0:l] == "ccounts/" { elem = elem[l:] } else { break } if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "POST": - s.handlePostCocoonQueryRequest([0]string{}, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "POST", - allowedHeaders: rn193AllowedHeaders, - acceptPost: "application/json", - acceptPatch: "", - }) - } - - return + break } + switch elem[0] { + case '_': // Prefix: "_bulk" + origElem := elem + if l := len("_bulk"); len(elem) >= l && elem[0:l] == "_bulk" { + elem = elem[l:] + } else { + break + } - case 'v': // Prefix: "v1/chat/completions" + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "POST": + s.handleGetAccountsRequest([0]string{}, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "POST", + allowedHeaders: rn63AllowedHeaders, + acceptPost: "application/json", + acceptPatch: "", + }) + } - if l := len("v1/chat/completions"); len(elem) >= l && elem[0:l] == "v1/chat/completions" { - elem = elem[l:] - } else { - break - } + return + } - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "POST": - s.handlePostCocoonV1ChatCompletionsRequest([0]string{}, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "POST", - allowedHeaders: rn194AllowedHeaders, - acceptPost: "application/json", - acceptPatch: "", - }) + elem = origElem + case 's': // Prefix: "search" + origElem := elem + if l := len("search"); len(elem) >= l && elem[0:l] == "search" { + elem = elem[l:] + } else { + break } - return - } + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "GET": + s.handleSearchAccountsRequest([0]string{}, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: nil, + acceptPost: "", + acceptPatch: "", + }) + } - case 'w': // Prefix: "workers" + return + } - if l := len("workers"); len(elem) >= l && elem[0:l] == "workers" { - elem = elem[l:] - } else { - break + elem = origElem + } + // Param: "account_id" + // Match until "/" + idx := strings.IndexByte(elem, '/') + if idx < 0 { + idx = len(elem) } + args[0] = elem[:idx] + elem = elem[idx:] if len(elem) == 0 { - // Leaf node. switch r.Method { case "GET": - s.handleGetCocoonWorkersRequest([0]string{}, elemIsEscaped, w, r) + s.handleGetAccountRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) default: s.notAllowed(w, r, notAllowedParams{ allowedMethods: "GET", @@ -237,36 +254,10 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { return } - - } - - case 'v': // Prefix: "v2/" - - if l := len("v2/"); len(elem) >= l && elem[0:l] == "v2/" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - break - } - switch elem[0] { - case 'a': // Prefix: "a" - - if l := len("a"); len(elem) >= l && elem[0:l] == "a" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - break - } switch elem[0] { - case 'c': // Prefix: "ccounts/" + case '/': // Prefix: "/" - if l := len("ccounts/"); len(elem) >= l && elem[0:l] == "ccounts/" { + if l := len("/"); len(elem) >= l && elem[0:l] == "/" { elem = elem[l:] } else { break @@ -276,101 +267,48 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { break } switch elem[0] { - case '_': // Prefix: "_bulk" - origElem := elem - if l := len("_bulk"); len(elem) >= l && elem[0:l] == "_bulk" { + case 'd': // Prefix: "d" + + if l := len("d"); len(elem) >= l && elem[0:l] == "d" { elem = elem[l:] } else { break } if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "POST": - s.handleGetAccountsRequest([0]string{}, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "POST", - allowedHeaders: rn63AllowedHeaders, - acceptPost: "application/json", - acceptPatch: "", - }) - } - - return - } - - elem = origElem - case 's': // Prefix: "search" - origElem := elem - if l := len("search"); len(elem) >= l && elem[0:l] == "search" { - elem = elem[l:] - } else { break } + switch elem[0] { + case 'i': // Prefix: "iff" - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "GET": - s.handleSearchAccountsRequest([0]string{}, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "GET", - allowedHeaders: nil, - acceptPost: "", - acceptPatch: "", - }) + if l := len("iff"); len(elem) >= l && elem[0:l] == "iff" { + elem = elem[l:] + } else { + break } - return - } - - elem = origElem - } - // Param: "account_id" - // Match until "/" - idx := strings.IndexByte(elem, '/') - if idx < 0 { - idx = len(elem) - } - args[0] = elem[:idx] - elem = elem[idx:] - - if len(elem) == 0 { - switch r.Method { - case "GET": - s.handleGetAccountRequest([1]string{ - args[0], - }, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "GET", - allowedHeaders: nil, - acceptPost: "", - acceptPatch: "", - }) - } - - return - } - switch elem[0] { - case '/': // Prefix: "/" + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "GET": + s.handleGetAccountDiffRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: nil, + acceptPost: "", + acceptPatch: "", + }) + } - if l := len("/"); len(elem) >= l && elem[0:l] == "/" { - elem = elem[l:] - } else { - break - } + return + } - if len(elem) == 0 { - break - } - switch elem[0] { - case 'd': // Prefix: "d" + case 'n': // Prefix: "ns/" - if l := len("d"); len(elem) >= l && elem[0:l] == "d" { + if l := len("ns/"); len(elem) >= l && elem[0:l] == "ns/" { elem = elem[l:] } else { break @@ -380,9 +318,9 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { break } switch elem[0] { - case 'i': // Prefix: "iff" + case 'b': // Prefix: "backresolve" - if l := len("iff"); len(elem) >= l && elem[0:l] == "iff" { + if l := len("backresolve"); len(elem) >= l && elem[0:l] == "backresolve" { elem = elem[l:] } else { break @@ -392,7 +330,7 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { // Leaf node. switch r.Method { case "GET": - s.handleGetAccountDiffRequest([1]string{ + s.handleAccountDnsBackResolveRequest([1]string{ args[0], }, elemIsEscaped, w, r) default: @@ -407,242 +345,52 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { return } - case 'n': // Prefix: "ns/" + case 'e': // Prefix: "expiring" - if l := len("ns/"); len(elem) >= l && elem[0:l] == "ns/" { + if l := len("expiring"); len(elem) >= l && elem[0:l] == "expiring" { elem = elem[l:] } else { break } if len(elem) == 0 { - break + // Leaf node. + switch r.Method { + case "GET": + s.handleGetAccountDnsExpiringRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: nil, + acceptPost: "", + acceptPatch: "", + }) + } + + return } - switch elem[0] { - case 'b': // Prefix: "backresolve" - if l := len("backresolve"); len(elem) >= l && elem[0:l] == "backresolve" { - elem = elem[l:] - } else { - break - } + } - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "GET": - s.handleAccountDnsBackResolveRequest([1]string{ - args[0], - }, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "GET", - allowedHeaders: nil, - acceptPost: "", - acceptPatch: "", - }) - } - - return - } - - case 'e': // Prefix: "expiring" - - if l := len("expiring"); len(elem) >= l && elem[0:l] == "expiring" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "GET": - s.handleGetAccountDnsExpiringRequest([1]string{ - args[0], - }, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "GET", - allowedHeaders: nil, - acceptPost: "", - acceptPatch: "", - }) - } - - return - } - - } - - } - - case 'e': // Prefix: "e" - - if l := len("e"); len(elem) >= l && elem[0:l] == "e" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - break - } - switch elem[0] { - case 'v': // Prefix: "vents" - - if l := len("vents"); len(elem) >= l && elem[0:l] == "vents" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - switch r.Method { - case "GET": - s.handleGetAccountEventsRequest([1]string{ - args[0], - }, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "GET", - allowedHeaders: rn39AllowedHeaders, - acceptPost: "", - acceptPatch: "", - }) - } - - return - } - switch elem[0] { - case '/': // Prefix: "/" - - if l := len("/"); len(elem) >= l && elem[0:l] == "/" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - break - } - switch elem[0] { - case 'e': // Prefix: "emulate" - origElem := elem - if l := len("emulate"); len(elem) >= l && elem[0:l] == "emulate" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "POST": - s.handleEmulateMessageToAccountEventRequest([1]string{ - args[0], - }, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "POST", - allowedHeaders: rn21AllowedHeaders, - acceptPost: "application/json", - acceptPatch: "", - }) - } - - return - } - - elem = origElem - } - // Param: "event_id" - // Leaf parameter, slashes are prohibited - idx := strings.IndexByte(elem, '/') - if idx >= 0 { - break - } - args[1] = elem - elem = "" - - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "GET": - s.handleGetAccountEventRequest([2]string{ - args[0], - args[1], - }, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "GET", - allowedHeaders: rn38AllowedHeaders, - acceptPost: "", - acceptPatch: "", - }) - } - - return - } - - } - - case 'x': // Prefix: "xtra-currency/" - - if l := len("xtra-currency/"); len(elem) >= l && elem[0:l] == "xtra-currency/" { - elem = elem[l:] - } else { - break - } - - // Param: "id" - // Match until "/" - idx := strings.IndexByte(elem, '/') - if idx < 0 { - idx = len(elem) - } - args[1] = elem[:idx] - elem = elem[idx:] - - if len(elem) == 0 { - break - } - switch elem[0] { - case '/': // Prefix: "/history" - - if l := len("/history"); len(elem) >= l && elem[0:l] == "/history" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "GET": - s.handleGetAccountExtraCurrencyHistoryByIDRequest([2]string{ - args[0], - args[1], - }, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "GET", - allowedHeaders: rn43AllowedHeaders, - acceptPost: "", - acceptPatch: "", - }) - } - - return - } + } - } + case 'e': // Prefix: "e" - } + if l := len("e"); len(elem) >= l && elem[0:l] == "e" { + elem = elem[l:] + } else { + break + } - case 'j': // Prefix: "jettons" + if len(elem) == 0 { + break + } + switch elem[0] { + case 'v': // Prefix: "vents" - if l := len("jettons"); len(elem) >= l && elem[0:l] == "jettons" { + if l := len("vents"); len(elem) >= l && elem[0:l] == "vents" { elem = elem[l:] } else { break @@ -651,13 +399,13 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { if len(elem) == 0 { switch r.Method { case "GET": - s.handleGetAccountJettonsBalancesRequest([1]string{ + s.handleGetAccountEventsRequest([1]string{ args[0], }, elemIsEscaped, w, r) default: s.notAllowed(w, r, notAllowedParams{ allowedMethods: "GET", - allowedHeaders: nil, + allowedHeaders: rn39AllowedHeaders, acceptPost: "", acceptPatch: "", }) @@ -678,9 +426,9 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { break } switch elem[0] { - case 'h': // Prefix: "history" + case 'e': // Prefix: "emulate" origElem := elem - if l := len("history"); len(elem) >= l && elem[0:l] == "history" { + if l := len("emulate"); len(elem) >= l && elem[0:l] == "emulate" { elem = elem[l:] } else { break @@ -689,15 +437,15 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { if len(elem) == 0 { // Leaf node. switch r.Method { - case "GET": - s.handleGetAccountJettonsHistoryRequest([1]string{ + case "POST": + s.handleEmulateMessageToAccountEventRequest([1]string{ args[0], }, elemIsEscaped, w, r) default: s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "GET", - allowedHeaders: nil, - acceptPost: "", + allowedMethods: "POST", + allowedHeaders: rn21AllowedHeaders, + acceptPost: "application/json", acceptPatch: "", }) } @@ -707,26 +455,27 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { elem = origElem } - // Param: "jetton_id" - // Match until "/" + // Param: "event_id" + // Leaf parameter, slashes are prohibited idx := strings.IndexByte(elem, '/') - if idx < 0 { - idx = len(elem) + if idx >= 0 { + break } - args[1] = elem[:idx] - elem = elem[idx:] + args[1] = elem + elem = "" if len(elem) == 0 { + // Leaf node. switch r.Method { case "GET": - s.handleGetAccountJettonBalanceRequest([2]string{ + s.handleGetAccountEventRequest([2]string{ args[0], args[1], }, elemIsEscaped, w, r) default: s.notAllowed(w, r, notAllowedParams{ allowedMethods: "GET", - allowedHeaders: nil, + allowedHeaders: rn38AllowedHeaders, acceptPost: "", acceptPatch: "", }) @@ -734,90 +483,28 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { return } - switch elem[0] { - case '/': // Prefix: "/history" - - if l := len("/history"); len(elem) >= l && elem[0:l] == "/history" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "GET": - s.handleGetAccountJettonHistoryByIDRequest([2]string{ - args[0], - args[1], - }, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "GET", - allowedHeaders: rn48AllowedHeaders, - acceptPost: "", - acceptPatch: "", - }) - } - - return - } - - } } - case 'm': // Prefix: "multisigs" + case 'x': // Prefix: "xtra-currency/" - if l := len("multisigs"); len(elem) >= l && elem[0:l] == "multisigs" { + if l := len("xtra-currency/"); len(elem) >= l && elem[0:l] == "xtra-currency/" { elem = elem[l:] } else { break } - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "GET": - s.handleGetAccountMultisigsRequest([1]string{ - args[0], - }, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "GET", - allowedHeaders: nil, - acceptPost: "", - acceptPatch: "", - }) - } - - return - } - - case 'n': // Prefix: "nfts" - - if l := len("nfts"); len(elem) >= l && elem[0:l] == "nfts" { - elem = elem[l:] - } else { - break + // Param: "id" + // Match until "/" + idx := strings.IndexByte(elem, '/') + if idx < 0 { + idx = len(elem) } + args[1] = elem[:idx] + elem = elem[idx:] if len(elem) == 0 { - switch r.Method { - case "GET": - s.handleGetAccountNftItemsRequest([1]string{ - args[0], - }, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "GET", - allowedHeaders: nil, - acceptPost: "", - acceptPatch: "", - }) - } - - return + break } switch elem[0] { case '/': // Prefix: "/history" @@ -832,13 +519,14 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { // Leaf node. switch r.Method { case "GET": - s.handleGetAccountNftHistoryRequest([1]string{ + s.handleGetAccountExtraCurrencyHistoryByIDRequest([2]string{ args[0], + args[1], }, elemIsEscaped, w, r) default: s.notAllowed(w, r, notAllowedParams{ allowedMethods: "GET", - allowedHeaders: rn52AllowedHeaders, + allowedHeaders: rn43AllowedHeaders, acceptPost: "", acceptPatch: "", }) @@ -849,74 +537,90 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { } - case 'p': // Prefix: "publickey" + } - if l := len("publickey"); len(elem) >= l && elem[0:l] == "publickey" { - elem = elem[l:] - } else { - break - } + case 'j': // Prefix: "jettons" - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "GET": - s.handleGetAccountPublicKeyRequest([1]string{ - args[0], - }, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "GET", - allowedHeaders: nil, - acceptPost: "", - acceptPatch: "", - }) - } + if l := len("jettons"); len(elem) >= l && elem[0:l] == "jettons" { + elem = elem[l:] + } else { + break + } - return + if len(elem) == 0 { + switch r.Method { + case "GET": + s.handleGetAccountJettonsBalancesRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: nil, + acceptPost: "", + acceptPatch: "", + }) } - case 'r': // Prefix: "reindex" + return + } + switch elem[0] { + case '/': // Prefix: "/" - if l := len("reindex"); len(elem) >= l && elem[0:l] == "reindex" { + if l := len("/"); len(elem) >= l && elem[0:l] == "/" { elem = elem[l:] } else { break } if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "POST": - s.handleReindexAccountRequest([1]string{ - args[0], - }, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "POST", - allowedHeaders: nil, - acceptPost: "", - acceptPatch: "", - }) + break + } + switch elem[0] { + case 'h': // Prefix: "history" + origElem := elem + if l := len("history"); len(elem) >= l && elem[0:l] == "history" { + elem = elem[l:] + } else { + break } - return - } + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "GET": + s.handleGetAccountJettonsHistoryRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: nil, + acceptPost: "", + acceptPatch: "", + }) + } - case 's': // Prefix: "subscriptions" + return + } - if l := len("subscriptions"); len(elem) >= l && elem[0:l] == "subscriptions" { - elem = elem[l:] - } else { - break + elem = origElem + } + // Param: "jetton_id" + // Match until "/" + idx := strings.IndexByte(elem, '/') + if idx < 0 { + idx = len(elem) } + args[1] = elem[:idx] + elem = elem[idx:] if len(elem) == 0 { - // Leaf node. switch r.Method { case "GET": - s.handleGetAccountSubscriptionsRequest([1]string{ + s.handleGetAccountJettonBalanceRequest([2]string{ args[0], + args[1], }, elemIsEscaped, w, r) default: s.notAllowed(w, r, notAllowedParams{ @@ -929,10 +633,95 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { return } + switch elem[0] { + case '/': // Prefix: "/history" + + if l := len("/history"); len(elem) >= l && elem[0:l] == "/history" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "GET": + s.handleGetAccountJettonHistoryByIDRequest([2]string{ + args[0], + args[1], + }, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: rn48AllowedHeaders, + acceptPost: "", + acceptPatch: "", + }) + } + + return + } + + } + + } + + case 'm': // Prefix: "multisigs" + + if l := len("multisigs"); len(elem) >= l && elem[0:l] == "multisigs" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "GET": + s.handleGetAccountMultisigsRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: nil, + acceptPost: "", + acceptPatch: "", + }) + } + + return + } + + case 'n': // Prefix: "nfts" + + if l := len("nfts"); len(elem) >= l && elem[0:l] == "nfts" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + switch r.Method { + case "GET": + s.handleGetAccountNftItemsRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: nil, + acceptPost: "", + acceptPatch: "", + }) + } - case 't': // Prefix: "traces" + return + } + switch elem[0] { + case '/': // Prefix: "/history" - if l := len("traces"); len(elem) >= l && elem[0:l] == "traces" { + if l := len("/history"); len(elem) >= l && elem[0:l] == "/history" { elem = elem[l:] } else { break @@ -942,13 +731,13 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { // Leaf node. switch r.Method { case "GET": - s.handleGetAccountTracesRequest([1]string{ + s.handleGetAccountNftHistoryRequest([1]string{ args[0], }, elemIsEscaped, w, r) default: s.notAllowed(w, r, notAllowedParams{ allowedMethods: "GET", - allowedHeaders: nil, + allowedHeaders: rn52AllowedHeaders, acceptPost: "", acceptPatch: "", }) @@ -959,32 +748,90 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { } - } + case 'p': // Prefix: "publickey" - case 'd': // Prefix: "ddress/" + if l := len("publickey"); len(elem) >= l && elem[0:l] == "publickey" { + elem = elem[l:] + } else { + break + } - if l := len("ddress/"); len(elem) >= l && elem[0:l] == "ddress/" { - elem = elem[l:] - } else { - break - } + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "GET": + s.handleGetAccountPublicKeyRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: nil, + acceptPost: "", + acceptPatch: "", + }) + } - // Param: "account_id" - // Match until "/" - idx := strings.IndexByte(elem, '/') - if idx < 0 { - idx = len(elem) - } - args[0] = elem[:idx] - elem = elem[idx:] + return + } - if len(elem) == 0 { - break - } - switch elem[0] { - case '/': // Prefix: "/parse" + case 'r': // Prefix: "reindex" + + if l := len("reindex"); len(elem) >= l && elem[0:l] == "reindex" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "POST": + s.handleReindexAccountRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "POST", + allowedHeaders: nil, + acceptPost: "", + acceptPatch: "", + }) + } + + return + } + + case 's': // Prefix: "subscriptions" + + if l := len("subscriptions"); len(elem) >= l && elem[0:l] == "subscriptions" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "GET": + s.handleGetAccountSubscriptionsRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: nil, + acceptPost: "", + acceptPatch: "", + }) + } + + return + } + + case 't': // Prefix: "traces" - if l := len("/parse"); len(elem) >= l && elem[0:l] == "/parse" { + if l := len("traces"); len(elem) >= l && elem[0:l] == "traces" { elem = elem[l:] } else { break @@ -994,7 +841,7 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { // Leaf node. switch r.Method { case "GET": - s.handleAddressParseRequest([1]string{ + s.handleGetAccountTracesRequest([1]string{ args[0], }, elemIsEscaped, w, r) default: @@ -1013,39 +860,40 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { } - case 'b': // Prefix: "blockchain/" + case 'd': // Prefix: "ddress/" - if l := len("blockchain/"); len(elem) >= l && elem[0:l] == "blockchain/" { + if l := len("ddress/"); len(elem) >= l && elem[0:l] == "ddress/" { elem = elem[l:] } else { break } + // Param: "account_id" + // Match until "/" + idx := strings.IndexByte(elem, '/') + if idx < 0 { + idx = len(elem) + } + args[0] = elem[:idx] + elem = elem[idx:] + if len(elem) == 0 { break } switch elem[0] { - case 'a': // Prefix: "accounts/" + case '/': // Prefix: "/parse" - if l := len("accounts/"); len(elem) >= l && elem[0:l] == "accounts/" { + if l := len("/parse"); len(elem) >= l && elem[0:l] == "/parse" { elem = elem[l:] } else { break } - // Param: "account_id" - // Match until "/" - idx := strings.IndexByte(elem, '/') - if idx < 0 { - idx = len(elem) - } - args[0] = elem[:idx] - elem = elem[idx:] - if len(elem) == 0 { + // Leaf node. switch r.Method { case "GET": - s.handleGetBlockchainRawAccountRequest([1]string{ + s.handleAddressParseRequest([1]string{ args[0], }, elemIsEscaped, w, r) default: @@ -1059,251 +907,142 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { return } - switch elem[0] { - case '/': // Prefix: "/" - if l := len("/"); len(elem) >= l && elem[0:l] == "/" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - break - } - switch elem[0] { - case 'i': // Prefix: "inspect" - - if l := len("inspect"); len(elem) >= l && elem[0:l] == "inspect" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "GET": - s.handleBlockchainAccountInspectRequest([1]string{ - args[0], - }, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "GET", - allowedHeaders: nil, - acceptPost: "", - acceptPatch: "", - }) - } - - return - } - - case 'm': // Prefix: "methods/" - - if l := len("methods/"); len(elem) >= l && elem[0:l] == "methods/" { - elem = elem[l:] - } else { - break - } - - // Param: "method_name" - // Leaf parameter, slashes are prohibited - idx := strings.IndexByte(elem, '/') - if idx >= 0 { - break - } - args[1] = elem - elem = "" - - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "GET": - s.handleExecGetMethodForBlockchainAccountRequest([2]string{ - args[0], - args[1], - }, elemIsEscaped, w, r) - case "POST": - s.handleExecGetMethodWithBodyForBlockchainAccountRequest([2]string{ - args[0], - args[1], - }, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "GET,POST", - allowedHeaders: rn27AllowedHeaders, - acceptPost: "application/json", - acceptPatch: "", - }) - } + } - return - } + } - case 't': // Prefix: "transactions" + case 'b': // Prefix: "blockchain/" - if l := len("transactions"); len(elem) >= l && elem[0:l] == "transactions" { - elem = elem[l:] - } else { - break - } + if l := len("blockchain/"); len(elem) >= l && elem[0:l] == "blockchain/" { + elem = elem[l:] + } else { + break + } - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "GET": - s.handleGetBlockchainAccountTransactionsRequest([1]string{ - args[0], - }, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "GET", - allowedHeaders: nil, - acceptPost: "", - acceptPatch: "", - }) - } + if len(elem) == 0 { + break + } + switch elem[0] { + case 'a': // Prefix: "accounts/" - return - } + if l := len("accounts/"); len(elem) >= l && elem[0:l] == "accounts/" { + elem = elem[l:] + } else { + break + } - } + // Param: "account_id" + // Match until "/" + idx := strings.IndexByte(elem, '/') + if idx < 0 { + idx = len(elem) + } + args[0] = elem[:idx] + elem = elem[idx:] + if len(elem) == 0 { + switch r.Method { + case "GET": + s.handleGetBlockchainRawAccountRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: nil, + acceptPost: "", + acceptPatch: "", + }) } - case 'b': // Prefix: "blocks/" + return + } + switch elem[0] { + case '/': // Prefix: "/" - if l := len("blocks/"); len(elem) >= l && elem[0:l] == "blocks/" { + if l := len("/"); len(elem) >= l && elem[0:l] == "/" { elem = elem[l:] } else { break } - // Param: "block_id" - // Match until "/" - idx := strings.IndexByte(elem, '/') - if idx < 0 { - idx = len(elem) - } - args[0] = elem[:idx] - elem = elem[idx:] - if len(elem) == 0 { - switch r.Method { - case "GET": - s.handleGetBlockchainBlockRequest([1]string{ - args[0], - }, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "GET", - allowedHeaders: nil, - acceptPost: "", - acceptPatch: "", - }) - } - - return + break } switch elem[0] { - case '/': // Prefix: "/" + case 'i': // Prefix: "inspect" - if l := len("/"); len(elem) >= l && elem[0:l] == "/" { + if l := len("inspect"); len(elem) >= l && elem[0:l] == "inspect" { elem = elem[l:] } else { break } if len(elem) == 0 { - break - } - switch elem[0] { - case 'b': // Prefix: "boc" - - if l := len("boc"); len(elem) >= l && elem[0:l] == "boc" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "GET": - s.handleDownloadBlockchainBlockBocRequest([1]string{ - args[0], - }, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "GET", - allowedHeaders: nil, - acceptPost: "", - acceptPatch: "", - }) - } - - return - } - - case 't': // Prefix: "transactions" - - if l := len("transactions"); len(elem) >= l && elem[0:l] == "transactions" { - elem = elem[l:] - } else { - break + // Leaf node. + switch r.Method { + case "GET": + s.handleBlockchainAccountInspectRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: nil, + acceptPost: "", + acceptPatch: "", + }) } - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "GET": - s.handleGetBlockchainBlockTransactionsRequest([1]string{ - args[0], - }, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "GET", - allowedHeaders: nil, - acceptPost: "", - acceptPatch: "", - }) - } + return + } - return - } + case 'm': // Prefix: "methods/" + if l := len("methods/"); len(elem) >= l && elem[0:l] == "methods/" { + elem = elem[l:] + } else { + break } - } - - case 'c': // Prefix: "config" + // Param: "method_name" + // Leaf parameter, slashes are prohibited + idx := strings.IndexByte(elem, '/') + if idx >= 0 { + break + } + args[1] = elem + elem = "" - if l := len("config"); len(elem) >= l && elem[0:l] == "config" { - elem = elem[l:] - } else { - break - } + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "GET": + s.handleExecGetMethodForBlockchainAccountRequest([2]string{ + args[0], + args[1], + }, elemIsEscaped, w, r) + case "POST": + s.handleExecGetMethodWithBodyForBlockchainAccountRequest([2]string{ + args[0], + args[1], + }, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET,POST", + allowedHeaders: rn27AllowedHeaders, + acceptPost: "application/json", + acceptPatch: "", + }) + } - if len(elem) == 0 { - switch r.Method { - case "GET": - s.handleGetBlockchainConfigRequest([0]string{}, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "GET", - allowedHeaders: nil, - acceptPost: "", - acceptPatch: "", - }) + return } - return - } - switch elem[0] { - case '/': // Prefix: "/raw" + case 't': // Prefix: "transactions" - if l := len("/raw"); len(elem) >= l && elem[0:l] == "/raw" { + if l := len("transactions"); len(elem) >= l && elem[0:l] == "transactions" { elem = elem[l:] } else { break @@ -1313,7 +1052,9 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { // Leaf node. switch r.Method { case "GET": - s.handleGetRawBlockchainConfigRequest([0]string{}, elemIsEscaped, w, r) + s.handleGetBlockchainAccountTransactionsRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) default: s.notAllowed(w, r, notAllowedParams{ allowedMethods: "GET", @@ -1328,30 +1069,150 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { } - case 'l': // Prefix: "libraries/" + } - if l := len("libraries/"); len(elem) >= l && elem[0:l] == "libraries/" { - elem = elem[l:] + case 'b': // Prefix: "blocks/" + + if l := len("blocks/"); len(elem) >= l && elem[0:l] == "blocks/" { + elem = elem[l:] + } else { + break + } + + // Param: "block_id" + // Match until "/" + idx := strings.IndexByte(elem, '/') + if idx < 0 { + idx = len(elem) + } + args[0] = elem[:idx] + elem = elem[idx:] + + if len(elem) == 0 { + switch r.Method { + case "GET": + s.handleGetBlockchainBlockRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: nil, + acceptPost: "", + acceptPatch: "", + }) + } + + return + } + switch elem[0] { + case '/': // Prefix: "/" + + if l := len("/"); len(elem) >= l && elem[0:l] == "/" { + elem = elem[l:] } else { break } - // Param: "hash" - // Leaf parameter, slashes are prohibited - idx := strings.IndexByte(elem, '/') - if idx >= 0 { + if len(elem) == 0 { + break + } + switch elem[0] { + case 'b': // Prefix: "boc" + + if l := len("boc"); len(elem) >= l && elem[0:l] == "boc" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "GET": + s.handleDownloadBlockchainBlockBocRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: nil, + acceptPost: "", + acceptPatch: "", + }) + } + + return + } + + case 't': // Prefix: "transactions" + + if l := len("transactions"); len(elem) >= l && elem[0:l] == "transactions" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "GET": + s.handleGetBlockchainBlockTransactionsRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: nil, + acceptPost: "", + acceptPatch: "", + }) + } + + return + } + + } + + } + + case 'c': // Prefix: "config" + + if l := len("config"); len(elem) >= l && elem[0:l] == "config" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + switch r.Method { + case "GET": + s.handleGetBlockchainConfigRequest([0]string{}, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: nil, + acceptPost: "", + acceptPatch: "", + }) + } + + return + } + switch elem[0] { + case '/': // Prefix: "/raw" + + if l := len("/raw"); len(elem) >= l && elem[0:l] == "/raw" { + elem = elem[l:] + } else { break } - args[0] = elem - elem = "" if len(elem) == 0 { // Leaf node. switch r.Method { case "GET": - s.handleGetLibraryByHashRequest([1]string{ - args[0], - }, elemIsEscaped, w, r) + s.handleGetRawBlockchainConfigRequest([0]string{}, elemIsEscaped, w, r) default: s.notAllowed(w, r, notAllowedParams{ allowedMethods: "GET", @@ -1364,9 +1225,59 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { return } - case 'm': // Prefix: "m" + } + + case 'l': // Prefix: "libraries/" + + if l := len("libraries/"); len(elem) >= l && elem[0:l] == "libraries/" { + elem = elem[l:] + } else { + break + } + + // Param: "hash" + // Leaf parameter, slashes are prohibited + idx := strings.IndexByte(elem, '/') + if idx >= 0 { + break + } + args[0] = elem + elem = "" + + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "GET": + s.handleGetLibraryByHashRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: nil, + acceptPost: "", + acceptPatch: "", + }) + } + + return + } + + case 'm': // Prefix: "m" + + if l := len("m"); len(elem) >= l && elem[0:l] == "m" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + break + } + switch elem[0] { + case 'a': // Prefix: "asterchain" - if l := len("m"); len(elem) >= l && elem[0:l] == "m" { + if l := len("asterchain"); len(elem) >= l && elem[0:l] == "asterchain" { elem = elem[l:] } else { break @@ -1376,43 +1287,52 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { break } switch elem[0] { - case 'a': // Prefix: "asterchain" + case '-': // Prefix: "-head" - if l := len("asterchain"); len(elem) >= l && elem[0:l] == "asterchain" { + if l := len("-head"); len(elem) >= l && elem[0:l] == "-head" { elem = elem[l:] } else { break } if len(elem) == 0 { - break + // Leaf node. + switch r.Method { + case "GET": + s.handleGetBlockchainMasterchainHeadRequest([0]string{}, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: nil, + acceptPost: "", + acceptPatch: "", + }) + } + + return } - switch elem[0] { - case '-': // Prefix: "-head" - if l := len("-head"); len(elem) >= l && elem[0:l] == "-head" { - elem = elem[l:] - } else { - break - } + case '/': // Prefix: "/" - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "GET": - s.handleGetBlockchainMasterchainHeadRequest([0]string{}, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "GET", - allowedHeaders: nil, - acceptPost: "", - acceptPatch: "", - }) - } + if l := len("/"); len(elem) >= l && elem[0:l] == "/" { + elem = elem[l:] + } else { + break + } - return - } + // Param: "masterchain_seqno" + // Match until "/" + idx := strings.IndexByte(elem, '/') + if idx < 0 { + idx = len(elem) + } + args[0] = elem[:idx] + elem = elem[idx:] + if len(elem) == 0 { + break + } + switch elem[0] { case '/': // Prefix: "/" if l := len("/"); len(elem) >= l && elem[0:l] == "/" { @@ -1421,116 +1341,66 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { break } - // Param: "masterchain_seqno" - // Match until "/" - idx := strings.IndexByte(elem, '/') - if idx < 0 { - idx = len(elem) - } - args[0] = elem[:idx] - elem = elem[idx:] - if len(elem) == 0 { break } switch elem[0] { - case '/': // Prefix: "/" + case 'b': // Prefix: "blocks" - if l := len("/"); len(elem) >= l && elem[0:l] == "/" { + if l := len("blocks"); len(elem) >= l && elem[0:l] == "blocks" { elem = elem[l:] } else { break } if len(elem) == 0 { - break + // Leaf node. + switch r.Method { + case "GET": + s.handleGetBlockchainMasterchainBlocksRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: nil, + acceptPost: "", + acceptPatch: "", + }) + } + + return } - switch elem[0] { - case 'b': // Prefix: "blocks" - if l := len("blocks"); len(elem) >= l && elem[0:l] == "blocks" { - elem = elem[l:] - } else { - break - } + case 'c': // Prefix: "config" - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "GET": - s.handleGetBlockchainMasterchainBlocksRequest([1]string{ - args[0], - }, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "GET", - allowedHeaders: nil, - acceptPost: "", - acceptPatch: "", - }) - } - - return - } - - case 'c': // Prefix: "config" - - if l := len("config"); len(elem) >= l && elem[0:l] == "config" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - switch r.Method { - case "GET": - s.handleGetBlockchainConfigFromBlockRequest([1]string{ - args[0], - }, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "GET", - allowedHeaders: nil, - acceptPost: "", - acceptPatch: "", - }) - } - - return - } - switch elem[0] { - case '/': // Prefix: "/raw" - - if l := len("/raw"); len(elem) >= l && elem[0:l] == "/raw" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "GET": - s.handleGetRawBlockchainConfigFromBlockRequest([1]string{ - args[0], - }, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "GET", - allowedHeaders: nil, - acceptPost: "", - acceptPatch: "", - }) - } - - return - } + if l := len("config"); len(elem) >= l && elem[0:l] == "config" { + elem = elem[l:] + } else { + break + } + if len(elem) == 0 { + switch r.Method { + case "GET": + s.handleGetBlockchainConfigFromBlockRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: nil, + acceptPost: "", + acceptPatch: "", + }) } - case 's': // Prefix: "shards" + return + } + switch elem[0] { + case '/': // Prefix: "/raw" - if l := len("shards"); len(elem) >= l && elem[0:l] == "shards" { + if l := len("/raw"); len(elem) >= l && elem[0:l] == "/raw" { elem = elem[l:] } else { break @@ -1540,7 +1410,7 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { // Leaf node. switch r.Method { case "GET": - s.handleGetBlockchainMasterchainShardsRequest([1]string{ + s.handleGetRawBlockchainConfigFromBlockRequest([1]string{ args[0], }, elemIsEscaped, w, r) default: @@ -1555,87 +1425,38 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { return } - case 't': // Prefix: "transactions" + } - if l := len("transactions"); len(elem) >= l && elem[0:l] == "transactions" { - elem = elem[l:] - } else { - break - } + case 's': // Prefix: "shards" - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "GET": - s.handleGetBlockchainMasterchainTransactionsRequest([1]string{ - args[0], - }, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "GET", - allowedHeaders: nil, - acceptPost: "", - acceptPatch: "", - }) - } + if l := len("shards"); len(elem) >= l && elem[0:l] == "shards" { + elem = elem[l:] + } else { + break + } - return + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "GET": + s.handleGetBlockchainMasterchainShardsRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: nil, + acceptPost: "", + acceptPatch: "", + }) } + return } - } - - } - - case 'e': // Prefix: "essage" - - if l := len("essage"); len(elem) >= l && elem[0:l] == "essage" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - switch r.Method { - case "POST": - s.handleSendBlockchainMessageRequest([0]string{}, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "POST", - allowedHeaders: rn197AllowedHeaders, - acceptPost: "application/json", - acceptPatch: "", - }) - } - - return - } - switch elem[0] { - case 's': // Prefix: "s/" - - if l := len("s/"); len(elem) >= l && elem[0:l] == "s/" { - elem = elem[l:] - } else { - break - } - - // Param: "msg_id" - // Match until "/" - idx := strings.IndexByte(elem, '/') - if idx < 0 { - idx = len(elem) - } - args[0] = elem[:idx] - elem = elem[idx:] - - if len(elem) == 0 { - break - } - switch elem[0] { - case '/': // Prefix: "/transaction" + case 't': // Prefix: "transactions" - if l := len("/transaction"); len(elem) >= l && elem[0:l] == "/transaction" { + if l := len("transactions"); len(elem) >= l && elem[0:l] == "transactions" { elem = elem[l:] } else { break @@ -1645,7 +1466,7 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { // Leaf node. switch r.Method { case "GET": - s.handleGetBlockchainTransactionByMessageHashRequest([1]string{ + s.handleGetBlockchainMasterchainTransactionsRequest([1]string{ args[0], }, elemIsEscaped, w, r) default: @@ -1666,146 +1487,131 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { } - case 'r': // Prefix: "reduced/blocks" + case 'e': // Prefix: "essage" - if l := len("reduced/blocks"); len(elem) >= l && elem[0:l] == "reduced/blocks" { + if l := len("essage"); len(elem) >= l && elem[0:l] == "essage" { elem = elem[l:] } else { break } if len(elem) == 0 { - // Leaf node. switch r.Method { - case "GET": - s.handleGetReducedBlockchainBlocksRequest([0]string{}, elemIsEscaped, w, r) + case "POST": + s.handleSendBlockchainMessageRequest([0]string{}, elemIsEscaped, w, r) default: s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "GET", - allowedHeaders: nil, - acceptPost: "", + allowedMethods: "POST", + allowedHeaders: rn196AllowedHeaders, + acceptPost: "application/json", acceptPatch: "", }) } return } + switch elem[0] { + case 's': // Prefix: "s/" - case 't': // Prefix: "transactions/" - - if l := len("transactions/"); len(elem) >= l && elem[0:l] == "transactions/" { - elem = elem[l:] - } else { - break - } + if l := len("s/"); len(elem) >= l && elem[0:l] == "s/" { + elem = elem[l:] + } else { + break + } - // Param: "transaction_id" - // Leaf parameter, slashes are prohibited - idx := strings.IndexByte(elem, '/') - if idx >= 0 { - break - } - args[0] = elem - elem = "" + // Param: "msg_id" + // Match until "/" + idx := strings.IndexByte(elem, '/') + if idx < 0 { + idx = len(elem) + } + args[0] = elem[:idx] + elem = elem[idx:] - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "GET": - s.handleGetBlockchainTransactionRequest([1]string{ - args[0], - }, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "GET", - allowedHeaders: nil, - acceptPost: "", - acceptPatch: "", - }) + if len(elem) == 0 { + break } + switch elem[0] { + case '/': // Prefix: "/transaction" - return - } + if l := len("/transaction"); len(elem) >= l && elem[0:l] == "/transaction" { + elem = elem[l:] + } else { + break + } - case 'v': // Prefix: "validators" + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "GET": + s.handleGetBlockchainTransactionByMessageHashRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: nil, + acceptPost: "", + acceptPatch: "", + }) + } - if l := len("validators"); len(elem) >= l && elem[0:l] == "validators" { - elem = elem[l:] - } else { - break - } + return + } - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "GET": - s.handleGetBlockchainValidatorsRequest([0]string{}, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "GET", - allowedHeaders: nil, - acceptPost: "", - acceptPatch: "", - }) } - return } } - case 'd': // Prefix: "dns/" + case 'r': // Prefix: "reduced/blocks" - if l := len("dns/"); len(elem) >= l && elem[0:l] == "dns/" { + if l := len("reduced/blocks"); len(elem) >= l && elem[0:l] == "reduced/blocks" { elem = elem[l:] } else { break } if len(elem) == 0 { - break - } - switch elem[0] { - case 'a': // Prefix: "auctions" - origElem := elem - if l := len("auctions"); len(elem) >= l && elem[0:l] == "auctions" { - elem = elem[l:] - } else { - break + // Leaf node. + switch r.Method { + case "GET": + s.handleGetReducedBlockchainBlocksRequest([0]string{}, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: nil, + acceptPost: "", + acceptPatch: "", + }) } - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "GET": - s.handleGetAllAuctionsRequest([0]string{}, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "GET", - allowedHeaders: nil, - acceptPost: "", - acceptPatch: "", - }) - } + return + } - return - } + case 't': // Prefix: "transactions/" - elem = origElem - } - // Param: "domain_name" - // Match until "/" + if l := len("transactions/"); len(elem) >= l && elem[0:l] == "transactions/" { + elem = elem[l:] + } else { + break + } + + // Param: "transaction_id" + // Leaf parameter, slashes are prohibited idx := strings.IndexByte(elem, '/') - if idx < 0 { - idx = len(elem) + if idx >= 0 { + break } - args[0] = elem[:idx] - elem = elem[idx:] + args[0] = elem + elem = "" if len(elem) == 0 { + // Leaf node. switch r.Method { case "GET": - s.handleGetDnsInfoRequest([1]string{ + s.handleGetBlockchainTransactionRequest([1]string{ args[0], }, elemIsEscaped, w, r) default: @@ -1819,80 +1625,192 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { return } - switch elem[0] { - case '/': // Prefix: "/" - if l := len("/"); len(elem) >= l && elem[0:l] == "/" { - elem = elem[l:] - } else { - break + case 'v': // Prefix: "validators" + + if l := len("validators"); len(elem) >= l && elem[0:l] == "validators" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "GET": + s.handleGetBlockchainValidatorsRequest([0]string{}, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: nil, + acceptPost: "", + acceptPatch: "", + }) } - if len(elem) == 0 { - break + return + } + + } + + case 'c': // Prefix: "cocoon/" + + if l := len("cocoon/"); len(elem) >= l && elem[0:l] == "cocoon/" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + break + } + switch elem[0] { + case 'q': // Prefix: "query" + + if l := len("query"); len(elem) >= l && elem[0:l] == "query" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "POST": + s.handlePostCocoonQueryRequest([0]string{}, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "POST", + allowedHeaders: rn192AllowedHeaders, + acceptPost: "application/json", + acceptPatch: "", + }) } - switch elem[0] { - case 'b': // Prefix: "bids" - if l := len("bids"); len(elem) >= l && elem[0:l] == "bids" { - elem = elem[l:] - } else { - break - } + return + } - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "GET": - s.handleGetDomainBidsRequest([1]string{ - args[0], - }, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "GET", - allowedHeaders: nil, - acceptPost: "", - acceptPatch: "", - }) - } + case 'v': // Prefix: "v1/chat/completions" - return - } + if l := len("v1/chat/completions"); len(elem) >= l && elem[0:l] == "v1/chat/completions" { + elem = elem[l:] + } else { + break + } - case 'r': // Prefix: "resolve" + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "POST": + s.handlePostCocoonV1ChatCompletionsRequest([0]string{}, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "POST", + allowedHeaders: rn193AllowedHeaders, + acceptPost: "application/json", + acceptPatch: "", + }) + } - if l := len("resolve"); len(elem) >= l && elem[0:l] == "resolve" { - elem = elem[l:] - } else { - break - } + return + } - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "GET": - s.handleDnsResolveRequest([1]string{ - args[0], - }, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "GET", - allowedHeaders: nil, - acceptPost: "", - acceptPatch: "", - }) - } + case 'w': // Prefix: "workers" - return - } + if l := len("workers"); len(elem) >= l && elem[0:l] == "workers" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "GET": + s.handleGetCocoonWorkersRequest([0]string{}, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: nil, + acceptPost: "", + acceptPatch: "", + }) + } + + return + } + + } + + case 'd': // Prefix: "dns/" + + if l := len("dns/"); len(elem) >= l && elem[0:l] == "dns/" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + break + } + switch elem[0] { + case 'a': // Prefix: "auctions" + origElem := elem + if l := len("auctions"); len(elem) >= l && elem[0:l] == "auctions" { + elem = elem[l:] + } else { + break + } + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "GET": + s.handleGetAllAuctionsRequest([0]string{}, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: nil, + acceptPost: "", + acceptPatch: "", + }) } + return + } + + elem = origElem + } + // Param: "domain_name" + // Match until "/" + idx := strings.IndexByte(elem, '/') + if idx < 0 { + idx = len(elem) + } + args[0] = elem[:idx] + elem = elem[idx:] + + if len(elem) == 0 { + switch r.Method { + case "GET": + s.handleGetDnsInfoRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: nil, + acceptPost: "", + acceptPatch: "", + }) } - case 'e': // Prefix: "e" + return + } + switch elem[0] { + case '/': // Prefix: "/" - if l := len("e"); len(elem) >= l && elem[0:l] == "e" { + if l := len("/"); len(elem) >= l && elem[0:l] == "/" { elem = elem[l:] } else { break @@ -1902,64 +1820,52 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { break } switch elem[0] { - case 'v': // Prefix: "vents/" + case 'b': // Prefix: "bids" - if l := len("vents/"); len(elem) >= l && elem[0:l] == "vents/" { + if l := len("bids"); len(elem) >= l && elem[0:l] == "bids" { elem = elem[l:] } else { break } if len(elem) == 0 { - break - } - switch elem[0] { - case 'e': // Prefix: "emulate" - origElem := elem - if l := len("emulate"); len(elem) >= l && elem[0:l] == "emulate" { - elem = elem[l:] - } else { - break + // Leaf node. + switch r.Method { + case "GET": + s.handleGetDomainBidsRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: nil, + acceptPost: "", + acceptPatch: "", + }) } - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "POST": - s.handleEmulateMessageToEventRequest([0]string{}, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "POST", - allowedHeaders: rn22AllowedHeaders, - acceptPost: "application/json", - acceptPatch: "", - }) - } + return + } - return - } + case 'r': // Prefix: "resolve" - elem = origElem - } - // Param: "event_id" - // Match until "/" - idx := strings.IndexByte(elem, '/') - if idx < 0 { - idx = len(elem) + if l := len("resolve"); len(elem) >= l && elem[0:l] == "resolve" { + elem = elem[l:] + } else { + break } - args[0] = elem[:idx] - elem = elem[idx:] if len(elem) == 0 { + // Leaf node. switch r.Method { case "GET": - s.handleGetEventRequest([1]string{ + s.handleDnsResolveRequest([1]string{ args[0], }, elemIsEscaped, w, r) default: s.notAllowed(w, r, notAllowedParams{ allowedMethods: "GET", - allowedHeaders: rn93AllowedHeaders, + allowedHeaders: nil, acceptPost: "", acceptPatch: "", }) @@ -1967,65 +1873,53 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { return } - switch elem[0] { - case '/': // Prefix: "/jettons" - if l := len("/jettons"); len(elem) >= l && elem[0:l] == "/jettons" { - elem = elem[l:] - } else { - break - } + } - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "GET": - s.handleGetJettonsEventsRequest([1]string{ - args[0], - }, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "GET", - allowedHeaders: rn112AllowedHeaders, - acceptPost: "", - acceptPatch: "", - }) - } + } - return - } + case 'e': // Prefix: "e" - } + if l := len("e"); len(elem) >= l && elem[0:l] == "e" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + break + } + switch elem[0] { + case 'v': // Prefix: "vents/" - case 'x': // Prefix: "xtra-currency/" + if l := len("vents/"); len(elem) >= l && elem[0:l] == "vents/" { + elem = elem[l:] + } else { + break + } - if l := len("xtra-currency/"); len(elem) >= l && elem[0:l] == "xtra-currency/" { + if len(elem) == 0 { + break + } + switch elem[0] { + case 'e': // Prefix: "emulate" + origElem := elem + if l := len("emulate"); len(elem) >= l && elem[0:l] == "emulate" { elem = elem[l:] } else { break } - // Param: "id" - // Leaf parameter, slashes are prohibited - idx := strings.IndexByte(elem, '/') - if idx >= 0 { - break - } - args[0] = elem - elem = "" - if len(elem) == 0 { // Leaf node. switch r.Method { - case "GET": - s.handleGetExtraCurrencyInfoRequest([1]string{ - args[0], - }, elemIsEscaped, w, r) + case "POST": + s.handleEmulateMessageToEventRequest([0]string{}, elemIsEscaped, w, r) default: s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "GET", - allowedHeaders: nil, - acceptPost: "", + allowedMethods: "POST", + allowedHeaders: rn22AllowedHeaders, + acceptPost: "application/json", acceptPatch: "", }) } @@ -2033,23 +1927,38 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { return } + elem = origElem } - - case 'g': // Prefix: "gasless/" - - if l := len("gasless/"); len(elem) >= l && elem[0:l] == "gasless/" { - elem = elem[l:] - } else { - break + // Param: "event_id" + // Match until "/" + idx := strings.IndexByte(elem, '/') + if idx < 0 { + idx = len(elem) } + args[0] = elem[:idx] + elem = elem[idx:] if len(elem) == 0 { - break + switch r.Method { + case "GET": + s.handleGetEventRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: rn92AllowedHeaders, + acceptPost: "", + acceptPatch: "", + }) + } + + return } switch elem[0] { - case 'c': // Prefix: "config" + case '/': // Prefix: "/jettons" - if l := len("config"); len(elem) >= l && elem[0:l] == "config" { + if l := len("/jettons"); len(elem) >= l && elem[0:l] == "/jettons" { elem = elem[l:] } else { break @@ -2059,11 +1968,13 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { // Leaf node. switch r.Method { case "GET": - s.handleGaslessConfigRequest([0]string{}, elemIsEscaped, w, r) + s.handleGetJettonsEventsRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) default: s.notAllowed(w, r, notAllowedParams{ allowedMethods: "GET", - allowedHeaders: nil, + allowedHeaders: rn111AllowedHeaders, acceptPost: "", acceptPatch: "", }) @@ -2072,45 +1983,185 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { return } - case 'e': // Prefix: "estimate/" + } - if l := len("estimate/"); len(elem) >= l && elem[0:l] == "estimate/" { - elem = elem[l:] - } else { - break + case 'x': // Prefix: "xtra-currency/" + + if l := len("xtra-currency/"); len(elem) >= l && elem[0:l] == "xtra-currency/" { + elem = elem[l:] + } else { + break + } + + // Param: "id" + // Leaf parameter, slashes are prohibited + idx := strings.IndexByte(elem, '/') + if idx >= 0 { + break + } + args[0] = elem + elem = "" + + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "GET": + s.handleGetExtraCurrencyInfoRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: nil, + acceptPost: "", + acceptPatch: "", + }) } - // Param: "master_id" - // Leaf parameter, slashes are prohibited - idx := strings.IndexByte(elem, '/') - if idx >= 0 { - break + return + } + + } + + case 'g': // Prefix: "gasless/" + + if l := len("gasless/"); len(elem) >= l && elem[0:l] == "gasless/" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + break + } + switch elem[0] { + case 'c': // Prefix: "config" + + if l := len("config"); len(elem) >= l && elem[0:l] == "config" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "GET": + s.handleGaslessConfigRequest([0]string{}, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: nil, + acceptPost: "", + acceptPatch: "", + }) } - args[0] = elem - elem = "" - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "POST": - s.handleGaslessEstimateRequest([1]string{ - args[0], - }, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "POST", - allowedHeaders: rn31AllowedHeaders, - acceptPost: "application/json", - acceptPatch: "", - }) - } + return + } - return + case 'e': // Prefix: "estimate/" + + if l := len("estimate/"); len(elem) >= l && elem[0:l] == "estimate/" { + elem = elem[l:] + } else { + break + } + + // Param: "master_id" + // Leaf parameter, slashes are prohibited + idx := strings.IndexByte(elem, '/') + if idx >= 0 { + break + } + args[0] = elem + elem = "" + + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "POST": + s.handleGaslessEstimateRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "POST", + allowedHeaders: rn31AllowedHeaders, + acceptPost: "application/json", + acceptPatch: "", + }) + } + + return + } + + case 's': // Prefix: "send" + + if l := len("send"); len(elem) >= l && elem[0:l] == "send" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "POST": + s.handleGaslessSendRequest([0]string{}, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "POST", + allowedHeaders: rn32AllowedHeaders, + acceptPost: "application/json", + acceptPatch: "", + }) } - case 's': // Prefix: "send" + return + } + + } + + case 'j': // Prefix: "jettons" + + if l := len("jettons"); len(elem) >= l && elem[0:l] == "jettons" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + switch r.Method { + case "GET": + s.handleGetJettonsRequest([0]string{}, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: nil, + acceptPost: "", + acceptPatch: "", + }) + } + + return + } + switch elem[0] { + case '/': // Prefix: "/" + + if l := len("/"); len(elem) >= l && elem[0:l] == "/" { + elem = elem[l:] + } else { + break + } - if l := len("send"); len(elem) >= l && elem[0:l] == "send" { + if len(elem) == 0 { + break + } + switch elem[0] { + case '_': // Prefix: "_bulk" + origElem := elem + if l := len("_bulk"); len(elem) >= l && elem[0:l] == "_bulk" { elem = elem[l:] } else { break @@ -2120,11 +2171,11 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { // Leaf node. switch r.Method { case "POST": - s.handleGaslessSendRequest([0]string{}, elemIsEscaped, w, r) + s.handleGetJettonInfosByAddressesRequest([0]string{}, elemIsEscaped, w, r) default: s.notAllowed(w, r, notAllowedParams{ allowedMethods: "POST", - allowedHeaders: rn32AllowedHeaders, + allowedHeaders: rn106AllowedHeaders, acceptPost: "application/json", acceptPatch: "", }) @@ -2133,20 +2184,23 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { return } + elem = origElem } - - case 'j': // Prefix: "jettons" - - if l := len("jettons"); len(elem) >= l && elem[0:l] == "jettons" { - elem = elem[l:] - } else { - break + // Param: "jetton_id" + // Match until "/" + idx := strings.IndexByte(elem, '/') + if idx < 0 { + idx = len(elem) } + args[0] = elem[:idx] + elem = elem[idx:] if len(elem) == 0 { switch r.Method { case "GET": - s.handleGetJettonsRequest([0]string{}, elemIsEscaped, w, r) + s.handleGetJettonInfoRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) default: s.notAllowed(w, r, notAllowedParams{ allowedMethods: "GET", @@ -2171,126 +2225,108 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { break } switch elem[0] { - case '_': // Prefix: "_bulk" - origElem := elem - if l := len("_bulk"); len(elem) >= l && elem[0:l] == "_bulk" { + case 'a': // Prefix: "accounts/" + + if l := len("accounts/"); len(elem) >= l && elem[0:l] == "accounts/" { elem = elem[l:] } else { break } + // Param: "account_id" + // Match until "/" + idx := strings.IndexByte(elem, '/') + if idx < 0 { + idx = len(elem) + } + args[1] = elem[:idx] + elem = elem[idx:] + if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "POST": - s.handleGetJettonInfosByAddressesRequest([0]string{}, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "POST", - allowedHeaders: rn107AllowedHeaders, - acceptPost: "application/json", - acceptPatch: "", - }) + break + } + switch elem[0] { + case '/': // Prefix: "/history" + + if l := len("/history"); len(elem) >= l && elem[0:l] == "/history" { + elem = elem[l:] + } else { + break } - return - } + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "GET": + s.handleGetJettonAccountHistoryByIDRequest([2]string{ + args[0], + args[1], + }, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: nil, + acceptPost: "", + acceptPatch: "", + }) + } - elem = origElem - } - // Param: "jetton_id" - // Match until "/" - idx := strings.IndexByte(elem, '/') - if idx < 0 { - idx = len(elem) - } - args[0] = elem[:idx] - elem = elem[idx:] + return + } - if len(elem) == 0 { - switch r.Method { - case "GET": - s.handleGetJettonInfoRequest([1]string{ - args[0], - }, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "GET", - allowedHeaders: nil, - acceptPost: "", - acceptPatch: "", - }) } - return - } - switch elem[0] { - case '/': // Prefix: "/" + case 'h': // Prefix: "holders" - if l := len("/"); len(elem) >= l && elem[0:l] == "/" { + if l := len("holders"); len(elem) >= l && elem[0:l] == "holders" { elem = elem[l:] } else { break } if len(elem) == 0 { - break - } - switch elem[0] { - case 'a': // Prefix: "accounts/" - - if l := len("accounts/"); len(elem) >= l && elem[0:l] == "accounts/" { - elem = elem[l:] - } else { - break - } - - // Param: "account_id" - // Match until "/" - idx := strings.IndexByte(elem, '/') - if idx < 0 { - idx = len(elem) - } - args[1] = elem[:idx] - elem = elem[idx:] - - if len(elem) == 0 { - break + // Leaf node. + switch r.Method { + case "GET": + s.handleGetJettonHoldersRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: nil, + acceptPost: "", + acceptPatch: "", + }) } - switch elem[0] { - case '/': // Prefix: "/history" - if l := len("/history"); len(elem) >= l && elem[0:l] == "/history" { - elem = elem[l:] - } else { - break - } + return + } - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "GET": - s.handleGetJettonAccountHistoryByIDRequest([2]string{ - args[0], - args[1], - }, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "GET", - allowedHeaders: nil, - acceptPost: "", - acceptPatch: "", - }) - } + case 't': // Prefix: "transfer/" - return - } + if l := len("transfer/"); len(elem) >= l && elem[0:l] == "transfer/" { + elem = elem[l:] + } else { + break + } - } + // Param: "account_id" + // Match until "/" + idx := strings.IndexByte(elem, '/') + if idx < 0 { + idx = len(elem) + } + args[1] = elem[:idx] + elem = elem[idx:] - case 'h': // Prefix: "holders" + if len(elem) == 0 { + break + } + switch elem[0] { + case '/': // Prefix: "/payload" - if l := len("holders"); len(elem) >= l && elem[0:l] == "holders" { + if l := len("/payload"); len(elem) >= l && elem[0:l] == "/payload" { elem = elem[l:] } else { break @@ -2300,8 +2336,9 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { // Leaf node. switch r.Method { case "GET": - s.handleGetJettonHoldersRequest([1]string{ + s.handleGetJettonTransferPayloadRequest([2]string{ args[0], + args[1], }, elemIsEscaped, w, r) default: s.notAllowed(w, r, notAllowedParams{ @@ -2315,66 +2352,29 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { return } - case 't': // Prefix: "transfer/" - - if l := len("transfer/"); len(elem) >= l && elem[0:l] == "transfer/" { - elem = elem[l:] - } else { - break - } - - // Param: "account_id" - // Match until "/" - idx := strings.IndexByte(elem, '/') - if idx < 0 { - idx = len(elem) - } - args[1] = elem[:idx] - elem = elem[idx:] - - if len(elem) == 0 { - break - } - switch elem[0] { - case '/': // Prefix: "/payload" - - if l := len("/payload"); len(elem) >= l && elem[0:l] == "/payload" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "GET": - s.handleGetJettonTransferPayloadRequest([2]string{ - args[0], - args[1], - }, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "GET", - allowedHeaders: nil, - acceptPost: "", - acceptPatch: "", - }) - } - - return - } - - } - } } } - case 'l': // Prefix: "liteserver/" + } + + case 'l': // Prefix: "liteserver/" + + if l := len("liteserver/"); len(elem) >= l && elem[0:l] == "liteserver/" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + break + } + switch elem[0] { + case 'g': // Prefix: "get_" - if l := len("liteserver/"); len(elem) >= l && elem[0:l] == "liteserver/" { + if l := len("get_"); len(elem) >= l && elem[0:l] == "get_" { elem = elem[l:] } else { break @@ -2384,9 +2384,9 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { break } switch elem[0] { - case 'g': // Prefix: "get_" + case 'a': // Prefix: "a" - if l := len("get_"); len(elem) >= l && elem[0:l] == "get_" { + if l := len("a"); len(elem) >= l && elem[0:l] == "a" { elem = elem[l:] } else { break @@ -2396,95 +2396,131 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { break } switch elem[0] { - case 'a': // Prefix: "a" + case 'c': // Prefix: "ccount_state/" - if l := len("a"); len(elem) >= l && elem[0:l] == "a" { + if l := len("ccount_state/"); len(elem) >= l && elem[0:l] == "ccount_state/" { elem = elem[l:] } else { break } - if len(elem) == 0 { + // Param: "account_id" + // Leaf parameter, slashes are prohibited + idx := strings.IndexByte(elem, '/') + if idx >= 0 { break } - switch elem[0] { - case 'c': // Prefix: "ccount_state/" + args[0] = elem + elem = "" - if l := len("ccount_state/"); len(elem) >= l && elem[0:l] == "ccount_state/" { - elem = elem[l:] - } else { - break + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "GET": + s.handleGetRawAccountStateRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: nil, + acceptPost: "", + acceptPatch: "", + }) } - // Param: "account_id" - // Leaf parameter, slashes are prohibited - idx := strings.IndexByte(elem, '/') - if idx >= 0 { - break - } - args[0] = elem - elem = "" + return + } - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "GET": - s.handleGetRawAccountStateRequest([1]string{ - args[0], - }, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "GET", - allowedHeaders: nil, - acceptPost: "", - acceptPatch: "", - }) - } + case 'l': // Prefix: "ll_shards_info/" - return - } + if l := len("ll_shards_info/"); len(elem) >= l && elem[0:l] == "ll_shards_info/" { + elem = elem[l:] + } else { + break + } - case 'l': // Prefix: "ll_shards_info/" + // Param: "block_id" + // Leaf parameter, slashes are prohibited + idx := strings.IndexByte(elem, '/') + if idx >= 0 { + break + } + args[0] = elem + elem = "" - if l := len("ll_shards_info/"); len(elem) >= l && elem[0:l] == "ll_shards_info/" { - elem = elem[l:] - } else { - break + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "GET": + s.handleGetAllRawShardsInfoRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: nil, + acceptPost: "", + acceptPatch: "", + }) } - // Param: "block_id" - // Leaf parameter, slashes are prohibited - idx := strings.IndexByte(elem, '/') - if idx >= 0 { - break - } - args[0] = elem - elem = "" + return + } - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "GET": - s.handleGetAllRawShardsInfoRequest([1]string{ - args[0], - }, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "GET", - allowedHeaders: nil, - acceptPost: "", - acceptPatch: "", - }) - } + } - return + case 'b': // Prefix: "block" + + if l := len("block"); len(elem) >= l && elem[0:l] == "block" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + break + } + switch elem[0] { + case '/': // Prefix: "/" + + if l := len("/"); len(elem) >= l && elem[0:l] == "/" { + elem = elem[l:] + } else { + break + } + + // Param: "block_id" + // Leaf parameter, slashes are prohibited + idx := strings.IndexByte(elem, '/') + if idx >= 0 { + break + } + args[0] = elem + elem = "" + + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "GET": + s.handleGetRawBlockchainBlockRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: nil, + acceptPost: "", + acceptPatch: "", + }) } + return } - case 'b': // Prefix: "block" + case '_': // Prefix: "_" - if l := len("block"); len(elem) >= l && elem[0:l] == "block" { + if l := len("_"); len(elem) >= l && elem[0:l] == "_" { elem = elem[l:] } else { break @@ -2494,9 +2530,9 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { break } switch elem[0] { - case '/': // Prefix: "/" + case 'h': // Prefix: "header/" - if l := len("/"); len(elem) >= l && elem[0:l] == "/" { + if l := len("header/"); len(elem) >= l && elem[0:l] == "header/" { elem = elem[l:] } else { break @@ -2515,7 +2551,7 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { // Leaf node. switch r.Method { case "GET": - s.handleGetRawBlockchainBlockRequest([1]string{ + s.handleGetRawBlockchainBlockHeaderRequest([1]string{ args[0], }, elemIsEscaped, w, r) default: @@ -2530,107 +2566,108 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { return } - case '_': // Prefix: "_" + case 'p': // Prefix: "proof" - if l := len("_"); len(elem) >= l && elem[0:l] == "_" { + if l := len("proof"); len(elem) >= l && elem[0:l] == "proof" { elem = elem[l:] } else { break } if len(elem) == 0 { - break + // Leaf node. + switch r.Method { + case "GET": + s.handleGetRawBlockProofRequest([0]string{}, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: nil, + acceptPost: "", + acceptPatch: "", + }) + } + + return } - switch elem[0] { - case 'h': // Prefix: "header/" - if l := len("header/"); len(elem) >= l && elem[0:l] == "header/" { - elem = elem[l:] - } else { - break - } + } - // Param: "block_id" - // Leaf parameter, slashes are prohibited - idx := strings.IndexByte(elem, '/') - if idx >= 0 { - break - } - args[0] = elem - elem = "" + } - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "GET": - s.handleGetRawBlockchainBlockHeaderRequest([1]string{ - args[0], - }, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "GET", - allowedHeaders: nil, - acceptPost: "", - acceptPatch: "", - }) - } + case 'c': // Prefix: "config_all/" - return - } + if l := len("config_all/"); len(elem) >= l && elem[0:l] == "config_all/" { + elem = elem[l:] + } else { + break + } - case 'p': // Prefix: "proof" + // Param: "block_id" + // Leaf parameter, slashes are prohibited + idx := strings.IndexByte(elem, '/') + if idx >= 0 { + break + } + args[0] = elem + elem = "" - if l := len("proof"); len(elem) >= l && elem[0:l] == "proof" { - elem = elem[l:] - } else { - break - } + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "GET": + s.handleGetRawConfigRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: nil, + acceptPost: "", + acceptPatch: "", + }) + } - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "GET": - s.handleGetRawBlockProofRequest([0]string{}, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "GET", - allowedHeaders: nil, - acceptPost: "", - acceptPatch: "", - }) - } + return + } - return - } + case 'm': // Prefix: "masterchain_info" - } + if l := len("masterchain_info"); len(elem) >= l && elem[0:l] == "masterchain_info" { + elem = elem[l:] + } else { + break + } + if len(elem) == 0 { + switch r.Method { + case "GET": + s.handleGetRawMasterchainInfoRequest([0]string{}, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: nil, + acceptPost: "", + acceptPatch: "", + }) } - case 'c': // Prefix: "config_all/" + return + } + switch elem[0] { + case '_': // Prefix: "_ext" - if l := len("config_all/"); len(elem) >= l && elem[0:l] == "config_all/" { + if l := len("_ext"); len(elem) >= l && elem[0:l] == "_ext" { elem = elem[l:] } else { break } - // Param: "block_id" - // Leaf parameter, slashes are prohibited - idx := strings.IndexByte(elem, '/') - if idx >= 0 { - break - } - args[0] = elem - elem = "" - if len(elem) == 0 { // Leaf node. switch r.Method { case "GET": - s.handleGetRawConfigRequest([1]string{ - args[0], - }, elemIsEscaped, w, r) + s.handleGetRawMasterchainInfoExtRequest([0]string{}, elemIsEscaped, w, r) default: s.notAllowed(w, r, notAllowedParams{ allowedMethods: "GET", @@ -2643,183 +2680,60 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { return } - case 'm': // Prefix: "masterchain_info" + } + + case 'o': // Prefix: "out_msg_queue_sizes" + + if l := len("out_msg_queue_sizes"); len(elem) >= l && elem[0:l] == "out_msg_queue_sizes" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "GET": + s.handleGetOutMsgQueueSizesRequest([0]string{}, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: nil, + acceptPost: "", + acceptPatch: "", + }) + } + + return + } + + case 's': // Prefix: "s" + + if l := len("s"); len(elem) >= l && elem[0:l] == "s" { + elem = elem[l:] + } else { + break + } - if l := len("masterchain_info"); len(elem) >= l && elem[0:l] == "masterchain_info" { + if len(elem) == 0 { + break + } + switch elem[0] { + case 'h': // Prefix: "hard_" + + if l := len("hard_"); len(elem) >= l && elem[0:l] == "hard_" { elem = elem[l:] } else { break } if len(elem) == 0 { - switch r.Method { - case "GET": - s.handleGetRawMasterchainInfoRequest([0]string{}, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "GET", - allowedHeaders: nil, - acceptPost: "", - acceptPatch: "", - }) - } - - return + break } switch elem[0] { - case '_': // Prefix: "_ext" + case 'b': // Prefix: "block_proof/" - if l := len("_ext"); len(elem) >= l && elem[0:l] == "_ext" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "GET": - s.handleGetRawMasterchainInfoExtRequest([0]string{}, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "GET", - allowedHeaders: nil, - acceptPost: "", - acceptPatch: "", - }) - } - - return - } - - } - - case 'o': // Prefix: "out_msg_queue_sizes" - - if l := len("out_msg_queue_sizes"); len(elem) >= l && elem[0:l] == "out_msg_queue_sizes" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "GET": - s.handleGetOutMsgQueueSizesRequest([0]string{}, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "GET", - allowedHeaders: nil, - acceptPost: "", - acceptPatch: "", - }) - } - - return - } - - case 's': // Prefix: "s" - - if l := len("s"); len(elem) >= l && elem[0:l] == "s" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - break - } - switch elem[0] { - case 'h': // Prefix: "hard_" - - if l := len("hard_"); len(elem) >= l && elem[0:l] == "hard_" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - break - } - switch elem[0] { - case 'b': // Prefix: "block_proof/" - - if l := len("block_proof/"); len(elem) >= l && elem[0:l] == "block_proof/" { - elem = elem[l:] - } else { - break - } - - // Param: "block_id" - // Leaf parameter, slashes are prohibited - idx := strings.IndexByte(elem, '/') - if idx >= 0 { - break - } - args[0] = elem - elem = "" - - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "GET": - s.handleGetRawShardBlockProofRequest([1]string{ - args[0], - }, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "GET", - allowedHeaders: nil, - acceptPost: "", - acceptPatch: "", - }) - } - - return - } - - case 'i': // Prefix: "info/" - - if l := len("info/"); len(elem) >= l && elem[0:l] == "info/" { - elem = elem[l:] - } else { - break - } - - // Param: "block_id" - // Leaf parameter, slashes are prohibited - idx := strings.IndexByte(elem, '/') - if idx >= 0 { - break - } - args[0] = elem - elem = "" - - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "GET": - s.handleGetRawShardInfoRequest([1]string{ - args[0], - }, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "GET", - allowedHeaders: nil, - acceptPost: "", - acceptPatch: "", - }) - } - - return - } - - } - - case 't': // Prefix: "tate/" - - if l := len("tate/"); len(elem) >= l && elem[0:l] == "tate/" { + if l := len("block_proof/"); len(elem) >= l && elem[0:l] == "block_proof/" { elem = elem[l:] } else { break @@ -2838,7 +2752,7 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { // Leaf node. switch r.Method { case "GET": - s.handleGetRawBlockchainBlockStateRequest([1]string{ + s.handleGetRawShardBlockProofRequest([1]string{ args[0], }, elemIsEscaped, w, r) default: @@ -2853,54 +2767,15 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { return } - } - - case 't': // Prefix: "t" - - if l := len("t"); len(elem) >= l && elem[0:l] == "t" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - break - } - switch elem[0] { - case 'i': // Prefix: "ime" - - if l := len("ime"); len(elem) >= l && elem[0:l] == "ime" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "GET": - s.handleGetRawTimeRequest([0]string{}, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "GET", - allowedHeaders: nil, - acceptPost: "", - acceptPatch: "", - }) - } - - return - } - - case 'r': // Prefix: "ransactions/" + case 'i': // Prefix: "info/" - if l := len("ransactions/"); len(elem) >= l && elem[0:l] == "ransactions/" { + if l := len("info/"); len(elem) >= l && elem[0:l] == "info/" { elem = elem[l:] } else { break } - // Param: "account_id" + // Param: "block_id" // Leaf parameter, slashes are prohibited idx := strings.IndexByte(elem, '/') if idx >= 0 { @@ -2913,7 +2788,7 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { // Leaf node. switch r.Method { case "GET": - s.handleGetRawTransactionsRequest([1]string{ + s.handleGetRawShardInfoRequest([1]string{ args[0], }, elemIsEscaped, w, r) default: @@ -2930,123 +2805,84 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { } - } + case 't': // Prefix: "tate/" - case 'l': // Prefix: "list_block_transactions/" + if l := len("tate/"); len(elem) >= l && elem[0:l] == "tate/" { + elem = elem[l:] + } else { + break + } - if l := len("list_block_transactions/"); len(elem) >= l && elem[0:l] == "list_block_transactions/" { - elem = elem[l:] - } else { - break - } + // Param: "block_id" + // Leaf parameter, slashes are prohibited + idx := strings.IndexByte(elem, '/') + if idx >= 0 { + break + } + args[0] = elem + elem = "" - // Param: "block_id" - // Leaf parameter, slashes are prohibited - idx := strings.IndexByte(elem, '/') - if idx >= 0 { - break - } - args[0] = elem - elem = "" + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "GET": + s.handleGetRawBlockchainBlockStateRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: nil, + acceptPost: "", + acceptPatch: "", + }) + } - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "GET": - s.handleGetRawListBlockTransactionsRequest([1]string{ - args[0], - }, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "GET", - allowedHeaders: nil, - acceptPost: "", - acceptPatch: "", - }) + return } - return } - case 's': // Prefix: "send_message" + case 't': // Prefix: "t" - if l := len("send_message"); len(elem) >= l && elem[0:l] == "send_message" { + if l := len("t"); len(elem) >= l && elem[0:l] == "t" { elem = elem[l:] } else { break } if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "POST": - s.handleSendRawMessageRequest([0]string{}, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "POST", - allowedHeaders: rn198AllowedHeaders, - acceptPost: "application/json", - acceptPatch: "", - }) - } - - return + break } + switch elem[0] { + case 'i': // Prefix: "ime" - } + if l := len("ime"); len(elem) >= l && elem[0:l] == "ime" { + elem = elem[l:] + } else { + break + } - case 'm': // Prefix: "m" + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "GET": + s.handleGetRawTimeRequest([0]string{}, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: nil, + acceptPost: "", + acceptPatch: "", + }) + } - if l := len("m"); len(elem) >= l && elem[0:l] == "m" { - elem = elem[l:] - } else { - break - } + return + } - if len(elem) == 0 { - break - } - switch elem[0] { - case 'e': // Prefix: "essage/decode" - - if l := len("essage/decode"); len(elem) >= l && elem[0:l] == "essage/decode" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "POST": - s.handleDecodeMessageRequest([0]string{}, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "POST", - allowedHeaders: rn12AllowedHeaders, - acceptPost: "application/json", - acceptPatch: "", - }) - } - - return - } - - case 'u': // Prefix: "ultisig/" - - if l := len("ultisig/"); len(elem) >= l && elem[0:l] == "ultisig/" { - elem = elem[l:] - } else { - break - } + case 'r': // Prefix: "ransactions/" - if len(elem) == 0 { - break - } - switch elem[0] { - case 'o': // Prefix: "order/" - origElem := elem - if l := len("order/"); len(elem) >= l && elem[0:l] == "order/" { + if l := len("ransactions/"); len(elem) >= l && elem[0:l] == "ransactions/" { elem = elem[l:] } else { break @@ -3065,7 +2901,7 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { // Leaf node. switch r.Method { case "GET": - s.handleGetMultisigOrderRequest([1]string{ + s.handleGetRawTransactionsRequest([1]string{ args[0], }, elemIsEscaped, w, r) default: @@ -3080,8 +2916,130 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { return } - elem = origElem } + + } + + case 'l': // Prefix: "list_block_transactions/" + + if l := len("list_block_transactions/"); len(elem) >= l && elem[0:l] == "list_block_transactions/" { + elem = elem[l:] + } else { + break + } + + // Param: "block_id" + // Leaf parameter, slashes are prohibited + idx := strings.IndexByte(elem, '/') + if idx >= 0 { + break + } + args[0] = elem + elem = "" + + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "GET": + s.handleGetRawListBlockTransactionsRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: nil, + acceptPost: "", + acceptPatch: "", + }) + } + + return + } + + case 's': // Prefix: "send_message" + + if l := len("send_message"); len(elem) >= l && elem[0:l] == "send_message" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "POST": + s.handleSendRawMessageRequest([0]string{}, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "POST", + allowedHeaders: rn197AllowedHeaders, + acceptPost: "application/json", + acceptPatch: "", + }) + } + + return + } + + } + + case 'm': // Prefix: "m" + + if l := len("m"); len(elem) >= l && elem[0:l] == "m" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + break + } + switch elem[0] { + case 'e': // Prefix: "essage/decode" + + if l := len("essage/decode"); len(elem) >= l && elem[0:l] == "essage/decode" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "POST": + s.handleDecodeMessageRequest([0]string{}, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "POST", + allowedHeaders: rn12AllowedHeaders, + acceptPost: "application/json", + acceptPatch: "", + }) + } + + return + } + + case 'u': // Prefix: "ultisig/" + + if l := len("ultisig/"); len(elem) >= l && elem[0:l] == "ultisig/" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + break + } + switch elem[0] { + case 'o': // Prefix: "order/" + origElem := elem + if l := len("order/"); len(elem) >= l && elem[0:l] == "order/" { + elem = elem[l:] + } else { + break + } + // Param: "account_id" // Leaf parameter, slashes are prohibited idx := strings.IndexByte(elem, '/') @@ -3095,7 +3053,7 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { // Leaf node. switch r.Method { case "GET": - s.handleGetMultisigAccountRequest([1]string{ + s.handleGetMultisigOrderRequest([1]string{ args[0], }, elemIsEscaped, w, r) default: @@ -3110,58 +3068,154 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { return } + elem = origElem + } + // Param: "account_id" + // Leaf parameter, slashes are prohibited + idx := strings.IndexByte(elem, '/') + if idx >= 0 { + break + } + args[0] = elem + elem = "" + + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "GET": + s.handleGetMultisigAccountRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: nil, + acceptPost: "", + acceptPatch: "", + }) + } + + return } - case 'n': // Prefix: "nfts/" + } + + case 'n': // Prefix: "nfts/" + + if l := len("nfts/"); len(elem) >= l && elem[0:l] == "nfts/" { + elem = elem[l:] + } else { + break + } - if l := len("nfts/"); len(elem) >= l && elem[0:l] == "nfts/" { + if len(elem) == 0 { + break + } + switch elem[0] { + case '_': // Prefix: "_bulk" + origElem := elem + if l := len("_bulk"); len(elem) >= l && elem[0:l] == "_bulk" { elem = elem[l:] } else { break } if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "POST": + s.handleGetNftItemsByAddressesRequest([0]string{}, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "POST", + allowedHeaders: rn126AllowedHeaders, + acceptPost: "application/json", + acceptPatch: "", + }) + } + + return + } + + elem = origElem + case 'c': // Prefix: "collections" + origElem := elem + if l := len("collections"); len(elem) >= l && elem[0:l] == "collections" { + elem = elem[l:] + } else { break } + + if len(elem) == 0 { + switch r.Method { + case "GET": + s.handleGetNftCollectionsRequest([0]string{}, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: nil, + acceptPost: "", + acceptPatch: "", + }) + } + + return + } switch elem[0] { - case '_': // Prefix: "_bulk" - origElem := elem - if l := len("_bulk"); len(elem) >= l && elem[0:l] == "_bulk" { + case '/': // Prefix: "/" + + if l := len("/"); len(elem) >= l && elem[0:l] == "/" { elem = elem[l:] } else { break } if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "POST": - s.handleGetNftItemsByAddressesRequest([0]string{}, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "POST", - allowedHeaders: rn127AllowedHeaders, - acceptPost: "application/json", - acceptPatch: "", - }) + break + } + switch elem[0] { + case '_': // Prefix: "_bulk" + origElem := elem + if l := len("_bulk"); len(elem) >= l && elem[0:l] == "_bulk" { + elem = elem[l:] + } else { + break } - return - } + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "POST": + s.handleGetNftCollectionItemsByAddressesRequest([0]string{}, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "POST", + allowedHeaders: rn121AllowedHeaders, + acceptPost: "application/json", + acceptPatch: "", + }) + } - elem = origElem - case 'c': // Prefix: "collections" - origElem := elem - if l := len("collections"); len(elem) >= l && elem[0:l] == "collections" { - elem = elem[l:] - } else { - break + return + } + + elem = origElem + } + // Param: "account_id" + // Match until "/" + idx := strings.IndexByte(elem, '/') + if idx < 0 { + idx = len(elem) } + args[0] = elem[:idx] + elem = elem[idx:] if len(elem) == 0 { switch r.Method { case "GET": - s.handleGetNftCollectionsRequest([0]string{}, elemIsEscaped, w, r) + s.handleGetNftCollectionRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) default: s.notAllowed(w, r, notAllowedParams{ allowedMethods: "GET", @@ -3174,58 +3228,19 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { return } switch elem[0] { - case '/': // Prefix: "/" + case '/': // Prefix: "/items" - if l := len("/"); len(elem) >= l && elem[0:l] == "/" { + if l := len("/items"); len(elem) >= l && elem[0:l] == "/items" { elem = elem[l:] } else { break } if len(elem) == 0 { - break - } - switch elem[0] { - case '_': // Prefix: "_bulk" - origElem := elem - if l := len("_bulk"); len(elem) >= l && elem[0:l] == "_bulk" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "POST": - s.handleGetNftCollectionItemsByAddressesRequest([0]string{}, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "POST", - allowedHeaders: rn122AllowedHeaders, - acceptPost: "application/json", - acceptPatch: "", - }) - } - - return - } - - elem = origElem - } - // Param: "account_id" - // Match until "/" - idx := strings.IndexByte(elem, '/') - if idx < 0 { - idx = len(elem) - } - args[0] = elem[:idx] - elem = elem[idx:] - - if len(elem) == 0 { + // Leaf node. switch r.Method { case "GET": - s.handleGetNftCollectionRequest([1]string{ + s.handleGetItemsFromCollectionRequest([1]string{ args[0], }, elemIsEscaped, w, r) default: @@ -3239,55 +3254,94 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { return } - switch elem[0] { - case '/': // Prefix: "/items" - if l := len("/items"); len(elem) >= l && elem[0:l] == "/items" { - elem = elem[l:] - } else { - break - } + } - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "GET": - s.handleGetItemsFromCollectionRequest([1]string{ - args[0], - }, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "GET", - allowedHeaders: nil, - acceptPost: "", - acceptPatch: "", - }) - } + } - return - } + elem = origElem + } + // Param: "account_id" + // Match until "/" + idx := strings.IndexByte(elem, '/') + if idx < 0 { + idx = len(elem) + } + args[0] = elem[:idx] + elem = elem[idx:] - } + if len(elem) == 0 { + switch r.Method { + case "GET": + s.handleGetNftItemByAddressRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: nil, + acceptPost: "", + acceptPatch: "", + }) + } - } + return + } + switch elem[0] { + case '/': // Prefix: "/history" - elem = origElem - } - // Param: "account_id" - // Match until "/" - idx := strings.IndexByte(elem, '/') - if idx < 0 { - idx = len(elem) + if l := len("/history"); len(elem) >= l && elem[0:l] == "/history" { + elem = elem[l:] + } else { + break } - args[0] = elem[:idx] - elem = elem[idx:] if len(elem) == 0 { + // Leaf node. switch r.Method { case "GET": - s.handleGetNftItemByAddressRequest([1]string{ + s.handleGetNftHistoryByIDRequest([1]string{ args[0], }, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: rn125AllowedHeaders, + acceptPost: "", + acceptPatch: "", + }) + } + + return + } + + } + + case 'o': // Prefix: "openapi." + + if l := len("openapi."); len(elem) >= l && elem[0:l] == "openapi." { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + break + } + switch elem[0] { + case 'j': // Prefix: "json" + + if l := len("json"); len(elem) >= l && elem[0:l] == "json" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "GET": + s.handleGetOpenapiJsonRequest([0]string{}, elemIsEscaped, w, r) default: s.notAllowed(w, r, notAllowedParams{ allowedMethods: "GET", @@ -3299,10 +3353,61 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { return } - switch elem[0] { - case '/': // Prefix: "/history" - if l := len("/history"); len(elem) >= l && elem[0:l] == "/history" { + case 'y': // Prefix: "yml" + + if l := len("yml"); len(elem) >= l && elem[0:l] == "yml" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "GET": + s.handleGetOpenapiYmlRequest([0]string{}, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: nil, + acceptPost: "", + acceptPatch: "", + }) + } + + return + } + + } + + case 'p': // Prefix: "pu" + + if l := len("pu"); len(elem) >= l && elem[0:l] == "pu" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + break + } + switch elem[0] { + case 'b': // Prefix: "bkeys/" + + if l := len("bkeys/"); len(elem) >= l && elem[0:l] == "bkeys/" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + break + } + switch elem[0] { + case 'w': // Prefix: "wallets/_bulk" + origElem := elem + if l := len("wallets/_bulk"); len(elem) >= l && elem[0:l] == "wallets/_bulk" { elem = elem[l:] } else { break @@ -3311,15 +3416,13 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { if len(elem) == 0 { // Leaf node. switch r.Method { - case "GET": - s.handleGetNftHistoryByIDRequest([1]string{ - args[0], - }, elemIsEscaped, w, r) + case "POST": + s.handleGetWalletsByPublicKeyBulkRequest([0]string{}, elemIsEscaped, w, r) default: s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "GET", - allowedHeaders: rn126AllowedHeaders, - acceptPost: "", + allowedMethods: "POST", + allowedHeaders: rn190AllowedHeaders, + acceptPost: "application/json", acceptPatch: "", }) } @@ -3327,23 +3430,24 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { return } + elem = origElem } - - case 'o': // Prefix: "openapi." - - if l := len("openapi."); len(elem) >= l && elem[0:l] == "openapi." { - elem = elem[l:] - } else { - break + // Param: "public_key" + // Match until "/" + idx := strings.IndexByte(elem, '/') + if idx < 0 { + idx = len(elem) } + args[0] = elem[:idx] + elem = elem[idx:] if len(elem) == 0 { break } switch elem[0] { - case 'j': // Prefix: "json" + case '/': // Prefix: "/wallets" - if l := len("json"); len(elem) >= l && elem[0:l] == "json" { + if l := len("/wallets"); len(elem) >= l && elem[0:l] == "/wallets" { elem = elem[l:] } else { break @@ -3353,7 +3457,9 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { // Leaf node. switch r.Method { case "GET": - s.handleGetOpenapiJsonRequest([0]string{}, elemIsEscaped, w, r) + s.handleGetWalletsByPublicKeyRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) default: s.notAllowed(w, r, notAllowedParams{ allowedMethods: "GET", @@ -3366,9 +3472,32 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { return } - case 'y': // Prefix: "yml" + } + + case 'r': // Prefix: "rchases/" + + if l := len("rchases/"); len(elem) >= l && elem[0:l] == "rchases/" { + elem = elem[l:] + } else { + break + } + + // Param: "account_id" + // Match until "/" + idx := strings.IndexByte(elem, '/') + if idx < 0 { + idx = len(elem) + } + args[0] = elem[:idx] + elem = elem[idx:] + + if len(elem) == 0 { + break + } + switch elem[0] { + case '/': // Prefix: "/history" - if l := len("yml"); len(elem) >= l && elem[0:l] == "yml" { + if l := len("/history"); len(elem) >= l && elem[0:l] == "/history" { elem = elem[l:] } else { break @@ -3378,7 +3507,9 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { // Leaf node. switch r.Method { case "GET": - s.handleGetOpenapiYmlRequest([0]string{}, elemIsEscaped, w, r) + s.handleGetPurchaseHistoryRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) default: s.notAllowed(w, r, notAllowedParams{ allowedMethods: "GET", @@ -3393,21 +3524,47 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { } - case 'p': // Prefix: "pu" + } + + case 'r': // Prefix: "r" + + if l := len("r"); len(elem) >= l && elem[0:l] == "r" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + break + } + switch elem[0] { + case 'a': // Prefix: "ates" - if l := len("pu"); len(elem) >= l && elem[0:l] == "pu" { + if l := len("ates"); len(elem) >= l && elem[0:l] == "ates" { elem = elem[l:] } else { break } if len(elem) == 0 { - break + switch r.Method { + case "GET": + s.handleGetRatesRequest([0]string{}, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: nil, + acceptPost: "", + acceptPatch: "", + }) + } + + return } switch elem[0] { - case 'b': // Prefix: "bkeys/" + case '/': // Prefix: "/" - if l := len("bkeys/"); len(elem) >= l && elem[0:l] == "bkeys/" { + if l := len("/"); len(elem) >= l && elem[0:l] == "/" { elem = elem[l:] } else { break @@ -3417,9 +3574,9 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { break } switch elem[0] { - case 'w': // Prefix: "wallets/_bulk" - origElem := elem - if l := len("wallets/_bulk"); len(elem) >= l && elem[0:l] == "wallets/_bulk" { + case 'c': // Prefix: "chart" + + if l := len("chart"); len(elem) >= l && elem[0:l] == "chart" { elem = elem[l:] } else { break @@ -3428,13 +3585,13 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { if len(elem) == 0 { // Leaf node. switch r.Method { - case "POST": - s.handleGetWalletsByPublicKeyBulkRequest([0]string{}, elemIsEscaped, w, r) + case "GET": + s.handleGetChartRatesRequest([0]string{}, elemIsEscaped, w, r) default: s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "POST", - allowedHeaders: rn191AllowedHeaders, - acceptPost: "application/json", + allowedMethods: "GET", + allowedHeaders: nil, + acceptPost: "", acceptPatch: "", }) } @@ -3442,24 +3599,9 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { return } - elem = origElem - } - // Param: "public_key" - // Match until "/" - idx := strings.IndexByte(elem, '/') - if idx < 0 { - idx = len(elem) - } - args[0] = elem[:idx] - elem = elem[idx:] - - if len(elem) == 0 { - break - } - switch elem[0] { - case '/': // Prefix: "/wallets" + case 'm': // Prefix: "markets" - if l := len("/wallets"); len(elem) >= l && elem[0:l] == "/wallets" { + if l := len("markets"); len(elem) >= l && elem[0:l] == "markets" { elem = elem[l:] } else { break @@ -3469,59 +3611,7 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { // Leaf node. switch r.Method { case "GET": - s.handleGetWalletsByPublicKeyRequest([1]string{ - args[0], - }, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "GET", - allowedHeaders: nil, - acceptPost: "", - acceptPatch: "", - }) - } - - return - } - - } - - case 'r': // Prefix: "rchases/" - - if l := len("rchases/"); len(elem) >= l && elem[0:l] == "rchases/" { - elem = elem[l:] - } else { - break - } - - // Param: "account_id" - // Match until "/" - idx := strings.IndexByte(elem, '/') - if idx < 0 { - idx = len(elem) - } - args[0] = elem[:idx] - elem = elem[idx:] - - if len(elem) == 0 { - break - } - switch elem[0] { - case '/': // Prefix: "/history" - - if l := len("/history"); len(elem) >= l && elem[0:l] == "/history" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "GET": - s.handleGetPurchaseHistoryRequest([1]string{ - args[0], - }, elemIsEscaped, w, r) + s.handleGetMarketsRatesRequest([0]string{}, elemIsEscaped, w, r) default: s.notAllowed(w, r, notAllowedParams{ allowedMethods: "GET", @@ -3538,9 +3628,9 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { } - case 'r': // Prefix: "r" + case 'e': // Prefix: "ewards/" - if l := len("r"); len(elem) >= l && elem[0:l] == "r" { + if l := len("ewards/"); len(elem) >= l && elem[0:l] == "ewards/" { elem = elem[l:] } else { break @@ -3550,18 +3640,19 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { break } switch elem[0] { - case 'a': // Prefix: "ates" + case 'r': // Prefix: "round-rewards" - if l := len("ates"); len(elem) >= l && elem[0:l] == "ates" { + if l := len("round-rewards"); len(elem) >= l && elem[0:l] == "round-rewards" { elem = elem[l:] } else { break } if len(elem) == 0 { + // Leaf node. switch r.Method { case "GET": - s.handleGetRatesRequest([0]string{}, elemIsEscaped, w, r) + s.handleGetRoundRewardsRequest([0]string{}, elemIsEscaped, w, r) default: s.notAllowed(w, r, notAllowedParams{ allowedMethods: "GET", @@ -3573,76 +3664,10 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { return } - switch elem[0] { - case '/': // Prefix: "/" - - if l := len("/"); len(elem) >= l && elem[0:l] == "/" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - break - } - switch elem[0] { - case 'c': // Prefix: "chart" - - if l := len("chart"); len(elem) >= l && elem[0:l] == "chart" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "GET": - s.handleGetChartRatesRequest([0]string{}, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "GET", - allowedHeaders: nil, - acceptPost: "", - acceptPatch: "", - }) - } - - return - } - - case 'm': // Prefix: "markets" - - if l := len("markets"); len(elem) >= l && elem[0:l] == "markets" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "GET": - s.handleGetMarketsRatesRequest([0]string{}, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "GET", - allowedHeaders: nil, - acceptPost: "", - acceptPatch: "", - }) - } - - return - } - - } - - } - case 'e': // Prefix: "ewards/" + case 'v': // Prefix: "validat" - if l := len("ewards/"); len(elem) >= l && elem[0:l] == "ewards/" { + if l := len("validat"); len(elem) >= l && elem[0:l] == "validat" { elem = elem[l:] } else { break @@ -3652,9 +3677,9 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { break } switch elem[0] { - case 'r': // Prefix: "round-rewards" + case 'i': // Prefix: "ion-rounds" - if l := len("round-rewards"); len(elem) >= l && elem[0:l] == "round-rewards" { + if l := len("ion-rounds"); len(elem) >= l && elem[0:l] == "ion-rounds" { elem = elem[l:] } else { break @@ -3664,7 +3689,7 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { // Leaf node. switch r.Method { case "GET": - s.handleGetRoundRewardsRequest([0]string{}, elemIsEscaped, w, r) + s.handleGetValidationRoundsRequest([0]string{}, elemIsEscaped, w, r) default: s.notAllowed(w, r, notAllowedParams{ allowedMethods: "GET", @@ -3677,46 +3702,97 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { return } - case 'v': // Prefix: "validat" + case 'o': // Prefix: "ors" - if l := len("validat"); len(elem) >= l && elem[0:l] == "validat" { + if l := len("ors"); len(elem) >= l && elem[0:l] == "ors" { elem = elem[l:] } else { break } if len(elem) == 0 { - break + // Leaf node. + switch r.Method { + case "GET": + s.handleGetValidatorsRequest([0]string{}, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: nil, + acceptPost: "", + acceptPatch: "", + }) + } + + return } - switch elem[0] { - case 'i': // Prefix: "ion-rounds" - if l := len("ion-rounds"); len(elem) >= l && elem[0:l] == "ion-rounds" { - elem = elem[l:] - } else { - break - } + } - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "GET": - s.handleGetValidationRoundsRequest([0]string{}, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "GET", - allowedHeaders: nil, - acceptPost: "", - acceptPatch: "", - }) - } + } - return - } + } + + case 's': // Prefix: "st" + + if l := len("st"); len(elem) >= l && elem[0:l] == "st" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + break + } + switch elem[0] { + case 'a': // Prefix: "a" + + if l := len("a"); len(elem) >= l && elem[0:l] == "a" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + break + } + switch elem[0] { + case 'k': // Prefix: "king/" + + if l := len("king/"); len(elem) >= l && elem[0:l] == "king/" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + break + } + switch elem[0] { + case 'n': // Prefix: "nominator/" - case 'o': // Prefix: "ors" + if l := len("nominator/"); len(elem) >= l && elem[0:l] == "nominator/" { + elem = elem[l:] + } else { + break + } + + // Param: "account_id" + // Match until "/" + idx := strings.IndexByte(elem, '/') + if idx < 0 { + idx = len(elem) + } + args[0] = elem[:idx] + elem = elem[idx:] + + if len(elem) == 0 { + break + } + switch elem[0] { + case '/': // Prefix: "/pools" - if l := len("ors"); len(elem) >= l && elem[0:l] == "ors" { + if l := len("/pools"); len(elem) >= l && elem[0:l] == "/pools" { elem = elem[l:] } else { break @@ -3726,7 +3802,9 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { // Leaf node. switch r.Method { case "GET": - s.handleGetValidatorsRequest([0]string{}, elemIsEscaped, w, r) + s.handleGetAccountNominatorsPoolsRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) default: s.notAllowed(w, r, notAllowedParams{ allowedMethods: "GET", @@ -3741,37 +3819,9 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { } - } - - } - - case 's': // Prefix: "st" - - if l := len("st"); len(elem) >= l && elem[0:l] == "st" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - break - } - switch elem[0] { - case 'a': // Prefix: "a" - - if l := len("a"); len(elem) >= l && elem[0:l] == "a" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - break - } - switch elem[0] { - case 'k': // Prefix: "king/" + case 'p': // Prefix: "pool" - if l := len("king/"); len(elem) >= l && elem[0:l] == "king/" { + if l := len("pool"); len(elem) >= l && elem[0:l] == "pool" { elem = elem[l:] } else { break @@ -3781,9 +3831,9 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { break } switch elem[0] { - case 'n': // Prefix: "nominator/" + case '/': // Prefix: "/" - if l := len("nominator/"); len(elem) >= l && elem[0:l] == "nominator/" { + if l := len("/"); len(elem) >= l && elem[0:l] == "/" { elem = elem[l:] } else { break @@ -3799,12 +3849,26 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { elem = elem[idx:] if len(elem) == 0 { - break + switch r.Method { + case "GET": + s.handleGetStakingPoolInfoRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: rn172AllowedHeaders, + acceptPost: "", + acceptPatch: "", + }) + } + + return } switch elem[0] { - case '/': // Prefix: "/pools" + case '/': // Prefix: "/history" - if l := len("/pools"); len(elem) >= l && elem[0:l] == "/pools" { + if l := len("/history"); len(elem) >= l && elem[0:l] == "/history" { elem = elem[l:] } else { break @@ -3814,7 +3878,7 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { // Leaf node. switch r.Method { case "GET": - s.handleGetAccountNominatorsPoolsRequest([1]string{ + s.handleGetStakingPoolHistoryRequest([1]string{ args[0], }, elemIsEscaped, w, r) default: @@ -3831,141 +3895,38 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { } - case 'p': // Prefix: "pool" + case 's': // Prefix: "s" - if l := len("pool"); len(elem) >= l && elem[0:l] == "pool" { + if l := len("s"); len(elem) >= l && elem[0:l] == "s" { elem = elem[l:] } else { break } if len(elem) == 0 { - break + // Leaf node. + switch r.Method { + case "GET": + s.handleGetStakingPoolsRequest([0]string{}, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: rn175AllowedHeaders, + acceptPost: "", + acceptPatch: "", + }) + } + + return } - switch elem[0] { - case '/': // Prefix: "/" - if l := len("/"); len(elem) >= l && elem[0:l] == "/" { - elem = elem[l:] - } else { - break - } - - // Param: "account_id" - // Match until "/" - idx := strings.IndexByte(elem, '/') - if idx < 0 { - idx = len(elem) - } - args[0] = elem[:idx] - elem = elem[idx:] - - if len(elem) == 0 { - switch r.Method { - case "GET": - s.handleGetStakingPoolInfoRequest([1]string{ - args[0], - }, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "GET", - allowedHeaders: rn173AllowedHeaders, - acceptPost: "", - acceptPatch: "", - }) - } - - return - } - switch elem[0] { - case '/': // Prefix: "/history" - - if l := len("/history"); len(elem) >= l && elem[0:l] == "/history" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "GET": - s.handleGetStakingPoolHistoryRequest([1]string{ - args[0], - }, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "GET", - allowedHeaders: nil, - acceptPost: "", - acceptPatch: "", - }) - } - - return - } - - } - - case 's': // Prefix: "s" - - if l := len("s"); len(elem) >= l && elem[0:l] == "s" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "GET": - s.handleGetStakingPoolsRequest([0]string{}, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "GET", - allowedHeaders: rn176AllowedHeaders, - acceptPost: "", - acceptPatch: "", - }) - } - - return - } - - } - - } - - case 't': // Prefix: "tus" - - if l := len("tus"); len(elem) >= l && elem[0:l] == "tus" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "GET": - s.handleStatusRequest([0]string{}, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "GET", - allowedHeaders: nil, - acceptPost: "", - acceptPatch: "", - }) - } - - return } } - case 'o': // Prefix: "orage/providers" + case 't': // Prefix: "tus" - if l := len("orage/providers"); len(elem) >= l && elem[0:l] == "orage/providers" { + if l := len("tus"); len(elem) >= l && elem[0:l] == "tus" { elem = elem[l:] } else { break @@ -3975,7 +3936,7 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { // Leaf node. switch r.Method { case "GET": - s.handleGetStorageProvidersRequest([0]string{}, elemIsEscaped, w, r) + s.handleStatusRequest([0]string{}, elemIsEscaped, w, r) default: s.notAllowed(w, r, notAllowedParams{ allowedMethods: "GET", @@ -3990,137 +3951,70 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { } - case 't': // Prefix: "t" + case 'o': // Prefix: "orage/providers" - if l := len("t"); len(elem) >= l && elem[0:l] == "t" { + if l := len("orage/providers"); len(elem) >= l && elem[0:l] == "orage/providers" { elem = elem[l:] } else { break } if len(elem) == 0 { - break - } - switch elem[0] { - case 'o': // Prefix: "onconnect/" - - if l := len("onconnect/"); len(elem) >= l && elem[0:l] == "onconnect/" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - break + // Leaf node. + switch r.Method { + case "GET": + s.handleGetStorageProvidersRequest([0]string{}, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: nil, + acceptPost: "", + acceptPatch: "", + }) } - switch elem[0] { - case 'p': // Prefix: "payload" - - if l := len("payload"); len(elem) >= l && elem[0:l] == "payload" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "GET": - s.handleGetTonConnectPayloadRequest([0]string{}, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "GET", - allowedHeaders: nil, - acceptPost: "", - acceptPatch: "", - }) - } - return - } + return + } - case 's': // Prefix: "stateinit" + } - if l := len("stateinit"); len(elem) >= l && elem[0:l] == "stateinit" { - elem = elem[l:] - } else { - break - } + case 't': // Prefix: "t" - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "POST": - s.handleGetAccountInfoByStateInitRequest([0]string{}, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "POST", - allowedHeaders: rn45AllowedHeaders, - acceptPost: "application/json", - acceptPatch: "", - }) - } + if l := len("t"); len(elem) >= l && elem[0:l] == "t" { + elem = elem[l:] + } else { + break + } - return - } + if len(elem) == 0 { + break + } + switch elem[0] { + case 'o': // Prefix: "onconnect/" - } + if l := len("onconnect/"); len(elem) >= l && elem[0:l] == "onconnect/" { + elem = elem[l:] + } else { + break + } - case 'r': // Prefix: "races/" + if len(elem) == 0 { + break + } + switch elem[0] { + case 'p': // Prefix: "payload" - if l := len("races/"); len(elem) >= l && elem[0:l] == "races/" { + if l := len("payload"); len(elem) >= l && elem[0:l] == "payload" { elem = elem[l:] } else { break } - if len(elem) == 0 { - break - } - switch elem[0] { - case 'e': // Prefix: "emulate" - origElem := elem - if l := len("emulate"); len(elem) >= l && elem[0:l] == "emulate" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "POST": - s.handleEmulateMessageToTraceRequest([0]string{}, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "POST", - allowedHeaders: rn23AllowedHeaders, - acceptPost: "application/json", - acceptPatch: "", - }) - } - - return - } - - elem = origElem - } - // Param: "trace_id" - // Leaf parameter, slashes are prohibited - idx := strings.IndexByte(elem, '/') - if idx >= 0 { - break - } - args[0] = elem - elem = "" - if len(elem) == 0 { // Leaf node. switch r.Method { case "GET": - s.handleGetTraceRequest([1]string{ - args[0], - }, elemIsEscaped, w, r) + s.handleGetTonConnectPayloadRequest([0]string{}, elemIsEscaped, w, r) default: s.notAllowed(w, r, notAllowedParams{ allowedMethods: "GET", @@ -4133,23 +4027,9 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { return } - } - - case 'w': // Prefix: "wallet/" - - if l := len("wallet/"); len(elem) >= l && elem[0:l] == "wallet/" { - elem = elem[l:] - } else { - break - } + case 's': // Prefix: "stateinit" - if len(elem) == 0 { - break - } - switch elem[0] { - case 'a': // Prefix: "auth/proof" - origElem := elem - if l := len("auth/proof"); len(elem) >= l && elem[0:l] == "auth/proof" { + if l := len("stateinit"); len(elem) >= l && elem[0:l] == "stateinit" { elem = elem[l:] } else { break @@ -4159,11 +4039,11 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { // Leaf node. switch r.Method { case "POST": - s.handleTonConnectProofRequest([0]string{}, elemIsEscaped, w, r) + s.handleGetAccountInfoByStateInitRequest([0]string{}, elemIsEscaped, w, r) default: s.notAllowed(w, r, notAllowedParams{ allowedMethods: "POST", - allowedHeaders: rn201AllowedHeaders, + allowedHeaders: rn45AllowedHeaders, acceptPost: "application/json", acceptPatch: "", }) @@ -4172,7 +4052,20 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { return } - elem = origElem + } + + case 'r': // Prefix: "races/" + + if l := len("races/"); len(elem) >= l && elem[0:l] == "races/" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + break + } + switch elem[0] { case 'e': // Prefix: "emulate" origElem := elem if l := len("emulate"); len(elem) >= l && elem[0:l] == "emulate" { @@ -4185,11 +4078,11 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { // Leaf node. switch r.Method { case "POST": - s.handleEmulateMessageToWalletRequest([0]string{}, elemIsEscaped, w, r) + s.handleEmulateMessageToTraceRequest([0]string{}, elemIsEscaped, w, r) default: s.notAllowed(w, r, notAllowedParams{ allowedMethods: "POST", - allowedHeaders: rn24AllowedHeaders, + allowedHeaders: rn23AllowedHeaders, acceptPost: "application/json", acceptPatch: "", }) @@ -4200,19 +4093,20 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { elem = origElem } - // Param: "account_id" - // Match until "/" + // Param: "trace_id" + // Leaf parameter, slashes are prohibited idx := strings.IndexByte(elem, '/') - if idx < 0 { - idx = len(elem) + if idx >= 0 { + break } - args[0] = elem[:idx] - elem = elem[idx:] + args[0] = elem + elem = "" if len(elem) == 0 { + // Leaf node. switch r.Method { case "GET": - s.handleGetWalletInfoRequest([1]string{ + s.handleGetTraceRequest([1]string{ args[0], }, elemIsEscaped, w, r) default: @@ -4226,34 +4120,126 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { return } - switch elem[0] { - case '/': // Prefix: "/seqno" - if l := len("/seqno"); len(elem) >= l && elem[0:l] == "/seqno" { - elem = elem[l:] - } else { - break - } + } - if len(elem) == 0 { - // Leaf node. - switch r.Method { - case "GET": - s.handleGetAccountSeqnoRequest([1]string{ - args[0], - }, elemIsEscaped, w, r) - default: - s.notAllowed(w, r, notAllowedParams{ - allowedMethods: "GET", - allowedHeaders: nil, - acceptPost: "", - acceptPatch: "", - }) - } + case 'w': // Prefix: "wallet/" - return + if l := len("wallet/"); len(elem) >= l && elem[0:l] == "wallet/" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + break + } + switch elem[0] { + case 'a': // Prefix: "auth/proof" + origElem := elem + if l := len("auth/proof"); len(elem) >= l && elem[0:l] == "auth/proof" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "POST": + s.handleTonConnectProofRequest([0]string{}, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "POST", + allowedHeaders: rn200AllowedHeaders, + acceptPost: "application/json", + acceptPatch: "", + }) + } + + return + } + + elem = origElem + case 'e': // Prefix: "emulate" + origElem := elem + if l := len("emulate"); len(elem) >= l && elem[0:l] == "emulate" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "POST": + s.handleEmulateMessageToWalletRequest([0]string{}, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "POST", + allowedHeaders: rn24AllowedHeaders, + acceptPost: "application/json", + acceptPatch: "", + }) + } + + return + } + + elem = origElem + } + // Param: "account_id" + // Match until "/" + idx := strings.IndexByte(elem, '/') + if idx < 0 { + idx = len(elem) + } + args[0] = elem[:idx] + elem = elem[idx:] + + if len(elem) == 0 { + switch r.Method { + case "GET": + s.handleGetWalletInfoRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: nil, + acceptPost: "", + acceptPatch: "", + }) + } + + return + } + switch elem[0] { + case '/': // Prefix: "/seqno" + + if l := len("/seqno"); len(elem) >= l && elem[0:l] == "/seqno" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch r.Method { + case "GET": + s.handleGetAccountSeqnoRequest([1]string{ + args[0], + }, elemIsEscaped, w, r) + default: + s.notAllowed(w, r, notAllowedParams{ + allowedMethods: "GET", + allowedHeaders: nil, + acceptPost: "", + acceptPatch: "", + }) } + return } } @@ -4346,9 +4332,9 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { break } switch elem[0] { - case '/': // Prefix: "/" + case '/': // Prefix: "/v2/" - if l := len("/"); len(elem) >= l && elem[0:l] == "/" { + if l := len("/v2/"); len(elem) >= l && elem[0:l] == "/v2/" { elem = elem[l:] } else { break @@ -4358,9 +4344,9 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { break } switch elem[0] { - case 'c': // Prefix: "cocoon/" + case 'a': // Prefix: "a" - if l := len("cocoon/"); len(elem) >= l && elem[0:l] == "cocoon/" { + if l := len("a"); len(elem) >= l && elem[0:l] == "a" { elem = elem[l:] } else { break @@ -4370,110 +4356,99 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { break } switch elem[0] { - case 'q': // Prefix: "query" + case 'c': // Prefix: "ccounts/" - if l := len("query"); len(elem) >= l && elem[0:l] == "query" { + if l := len("ccounts/"); len(elem) >= l && elem[0:l] == "ccounts/" { elem = elem[l:] } else { break } if len(elem) == 0 { - // Leaf node. - switch method { - case "POST": - r.name = PostCocoonQueryOperation - r.summary = "" - r.operationID = "postCocoonQuery" - r.operationGroup = "" - r.pathPattern = "/cocoon/query" - r.args = args - r.count = 0 - return r, true - default: - return - } - } - - case 'v': // Prefix: "v1/chat/completions" - - if l := len("v1/chat/completions"); len(elem) >= l && elem[0:l] == "v1/chat/completions" { - elem = elem[l:] - } else { break } + switch elem[0] { + case '_': // Prefix: "_bulk" + origElem := elem + if l := len("_bulk"); len(elem) >= l && elem[0:l] == "_bulk" { + elem = elem[l:] + } else { + break + } - if len(elem) == 0 { - // Leaf node. - switch method { - case "POST": - r.name = PostCocoonV1ChatCompletionsOperation - r.summary = "" - r.operationID = "postCocoonV1ChatCompletions" - r.operationGroup = "" - r.pathPattern = "/cocoon/v1/chat/completions" - r.args = args - r.count = 0 - return r, true - default: - return + if len(elem) == 0 { + // Leaf node. + switch method { + case "POST": + r.name = GetAccountsOperation + r.summary = "" + r.operationID = "getAccounts" + r.operationGroup = "" + r.pathPattern = "/v2/accounts/_bulk" + r.args = args + r.count = 0 + return r, true + default: + return + } } - } - case 'w': // Prefix: "workers" + elem = origElem + case 's': // Prefix: "search" + origElem := elem + if l := len("search"); len(elem) >= l && elem[0:l] == "search" { + elem = elem[l:] + } else { + break + } - if l := len("workers"); len(elem) >= l && elem[0:l] == "workers" { - elem = elem[l:] - } else { - break + if len(elem) == 0 { + // Leaf node. + switch method { + case "GET": + r.name = SearchAccountsOperation + r.summary = "" + r.operationID = "searchAccounts" + r.operationGroup = "" + r.pathPattern = "/v2/accounts/search" + r.args = args + r.count = 0 + return r, true + default: + return + } + } + + elem = origElem + } + // Param: "account_id" + // Match until "/" + idx := strings.IndexByte(elem, '/') + if idx < 0 { + idx = len(elem) } + args[0] = elem[:idx] + elem = elem[idx:] if len(elem) == 0 { - // Leaf node. switch method { case "GET": - r.name = GetCocoonWorkersOperation + r.name = GetAccountOperation r.summary = "" - r.operationID = "getCocoonWorkers" + r.operationID = "getAccount" r.operationGroup = "" - r.pathPattern = "/cocoon/workers" + r.pathPattern = "/v2/accounts/{account_id}" r.args = args - r.count = 0 + r.count = 1 return r, true default: return } } - - } - - case 'v': // Prefix: "v2/" - - if l := len("v2/"); len(elem) >= l && elem[0:l] == "v2/" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - break - } - switch elem[0] { - case 'a': // Prefix: "a" - - if l := len("a"); len(elem) >= l && elem[0:l] == "a" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - break - } switch elem[0] { - case 'c': // Prefix: "ccounts/" + case '/': // Prefix: "/" - if l := len("ccounts/"); len(elem) >= l && elem[0:l] == "ccounts/" { + if l := len("/"); len(elem) >= l && elem[0:l] == "/" { elem = elem[l:] } else { break @@ -4483,99 +4458,46 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { break } switch elem[0] { - case '_': // Prefix: "_bulk" - origElem := elem - if l := len("_bulk"); len(elem) >= l && elem[0:l] == "_bulk" { + case 'd': // Prefix: "d" + + if l := len("d"); len(elem) >= l && elem[0:l] == "d" { elem = elem[l:] } else { break } if len(elem) == 0 { - // Leaf node. - switch method { - case "POST": - r.name = GetAccountsOperation - r.summary = "" - r.operationID = "getAccounts" - r.operationGroup = "" - r.pathPattern = "/v2/accounts/_bulk" - r.args = args - r.count = 0 - return r, true - default: - return - } - } - - elem = origElem - case 's': // Prefix: "search" - origElem := elem - if l := len("search"); len(elem) >= l && elem[0:l] == "search" { - elem = elem[l:] - } else { break } + switch elem[0] { + case 'i': // Prefix: "iff" - if len(elem) == 0 { - // Leaf node. - switch method { - case "GET": - r.name = SearchAccountsOperation - r.summary = "" - r.operationID = "searchAccounts" - r.operationGroup = "" - r.pathPattern = "/v2/accounts/search" - r.args = args - r.count = 0 - return r, true - default: - return + if l := len("iff"); len(elem) >= l && elem[0:l] == "iff" { + elem = elem[l:] + } else { + break } - } - elem = origElem - } - // Param: "account_id" - // Match until "/" - idx := strings.IndexByte(elem, '/') - if idx < 0 { - idx = len(elem) - } - args[0] = elem[:idx] - elem = elem[idx:] - - if len(elem) == 0 { - switch method { - case "GET": - r.name = GetAccountOperation - r.summary = "" - r.operationID = "getAccount" - r.operationGroup = "" - r.pathPattern = "/v2/accounts/{account_id}" - r.args = args - r.count = 1 - return r, true - default: - return - } - } - switch elem[0] { - case '/': // Prefix: "/" - - if l := len("/"); len(elem) >= l && elem[0:l] == "/" { - elem = elem[l:] - } else { - break - } + if len(elem) == 0 { + // Leaf node. + switch method { + case "GET": + r.name = GetAccountDiffOperation + r.summary = "" + r.operationID = "getAccountDiff" + r.operationGroup = "" + r.pathPattern = "/v2/accounts/{account_id}/diff" + r.args = args + r.count = 1 + return r, true + default: + return + } + } - if len(elem) == 0 { - break - } - switch elem[0] { - case 'd': // Prefix: "d" + case 'n': // Prefix: "ns/" - if l := len("d"); len(elem) >= l && elem[0:l] == "d" { + if l := len("ns/"); len(elem) >= l && elem[0:l] == "ns/" { elem = elem[l:] } else { break @@ -4585,9 +4507,9 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { break } switch elem[0] { - case 'i': // Prefix: "iff" + case 'b': // Prefix: "backresolve" - if l := len("iff"); len(elem) >= l && elem[0:l] == "iff" { + if l := len("backresolve"); len(elem) >= l && elem[0:l] == "backresolve" { elem = elem[l:] } else { break @@ -4597,11 +4519,11 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { // Leaf node. switch method { case "GET": - r.name = GetAccountDiffOperation + r.name = AccountDnsBackResolveOperation r.summary = "" - r.operationID = "getAccountDiff" + r.operationID = "accountDnsBackResolve" r.operationGroup = "" - r.pathPattern = "/v2/accounts/{account_id}/diff" + r.pathPattern = "/v2/accounts/{account_id}/dns/backresolve" r.args = args r.count = 1 return r, true @@ -4610,100 +4532,23 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { } } - case 'n': // Prefix: "ns/" - - if l := len("ns/"); len(elem) >= l && elem[0:l] == "ns/" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - break - } - switch elem[0] { - case 'b': // Prefix: "backresolve" - - if l := len("backresolve"); len(elem) >= l && elem[0:l] == "backresolve" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - // Leaf node. - switch method { - case "GET": - r.name = AccountDnsBackResolveOperation - r.summary = "" - r.operationID = "accountDnsBackResolve" - r.operationGroup = "" - r.pathPattern = "/v2/accounts/{account_id}/dns/backresolve" - r.args = args - r.count = 1 - return r, true - default: - return - } - } - - case 'e': // Prefix: "expiring" - - if l := len("expiring"); len(elem) >= l && elem[0:l] == "expiring" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - // Leaf node. - switch method { - case "GET": - r.name = GetAccountDnsExpiringOperation - r.summary = "" - r.operationID = "getAccountDnsExpiring" - r.operationGroup = "" - r.pathPattern = "/v2/accounts/{account_id}/dns/expiring" - r.args = args - r.count = 1 - return r, true - default: - return - } - } - - } - - } - - case 'e': // Prefix: "e" - - if l := len("e"); len(elem) >= l && elem[0:l] == "e" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - break - } - switch elem[0] { - case 'v': // Prefix: "vents" + case 'e': // Prefix: "expiring" - if l := len("vents"); len(elem) >= l && elem[0:l] == "vents" { + if l := len("expiring"); len(elem) >= l && elem[0:l] == "expiring" { elem = elem[l:] } else { break } if len(elem) == 0 { + // Leaf node. switch method { case "GET": - r.name = GetAccountEventsOperation + r.name = GetAccountDnsExpiringOperation r.summary = "" - r.operationID = "getAccountEvents" + r.operationID = "getAccountDnsExpiring" r.operationGroup = "" - r.pathPattern = "/v2/accounts/{account_id}/events" + r.pathPattern = "/v2/accounts/{account_id}/dns/expiring" r.args = args r.count = 1 return r, true @@ -4711,127 +4556,26 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { return } } - switch elem[0] { - case '/': // Prefix: "/" - - if l := len("/"); len(elem) >= l && elem[0:l] == "/" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - break - } - switch elem[0] { - case 'e': // Prefix: "emulate" - origElem := elem - if l := len("emulate"); len(elem) >= l && elem[0:l] == "emulate" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - // Leaf node. - switch method { - case "POST": - r.name = EmulateMessageToAccountEventOperation - r.summary = "" - r.operationID = "emulateMessageToAccountEvent" - r.operationGroup = "" - r.pathPattern = "/v2/accounts/{account_id}/events/emulate" - r.args = args - r.count = 1 - return r, true - default: - return - } - } - - elem = origElem - } - // Param: "event_id" - // Leaf parameter, slashes are prohibited - idx := strings.IndexByte(elem, '/') - if idx >= 0 { - break - } - args[1] = elem - elem = "" - - if len(elem) == 0 { - // Leaf node. - switch method { - case "GET": - r.name = GetAccountEventOperation - r.summary = "" - r.operationID = "getAccountEvent" - r.operationGroup = "" - r.pathPattern = "/v2/accounts/{account_id}/events/{event_id}" - r.args = args - r.count = 2 - return r, true - default: - return - } - } - - } - - case 'x': // Prefix: "xtra-currency/" - - if l := len("xtra-currency/"); len(elem) >= l && elem[0:l] == "xtra-currency/" { - elem = elem[l:] - } else { - break - } - - // Param: "id" - // Match until "/" - idx := strings.IndexByte(elem, '/') - if idx < 0 { - idx = len(elem) - } - args[1] = elem[:idx] - elem = elem[idx:] - if len(elem) == 0 { - break - } - switch elem[0] { - case '/': // Prefix: "/history" - - if l := len("/history"); len(elem) >= l && elem[0:l] == "/history" { - elem = elem[l:] - } else { - break - } + } - if len(elem) == 0 { - // Leaf node. - switch method { - case "GET": - r.name = GetAccountExtraCurrencyHistoryByIDOperation - r.summary = "" - r.operationID = "getAccountExtraCurrencyHistoryByID" - r.operationGroup = "" - r.pathPattern = "/v2/accounts/{account_id}/extra-currency/{id}/history" - r.args = args - r.count = 2 - return r, true - default: - return - } - } + } - } + case 'e': // Prefix: "e" - } + if l := len("e"); len(elem) >= l && elem[0:l] == "e" { + elem = elem[l:] + } else { + break + } - case 'j': // Prefix: "jettons" + if len(elem) == 0 { + break + } + switch elem[0] { + case 'v': // Prefix: "vents" - if l := len("jettons"); len(elem) >= l && elem[0:l] == "jettons" { + if l := len("vents"); len(elem) >= l && elem[0:l] == "vents" { elem = elem[l:] } else { break @@ -4840,11 +4584,11 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { if len(elem) == 0 { switch method { case "GET": - r.name = GetAccountJettonsBalancesOperation + r.name = GetAccountEventsOperation r.summary = "" - r.operationID = "getAccountJettonsBalances" + r.operationID = "getAccountEvents" r.operationGroup = "" - r.pathPattern = "/v2/accounts/{account_id}/jettons" + r.pathPattern = "/v2/accounts/{account_id}/events" r.args = args r.count = 1 return r, true @@ -4865,9 +4609,9 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { break } switch elem[0] { - case 'h': // Prefix: "history" + case 'e': // Prefix: "emulate" origElem := elem - if l := len("history"); len(elem) >= l && elem[0:l] == "history" { + if l := len("emulate"); len(elem) >= l && elem[0:l] == "emulate" { elem = elem[l:] } else { break @@ -4876,12 +4620,12 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { if len(elem) == 0 { // Leaf node. switch method { - case "GET": - r.name = GetAccountJettonsHistoryOperation + case "POST": + r.name = EmulateMessageToAccountEventOperation r.summary = "" - r.operationID = "getAccountJettonsHistory" + r.operationID = "emulateMessageToAccountEvent" r.operationGroup = "" - r.pathPattern = "/v2/accounts/{account_id}/jettons/history" + r.pathPattern = "/v2/accounts/{account_id}/events/emulate" r.args = args r.count = 1 return r, true @@ -4892,23 +4636,24 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { elem = origElem } - // Param: "jetton_id" - // Match until "/" + // Param: "event_id" + // Leaf parameter, slashes are prohibited idx := strings.IndexByte(elem, '/') - if idx < 0 { - idx = len(elem) + if idx >= 0 { + break } - args[1] = elem[:idx] - elem = elem[idx:] + args[1] = elem + elem = "" if len(elem) == 0 { + // Leaf node. switch method { case "GET": - r.name = GetAccountJettonBalanceOperation + r.name = GetAccountEventOperation r.summary = "" - r.operationID = "getAccountJettonBalance" + r.operationID = "getAccountEvent" r.operationGroup = "" - r.pathPattern = "/v2/accounts/{account_id}/jettons/{jetton_id}" + r.pathPattern = "/v2/accounts/{account_id}/events/{event_id}" r.args = args r.count = 2 return r, true @@ -4916,83 +4661,28 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { return } } - switch elem[0] { - case '/': // Prefix: "/history" - - if l := len("/history"); len(elem) >= l && elem[0:l] == "/history" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - // Leaf node. - switch method { - case "GET": - r.name = GetAccountJettonHistoryByIDOperation - r.summary = "" - r.operationID = "getAccountJettonHistoryByID" - r.operationGroup = "" - r.pathPattern = "/v2/accounts/{account_id}/jettons/{jetton_id}/history" - r.args = args - r.count = 2 - return r, true - default: - return - } - } - - } } - case 'm': // Prefix: "multisigs" + case 'x': // Prefix: "xtra-currency/" - if l := len("multisigs"); len(elem) >= l && elem[0:l] == "multisigs" { + if l := len("xtra-currency/"); len(elem) >= l && elem[0:l] == "xtra-currency/" { elem = elem[l:] } else { break } - if len(elem) == 0 { - // Leaf node. - switch method { - case "GET": - r.name = GetAccountMultisigsOperation - r.summary = "" - r.operationID = "getAccountMultisigs" - r.operationGroup = "" - r.pathPattern = "/v2/accounts/{account_id}/multisigs" - r.args = args - r.count = 1 - return r, true - default: - return - } - } - - case 'n': // Prefix: "nfts" - - if l := len("nfts"); len(elem) >= l && elem[0:l] == "nfts" { - elem = elem[l:] - } else { - break + // Param: "id" + // Match until "/" + idx := strings.IndexByte(elem, '/') + if idx < 0 { + idx = len(elem) } + args[1] = elem[:idx] + elem = elem[idx:] if len(elem) == 0 { - switch method { - case "GET": - r.name = GetAccountNftItemsOperation - r.summary = "" - r.operationID = "getAccountNftItems" - r.operationGroup = "" - r.pathPattern = "/v2/accounts/{account_id}/nfts" - r.args = args - r.count = 1 - return r, true - default: - return - } + break } switch elem[0] { case '/': // Prefix: "/history" @@ -5007,13 +4697,13 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { // Leaf node. switch method { case "GET": - r.name = GetAccountNftHistoryOperation + r.name = GetAccountExtraCurrencyHistoryByIDOperation r.summary = "" - r.operationID = "getAccountNftHistory" + r.operationID = "getAccountExtraCurrencyHistoryByID" r.operationGroup = "" - r.pathPattern = "/v2/accounts/{account_id}/nfts/history" + r.pathPattern = "/v2/accounts/{account_id}/extra-currency/{id}/history" r.args = args - r.count = 1 + r.count = 2 return r, true default: return @@ -5022,84 +4712,177 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { } - case 'p': // Prefix: "publickey" + } - if l := len("publickey"); len(elem) >= l && elem[0:l] == "publickey" { - elem = elem[l:] - } else { - break - } + case 'j': // Prefix: "jettons" - if len(elem) == 0 { - // Leaf node. - switch method { - case "GET": - r.name = GetAccountPublicKeyOperation - r.summary = "" - r.operationID = "getAccountPublicKey" - r.operationGroup = "" - r.pathPattern = "/v2/accounts/{account_id}/publickey" - r.args = args - r.count = 1 - return r, true - default: - return - } - } + if l := len("jettons"); len(elem) >= l && elem[0:l] == "jettons" { + elem = elem[l:] + } else { + break + } - case 'r': // Prefix: "reindex" + if len(elem) == 0 { + switch method { + case "GET": + r.name = GetAccountJettonsBalancesOperation + r.summary = "" + r.operationID = "getAccountJettonsBalances" + r.operationGroup = "" + r.pathPattern = "/v2/accounts/{account_id}/jettons" + r.args = args + r.count = 1 + return r, true + default: + return + } + } + switch elem[0] { + case '/': // Prefix: "/" - if l := len("reindex"); len(elem) >= l && elem[0:l] == "reindex" { + if l := len("/"); len(elem) >= l && elem[0:l] == "/" { elem = elem[l:] } else { break } if len(elem) == 0 { - // Leaf node. - switch method { - case "POST": - r.name = ReindexAccountOperation - r.summary = "" - r.operationID = "reindexAccount" - r.operationGroup = "" - r.pathPattern = "/v2/accounts/{account_id}/reindex" - r.args = args - r.count = 1 - return r, true - default: - return - } + break } + switch elem[0] { + case 'h': // Prefix: "history" + origElem := elem + if l := len("history"); len(elem) >= l && elem[0:l] == "history" { + elem = elem[l:] + } else { + break + } - case 's': // Prefix: "subscriptions" + if len(elem) == 0 { + // Leaf node. + switch method { + case "GET": + r.name = GetAccountJettonsHistoryOperation + r.summary = "" + r.operationID = "getAccountJettonsHistory" + r.operationGroup = "" + r.pathPattern = "/v2/accounts/{account_id}/jettons/history" + r.args = args + r.count = 1 + return r, true + default: + return + } + } - if l := len("subscriptions"); len(elem) >= l && elem[0:l] == "subscriptions" { - elem = elem[l:] - } else { - break + elem = origElem + } + // Param: "jetton_id" + // Match until "/" + idx := strings.IndexByte(elem, '/') + if idx < 0 { + idx = len(elem) } + args[1] = elem[:idx] + elem = elem[idx:] if len(elem) == 0 { - // Leaf node. switch method { case "GET": - r.name = GetAccountSubscriptionsOperation + r.name = GetAccountJettonBalanceOperation r.summary = "" - r.operationID = "getAccountSubscriptions" + r.operationID = "getAccountJettonBalance" r.operationGroup = "" - r.pathPattern = "/v2/accounts/{account_id}/subscriptions" + r.pathPattern = "/v2/accounts/{account_id}/jettons/{jetton_id}" r.args = args - r.count = 1 + r.count = 2 return r, true default: return } } + switch elem[0] { + case '/': // Prefix: "/history" + + if l := len("/history"); len(elem) >= l && elem[0:l] == "/history" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch method { + case "GET": + r.name = GetAccountJettonHistoryByIDOperation + r.summary = "" + r.operationID = "getAccountJettonHistoryByID" + r.operationGroup = "" + r.pathPattern = "/v2/accounts/{account_id}/jettons/{jetton_id}/history" + r.args = args + r.count = 2 + return r, true + default: + return + } + } + + } + + } + + case 'm': // Prefix: "multisigs" + + if l := len("multisigs"); len(elem) >= l && elem[0:l] == "multisigs" { + elem = elem[l:] + } else { + break + } - case 't': // Prefix: "traces" + if len(elem) == 0 { + // Leaf node. + switch method { + case "GET": + r.name = GetAccountMultisigsOperation + r.summary = "" + r.operationID = "getAccountMultisigs" + r.operationGroup = "" + r.pathPattern = "/v2/accounts/{account_id}/multisigs" + r.args = args + r.count = 1 + return r, true + default: + return + } + } + + case 'n': // Prefix: "nfts" + + if l := len("nfts"); len(elem) >= l && elem[0:l] == "nfts" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + switch method { + case "GET": + r.name = GetAccountNftItemsOperation + r.summary = "" + r.operationID = "getAccountNftItems" + r.operationGroup = "" + r.pathPattern = "/v2/accounts/{account_id}/nfts" + r.args = args + r.count = 1 + return r, true + default: + return + } + } + switch elem[0] { + case '/': // Prefix: "/history" - if l := len("traces"); len(elem) >= l && elem[0:l] == "traces" { + if l := len("/history"); len(elem) >= l && elem[0:l] == "/history" { elem = elem[l:] } else { break @@ -5109,11 +4892,11 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { // Leaf node. switch method { case "GET": - r.name = GetAccountTracesOperation + r.name = GetAccountNftHistoryOperation r.summary = "" - r.operationID = "getAccountTraces" + r.operationID = "getAccountNftHistory" r.operationGroup = "" - r.pathPattern = "/v2/accounts/{account_id}/traces" + r.pathPattern = "/v2/accounts/{account_id}/nfts/history" r.args = args r.count = 1 return r, true @@ -5124,32 +4907,84 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { } - } + case 'p': // Prefix: "publickey" - case 'd': // Prefix: "ddress/" + if l := len("publickey"); len(elem) >= l && elem[0:l] == "publickey" { + elem = elem[l:] + } else { + break + } - if l := len("ddress/"); len(elem) >= l && elem[0:l] == "ddress/" { - elem = elem[l:] - } else { - break - } + if len(elem) == 0 { + // Leaf node. + switch method { + case "GET": + r.name = GetAccountPublicKeyOperation + r.summary = "" + r.operationID = "getAccountPublicKey" + r.operationGroup = "" + r.pathPattern = "/v2/accounts/{account_id}/publickey" + r.args = args + r.count = 1 + return r, true + default: + return + } + } - // Param: "account_id" - // Match until "/" - idx := strings.IndexByte(elem, '/') - if idx < 0 { - idx = len(elem) - } - args[0] = elem[:idx] - elem = elem[idx:] + case 'r': // Prefix: "reindex" - if len(elem) == 0 { - break - } - switch elem[0] { - case '/': // Prefix: "/parse" + if l := len("reindex"); len(elem) >= l && elem[0:l] == "reindex" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch method { + case "POST": + r.name = ReindexAccountOperation + r.summary = "" + r.operationID = "reindexAccount" + r.operationGroup = "" + r.pathPattern = "/v2/accounts/{account_id}/reindex" + r.args = args + r.count = 1 + return r, true + default: + return + } + } + + case 's': // Prefix: "subscriptions" + + if l := len("subscriptions"); len(elem) >= l && elem[0:l] == "subscriptions" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch method { + case "GET": + r.name = GetAccountSubscriptionsOperation + r.summary = "" + r.operationID = "getAccountSubscriptions" + r.operationGroup = "" + r.pathPattern = "/v2/accounts/{account_id}/subscriptions" + r.args = args + r.count = 1 + return r, true + default: + return + } + } + + case 't': // Prefix: "traces" - if l := len("/parse"); len(elem) >= l && elem[0:l] == "/parse" { + if l := len("traces"); len(elem) >= l && elem[0:l] == "traces" { elem = elem[l:] } else { break @@ -5159,11 +4994,11 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { // Leaf node. switch method { case "GET": - r.name = AddressParseOperation + r.name = GetAccountTracesOperation r.summary = "" - r.operationID = "addressParse" + r.operationID = "getAccountTraces" r.operationGroup = "" - r.pathPattern = "/v2/address/{account_id}/parse" + r.pathPattern = "/v2/accounts/{account_id}/traces" r.args = args r.count = 1 return r, true @@ -5176,43 +5011,44 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { } - case 'b': // Prefix: "blockchain/" + case 'd': // Prefix: "ddress/" - if l := len("blockchain/"); len(elem) >= l && elem[0:l] == "blockchain/" { + if l := len("ddress/"); len(elem) >= l && elem[0:l] == "ddress/" { elem = elem[l:] } else { break } + // Param: "account_id" + // Match until "/" + idx := strings.IndexByte(elem, '/') + if idx < 0 { + idx = len(elem) + } + args[0] = elem[:idx] + elem = elem[idx:] + if len(elem) == 0 { break } switch elem[0] { - case 'a': // Prefix: "accounts/" + case '/': // Prefix: "/parse" - if l := len("accounts/"); len(elem) >= l && elem[0:l] == "accounts/" { + if l := len("/parse"); len(elem) >= l && elem[0:l] == "/parse" { elem = elem[l:] } else { break } - // Param: "account_id" - // Match until "/" - idx := strings.IndexByte(elem, '/') - if idx < 0 { - idx = len(elem) - } - args[0] = elem[:idx] - elem = elem[idx:] - if len(elem) == 0 { + // Leaf node. switch method { case "GET": - r.name = GetBlockchainRawAccountOperation + r.name = AddressParseOperation r.summary = "" - r.operationID = "getBlockchainRawAccount" + r.operationID = "addressParse" r.operationGroup = "" - r.pathPattern = "/v2/blockchain/accounts/{account_id}" + r.pathPattern = "/v2/address/{account_id}/parse" r.args = args r.count = 1 return r, true @@ -5220,242 +5056,139 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { return } } - switch elem[0] { - case '/': // Prefix: "/" - - if l := len("/"); len(elem) >= l && elem[0:l] == "/" { - elem = elem[l:] - } else { - break - } - if len(elem) == 0 { - break - } - switch elem[0] { - case 'i': // Prefix: "inspect" + } - if l := len("inspect"); len(elem) >= l && elem[0:l] == "inspect" { - elem = elem[l:] - } else { - break - } + } - if len(elem) == 0 { - // Leaf node. - switch method { - case "GET": - r.name = BlockchainAccountInspectOperation - r.summary = "" - r.operationID = "blockchainAccountInspect" - r.operationGroup = "" - r.pathPattern = "/v2/blockchain/accounts/{account_id}/inspect" - r.args = args - r.count = 1 - return r, true - default: - return - } - } + case 'b': // Prefix: "blockchain/" - case 'm': // Prefix: "methods/" + if l := len("blockchain/"); len(elem) >= l && elem[0:l] == "blockchain/" { + elem = elem[l:] + } else { + break + } - if l := len("methods/"); len(elem) >= l && elem[0:l] == "methods/" { - elem = elem[l:] - } else { - break - } - - // Param: "method_name" - // Leaf parameter, slashes are prohibited - idx := strings.IndexByte(elem, '/') - if idx >= 0 { - break - } - args[1] = elem - elem = "" - - if len(elem) == 0 { - // Leaf node. - switch method { - case "GET": - r.name = ExecGetMethodForBlockchainAccountOperation - r.summary = "" - r.operationID = "execGetMethodForBlockchainAccount" - r.operationGroup = "" - r.pathPattern = "/v2/blockchain/accounts/{account_id}/methods/{method_name}" - r.args = args - r.count = 2 - return r, true - case "POST": - r.name = ExecGetMethodWithBodyForBlockchainAccountOperation - r.summary = "" - r.operationID = "execGetMethodWithBodyForBlockchainAccount" - r.operationGroup = "" - r.pathPattern = "/v2/blockchain/accounts/{account_id}/methods/{method_name}" - r.args = args - r.count = 2 - return r, true - default: - return - } - } - - case 't': // Prefix: "transactions" - - if l := len("transactions"); len(elem) >= l && elem[0:l] == "transactions" { - elem = elem[l:] - } else { - break - } + if len(elem) == 0 { + break + } + switch elem[0] { + case 'a': // Prefix: "accounts/" - if len(elem) == 0 { - // Leaf node. - switch method { - case "GET": - r.name = GetBlockchainAccountTransactionsOperation - r.summary = "" - r.operationID = "getBlockchainAccountTransactions" - r.operationGroup = "" - r.pathPattern = "/v2/blockchain/accounts/{account_id}/transactions" - r.args = args - r.count = 1 - return r, true - default: - return - } - } + if l := len("accounts/"); len(elem) >= l && elem[0:l] == "accounts/" { + elem = elem[l:] + } else { + break + } - } + // Param: "account_id" + // Match until "/" + idx := strings.IndexByte(elem, '/') + if idx < 0 { + idx = len(elem) + } + args[0] = elem[:idx] + elem = elem[idx:] + if len(elem) == 0 { + switch method { + case "GET": + r.name = GetBlockchainRawAccountOperation + r.summary = "" + r.operationID = "getBlockchainRawAccount" + r.operationGroup = "" + r.pathPattern = "/v2/blockchain/accounts/{account_id}" + r.args = args + r.count = 1 + return r, true + default: + return } + } + switch elem[0] { + case '/': // Prefix: "/" - case 'b': // Prefix: "blocks/" - - if l := len("blocks/"); len(elem) >= l && elem[0:l] == "blocks/" { + if l := len("/"); len(elem) >= l && elem[0:l] == "/" { elem = elem[l:] } else { break } - // Param: "block_id" - // Match until "/" - idx := strings.IndexByte(elem, '/') - if idx < 0 { - idx = len(elem) - } - args[0] = elem[:idx] - elem = elem[idx:] - if len(elem) == 0 { - switch method { - case "GET": - r.name = GetBlockchainBlockOperation - r.summary = "" - r.operationID = "getBlockchainBlock" - r.operationGroup = "" - r.pathPattern = "/v2/blockchain/blocks/{block_id}" - r.args = args - r.count = 1 - return r, true - default: - return - } + break } switch elem[0] { - case '/': // Prefix: "/" + case 'i': // Prefix: "inspect" - if l := len("/"); len(elem) >= l && elem[0:l] == "/" { + if l := len("inspect"); len(elem) >= l && elem[0:l] == "inspect" { elem = elem[l:] } else { break } if len(elem) == 0 { - break - } - switch elem[0] { - case 'b': // Prefix: "boc" - - if l := len("boc"); len(elem) >= l && elem[0:l] == "boc" { - elem = elem[l:] - } else { - break + // Leaf node. + switch method { + case "GET": + r.name = BlockchainAccountInspectOperation + r.summary = "" + r.operationID = "blockchainAccountInspect" + r.operationGroup = "" + r.pathPattern = "/v2/blockchain/accounts/{account_id}/inspect" + r.args = args + r.count = 1 + return r, true + default: + return } + } - if len(elem) == 0 { - // Leaf node. - switch method { - case "GET": - r.name = DownloadBlockchainBlockBocOperation - r.summary = "" - r.operationID = "downloadBlockchainBlockBoc" - r.operationGroup = "" - r.pathPattern = "/v2/blockchain/blocks/{block_id}/boc" - r.args = args - r.count = 1 - return r, true - default: - return - } - } + case 'm': // Prefix: "methods/" - case 't': // Prefix: "transactions" + if l := len("methods/"); len(elem) >= l && elem[0:l] == "methods/" { + elem = elem[l:] + } else { + break + } - if l := len("transactions"); len(elem) >= l && elem[0:l] == "transactions" { - elem = elem[l:] - } else { - break - } + // Param: "method_name" + // Leaf parameter, slashes are prohibited + idx := strings.IndexByte(elem, '/') + if idx >= 0 { + break + } + args[1] = elem + elem = "" - if len(elem) == 0 { - // Leaf node. - switch method { - case "GET": - r.name = GetBlockchainBlockTransactionsOperation - r.summary = "" - r.operationID = "getBlockchainBlockTransactions" - r.operationGroup = "" - r.pathPattern = "/v2/blockchain/blocks/{block_id}/transactions" - r.args = args - r.count = 1 - return r, true - default: - return - } + if len(elem) == 0 { + // Leaf node. + switch method { + case "GET": + r.name = ExecGetMethodForBlockchainAccountOperation + r.summary = "" + r.operationID = "execGetMethodForBlockchainAccount" + r.operationGroup = "" + r.pathPattern = "/v2/blockchain/accounts/{account_id}/methods/{method_name}" + r.args = args + r.count = 2 + return r, true + case "POST": + r.name = ExecGetMethodWithBodyForBlockchainAccountOperation + r.summary = "" + r.operationID = "execGetMethodWithBodyForBlockchainAccount" + r.operationGroup = "" + r.pathPattern = "/v2/blockchain/accounts/{account_id}/methods/{method_name}" + r.args = args + r.count = 2 + return r, true + default: + return } - } - } - - case 'c': // Prefix: "config" - - if l := len("config"); len(elem) >= l && elem[0:l] == "config" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - switch method { - case "GET": - r.name = GetBlockchainConfigOperation - r.summary = "" - r.operationID = "getBlockchainConfig" - r.operationGroup = "" - r.pathPattern = "/v2/blockchain/config" - r.args = args - r.count = 0 - return r, true - default: - return - } - } - switch elem[0] { - case '/': // Prefix: "/raw" + case 't': // Prefix: "transactions" - if l := len("/raw"); len(elem) >= l && elem[0:l] == "/raw" { + if l := len("transactions"); len(elem) >= l && elem[0:l] == "transactions" { elem = elem[l:] } else { break @@ -5465,13 +5198,13 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { // Leaf node. switch method { case "GET": - r.name = GetRawBlockchainConfigOperation + r.name = GetBlockchainAccountTransactionsOperation r.summary = "" - r.operationID = "getRawBlockchainConfig" + r.operationID = "getBlockchainAccountTransactions" r.operationGroup = "" - r.pathPattern = "/v2/blockchain/config/raw" + r.pathPattern = "/v2/blockchain/accounts/{account_id}/transactions" r.args = args - r.count = 0 + r.count = 1 return r, true default: return @@ -5480,43 +5213,44 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { } - case 'l': // Prefix: "libraries/" + } - if l := len("libraries/"); len(elem) >= l && elem[0:l] == "libraries/" { - elem = elem[l:] - } else { - break - } + case 'b': // Prefix: "blocks/" - // Param: "hash" - // Leaf parameter, slashes are prohibited - idx := strings.IndexByte(elem, '/') - if idx >= 0 { - break - } - args[0] = elem - elem = "" + if l := len("blocks/"); len(elem) >= l && elem[0:l] == "blocks/" { + elem = elem[l:] + } else { + break + } - if len(elem) == 0 { - // Leaf node. - switch method { - case "GET": - r.name = GetLibraryByHashOperation - r.summary = "" - r.operationID = "getLibraryByHash" - r.operationGroup = "" - r.pathPattern = "/v2/blockchain/libraries/{hash}" - r.args = args - r.count = 1 - return r, true - default: - return - } - } + // Param: "block_id" + // Match until "/" + idx := strings.IndexByte(elem, '/') + if idx < 0 { + idx = len(elem) + } + args[0] = elem[:idx] + elem = elem[idx:] - case 'm': // Prefix: "m" + if len(elem) == 0 { + switch method { + case "GET": + r.name = GetBlockchainBlockOperation + r.summary = "" + r.operationID = "getBlockchainBlock" + r.operationGroup = "" + r.pathPattern = "/v2/blockchain/blocks/{block_id}" + r.args = args + r.count = 1 + return r, true + default: + return + } + } + switch elem[0] { + case '/': // Prefix: "/" - if l := len("m"); len(elem) >= l && elem[0:l] == "m" { + if l := len("/"); len(elem) >= l && elem[0:l] == "/" { elem = elem[l:] } else { break @@ -5526,224 +5260,186 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { break } switch elem[0] { - case 'a': // Prefix: "asterchain" + case 'b': // Prefix: "boc" - if l := len("asterchain"); len(elem) >= l && elem[0:l] == "asterchain" { + if l := len("boc"); len(elem) >= l && elem[0:l] == "boc" { elem = elem[l:] } else { break } if len(elem) == 0 { - break - } - switch elem[0] { - case '-': // Prefix: "-head" - - if l := len("-head"); len(elem) >= l && elem[0:l] == "-head" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - // Leaf node. - switch method { - case "GET": - r.name = GetBlockchainMasterchainHeadOperation - r.summary = "" - r.operationID = "getBlockchainMasterchainHead" - r.operationGroup = "" - r.pathPattern = "/v2/blockchain/masterchain-head" - r.args = args - r.count = 0 - return r, true - default: - return - } + // Leaf node. + switch method { + case "GET": + r.name = DownloadBlockchainBlockBocOperation + r.summary = "" + r.operationID = "downloadBlockchainBlockBoc" + r.operationGroup = "" + r.pathPattern = "/v2/blockchain/blocks/{block_id}/boc" + r.args = args + r.count = 1 + return r, true + default: + return } + } - case '/': // Prefix: "/" - - if l := len("/"); len(elem) >= l && elem[0:l] == "/" { - elem = elem[l:] - } else { - break - } + case 't': // Prefix: "transactions" - // Param: "masterchain_seqno" - // Match until "/" - idx := strings.IndexByte(elem, '/') - if idx < 0 { - idx = len(elem) - } - args[0] = elem[:idx] - elem = elem[idx:] + if l := len("transactions"); len(elem) >= l && elem[0:l] == "transactions" { + elem = elem[l:] + } else { + break + } - if len(elem) == 0 { - break + if len(elem) == 0 { + // Leaf node. + switch method { + case "GET": + r.name = GetBlockchainBlockTransactionsOperation + r.summary = "" + r.operationID = "getBlockchainBlockTransactions" + r.operationGroup = "" + r.pathPattern = "/v2/blockchain/blocks/{block_id}/transactions" + r.args = args + r.count = 1 + return r, true + default: + return } - switch elem[0] { - case '/': // Prefix: "/" - - if l := len("/"); len(elem) >= l && elem[0:l] == "/" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - break - } - switch elem[0] { - case 'b': // Prefix: "blocks" - - if l := len("blocks"); len(elem) >= l && elem[0:l] == "blocks" { - elem = elem[l:] - } else { - break - } + } - if len(elem) == 0 { - // Leaf node. - switch method { - case "GET": - r.name = GetBlockchainMasterchainBlocksOperation - r.summary = "" - r.operationID = "getBlockchainMasterchainBlocks" - r.operationGroup = "" - r.pathPattern = "/v2/blockchain/masterchain/{masterchain_seqno}/blocks" - r.args = args - r.count = 1 - return r, true - default: - return - } - } + } - case 'c': // Prefix: "config" + } - if l := len("config"); len(elem) >= l && elem[0:l] == "config" { - elem = elem[l:] - } else { - break - } + case 'c': // Prefix: "config" - if len(elem) == 0 { - switch method { - case "GET": - r.name = GetBlockchainConfigFromBlockOperation - r.summary = "" - r.operationID = "getBlockchainConfigFromBlock" - r.operationGroup = "" - r.pathPattern = "/v2/blockchain/masterchain/{masterchain_seqno}/config" - r.args = args - r.count = 1 - return r, true - default: - return - } - } - switch elem[0] { - case '/': // Prefix: "/raw" + if l := len("config"); len(elem) >= l && elem[0:l] == "config" { + elem = elem[l:] + } else { + break + } - if l := len("/raw"); len(elem) >= l && elem[0:l] == "/raw" { - elem = elem[l:] - } else { - break - } + if len(elem) == 0 { + switch method { + case "GET": + r.name = GetBlockchainConfigOperation + r.summary = "" + r.operationID = "getBlockchainConfig" + r.operationGroup = "" + r.pathPattern = "/v2/blockchain/config" + r.args = args + r.count = 0 + return r, true + default: + return + } + } + switch elem[0] { + case '/': // Prefix: "/raw" - if len(elem) == 0 { - // Leaf node. - switch method { - case "GET": - r.name = GetRawBlockchainConfigFromBlockOperation - r.summary = "" - r.operationID = "getRawBlockchainConfigFromBlock" - r.operationGroup = "" - r.pathPattern = "/v2/blockchain/masterchain/{masterchain_seqno}/config/raw" - r.args = args - r.count = 1 - return r, true - default: - return - } - } + if l := len("/raw"); len(elem) >= l && elem[0:l] == "/raw" { + elem = elem[l:] + } else { + break + } - } + if len(elem) == 0 { + // Leaf node. + switch method { + case "GET": + r.name = GetRawBlockchainConfigOperation + r.summary = "" + r.operationID = "getRawBlockchainConfig" + r.operationGroup = "" + r.pathPattern = "/v2/blockchain/config/raw" + r.args = args + r.count = 0 + return r, true + default: + return + } + } - case 's': // Prefix: "shards" + } - if l := len("shards"); len(elem) >= l && elem[0:l] == "shards" { - elem = elem[l:] - } else { - break - } + case 'l': // Prefix: "libraries/" - if len(elem) == 0 { - // Leaf node. - switch method { - case "GET": - r.name = GetBlockchainMasterchainShardsOperation - r.summary = "" - r.operationID = "getBlockchainMasterchainShards" - r.operationGroup = "" - r.pathPattern = "/v2/blockchain/masterchain/{masterchain_seqno}/shards" - r.args = args - r.count = 1 - return r, true - default: - return - } - } + if l := len("libraries/"); len(elem) >= l && elem[0:l] == "libraries/" { + elem = elem[l:] + } else { + break + } - case 't': // Prefix: "transactions" + // Param: "hash" + // Leaf parameter, slashes are prohibited + idx := strings.IndexByte(elem, '/') + if idx >= 0 { + break + } + args[0] = elem + elem = "" - if l := len("transactions"); len(elem) >= l && elem[0:l] == "transactions" { - elem = elem[l:] - } else { - break - } + if len(elem) == 0 { + // Leaf node. + switch method { + case "GET": + r.name = GetLibraryByHashOperation + r.summary = "" + r.operationID = "getLibraryByHash" + r.operationGroup = "" + r.pathPattern = "/v2/blockchain/libraries/{hash}" + r.args = args + r.count = 1 + return r, true + default: + return + } + } - if len(elem) == 0 { - // Leaf node. - switch method { - case "GET": - r.name = GetBlockchainMasterchainTransactionsOperation - r.summary = "" - r.operationID = "getBlockchainMasterchainTransactions" - r.operationGroup = "" - r.pathPattern = "/v2/blockchain/masterchain/{masterchain_seqno}/transactions" - r.args = args - r.count = 1 - return r, true - default: - return - } - } + case 'm': // Prefix: "m" - } + if l := len("m"); len(elem) >= l && elem[0:l] == "m" { + elem = elem[l:] + } else { + break + } - } + if len(elem) == 0 { + break + } + switch elem[0] { + case 'a': // Prefix: "asterchain" - } + if l := len("asterchain"); len(elem) >= l && elem[0:l] == "asterchain" { + elem = elem[l:] + } else { + break + } - case 'e': // Prefix: "essage" + if len(elem) == 0 { + break + } + switch elem[0] { + case '-': // Prefix: "-head" - if l := len("essage"); len(elem) >= l && elem[0:l] == "essage" { + if l := len("-head"); len(elem) >= l && elem[0:l] == "-head" { elem = elem[l:] } else { break } if len(elem) == 0 { + // Leaf node. switch method { - case "POST": - r.name = SendBlockchainMessageOperation + case "GET": + r.name = GetBlockchainMasterchainHeadOperation r.summary = "" - r.operationID = "sendBlockchainMessage" + r.operationID = "getBlockchainMasterchainHead" r.operationGroup = "" - r.pathPattern = "/v2/blockchain/message" + r.pathPattern = "/v2/blockchain/masterchain-head" r.args = args r.count = 0 return r, true @@ -5751,31 +5447,43 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { return } } + + case '/': // Prefix: "/" + + if l := len("/"); len(elem) >= l && elem[0:l] == "/" { + elem = elem[l:] + } else { + break + } + + // Param: "masterchain_seqno" + // Match until "/" + idx := strings.IndexByte(elem, '/') + if idx < 0 { + idx = len(elem) + } + args[0] = elem[:idx] + elem = elem[idx:] + + if len(elem) == 0 { + break + } switch elem[0] { - case 's': // Prefix: "s/" + case '/': // Prefix: "/" - if l := len("s/"); len(elem) >= l && elem[0:l] == "s/" { + if l := len("/"); len(elem) >= l && elem[0:l] == "/" { elem = elem[l:] } else { break } - // Param: "msg_id" - // Match until "/" - idx := strings.IndexByte(elem, '/') - if idx < 0 { - idx = len(elem) - } - args[0] = elem[:idx] - elem = elem[idx:] - if len(elem) == 0 { break } switch elem[0] { - case '/': // Prefix: "/transaction" + case 'b': // Prefix: "blocks" - if l := len("/transaction"); len(elem) >= l && elem[0:l] == "/transaction" { + if l := len("blocks"); len(elem) >= l && elem[0:l] == "blocks" { elem = elem[l:] } else { break @@ -5785,11 +5493,11 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { // Leaf node. switch method { case "GET": - r.name = GetBlockchainTransactionByMessageHashOperation + r.name = GetBlockchainMasterchainBlocksOperation r.summary = "" - r.operationID = "getBlockchainTransactionByMessageHash" + r.operationID = "getBlockchainMasterchainBlocks" r.operationGroup = "" - r.pathPattern = "/v2/blockchain/messages/{msg_id}/transaction" + r.pathPattern = "/v2/blockchain/masterchain/{masterchain_seqno}/blocks" r.args = args r.count = 1 return r, true @@ -5798,29 +5506,129 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { } } - } - - } + case 'c': // Prefix: "config" + + if l := len("config"); len(elem) >= l && elem[0:l] == "config" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + switch method { + case "GET": + r.name = GetBlockchainConfigFromBlockOperation + r.summary = "" + r.operationID = "getBlockchainConfigFromBlock" + r.operationGroup = "" + r.pathPattern = "/v2/blockchain/masterchain/{masterchain_seqno}/config" + r.args = args + r.count = 1 + return r, true + default: + return + } + } + switch elem[0] { + case '/': // Prefix: "/raw" + + if l := len("/raw"); len(elem) >= l && elem[0:l] == "/raw" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch method { + case "GET": + r.name = GetRawBlockchainConfigFromBlockOperation + r.summary = "" + r.operationID = "getRawBlockchainConfigFromBlock" + r.operationGroup = "" + r.pathPattern = "/v2/blockchain/masterchain/{masterchain_seqno}/config/raw" + r.args = args + r.count = 1 + return r, true + default: + return + } + } + + } + + case 's': // Prefix: "shards" + + if l := len("shards"); len(elem) >= l && elem[0:l] == "shards" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch method { + case "GET": + r.name = GetBlockchainMasterchainShardsOperation + r.summary = "" + r.operationID = "getBlockchainMasterchainShards" + r.operationGroup = "" + r.pathPattern = "/v2/blockchain/masterchain/{masterchain_seqno}/shards" + r.args = args + r.count = 1 + return r, true + default: + return + } + } + + case 't': // Prefix: "transactions" + + if l := len("transactions"); len(elem) >= l && elem[0:l] == "transactions" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch method { + case "GET": + r.name = GetBlockchainMasterchainTransactionsOperation + r.summary = "" + r.operationID = "getBlockchainMasterchainTransactions" + r.operationGroup = "" + r.pathPattern = "/v2/blockchain/masterchain/{masterchain_seqno}/transactions" + r.args = args + r.count = 1 + return r, true + default: + return + } + } + + } + + } } - case 'r': // Prefix: "reduced/blocks" + case 'e': // Prefix: "essage" - if l := len("reduced/blocks"); len(elem) >= l && elem[0:l] == "reduced/blocks" { + if l := len("essage"); len(elem) >= l && elem[0:l] == "essage" { elem = elem[l:] } else { break } if len(elem) == 0 { - // Leaf node. switch method { - case "GET": - r.name = GetReducedBlockchainBlocksOperation + case "POST": + r.name = SendBlockchainMessageOperation r.summary = "" - r.operationID = "getReducedBlockchainBlocks" + r.operationID = "sendBlockchainMessage" r.operationGroup = "" - r.pathPattern = "/v2/blockchain/reduced/blocks" + r.pathPattern = "/v2/blockchain/message" r.args = args r.count = 0 return r, true @@ -5828,124 +5636,110 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { return } } + switch elem[0] { + case 's': // Prefix: "s/" - case 't': // Prefix: "transactions/" - - if l := len("transactions/"); len(elem) >= l && elem[0:l] == "transactions/" { - elem = elem[l:] - } else { - break - } + if l := len("s/"); len(elem) >= l && elem[0:l] == "s/" { + elem = elem[l:] + } else { + break + } - // Param: "transaction_id" - // Leaf parameter, slashes are prohibited - idx := strings.IndexByte(elem, '/') - if idx >= 0 { - break - } - args[0] = elem - elem = "" + // Param: "msg_id" + // Match until "/" + idx := strings.IndexByte(elem, '/') + if idx < 0 { + idx = len(elem) + } + args[0] = elem[:idx] + elem = elem[idx:] - if len(elem) == 0 { - // Leaf node. - switch method { - case "GET": - r.name = GetBlockchainTransactionOperation - r.summary = "" - r.operationID = "getBlockchainTransaction" - r.operationGroup = "" - r.pathPattern = "/v2/blockchain/transactions/{transaction_id}" - r.args = args - r.count = 1 - return r, true - default: - return + if len(elem) == 0 { + break } - } + switch elem[0] { + case '/': // Prefix: "/transaction" - case 'v': // Prefix: "validators" + if l := len("/transaction"); len(elem) >= l && elem[0:l] == "/transaction" { + elem = elem[l:] + } else { + break + } - if l := len("validators"); len(elem) >= l && elem[0:l] == "validators" { - elem = elem[l:] - } else { - break - } + if len(elem) == 0 { + // Leaf node. + switch method { + case "GET": + r.name = GetBlockchainTransactionByMessageHashOperation + r.summary = "" + r.operationID = "getBlockchainTransactionByMessageHash" + r.operationGroup = "" + r.pathPattern = "/v2/blockchain/messages/{msg_id}/transaction" + r.args = args + r.count = 1 + return r, true + default: + return + } + } - if len(elem) == 0 { - // Leaf node. - switch method { - case "GET": - r.name = GetBlockchainValidatorsOperation - r.summary = "" - r.operationID = "getBlockchainValidators" - r.operationGroup = "" - r.pathPattern = "/v2/blockchain/validators" - r.args = args - r.count = 0 - return r, true - default: - return } + } } - case 'd': // Prefix: "dns/" + case 'r': // Prefix: "reduced/blocks" - if l := len("dns/"); len(elem) >= l && elem[0:l] == "dns/" { + if l := len("reduced/blocks"); len(elem) >= l && elem[0:l] == "reduced/blocks" { elem = elem[l:] } else { break } if len(elem) == 0 { - break - } - switch elem[0] { - case 'a': // Prefix: "auctions" - origElem := elem - if l := len("auctions"); len(elem) >= l && elem[0:l] == "auctions" { - elem = elem[l:] - } else { - break + // Leaf node. + switch method { + case "GET": + r.name = GetReducedBlockchainBlocksOperation + r.summary = "" + r.operationID = "getReducedBlockchainBlocks" + r.operationGroup = "" + r.pathPattern = "/v2/blockchain/reduced/blocks" + r.args = args + r.count = 0 + return r, true + default: + return } + } - if len(elem) == 0 { - // Leaf node. - switch method { - case "GET": - r.name = GetAllAuctionsOperation - r.summary = "" - r.operationID = "getAllAuctions" - r.operationGroup = "" - r.pathPattern = "/v2/dns/auctions" - r.args = args - r.count = 0 - return r, true - default: - return - } - } + case 't': // Prefix: "transactions/" - elem = origElem + if l := len("transactions/"); len(elem) >= l && elem[0:l] == "transactions/" { + elem = elem[l:] + } else { + break } - // Param: "domain_name" - // Match until "/" + + // Param: "transaction_id" + // Leaf parameter, slashes are prohibited idx := strings.IndexByte(elem, '/') - if idx < 0 { - idx = len(elem) + if idx >= 0 { + break } - args[0] = elem[:idx] - elem = elem[idx:] + args[0] = elem + elem = "" if len(elem) == 0 { + // Leaf node. switch method { case "GET": - r.name = GetDnsInfoOperation + r.name = GetBlockchainTransactionOperation r.summary = "" - r.operationID = "getDnsInfo" + r.operationID = "getBlockchainTransaction" r.operationGroup = "" - r.pathPattern = "/v2/dns/{domain_name}" + r.pathPattern = "/v2/blockchain/transactions/{transaction_id}" r.args = args r.count = 1 return r, true @@ -5953,76 +5747,190 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { return } } - switch elem[0] { - case '/': // Prefix: "/" - if l := len("/"); len(elem) >= l && elem[0:l] == "/" { - elem = elem[l:] - } else { - break + case 'v': // Prefix: "validators" + + if l := len("validators"); len(elem) >= l && elem[0:l] == "validators" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch method { + case "GET": + r.name = GetBlockchainValidatorsOperation + r.summary = "" + r.operationID = "getBlockchainValidators" + r.operationGroup = "" + r.pathPattern = "/v2/blockchain/validators" + r.args = args + r.count = 0 + return r, true + default: + return } + } - if len(elem) == 0 { - break + } + + case 'c': // Prefix: "cocoon/" + + if l := len("cocoon/"); len(elem) >= l && elem[0:l] == "cocoon/" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + break + } + switch elem[0] { + case 'q': // Prefix: "query" + + if l := len("query"); len(elem) >= l && elem[0:l] == "query" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch method { + case "POST": + r.name = PostCocoonQueryOperation + r.summary = "" + r.operationID = "postCocoonQuery" + r.operationGroup = "" + r.pathPattern = "/v2/cocoon/query" + r.args = args + r.count = 0 + return r, true + default: + return } - switch elem[0] { - case 'b': // Prefix: "bids" + } - if l := len("bids"); len(elem) >= l && elem[0:l] == "bids" { - elem = elem[l:] - } else { - break - } + case 'v': // Prefix: "v1/chat/completions" - if len(elem) == 0 { - // Leaf node. - switch method { - case "GET": - r.name = GetDomainBidsOperation - r.summary = "" - r.operationID = "getDomainBids" - r.operationGroup = "" - r.pathPattern = "/v2/dns/{domain_name}/bids" - r.args = args - r.count = 1 - return r, true - default: - return - } - } + if l := len("v1/chat/completions"); len(elem) >= l && elem[0:l] == "v1/chat/completions" { + elem = elem[l:] + } else { + break + } - case 'r': // Prefix: "resolve" + if len(elem) == 0 { + // Leaf node. + switch method { + case "POST": + r.name = PostCocoonV1ChatCompletionsOperation + r.summary = "" + r.operationID = "postCocoonV1ChatCompletions" + r.operationGroup = "" + r.pathPattern = "/v2/cocoon/v1/chat/completions" + r.args = args + r.count = 0 + return r, true + default: + return + } + } - if l := len("resolve"); len(elem) >= l && elem[0:l] == "resolve" { - elem = elem[l:] - } else { - break - } + case 'w': // Prefix: "workers" - if len(elem) == 0 { - // Leaf node. - switch method { - case "GET": - r.name = DnsResolveOperation - r.summary = "" - r.operationID = "dnsResolve" - r.operationGroup = "" - r.pathPattern = "/v2/dns/{domain_name}/resolve" - r.args = args - r.count = 1 - return r, true - default: - return - } - } + if l := len("workers"); len(elem) >= l && elem[0:l] == "workers" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch method { + case "GET": + r.name = GetCocoonWorkersOperation + r.summary = "" + r.operationID = "getCocoonWorkers" + r.operationGroup = "" + r.pathPattern = "/v2/cocoon/workers" + r.args = args + r.count = 0 + return r, true + default: + return + } + } + + } + + case 'd': // Prefix: "dns/" + + if l := len("dns/"); len(elem) >= l && elem[0:l] == "dns/" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + break + } + switch elem[0] { + case 'a': // Prefix: "auctions" + origElem := elem + if l := len("auctions"); len(elem) >= l && elem[0:l] == "auctions" { + elem = elem[l:] + } else { + break + } + if len(elem) == 0 { + // Leaf node. + switch method { + case "GET": + r.name = GetAllAuctionsOperation + r.summary = "" + r.operationID = "getAllAuctions" + r.operationGroup = "" + r.pathPattern = "/v2/dns/auctions" + r.args = args + r.count = 0 + return r, true + default: + return } - } - case 'e': // Prefix: "e" + elem = origElem + } + // Param: "domain_name" + // Match until "/" + idx := strings.IndexByte(elem, '/') + if idx < 0 { + idx = len(elem) + } + args[0] = elem[:idx] + elem = elem[idx:] + + if len(elem) == 0 { + switch method { + case "GET": + r.name = GetDnsInfoOperation + r.summary = "" + r.operationID = "getDnsInfo" + r.operationGroup = "" + r.pathPattern = "/v2/dns/{domain_name}" + r.args = args + r.count = 1 + return r, true + default: + return + } + } + switch elem[0] { + case '/': // Prefix: "/" - if l := len("e"); len(elem) >= l && elem[0:l] == "e" { + if l := len("/"); len(elem) >= l && elem[0:l] == "/" { elem = elem[l:] } else { break @@ -6032,62 +5940,23 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { break } switch elem[0] { - case 'v': // Prefix: "vents/" + case 'b': // Prefix: "bids" - if l := len("vents/"); len(elem) >= l && elem[0:l] == "vents/" { + if l := len("bids"); len(elem) >= l && elem[0:l] == "bids" { elem = elem[l:] } else { break } if len(elem) == 0 { - break - } - switch elem[0] { - case 'e': // Prefix: "emulate" - origElem := elem - if l := len("emulate"); len(elem) >= l && elem[0:l] == "emulate" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - // Leaf node. - switch method { - case "POST": - r.name = EmulateMessageToEventOperation - r.summary = "" - r.operationID = "emulateMessageToEvent" - r.operationGroup = "" - r.pathPattern = "/v2/events/emulate" - r.args = args - r.count = 0 - return r, true - default: - return - } - } - - elem = origElem - } - // Param: "event_id" - // Match until "/" - idx := strings.IndexByte(elem, '/') - if idx < 0 { - idx = len(elem) - } - args[0] = elem[:idx] - elem = elem[idx:] - - if len(elem) == 0 { + // Leaf node. switch method { case "GET": - r.name = GetEventOperation + r.name = GetDomainBidsOperation r.summary = "" - r.operationID = "getEvent" + r.operationID = "getDomainBids" r.operationGroup = "" - r.pathPattern = "/v2/events/{event_id}" + r.pathPattern = "/v2/dns/{domain_name}/bids" r.args = args r.count = 1 return r, true @@ -6095,60 +5964,24 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { return } } - switch elem[0] { - case '/': // Prefix: "/jettons" - - if l := len("/jettons"); len(elem) >= l && elem[0:l] == "/jettons" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - // Leaf node. - switch method { - case "GET": - r.name = GetJettonsEventsOperation - r.summary = "" - r.operationID = "getJettonsEvents" - r.operationGroup = "" - r.pathPattern = "/v2/events/{event_id}/jettons" - r.args = args - r.count = 1 - return r, true - default: - return - } - } - - } - case 'x': // Prefix: "xtra-currency/" + case 'r': // Prefix: "resolve" - if l := len("xtra-currency/"); len(elem) >= l && elem[0:l] == "xtra-currency/" { + if l := len("resolve"); len(elem) >= l && elem[0:l] == "resolve" { elem = elem[l:] } else { break } - // Param: "id" - // Leaf parameter, slashes are prohibited - idx := strings.IndexByte(elem, '/') - if idx >= 0 { - break - } - args[0] = elem - elem = "" - if len(elem) == 0 { // Leaf node. switch method { case "GET": - r.name = GetExtraCurrencyInfoOperation + r.name = DnsResolveOperation r.summary = "" - r.operationID = "getExtraCurrencyInfo" + r.operationID = "dnsResolve" r.operationGroup = "" - r.pathPattern = "/v2/extra-currency/{id}" + r.pathPattern = "/v2/dns/{domain_name}/resolve" r.args = args r.count = 1 return r, true @@ -6159,9 +5992,23 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { } - case 'g': // Prefix: "gasless/" + } + + case 'e': // Prefix: "e" + + if l := len("e"); len(elem) >= l && elem[0:l] == "e" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + break + } + switch elem[0] { + case 'v': // Prefix: "vents/" - if l := len("gasless/"); len(elem) >= l && elem[0:l] == "gasless/" { + if l := len("vents/"); len(elem) >= l && elem[0:l] == "vents/" { elem = elem[l:] } else { break @@ -6171,9 +6018,9 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { break } switch elem[0] { - case 'c': // Prefix: "config" - - if l := len("config"); len(elem) >= l && elem[0:l] == "config" { + case 'e': // Prefix: "emulate" + origElem := elem + if l := len("emulate"); len(elem) >= l && elem[0:l] == "emulate" { elem = elem[l:] } else { break @@ -6182,12 +6029,12 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { if len(elem) == 0 { // Leaf node. switch method { - case "GET": - r.name = GaslessConfigOperation + case "POST": + r.name = EmulateMessageToEventOperation r.summary = "" - r.operationID = "gaslessConfig" + r.operationID = "emulateMessageToEvent" r.operationGroup = "" - r.pathPattern = "/v2/gasless/config" + r.pathPattern = "/v2/events/emulate" r.args = args r.count = 0 return r, true @@ -6196,32 +6043,50 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { } } - case 'e': // Prefix: "estimate/" + elem = origElem + } + // Param: "event_id" + // Match until "/" + idx := strings.IndexByte(elem, '/') + if idx < 0 { + idx = len(elem) + } + args[0] = elem[:idx] + elem = elem[idx:] - if l := len("estimate/"); len(elem) >= l && elem[0:l] == "estimate/" { - elem = elem[l:] - } else { - break + if len(elem) == 0 { + switch method { + case "GET": + r.name = GetEventOperation + r.summary = "" + r.operationID = "getEvent" + r.operationGroup = "" + r.pathPattern = "/v2/events/{event_id}" + r.args = args + r.count = 1 + return r, true + default: + return } + } + switch elem[0] { + case '/': // Prefix: "/jettons" - // Param: "master_id" - // Leaf parameter, slashes are prohibited - idx := strings.IndexByte(elem, '/') - if idx >= 0 { + if l := len("/jettons"); len(elem) >= l && elem[0:l] == "/jettons" { + elem = elem[l:] + } else { break } - args[0] = elem - elem = "" if len(elem) == 0 { // Leaf node. switch method { - case "POST": - r.name = GaslessEstimateOperation + case "GET": + r.name = GetJettonsEventsOperation r.summary = "" - r.operationID = "gaslessEstimate" + r.operationID = "getJettonsEvents" r.operationGroup = "" - r.pathPattern = "/v2/gasless/estimate/{master_id}" + r.pathPattern = "/v2/events/{event_id}/jettons" r.args = args r.count = 1 return r, true @@ -6230,9 +6095,181 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { } } - case 's': // Prefix: "send" + } + + case 'x': // Prefix: "xtra-currency/" + + if l := len("xtra-currency/"); len(elem) >= l && elem[0:l] == "xtra-currency/" { + elem = elem[l:] + } else { + break + } + + // Param: "id" + // Leaf parameter, slashes are prohibited + idx := strings.IndexByte(elem, '/') + if idx >= 0 { + break + } + args[0] = elem + elem = "" + + if len(elem) == 0 { + // Leaf node. + switch method { + case "GET": + r.name = GetExtraCurrencyInfoOperation + r.summary = "" + r.operationID = "getExtraCurrencyInfo" + r.operationGroup = "" + r.pathPattern = "/v2/extra-currency/{id}" + r.args = args + r.count = 1 + return r, true + default: + return + } + } + + } + + case 'g': // Prefix: "gasless/" + + if l := len("gasless/"); len(elem) >= l && elem[0:l] == "gasless/" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + break + } + switch elem[0] { + case 'c': // Prefix: "config" + + if l := len("config"); len(elem) >= l && elem[0:l] == "config" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch method { + case "GET": + r.name = GaslessConfigOperation + r.summary = "" + r.operationID = "gaslessConfig" + r.operationGroup = "" + r.pathPattern = "/v2/gasless/config" + r.args = args + r.count = 0 + return r, true + default: + return + } + } + + case 'e': // Prefix: "estimate/" + + if l := len("estimate/"); len(elem) >= l && elem[0:l] == "estimate/" { + elem = elem[l:] + } else { + break + } + + // Param: "master_id" + // Leaf parameter, slashes are prohibited + idx := strings.IndexByte(elem, '/') + if idx >= 0 { + break + } + args[0] = elem + elem = "" + + if len(elem) == 0 { + // Leaf node. + switch method { + case "POST": + r.name = GaslessEstimateOperation + r.summary = "" + r.operationID = "gaslessEstimate" + r.operationGroup = "" + r.pathPattern = "/v2/gasless/estimate/{master_id}" + r.args = args + r.count = 1 + return r, true + default: + return + } + } + + case 's': // Prefix: "send" + + if l := len("send"); len(elem) >= l && elem[0:l] == "send" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch method { + case "POST": + r.name = GaslessSendOperation + r.summary = "" + r.operationID = "gaslessSend" + r.operationGroup = "" + r.pathPattern = "/v2/gasless/send" + r.args = args + r.count = 0 + return r, true + default: + return + } + } + + } + + case 'j': // Prefix: "jettons" + + if l := len("jettons"); len(elem) >= l && elem[0:l] == "jettons" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + switch method { + case "GET": + r.name = GetJettonsOperation + r.summary = "" + r.operationID = "getJettons" + r.operationGroup = "" + r.pathPattern = "/v2/jettons" + r.args = args + r.count = 0 + return r, true + default: + return + } + } + switch elem[0] { + case '/': // Prefix: "/" + + if l := len("/"); len(elem) >= l && elem[0:l] == "/" { + elem = elem[l:] + } else { + break + } - if l := len("send"); len(elem) >= l && elem[0:l] == "send" { + if len(elem) == 0 { + break + } + switch elem[0] { + case '_': // Prefix: "_bulk" + origElem := elem + if l := len("_bulk"); len(elem) >= l && elem[0:l] == "_bulk" { elem = elem[l:] } else { break @@ -6242,11 +6279,11 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { // Leaf node. switch method { case "POST": - r.name = GaslessSendOperation + r.name = GetJettonInfosByAddressesOperation r.summary = "" - r.operationID = "gaslessSend" + r.operationID = "getJettonInfosByAddresses" r.operationGroup = "" - r.pathPattern = "/v2/gasless/send" + r.pathPattern = "/v2/jettons/_bulk" r.args = args r.count = 0 return r, true @@ -6255,26 +6292,27 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { } } + elem = origElem } - - case 'j': // Prefix: "jettons" - - if l := len("jettons"); len(elem) >= l && elem[0:l] == "jettons" { - elem = elem[l:] - } else { - break + // Param: "jetton_id" + // Match until "/" + idx := strings.IndexByte(elem, '/') + if idx < 0 { + idx = len(elem) } + args[0] = elem[:idx] + elem = elem[idx:] if len(elem) == 0 { switch method { case "GET": - r.name = GetJettonsOperation + r.name = GetJettonInfoOperation r.summary = "" - r.operationID = "getJettons" + r.operationID = "getJettonInfo" r.operationGroup = "" - r.pathPattern = "/v2/jettons" + r.pathPattern = "/v2/jettons/{account_id}" r.args = args - r.count = 0 + r.count = 1 return r, true default: return @@ -6293,427 +6331,206 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { break } switch elem[0] { - case '_': // Prefix: "_bulk" - origElem := elem - if l := len("_bulk"); len(elem) >= l && elem[0:l] == "_bulk" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - // Leaf node. - switch method { - case "POST": - r.name = GetJettonInfosByAddressesOperation - r.summary = "" - r.operationID = "getJettonInfosByAddresses" - r.operationGroup = "" - r.pathPattern = "/v2/jettons/_bulk" - r.args = args - r.count = 0 - return r, true - default: - return - } - } - - elem = origElem - } - // Param: "jetton_id" - // Match until "/" - idx := strings.IndexByte(elem, '/') - if idx < 0 { - idx = len(elem) - } - args[0] = elem[:idx] - elem = elem[idx:] - - if len(elem) == 0 { - switch method { - case "GET": - r.name = GetJettonInfoOperation - r.summary = "" - r.operationID = "getJettonInfo" - r.operationGroup = "" - r.pathPattern = "/v2/jettons/{account_id}" - r.args = args - r.count = 1 - return r, true - default: - return - } - } - switch elem[0] { - case '/': // Prefix: "/" + case 'a': // Prefix: "accounts/" - if l := len("/"); len(elem) >= l && elem[0:l] == "/" { + if l := len("accounts/"); len(elem) >= l && elem[0:l] == "accounts/" { elem = elem[l:] } else { break } - if len(elem) == 0 { - break - } - switch elem[0] { - case 'a': // Prefix: "accounts/" - - if l := len("accounts/"); len(elem) >= l && elem[0:l] == "accounts/" { - elem = elem[l:] - } else { - break - } - - // Param: "account_id" - // Match until "/" - idx := strings.IndexByte(elem, '/') - if idx < 0 { - idx = len(elem) - } - args[1] = elem[:idx] - elem = elem[idx:] - - if len(elem) == 0 { - break - } - switch elem[0] { - case '/': // Prefix: "/history" - - if l := len("/history"); len(elem) >= l && elem[0:l] == "/history" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - // Leaf node. - switch method { - case "GET": - r.name = GetJettonAccountHistoryByIDOperation - r.summary = "" - r.operationID = "getJettonAccountHistoryByID" - r.operationGroup = "" - r.pathPattern = "/v2/jettons/{jetton_id}/accounts/{account_id}/history" - r.args = args - r.count = 2 - return r, true - default: - return - } - } - - } - - case 'h': // Prefix: "holders" - - if l := len("holders"); len(elem) >= l && elem[0:l] == "holders" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - // Leaf node. - switch method { - case "GET": - r.name = GetJettonHoldersOperation - r.summary = "" - r.operationID = "getJettonHolders" - r.operationGroup = "" - r.pathPattern = "/v2/jettons/{account_id}/holders" - r.args = args - r.count = 1 - return r, true - default: - return - } - } - - case 't': // Prefix: "transfer/" - - if l := len("transfer/"); len(elem) >= l && elem[0:l] == "transfer/" { - elem = elem[l:] - } else { - break - } - - // Param: "account_id" - // Match until "/" - idx := strings.IndexByte(elem, '/') - if idx < 0 { - idx = len(elem) - } - args[1] = elem[:idx] - elem = elem[idx:] - - if len(elem) == 0 { - break - } - switch elem[0] { - case '/': // Prefix: "/payload" - - if l := len("/payload"); len(elem) >= l && elem[0:l] == "/payload" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - // Leaf node. - switch method { - case "GET": - r.name = GetJettonTransferPayloadOperation - r.summary = "" - r.operationID = "getJettonTransferPayload" - r.operationGroup = "" - r.pathPattern = "/v2/jettons/{jetton_id}/transfer/{account_id}/payload" - r.args = args - r.count = 2 - return r, true - default: - return - } - } - - } - - } - - } - - } - - case 'l': // Prefix: "liteserver/" - - if l := len("liteserver/"); len(elem) >= l && elem[0:l] == "liteserver/" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - break - } - switch elem[0] { - case 'g': // Prefix: "get_" - - if l := len("get_"); len(elem) >= l && elem[0:l] == "get_" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - break - } - switch elem[0] { - case 'a': // Prefix: "a" - - if l := len("a"); len(elem) >= l && elem[0:l] == "a" { - elem = elem[l:] - } else { - break + // Param: "account_id" + // Match until "/" + idx := strings.IndexByte(elem, '/') + if idx < 0 { + idx = len(elem) } + args[1] = elem[:idx] + elem = elem[idx:] if len(elem) == 0 { break } switch elem[0] { - case 'c': // Prefix: "ccount_state/" + case '/': // Prefix: "/history" - if l := len("ccount_state/"); len(elem) >= l && elem[0:l] == "ccount_state/" { + if l := len("/history"); len(elem) >= l && elem[0:l] == "/history" { elem = elem[l:] } else { break } - // Param: "account_id" - // Leaf parameter, slashes are prohibited - idx := strings.IndexByte(elem, '/') - if idx >= 0 { - break - } - args[0] = elem - elem = "" - if len(elem) == 0 { // Leaf node. switch method { case "GET": - r.name = GetRawAccountStateOperation + r.name = GetJettonAccountHistoryByIDOperation r.summary = "" - r.operationID = "getRawAccountState" + r.operationID = "getJettonAccountHistoryByID" r.operationGroup = "" - r.pathPattern = "/v2/liteserver/get_account_state/{account_id}" + r.pathPattern = "/v2/jettons/{jetton_id}/accounts/{account_id}/history" r.args = args - r.count = 1 + r.count = 2 return r, true default: return } } - case 'l': // Prefix: "ll_shards_info/" - - if l := len("ll_shards_info/"); len(elem) >= l && elem[0:l] == "ll_shards_info/" { - elem = elem[l:] - } else { - break - } + } - // Param: "block_id" - // Leaf parameter, slashes are prohibited - idx := strings.IndexByte(elem, '/') - if idx >= 0 { - break - } - args[0] = elem - elem = "" + case 'h': // Prefix: "holders" - if len(elem) == 0 { - // Leaf node. - switch method { - case "GET": - r.name = GetAllRawShardsInfoOperation - r.summary = "" - r.operationID = "getAllRawShardsInfo" - r.operationGroup = "" - r.pathPattern = "/v2/liteserver/get_all_shards_info/{block_id}" - r.args = args - r.count = 1 - return r, true - default: - return - } - } + if l := len("holders"); len(elem) >= l && elem[0:l] == "holders" { + elem = elem[l:] + } else { + break + } + if len(elem) == 0 { + // Leaf node. + switch method { + case "GET": + r.name = GetJettonHoldersOperation + r.summary = "" + r.operationID = "getJettonHolders" + r.operationGroup = "" + r.pathPattern = "/v2/jettons/{account_id}/holders" + r.args = args + r.count = 1 + return r, true + default: + return + } } - case 'b': // Prefix: "block" + case 't': // Prefix: "transfer/" - if l := len("block"); len(elem) >= l && elem[0:l] == "block" { + if l := len("transfer/"); len(elem) >= l && elem[0:l] == "transfer/" { elem = elem[l:] } else { break } + // Param: "account_id" + // Match until "/" + idx := strings.IndexByte(elem, '/') + if idx < 0 { + idx = len(elem) + } + args[1] = elem[:idx] + elem = elem[idx:] + if len(elem) == 0 { break } switch elem[0] { - case '/': // Prefix: "/" + case '/': // Prefix: "/payload" - if l := len("/"); len(elem) >= l && elem[0:l] == "/" { + if l := len("/payload"); len(elem) >= l && elem[0:l] == "/payload" { elem = elem[l:] } else { break } - // Param: "block_id" - // Leaf parameter, slashes are prohibited - idx := strings.IndexByte(elem, '/') - if idx >= 0 { - break - } - args[0] = elem - elem = "" - if len(elem) == 0 { // Leaf node. switch method { case "GET": - r.name = GetRawBlockchainBlockOperation + r.name = GetJettonTransferPayloadOperation r.summary = "" - r.operationID = "getRawBlockchainBlock" + r.operationID = "getJettonTransferPayload" r.operationGroup = "" - r.pathPattern = "/v2/liteserver/get_block/{block_id}" + r.pathPattern = "/v2/jettons/{jetton_id}/transfer/{account_id}/payload" r.args = args - r.count = 1 + r.count = 2 return r, true default: return } } - case '_': // Prefix: "_" + } - if l := len("_"); len(elem) >= l && elem[0:l] == "_" { - elem = elem[l:] - } else { - break - } + } - if len(elem) == 0 { - break - } - switch elem[0] { - case 'h': // Prefix: "header/" + } - if l := len("header/"); len(elem) >= l && elem[0:l] == "header/" { - elem = elem[l:] - } else { - break - } + } - // Param: "block_id" - // Leaf parameter, slashes are prohibited - idx := strings.IndexByte(elem, '/') - if idx >= 0 { - break - } - args[0] = elem - elem = "" + case 'l': // Prefix: "liteserver/" - if len(elem) == 0 { - // Leaf node. - switch method { - case "GET": - r.name = GetRawBlockchainBlockHeaderOperation - r.summary = "" - r.operationID = "getRawBlockchainBlockHeader" - r.operationGroup = "" - r.pathPattern = "/v2/liteserver/get_block_header/{block_id}" - r.args = args - r.count = 1 - return r, true - default: - return - } - } + if l := len("liteserver/"); len(elem) >= l && elem[0:l] == "liteserver/" { + elem = elem[l:] + } else { + break + } - case 'p': // Prefix: "proof" + if len(elem) == 0 { + break + } + switch elem[0] { + case 'g': // Prefix: "get_" - if l := len("proof"); len(elem) >= l && elem[0:l] == "proof" { - elem = elem[l:] - } else { - break - } + if l := len("get_"); len(elem) >= l && elem[0:l] == "get_" { + elem = elem[l:] + } else { + break + } - if len(elem) == 0 { - // Leaf node. - switch method { - case "GET": - r.name = GetRawBlockProofOperation - r.summary = "" - r.operationID = "getRawBlockProof" - r.operationGroup = "" - r.pathPattern = "/v2/liteserver/get_block_proof" - r.args = args - r.count = 0 - return r, true - default: - return - } - } + if len(elem) == 0 { + break + } + switch elem[0] { + case 'a': // Prefix: "a" - } + if l := len("a"); len(elem) >= l && elem[0:l] == "a" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + break + } + switch elem[0] { + case 'c': // Prefix: "ccount_state/" + + if l := len("ccount_state/"); len(elem) >= l && elem[0:l] == "ccount_state/" { + elem = elem[l:] + } else { + break + } + + // Param: "account_id" + // Leaf parameter, slashes are prohibited + idx := strings.IndexByte(elem, '/') + if idx >= 0 { + break + } + args[0] = elem + elem = "" + if len(elem) == 0 { + // Leaf node. + switch method { + case "GET": + r.name = GetRawAccountStateOperation + r.summary = "" + r.operationID = "getRawAccountState" + r.operationGroup = "" + r.pathPattern = "/v2/liteserver/get_account_state/{account_id}" + r.args = args + r.count = 1 + return r, true + default: + return + } } - case 'c': // Prefix: "config_all/" + case 'l': // Prefix: "ll_shards_info/" - if l := len("config_all/"); len(elem) >= l && elem[0:l] == "config_all/" { + if l := len("ll_shards_info/"); len(elem) >= l && elem[0:l] == "ll_shards_info/" { elem = elem[l:] } else { break @@ -6732,11 +6549,11 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { // Leaf node. switch method { case "GET": - r.name = GetRawConfigOperation + r.name = GetAllRawShardsInfoOperation r.summary = "" - r.operationID = "getRawConfig" + r.operationID = "getAllRawShardsInfo" r.operationGroup = "" - r.pathPattern = "/v2/liteserver/get_config_all/{block_id}" + r.pathPattern = "/v2/liteserver/get_all_shards_info/{block_id}" r.args = args r.count = 1 return r, true @@ -6745,33 +6562,103 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { } } - case 'm': // Prefix: "masterchain_info" + } + + case 'b': // Prefix: "block" - if l := len("masterchain_info"); len(elem) >= l && elem[0:l] == "masterchain_info" { + if l := len("block"); len(elem) >= l && elem[0:l] == "block" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + break + } + switch elem[0] { + case '/': // Prefix: "/" + + if l := len("/"); len(elem) >= l && elem[0:l] == "/" { elem = elem[l:] } else { break } + // Param: "block_id" + // Leaf parameter, slashes are prohibited + idx := strings.IndexByte(elem, '/') + if idx >= 0 { + break + } + args[0] = elem + elem = "" + if len(elem) == 0 { + // Leaf node. switch method { case "GET": - r.name = GetRawMasterchainInfoOperation + r.name = GetRawBlockchainBlockOperation r.summary = "" - r.operationID = "getRawMasterchainInfo" + r.operationID = "getRawBlockchainBlock" r.operationGroup = "" - r.pathPattern = "/v2/liteserver/get_masterchain_info" + r.pathPattern = "/v2/liteserver/get_block/{block_id}" r.args = args - r.count = 0 + r.count = 1 return r, true default: return } } + + case '_': // Prefix: "_" + + if l := len("_"); len(elem) >= l && elem[0:l] == "_" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + break + } switch elem[0] { - case '_': // Prefix: "_ext" + case 'h': // Prefix: "header/" + + if l := len("header/"); len(elem) >= l && elem[0:l] == "header/" { + elem = elem[l:] + } else { + break + } + + // Param: "block_id" + // Leaf parameter, slashes are prohibited + idx := strings.IndexByte(elem, '/') + if idx >= 0 { + break + } + args[0] = elem + elem = "" - if l := len("_ext"); len(elem) >= l && elem[0:l] == "_ext" { + if len(elem) == 0 { + // Leaf node. + switch method { + case "GET": + r.name = GetRawBlockchainBlockHeaderOperation + r.summary = "" + r.operationID = "getRawBlockchainBlockHeader" + r.operationGroup = "" + r.pathPattern = "/v2/liteserver/get_block_header/{block_id}" + r.args = args + r.count = 1 + return r, true + default: + return + } + } + + case 'p': // Prefix: "proof" + + if l := len("proof"); len(elem) >= l && elem[0:l] == "proof" { elem = elem[l:] } else { break @@ -6781,11 +6668,11 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { // Leaf node. switch method { case "GET": - r.name = GetRawMasterchainInfoExtOperation + r.name = GetRawBlockProofOperation r.summary = "" - r.operationID = "getRawMasterchainInfoExt" + r.operationID = "getRawBlockProof" r.operationGroup = "" - r.pathPattern = "/v2/liteserver/get_masterchain_info_ext" + r.pathPattern = "/v2/liteserver/get_block_proof" r.args = args r.count = 0 return r, true @@ -6796,9 +6683,69 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { } - case 'o': // Prefix: "out_msg_queue_sizes" - - if l := len("out_msg_queue_sizes"); len(elem) >= l && elem[0:l] == "out_msg_queue_sizes" { + } + + case 'c': // Prefix: "config_all/" + + if l := len("config_all/"); len(elem) >= l && elem[0:l] == "config_all/" { + elem = elem[l:] + } else { + break + } + + // Param: "block_id" + // Leaf parameter, slashes are prohibited + idx := strings.IndexByte(elem, '/') + if idx >= 0 { + break + } + args[0] = elem + elem = "" + + if len(elem) == 0 { + // Leaf node. + switch method { + case "GET": + r.name = GetRawConfigOperation + r.summary = "" + r.operationID = "getRawConfig" + r.operationGroup = "" + r.pathPattern = "/v2/liteserver/get_config_all/{block_id}" + r.args = args + r.count = 1 + return r, true + default: + return + } + } + + case 'm': // Prefix: "masterchain_info" + + if l := len("masterchain_info"); len(elem) >= l && elem[0:l] == "masterchain_info" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + switch method { + case "GET": + r.name = GetRawMasterchainInfoOperation + r.summary = "" + r.operationID = "getRawMasterchainInfo" + r.operationGroup = "" + r.pathPattern = "/v2/liteserver/get_masterchain_info" + r.args = args + r.count = 0 + return r, true + default: + return + } + } + switch elem[0] { + case '_': // Prefix: "_ext" + + if l := len("_ext"); len(elem) >= l && elem[0:l] == "_ext" { elem = elem[l:] } else { break @@ -6808,11 +6755,11 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { // Leaf node. switch method { case "GET": - r.name = GetOutMsgQueueSizesOperation + r.name = GetRawMasterchainInfoExtOperation r.summary = "" - r.operationID = "getOutMsgQueueSizes" + r.operationID = "getRawMasterchainInfoExt" r.operationGroup = "" - r.pathPattern = "/v2/liteserver/get_out_msg_queue_sizes" + r.pathPattern = "/v2/liteserver/get_masterchain_info_ext" r.args = args r.count = 0 return r, true @@ -6821,9 +6768,48 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { } } - case 's': // Prefix: "s" + } + + case 'o': // Prefix: "out_msg_queue_sizes" + + if l := len("out_msg_queue_sizes"); len(elem) >= l && elem[0:l] == "out_msg_queue_sizes" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch method { + case "GET": + r.name = GetOutMsgQueueSizesOperation + r.summary = "" + r.operationID = "getOutMsgQueueSizes" + r.operationGroup = "" + r.pathPattern = "/v2/liteserver/get_out_msg_queue_sizes" + r.args = args + r.count = 0 + return r, true + default: + return + } + } + + case 's': // Prefix: "s" + + if l := len("s"); len(elem) >= l && elem[0:l] == "s" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + break + } + switch elem[0] { + case 'h': // Prefix: "hard_" - if l := len("s"); len(elem) >= l && elem[0:l] == "s" { + if l := len("hard_"); len(elem) >= l && elem[0:l] == "hard_" { elem = elem[l:] } else { break @@ -6833,91 +6819,43 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { break } switch elem[0] { - case 'h': // Prefix: "hard_" + case 'b': // Prefix: "block_proof/" - if l := len("hard_"); len(elem) >= l && elem[0:l] == "hard_" { + if l := len("block_proof/"); len(elem) >= l && elem[0:l] == "block_proof/" { elem = elem[l:] } else { break } - if len(elem) == 0 { + // Param: "block_id" + // Leaf parameter, slashes are prohibited + idx := strings.IndexByte(elem, '/') + if idx >= 0 { break } - switch elem[0] { - case 'b': // Prefix: "block_proof/" - - if l := len("block_proof/"); len(elem) >= l && elem[0:l] == "block_proof/" { - elem = elem[l:] - } else { - break - } - - // Param: "block_id" - // Leaf parameter, slashes are prohibited - idx := strings.IndexByte(elem, '/') - if idx >= 0 { - break - } - args[0] = elem - elem = "" - - if len(elem) == 0 { - // Leaf node. - switch method { - case "GET": - r.name = GetRawShardBlockProofOperation - r.summary = "" - r.operationID = "getRawShardBlockProof" - r.operationGroup = "" - r.pathPattern = "/v2/liteserver/get_shard_block_proof/{block_id}" - r.args = args - r.count = 1 - return r, true - default: - return - } - } - - case 'i': // Prefix: "info/" - - if l := len("info/"); len(elem) >= l && elem[0:l] == "info/" { - elem = elem[l:] - } else { - break - } - - // Param: "block_id" - // Leaf parameter, slashes are prohibited - idx := strings.IndexByte(elem, '/') - if idx >= 0 { - break - } - args[0] = elem - elem = "" + args[0] = elem + elem = "" - if len(elem) == 0 { - // Leaf node. - switch method { - case "GET": - r.name = GetRawShardInfoOperation - r.summary = "" - r.operationID = "getRawShardInfo" - r.operationGroup = "" - r.pathPattern = "/v2/liteserver/get_shard_info/{block_id}" - r.args = args - r.count = 1 - return r, true - default: - return - } + if len(elem) == 0 { + // Leaf node. + switch method { + case "GET": + r.name = GetRawShardBlockProofOperation + r.summary = "" + r.operationID = "getRawShardBlockProof" + r.operationGroup = "" + r.pathPattern = "/v2/liteserver/get_shard_block_proof/{block_id}" + r.args = args + r.count = 1 + return r, true + default: + return } - } - case 't': // Prefix: "tate/" + case 'i': // Prefix: "info/" - if l := len("tate/"); len(elem) >= l && elem[0:l] == "tate/" { + if l := len("info/"); len(elem) >= l && elem[0:l] == "info/" { elem = elem[l:] } else { break @@ -6936,11 +6874,11 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { // Leaf node. switch method { case "GET": - r.name = GetRawBlockchainBlockStateOperation + r.name = GetRawShardInfoOperation r.summary = "" - r.operationID = "getRawBlockchainBlockState" + r.operationID = "getRawShardInfo" r.operationGroup = "" - r.pathPattern = "/v2/liteserver/get_state/{block_id}" + r.pathPattern = "/v2/liteserver/get_shard_info/{block_id}" r.args = args r.count = 1 return r, true @@ -6951,90 +6889,236 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { } - case 't': // Prefix: "t" + case 't': // Prefix: "tate/" - if l := len("t"); len(elem) >= l && elem[0:l] == "t" { + if l := len("tate/"); len(elem) >= l && elem[0:l] == "tate/" { elem = elem[l:] } else { break } - if len(elem) == 0 { + // Param: "block_id" + // Leaf parameter, slashes are prohibited + idx := strings.IndexByte(elem, '/') + if idx >= 0 { break } - switch elem[0] { - case 'i': // Prefix: "ime" + args[0] = elem + elem = "" - if l := len("ime"); len(elem) >= l && elem[0:l] == "ime" { - elem = elem[l:] - } else { - break + if len(elem) == 0 { + // Leaf node. + switch method { + case "GET": + r.name = GetRawBlockchainBlockStateOperation + r.summary = "" + r.operationID = "getRawBlockchainBlockState" + r.operationGroup = "" + r.pathPattern = "/v2/liteserver/get_state/{block_id}" + r.args = args + r.count = 1 + return r, true + default: + return } + } - if len(elem) == 0 { - // Leaf node. - switch method { - case "GET": - r.name = GetRawTimeOperation - r.summary = "" - r.operationID = "getRawTime" - r.operationGroup = "" - r.pathPattern = "/v2/liteserver/get_time" - r.args = args - r.count = 0 - return r, true - default: - return - } - } + } - case 'r': // Prefix: "ransactions/" + case 't': // Prefix: "t" - if l := len("ransactions/"); len(elem) >= l && elem[0:l] == "ransactions/" { - elem = elem[l:] - } else { - break + if l := len("t"); len(elem) >= l && elem[0:l] == "t" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + break + } + switch elem[0] { + case 'i': // Prefix: "ime" + + if l := len("ime"); len(elem) >= l && elem[0:l] == "ime" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch method { + case "GET": + r.name = GetRawTimeOperation + r.summary = "" + r.operationID = "getRawTime" + r.operationGroup = "" + r.pathPattern = "/v2/liteserver/get_time" + r.args = args + r.count = 0 + return r, true + default: + return } + } - // Param: "account_id" - // Leaf parameter, slashes are prohibited - idx := strings.IndexByte(elem, '/') - if idx >= 0 { - break + case 'r': // Prefix: "ransactions/" + + if l := len("ransactions/"); len(elem) >= l && elem[0:l] == "ransactions/" { + elem = elem[l:] + } else { + break + } + + // Param: "account_id" + // Leaf parameter, slashes are prohibited + idx := strings.IndexByte(elem, '/') + if idx >= 0 { + break + } + args[0] = elem + elem = "" + + if len(elem) == 0 { + // Leaf node. + switch method { + case "GET": + r.name = GetRawTransactionsOperation + r.summary = "" + r.operationID = "getRawTransactions" + r.operationGroup = "" + r.pathPattern = "/v2/liteserver/get_transactions/{account_id}" + r.args = args + r.count = 1 + return r, true + default: + return } - args[0] = elem - elem = "" + } + + } + + } + + case 'l': // Prefix: "list_block_transactions/" + + if l := len("list_block_transactions/"); len(elem) >= l && elem[0:l] == "list_block_transactions/" { + elem = elem[l:] + } else { + break + } + + // Param: "block_id" + // Leaf parameter, slashes are prohibited + idx := strings.IndexByte(elem, '/') + if idx >= 0 { + break + } + args[0] = elem + elem = "" + + if len(elem) == 0 { + // Leaf node. + switch method { + case "GET": + r.name = GetRawListBlockTransactionsOperation + r.summary = "" + r.operationID = "getRawListBlockTransactions" + r.operationGroup = "" + r.pathPattern = "/v2/liteserver/list_block_transactions/{block_id}" + r.args = args + r.count = 1 + return r, true + default: + return + } + } + + case 's': // Prefix: "send_message" + + if l := len("send_message"); len(elem) >= l && elem[0:l] == "send_message" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch method { + case "POST": + r.name = SendRawMessageOperation + r.summary = "" + r.operationID = "sendRawMessage" + r.operationGroup = "" + r.pathPattern = "/v2/liteserver/send_message" + r.args = args + r.count = 0 + return r, true + default: + return + } + } + + } - if len(elem) == 0 { - // Leaf node. - switch method { - case "GET": - r.name = GetRawTransactionsOperation - r.summary = "" - r.operationID = "getRawTransactions" - r.operationGroup = "" - r.pathPattern = "/v2/liteserver/get_transactions/{account_id}" - r.args = args - r.count = 1 - return r, true - default: - return - } - } + case 'm': // Prefix: "m" - } + if l := len("m"); len(elem) >= l && elem[0:l] == "m" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + break + } + switch elem[0] { + case 'e': // Prefix: "essage/decode" + if l := len("essage/decode"); len(elem) >= l && elem[0:l] == "essage/decode" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch method { + case "POST": + r.name = DecodeMessageOperation + r.summary = "" + r.operationID = "decodeMessage" + r.operationGroup = "" + r.pathPattern = "/v2/message/decode" + r.args = args + r.count = 0 + return r, true + default: + return } + } + + case 'u': // Prefix: "ultisig/" - case 'l': // Prefix: "list_block_transactions/" + if l := len("ultisig/"); len(elem) >= l && elem[0:l] == "ultisig/" { + elem = elem[l:] + } else { + break + } - if l := len("list_block_transactions/"); len(elem) >= l && elem[0:l] == "list_block_transactions/" { + if len(elem) == 0 { + break + } + switch elem[0] { + case 'o': // Prefix: "order/" + origElem := elem + if l := len("order/"); len(elem) >= l && elem[0:l] == "order/" { elem = elem[l:] } else { break } - // Param: "block_id" + // Param: "account_id" // Leaf parameter, slashes are prohibited idx := strings.IndexByte(elem, '/') if idx >= 0 { @@ -7047,11 +7131,11 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { // Leaf node. switch method { case "GET": - r.name = GetRawListBlockTransactionsOperation + r.name = GetMultisigOrderOperation r.summary = "" - r.operationID = "getRawListBlockTransactions" + r.operationID = "getMultisigOrder" r.operationGroup = "" - r.pathPattern = "/v2/liteserver/list_block_transactions/{block_id}" + r.pathPattern = "/v2/multisig/order/{account_id}" r.args = args r.count = 1 return r, true @@ -7060,73 +7144,101 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { } } - case 's': // Prefix: "send_message" + elem = origElem + } + // Param: "account_id" + // Leaf parameter, slashes are prohibited + idx := strings.IndexByte(elem, '/') + if idx >= 0 { + break + } + args[0] = elem + elem = "" - if l := len("send_message"); len(elem) >= l && elem[0:l] == "send_message" { - elem = elem[l:] - } else { - break + if len(elem) == 0 { + // Leaf node. + switch method { + case "GET": + r.name = GetMultisigAccountOperation + r.summary = "" + r.operationID = "getMultisigAccount" + r.operationGroup = "" + r.pathPattern = "/v2/multisig/{account_id}" + r.args = args + r.count = 1 + return r, true + default: + return } + } - if len(elem) == 0 { - // Leaf node. - switch method { - case "POST": - r.name = SendRawMessageOperation - r.summary = "" - r.operationID = "sendRawMessage" - r.operationGroup = "" - r.pathPattern = "/v2/liteserver/send_message" - r.args = args - r.count = 0 - return r, true - default: - return - } - } + } - } + case 'n': // Prefix: "nfts/" - case 'm': // Prefix: "m" + if l := len("nfts/"); len(elem) >= l && elem[0:l] == "nfts/" { + elem = elem[l:] + } else { + break + } - if l := len("m"); len(elem) >= l && elem[0:l] == "m" { + if len(elem) == 0 { + break + } + switch elem[0] { + case '_': // Prefix: "_bulk" + origElem := elem + if l := len("_bulk"); len(elem) >= l && elem[0:l] == "_bulk" { elem = elem[l:] } else { break } if len(elem) == 0 { - break + // Leaf node. + switch method { + case "POST": + r.name = GetNftItemsByAddressesOperation + r.summary = "" + r.operationID = "getNftItemsByAddresses" + r.operationGroup = "" + r.pathPattern = "/v2/nfts/_bulk" + r.args = args + r.count = 0 + return r, true + default: + return + } } - switch elem[0] { - case 'e': // Prefix: "essage/decode" - if l := len("essage/decode"); len(elem) >= l && elem[0:l] == "essage/decode" { - elem = elem[l:] - } else { - break - } + elem = origElem + case 'c': // Prefix: "collections" + origElem := elem + if l := len("collections"); len(elem) >= l && elem[0:l] == "collections" { + elem = elem[l:] + } else { + break + } - if len(elem) == 0 { - // Leaf node. - switch method { - case "POST": - r.name = DecodeMessageOperation - r.summary = "" - r.operationID = "decodeMessage" - r.operationGroup = "" - r.pathPattern = "/v2/message/decode" - r.args = args - r.count = 0 - return r, true - default: - return - } + if len(elem) == 0 { + switch method { + case "GET": + r.name = GetNftCollectionsOperation + r.summary = "" + r.operationID = "getNftCollections" + r.operationGroup = "" + r.pathPattern = "/v2/nfts/collections" + r.args = args + r.count = 0 + return r, true + default: + return } + } + switch elem[0] { + case '/': // Prefix: "/" - case 'u': // Prefix: "ultisig/" - - if l := len("ultisig/"); len(elem) >= l && elem[0:l] == "ultisig/" { + if l := len("/"); len(elem) >= l && elem[0:l] == "/" { elem = elem[l:] } else { break @@ -7136,34 +7248,25 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { break } switch elem[0] { - case 'o': // Prefix: "order/" + case '_': // Prefix: "_bulk" origElem := elem - if l := len("order/"); len(elem) >= l && elem[0:l] == "order/" { + if l := len("_bulk"); len(elem) >= l && elem[0:l] == "_bulk" { elem = elem[l:] } else { break } - // Param: "account_id" - // Leaf parameter, slashes are prohibited - idx := strings.IndexByte(elem, '/') - if idx >= 0 { - break - } - args[0] = elem - elem = "" - if len(elem) == 0 { // Leaf node. switch method { - case "GET": - r.name = GetMultisigOrderOperation + case "POST": + r.name = GetNftCollectionItemsByAddressesOperation r.summary = "" - r.operationID = "getMultisigOrder" + r.operationID = "getNftCollectionItemsByAddresses" r.operationGroup = "" - r.pathPattern = "/v2/multisig/order/{account_id}" + r.pathPattern = "/v2/nfts/collections/_bulk" r.args = args - r.count = 1 + r.count = 0 return r, true default: return @@ -7173,23 +7276,22 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { elem = origElem } // Param: "account_id" - // Leaf parameter, slashes are prohibited + // Match until "/" idx := strings.IndexByte(elem, '/') - if idx >= 0 { - break + if idx < 0 { + idx = len(elem) } - args[0] = elem - elem = "" + args[0] = elem[:idx] + elem = elem[idx:] if len(elem) == 0 { - // Leaf node. switch method { case "GET": - r.name = GetMultisigAccountOperation + r.name = GetNftCollectionOperation r.summary = "" - r.operationID = "getMultisigAccount" + r.operationID = "getNftCollection" r.operationGroup = "" - r.pathPattern = "/v2/multisig/{account_id}" + r.pathPattern = "/v2/nfts/collections/{account_id}" r.args = args r.count = 1 return r, true @@ -7197,12 +7299,169 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { return } } + switch elem[0] { + case '/': // Prefix: "/items" + + if l := len("/items"); len(elem) >= l && elem[0:l] == "/items" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch method { + case "GET": + r.name = GetItemsFromCollectionOperation + r.summary = "" + r.operationID = "getItemsFromCollection" + r.operationGroup = "" + r.pathPattern = "/v2/nfts/collections/{account_id}/items" + r.args = args + r.count = 1 + return r, true + default: + return + } + } + + } + + } + + elem = origElem + } + // Param: "account_id" + // Match until "/" + idx := strings.IndexByte(elem, '/') + if idx < 0 { + idx = len(elem) + } + args[0] = elem[:idx] + elem = elem[idx:] + + if len(elem) == 0 { + switch method { + case "GET": + r.name = GetNftItemByAddressOperation + r.summary = "" + r.operationID = "getNftItemByAddress" + r.operationGroup = "" + r.pathPattern = "/v2/nfts/{account_id}" + r.args = args + r.count = 1 + return r, true + default: + return + } + } + switch elem[0] { + case '/': // Prefix: "/history" + + if l := len("/history"); len(elem) >= l && elem[0:l] == "/history" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch method { + case "GET": + r.name = GetNftHistoryByIDOperation + r.summary = "" + r.operationID = "getNftHistoryByID" + r.operationGroup = "" + r.pathPattern = "/v2/nfts/{account_id}/history" + r.args = args + r.count = 1 + return r, true + default: + return + } + } + + } + + case 'o': // Prefix: "openapi." + + if l := len("openapi."); len(elem) >= l && elem[0:l] == "openapi." { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + break + } + switch elem[0] { + case 'j': // Prefix: "json" + + if l := len("json"); len(elem) >= l && elem[0:l] == "json" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch method { + case "GET": + r.name = GetOpenapiJsonOperation + r.summary = "" + r.operationID = "getOpenapiJson" + r.operationGroup = "" + r.pathPattern = "/v2/openapi.json" + r.args = args + r.count = 0 + return r, true + default: + return + } + } + + case 'y': // Prefix: "yml" + + if l := len("yml"); len(elem) >= l && elem[0:l] == "yml" { + elem = elem[l:] + } else { + break + } + if len(elem) == 0 { + // Leaf node. + switch method { + case "GET": + r.name = GetOpenapiYmlOperation + r.summary = "" + r.operationID = "getOpenapiYml" + r.operationGroup = "" + r.pathPattern = "/v2/openapi.yml" + r.args = args + r.count = 0 + return r, true + default: + return + } } - case 'n': // Prefix: "nfts/" + } + + case 'p': // Prefix: "pu" + + if l := len("pu"); len(elem) >= l && elem[0:l] == "pu" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + break + } + switch elem[0] { + case 'b': // Prefix: "bkeys/" - if l := len("nfts/"); len(elem) >= l && elem[0:l] == "nfts/" { + if l := len("bkeys/"); len(elem) >= l && elem[0:l] == "bkeys/" { elem = elem[l:] } else { break @@ -7212,9 +7471,9 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { break } switch elem[0] { - case '_': // Prefix: "_bulk" + case 'w': // Prefix: "wallets/_bulk" origElem := elem - if l := len("_bulk"); len(elem) >= l && elem[0:l] == "_bulk" { + if l := len("wallets/_bulk"); len(elem) >= l && elem[0:l] == "wallets/_bulk" { elem = elem[l:] } else { break @@ -7224,36 +7483,11 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { // Leaf node. switch method { case "POST": - r.name = GetNftItemsByAddressesOperation - r.summary = "" - r.operationID = "getNftItemsByAddresses" - r.operationGroup = "" - r.pathPattern = "/v2/nfts/_bulk" - r.args = args - r.count = 0 - return r, true - default: - return - } - } - - elem = origElem - case 'c': // Prefix: "collections" - origElem := elem - if l := len("collections"); len(elem) >= l && elem[0:l] == "collections" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - switch method { - case "GET": - r.name = GetNftCollectionsOperation + r.name = GetWalletsByPublicKeyBulkOperation r.summary = "" - r.operationID = "getNftCollections" + r.operationID = "getWalletsByPublicKeyBulk" r.operationGroup = "" - r.pathPattern = "/v2/nfts/collections" + r.pathPattern = "/v2/pubkeys/wallets/_bulk" r.args = args r.count = 0 return r, true @@ -7261,103 +7495,10 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { return } } - switch elem[0] { - case '/': // Prefix: "/" - - if l := len("/"); len(elem) >= l && elem[0:l] == "/" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - break - } - switch elem[0] { - case '_': // Prefix: "_bulk" - origElem := elem - if l := len("_bulk"); len(elem) >= l && elem[0:l] == "_bulk" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - // Leaf node. - switch method { - case "POST": - r.name = GetNftCollectionItemsByAddressesOperation - r.summary = "" - r.operationID = "getNftCollectionItemsByAddresses" - r.operationGroup = "" - r.pathPattern = "/v2/nfts/collections/_bulk" - r.args = args - r.count = 0 - return r, true - default: - return - } - } - - elem = origElem - } - // Param: "account_id" - // Match until "/" - idx := strings.IndexByte(elem, '/') - if idx < 0 { - idx = len(elem) - } - args[0] = elem[:idx] - elem = elem[idx:] - - if len(elem) == 0 { - switch method { - case "GET": - r.name = GetNftCollectionOperation - r.summary = "" - r.operationID = "getNftCollection" - r.operationGroup = "" - r.pathPattern = "/v2/nfts/collections/{account_id}" - r.args = args - r.count = 1 - return r, true - default: - return - } - } - switch elem[0] { - case '/': // Prefix: "/items" - - if l := len("/items"); len(elem) >= l && elem[0:l] == "/items" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - // Leaf node. - switch method { - case "GET": - r.name = GetItemsFromCollectionOperation - r.summary = "" - r.operationID = "getItemsFromCollection" - r.operationGroup = "" - r.pathPattern = "/v2/nfts/collections/{account_id}/items" - r.args = args - r.count = 1 - return r, true - default: - return - } - } - - } - - } elem = origElem } - // Param: "account_id" + // Param: "public_key" // Match until "/" idx := strings.IndexByte(elem, '/') if idx < 0 { @@ -7367,24 +7508,12 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { elem = elem[idx:] if len(elem) == 0 { - switch method { - case "GET": - r.name = GetNftItemByAddressOperation - r.summary = "" - r.operationID = "getNftItemByAddress" - r.operationGroup = "" - r.pathPattern = "/v2/nfts/{account_id}" - r.args = args - r.count = 1 - return r, true - default: - return - } + break } switch elem[0] { - case '/': // Prefix: "/history" + case '/': // Prefix: "/wallets" - if l := len("/history"); len(elem) >= l && elem[0:l] == "/history" { + if l := len("/wallets"); len(elem) >= l && elem[0:l] == "/wallets" { elem = elem[l:] } else { break @@ -7394,11 +7523,11 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { // Leaf node. switch method { case "GET": - r.name = GetNftHistoryByIDOperation + r.name = GetWalletsByPublicKeyOperation r.summary = "" - r.operationID = "getNftHistoryByID" + r.operationID = "getWalletsByPublicKey" r.operationGroup = "" - r.pathPattern = "/v2/nfts/{account_id}/history" + r.pathPattern = "/v2/pubkeys/{public_key}/wallets" r.args = args r.count = 1 return r, true @@ -7409,21 +7538,30 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { } - case 'o': // Prefix: "openapi." + case 'r': // Prefix: "rchases/" - if l := len("openapi."); len(elem) >= l && elem[0:l] == "openapi." { + if l := len("rchases/"); len(elem) >= l && elem[0:l] == "rchases/" { elem = elem[l:] } else { break } + // Param: "account_id" + // Match until "/" + idx := strings.IndexByte(elem, '/') + if idx < 0 { + idx = len(elem) + } + args[0] = elem[:idx] + elem = elem[idx:] + if len(elem) == 0 { break } switch elem[0] { - case 'j': // Prefix: "json" + case '/': // Prefix: "/history" - if l := len("json"); len(elem) >= l && elem[0:l] == "json" { + if l := len("/history"); len(elem) >= l && elem[0:l] == "/history" { elem = elem[l:] } else { break @@ -7433,61 +7571,62 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { // Leaf node. switch method { case "GET": - r.name = GetOpenapiJsonOperation + r.name = GetPurchaseHistoryOperation r.summary = "" - r.operationID = "getOpenapiJson" + r.operationID = "getPurchaseHistory" r.operationGroup = "" - r.pathPattern = "/v2/openapi.json" + r.pathPattern = "/v2/purchases/{account_id}/history" r.args = args - r.count = 0 + r.count = 1 return r, true default: return } } - case 'y': // Prefix: "yml" + } - if l := len("yml"); len(elem) >= l && elem[0:l] == "yml" { - elem = elem[l:] - } else { - break - } + } - if len(elem) == 0 { - // Leaf node. - switch method { - case "GET": - r.name = GetOpenapiYmlOperation - r.summary = "" - r.operationID = "getOpenapiYml" - r.operationGroup = "" - r.pathPattern = "/v2/openapi.yml" - r.args = args - r.count = 0 - return r, true - default: - return - } - } + case 'r': // Prefix: "r" - } + if l := len("r"); len(elem) >= l && elem[0:l] == "r" { + elem = elem[l:] + } else { + break + } - case 'p': // Prefix: "pu" + if len(elem) == 0 { + break + } + switch elem[0] { + case 'a': // Prefix: "ates" - if l := len("pu"); len(elem) >= l && elem[0:l] == "pu" { + if l := len("ates"); len(elem) >= l && elem[0:l] == "ates" { elem = elem[l:] } else { break } if len(elem) == 0 { - break + switch method { + case "GET": + r.name = GetRatesOperation + r.summary = "" + r.operationID = "getRates" + r.operationGroup = "" + r.pathPattern = "/v2/rates" + r.args = args + r.count = 0 + return r, true + default: + return + } } switch elem[0] { - case 'b': // Prefix: "bkeys/" + case '/': // Prefix: "/" - if l := len("bkeys/"); len(elem) >= l && elem[0:l] == "bkeys/" { + if l := len("/"); len(elem) >= l && elem[0:l] == "/" { elem = elem[l:] } else { break @@ -7497,49 +7636,9 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { break } switch elem[0] { - case 'w': // Prefix: "wallets/_bulk" - origElem := elem - if l := len("wallets/_bulk"); len(elem) >= l && elem[0:l] == "wallets/_bulk" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - // Leaf node. - switch method { - case "POST": - r.name = GetWalletsByPublicKeyBulkOperation - r.summary = "" - r.operationID = "getWalletsByPublicKeyBulk" - r.operationGroup = "" - r.pathPattern = "/v2/pubkeys/wallets/_bulk" - r.args = args - r.count = 0 - return r, true - default: - return - } - } - - elem = origElem - } - // Param: "public_key" - // Match until "/" - idx := strings.IndexByte(elem, '/') - if idx < 0 { - idx = len(elem) - } - args[0] = elem[:idx] - elem = elem[idx:] - - if len(elem) == 0 { - break - } - switch elem[0] { - case '/': // Prefix: "/wallets" + case 'c': // Prefix: "chart" - if l := len("/wallets"); len(elem) >= l && elem[0:l] == "/wallets" { + if l := len("chart"); len(elem) >= l && elem[0:l] == "chart" { elem = elem[l:] } else { break @@ -7549,45 +7648,22 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { // Leaf node. switch method { case "GET": - r.name = GetWalletsByPublicKeyOperation + r.name = GetChartRatesOperation r.summary = "" - r.operationID = "getWalletsByPublicKey" + r.operationID = "getChartRates" r.operationGroup = "" - r.pathPattern = "/v2/pubkeys/{public_key}/wallets" + r.pathPattern = "/v2/rates/chart" r.args = args - r.count = 1 + r.count = 0 return r, true default: return } } - } - - case 'r': // Prefix: "rchases/" - - if l := len("rchases/"); len(elem) >= l && elem[0:l] == "rchases/" { - elem = elem[l:] - } else { - break - } - - // Param: "account_id" - // Match until "/" - idx := strings.IndexByte(elem, '/') - if idx < 0 { - idx = len(elem) - } - args[0] = elem[:idx] - elem = elem[idx:] - - if len(elem) == 0 { - break - } - switch elem[0] { - case '/': // Prefix: "/history" - - if l := len("/history"); len(elem) >= l && elem[0:l] == "/history" { + case 'm': // Prefix: "markets" + + if l := len("markets"); len(elem) >= l && elem[0:l] == "markets" { elem = elem[l:] } else { break @@ -7597,13 +7673,13 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { // Leaf node. switch method { case "GET": - r.name = GetPurchaseHistoryOperation + r.name = GetMarketsRatesOperation r.summary = "" - r.operationID = "getPurchaseHistory" + r.operationID = "getMarketsRates" r.operationGroup = "" - r.pathPattern = "/v2/purchases/{account_id}/history" + r.pathPattern = "/v2/rates/markets" r.args = args - r.count = 1 + r.count = 0 return r, true default: return @@ -7614,9 +7690,9 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { } - case 'r': // Prefix: "r" + case 'e': // Prefix: "ewards/" - if l := len("r"); len(elem) >= l && elem[0:l] == "r" { + if l := len("ewards/"); len(elem) >= l && elem[0:l] == "ewards/" { elem = elem[l:] } else { break @@ -7626,22 +7702,23 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { break } switch elem[0] { - case 'a': // Prefix: "ates" + case 'r': // Prefix: "round-rewards" - if l := len("ates"); len(elem) >= l && elem[0:l] == "ates" { + if l := len("round-rewards"); len(elem) >= l && elem[0:l] == "round-rewards" { elem = elem[l:] } else { break } if len(elem) == 0 { + // Leaf node. switch method { case "GET": - r.name = GetRatesOperation - r.summary = "" - r.operationID = "getRates" + r.name = GetRoundRewardsOperation + r.summary = "Get per-validator reward distribution for a finished round" + r.operationID = "getRoundRewards" r.operationGroup = "" - r.pathPattern = "/v2/rates" + r.pathPattern = "/v2/rewards/round-rewards" r.args = args r.count = 0 return r, true @@ -7649,76 +7726,10 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { return } } - switch elem[0] { - case '/': // Prefix: "/" - - if l := len("/"); len(elem) >= l && elem[0:l] == "/" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - break - } - switch elem[0] { - case 'c': // Prefix: "chart" - - if l := len("chart"); len(elem) >= l && elem[0:l] == "chart" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - // Leaf node. - switch method { - case "GET": - r.name = GetChartRatesOperation - r.summary = "" - r.operationID = "getChartRates" - r.operationGroup = "" - r.pathPattern = "/v2/rates/chart" - r.args = args - r.count = 0 - return r, true - default: - return - } - } - - case 'm': // Prefix: "markets" - - if l := len("markets"); len(elem) >= l && elem[0:l] == "markets" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - // Leaf node. - switch method { - case "GET": - r.name = GetMarketsRatesOperation - r.summary = "" - r.operationID = "getMarketsRates" - r.operationGroup = "" - r.pathPattern = "/v2/rates/markets" - r.args = args - r.count = 0 - return r, true - default: - return - } - } - - } - - } - case 'e': // Prefix: "ewards/" + case 'v': // Prefix: "validat" - if l := len("ewards/"); len(elem) >= l && elem[0:l] == "ewards/" { + if l := len("validat"); len(elem) >= l && elem[0:l] == "validat" { elem = elem[l:] } else { break @@ -7728,9 +7739,9 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { break } switch elem[0] { - case 'r': // Prefix: "round-rewards" + case 'i': // Prefix: "ion-rounds" - if l := len("round-rewards"); len(elem) >= l && elem[0:l] == "round-rewards" { + if l := len("ion-rounds"); len(elem) >= l && elem[0:l] == "ion-rounds" { elem = elem[l:] } else { break @@ -7740,11 +7751,11 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { // Leaf node. switch method { case "GET": - r.name = GetRoundRewardsOperation - r.summary = "Get per-validator reward distribution for a finished round" - r.operationID = "getRoundRewards" + r.name = GetValidationRoundsOperation + r.summary = "Get validation round metadata" + r.operationID = "getValidationRounds" r.operationGroup = "" - r.pathPattern = "/v2/rewards/round-rewards" + r.pathPattern = "/v2/rewards/validation-rounds" r.args = args r.count = 0 return r, true @@ -7753,77 +7764,52 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { } } - case 'v': // Prefix: "validat" + case 'o': // Prefix: "ors" - if l := len("validat"); len(elem) >= l && elem[0:l] == "validat" { + if l := len("ors"); len(elem) >= l && elem[0:l] == "ors" { elem = elem[l:] } else { break } if len(elem) == 0 { - break - } - switch elem[0] { - case 'i': // Prefix: "ion-rounds" - - if l := len("ion-rounds"); len(elem) >= l && elem[0:l] == "ion-rounds" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - // Leaf node. - switch method { - case "GET": - r.name = GetValidationRoundsOperation - r.summary = "Get validation round metadata" - r.operationID = "getValidationRounds" - r.operationGroup = "" - r.pathPattern = "/v2/rewards/validation-rounds" - r.args = args - r.count = 0 - return r, true - default: - return - } - } - - case 'o': // Prefix: "ors" - - if l := len("ors"); len(elem) >= l && elem[0:l] == "ors" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - // Leaf node. - switch method { - case "GET": - r.name = GetValidatorsOperation - r.summary = "Get all current validators" - r.operationID = "getValidators" - r.operationGroup = "" - r.pathPattern = "/v2/rewards/validators" - r.args = args - r.count = 0 - return r, true - default: - return - } + // Leaf node. + switch method { + case "GET": + r.name = GetValidatorsOperation + r.summary = "Get all current validators" + r.operationID = "getValidators" + r.operationGroup = "" + r.pathPattern = "/v2/rewards/validators" + r.args = args + r.count = 0 + return r, true + default: + return } - } } } - case 's': // Prefix: "st" + } + + case 's': // Prefix: "st" - if l := len("st"); len(elem) >= l && elem[0:l] == "st" { + if l := len("st"); len(elem) >= l && elem[0:l] == "st" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + break + } + switch elem[0] { + case 'a': // Prefix: "a" + + if l := len("a"); len(elem) >= l && elem[0:l] == "a" { elem = elem[l:] } else { break @@ -7833,9 +7819,9 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { break } switch elem[0] { - case 'a': // Prefix: "a" + case 'k': // Prefix: "king/" - if l := len("a"); len(elem) >= l && elem[0:l] == "a" { + if l := len("king/"); len(elem) >= l && elem[0:l] == "king/" { elem = elem[l:] } else { break @@ -7845,9 +7831,57 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { break } switch elem[0] { - case 'k': // Prefix: "king/" + case 'n': // Prefix: "nominator/" + + if l := len("nominator/"); len(elem) >= l && elem[0:l] == "nominator/" { + elem = elem[l:] + } else { + break + } + + // Param: "account_id" + // Match until "/" + idx := strings.IndexByte(elem, '/') + if idx < 0 { + idx = len(elem) + } + args[0] = elem[:idx] + elem = elem[idx:] + + if len(elem) == 0 { + break + } + switch elem[0] { + case '/': // Prefix: "/pools" + + if l := len("/pools"); len(elem) >= l && elem[0:l] == "/pools" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch method { + case "GET": + r.name = GetAccountNominatorsPoolsOperation + r.summary = "" + r.operationID = "getAccountNominatorsPools" + r.operationGroup = "" + r.pathPattern = "/v2/staking/nominator/{account_id}/pools" + r.args = args + r.count = 1 + return r, true + default: + return + } + } - if l := len("king/"); len(elem) >= l && elem[0:l] == "king/" { + } + + case 'p': // Prefix: "pool" + + if l := len("pool"); len(elem) >= l && elem[0:l] == "pool" { elem = elem[l:] } else { break @@ -7857,9 +7891,9 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { break } switch elem[0] { - case 'n': // Prefix: "nominator/" + case '/': // Prefix: "/" - if l := len("nominator/"); len(elem) >= l && elem[0:l] == "nominator/" { + if l := len("/"); len(elem) >= l && elem[0:l] == "/" { elem = elem[l:] } else { break @@ -7875,12 +7909,24 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { elem = elem[idx:] if len(elem) == 0 { - break + switch method { + case "GET": + r.name = GetStakingPoolInfoOperation + r.summary = "" + r.operationID = "getStakingPoolInfo" + r.operationGroup = "" + r.pathPattern = "/v2/staking/pool/{account_id}" + r.args = args + r.count = 1 + return r, true + default: + return + } } switch elem[0] { - case '/': // Prefix: "/pools" + case '/': // Prefix: "/history" - if l := len("/pools"); len(elem) >= l && elem[0:l] == "/pools" { + if l := len("/history"); len(elem) >= l && elem[0:l] == "/history" { elem = elem[l:] } else { break @@ -7890,11 +7936,11 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { // Leaf node. switch method { case "GET": - r.name = GetAccountNominatorsPoolsOperation + r.name = GetStakingPoolHistoryOperation r.summary = "" - r.operationID = "getAccountNominatorsPools" + r.operationID = "getStakingPoolHistory" r.operationGroup = "" - r.pathPattern = "/v2/staking/nominator/{account_id}/pools" + r.pathPattern = "/v2/staking/pool/{account_id}/history" r.args = args r.count = 1 return r, true @@ -7905,137 +7951,38 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { } - case 'p': // Prefix: "pool" + case 's': // Prefix: "s" - if l := len("pool"); len(elem) >= l && elem[0:l] == "pool" { + if l := len("s"); len(elem) >= l && elem[0:l] == "s" { elem = elem[l:] } else { break } if len(elem) == 0 { - break - } - switch elem[0] { - case '/': // Prefix: "/" - - if l := len("/"); len(elem) >= l && elem[0:l] == "/" { - elem = elem[l:] - } else { - break - } - - // Param: "account_id" - // Match until "/" - idx := strings.IndexByte(elem, '/') - if idx < 0 { - idx = len(elem) - } - args[0] = elem[:idx] - elem = elem[idx:] - - if len(elem) == 0 { - switch method { - case "GET": - r.name = GetStakingPoolInfoOperation - r.summary = "" - r.operationID = "getStakingPoolInfo" - r.operationGroup = "" - r.pathPattern = "/v2/staking/pool/{account_id}" - r.args = args - r.count = 1 - return r, true - default: - return - } - } - switch elem[0] { - case '/': // Prefix: "/history" - - if l := len("/history"); len(elem) >= l && elem[0:l] == "/history" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - // Leaf node. - switch method { - case "GET": - r.name = GetStakingPoolHistoryOperation - r.summary = "" - r.operationID = "getStakingPoolHistory" - r.operationGroup = "" - r.pathPattern = "/v2/staking/pool/{account_id}/history" - r.args = args - r.count = 1 - return r, true - default: - return - } - } - - } - - case 's': // Prefix: "s" - - if l := len("s"); len(elem) >= l && elem[0:l] == "s" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - // Leaf node. - switch method { - case "GET": - r.name = GetStakingPoolsOperation - r.summary = "" - r.operationID = "getStakingPools" - r.operationGroup = "" - r.pathPattern = "/v2/staking/pools" - r.args = args - r.count = 0 - return r, true - default: - return - } + // Leaf node. + switch method { + case "GET": + r.name = GetStakingPoolsOperation + r.summary = "" + r.operationID = "getStakingPools" + r.operationGroup = "" + r.pathPattern = "/v2/staking/pools" + r.args = args + r.count = 0 + return r, true + default: + return } - } } - case 't': // Prefix: "tus" - - if l := len("tus"); len(elem) >= l && elem[0:l] == "tus" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - // Leaf node. - switch method { - case "GET": - r.name = StatusOperation - r.summary = "" - r.operationID = "status" - r.operationGroup = "" - r.pathPattern = "/v2/status" - r.args = args - r.count = 0 - return r, true - default: - return - } - } - } - case 'o': // Prefix: "orage/providers" + case 't': // Prefix: "tus" - if l := len("orage/providers"); len(elem) >= l && elem[0:l] == "orage/providers" { + if l := len("tus"); len(elem) >= l && elem[0:l] == "tus" { elem = elem[l:] } else { break @@ -8045,11 +7992,11 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { // Leaf node. switch method { case "GET": - r.name = GetStorageProvidersOperation + r.name = StatusOperation r.summary = "" - r.operationID = "getStorageProviders" + r.operationID = "status" r.operationGroup = "" - r.pathPattern = "/v2/storage/providers" + r.pathPattern = "/v2/status" r.args = args r.count = 0 return r, true @@ -8060,164 +8007,85 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { } - case 't': // Prefix: "t" + case 'o': // Prefix: "orage/providers" - if l := len("t"); len(elem) >= l && elem[0:l] == "t" { + if l := len("orage/providers"); len(elem) >= l && elem[0:l] == "orage/providers" { elem = elem[l:] } else { break } if len(elem) == 0 { - break - } - switch elem[0] { - case 'o': // Prefix: "onconnect/" - - if l := len("onconnect/"); len(elem) >= l && elem[0:l] == "onconnect/" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - break + // Leaf node. + switch method { + case "GET": + r.name = GetStorageProvidersOperation + r.summary = "" + r.operationID = "getStorageProviders" + r.operationGroup = "" + r.pathPattern = "/v2/storage/providers" + r.args = args + r.count = 0 + return r, true + default: + return } - switch elem[0] { - case 'p': // Prefix: "payload" - - if l := len("payload"); len(elem) >= l && elem[0:l] == "payload" { - elem = elem[l:] - } else { - break - } + } - if len(elem) == 0 { - // Leaf node. - switch method { - case "GET": - r.name = GetTonConnectPayloadOperation - r.summary = "" - r.operationID = "getTonConnectPayload" - r.operationGroup = "" - r.pathPattern = "/v2/tonconnect/payload" - r.args = args - r.count = 0 - return r, true - default: - return - } - } + } - case 's': // Prefix: "stateinit" + case 't': // Prefix: "t" - if l := len("stateinit"); len(elem) >= l && elem[0:l] == "stateinit" { - elem = elem[l:] - } else { - break - } + if l := len("t"); len(elem) >= l && elem[0:l] == "t" { + elem = elem[l:] + } else { + break + } - if len(elem) == 0 { - // Leaf node. - switch method { - case "POST": - r.name = GetAccountInfoByStateInitOperation - r.summary = "" - r.operationID = "getAccountInfoByStateInit" - r.operationGroup = "" - r.pathPattern = "/v2/tonconnect/stateinit" - r.args = args - r.count = 0 - return r, true - default: - return - } - } + if len(elem) == 0 { + break + } + switch elem[0] { + case 'o': // Prefix: "onconnect/" - } + if l := len("onconnect/"); len(elem) >= l && elem[0:l] == "onconnect/" { + elem = elem[l:] + } else { + break + } - case 'r': // Prefix: "races/" + if len(elem) == 0 { + break + } + switch elem[0] { + case 'p': // Prefix: "payload" - if l := len("races/"); len(elem) >= l && elem[0:l] == "races/" { + if l := len("payload"); len(elem) >= l && elem[0:l] == "payload" { elem = elem[l:] } else { break } - if len(elem) == 0 { - break - } - switch elem[0] { - case 'e': // Prefix: "emulate" - origElem := elem - if l := len("emulate"); len(elem) >= l && elem[0:l] == "emulate" { - elem = elem[l:] - } else { - break - } - - if len(elem) == 0 { - // Leaf node. - switch method { - case "POST": - r.name = EmulateMessageToTraceOperation - r.summary = "" - r.operationID = "emulateMessageToTrace" - r.operationGroup = "" - r.pathPattern = "/v2/traces/emulate" - r.args = args - r.count = 0 - return r, true - default: - return - } - } - - elem = origElem - } - // Param: "trace_id" - // Leaf parameter, slashes are prohibited - idx := strings.IndexByte(elem, '/') - if idx >= 0 { - break - } - args[0] = elem - elem = "" - if len(elem) == 0 { // Leaf node. switch method { case "GET": - r.name = GetTraceOperation + r.name = GetTonConnectPayloadOperation r.summary = "" - r.operationID = "getTrace" + r.operationID = "getTonConnectPayload" r.operationGroup = "" - r.pathPattern = "/v2/traces/{trace_id}" + r.pathPattern = "/v2/tonconnect/payload" r.args = args - r.count = 1 + r.count = 0 return r, true default: return } } - } - - case 'w': // Prefix: "wallet/" - - if l := len("wallet/"); len(elem) >= l && elem[0:l] == "wallet/" { - elem = elem[l:] - } else { - break - } + case 's': // Prefix: "stateinit" - if len(elem) == 0 { - break - } - switch elem[0] { - case 'a': // Prefix: "auth/proof" - origElem := elem - if l := len("auth/proof"); len(elem) >= l && elem[0:l] == "auth/proof" { + if l := len("stateinit"); len(elem) >= l && elem[0:l] == "stateinit" { elem = elem[l:] } else { break @@ -8227,11 +8095,11 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { // Leaf node. switch method { case "POST": - r.name = TonConnectProofOperation + r.name = GetAccountInfoByStateInitOperation r.summary = "" - r.operationID = "tonConnectProof" + r.operationID = "getAccountInfoByStateInit" r.operationGroup = "" - r.pathPattern = "/v2/wallet/auth/proof" + r.pathPattern = "/v2/tonconnect/stateinit" r.args = args r.count = 0 return r, true @@ -8240,7 +8108,20 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { } } - elem = origElem + } + + case 'r': // Prefix: "races/" + + if l := len("races/"); len(elem) >= l && elem[0:l] == "races/" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + break + } + switch elem[0] { case 'e': // Prefix: "emulate" origElem := elem if l := len("emulate"); len(elem) >= l && elem[0:l] == "emulate" { @@ -8253,11 +8134,11 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { // Leaf node. switch method { case "POST": - r.name = EmulateMessageToWalletOperation + r.name = EmulateMessageToTraceOperation r.summary = "" - r.operationID = "emulateMessageToWallet" + r.operationID = "emulateMessageToTrace" r.operationGroup = "" - r.pathPattern = "/v2/wallet/emulate" + r.pathPattern = "/v2/traces/emulate" r.args = args r.count = 0 return r, true @@ -8268,23 +8149,24 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { elem = origElem } - // Param: "account_id" - // Match until "/" + // Param: "trace_id" + // Leaf parameter, slashes are prohibited idx := strings.IndexByte(elem, '/') - if idx < 0 { - idx = len(elem) + if idx >= 0 { + break } - args[0] = elem[:idx] - elem = elem[idx:] + args[0] = elem + elem = "" if len(elem) == 0 { + // Leaf node. switch method { case "GET": - r.name = GetWalletInfoOperation + r.name = GetTraceOperation r.summary = "" - r.operationID = "getWalletInfo" + r.operationID = "getTrace" r.operationGroup = "" - r.pathPattern = "/v2/wallet/{account_id}" + r.pathPattern = "/v2/traces/{trace_id}" r.args = args r.count = 1 return r, true @@ -8292,32 +8174,122 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { return } } - switch elem[0] { - case '/': // Prefix: "/seqno" - if l := len("/seqno"); len(elem) >= l && elem[0:l] == "/seqno" { - elem = elem[l:] - } else { - break + } + + case 'w': // Prefix: "wallet/" + + if l := len("wallet/"); len(elem) >= l && elem[0:l] == "wallet/" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + break + } + switch elem[0] { + case 'a': // Prefix: "auth/proof" + origElem := elem + if l := len("auth/proof"); len(elem) >= l && elem[0:l] == "auth/proof" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch method { + case "POST": + r.name = TonConnectProofOperation + r.summary = "" + r.operationID = "tonConnectProof" + r.operationGroup = "" + r.pathPattern = "/v2/wallet/auth/proof" + r.args = args + r.count = 0 + return r, true + default: + return } + } - if len(elem) == 0 { - // Leaf node. - switch method { - case "GET": - r.name = GetAccountSeqnoOperation - r.summary = "" - r.operationID = "getAccountSeqno" - r.operationGroup = "" - r.pathPattern = "/v2/wallet/{account_id}/seqno" - r.args = args - r.count = 1 - return r, true - default: - return - } + elem = origElem + case 'e': // Prefix: "emulate" + origElem := elem + if l := len("emulate"); len(elem) >= l && elem[0:l] == "emulate" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + // Leaf node. + switch method { + case "POST": + r.name = EmulateMessageToWalletOperation + r.summary = "" + r.operationID = "emulateMessageToWallet" + r.operationGroup = "" + r.pathPattern = "/v2/wallet/emulate" + r.args = args + r.count = 0 + return r, true + default: + return } + } + + elem = origElem + } + // Param: "account_id" + // Match until "/" + idx := strings.IndexByte(elem, '/') + if idx < 0 { + idx = len(elem) + } + args[0] = elem[:idx] + elem = elem[idx:] + + if len(elem) == 0 { + switch method { + case "GET": + r.name = GetWalletInfoOperation + r.summary = "" + r.operationID = "getWalletInfo" + r.operationGroup = "" + r.pathPattern = "/v2/wallet/{account_id}" + r.args = args + r.count = 1 + return r, true + default: + return + } + } + switch elem[0] { + case '/': // Prefix: "/seqno" + + if l := len("/seqno"); len(elem) >= l && elem[0:l] == "/seqno" { + elem = elem[l:] + } else { + break + } + if len(elem) == 0 { + // Leaf node. + switch method { + case "GET": + r.name = GetAccountSeqnoOperation + r.summary = "" + r.operationID = "getAccountSeqno" + r.operationGroup = "" + r.pathPattern = "/v2/wallet/{account_id}/seqno" + r.args = args + r.count = 1 + return r, true + default: + return + } } } diff --git a/pkg/oas/oas_server_gen.go b/pkg/oas/oas_server_gen.go index caf78fb82..1a060f575 100644 --- a/pkg/oas/oas_server_gen.go +++ b/pkg/oas/oas_server_gen.go @@ -331,7 +331,7 @@ type Handler interface { // // Cocoon worker types (same shape as gocoon Connection.GetWorkerTypes). // - // GET /cocoon/workers + // GET /v2/cocoon/workers GetCocoonWorkers(ctx context.Context) (GetCocoonWorkersRes, error) // GetDnsInfo implements getDnsInfo operation. // @@ -678,16 +678,14 @@ type Handler interface { // // Proxy arbitrary OpenAI-style JSON to Cocoon (POST). // - // POST /cocoon/query + // POST /v2/cocoon/query PostCocoonQuery(ctx context.Context, req jx.Raw, params PostCocoonQueryParams) (PostCocoonQueryRes, error) // PostCocoonV1ChatCompletions implements postCocoonV1ChatCompletions operation. // // OpenAI-compatible [Create chat completion](https://developers.openai. // com/api/reference/resources/chat/subresources/completions/methods/create). - // Forwards the JSON body to Cocoon as `POST /v1/chat/completions` (same as `/cocoon/query` with - // `path=/v1/chat/completions`). // - // POST /cocoon/v1/chat/completions + // POST /v2/cocoon/v1/chat/completions PostCocoonV1ChatCompletions(ctx context.Context, req jx.Raw) (PostCocoonV1ChatCompletionsRes, error) // ReindexAccount implements reindexAccount operation. // diff --git a/pkg/oas/oas_unimplemented_gen.go b/pkg/oas/oas_unimplemented_gen.go index ee23630b3..020497eae 100644 --- a/pkg/oas/oas_unimplemented_gen.go +++ b/pkg/oas/oas_unimplemented_gen.go @@ -488,7 +488,7 @@ func (UnimplementedHandler) GetChartRates(ctx context.Context, params GetChartRa // // Cocoon worker types (same shape as gocoon Connection.GetWorkerTypes). // -// GET /cocoon/workers +// GET /v2/cocoon/workers func (UnimplementedHandler) GetCocoonWorkers(ctx context.Context) (r GetCocoonWorkersRes, _ error) { return r, ht.ErrNotImplemented } @@ -1003,7 +1003,7 @@ func (UnimplementedHandler) GetWalletsByPublicKeyBulk(ctx context.Context, req O // // Proxy arbitrary OpenAI-style JSON to Cocoon (POST). // -// POST /cocoon/query +// POST /v2/cocoon/query func (UnimplementedHandler) PostCocoonQuery(ctx context.Context, req jx.Raw, params PostCocoonQueryParams) (r PostCocoonQueryRes, _ error) { return r, ht.ErrNotImplemented } @@ -1012,10 +1012,8 @@ func (UnimplementedHandler) PostCocoonQuery(ctx context.Context, req jx.Raw, par // // OpenAI-compatible [Create chat completion](https://developers.openai. // com/api/reference/resources/chat/subresources/completions/methods/create). -// Forwards the JSON body to Cocoon as `POST /v1/chat/completions` (same as `/cocoon/query` with -// `path=/v1/chat/completions`). // -// POST /cocoon/v1/chat/completions +// POST /v2/cocoon/v1/chat/completions func (UnimplementedHandler) PostCocoonV1ChatCompletions(ctx context.Context, req jx.Raw) (r PostCocoonV1ChatCompletionsRes, _ error) { return r, ht.ErrNotImplemented } From 8727fbdb8deff8f1aad65b008d3e6cfe35e80b01 Mon Sep 17 00:00:00 2001 From: Victoria E Date: Sat, 18 Apr 2026 11:55:32 +0300 Subject: [PATCH 06/11] add logs --- pkg/api/cocoon_handlers.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pkg/api/cocoon_handlers.go b/pkg/api/cocoon_handlers.go index 3b067ed3a..fb0eca4de 100644 --- a/pkg/api/cocoon_handlers.go +++ b/pkg/api/cocoon_handlers.go @@ -106,10 +106,12 @@ func (h *Handler) PostCocoonV1ChatCompletions(ctx context.Context, req jx.Raw) ( const upstreamPath = "/v1/chat/completions" respBody, err := conn.POST(ctx, model, upstreamPath, body) if err != nil { + fmt.Println("cocoon error POST: ", err) return nil, toError(http.StatusBadGateway, err) } jsonBody, err := cocoonResponseAsJSON(respBody) if err != nil { + fmt.Println("cocoon json error: ", err) return nil, toError(http.StatusBadGateway, err) } ok := oas.PostCocoonV1ChatCompletionsOKApplicationJSON(jx.Raw(jsonBody)) From c566b2c6197c5bf4723a5387dddf3570e1892558 Mon Sep 17 00:00:00 2001 From: Victoria E Date: Sat, 18 Apr 2026 12:45:36 +0300 Subject: [PATCH 07/11] add retries --- go.mod | 18 ++--- go.sum | 142 ++++++------------------------------- pkg/api/cocoon_handlers.go | 50 ++++++++----- pkg/api/cocoon_pool.go | 2 +- 4 files changed, 65 insertions(+), 147 deletions(-) diff --git a/go.mod b/go.mod index ca0f91c40..d7db229eb 100644 --- a/go.mod +++ b/go.mod @@ -24,17 +24,17 @@ require ( github.com/shopspring/decimal v1.4.0 github.com/sourcegraph/conc v0.3.0 github.com/stretchr/testify v1.11.1 + github.com/tonkeeper/gocoon v1.0.1 github.com/tonkeeper/scam_backoffice_rules v0.0.11 github.com/tonkeeper/tongo v1.19.1-0.20260417135212-97ef83ef6640 go.opentelemetry.io/otel v1.43.0 go.opentelemetry.io/otel/metric v1.43.0 go.opentelemetry.io/otel/trace v1.43.0 - go.uber.org/multierr v1.11.0 go.uber.org/zap v1.27.1 - golang.org/x/exp v0.0.0-20260312153236-7ab1446f8b90 - golang.org/x/net v0.52.0 + golang.org/x/exp v0.0.0-20260410095643-746e56fc9e2f + golang.org/x/net v0.53.0 golang.org/x/sync v0.20.0 - golang.org/x/text v0.35.0 + golang.org/x/text v0.36.0 google.golang.org/grpc v1.80.0 gopkg.in/yaml.v3 v3.0.1 ) @@ -59,15 +59,15 @@ require ( github.com/prometheus/procfs v0.20.1 // indirect github.com/segmentio/asm v1.2.1 // indirect github.com/snksoft/crc v1.1.0 // indirect - github.com/tonkeeper/gocoon v0.0.0-20260417144551-b6d55ffca6ae // indirect github.com/valyala/bytebufferpool v1.0.0 // indirect github.com/valyala/fasttemplate v1.2.2 // indirect go.opentelemetry.io/auto/sdk v1.2.1 // indirect + go.uber.org/multierr v1.11.0 // indirect go.yaml.in/yaml/v2 v2.4.4 // indirect - golang.org/x/crypto v0.49.0 // indirect - golang.org/x/mod v0.34.0 // indirect - golang.org/x/sys v0.42.0 // indirect - golang.org/x/tools v0.43.0 // indirect + golang.org/x/crypto v0.50.0 // indirect + golang.org/x/mod v0.35.0 // indirect + golang.org/x/sys v0.43.0 // indirect + golang.org/x/tools v0.44.0 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20260401024825-9d38bb4040a9 // indirect google.golang.org/protobuf v1.36.11 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect diff --git a/go.sum b/go.sum index 238e71267..45c610458 100644 --- a/go.sum +++ b/go.sum @@ -1,6 +1,3 @@ -github.com/BurntSushi/toml v1.0.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= -github.com/BurntSushi/toml v1.2.1 h1:9F2/+DoOYIOksmaJFPw1tGFy1eDnIJXg+UHjuD8lTak= -github.com/BurntSushi/toml v1.2.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= github.com/BurntSushi/toml v1.6.0 h1:dRaEfpa2VI55EwlIW72hMRHdWouJeRF7TPYhI+AUQjk= github.com/BurntSushi/toml v1.6.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= github.com/Code-Hex/go-generics-cache v1.5.1 h1:6vhZGc5M7Y/YD8cIUcY8kcuQLB4cHR7U+0KMqAA0KcU= @@ -15,19 +12,12 @@ github.com/caarlos0/env/v6 v6.10.1 h1:t1mPSxNpei6M5yAeu1qtRdPAK29Nbcf/n3G7x+b3/I github.com/caarlos0/env/v6 v6.10.1/go.mod h1:hvp/ryKXKipEkcuYjs9mI4bBCg+UI0Yhgm5Zu0ddvwc= github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/dlclark/regexp2 v1.11.0 h1:G/nrcoOa7ZXlpoa/91N3X7mM3r8eIlMBBJZvsz/mxKI= -github.com/dlclark/regexp2 v1.11.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= github.com/dlclark/regexp2 v1.11.5 h1:Q/sSnsKerHeCkc/jSTNq1oCm7KiVgUMZRDUoRu0JQZQ= github.com/dlclark/regexp2 v1.11.5/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= -github.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM= -github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE= github.com/fatih/color v1.19.0 h1:Zp3PiM21/9Ld6FzSKyL5c/BULoe/ONr9KlbYVOfG8+w= github.com/fatih/color v1.19.0/go.mod h1:zNk67I0ZUT1bEGsSGyCZYZNrHuTkJJB+r6Q9VuMi0LE= -github.com/getsentry/sentry-go v0.24.1 h1:W6/0GyTy8J6ge6lVCc94WB6Gx2ZuLrgopnn9w8Hiwuk= -github.com/getsentry/sentry-go v0.24.1/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY= github.com/getsentry/sentry-go v0.44.1 h1:/cPtrA5qB7uMRrhgSn9TYtcEF36auGP3Y6+ThvD/yaI= github.com/getsentry/sentry-go v0.44.1/go.mod h1:XDotiNZbgf5U8bPDUAfvcFmOnMQQceESxyKaObSssW0= github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= @@ -36,8 +26,6 @@ github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxI github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= github.com/go-faster/errors v0.7.1 h1:MkJTnDoEdi9pDabt1dpWf7AA8/BaSYZqibYyhZ20AYg= github.com/go-faster/errors v0.7.1/go.mod h1:5ySTjWFiphBs07IKuiL69nxdfd5+fzh1u7FPGZP2quo= -github.com/go-faster/jx v1.1.0 h1:ZsW3wD+snOdmTDy9eIVgQdjUpXRRV4rqW8NS3t+20bg= -github.com/go-faster/jx v1.1.0/go.mod h1:vKDNikrKoyUmpzaJ0OkIkRQClNHFX/nF3dnTJZb3skg= github.com/go-faster/jx v1.2.0 h1:T2YHJPrFaYu21fJtUxC9GzmluKu8rVIFDwwGBKTDseI= github.com/go-faster/jx v1.2.0/go.mod h1:UWLOVDmMG597a5tBFPLIWJdUxz5/2emOpfsj9Neg0PE= github.com/go-faster/yaml v0.4.6 h1:lOK/EhI04gCpPgPhgt0bChS6bvw7G3WwI8xxVe0sw9I= @@ -53,48 +41,34 @@ github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= 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/gorilla/websocket v1.5.1 h1:gmztn0JnHVt9JZquRuzLw3g4wouNVzKL15iLr/zn/QY= -github.com/gorilla/websocket v1.5.1/go.mod h1:x3kM2JMyaluk02fnUJpQuwD2dCS5NDG2ZHL0uE0tcaY= github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/graph-gophers/dataloader/v7 v7.1.3 h1:mXCI1E3dBG0aG1Tzg1tXaz+nN140opFIgEfYhxHR0XA= github.com/graph-gophers/dataloader/v7 v7.1.3/go.mod h1:cnjGvZ3DuN2hU90Q72WCZNzkCEq/BHwh7fI7w7/GhIg= github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= -github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= -github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= github.com/klauspost/compress v1.18.2 h1:iiPHWW0YrcFgpBYhsA6D1+fqHssJscY/Tm/y2Uqnapk= +github.com/klauspost/compress v1.18.2/go.mod h1:R0h/fSBs8DE4ENlcrlib3PsXS61voFxhIs2DeRhCvJ4= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/labstack/gommon v0.4.0 h1:y7cvthEAEbU0yHOf4axH8ZG2NH8knB9iNSoTO8dyIk8= -github.com/labstack/gommon v0.4.0/go.mod h1:uW6kP17uPlLJsD3ijUYn3/M5bAxtlZhMI6m3MFxTMTM= github.com/labstack/gommon v0.4.2 h1:F8qTUNXgG1+6WQmqoUWnz8WiEU60mXVVw0P4ht1WRA0= github.com/labstack/gommon v0.4.2/go.mod h1:QlUFxVM+SNXhDL/Z7YhocGIBYOiwB0mXm1+1bAPHPyU= -github.com/mattn/go-colorable v0.1.11/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= -github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= -github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE= github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8= -github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= -github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mozillazg/go-unidecode v0.2.0 h1:vFGEzAH9KSwyWmXCOblazEWDh7fOkpmy/Z4ArmamSUc= github.com/mozillazg/go-unidecode v0.2.0/go.mod h1:zB48+/Z5toiRolOZy9ksLryJ976VIwmDmpQ2quyt1aA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/nicksnyder/go-i18n/v2 v2.2.1 h1:aOzRCdwsJuoExfZhoiXHy4bjruwCMdt5otbYojM/PaA= -github.com/nicksnyder/go-i18n/v2 v2.2.1/go.mod h1:fF2++lPHlo+/kPaj3nB0uxtPwzlPm+BlgwGX7MkeGj0= github.com/nicksnyder/go-i18n/v2 v2.6.1 h1:JDEJraFsQE17Dut9HFDHzCoAWGEQJom5s0TRd17NIEQ= github.com/nicksnyder/go-i18n/v2 v2.6.1/go.mod h1:Vee0/9RD3Quc/NmwEjzzD7VTZ+Ir7QbXocrkhOzmUKA= github.com/oasisprotocol/curve25519-voi v0.0.0-20251114093237-2ab5a27a1729 h1:yfQ2sO9WJXUAIUR+g7NUkxJSKCAFJcR5sUDu+ZmjTZI= github.com/oasisprotocol/curve25519-voi v0.0.0-20251114093237-2ab5a27a1729/go.mod h1:hVoHR2EVESiICEMbg137etN/Lx+lSrHPTD39Z/uE+2s= -github.com/ogen-go/ogen v1.0.0 h1:n1hkgOnLtA1Xn369KAzJhqzphQzNo/wAI82NIaFQNXA= -github.com/ogen-go/ogen v1.0.0/go.mod h1:NFn616zR+/DPsq8rPoezaHlhKcNQzlYfo5gUieW8utI= github.com/ogen-go/ogen v1.20.2 h1:mEZGPST7ZeX84AkqRlFawDLwcwuzcLO5PtYpAXLT1YE= github.com/ogen-go/ogen v1.20.2/go.mod h1:sJ1pJVp4S1RcSZlYIiMLo0QSMSt2pls4zfrc+hNKnzk= github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= @@ -107,144 +81,73 @@ github.com/prometheus/client_golang v1.23.2 h1:Je96obch5RDVy3FDMndoUsjAhG5Edi49h github.com/prometheus/client_golang v1.23.2/go.mod h1:Tb1a6LWHB3/SPIzCoaDXI4I8UHKeFTEQ1YCr+0Gyqmg= github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk= github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE= -github.com/prometheus/common v0.66.1 h1:h5E0h5/Y8niHc5DlaLlWLArTQI7tMrsfQjHV+d9ZoGs= -github.com/prometheus/common v0.66.1/go.mod h1:gcaUsgf3KfRSwHY4dIMXLPV0K/Wg1oZ8+SbZk/HH/dA= github.com/prometheus/common v0.67.5 h1:pIgK94WWlQt1WLwAC5j2ynLaBRDiinoAb86HZHTUGI4= github.com/prometheus/common v0.67.5/go.mod h1:SjE/0MzDEEAyrdr5Gqc6G+sXI67maCxzaT3A2+HqjUw= -github.com/prometheus/procfs v0.16.1 h1:hZ15bTNuirocR6u0JZ6BAHHmwS1p8B4P6MRqxtzMyRg= -github.com/prometheus/procfs v0.16.1/go.mod h1:teAbpZRB1iIAJYREa1LsoWUXykVXA1KlTmWl8x/U+Is= github.com/prometheus/procfs v0.20.1 h1:XwbrGOIplXW/AU3YhIhLODXMJYyC1isLFfYCsTEycfc= github.com/prometheus/procfs v0.20.1/go.mod h1:o9EMBZGRyvDrSPH1RqdxhojkuXstoe4UlK79eF5TGGo= -github.com/puzpuzpuz/xsync/v2 v2.4.0 h1:5sXAMHrtx1bg9nbRZTOn8T4MkWe5V+o8yKRH02Eznag= -github.com/puzpuzpuz/xsync/v2 v2.4.0/go.mod h1:gD2H2krq/w52MfPLE+Uy64TzJDVY7lP2znR9qmR35kU= github.com/puzpuzpuz/xsync/v2 v2.5.1 h1:mVGYAvzDSu52+zaGyNjC+24Xw2bQi3kTr4QJ6N9pIIU= github.com/puzpuzpuz/xsync/v2 v2.5.1/go.mod h1:gD2H2krq/w52MfPLE+Uy64TzJDVY7lP2znR9qmR35kU= github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= -github.com/segmentio/asm v1.2.0 h1:9BQrFxC+YOHJlTlHGkTrFWf59nbL3XnCoFLTwDCI7ys= -github.com/segmentio/asm v1.2.0/go.mod h1:BqMnlJP91P8d+4ibuonYZw9mfnzI9HfxselHZr5aAcs= github.com/segmentio/asm v1.2.1 h1:DTNbBqs57ioxAD4PrArqftgypG4/qNpXoJx8TVXxPR0= github.com/segmentio/asm v1.2.1/go.mod h1:BqMnlJP91P8d+4ibuonYZw9mfnzI9HfxselHZr5aAcs= -github.com/shopspring/decimal v1.3.1 h1:2Usl1nmF/WZucqkFZhnfFYxxxu8LG21F6nPQBE5gKV8= -github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= github.com/shopspring/decimal v1.4.0 h1:bxl37RwXBklmTi0C79JfXCEBD1cqqHt0bbgBAGFp81k= github.com/shopspring/decimal v1.4.0/go.mod h1:gawqmDU56v4yIKSwfBSFip1HdCCXN8/+DMd9qYNcwME= github.com/snksoft/crc v1.1.0 h1:HkLdI4taFlgGGG1KvsWMpz78PkOC9TkPVpTV/cuWn48= github.com/snksoft/crc v1.1.0/go.mod h1:5/gUOsgAm7OmIhb6WJzw7w5g2zfJi4FrHYgGPdshE+A= github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= -github.com/tonkeeper/gocoon v0.0.0-20260417144551-b6d55ffca6ae h1:XNzBpvURYjDohMHbjKVeEMptrz7mjNuX635wAgp6xPk= -github.com/tonkeeper/gocoon v0.0.0-20260417144551-b6d55ffca6ae/go.mod h1:PEua00og1/0ywrf0aB3sAcxDSM2G1nbD4t12PFuyAHk= +github.com/tonkeeper/gocoon v0.0.0-20260418091633-712b860c1b01 h1:nHpkyYsB29pgSftH5ppt0yK0XTggw3ziJpYJbPjMIw4= +github.com/tonkeeper/gocoon v0.0.0-20260418091633-712b860c1b01/go.mod h1:VbjDK6sCA/fsbvdgGjMWs1Xt2hPehA3uP2MTPSY2Ag4= +github.com/tonkeeper/gocoon v1.0.1 h1:h9LDzqwwNLJU8to7x89GaIUHuZ0jL40UpX9rJ2veZLU= +github.com/tonkeeper/gocoon v1.0.1/go.mod h1:VbjDK6sCA/fsbvdgGjMWs1Xt2hPehA3uP2MTPSY2Ag4= github.com/tonkeeper/scam_backoffice_rules v0.0.11 h1:VXbNNyTO49OArvQwPRCU+1WUEyfQgkqG7Q8NVhQ7320= github.com/tonkeeper/scam_backoffice_rules v0.0.11/go.mod h1:SqZXYO9vbID8ku+xnnaKXeNGmehxigODGrk5V1KqbRA= -github.com/tonkeeper/tongo v1.18.4 h1:R5OvAvthY5bE/2ROF7/ni07tmOAPBWHlPHIjrS4Kh7g= -github.com/tonkeeper/tongo v1.18.4/go.mod h1:nHmdEXPfT0/EvkEaBzPiY599/0OYjQSW4dWR7aX+OII= -github.com/tonkeeper/tongo v1.18.5-0.20260414170540-4a73e4b7f8a4 h1:j0tAEZF4M8Ftrt6B8OG5qGlGvGD7W07MBbx29ZA+jtg= -github.com/tonkeeper/tongo v1.18.5-0.20260414170540-4a73e4b7f8a4/go.mod h1:nHmdEXPfT0/EvkEaBzPiY599/0OYjQSW4dWR7aX+OII= -github.com/tonkeeper/tongo v1.19.0 h1:ZX+vvTQPH20MvoWSrjQnSDWpZ+v2CaGipj+M6ga93Fk= -github.com/tonkeeper/tongo v1.19.0/go.mod h1:nHmdEXPfT0/EvkEaBzPiY599/0OYjQSW4dWR7aX+OII= github.com/tonkeeper/tongo v1.19.1-0.20260417135212-97ef83ef6640 h1:U4npFMpt3aY4TZcM6v3+0OUxJvHMxo3j5WdAZydtaag= github.com/tonkeeper/tongo v1.19.1-0.20260417135212-97ef83ef6640/go.mod h1:nHmdEXPfT0/EvkEaBzPiY599/0OYjQSW4dWR7aX+OII= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= -github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= github.com/valyala/fasttemplate v1.2.2 h1:lxLXG0uE3Qnshl9QyaK6XJxMXlQZELvChBOCmQD0Loo= github.com/valyala/fasttemplate v1.2.2/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= -github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64= go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y= -go.opentelemetry.io/otel v1.38.0 h1:RkfdswUDRimDg0m2Az18RKOsnI8UDzppJAtj01/Ymk8= -go.opentelemetry.io/otel v1.38.0/go.mod h1:zcmtmQ1+YmQM9wrNsTGV/q/uyusom3P8RxwExxkZhjM= go.opentelemetry.io/otel v1.43.0 h1:mYIM03dnh5zfN7HautFE4ieIig9amkNANT+xcVxAj9I= go.opentelemetry.io/otel v1.43.0/go.mod h1:JuG+u74mvjvcm8vj8pI5XiHy1zDeoCS2LB1spIq7Ay0= -go.opentelemetry.io/otel/metric v1.38.0 h1:Kl6lzIYGAh5M159u9NgiRkmoMKjvbsKtYRwgfrA6WpA= -go.opentelemetry.io/otel/metric v1.38.0/go.mod h1:kB5n/QoRM8YwmUahxvI3bO34eVtQf2i4utNVLr9gEmI= go.opentelemetry.io/otel/metric v1.43.0 h1:d7638QeInOnuwOONPp4JAOGfbCEpYb+K6DVWvdxGzgM= go.opentelemetry.io/otel/metric v1.43.0/go.mod h1:RDnPtIxvqlgO8GRW18W6Z/4P462ldprJtfxHxyKd2PY= -go.opentelemetry.io/otel/trace v1.38.0 h1:Fxk5bKrDZJUH+AMyyIXGcFAPah0oRcT+LuNtJrmcNLE= -go.opentelemetry.io/otel/trace v1.38.0/go.mod h1:j1P9ivuFsTceSWe1oY+EeW3sc+Pp42sO++GHkg4wwhs= go.opentelemetry.io/otel/trace v1.43.0 h1:BkNrHpup+4k4w+ZZ86CZoHHEkohws8AY+WTX09nk+3A= go.opentelemetry.io/otel/trace v1.43.0/go.mod h1:/QJhyVBUUswCphDVxq+8mld+AvhXZLhe+8WVFxiFff0= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= -go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= -go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= go.uber.org/zap v1.27.1 h1:08RqriUEv8+ArZRYSTXy1LeBScaMpVSTBhCeaZYfMYc= go.uber.org/zap v1.27.1/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= -go.yaml.in/yaml/v2 v2.4.2 h1:DzmwEr2rDGHl7lsFgAHxmNz/1NlQ7xLIrlN2h5d1eGI= -go.yaml.in/yaml/v2 v2.4.2/go.mod h1:081UH+NErpNdqlCXm3TtEran0rJZGxAYx9hb/ELlsPU= go.yaml.in/yaml/v2 v2.4.4 h1:tuyd0P+2Ont/d6e2rl3be67goVK4R6deVxCUX5vyPaQ= go.yaml.in/yaml/v2 v2.4.4/go.mod h1:gMZqIpDtDqOfM0uNfy0SkpRhvUryYH0Z6wdMYcacYXQ= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.48.0 h1:/VRzVqiRSggnhY7gNRxPauEQ5Drw9haKdM0jqfcCFts= -golang.org/x/crypto v0.48.0/go.mod h1:r0kV5h3qnFPlQnBSrULhlsRfryS2pmewsg+XfMgkVos= -golang.org/x/crypto v0.49.0 h1:+Ng2ULVvLHnJ/ZFEq4KdcDd/cfjrrjjNSXNzxg0Y4U4= -golang.org/x/crypto v0.49.0/go.mod h1:ErX4dUh2UM+CFYiXZRTcMpEcN8b/1gxEuv3nODoYtCA= -golang.org/x/exp v0.0.0-20260218203240-3dfff04db8fa h1:Zt3DZoOFFYkKhDT3v7Lm9FDMEV06GpzjG2jrqW+QTE0= -golang.org/x/exp v0.0.0-20260218203240-3dfff04db8fa/go.mod h1:K79w1Vqn7PoiZn+TkNpx3BUWUQksGO3JcVX6qIjytmA= -golang.org/x/exp v0.0.0-20260312153236-7ab1446f8b90 h1:jiDhWWeC7jfWqR9c/uplMOqJ0sbNlNWv0UkzE0vX1MA= -golang.org/x/exp v0.0.0-20260312153236-7ab1446f8b90/go.mod h1:xE1HEv6b+1SCZ5/uscMRjUBKtIxworgEcEi+/n9NQDQ= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.33.0 h1:tHFzIWbBifEmbwtGz65eaWyGiGZatSrT9prnU8DbVL8= -golang.org/x/mod v0.33.0/go.mod h1:swjeQEj+6r7fODbD2cqrnje9PnziFuw4bmLbBZFrQ5w= -golang.org/x/mod v0.34.0 h1:xIHgNUUnW6sYkcM5Jleh05DvLOtwc6RitGHbDk4akRI= -golang.org/x/mod v0.34.0/go.mod h1:ykgH52iCZe79kzLLMhyCUzhMci+nQj+0XkbXpNYtVjY= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.50.0 h1:ucWh9eiCGyDR3vtzso0WMQinm2Dnt8cFMuQa9K33J60= -golang.org/x/net v0.50.0/go.mod h1:UgoSli3F/pBgdJBHCTc+tp3gmrU4XswgGRgtnwWTfyM= -golang.org/x/net v0.52.0 h1:He/TN1l0e4mmR3QqHMT2Xab3Aj3L9qjbhRm78/6jrW0= -golang.org/x/net v0.52.0/go.mod h1:R1MAz7uMZxVMualyPXb+VaqGSa3LIaUqk0eEt3w36Sw= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/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.19.0 h1:vV+1eWNmZ5geRlYjzm2adRgW2/mcpevXNg50YZtPCE4= -golang.org/x/sync v0.19.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= +go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= +golang.org/x/crypto v0.50.0 h1:zO47/JPrL6vsNkINmLoo/PH1gcxpls50DNogFvB5ZGI= +golang.org/x/crypto v0.50.0/go.mod h1:3muZ7vA7PBCE6xgPX7nkzzjiUq87kRItoJQM1Yo8S+Q= +golang.org/x/exp v0.0.0-20260410095643-746e56fc9e2f h1:W3F4c+6OLc6H2lb//N1q4WpJkhzJCK5J6kUi1NTVXfM= +golang.org/x/exp v0.0.0-20260410095643-746e56fc9e2f/go.mod h1:J1xhfL/vlindoeF/aINzNzt2Bket5bjo9sdOYzOsU80= +golang.org/x/mod v0.35.0 h1:Ww1D637e6Pg+Zb2KrWfHQUnH2dQRLBQyAtpr/haaJeM= +golang.org/x/mod v0.35.0/go.mod h1:+GwiRhIInF8wPm+4AoT6L0FA1QWAad3OMdTRx4tFYlU= +golang.org/x/net v0.53.0 h1:d+qAbo5L0orcWAr0a9JweQpjXF19LMXJE8Ey7hwOdUA= +golang.org/x/net v0.53.0/go.mod h1:JvMuJH7rrdiCfbeHoo3fCQU24Lf5JJwT9W3sJFulfgs= golang.org/x/sync v0.20.0 h1:e0PTpb7pjO8GAtTs2dQ6jYa5BWYlMuX047Dco/pItO4= golang.org/x/sync v0.20.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211103235746-7861aae1554b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.41.0 h1:Ivj+2Cp/ylzLiEU89QhWblYnOE9zerudt9Ftecq2C6k= -golang.org/x/sys v0.41.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= -golang.org/x/sys v0.42.0 h1:omrd2nAlyT5ESRdCLYdm3+fMfNFE/+Rf4bDIQImRJeo= -golang.org/x/sys v0.42.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.34.0 h1:oL/Qq0Kdaqxa1KbNeMKwQq0reLCCaFtqu2eNuSeNHbk= -golang.org/x/text v0.34.0/go.mod h1:homfLqTYRFyVYemLBFl5GgL/DWEiH5wcsQ5gSh1yziA= -golang.org/x/text v0.35.0 h1:JOVx6vVDFokkpaq1AEptVzLTpDe9KGpj5tR4/X+ybL8= -golang.org/x/text v0.35.0/go.mod h1:khi/HExzZJ2pGnjenulevKNX1W67CUy0AsXcNubPGCA= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.42.0 h1:uNgphsn75Tdz5Ji2q36v/nsFSfR/9BRFvqhGBaJGd5k= -golang.org/x/tools v0.42.0/go.mod h1:Ma6lCIwGZvHK6XtgbswSoWroEkhugApmsXyrUmBhfr0= -golang.org/x/tools v0.43.0 h1:12BdW9CeB3Z+J/I/wj34VMl8X+fEXBxVR90JeMX5E7s= -golang.org/x/tools v0.43.0/go.mod h1:uHkMso649BX2cZK6+RpuIPXS3ho2hZo4FVwfoy1vIk0= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/sys v0.43.0 h1:Rlag2XtaFTxp19wS8MXlJwTvoh8ArU6ezoyFsMyCTNI= +golang.org/x/sys v0.43.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= +golang.org/x/text v0.36.0 h1:JfKh3XmcRPqZPKevfXVpI1wXPTqbkE5f7JA92a55Yxg= +golang.org/x/text v0.36.0/go.mod h1:NIdBknypM8iqVmPiuco0Dh6P5Jcdk8lJL0CUebqK164= +golang.org/x/tools v0.44.0 h1:UP4ajHPIcuMjT1GqzDWRlalUEoY+uzoZKnhOjbIPD2c= +golang.org/x/tools v0.44.0/go.mod h1:KA0AfVErSdxRZIsOVipbv3rQhVXTnlU6UhKxHd1seDI= google.golang.org/genproto/googleapis/rpc v0.0.0-20260401024825-9d38bb4040a9 h1:m8qni9SQFH0tJc1X0vmnpw/0t+AImlSvp30sEupozUg= google.golang.org/genproto/googleapis/rpc v0.0.0-20260401024825-9d38bb4040a9/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= -google.golang.org/grpc v1.77.0 h1:wVVY6/8cGA6vvffn+wWK5ToddbgdU3d8MNENr4evgXM= -google.golang.org/grpc v1.77.0/go.mod h1:z0BY1iVj0q8E1uSQCjL9cppRj+gnZjzDnzV0dHhrNig= google.golang.org/grpc v1.80.0 h1:Xr6m2WmWZLETvUNvIUmeD5OAagMw3FiKmMlTdViWsHM= google.golang.org/grpc v1.80.0/go.mod h1:ho/dLnxwi3EDJA4Zghp7k2Ec1+c2jqup0bFkw07bwF4= google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= @@ -252,10 +155,7 @@ google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/pkg/api/cocoon_handlers.go b/pkg/api/cocoon_handlers.go index fb0eca4de..43af303cf 100644 --- a/pkg/api/cocoon_handlers.go +++ b/pkg/api/cocoon_handlers.go @@ -10,7 +10,7 @@ import ( "net/http" "github.com/go-faster/jx" - gocoon "github.com/tonkeeper/gocoon/pkg/client" + "github.com/tonkeeper/gocoon" "github.com/tonkeeper/opentonapi/pkg/oas" ) @@ -99,23 +99,41 @@ func (h *Handler) PostCocoonV1ChatCompletions(ctx context.Context, req jx.Raw) ( return &oas.PostCocoonV1ChatCompletionsNotImplemented{}, nil } body, model := mergeCocoonModelIntoBody(req, oas.OptString{}) - conn, err := h.cocoonPool.pick(ctx) - if err != nil { - return nil, toError(http.StatusInternalServerError, err) - } - const upstreamPath = "/v1/chat/completions" - respBody, err := conn.POST(ctx, model, upstreamPath, body) - if err != nil { - fmt.Println("cocoon error POST: ", err) - return nil, toError(http.StatusBadGateway, err) + const ( + cocoonV1ChatCompletionsRetries = 5 + upstreamPath = "/v1/chat/completions" + ) + var jsonBody []byte + var lastErr error + lastFailedPick := false + for attempt := 0; attempt < cocoonV1ChatCompletionsRetries; attempt++ { + conn, err := h.cocoonPool.pick(ctx) + if err != nil { + lastErr = err + lastFailedPick = true + fmt.Println("cocoon pick error: ", err) + continue + } + lastFailedPick = false + respBody, err := conn.POST(ctx, model, upstreamPath, body) + if err != nil { + lastErr = err + fmt.Println("cocoon error POST: ", err) + continue + } + jsonBody, err = cocoonResponseAsJSON(respBody) + if err != nil { + lastErr = err + fmt.Println("cocoon json error: ", err) + continue + } + ok := oas.PostCocoonV1ChatCompletionsOKApplicationJSON(jx.Raw(jsonBody)) + return &ok, nil } - jsonBody, err := cocoonResponseAsJSON(respBody) - if err != nil { - fmt.Println("cocoon json error: ", err) - return nil, toError(http.StatusBadGateway, err) + if lastFailedPick { + return nil, toError(http.StatusInternalServerError, lastErr) } - ok := oas.PostCocoonV1ChatCompletionsOKApplicationJSON(jx.Raw(jsonBody)) - return &ok, nil + return nil, toError(http.StatusBadGateway, lastErr) } func (h *Handler) GetCocoonWorkers(ctx context.Context) (oas.GetCocoonWorkersRes, error) { diff --git a/pkg/api/cocoon_pool.go b/pkg/api/cocoon_pool.go index 0be1db13f..b54dc7346 100644 --- a/pkg/api/cocoon_pool.go +++ b/pkg/api/cocoon_pool.go @@ -6,7 +6,7 @@ import ( "sync" "time" - gocoon "github.com/tonkeeper/gocoon/pkg/client" + "github.com/tonkeeper/gocoon" "go.uber.org/zap" ) From c3de149682ffb38f034677607944afed33961f41 Mon Sep 17 00:00:00 2001 From: Victoria E Date: Sat, 18 Apr 2026 13:08:10 +0300 Subject: [PATCH 08/11] retries --- pkg/api/cocoon_handlers.go | 41 +++++++++++++++++++++++++++----------- 1 file changed, 29 insertions(+), 12 deletions(-) diff --git a/pkg/api/cocoon_handlers.go b/pkg/api/cocoon_handlers.go index 43af303cf..80c5b1f2c 100644 --- a/pkg/api/cocoon_handlers.go +++ b/pkg/api/cocoon_handlers.go @@ -15,6 +15,11 @@ import ( "github.com/tonkeeper/opentonapi/pkg/oas" ) +const ( + cocoonPoolRetries = 5 + cocoonPoolMaxAttempts = 1 + cocoonPoolRetries +) + func cocoonResponseAsJSON(resp []byte) ([]byte, error) { if len(resp) == 0 { return nil, fmt.Errorf("empty cocoon response") @@ -99,14 +104,11 @@ func (h *Handler) PostCocoonV1ChatCompletions(ctx context.Context, req jx.Raw) ( return &oas.PostCocoonV1ChatCompletionsNotImplemented{}, nil } body, model := mergeCocoonModelIntoBody(req, oas.OptString{}) - const ( - cocoonV1ChatCompletionsRetries = 5 - upstreamPath = "/v1/chat/completions" - ) + const upstreamPath = "/v1/chat/completions" var jsonBody []byte var lastErr error lastFailedPick := false - for attempt := 0; attempt < cocoonV1ChatCompletionsRetries; attempt++ { + for attempt := 0; attempt < cocoonPoolMaxAttempts; attempt++ { conn, err := h.cocoonPool.pick(ctx) if err != nil { lastErr = err @@ -140,15 +142,30 @@ func (h *Handler) GetCocoonWorkers(ctx context.Context) (oas.GetCocoonWorkersRes if h.cocoonPool == nil { return &oas.GetCocoonWorkersNotImplemented{}, nil } - conn, err := h.cocoonPool.pick(ctx) - if err != nil { - return nil, toError(http.StatusInternalServerError, err) + var types []gocoon.WorkerType + var lastErr error + lastFailedPick := false + for attempt := 0; attempt < cocoonPoolMaxAttempts; attempt++ { + conn, err := h.cocoonPool.pick(ctx) + if err != nil { + lastErr = err + lastFailedPick = true + fmt.Println("cocoon pick error: ", err) + continue + } + lastFailedPick = false + types, err = conn.GetWorkerTypes(ctx) + if err != nil { + lastErr = err + fmt.Println("cocoon GetWorkerTypes error: ", err) + continue + } + return workerTypesToResponse(types), nil } - types, err := conn.GetWorkerTypes(ctx) - if err != nil { - return nil, toError(http.StatusBadGateway, err) + if lastFailedPick { + return nil, toError(http.StatusInternalServerError, lastErr) } - return workerTypesToResponse(types), nil + return nil, toError(http.StatusBadGateway, lastErr) } func workerTypesToResponse(types []gocoon.WorkerType) *oas.CocoonWorkersResponse { From 527d7d4cbc25c8d2fdfd6fe597dd535a61841c15 Mon Sep 17 00:00:00 2001 From: Victoria E Date: Sat, 18 Apr 2026 13:16:22 +0300 Subject: [PATCH 09/11] upd conn timeout --- pkg/api/cocoon_pool.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/api/cocoon_pool.go b/pkg/api/cocoon_pool.go index b54dc7346..6421213db 100644 --- a/pkg/api/cocoon_pool.go +++ b/pkg/api/cocoon_pool.go @@ -10,7 +10,7 @@ import ( "go.uber.org/zap" ) -const defaultCocoonPoolRefreshInterval = 30 * time.Second +const defaultCocoonPoolRefreshInterval = 5 * time.Minute type CocoonDialer interface { Connect(ctx context.Context, logger *zap.Logger) (*gocoon.Connection, error) From cd70c597b8554616635f387bd2680b98aa540c06 Mon Sep 17 00:00:00 2001 From: Alexander Hasselbach Date: Sat, 18 Apr 2026 13:36:09 +0300 Subject: [PATCH 10/11] update gocoon --- go.mod | 2 +- go.sum | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/go.mod b/go.mod index d7db229eb..8fdb352d8 100644 --- a/go.mod +++ b/go.mod @@ -24,7 +24,7 @@ require ( github.com/shopspring/decimal v1.4.0 github.com/sourcegraph/conc v0.3.0 github.com/stretchr/testify v1.11.1 - github.com/tonkeeper/gocoon v1.0.1 + github.com/tonkeeper/gocoon v1.0.3 github.com/tonkeeper/scam_backoffice_rules v0.0.11 github.com/tonkeeper/tongo v1.19.1-0.20260417135212-97ef83ef6640 go.opentelemetry.io/otel v1.43.0 diff --git a/go.sum b/go.sum index 45c610458..0414f702c 100644 --- a/go.sum +++ b/go.sum @@ -103,6 +103,10 @@ github.com/tonkeeper/gocoon v0.0.0-20260418091633-712b860c1b01 h1:nHpkyYsB29pgSf github.com/tonkeeper/gocoon v0.0.0-20260418091633-712b860c1b01/go.mod h1:VbjDK6sCA/fsbvdgGjMWs1Xt2hPehA3uP2MTPSY2Ag4= github.com/tonkeeper/gocoon v1.0.1 h1:h9LDzqwwNLJU8to7x89GaIUHuZ0jL40UpX9rJ2veZLU= github.com/tonkeeper/gocoon v1.0.1/go.mod h1:VbjDK6sCA/fsbvdgGjMWs1Xt2hPehA3uP2MTPSY2Ag4= +github.com/tonkeeper/gocoon v1.0.2 h1:rsV8VP0LsGhgdk/RV2vcnkKTEvSVF3NYqVuTFhZAKYg= +github.com/tonkeeper/gocoon v1.0.2/go.mod h1:VbjDK6sCA/fsbvdgGjMWs1Xt2hPehA3uP2MTPSY2Ag4= +github.com/tonkeeper/gocoon v1.0.3 h1:LZgxfnEBH4DSCKzFo5P2yznMzzeipWLqRgzumQ9CGfQ= +github.com/tonkeeper/gocoon v1.0.3/go.mod h1:VbjDK6sCA/fsbvdgGjMWs1Xt2hPehA3uP2MTPSY2Ag4= github.com/tonkeeper/scam_backoffice_rules v0.0.11 h1:VXbNNyTO49OArvQwPRCU+1WUEyfQgkqG7Q8NVhQ7320= github.com/tonkeeper/scam_backoffice_rules v0.0.11/go.mod h1:SqZXYO9vbID8ku+xnnaKXeNGmehxigODGrk5V1KqbRA= github.com/tonkeeper/tongo v1.19.1-0.20260417135212-97ef83ef6640 h1:U4npFMpt3aY4TZcM6v3+0OUxJvHMxo3j5WdAZydtaag= From da9867061b7d66befc182ce4cfb0b53ed23e79b8 Mon Sep 17 00:00:00 2001 From: Victoria E Date: Tue, 21 Apr 2026 21:45:18 +0300 Subject: [PATCH 11/11] bill for cocoon --- pkg/api/cocoon_handlers.go | 31 +++++++++++++++++++++++++++++++ pkg/api/handler.go | 9 +++++++++ pkg/api/interfaces.go | 4 ++++ 3 files changed, 44 insertions(+) diff --git a/pkg/api/cocoon_handlers.go b/pkg/api/cocoon_handlers.go index 80c5b1f2c..57a7f0ba6 100644 --- a/pkg/api/cocoon_handlers.go +++ b/pkg/api/cocoon_handlers.go @@ -11,6 +11,7 @@ import ( "github.com/go-faster/jx" "github.com/tonkeeper/gocoon" + "go.uber.org/zap" "github.com/tonkeeper/opentonapi/pkg/oas" ) @@ -77,6 +78,35 @@ func mergeCocoonModelIntoBody(req jx.Raw, modelQuery oas.OptString) (body []byte return body, model } +func parseCocoonChatCompletionUsage(body []byte) (tokens int64, cost int64, ok bool) { + var root struct { + Usage *struct { + TotalTokens int64 `json:"total_tokens"` + TotalCost int64 `json:"total_cost"` + } `json:"usage"` + } + if err := json.Unmarshal(body, &root); err != nil || root.Usage == nil { + return 0, 0, false + } + if root.Usage.TotalTokens <= 0 || root.Usage.TotalCost <= 0 { + return 0, 0, false + } + return root.Usage.TotalTokens, root.Usage.TotalCost, true +} + +func (h *Handler) recordCocoonChatCompletionUsage(ctx context.Context, jsonBody []byte) { + if h.tonConsole == nil { + return + } + tokens, cost, ok := parseCocoonChatCompletionUsage(jsonBody) + if !ok { + return + } + if err := h.tonConsole.CreateCocoonUsageEvent(ctx, tokens, cost); err != nil { + h.logger.Warn("cocoon usage event", zap.Error(err)) + } +} + func (h *Handler) PostCocoonQuery(ctx context.Context, req jx.Raw, params oas.PostCocoonQueryParams) (oas.PostCocoonQueryRes, error) { //if h.cocoonPool == nil { // return &oas.PostCocoonQueryNotImplemented{}, nil @@ -130,6 +160,7 @@ func (h *Handler) PostCocoonV1ChatCompletions(ctx context.Context, req jx.Raw) ( continue } ok := oas.PostCocoonV1ChatCompletionsOKApplicationJSON(jx.Raw(jsonBody)) + h.recordCocoonChatCompletionUsage(ctx, jsonBody) return &ok, nil } if lastFailedPick { diff --git a/pkg/api/handler.go b/pkg/api/handler.go index d1a0ed7f6..47016b3ba 100644 --- a/pkg/api/handler.go +++ b/pkg/api/handler.go @@ -75,6 +75,7 @@ type Handler struct { dns *dns.DNS // todo: update when blockchain config changes configPool *sync.Pool cocoonPool *CocoonPool + tonConsole TonConsole } func (h *Handler) NewError(ctx context.Context, err error) *oas.ErrorStatusCode { @@ -99,6 +100,7 @@ type Options struct { parallelTraceProcessing bool rewardsLiteServers []config.LiteServer cocoonPool *CocoonPool + tonConsole TonConsole } type Option func(o *Options) @@ -198,6 +200,12 @@ func WithCocoonPool(pool *CocoonPool) Option { } } +func WithTonConsole(w TonConsole) Option { + return func(o *Options) { + o.tonConsole = w + } +} + func NewHandler(logger *zap.Logger, opts ...Option) (*Handler, error) { options := &Options{} for _, o := range opts { @@ -296,6 +304,7 @@ func NewHandler(logger *zap.Logger, opts ...Option) (*Handler, error) { configPool: configPool, rewards: rwd, cocoonPool: options.cocoonPool, + tonConsole: options.tonConsole, }, nil } diff --git a/pkg/api/interfaces.go b/pkg/api/interfaces.go index 4e8529feb..1aea4c265 100644 --- a/pkg/api/interfaces.go +++ b/pkg/api/interfaces.go @@ -215,6 +215,10 @@ type verifierSource interface { GetAccountSource(accountID ton.AccountID) (verifier.Source, error) } +type TonConsole interface { + CreateCocoonUsageEvent(ctx context.Context, tokensSpent int64, totalCost int64) error +} + type metadataCache struct { collectionsCache cache.Cache[tongo.AccountID, tep64.Metadata] jettonsCache cache.Cache[tongo.AccountID, tep64.Metadata]