diff --git a/CHANGELOG.md b/CHANGELOG.md index 7ddb8151..d78892b0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -34,3 +34,6 @@ ### 2023-10-23 - `/v2/blockchain/blocks/{block_id}` returns a value flow from a block. +- +### 2023-10-28 +- `/v2/message/decode` decodes an ext in message. diff --git a/api/openapi.json b/api/openapi.json index f2e6b6ab..d7da7083 100644 --- a/api/openapi.json +++ b/api/openapi.json @@ -2457,6 +2457,157 @@ ], "type": "object" }, + "DecodedMessage": { + "properties": { + "destination": { + "$ref": "#/components/schemas/AccountAddress" + }, + "destination_wallet_version": { + "example": "v3R2", + "type": "string" + }, + "ext_in_msg_decoded": { + "properties": { + "wallet_highload_v2": { + "properties": { + "bounded_query_id": { + "example": "34254528475294857", + "type": "string" + }, + "raw_messages": { + "items": { + "$ref": "#/components/schemas/DecodedRawMessage" + }, + "type": "array" + }, + "subwallet_id": { + "example": 1, + "format": "uint32", + "type": "integer" + } + }, + "required": [ + "subwallet_id", + "bounded_query_id", + "raw_messages" + ], + "type": "object" + }, + "wallet_v3": { + "properties": { + "raw_messages": { + "items": { + "$ref": "#/components/schemas/DecodedRawMessage" + }, + "type": "array" + }, + "seqno": { + "example": 1, + "format": "uint32", + "type": "integer" + }, + "subwallet_id": { + "example": 1, + "format": "uint32", + "type": "integer" + }, + "valid_until": { + "example": 1, + "format": "uint32", + "type": "integer" + } + }, + "required": [ + "subwallet_id", + "valid_until", + "seqno", + "op", + "raw_messages" + ], + "type": "object" + }, + "wallet_v4": { + "properties": { + "op": { + "example": 1, + "format": "int8", + "type": "integer" + }, + "raw_messages": { + "items": { + "$ref": "#/components/schemas/DecodedRawMessage" + }, + "type": "array" + }, + "seqno": { + "example": 1, + "format": "uint32", + "type": "integer" + }, + "subwallet_id": { + "example": 1, + "format": "uint32", + "type": "integer" + }, + "valid_until": { + "example": 1, + "format": "uint32", + "type": "integer" + } + }, + "required": [ + "subwallet_id", + "valid_until", + "seqno", + "op", + "raw_messages" + ], + "type": "object" + } + }, + "type": "object" + } + }, + "required": [ + "destination", + "destination_wallet_version" + ], + "type": "object" + }, + "DecodedRawMessage": { + "properties": { + "message": { + "properties": { + "boc": { + "example": "te6ccgEBAQEABgAACCiAmCMBAgEABwA=", + "type": "string" + }, + "decoded_body": {}, + "decoded_op_name": { + "example": "nft_transfer", + "type": "string" + }, + "op_code": { + "example": "0xdeadbeaf", + "type": "string" + } + }, + "required": [ + "boc" + ], + "type": "object" + }, + "mode": { + "example": 2, + "type": "integer" + } + }, + "required": [ + "message", + "mode" + ], + "type": "object" + }, "DepositStakeAction": { "description": "validator's participation in elections", "properties": { @@ -7668,6 +7819,33 @@ ] } }, + "/v2/message/decode": { + "post": { + "description": "Decode a given message. Only external incoming messages can be decoded currently.", + "operationId": "decodeMessage", + "requestBody": { + "$ref": "#/components/requestBodies/Boc" + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DecodedMessage" + } + } + }, + "description": "decoded message" + }, + "default": { + "$ref": "#/components/responses/Error" + } + }, + "tags": [ + "Emulation" + ] + } + }, "/v2/nfts/_bulk": { "post": { "description": "Get NFT items by their addresses", diff --git a/api/openapi.yml b/api/openapi.yml index aa81a9f6..b8030bb9 100644 --- a/api/openapi.yml +++ b/api/openapi.yml @@ -303,6 +303,23 @@ paths: $ref: '#/components/schemas/BlockchainAccountInspect' 'default': $ref: '#/components/responses/Error' + /v2/message/decode: + post: + description: Decode a given message. Only external incoming messages can be decoded currently. + operationId: decodeMessage + tags: + - Emulation + requestBody: + $ref: "#/components/requestBodies/Boc" + responses: + '200': + description: decoded message + content: + application/json: + schema: + $ref: '#/components/schemas/DecodedMessage' + 'default': + $ref: '#/components/responses/Error' /v2/address/{account_id}/parse: get: description: parse address and display in all formats @@ -5421,6 +5438,116 @@ components: $ref: '#/components/schemas/AccountAddress' jetton: $ref: '#/components/schemas/JettonPreview' + DecodedMessage: + type: object + required: + - destination + - destination_wallet_version + properties: + destination: + $ref: '#/components/schemas/AccountAddress' + destination_wallet_version: + type: string + example: "v3R2" + ext_in_msg_decoded: + type: object + properties: + wallet_v3: + type: object + required: + - subwallet_id + - valid_until + - seqno + - op + - raw_messages + properties: + subwallet_id: + type: integer + format: uint32 + example: 1 + valid_until: + type: integer + format: uint32 + example: 1 + seqno: + type: integer + format: uint32 + example: 1 + raw_messages: + type: array + items: + $ref: '#/components/schemas/DecodedRawMessage' + wallet_v4: + type: object + required: + - subwallet_id + - valid_until + - seqno + - op + - raw_messages + properties: + subwallet_id: + type: integer + format: uint32 + example: 1 + valid_until: + type: integer + format: uint32 + example: 1 + seqno: + type: integer + format: uint32 + example: 1 + op: + type: integer + format: int8 + example: 1 + raw_messages: + type: array + items: + $ref: '#/components/schemas/DecodedRawMessage' + wallet_highload_v2: + type: object + required: + - subwallet_id + - bounded_query_id + - raw_messages + properties: + subwallet_id: + type: integer + format: uint32 + example: 1 + bounded_query_id: + type: string + example: "34254528475294857" + raw_messages: + type: array + items: + $ref: '#/components/schemas/DecodedRawMessage' + DecodedRawMessage: + type: object + required: + - message + - mode + properties: + message: + type: object + required: + - boc + properties: + boc: + type: string + example: "te6ccgEBAQEABgAACCiAmCMBAgEABwA=" + decoded_op_name: + type: string + example: "nft_transfer" + op_code: + type: string + example: "0xdeadbeaf" + decoded_body: { } # Free-form JSON value + mode: + type: integer + example: 2 Event: type: object required: diff --git a/go.mod b/go.mod index ab702954..e81af141 100644 --- a/go.mod +++ b/go.mod @@ -22,7 +22,7 @@ require ( github.com/sourcegraph/conc v0.3.0 github.com/stretchr/testify v1.8.4 github.com/tonkeeper/scam_backoffice_rules v0.0.0-20231030143526-f717a9954e0a - github.com/tonkeeper/tongo v1.4.2-0.20231123114202-e8c3d9033f8f + github.com/tonkeeper/tongo v1.4.2-0.20231128140346-1d139dc95f4e go.opentelemetry.io/otel v1.19.0 go.opentelemetry.io/otel/metric v1.19.0 go.opentelemetry.io/otel/trace v1.19.0 diff --git a/go.sum b/go.sum index ca958271..0fbbfb71 100644 --- a/go.sum +++ b/go.sum @@ -264,8 +264,8 @@ github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcU github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/tonkeeper/scam_backoffice_rules v0.0.0-20231030143526-f717a9954e0a h1:yYAU4WwiNTi4Xddyids0ByjudmDELHtO+wAFTYnFXJU= github.com/tonkeeper/scam_backoffice_rules v0.0.0-20231030143526-f717a9954e0a/go.mod h1:SqZXYO9vbID8ku+xnnaKXeNGmehxigODGrk5V1KqbRA= -github.com/tonkeeper/tongo v1.4.2-0.20231123114202-e8c3d9033f8f h1:X4f9DsGTm2zrz5GoctPhPaYkylfsUgLfFkLYH3r724E= -github.com/tonkeeper/tongo v1.4.2-0.20231123114202-e8c3d9033f8f/go.mod h1:LdOBjpUz6vLp1EdX3E0XLNks9YI5XMSqaQahfOMrBEY= +github.com/tonkeeper/tongo v1.4.2-0.20231128140346-1d139dc95f4e h1:BDOzx0FAe/IX4T+HkeMTuOnPT4LAD6qumrcU111uDbQ= +github.com/tonkeeper/tongo v1.4.2-0.20231128140346-1d139dc95f4e/go.mod h1:LdOBjpUz6vLp1EdX3E0XLNks9YI5XMSqaQahfOMrBEY= 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/decode_message.go b/pkg/api/decode_message.go new file mode 100644 index 00000000..29e18544 --- /dev/null +++ b/pkg/api/decode_message.go @@ -0,0 +1,165 @@ +package api + +import ( + "context" + "encoding/base64" + "encoding/binary" + "encoding/hex" + "encoding/json" + "fmt" + "net/http" + + "github.com/tonkeeper/opentonapi/internal/g" + "github.com/tonkeeper/tongo/abi" + "github.com/tonkeeper/tongo/boc" + "github.com/tonkeeper/tongo/liteapi" + "github.com/tonkeeper/tongo/tlb" + tongoWallet "github.com/tonkeeper/tongo/wallet" + + "github.com/tonkeeper/opentonapi/pkg/oas" +) + +func convertToRawMessage(message tongoWallet.RawMessage) (oas.DecodedRawMessage, error) { + msg := message.Message + msgBoc, err := msg.ToBocString() + if err != nil { + return oas.DecodedRawMessage{}, err + } + payload := oas.DecodedRawMessage{ + Message: oas.DecodedRawMessageMessage{ + Boc: msgBoc, + }, + Mode: int(message.Mode), + } + msg.ResetCounters() + var m tlb.Message + if err := tlb.Unmarshal(msg, &m); err != nil { + return oas.DecodedRawMessage{}, err + } + msgBody := boc.Cell(m.Body.Value) + if msgBody.BitsAvailableForRead() >= 32 { + opcode, err := msgBody.ReadUint(32) + if err != nil { + return payload, err + } + opcodeStr := oas.NewOptString("0x" + hex.EncodeToString(binary.BigEndian.AppendUint32(nil, uint32(opcode)))) + payload.Message.SetOpCode(opcodeStr) + } + msgBody.ResetCounters() + opname, value, err := abi.MessageDecoder(&msgBody) + if err != nil { + return payload, nil + } + payload.Message.SetDecodedOpName(oas.NewOptString(opname)) + body, err := json.Marshal(value) + if err != nil { + return oas.DecodedRawMessage{}, err + } + payload.Message.SetDecodedBody(g.ChangeJsonKeys(body, g.CamelToSnake)) + return payload, nil +} + +func (h *Handler) DecodeMessage(ctx context.Context, req *oas.DecodeMessageReq) (*oas.DecodedMessage, error) { + payloadBytes, err := base64.StdEncoding.DecodeString(req.Boc) + if err != nil { + return nil, toError(http.StatusBadRequest, err) + } + msg, err := liteapi.ConvertSendMessagePayloadToMessage(payloadBytes) + if err != nil { + return nil, toError(http.StatusBadRequest, err) + } + accountID, err := extractDestinationWallet(*msg) + if err != nil { + return nil, toError(http.StatusBadRequest, err) + } + account, err := h.storage.GetAccountState(ctx, *accountID) + if err != nil { + return nil, toError(http.StatusInternalServerError, err) + } + ver, ok, err := tongoWallet.GetWalletVersion(account, *msg) + if err != nil { + return nil, toError(http.StatusBadRequest, err) + } + if !ok { + return nil, toError(http.StatusBadRequest, fmt.Errorf("not a wallet")) + } + msgCell := boc.NewCell() + if err := tlb.Marshal(msgCell, msg); err != nil { + return nil, toError(http.StatusInternalServerError, err) + } + decoded := oas.DecodedMessage{ + Destination: convertAccountAddress(*accountID, h.addressBook), + DestinationWalletVersion: ver.ToString(), + } + switch ver { + case tongoWallet.V4R1, tongoWallet.V4R2: + v4, err := tongoWallet.DecodeMessageV4(msgCell) + if err != nil { + return nil, err + } + rawMessages := make([]oas.DecodedRawMessage, 0, len(v4.RawMessages)) + for _, msg := range v4.RawMessages { + rawMsg, err := convertToRawMessage(msg) + if err != nil { + return nil, toError(http.StatusInternalServerError, err) + } + rawMessages = append(rawMessages, rawMsg) + } + extIn := oas.DecodedMessageExtInMsgDecoded{ + WalletV4: oas.NewOptDecodedMessageExtInMsgDecodedWalletV4(oas.DecodedMessageExtInMsgDecodedWalletV4{ + SubwalletID: v4.SubWalletId, + ValidUntil: v4.ValidUntil, + Seqno: v4.Seqno, + Op: v4.Op, + RawMessages: rawMessages, + }), + } + decoded.SetExtInMsgDecoded(oas.NewOptDecodedMessageExtInMsgDecoded(extIn)) + case tongoWallet.V3R1, tongoWallet.V3R2: + v3, err := tongoWallet.DecodeMessageV3(msgCell) + if err != nil { + return nil, err + } + rawMessages := make([]oas.DecodedRawMessage, 0, len(v3.RawMessages)) + for _, msg := range v3.RawMessages { + rawMsg, err := convertToRawMessage(msg) + if err != nil { + return nil, toError(http.StatusInternalServerError, err) + } + rawMessages = append(rawMessages, rawMsg) + } + extIn := oas.DecodedMessageExtInMsgDecoded{ + WalletV3: oas.NewOptDecodedMessageExtInMsgDecodedWalletV3(oas.DecodedMessageExtInMsgDecodedWalletV3{ + SubwalletID: v3.SubWalletId, + ValidUntil: v3.ValidUntil, + Seqno: v3.Seqno, + RawMessages: rawMessages, + }), + } + decoded.SetExtInMsgDecoded(oas.NewOptDecodedMessageExtInMsgDecoded(extIn)) + case tongoWallet.HighLoadV2R2, tongoWallet.HighLoadV2R1: + highload, err := tongoWallet.DecodeHighloadV2Message(msgCell) + if err != nil { + return nil, err + } + rawMessages := make([]oas.DecodedRawMessage, 0, len(highload.RawMessages)) + for _, msg := range highload.RawMessages { + rawMsg, err := convertToRawMessage(msg) + if err != nil { + return nil, toError(http.StatusInternalServerError, err) + } + rawMessages = append(rawMessages, rawMsg) + } + extIn := oas.DecodedMessageExtInMsgDecoded{ + WalletHighloadV2: oas.NewOptDecodedMessageExtInMsgDecodedWalletHighloadV2(oas.DecodedMessageExtInMsgDecodedWalletHighloadV2{ + SubwalletID: highload.SubWalletId, + BoundedQueryID: fmt.Sprintf("%d", highload.BoundedQueryID), + RawMessages: rawMessages, + }), + } + decoded.SetExtInMsgDecoded(oas.NewOptDecodedMessageExtInMsgDecoded(extIn)) + default: + return nil, toError(http.StatusBadRequest, fmt.Errorf("wallet version '%v' is not supported", ver)) + } + return &decoded, nil +} diff --git a/pkg/api/decode_message_test.go b/pkg/api/decode_message_test.go new file mode 100644 index 00000000..b2d29e05 --- /dev/null +++ b/pkg/api/decode_message_test.go @@ -0,0 +1,51 @@ +package api + +import ( + "context" + "fmt" + "testing" + + "github.com/stretchr/testify/require" + "github.com/tonkeeper/opentonapi/pkg/litestorage" + "github.com/tonkeeper/opentonapi/pkg/oas" + pkgTesting "github.com/tonkeeper/opentonapi/pkg/testing" + "go.uber.org/zap" +) + +func TestHandler_DecodeMessage(t *testing.T) { + tests := []struct { + name string + boc string + filenamePrefix string + wantErr string + }{ + { + name: "v4", + boc: "te6ccgECAwEAAQwAAeGIANmaZLULGG8tJ/XFeVVjhSDQY0nCFNh3aJ3RbCt5Q6RAAkDURMAlnNzb/CuopC2Ojq8jeHSH4miO3bRzGsp0U1lIecu5Fig1ZRTXEABj+/ahUiCdLf9wXtu7j27v6e/r+FlNTRi7KtlbkAAAB4gAHAEB1WIACKhajFkxNWqMTPzEQ/xBJbgDKisir7/xQJ+Ak0zSAw+hOV62UAAAAAAAAAAAAAAAAAAPin6lAAvzZd2mp+5BkqBgqADvO5kConGyoByJOKUjz+JOcYR6rramIAAe1Ep3rA5wnBA4B0MDAgBP/Pnlj4AClYDlisUiRlr5snu9gkBGuLy568QE/pN3i1RO3LpEmwSO/Q==", + filenamePrefix: "decode-message-v4", + }, + { + name: "highload", + boc: "te6ccgECCQEAAUMAAUWIAbeTPaOhIeFpX00pVBankGP2F/kaObq5EAdGLvI+omE+DAEBmXzKceTPz+weyz8nYZbOkpsBYbvy6gN7h38ZVL6RTqln7XbUzHkQqxRp1B1ZYkBgMW1NtE7r8Jwg26HcS3qPiwYAAYiUZMJyTpfTrVXAAgIFngACAwQBAwDgBQEDAOAHAWJCADZmmS1CxhvLSf1xXlVY4Ug0GNJwhTYd2id0WwreUOkQCKAAAAAAAAAAAAAAAAABBgBQAAAAADcwMzBhYzQ2LWI5NWMtNDRjNy04ZDdiLTYxMjMyNmU2ZTUxMgFiQgA2ZpktQsYby0n9cV5VWOFINBjScIU2HdondFsK3lDpEAlAAAAAAAAAAAAAAAAAAQgAUAAAAAAzYjA2OTU1YS03YjRjLTQ1YWEtOTVlNy0wNTI4ZWZhYjAyM2E=", + filenamePrefix: "decode-message-highload-v2", + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + logger, _ := zap.NewDevelopment() + liteStorage, err := litestorage.NewLiteStorage(logger) + require.Nil(t, err) + h, err := NewHandler(logger, WithStorage(liteStorage), WithExecutor(liteStorage)) + require.Nil(t, err) + + response, err := h.DecodeMessage(context.Background(), &oas.DecodeMessageReq{Boc: tt.boc}) + if len(tt.wantErr) > 0 { + require.EqualError(t, err, tt.wantErr) + return + } + require.Nil(t, err) + fmt.Printf("response: %v\n", response) + pkgTesting.CompareResults(t, response, tt.filenamePrefix) + }) + } +} diff --git a/pkg/api/testdata/decode-message-highload-v2.json b/pkg/api/testdata/decode-message-highload-v2.json new file mode 100644 index 00000000..4ebc72b6 --- /dev/null +++ b/pkg/api/testdata/decode-message-highload-v2.json @@ -0,0 +1,38 @@ +{ + "destination": { + "address": "0:dbc99ed1d090f0b4afa694aa0b53c831fb0bfc8d1cdd5c8803a317791f51309f", + "is_scam": false, + "is_wallet": false + }, + "destination_wallet_version": "highload_v2R2", + "ext_in_msg_decoded": { + "wallet_highload_v2": { + "subwallet_id": 100500, + "bounded_query_id": "7260491231154908501", + "raw_messages": [ + { + "message": { + "boc": "b5ee9c7201010201005e00016242003666992d42c61bcb49fd715e5558e1483418d27085361dda27745b0ade50e91008a0000000000000000000000000010100500000000037303330616334362d623935632d343463372d386437622d363132333236653665353132", + "decoded_op_name": "TextComment", + "op_code": "0x00000000", + "decoded_body": { + "text": "7030ac46-b95c-44c7-8d7b-612326e6e512" + } + }, + "mode": 3 + }, + { + "message": { + "boc": "b5ee9c7201010201005e00016242003666992d42c61bcb49fd715e5558e1483418d27085361dda27745b0ade50e9100940000000000000000000000000010100500000000033623036393535612d376234632d343561612d393565372d303532386566616230323361", + "decoded_op_name": "TextComment", + "op_code": "0x00000000", + "decoded_body": { + "text": "3b06955a-7b4c-45aa-95e7-0528efab023a" + } + }, + "mode": 3 + } + ] + } + } + } \ No newline at end of file diff --git a/pkg/api/testdata/decode-message-v4.json b/pkg/api/testdata/decode-message-v4.json new file mode 100644 index 00000000..2f0da276 --- /dev/null +++ b/pkg/api/testdata/decode-message-v4.json @@ -0,0 +1,45 @@ +{ + "destination": { + "address": "0:6ccd325a858c379693fae2bcaab1c2906831a4e10a6c3bb44ee8b615bca1d220", + "is_scam": false, + "is_wallet": false + }, + "destination_wallet_version": "v4R2", + "ext_in_msg_decoded": { + "wallet_v4": { + "subwallet_id": 698983191, + "valid_until": 1700473714, + "seqno": 241, + "op": 0, + "raw_messages": [ + { + "message": { + "boc": "b5ee9c720101020100980001d5620008a85a8c5931356a8c4cfcc443fc4125b8032a2b22afbff1409f80934cd2030fa1395eb650000000000000000000000000000f8a7ea5000bf365dda6a7ee4192a060a800ef3b9902a271b2a01c8938a523cfe24e71847aaeb6a620001ed44a77ac0e709c103807430301004ffcf9e58f80029580e58ac522465af9b27bbd824046b8bcb9ebc404fe93778b544edcba449b048efd", + "decoded_op_name": "JettonTransfer", + "op_code": "0x0f8a7ea5", + "decoded_body": { + "query_id": 3363843579750382, + "amount": "422184458", + "destination": "0:779dcc815138d9500e449c5291e7f12738c23d575b5310000f6a253bd607384e", + "response_destination": "", + "custom_payload": null, + "forward_ton_amount": "235000000", + "forward_payload": { + "is_right": true, + "value": { + "sum_type": "StonfiProvideLiquidity", + "op_code": 4244235663, + "value": { + "token_wallet": "0:14ac072c56291232d7cd93ddec120235c5e5cf5e2027f49bbc5aa276e5d224d8", + "min_lp_out": "18302" + } + } + } + } + }, + "mode": 3 + } + ] + } + } + } \ No newline at end of file diff --git a/pkg/oas/oas_handlers_gen.go b/pkg/oas/oas_handlers_gen.go index f0b89473..947fc9a9 100644 --- a/pkg/oas/oas_handlers_gen.go +++ b/pkg/oas/oas_handlers_gen.go @@ -371,6 +371,123 @@ func (s *Server) handleBlockchainAccountInspectRequest(args [1]string, argsEscap } } +// handleDecodeMessageRequest handles decodeMessage operation. +// +// Decode a given message. Only external incoming messages can be decoded currently. +// +// POST /v2/message/decode +func (s *Server) handleDecodeMessageRequest(args [0]string, argsEscaped bool, w http.ResponseWriter, r *http.Request) { + otelAttrs := []attribute.KeyValue{ + otelogen.OperationID("decodeMessage"), + semconv.HTTPMethodKey.String("POST"), + semconv.HTTPRouteKey.String("/v2/message/decode"), + } + + // Start a span for this request. + ctx, span := s.cfg.Tracer.Start(r.Context(), "DecodeMessage", + trace.WithAttributes(otelAttrs...), + serverSpanKind, + ) + defer span.End() + + // Run stopwatch. + startTime := time.Now() + defer func() { + elapsedDuration := time.Since(startTime) + // Use floating point division here for higher precision (instead of Millisecond method). + s.duration.Record(ctx, float64(float64(elapsedDuration)/float64(time.Millisecond)), metric.WithAttributes(otelAttrs...)) + }() + + // Increment request counter. + s.requests.Add(ctx, 1, metric.WithAttributes(otelAttrs...)) + + var ( + recordError = func(stage string, err error) { + span.RecordError(err) + span.SetStatus(codes.Error, stage) + s.errors.Add(ctx, 1, metric.WithAttributes(otelAttrs...)) + } + err error + opErrContext = ogenerrors.OperationContext{ + Name: "DecodeMessage", + ID: "decodeMessage", + } + ) + request, close, err := s.decodeDecodeMessageRequest(r) + if err != nil { + err = &ogenerrors.DecodeRequestError{ + OperationContext: opErrContext, + Err: err, + } + recordError("DecodeRequest", err) + s.cfg.ErrorHandler(ctx, w, r, err) + return + } + defer func() { + if err := close(); err != nil { + recordError("CloseRequest", err) + } + }() + + var response *DecodedMessage + if m := s.cfg.Middleware; m != nil { + mreq := middleware.Request{ + Context: ctx, + OperationName: "DecodeMessage", + OperationSummary: "", + OperationID: "decodeMessage", + Body: request, + Params: middleware.Parameters{}, + Raw: r, + } + + type ( + Request = *DecodeMessageReq + Params = struct{} + Response = *DecodedMessage + ) + 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.DecodeMessage(ctx, request) + return response, err + }, + ) + } else { + response, err = s.h.DecodeMessage(ctx, request) + } + if err != nil { + if errRes, ok := errors.Into[*ErrorStatusCode](err); ok { + if err := encodeErrorResponse(errRes, w, span); err != nil { + 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 { + recordError("Internal", err) + } + return + } + + if err := encodeDecodeMessageResponse(response, w, span); err != nil { + recordError("EncodeResponse", err) + if !errors.Is(err, ht.ErrInternalServerErrorResponse) { + s.cfg.ErrorHandler(ctx, w, r, err) + } + return + } +} + // handleDnsResolveRequest handles dnsResolve operation. // // DNS resolve for domain name. diff --git a/pkg/oas/oas_json_gen.go b/pkg/oas/oas_json_gen.go index edc15112..53e4dbb0 100644 --- a/pkg/oas/oas_json_gen.go +++ b/pkg/oas/oas_json_gen.go @@ -11229,6 +11229,1057 @@ func (s *CreditPhase) UnmarshalJSON(data []byte) error { return s.Decode(d) } +// Encode implements json.Marshaler. +func (s *DecodeMessageReq) Encode(e *jx.Encoder) { + e.ObjStart() + s.encodeFields(e) + e.ObjEnd() +} + +// encodeFields encodes fields. +func (s *DecodeMessageReq) encodeFields(e *jx.Encoder) { + { + e.FieldStart("boc") + e.Str(s.Boc) + } +} + +var jsonFieldsNameOfDecodeMessageReq = [1]string{ + 0: "boc", +} + +// Decode decodes DecodeMessageReq from json. +func (s *DecodeMessageReq) Decode(d *jx.Decoder) error { + if s == nil { + return errors.New("invalid: unable to decode DecodeMessageReq to nil") + } + var requiredBitSet [1]uint8 + + if err := d.ObjBytes(func(d *jx.Decoder, k []byte) error { + switch string(k) { + case "boc": + requiredBitSet[0] |= 1 << 0 + if err := func() error { + v, err := d.Str() + s.Boc = string(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"boc\"") + } + default: + return d.Skip() + } + return nil + }); err != nil { + return errors.Wrap(err, "decode DecodeMessageReq") + } + // 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(jsonFieldsNameOfDecodeMessageReq) { + name = jsonFieldsNameOfDecodeMessageReq[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 *DecodeMessageReq) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *DecodeMessageReq) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + +// Encode implements json.Marshaler. +func (s *DecodedMessage) Encode(e *jx.Encoder) { + e.ObjStart() + s.encodeFields(e) + e.ObjEnd() +} + +// encodeFields encodes fields. +func (s *DecodedMessage) encodeFields(e *jx.Encoder) { + { + e.FieldStart("destination") + s.Destination.Encode(e) + } + { + e.FieldStart("destination_wallet_version") + e.Str(s.DestinationWalletVersion) + } + { + if s.ExtInMsgDecoded.Set { + e.FieldStart("ext_in_msg_decoded") + s.ExtInMsgDecoded.Encode(e) + } + } +} + +var jsonFieldsNameOfDecodedMessage = [3]string{ + 0: "destination", + 1: "destination_wallet_version", + 2: "ext_in_msg_decoded", +} + +// Decode decodes DecodedMessage from json. +func (s *DecodedMessage) Decode(d *jx.Decoder) error { + if s == nil { + return errors.New("invalid: unable to decode DecodedMessage to nil") + } + var requiredBitSet [1]uint8 + + if err := d.ObjBytes(func(d *jx.Decoder, k []byte) error { + switch string(k) { + case "destination": + requiredBitSet[0] |= 1 << 0 + if err := func() error { + if err := s.Destination.Decode(d); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"destination\"") + } + case "destination_wallet_version": + requiredBitSet[0] |= 1 << 1 + if err := func() error { + v, err := d.Str() + s.DestinationWalletVersion = string(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"destination_wallet_version\"") + } + case "ext_in_msg_decoded": + if err := func() error { + s.ExtInMsgDecoded.Reset() + if err := s.ExtInMsgDecoded.Decode(d); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"ext_in_msg_decoded\"") + } + default: + return d.Skip() + } + return nil + }); err != nil { + return errors.Wrap(err, "decode DecodedMessage") + } + // 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(jsonFieldsNameOfDecodedMessage) { + name = jsonFieldsNameOfDecodedMessage[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 *DecodedMessage) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *DecodedMessage) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + +// Encode implements json.Marshaler. +func (s *DecodedMessageExtInMsgDecoded) Encode(e *jx.Encoder) { + e.ObjStart() + s.encodeFields(e) + e.ObjEnd() +} + +// encodeFields encodes fields. +func (s *DecodedMessageExtInMsgDecoded) encodeFields(e *jx.Encoder) { + { + if s.WalletV3.Set { + e.FieldStart("wallet_v3") + s.WalletV3.Encode(e) + } + } + { + if s.WalletV4.Set { + e.FieldStart("wallet_v4") + s.WalletV4.Encode(e) + } + } + { + if s.WalletHighloadV2.Set { + e.FieldStart("wallet_highload_v2") + s.WalletHighloadV2.Encode(e) + } + } +} + +var jsonFieldsNameOfDecodedMessageExtInMsgDecoded = [3]string{ + 0: "wallet_v3", + 1: "wallet_v4", + 2: "wallet_highload_v2", +} + +// Decode decodes DecodedMessageExtInMsgDecoded from json. +func (s *DecodedMessageExtInMsgDecoded) Decode(d *jx.Decoder) error { + if s == nil { + return errors.New("invalid: unable to decode DecodedMessageExtInMsgDecoded to nil") + } + + if err := d.ObjBytes(func(d *jx.Decoder, k []byte) error { + switch string(k) { + case "wallet_v3": + if err := func() error { + s.WalletV3.Reset() + if err := s.WalletV3.Decode(d); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"wallet_v3\"") + } + case "wallet_v4": + if err := func() error { + s.WalletV4.Reset() + if err := s.WalletV4.Decode(d); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"wallet_v4\"") + } + case "wallet_highload_v2": + if err := func() error { + s.WalletHighloadV2.Reset() + if err := s.WalletHighloadV2.Decode(d); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"wallet_highload_v2\"") + } + default: + return d.Skip() + } + return nil + }); err != nil { + return errors.Wrap(err, "decode DecodedMessageExtInMsgDecoded") + } + + return nil +} + +// MarshalJSON implements stdjson.Marshaler. +func (s *DecodedMessageExtInMsgDecoded) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *DecodedMessageExtInMsgDecoded) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + +// Encode implements json.Marshaler. +func (s *DecodedMessageExtInMsgDecodedWalletHighloadV2) Encode(e *jx.Encoder) { + e.ObjStart() + s.encodeFields(e) + e.ObjEnd() +} + +// encodeFields encodes fields. +func (s *DecodedMessageExtInMsgDecodedWalletHighloadV2) encodeFields(e *jx.Encoder) { + { + e.FieldStart("subwallet_id") + e.UInt32(s.SubwalletID) + } + { + e.FieldStart("bounded_query_id") + e.Str(s.BoundedQueryID) + } + { + e.FieldStart("raw_messages") + e.ArrStart() + for _, elem := range s.RawMessages { + elem.Encode(e) + } + e.ArrEnd() + } +} + +var jsonFieldsNameOfDecodedMessageExtInMsgDecodedWalletHighloadV2 = [3]string{ + 0: "subwallet_id", + 1: "bounded_query_id", + 2: "raw_messages", +} + +// Decode decodes DecodedMessageExtInMsgDecodedWalletHighloadV2 from json. +func (s *DecodedMessageExtInMsgDecodedWalletHighloadV2) Decode(d *jx.Decoder) error { + if s == nil { + return errors.New("invalid: unable to decode DecodedMessageExtInMsgDecodedWalletHighloadV2 to nil") + } + var requiredBitSet [1]uint8 + + if err := d.ObjBytes(func(d *jx.Decoder, k []byte) error { + switch string(k) { + case "subwallet_id": + requiredBitSet[0] |= 1 << 0 + if err := func() error { + v, err := d.UInt32() + s.SubwalletID = uint32(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"subwallet_id\"") + } + case "bounded_query_id": + requiredBitSet[0] |= 1 << 1 + if err := func() error { + v, err := d.Str() + s.BoundedQueryID = string(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"bounded_query_id\"") + } + case "raw_messages": + requiredBitSet[0] |= 1 << 2 + if err := func() error { + s.RawMessages = make([]DecodedRawMessage, 0) + if err := d.Arr(func(d *jx.Decoder) error { + var elem DecodedRawMessage + if err := elem.Decode(d); err != nil { + return err + } + s.RawMessages = append(s.RawMessages, elem) + return nil + }); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"raw_messages\"") + } + default: + return d.Skip() + } + return nil + }); err != nil { + return errors.Wrap(err, "decode DecodedMessageExtInMsgDecodedWalletHighloadV2") + } + // 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(jsonFieldsNameOfDecodedMessageExtInMsgDecodedWalletHighloadV2) { + name = jsonFieldsNameOfDecodedMessageExtInMsgDecodedWalletHighloadV2[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 *DecodedMessageExtInMsgDecodedWalletHighloadV2) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *DecodedMessageExtInMsgDecodedWalletHighloadV2) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + +// Encode implements json.Marshaler. +func (s *DecodedMessageExtInMsgDecodedWalletV3) Encode(e *jx.Encoder) { + e.ObjStart() + s.encodeFields(e) + e.ObjEnd() +} + +// encodeFields encodes fields. +func (s *DecodedMessageExtInMsgDecodedWalletV3) encodeFields(e *jx.Encoder) { + { + e.FieldStart("subwallet_id") + e.UInt32(s.SubwalletID) + } + { + e.FieldStart("valid_until") + e.UInt32(s.ValidUntil) + } + { + e.FieldStart("seqno") + e.UInt32(s.Seqno) + } + { + e.FieldStart("raw_messages") + e.ArrStart() + for _, elem := range s.RawMessages { + elem.Encode(e) + } + e.ArrEnd() + } +} + +var jsonFieldsNameOfDecodedMessageExtInMsgDecodedWalletV3 = [4]string{ + 0: "subwallet_id", + 1: "valid_until", + 2: "seqno", + 3: "raw_messages", +} + +// Decode decodes DecodedMessageExtInMsgDecodedWalletV3 from json. +func (s *DecodedMessageExtInMsgDecodedWalletV3) Decode(d *jx.Decoder) error { + if s == nil { + return errors.New("invalid: unable to decode DecodedMessageExtInMsgDecodedWalletV3 to nil") + } + var requiredBitSet [1]uint8 + + if err := d.ObjBytes(func(d *jx.Decoder, k []byte) error { + switch string(k) { + case "subwallet_id": + requiredBitSet[0] |= 1 << 0 + if err := func() error { + v, err := d.UInt32() + s.SubwalletID = uint32(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"subwallet_id\"") + } + case "valid_until": + requiredBitSet[0] |= 1 << 1 + if err := func() error { + v, err := d.UInt32() + s.ValidUntil = uint32(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"valid_until\"") + } + case "seqno": + requiredBitSet[0] |= 1 << 2 + if err := func() error { + v, err := d.UInt32() + s.Seqno = uint32(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"seqno\"") + } + case "raw_messages": + requiredBitSet[0] |= 1 << 3 + if err := func() error { + s.RawMessages = make([]DecodedRawMessage, 0) + if err := d.Arr(func(d *jx.Decoder) error { + var elem DecodedRawMessage + if err := elem.Decode(d); err != nil { + return err + } + s.RawMessages = append(s.RawMessages, elem) + return nil + }); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"raw_messages\"") + } + default: + return d.Skip() + } + return nil + }); err != nil { + return errors.Wrap(err, "decode DecodedMessageExtInMsgDecodedWalletV3") + } + // Validate required fields. + var failures []validate.FieldError + for i, mask := range [1]uint8{ + 0b00001111, + } { + 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(jsonFieldsNameOfDecodedMessageExtInMsgDecodedWalletV3) { + name = jsonFieldsNameOfDecodedMessageExtInMsgDecodedWalletV3[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 *DecodedMessageExtInMsgDecodedWalletV3) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *DecodedMessageExtInMsgDecodedWalletV3) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + +// Encode implements json.Marshaler. +func (s *DecodedMessageExtInMsgDecodedWalletV4) Encode(e *jx.Encoder) { + e.ObjStart() + s.encodeFields(e) + e.ObjEnd() +} + +// encodeFields encodes fields. +func (s *DecodedMessageExtInMsgDecodedWalletV4) encodeFields(e *jx.Encoder) { + { + e.FieldStart("subwallet_id") + e.UInt32(s.SubwalletID) + } + { + e.FieldStart("valid_until") + e.UInt32(s.ValidUntil) + } + { + e.FieldStart("seqno") + e.UInt32(s.Seqno) + } + { + e.FieldStart("op") + e.Int8(s.Op) + } + { + e.FieldStart("raw_messages") + e.ArrStart() + for _, elem := range s.RawMessages { + elem.Encode(e) + } + e.ArrEnd() + } +} + +var jsonFieldsNameOfDecodedMessageExtInMsgDecodedWalletV4 = [5]string{ + 0: "subwallet_id", + 1: "valid_until", + 2: "seqno", + 3: "op", + 4: "raw_messages", +} + +// Decode decodes DecodedMessageExtInMsgDecodedWalletV4 from json. +func (s *DecodedMessageExtInMsgDecodedWalletV4) Decode(d *jx.Decoder) error { + if s == nil { + return errors.New("invalid: unable to decode DecodedMessageExtInMsgDecodedWalletV4 to nil") + } + var requiredBitSet [1]uint8 + + if err := d.ObjBytes(func(d *jx.Decoder, k []byte) error { + switch string(k) { + case "subwallet_id": + requiredBitSet[0] |= 1 << 0 + if err := func() error { + v, err := d.UInt32() + s.SubwalletID = uint32(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"subwallet_id\"") + } + case "valid_until": + requiredBitSet[0] |= 1 << 1 + if err := func() error { + v, err := d.UInt32() + s.ValidUntil = uint32(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"valid_until\"") + } + case "seqno": + requiredBitSet[0] |= 1 << 2 + if err := func() error { + v, err := d.UInt32() + s.Seqno = uint32(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"seqno\"") + } + case "op": + requiredBitSet[0] |= 1 << 3 + if err := func() error { + v, err := d.Int8() + s.Op = int8(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"op\"") + } + case "raw_messages": + requiredBitSet[0] |= 1 << 4 + if err := func() error { + s.RawMessages = make([]DecodedRawMessage, 0) + if err := d.Arr(func(d *jx.Decoder) error { + var elem DecodedRawMessage + if err := elem.Decode(d); err != nil { + return err + } + s.RawMessages = append(s.RawMessages, elem) + return nil + }); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"raw_messages\"") + } + default: + return d.Skip() + } + return nil + }); err != nil { + return errors.Wrap(err, "decode DecodedMessageExtInMsgDecodedWalletV4") + } + // Validate required fields. + var failures []validate.FieldError + for i, mask := range [1]uint8{ + 0b00011111, + } { + 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(jsonFieldsNameOfDecodedMessageExtInMsgDecodedWalletV4) { + name = jsonFieldsNameOfDecodedMessageExtInMsgDecodedWalletV4[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 *DecodedMessageExtInMsgDecodedWalletV4) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *DecodedMessageExtInMsgDecodedWalletV4) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + +// Encode implements json.Marshaler. +func (s *DecodedRawMessage) Encode(e *jx.Encoder) { + e.ObjStart() + s.encodeFields(e) + e.ObjEnd() +} + +// encodeFields encodes fields. +func (s *DecodedRawMessage) encodeFields(e *jx.Encoder) { + { + e.FieldStart("message") + s.Message.Encode(e) + } + { + e.FieldStart("mode") + e.Int(s.Mode) + } +} + +var jsonFieldsNameOfDecodedRawMessage = [2]string{ + 0: "message", + 1: "mode", +} + +// Decode decodes DecodedRawMessage from json. +func (s *DecodedRawMessage) Decode(d *jx.Decoder) error { + if s == nil { + return errors.New("invalid: unable to decode DecodedRawMessage to nil") + } + var requiredBitSet [1]uint8 + + if err := d.ObjBytes(func(d *jx.Decoder, k []byte) error { + switch string(k) { + case "message": + requiredBitSet[0] |= 1 << 0 + if err := func() error { + if err := s.Message.Decode(d); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"message\"") + } + case "mode": + requiredBitSet[0] |= 1 << 1 + if err := func() error { + v, err := d.Int() + s.Mode = int(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"mode\"") + } + default: + return d.Skip() + } + return nil + }); err != nil { + return errors.Wrap(err, "decode DecodedRawMessage") + } + // 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(jsonFieldsNameOfDecodedRawMessage) { + name = jsonFieldsNameOfDecodedRawMessage[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 *DecodedRawMessage) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *DecodedRawMessage) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + +// Encode implements json.Marshaler. +func (s *DecodedRawMessageMessage) Encode(e *jx.Encoder) { + e.ObjStart() + s.encodeFields(e) + e.ObjEnd() +} + +// encodeFields encodes fields. +func (s *DecodedRawMessageMessage) encodeFields(e *jx.Encoder) { + { + e.FieldStart("boc") + e.Str(s.Boc) + } + { + if s.DecodedOpName.Set { + e.FieldStart("decoded_op_name") + s.DecodedOpName.Encode(e) + } + } + { + if s.OpCode.Set { + e.FieldStart("op_code") + s.OpCode.Encode(e) + } + } + { + if len(s.DecodedBody) != 0 { + e.FieldStart("decoded_body") + e.Raw(s.DecodedBody) + } + } +} + +var jsonFieldsNameOfDecodedRawMessageMessage = [4]string{ + 0: "boc", + 1: "decoded_op_name", + 2: "op_code", + 3: "decoded_body", +} + +// Decode decodes DecodedRawMessageMessage from json. +func (s *DecodedRawMessageMessage) Decode(d *jx.Decoder) error { + if s == nil { + return errors.New("invalid: unable to decode DecodedRawMessageMessage to nil") + } + var requiredBitSet [1]uint8 + + if err := d.ObjBytes(func(d *jx.Decoder, k []byte) error { + switch string(k) { + case "boc": + requiredBitSet[0] |= 1 << 0 + if err := func() error { + v, err := d.Str() + s.Boc = string(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"boc\"") + } + case "decoded_op_name": + if err := func() error { + s.DecodedOpName.Reset() + if err := s.DecodedOpName.Decode(d); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"decoded_op_name\"") + } + case "op_code": + if err := func() error { + s.OpCode.Reset() + if err := s.OpCode.Decode(d); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"op_code\"") + } + case "decoded_body": + if err := func() error { + v, err := d.RawAppend(nil) + s.DecodedBody = jx.Raw(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"decoded_body\"") + } + default: + return d.Skip() + } + return nil + }); err != nil { + return errors.Wrap(err, "decode DecodedRawMessageMessage") + } + // 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(jsonFieldsNameOfDecodedRawMessageMessage) { + name = jsonFieldsNameOfDecodedRawMessageMessage[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 *DecodedRawMessageMessage) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *DecodedRawMessageMessage) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + // Encode implements json.Marshaler. func (s *DepositStakeAction) Encode(e *jx.Encoder) { e.ObjStart() @@ -25114,6 +26165,138 @@ func (s *OptCreditPhase) UnmarshalJSON(data []byte) error { return s.Decode(d) } +// Encode encodes DecodedMessageExtInMsgDecoded as json. +func (o OptDecodedMessageExtInMsgDecoded) Encode(e *jx.Encoder) { + if !o.Set { + return + } + o.Value.Encode(e) +} + +// Decode decodes DecodedMessageExtInMsgDecoded from json. +func (o *OptDecodedMessageExtInMsgDecoded) Decode(d *jx.Decoder) error { + if o == nil { + return errors.New("invalid: unable to decode OptDecodedMessageExtInMsgDecoded to nil") + } + o.Set = true + if err := o.Value.Decode(d); err != nil { + return err + } + return nil +} + +// MarshalJSON implements stdjson.Marshaler. +func (s OptDecodedMessageExtInMsgDecoded) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *OptDecodedMessageExtInMsgDecoded) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + +// Encode encodes DecodedMessageExtInMsgDecodedWalletHighloadV2 as json. +func (o OptDecodedMessageExtInMsgDecodedWalletHighloadV2) Encode(e *jx.Encoder) { + if !o.Set { + return + } + o.Value.Encode(e) +} + +// Decode decodes DecodedMessageExtInMsgDecodedWalletHighloadV2 from json. +func (o *OptDecodedMessageExtInMsgDecodedWalletHighloadV2) Decode(d *jx.Decoder) error { + if o == nil { + return errors.New("invalid: unable to decode OptDecodedMessageExtInMsgDecodedWalletHighloadV2 to nil") + } + o.Set = true + if err := o.Value.Decode(d); err != nil { + return err + } + return nil +} + +// MarshalJSON implements stdjson.Marshaler. +func (s OptDecodedMessageExtInMsgDecodedWalletHighloadV2) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *OptDecodedMessageExtInMsgDecodedWalletHighloadV2) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + +// Encode encodes DecodedMessageExtInMsgDecodedWalletV3 as json. +func (o OptDecodedMessageExtInMsgDecodedWalletV3) Encode(e *jx.Encoder) { + if !o.Set { + return + } + o.Value.Encode(e) +} + +// Decode decodes DecodedMessageExtInMsgDecodedWalletV3 from json. +func (o *OptDecodedMessageExtInMsgDecodedWalletV3) Decode(d *jx.Decoder) error { + if o == nil { + return errors.New("invalid: unable to decode OptDecodedMessageExtInMsgDecodedWalletV3 to nil") + } + o.Set = true + if err := o.Value.Decode(d); err != nil { + return err + } + return nil +} + +// MarshalJSON implements stdjson.Marshaler. +func (s OptDecodedMessageExtInMsgDecodedWalletV3) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *OptDecodedMessageExtInMsgDecodedWalletV3) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + +// Encode encodes DecodedMessageExtInMsgDecodedWalletV4 as json. +func (o OptDecodedMessageExtInMsgDecodedWalletV4) Encode(e *jx.Encoder) { + if !o.Set { + return + } + o.Value.Encode(e) +} + +// Decode decodes DecodedMessageExtInMsgDecodedWalletV4 from json. +func (o *OptDecodedMessageExtInMsgDecodedWalletV4) Decode(d *jx.Decoder) error { + if o == nil { + return errors.New("invalid: unable to decode OptDecodedMessageExtInMsgDecodedWalletV4 to nil") + } + o.Set = true + if err := o.Value.Decode(d); err != nil { + return err + } + return nil +} + +// MarshalJSON implements stdjson.Marshaler. +func (s OptDecodedMessageExtInMsgDecodedWalletV4) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *OptDecodedMessageExtInMsgDecodedWalletV4) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + // Encode encodes DepositStakeAction as json. func (o OptDepositStakeAction) Encode(e *jx.Encoder) { if !o.Set { diff --git a/pkg/oas/oas_request_decoders_gen.go b/pkg/oas/oas_request_decoders_gen.go index b3433493..6c3f397c 100644 --- a/pkg/oas/oas_request_decoders_gen.go +++ b/pkg/oas/oas_request_decoders_gen.go @@ -15,6 +15,69 @@ import ( "github.com/ogen-go/ogen/validate" ) +func (s *Server) decodeDecodeMessageRequest(r *http.Request) ( + req *DecodeMessageReq, + 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 = multierr.Append(merr, c()) + } + return merr + } + defer func() { + if rerr != nil { + rerr = multierr.Append(rerr, close()) + } + }() + ct, _, err := mime.ParseMediaType(r.Header.Get("Content-Type")) + if err != nil { + return req, close, errors.Wrap(err, "parse media type") + } + switch { + case ct == "application/json": + if r.ContentLength == 0 { + return req, close, validate.ErrBodyRequired + } + buf, err := io.ReadAll(r.Body) + if err != nil { + return req, close, err + } + + if len(buf) == 0 { + return req, close, validate.ErrBodyRequired + } + + d := jx.DecodeBytes(buf) + + var request DecodeMessageReq + if err := func() error { + if err := request.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 req, close, err + } + return &request, close, nil + default: + return req, close, validate.InvalidContentType(ct) + } +} + func (s *Server) decodeEmulateMessageToAccountEventRequest(r *http.Request) ( req *EmulateMessageToAccountEventReq, close func() error, diff --git a/pkg/oas/oas_response_encoders_gen.go b/pkg/oas/oas_response_encoders_gen.go index de7050fc..2d3d02cd 100644 --- a/pkg/oas/oas_response_encoders_gen.go +++ b/pkg/oas/oas_response_encoders_gen.go @@ -55,6 +55,20 @@ func encodeBlockchainAccountInspectResponse(response *BlockchainAccountInspect, return nil } +func encodeDecodeMessageResponse(response *DecodedMessage, w http.ResponseWriter, span trace.Span) error { + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(200) + span.SetStatus(codes.Ok, http.StatusText(200)) + + e := jx.GetEncoder() + response.Encode(e) + if _, err := e.WriteTo(w); err != nil { + return errors.Wrap(err, "write") + } + + return nil +} + func encodeDnsResolveResponse(response *DnsRecord, w http.ResponseWriter, span trace.Span) error { w.Header().Set("Content-Type", "application/json") w.WriteHeader(200) diff --git a/pkg/oas/oas_router_gen.go b/pkg/oas/oas_router_gen.go index 21d3e825..4fd6b648 100644 --- a/pkg/oas/oas_router_gen.go +++ b/pkg/oas/oas_router_gen.go @@ -1691,6 +1691,24 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { return } } + case 'm': // Prefix: "message/decode" + if l := len("message/decode"); len(elem) >= l && elem[0:l] == "message/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, "POST") + } + + return + } case 'n': // Prefix: "nfts/" if l := len("nfts/"); len(elem) >= l && elem[0:l] == "nfts/" { elem = elem[l:] @@ -4154,6 +4172,28 @@ func (s *Server) FindPath(method string, u *url.URL) (r Route, _ bool) { } } } + case 'm': // Prefix: "message/decode" + if l := len("message/decode"); len(elem) >= l && elem[0:l] == "message/decode" { + elem = elem[l:] + } else { + break + } + + if len(elem) == 0 { + switch method { + case "POST": + // Leaf: DecodeMessage + r.name = "DecodeMessage" + r.summary = "" + r.operationID = "decodeMessage" + r.pathPattern = "/v2/message/decode" + 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:] diff --git a/pkg/oas/oas_schemas_gen.go b/pkg/oas/oas_schemas_gen.go index a95646d4..04141486 100644 --- a/pkg/oas/oas_schemas_gen.go +++ b/pkg/oas/oas_schemas_gen.go @@ -4166,6 +4166,307 @@ func (s *CreditPhase) SetCredit(val int64) { s.Credit = val } +type DecodeMessageReq struct { + Boc string `json:"boc"` +} + +// GetBoc returns the value of Boc. +func (s *DecodeMessageReq) GetBoc() string { + return s.Boc +} + +// SetBoc sets the value of Boc. +func (s *DecodeMessageReq) SetBoc(val string) { + s.Boc = val +} + +// Ref: #/components/schemas/DecodedMessage +type DecodedMessage struct { + Destination AccountAddress `json:"destination"` + DestinationWalletVersion string `json:"destination_wallet_version"` + ExtInMsgDecoded OptDecodedMessageExtInMsgDecoded `json:"ext_in_msg_decoded"` +} + +// GetDestination returns the value of Destination. +func (s *DecodedMessage) GetDestination() AccountAddress { + return s.Destination +} + +// GetDestinationWalletVersion returns the value of DestinationWalletVersion. +func (s *DecodedMessage) GetDestinationWalletVersion() string { + return s.DestinationWalletVersion +} + +// GetExtInMsgDecoded returns the value of ExtInMsgDecoded. +func (s *DecodedMessage) GetExtInMsgDecoded() OptDecodedMessageExtInMsgDecoded { + return s.ExtInMsgDecoded +} + +// SetDestination sets the value of Destination. +func (s *DecodedMessage) SetDestination(val AccountAddress) { + s.Destination = val +} + +// SetDestinationWalletVersion sets the value of DestinationWalletVersion. +func (s *DecodedMessage) SetDestinationWalletVersion(val string) { + s.DestinationWalletVersion = val +} + +// SetExtInMsgDecoded sets the value of ExtInMsgDecoded. +func (s *DecodedMessage) SetExtInMsgDecoded(val OptDecodedMessageExtInMsgDecoded) { + s.ExtInMsgDecoded = val +} + +type DecodedMessageExtInMsgDecoded struct { + WalletV3 OptDecodedMessageExtInMsgDecodedWalletV3 `json:"wallet_v3"` + WalletV4 OptDecodedMessageExtInMsgDecodedWalletV4 `json:"wallet_v4"` + WalletHighloadV2 OptDecodedMessageExtInMsgDecodedWalletHighloadV2 `json:"wallet_highload_v2"` +} + +// GetWalletV3 returns the value of WalletV3. +func (s *DecodedMessageExtInMsgDecoded) GetWalletV3() OptDecodedMessageExtInMsgDecodedWalletV3 { + return s.WalletV3 +} + +// GetWalletV4 returns the value of WalletV4. +func (s *DecodedMessageExtInMsgDecoded) GetWalletV4() OptDecodedMessageExtInMsgDecodedWalletV4 { + return s.WalletV4 +} + +// GetWalletHighloadV2 returns the value of WalletHighloadV2. +func (s *DecodedMessageExtInMsgDecoded) GetWalletHighloadV2() OptDecodedMessageExtInMsgDecodedWalletHighloadV2 { + return s.WalletHighloadV2 +} + +// SetWalletV3 sets the value of WalletV3. +func (s *DecodedMessageExtInMsgDecoded) SetWalletV3(val OptDecodedMessageExtInMsgDecodedWalletV3) { + s.WalletV3 = val +} + +// SetWalletV4 sets the value of WalletV4. +func (s *DecodedMessageExtInMsgDecoded) SetWalletV4(val OptDecodedMessageExtInMsgDecodedWalletV4) { + s.WalletV4 = val +} + +// SetWalletHighloadV2 sets the value of WalletHighloadV2. +func (s *DecodedMessageExtInMsgDecoded) SetWalletHighloadV2(val OptDecodedMessageExtInMsgDecodedWalletHighloadV2) { + s.WalletHighloadV2 = val +} + +type DecodedMessageExtInMsgDecodedWalletHighloadV2 struct { + SubwalletID uint32 `json:"subwallet_id"` + BoundedQueryID string `json:"bounded_query_id"` + RawMessages []DecodedRawMessage `json:"raw_messages"` +} + +// GetSubwalletID returns the value of SubwalletID. +func (s *DecodedMessageExtInMsgDecodedWalletHighloadV2) GetSubwalletID() uint32 { + return s.SubwalletID +} + +// GetBoundedQueryID returns the value of BoundedQueryID. +func (s *DecodedMessageExtInMsgDecodedWalletHighloadV2) GetBoundedQueryID() string { + return s.BoundedQueryID +} + +// GetRawMessages returns the value of RawMessages. +func (s *DecodedMessageExtInMsgDecodedWalletHighloadV2) GetRawMessages() []DecodedRawMessage { + return s.RawMessages +} + +// SetSubwalletID sets the value of SubwalletID. +func (s *DecodedMessageExtInMsgDecodedWalletHighloadV2) SetSubwalletID(val uint32) { + s.SubwalletID = val +} + +// SetBoundedQueryID sets the value of BoundedQueryID. +func (s *DecodedMessageExtInMsgDecodedWalletHighloadV2) SetBoundedQueryID(val string) { + s.BoundedQueryID = val +} + +// SetRawMessages sets the value of RawMessages. +func (s *DecodedMessageExtInMsgDecodedWalletHighloadV2) SetRawMessages(val []DecodedRawMessage) { + s.RawMessages = val +} + +type DecodedMessageExtInMsgDecodedWalletV3 struct { + SubwalletID uint32 `json:"subwallet_id"` + ValidUntil uint32 `json:"valid_until"` + Seqno uint32 `json:"seqno"` + RawMessages []DecodedRawMessage `json:"raw_messages"` +} + +// GetSubwalletID returns the value of SubwalletID. +func (s *DecodedMessageExtInMsgDecodedWalletV3) GetSubwalletID() uint32 { + return s.SubwalletID +} + +// GetValidUntil returns the value of ValidUntil. +func (s *DecodedMessageExtInMsgDecodedWalletV3) GetValidUntil() uint32 { + return s.ValidUntil +} + +// GetSeqno returns the value of Seqno. +func (s *DecodedMessageExtInMsgDecodedWalletV3) GetSeqno() uint32 { + return s.Seqno +} + +// GetRawMessages returns the value of RawMessages. +func (s *DecodedMessageExtInMsgDecodedWalletV3) GetRawMessages() []DecodedRawMessage { + return s.RawMessages +} + +// SetSubwalletID sets the value of SubwalletID. +func (s *DecodedMessageExtInMsgDecodedWalletV3) SetSubwalletID(val uint32) { + s.SubwalletID = val +} + +// SetValidUntil sets the value of ValidUntil. +func (s *DecodedMessageExtInMsgDecodedWalletV3) SetValidUntil(val uint32) { + s.ValidUntil = val +} + +// SetSeqno sets the value of Seqno. +func (s *DecodedMessageExtInMsgDecodedWalletV3) SetSeqno(val uint32) { + s.Seqno = val +} + +// SetRawMessages sets the value of RawMessages. +func (s *DecodedMessageExtInMsgDecodedWalletV3) SetRawMessages(val []DecodedRawMessage) { + s.RawMessages = val +} + +type DecodedMessageExtInMsgDecodedWalletV4 struct { + SubwalletID uint32 `json:"subwallet_id"` + ValidUntil uint32 `json:"valid_until"` + Seqno uint32 `json:"seqno"` + Op int8 `json:"op"` + RawMessages []DecodedRawMessage `json:"raw_messages"` +} + +// GetSubwalletID returns the value of SubwalletID. +func (s *DecodedMessageExtInMsgDecodedWalletV4) GetSubwalletID() uint32 { + return s.SubwalletID +} + +// GetValidUntil returns the value of ValidUntil. +func (s *DecodedMessageExtInMsgDecodedWalletV4) GetValidUntil() uint32 { + return s.ValidUntil +} + +// GetSeqno returns the value of Seqno. +func (s *DecodedMessageExtInMsgDecodedWalletV4) GetSeqno() uint32 { + return s.Seqno +} + +// GetOp returns the value of Op. +func (s *DecodedMessageExtInMsgDecodedWalletV4) GetOp() int8 { + return s.Op +} + +// GetRawMessages returns the value of RawMessages. +func (s *DecodedMessageExtInMsgDecodedWalletV4) GetRawMessages() []DecodedRawMessage { + return s.RawMessages +} + +// SetSubwalletID sets the value of SubwalletID. +func (s *DecodedMessageExtInMsgDecodedWalletV4) SetSubwalletID(val uint32) { + s.SubwalletID = val +} + +// SetValidUntil sets the value of ValidUntil. +func (s *DecodedMessageExtInMsgDecodedWalletV4) SetValidUntil(val uint32) { + s.ValidUntil = val +} + +// SetSeqno sets the value of Seqno. +func (s *DecodedMessageExtInMsgDecodedWalletV4) SetSeqno(val uint32) { + s.Seqno = val +} + +// SetOp sets the value of Op. +func (s *DecodedMessageExtInMsgDecodedWalletV4) SetOp(val int8) { + s.Op = val +} + +// SetRawMessages sets the value of RawMessages. +func (s *DecodedMessageExtInMsgDecodedWalletV4) SetRawMessages(val []DecodedRawMessage) { + s.RawMessages = val +} + +// Ref: #/components/schemas/DecodedRawMessage +type DecodedRawMessage struct { + Message DecodedRawMessageMessage `json:"message"` + Mode int `json:"mode"` +} + +// GetMessage returns the value of Message. +func (s *DecodedRawMessage) GetMessage() DecodedRawMessageMessage { + return s.Message +} + +// GetMode returns the value of Mode. +func (s *DecodedRawMessage) GetMode() int { + return s.Mode +} + +// SetMessage sets the value of Message. +func (s *DecodedRawMessage) SetMessage(val DecodedRawMessageMessage) { + s.Message = val +} + +// SetMode sets the value of Mode. +func (s *DecodedRawMessage) SetMode(val int) { + s.Mode = val +} + +type DecodedRawMessageMessage struct { + Boc string `json:"boc"` + DecodedOpName OptString `json:"decoded_op_name"` + OpCode OptString `json:"op_code"` + DecodedBody jx.Raw `json:"decoded_body"` +} + +// GetBoc returns the value of Boc. +func (s *DecodedRawMessageMessage) GetBoc() string { + return s.Boc +} + +// GetDecodedOpName returns the value of DecodedOpName. +func (s *DecodedRawMessageMessage) GetDecodedOpName() OptString { + return s.DecodedOpName +} + +// GetOpCode returns the value of OpCode. +func (s *DecodedRawMessageMessage) GetOpCode() OptString { + return s.OpCode +} + +// GetDecodedBody returns the value of DecodedBody. +func (s *DecodedRawMessageMessage) GetDecodedBody() jx.Raw { + return s.DecodedBody +} + +// SetBoc sets the value of Boc. +func (s *DecodedRawMessageMessage) SetBoc(val string) { + s.Boc = val +} + +// SetDecodedOpName sets the value of DecodedOpName. +func (s *DecodedRawMessageMessage) SetDecodedOpName(val OptString) { + s.DecodedOpName = val +} + +// SetOpCode sets the value of OpCode. +func (s *DecodedRawMessageMessage) SetOpCode(val OptString) { + s.OpCode = val +} + +// SetDecodedBody sets the value of DecodedBody. +func (s *DecodedRawMessageMessage) SetDecodedBody(val jx.Raw) { + s.DecodedBody = val +} + // Validator's participation in elections. // Ref: #/components/schemas/DepositStakeAction type DepositStakeAction struct { @@ -10017,6 +10318,190 @@ func (o OptCreditPhase) Or(d CreditPhase) CreditPhase { return d } +// NewOptDecodedMessageExtInMsgDecoded returns new OptDecodedMessageExtInMsgDecoded with value set to v. +func NewOptDecodedMessageExtInMsgDecoded(v DecodedMessageExtInMsgDecoded) OptDecodedMessageExtInMsgDecoded { + return OptDecodedMessageExtInMsgDecoded{ + Value: v, + Set: true, + } +} + +// OptDecodedMessageExtInMsgDecoded is optional DecodedMessageExtInMsgDecoded. +type OptDecodedMessageExtInMsgDecoded struct { + Value DecodedMessageExtInMsgDecoded + Set bool +} + +// IsSet returns true if OptDecodedMessageExtInMsgDecoded was set. +func (o OptDecodedMessageExtInMsgDecoded) IsSet() bool { return o.Set } + +// Reset unsets value. +func (o *OptDecodedMessageExtInMsgDecoded) Reset() { + var v DecodedMessageExtInMsgDecoded + o.Value = v + o.Set = false +} + +// SetTo sets value to v. +func (o *OptDecodedMessageExtInMsgDecoded) SetTo(v DecodedMessageExtInMsgDecoded) { + o.Set = true + o.Value = v +} + +// Get returns value and boolean that denotes whether value was set. +func (o OptDecodedMessageExtInMsgDecoded) Get() (v DecodedMessageExtInMsgDecoded, 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 OptDecodedMessageExtInMsgDecoded) Or(d DecodedMessageExtInMsgDecoded) DecodedMessageExtInMsgDecoded { + if v, ok := o.Get(); ok { + return v + } + return d +} + +// NewOptDecodedMessageExtInMsgDecodedWalletHighloadV2 returns new OptDecodedMessageExtInMsgDecodedWalletHighloadV2 with value set to v. +func NewOptDecodedMessageExtInMsgDecodedWalletHighloadV2(v DecodedMessageExtInMsgDecodedWalletHighloadV2) OptDecodedMessageExtInMsgDecodedWalletHighloadV2 { + return OptDecodedMessageExtInMsgDecodedWalletHighloadV2{ + Value: v, + Set: true, + } +} + +// OptDecodedMessageExtInMsgDecodedWalletHighloadV2 is optional DecodedMessageExtInMsgDecodedWalletHighloadV2. +type OptDecodedMessageExtInMsgDecodedWalletHighloadV2 struct { + Value DecodedMessageExtInMsgDecodedWalletHighloadV2 + Set bool +} + +// IsSet returns true if OptDecodedMessageExtInMsgDecodedWalletHighloadV2 was set. +func (o OptDecodedMessageExtInMsgDecodedWalletHighloadV2) IsSet() bool { return o.Set } + +// Reset unsets value. +func (o *OptDecodedMessageExtInMsgDecodedWalletHighloadV2) Reset() { + var v DecodedMessageExtInMsgDecodedWalletHighloadV2 + o.Value = v + o.Set = false +} + +// SetTo sets value to v. +func (o *OptDecodedMessageExtInMsgDecodedWalletHighloadV2) SetTo(v DecodedMessageExtInMsgDecodedWalletHighloadV2) { + o.Set = true + o.Value = v +} + +// Get returns value and boolean that denotes whether value was set. +func (o OptDecodedMessageExtInMsgDecodedWalletHighloadV2) Get() (v DecodedMessageExtInMsgDecodedWalletHighloadV2, 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 OptDecodedMessageExtInMsgDecodedWalletHighloadV2) Or(d DecodedMessageExtInMsgDecodedWalletHighloadV2) DecodedMessageExtInMsgDecodedWalletHighloadV2 { + if v, ok := o.Get(); ok { + return v + } + return d +} + +// NewOptDecodedMessageExtInMsgDecodedWalletV3 returns new OptDecodedMessageExtInMsgDecodedWalletV3 with value set to v. +func NewOptDecodedMessageExtInMsgDecodedWalletV3(v DecodedMessageExtInMsgDecodedWalletV3) OptDecodedMessageExtInMsgDecodedWalletV3 { + return OptDecodedMessageExtInMsgDecodedWalletV3{ + Value: v, + Set: true, + } +} + +// OptDecodedMessageExtInMsgDecodedWalletV3 is optional DecodedMessageExtInMsgDecodedWalletV3. +type OptDecodedMessageExtInMsgDecodedWalletV3 struct { + Value DecodedMessageExtInMsgDecodedWalletV3 + Set bool +} + +// IsSet returns true if OptDecodedMessageExtInMsgDecodedWalletV3 was set. +func (o OptDecodedMessageExtInMsgDecodedWalletV3) IsSet() bool { return o.Set } + +// Reset unsets value. +func (o *OptDecodedMessageExtInMsgDecodedWalletV3) Reset() { + var v DecodedMessageExtInMsgDecodedWalletV3 + o.Value = v + o.Set = false +} + +// SetTo sets value to v. +func (o *OptDecodedMessageExtInMsgDecodedWalletV3) SetTo(v DecodedMessageExtInMsgDecodedWalletV3) { + o.Set = true + o.Value = v +} + +// Get returns value and boolean that denotes whether value was set. +func (o OptDecodedMessageExtInMsgDecodedWalletV3) Get() (v DecodedMessageExtInMsgDecodedWalletV3, 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 OptDecodedMessageExtInMsgDecodedWalletV3) Or(d DecodedMessageExtInMsgDecodedWalletV3) DecodedMessageExtInMsgDecodedWalletV3 { + if v, ok := o.Get(); ok { + return v + } + return d +} + +// NewOptDecodedMessageExtInMsgDecodedWalletV4 returns new OptDecodedMessageExtInMsgDecodedWalletV4 with value set to v. +func NewOptDecodedMessageExtInMsgDecodedWalletV4(v DecodedMessageExtInMsgDecodedWalletV4) OptDecodedMessageExtInMsgDecodedWalletV4 { + return OptDecodedMessageExtInMsgDecodedWalletV4{ + Value: v, + Set: true, + } +} + +// OptDecodedMessageExtInMsgDecodedWalletV4 is optional DecodedMessageExtInMsgDecodedWalletV4. +type OptDecodedMessageExtInMsgDecodedWalletV4 struct { + Value DecodedMessageExtInMsgDecodedWalletV4 + Set bool +} + +// IsSet returns true if OptDecodedMessageExtInMsgDecodedWalletV4 was set. +func (o OptDecodedMessageExtInMsgDecodedWalletV4) IsSet() bool { return o.Set } + +// Reset unsets value. +func (o *OptDecodedMessageExtInMsgDecodedWalletV4) Reset() { + var v DecodedMessageExtInMsgDecodedWalletV4 + o.Value = v + o.Set = false +} + +// SetTo sets value to v. +func (o *OptDecodedMessageExtInMsgDecodedWalletV4) SetTo(v DecodedMessageExtInMsgDecodedWalletV4) { + o.Set = true + o.Value = v +} + +// Get returns value and boolean that denotes whether value was set. +func (o OptDecodedMessageExtInMsgDecodedWalletV4) Get() (v DecodedMessageExtInMsgDecodedWalletV4, 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 OptDecodedMessageExtInMsgDecodedWalletV4) Or(d DecodedMessageExtInMsgDecodedWalletV4) DecodedMessageExtInMsgDecodedWalletV4 { + if v, ok := o.Get(); ok { + return v + } + return d +} + // NewOptDepositStakeAction returns new OptDepositStakeAction with value set to v. func NewOptDepositStakeAction(v DepositStakeAction) OptDepositStakeAction { return OptDepositStakeAction{ diff --git a/pkg/oas/oas_server_gen.go b/pkg/oas/oas_server_gen.go index bef729bb..c862cc76 100644 --- a/pkg/oas/oas_server_gen.go +++ b/pkg/oas/oas_server_gen.go @@ -26,6 +26,12 @@ type Handler interface { // // GET /v2/blockchain/accounts/{account_id}/inspect BlockchainAccountInspect(ctx context.Context, params BlockchainAccountInspectParams) (*BlockchainAccountInspect, error) + // DecodeMessage implements decodeMessage operation. + // + // Decode a given message. Only external incoming messages can be decoded currently. + // + // POST /v2/message/decode + DecodeMessage(ctx context.Context, req *DecodeMessageReq) (*DecodedMessage, error) // DnsResolve implements dnsResolve operation. // // DNS resolve for domain name. diff --git a/pkg/oas/oas_unimplemented_gen.go b/pkg/oas/oas_unimplemented_gen.go index 234a9e71..edf1e030 100644 --- a/pkg/oas/oas_unimplemented_gen.go +++ b/pkg/oas/oas_unimplemented_gen.go @@ -40,6 +40,15 @@ func (UnimplementedHandler) BlockchainAccountInspect(ctx context.Context, params return r, ht.ErrNotImplemented } +// DecodeMessage implements decodeMessage operation. +// +// Decode a given message. Only external incoming messages can be decoded currently. +// +// POST /v2/message/decode +func (UnimplementedHandler) DecodeMessage(ctx context.Context, req *DecodeMessageReq) (r *DecodedMessage, _ error) { + return r, ht.ErrNotImplemented +} + // DnsResolve implements dnsResolve operation. // // DNS resolve for domain name. diff --git a/pkg/oas/oas_validators_gen.go b/pkg/oas/oas_validators_gen.go index 1ccdb2fa..59cbdead 100644 --- a/pkg/oas/oas_validators_gen.go +++ b/pkg/oas/oas_validators_gen.go @@ -1524,6 +1524,151 @@ func (s *ContractDeployAction) Validate() error { return nil } +func (s *DecodedMessage) Validate() error { + var failures []validate.FieldError + if err := func() error { + if value, ok := s.ExtInMsgDecoded.Get(); ok { + if err := func() error { + if err := value.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + return err + } + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "ext_in_msg_decoded", + Error: err, + }) + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + return nil +} + +func (s *DecodedMessageExtInMsgDecoded) Validate() error { + var failures []validate.FieldError + if err := func() error { + if value, ok := s.WalletV3.Get(); ok { + if err := func() error { + if err := value.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + return err + } + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "wallet_v3", + Error: err, + }) + } + if err := func() error { + if value, ok := s.WalletV4.Get(); ok { + if err := func() error { + if err := value.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + return err + } + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "wallet_v4", + Error: err, + }) + } + if err := func() error { + if value, ok := s.WalletHighloadV2.Get(); ok { + if err := func() error { + if err := value.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + return err + } + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "wallet_highload_v2", + Error: err, + }) + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + return nil +} + +func (s *DecodedMessageExtInMsgDecodedWalletHighloadV2) Validate() error { + var failures []validate.FieldError + if err := func() error { + if s.RawMessages == nil { + return errors.New("nil is invalid value") + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "raw_messages", + Error: err, + }) + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + return nil +} + +func (s *DecodedMessageExtInMsgDecodedWalletV3) Validate() error { + var failures []validate.FieldError + if err := func() error { + if s.RawMessages == nil { + return errors.New("nil is invalid value") + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "raw_messages", + Error: err, + }) + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + return nil +} + +func (s *DecodedMessageExtInMsgDecodedWalletV4) Validate() error { + var failures []validate.FieldError + if err := func() error { + if s.RawMessages == nil { + return errors.New("nil is invalid value") + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "raw_messages", + Error: err, + }) + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + return nil +} + func (s *DepositStakeAction) Validate() error { var failures []validate.FieldError if err := func() error { diff --git a/tonapi/oas_client_gen.go b/tonapi/oas_client_gen.go index 8f88eff2..3ac2e957 100644 --- a/tonapi/oas_client_gen.go +++ b/tonapi/oas_client_gen.go @@ -41,6 +41,12 @@ type Invoker interface { // // GET /v2/blockchain/accounts/{account_id}/inspect BlockchainAccountInspect(ctx context.Context, params BlockchainAccountInspectParams) (*BlockchainAccountInspect, error) + // DecodeMessage invokes decodeMessage operation. + // + // Decode a given message. Only external incoming messages can be decoded currently. + // + // POST /v2/message/decode + DecodeMessage(ctx context.Context, request *DecodeMessageReq) (*DecodedMessage, error) // DnsResolve invokes dnsResolve operation. // // DNS resolve for domain name. @@ -849,6 +855,81 @@ func (c *Client) sendBlockchainAccountInspect(ctx context.Context, params Blockc return result, nil } +// DecodeMessage invokes decodeMessage operation. +// +// Decode a given message. Only external incoming messages can be decoded currently. +// +// POST /v2/message/decode +func (c *Client) DecodeMessage(ctx context.Context, request *DecodeMessageReq) (*DecodedMessage, error) { + res, err := c.sendDecodeMessage(ctx, request) + return res, err +} + +func (c *Client) sendDecodeMessage(ctx context.Context, request *DecodeMessageReq) (res *DecodedMessage, err error) { + otelAttrs := []attribute.KeyValue{ + otelogen.OperationID("decodeMessage"), + semconv.HTTPMethodKey.String("POST"), + semconv.HTTPRouteKey.String("/v2/message/decode"), + } + + // 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(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, "DecodeMessage", + 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] = "/v2/message/decode" + 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 := encodeDecodeMessageRequest(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") + } + defer resp.Body.Close() + + stage = "DecodeResponse" + result, err := decodeDecodeMessageResponse(resp) + if err != nil { + return res, errors.Wrap(err, "decode response") + } + + return result, nil +} + // DnsResolve invokes dnsResolve operation. // // DNS resolve for domain name. diff --git a/tonapi/oas_json_gen.go b/tonapi/oas_json_gen.go index 07f21044..686df70c 100644 --- a/tonapi/oas_json_gen.go +++ b/tonapi/oas_json_gen.go @@ -11229,6 +11229,1057 @@ func (s *CreditPhase) UnmarshalJSON(data []byte) error { return s.Decode(d) } +// Encode implements json.Marshaler. +func (s *DecodeMessageReq) Encode(e *jx.Encoder) { + e.ObjStart() + s.encodeFields(e) + e.ObjEnd() +} + +// encodeFields encodes fields. +func (s *DecodeMessageReq) encodeFields(e *jx.Encoder) { + { + e.FieldStart("boc") + e.Str(s.Boc) + } +} + +var jsonFieldsNameOfDecodeMessageReq = [1]string{ + 0: "boc", +} + +// Decode decodes DecodeMessageReq from json. +func (s *DecodeMessageReq) Decode(d *jx.Decoder) error { + if s == nil { + return errors.New("invalid: unable to decode DecodeMessageReq to nil") + } + var requiredBitSet [1]uint8 + + if err := d.ObjBytes(func(d *jx.Decoder, k []byte) error { + switch string(k) { + case "boc": + requiredBitSet[0] |= 1 << 0 + if err := func() error { + v, err := d.Str() + s.Boc = string(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"boc\"") + } + default: + return d.Skip() + } + return nil + }); err != nil { + return errors.Wrap(err, "decode DecodeMessageReq") + } + // 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(jsonFieldsNameOfDecodeMessageReq) { + name = jsonFieldsNameOfDecodeMessageReq[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 *DecodeMessageReq) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *DecodeMessageReq) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + +// Encode implements json.Marshaler. +func (s *DecodedMessage) Encode(e *jx.Encoder) { + e.ObjStart() + s.encodeFields(e) + e.ObjEnd() +} + +// encodeFields encodes fields. +func (s *DecodedMessage) encodeFields(e *jx.Encoder) { + { + e.FieldStart("destination") + s.Destination.Encode(e) + } + { + e.FieldStart("destination_wallet_version") + e.Str(s.DestinationWalletVersion) + } + { + if s.ExtInMsgDecoded.Set { + e.FieldStart("ext_in_msg_decoded") + s.ExtInMsgDecoded.Encode(e) + } + } +} + +var jsonFieldsNameOfDecodedMessage = [3]string{ + 0: "destination", + 1: "destination_wallet_version", + 2: "ext_in_msg_decoded", +} + +// Decode decodes DecodedMessage from json. +func (s *DecodedMessage) Decode(d *jx.Decoder) error { + if s == nil { + return errors.New("invalid: unable to decode DecodedMessage to nil") + } + var requiredBitSet [1]uint8 + + if err := d.ObjBytes(func(d *jx.Decoder, k []byte) error { + switch string(k) { + case "destination": + requiredBitSet[0] |= 1 << 0 + if err := func() error { + if err := s.Destination.Decode(d); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"destination\"") + } + case "destination_wallet_version": + requiredBitSet[0] |= 1 << 1 + if err := func() error { + v, err := d.Str() + s.DestinationWalletVersion = string(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"destination_wallet_version\"") + } + case "ext_in_msg_decoded": + if err := func() error { + s.ExtInMsgDecoded.Reset() + if err := s.ExtInMsgDecoded.Decode(d); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"ext_in_msg_decoded\"") + } + default: + return d.Skip() + } + return nil + }); err != nil { + return errors.Wrap(err, "decode DecodedMessage") + } + // 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(jsonFieldsNameOfDecodedMessage) { + name = jsonFieldsNameOfDecodedMessage[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 *DecodedMessage) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *DecodedMessage) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + +// Encode implements json.Marshaler. +func (s *DecodedMessageExtInMsgDecoded) Encode(e *jx.Encoder) { + e.ObjStart() + s.encodeFields(e) + e.ObjEnd() +} + +// encodeFields encodes fields. +func (s *DecodedMessageExtInMsgDecoded) encodeFields(e *jx.Encoder) { + { + if s.WalletV3.Set { + e.FieldStart("wallet_v3") + s.WalletV3.Encode(e) + } + } + { + if s.WalletV4.Set { + e.FieldStart("wallet_v4") + s.WalletV4.Encode(e) + } + } + { + if s.WalletHighloadV2.Set { + e.FieldStart("wallet_highload_v2") + s.WalletHighloadV2.Encode(e) + } + } +} + +var jsonFieldsNameOfDecodedMessageExtInMsgDecoded = [3]string{ + 0: "wallet_v3", + 1: "wallet_v4", + 2: "wallet_highload_v2", +} + +// Decode decodes DecodedMessageExtInMsgDecoded from json. +func (s *DecodedMessageExtInMsgDecoded) Decode(d *jx.Decoder) error { + if s == nil { + return errors.New("invalid: unable to decode DecodedMessageExtInMsgDecoded to nil") + } + + if err := d.ObjBytes(func(d *jx.Decoder, k []byte) error { + switch string(k) { + case "wallet_v3": + if err := func() error { + s.WalletV3.Reset() + if err := s.WalletV3.Decode(d); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"wallet_v3\"") + } + case "wallet_v4": + if err := func() error { + s.WalletV4.Reset() + if err := s.WalletV4.Decode(d); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"wallet_v4\"") + } + case "wallet_highload_v2": + if err := func() error { + s.WalletHighloadV2.Reset() + if err := s.WalletHighloadV2.Decode(d); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"wallet_highload_v2\"") + } + default: + return d.Skip() + } + return nil + }); err != nil { + return errors.Wrap(err, "decode DecodedMessageExtInMsgDecoded") + } + + return nil +} + +// MarshalJSON implements stdjson.Marshaler. +func (s *DecodedMessageExtInMsgDecoded) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *DecodedMessageExtInMsgDecoded) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + +// Encode implements json.Marshaler. +func (s *DecodedMessageExtInMsgDecodedWalletHighloadV2) Encode(e *jx.Encoder) { + e.ObjStart() + s.encodeFields(e) + e.ObjEnd() +} + +// encodeFields encodes fields. +func (s *DecodedMessageExtInMsgDecodedWalletHighloadV2) encodeFields(e *jx.Encoder) { + { + e.FieldStart("subwallet_id") + e.UInt32(s.SubwalletID) + } + { + e.FieldStart("bounded_query_id") + e.Str(s.BoundedQueryID) + } + { + e.FieldStart("raw_messages") + e.ArrStart() + for _, elem := range s.RawMessages { + elem.Encode(e) + } + e.ArrEnd() + } +} + +var jsonFieldsNameOfDecodedMessageExtInMsgDecodedWalletHighloadV2 = [3]string{ + 0: "subwallet_id", + 1: "bounded_query_id", + 2: "raw_messages", +} + +// Decode decodes DecodedMessageExtInMsgDecodedWalletHighloadV2 from json. +func (s *DecodedMessageExtInMsgDecodedWalletHighloadV2) Decode(d *jx.Decoder) error { + if s == nil { + return errors.New("invalid: unable to decode DecodedMessageExtInMsgDecodedWalletHighloadV2 to nil") + } + var requiredBitSet [1]uint8 + + if err := d.ObjBytes(func(d *jx.Decoder, k []byte) error { + switch string(k) { + case "subwallet_id": + requiredBitSet[0] |= 1 << 0 + if err := func() error { + v, err := d.UInt32() + s.SubwalletID = uint32(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"subwallet_id\"") + } + case "bounded_query_id": + requiredBitSet[0] |= 1 << 1 + if err := func() error { + v, err := d.Str() + s.BoundedQueryID = string(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"bounded_query_id\"") + } + case "raw_messages": + requiredBitSet[0] |= 1 << 2 + if err := func() error { + s.RawMessages = make([]DecodedRawMessage, 0) + if err := d.Arr(func(d *jx.Decoder) error { + var elem DecodedRawMessage + if err := elem.Decode(d); err != nil { + return err + } + s.RawMessages = append(s.RawMessages, elem) + return nil + }); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"raw_messages\"") + } + default: + return d.Skip() + } + return nil + }); err != nil { + return errors.Wrap(err, "decode DecodedMessageExtInMsgDecodedWalletHighloadV2") + } + // 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(jsonFieldsNameOfDecodedMessageExtInMsgDecodedWalletHighloadV2) { + name = jsonFieldsNameOfDecodedMessageExtInMsgDecodedWalletHighloadV2[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 *DecodedMessageExtInMsgDecodedWalletHighloadV2) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *DecodedMessageExtInMsgDecodedWalletHighloadV2) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + +// Encode implements json.Marshaler. +func (s *DecodedMessageExtInMsgDecodedWalletV3) Encode(e *jx.Encoder) { + e.ObjStart() + s.encodeFields(e) + e.ObjEnd() +} + +// encodeFields encodes fields. +func (s *DecodedMessageExtInMsgDecodedWalletV3) encodeFields(e *jx.Encoder) { + { + e.FieldStart("subwallet_id") + e.UInt32(s.SubwalletID) + } + { + e.FieldStart("valid_until") + e.UInt32(s.ValidUntil) + } + { + e.FieldStart("seqno") + e.UInt32(s.Seqno) + } + { + e.FieldStart("raw_messages") + e.ArrStart() + for _, elem := range s.RawMessages { + elem.Encode(e) + } + e.ArrEnd() + } +} + +var jsonFieldsNameOfDecodedMessageExtInMsgDecodedWalletV3 = [4]string{ + 0: "subwallet_id", + 1: "valid_until", + 2: "seqno", + 3: "raw_messages", +} + +// Decode decodes DecodedMessageExtInMsgDecodedWalletV3 from json. +func (s *DecodedMessageExtInMsgDecodedWalletV3) Decode(d *jx.Decoder) error { + if s == nil { + return errors.New("invalid: unable to decode DecodedMessageExtInMsgDecodedWalletV3 to nil") + } + var requiredBitSet [1]uint8 + + if err := d.ObjBytes(func(d *jx.Decoder, k []byte) error { + switch string(k) { + case "subwallet_id": + requiredBitSet[0] |= 1 << 0 + if err := func() error { + v, err := d.UInt32() + s.SubwalletID = uint32(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"subwallet_id\"") + } + case "valid_until": + requiredBitSet[0] |= 1 << 1 + if err := func() error { + v, err := d.UInt32() + s.ValidUntil = uint32(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"valid_until\"") + } + case "seqno": + requiredBitSet[0] |= 1 << 2 + if err := func() error { + v, err := d.UInt32() + s.Seqno = uint32(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"seqno\"") + } + case "raw_messages": + requiredBitSet[0] |= 1 << 3 + if err := func() error { + s.RawMessages = make([]DecodedRawMessage, 0) + if err := d.Arr(func(d *jx.Decoder) error { + var elem DecodedRawMessage + if err := elem.Decode(d); err != nil { + return err + } + s.RawMessages = append(s.RawMessages, elem) + return nil + }); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"raw_messages\"") + } + default: + return d.Skip() + } + return nil + }); err != nil { + return errors.Wrap(err, "decode DecodedMessageExtInMsgDecodedWalletV3") + } + // Validate required fields. + var failures []validate.FieldError + for i, mask := range [1]uint8{ + 0b00001111, + } { + 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(jsonFieldsNameOfDecodedMessageExtInMsgDecodedWalletV3) { + name = jsonFieldsNameOfDecodedMessageExtInMsgDecodedWalletV3[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 *DecodedMessageExtInMsgDecodedWalletV3) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *DecodedMessageExtInMsgDecodedWalletV3) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + +// Encode implements json.Marshaler. +func (s *DecodedMessageExtInMsgDecodedWalletV4) Encode(e *jx.Encoder) { + e.ObjStart() + s.encodeFields(e) + e.ObjEnd() +} + +// encodeFields encodes fields. +func (s *DecodedMessageExtInMsgDecodedWalletV4) encodeFields(e *jx.Encoder) { + { + e.FieldStart("subwallet_id") + e.UInt32(s.SubwalletID) + } + { + e.FieldStart("valid_until") + e.UInt32(s.ValidUntil) + } + { + e.FieldStart("seqno") + e.UInt32(s.Seqno) + } + { + e.FieldStart("op") + e.Int8(s.Op) + } + { + e.FieldStart("raw_messages") + e.ArrStart() + for _, elem := range s.RawMessages { + elem.Encode(e) + } + e.ArrEnd() + } +} + +var jsonFieldsNameOfDecodedMessageExtInMsgDecodedWalletV4 = [5]string{ + 0: "subwallet_id", + 1: "valid_until", + 2: "seqno", + 3: "op", + 4: "raw_messages", +} + +// Decode decodes DecodedMessageExtInMsgDecodedWalletV4 from json. +func (s *DecodedMessageExtInMsgDecodedWalletV4) Decode(d *jx.Decoder) error { + if s == nil { + return errors.New("invalid: unable to decode DecodedMessageExtInMsgDecodedWalletV4 to nil") + } + var requiredBitSet [1]uint8 + + if err := d.ObjBytes(func(d *jx.Decoder, k []byte) error { + switch string(k) { + case "subwallet_id": + requiredBitSet[0] |= 1 << 0 + if err := func() error { + v, err := d.UInt32() + s.SubwalletID = uint32(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"subwallet_id\"") + } + case "valid_until": + requiredBitSet[0] |= 1 << 1 + if err := func() error { + v, err := d.UInt32() + s.ValidUntil = uint32(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"valid_until\"") + } + case "seqno": + requiredBitSet[0] |= 1 << 2 + if err := func() error { + v, err := d.UInt32() + s.Seqno = uint32(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"seqno\"") + } + case "op": + requiredBitSet[0] |= 1 << 3 + if err := func() error { + v, err := d.Int8() + s.Op = int8(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"op\"") + } + case "raw_messages": + requiredBitSet[0] |= 1 << 4 + if err := func() error { + s.RawMessages = make([]DecodedRawMessage, 0) + if err := d.Arr(func(d *jx.Decoder) error { + var elem DecodedRawMessage + if err := elem.Decode(d); err != nil { + return err + } + s.RawMessages = append(s.RawMessages, elem) + return nil + }); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"raw_messages\"") + } + default: + return d.Skip() + } + return nil + }); err != nil { + return errors.Wrap(err, "decode DecodedMessageExtInMsgDecodedWalletV4") + } + // Validate required fields. + var failures []validate.FieldError + for i, mask := range [1]uint8{ + 0b00011111, + } { + 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(jsonFieldsNameOfDecodedMessageExtInMsgDecodedWalletV4) { + name = jsonFieldsNameOfDecodedMessageExtInMsgDecodedWalletV4[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 *DecodedMessageExtInMsgDecodedWalletV4) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *DecodedMessageExtInMsgDecodedWalletV4) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + +// Encode implements json.Marshaler. +func (s *DecodedRawMessage) Encode(e *jx.Encoder) { + e.ObjStart() + s.encodeFields(e) + e.ObjEnd() +} + +// encodeFields encodes fields. +func (s *DecodedRawMessage) encodeFields(e *jx.Encoder) { + { + e.FieldStart("message") + s.Message.Encode(e) + } + { + e.FieldStart("mode") + e.Int(s.Mode) + } +} + +var jsonFieldsNameOfDecodedRawMessage = [2]string{ + 0: "message", + 1: "mode", +} + +// Decode decodes DecodedRawMessage from json. +func (s *DecodedRawMessage) Decode(d *jx.Decoder) error { + if s == nil { + return errors.New("invalid: unable to decode DecodedRawMessage to nil") + } + var requiredBitSet [1]uint8 + + if err := d.ObjBytes(func(d *jx.Decoder, k []byte) error { + switch string(k) { + case "message": + requiredBitSet[0] |= 1 << 0 + if err := func() error { + if err := s.Message.Decode(d); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"message\"") + } + case "mode": + requiredBitSet[0] |= 1 << 1 + if err := func() error { + v, err := d.Int() + s.Mode = int(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"mode\"") + } + default: + return d.Skip() + } + return nil + }); err != nil { + return errors.Wrap(err, "decode DecodedRawMessage") + } + // 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(jsonFieldsNameOfDecodedRawMessage) { + name = jsonFieldsNameOfDecodedRawMessage[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 *DecodedRawMessage) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *DecodedRawMessage) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + +// Encode implements json.Marshaler. +func (s *DecodedRawMessageMessage) Encode(e *jx.Encoder) { + e.ObjStart() + s.encodeFields(e) + e.ObjEnd() +} + +// encodeFields encodes fields. +func (s *DecodedRawMessageMessage) encodeFields(e *jx.Encoder) { + { + e.FieldStart("boc") + e.Str(s.Boc) + } + { + if s.DecodedOpName.Set { + e.FieldStart("decoded_op_name") + s.DecodedOpName.Encode(e) + } + } + { + if s.OpCode.Set { + e.FieldStart("op_code") + s.OpCode.Encode(e) + } + } + { + if len(s.DecodedBody) != 0 { + e.FieldStart("decoded_body") + e.Raw(s.DecodedBody) + } + } +} + +var jsonFieldsNameOfDecodedRawMessageMessage = [4]string{ + 0: "boc", + 1: "decoded_op_name", + 2: "op_code", + 3: "decoded_body", +} + +// Decode decodes DecodedRawMessageMessage from json. +func (s *DecodedRawMessageMessage) Decode(d *jx.Decoder) error { + if s == nil { + return errors.New("invalid: unable to decode DecodedRawMessageMessage to nil") + } + var requiredBitSet [1]uint8 + + if err := d.ObjBytes(func(d *jx.Decoder, k []byte) error { + switch string(k) { + case "boc": + requiredBitSet[0] |= 1 << 0 + if err := func() error { + v, err := d.Str() + s.Boc = string(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"boc\"") + } + case "decoded_op_name": + if err := func() error { + s.DecodedOpName.Reset() + if err := s.DecodedOpName.Decode(d); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"decoded_op_name\"") + } + case "op_code": + if err := func() error { + s.OpCode.Reset() + if err := s.OpCode.Decode(d); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"op_code\"") + } + case "decoded_body": + if err := func() error { + v, err := d.RawAppend(nil) + s.DecodedBody = jx.Raw(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"decoded_body\"") + } + default: + return d.Skip() + } + return nil + }); err != nil { + return errors.Wrap(err, "decode DecodedRawMessageMessage") + } + // 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(jsonFieldsNameOfDecodedRawMessageMessage) { + name = jsonFieldsNameOfDecodedRawMessageMessage[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 *DecodedRawMessageMessage) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *DecodedRawMessageMessage) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + // Encode implements json.Marshaler. func (s *DepositStakeAction) Encode(e *jx.Encoder) { e.ObjStart() @@ -25114,6 +26165,138 @@ func (s *OptCreditPhase) UnmarshalJSON(data []byte) error { return s.Decode(d) } +// Encode encodes DecodedMessageExtInMsgDecoded as json. +func (o OptDecodedMessageExtInMsgDecoded) Encode(e *jx.Encoder) { + if !o.Set { + return + } + o.Value.Encode(e) +} + +// Decode decodes DecodedMessageExtInMsgDecoded from json. +func (o *OptDecodedMessageExtInMsgDecoded) Decode(d *jx.Decoder) error { + if o == nil { + return errors.New("invalid: unable to decode OptDecodedMessageExtInMsgDecoded to nil") + } + o.Set = true + if err := o.Value.Decode(d); err != nil { + return err + } + return nil +} + +// MarshalJSON implements stdjson.Marshaler. +func (s OptDecodedMessageExtInMsgDecoded) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *OptDecodedMessageExtInMsgDecoded) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + +// Encode encodes DecodedMessageExtInMsgDecodedWalletHighloadV2 as json. +func (o OptDecodedMessageExtInMsgDecodedWalletHighloadV2) Encode(e *jx.Encoder) { + if !o.Set { + return + } + o.Value.Encode(e) +} + +// Decode decodes DecodedMessageExtInMsgDecodedWalletHighloadV2 from json. +func (o *OptDecodedMessageExtInMsgDecodedWalletHighloadV2) Decode(d *jx.Decoder) error { + if o == nil { + return errors.New("invalid: unable to decode OptDecodedMessageExtInMsgDecodedWalletHighloadV2 to nil") + } + o.Set = true + if err := o.Value.Decode(d); err != nil { + return err + } + return nil +} + +// MarshalJSON implements stdjson.Marshaler. +func (s OptDecodedMessageExtInMsgDecodedWalletHighloadV2) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *OptDecodedMessageExtInMsgDecodedWalletHighloadV2) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + +// Encode encodes DecodedMessageExtInMsgDecodedWalletV3 as json. +func (o OptDecodedMessageExtInMsgDecodedWalletV3) Encode(e *jx.Encoder) { + if !o.Set { + return + } + o.Value.Encode(e) +} + +// Decode decodes DecodedMessageExtInMsgDecodedWalletV3 from json. +func (o *OptDecodedMessageExtInMsgDecodedWalletV3) Decode(d *jx.Decoder) error { + if o == nil { + return errors.New("invalid: unable to decode OptDecodedMessageExtInMsgDecodedWalletV3 to nil") + } + o.Set = true + if err := o.Value.Decode(d); err != nil { + return err + } + return nil +} + +// MarshalJSON implements stdjson.Marshaler. +func (s OptDecodedMessageExtInMsgDecodedWalletV3) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *OptDecodedMessageExtInMsgDecodedWalletV3) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + +// Encode encodes DecodedMessageExtInMsgDecodedWalletV4 as json. +func (o OptDecodedMessageExtInMsgDecodedWalletV4) Encode(e *jx.Encoder) { + if !o.Set { + return + } + o.Value.Encode(e) +} + +// Decode decodes DecodedMessageExtInMsgDecodedWalletV4 from json. +func (o *OptDecodedMessageExtInMsgDecodedWalletV4) Decode(d *jx.Decoder) error { + if o == nil { + return errors.New("invalid: unable to decode OptDecodedMessageExtInMsgDecodedWalletV4 to nil") + } + o.Set = true + if err := o.Value.Decode(d); err != nil { + return err + } + return nil +} + +// MarshalJSON implements stdjson.Marshaler. +func (s OptDecodedMessageExtInMsgDecodedWalletV4) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *OptDecodedMessageExtInMsgDecodedWalletV4) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + // Encode encodes DepositStakeAction as json. func (o OptDepositStakeAction) Encode(e *jx.Encoder) { if !o.Set { diff --git a/tonapi/oas_request_encoders_gen.go b/tonapi/oas_request_encoders_gen.go index d6b37114..a388c108 100644 --- a/tonapi/oas_request_encoders_gen.go +++ b/tonapi/oas_request_encoders_gen.go @@ -11,6 +11,20 @@ import ( ht "github.com/ogen-go/ogen/http" ) +func encodeDecodeMessageRequest( + req *DecodeMessageReq, + r *http.Request, +) error { + const contentType = "application/json" + e := jx.GetEncoder() + { + req.Encode(e) + } + encoded := e.Bytes() + ht.SetBody(r, bytes.NewReader(encoded), contentType) + return nil +} + func encodeEmulateMessageToAccountEventRequest( req *EmulateMessageToAccountEventReq, r *http.Request, diff --git a/tonapi/oas_response_decoders_gen.go b/tonapi/oas_response_decoders_gen.go index 7df9340a..100aa1fe 100644 --- a/tonapi/oas_response_decoders_gen.go +++ b/tonapi/oas_response_decoders_gen.go @@ -263,6 +263,89 @@ func decodeBlockchainAccountInspectResponse(resp *http.Response) (res *Blockchai return res, errors.Wrap(defRes, "error") } +func decodeDecodeMessageResponse(resp *http.Response) (res *DecodedMessage, _ 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 DecodedMessage + 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 decodeDnsResolveResponse(resp *http.Response) (res *DnsRecord, _ error) { switch resp.StatusCode { case 200: diff --git a/tonapi/oas_schemas_gen.go b/tonapi/oas_schemas_gen.go index c7fedd50..73d6adb1 100644 --- a/tonapi/oas_schemas_gen.go +++ b/tonapi/oas_schemas_gen.go @@ -4166,6 +4166,307 @@ func (s *CreditPhase) SetCredit(val int64) { s.Credit = val } +type DecodeMessageReq struct { + Boc string `json:"boc"` +} + +// GetBoc returns the value of Boc. +func (s *DecodeMessageReq) GetBoc() string { + return s.Boc +} + +// SetBoc sets the value of Boc. +func (s *DecodeMessageReq) SetBoc(val string) { + s.Boc = val +} + +// Ref: #/components/schemas/DecodedMessage +type DecodedMessage struct { + Destination AccountAddress `json:"destination"` + DestinationWalletVersion string `json:"destination_wallet_version"` + ExtInMsgDecoded OptDecodedMessageExtInMsgDecoded `json:"ext_in_msg_decoded"` +} + +// GetDestination returns the value of Destination. +func (s *DecodedMessage) GetDestination() AccountAddress { + return s.Destination +} + +// GetDestinationWalletVersion returns the value of DestinationWalletVersion. +func (s *DecodedMessage) GetDestinationWalletVersion() string { + return s.DestinationWalletVersion +} + +// GetExtInMsgDecoded returns the value of ExtInMsgDecoded. +func (s *DecodedMessage) GetExtInMsgDecoded() OptDecodedMessageExtInMsgDecoded { + return s.ExtInMsgDecoded +} + +// SetDestination sets the value of Destination. +func (s *DecodedMessage) SetDestination(val AccountAddress) { + s.Destination = val +} + +// SetDestinationWalletVersion sets the value of DestinationWalletVersion. +func (s *DecodedMessage) SetDestinationWalletVersion(val string) { + s.DestinationWalletVersion = val +} + +// SetExtInMsgDecoded sets the value of ExtInMsgDecoded. +func (s *DecodedMessage) SetExtInMsgDecoded(val OptDecodedMessageExtInMsgDecoded) { + s.ExtInMsgDecoded = val +} + +type DecodedMessageExtInMsgDecoded struct { + WalletV3 OptDecodedMessageExtInMsgDecodedWalletV3 `json:"wallet_v3"` + WalletV4 OptDecodedMessageExtInMsgDecodedWalletV4 `json:"wallet_v4"` + WalletHighloadV2 OptDecodedMessageExtInMsgDecodedWalletHighloadV2 `json:"wallet_highload_v2"` +} + +// GetWalletV3 returns the value of WalletV3. +func (s *DecodedMessageExtInMsgDecoded) GetWalletV3() OptDecodedMessageExtInMsgDecodedWalletV3 { + return s.WalletV3 +} + +// GetWalletV4 returns the value of WalletV4. +func (s *DecodedMessageExtInMsgDecoded) GetWalletV4() OptDecodedMessageExtInMsgDecodedWalletV4 { + return s.WalletV4 +} + +// GetWalletHighloadV2 returns the value of WalletHighloadV2. +func (s *DecodedMessageExtInMsgDecoded) GetWalletHighloadV2() OptDecodedMessageExtInMsgDecodedWalletHighloadV2 { + return s.WalletHighloadV2 +} + +// SetWalletV3 sets the value of WalletV3. +func (s *DecodedMessageExtInMsgDecoded) SetWalletV3(val OptDecodedMessageExtInMsgDecodedWalletV3) { + s.WalletV3 = val +} + +// SetWalletV4 sets the value of WalletV4. +func (s *DecodedMessageExtInMsgDecoded) SetWalletV4(val OptDecodedMessageExtInMsgDecodedWalletV4) { + s.WalletV4 = val +} + +// SetWalletHighloadV2 sets the value of WalletHighloadV2. +func (s *DecodedMessageExtInMsgDecoded) SetWalletHighloadV2(val OptDecodedMessageExtInMsgDecodedWalletHighloadV2) { + s.WalletHighloadV2 = val +} + +type DecodedMessageExtInMsgDecodedWalletHighloadV2 struct { + SubwalletID uint32 `json:"subwallet_id"` + BoundedQueryID string `json:"bounded_query_id"` + RawMessages []DecodedRawMessage `json:"raw_messages"` +} + +// GetSubwalletID returns the value of SubwalletID. +func (s *DecodedMessageExtInMsgDecodedWalletHighloadV2) GetSubwalletID() uint32 { + return s.SubwalletID +} + +// GetBoundedQueryID returns the value of BoundedQueryID. +func (s *DecodedMessageExtInMsgDecodedWalletHighloadV2) GetBoundedQueryID() string { + return s.BoundedQueryID +} + +// GetRawMessages returns the value of RawMessages. +func (s *DecodedMessageExtInMsgDecodedWalletHighloadV2) GetRawMessages() []DecodedRawMessage { + return s.RawMessages +} + +// SetSubwalletID sets the value of SubwalletID. +func (s *DecodedMessageExtInMsgDecodedWalletHighloadV2) SetSubwalletID(val uint32) { + s.SubwalletID = val +} + +// SetBoundedQueryID sets the value of BoundedQueryID. +func (s *DecodedMessageExtInMsgDecodedWalletHighloadV2) SetBoundedQueryID(val string) { + s.BoundedQueryID = val +} + +// SetRawMessages sets the value of RawMessages. +func (s *DecodedMessageExtInMsgDecodedWalletHighloadV2) SetRawMessages(val []DecodedRawMessage) { + s.RawMessages = val +} + +type DecodedMessageExtInMsgDecodedWalletV3 struct { + SubwalletID uint32 `json:"subwallet_id"` + ValidUntil uint32 `json:"valid_until"` + Seqno uint32 `json:"seqno"` + RawMessages []DecodedRawMessage `json:"raw_messages"` +} + +// GetSubwalletID returns the value of SubwalletID. +func (s *DecodedMessageExtInMsgDecodedWalletV3) GetSubwalletID() uint32 { + return s.SubwalletID +} + +// GetValidUntil returns the value of ValidUntil. +func (s *DecodedMessageExtInMsgDecodedWalletV3) GetValidUntil() uint32 { + return s.ValidUntil +} + +// GetSeqno returns the value of Seqno. +func (s *DecodedMessageExtInMsgDecodedWalletV3) GetSeqno() uint32 { + return s.Seqno +} + +// GetRawMessages returns the value of RawMessages. +func (s *DecodedMessageExtInMsgDecodedWalletV3) GetRawMessages() []DecodedRawMessage { + return s.RawMessages +} + +// SetSubwalletID sets the value of SubwalletID. +func (s *DecodedMessageExtInMsgDecodedWalletV3) SetSubwalletID(val uint32) { + s.SubwalletID = val +} + +// SetValidUntil sets the value of ValidUntil. +func (s *DecodedMessageExtInMsgDecodedWalletV3) SetValidUntil(val uint32) { + s.ValidUntil = val +} + +// SetSeqno sets the value of Seqno. +func (s *DecodedMessageExtInMsgDecodedWalletV3) SetSeqno(val uint32) { + s.Seqno = val +} + +// SetRawMessages sets the value of RawMessages. +func (s *DecodedMessageExtInMsgDecodedWalletV3) SetRawMessages(val []DecodedRawMessage) { + s.RawMessages = val +} + +type DecodedMessageExtInMsgDecodedWalletV4 struct { + SubwalletID uint32 `json:"subwallet_id"` + ValidUntil uint32 `json:"valid_until"` + Seqno uint32 `json:"seqno"` + Op int8 `json:"op"` + RawMessages []DecodedRawMessage `json:"raw_messages"` +} + +// GetSubwalletID returns the value of SubwalletID. +func (s *DecodedMessageExtInMsgDecodedWalletV4) GetSubwalletID() uint32 { + return s.SubwalletID +} + +// GetValidUntil returns the value of ValidUntil. +func (s *DecodedMessageExtInMsgDecodedWalletV4) GetValidUntil() uint32 { + return s.ValidUntil +} + +// GetSeqno returns the value of Seqno. +func (s *DecodedMessageExtInMsgDecodedWalletV4) GetSeqno() uint32 { + return s.Seqno +} + +// GetOp returns the value of Op. +func (s *DecodedMessageExtInMsgDecodedWalletV4) GetOp() int8 { + return s.Op +} + +// GetRawMessages returns the value of RawMessages. +func (s *DecodedMessageExtInMsgDecodedWalletV4) GetRawMessages() []DecodedRawMessage { + return s.RawMessages +} + +// SetSubwalletID sets the value of SubwalletID. +func (s *DecodedMessageExtInMsgDecodedWalletV4) SetSubwalletID(val uint32) { + s.SubwalletID = val +} + +// SetValidUntil sets the value of ValidUntil. +func (s *DecodedMessageExtInMsgDecodedWalletV4) SetValidUntil(val uint32) { + s.ValidUntil = val +} + +// SetSeqno sets the value of Seqno. +func (s *DecodedMessageExtInMsgDecodedWalletV4) SetSeqno(val uint32) { + s.Seqno = val +} + +// SetOp sets the value of Op. +func (s *DecodedMessageExtInMsgDecodedWalletV4) SetOp(val int8) { + s.Op = val +} + +// SetRawMessages sets the value of RawMessages. +func (s *DecodedMessageExtInMsgDecodedWalletV4) SetRawMessages(val []DecodedRawMessage) { + s.RawMessages = val +} + +// Ref: #/components/schemas/DecodedRawMessage +type DecodedRawMessage struct { + Message DecodedRawMessageMessage `json:"message"` + Mode int `json:"mode"` +} + +// GetMessage returns the value of Message. +func (s *DecodedRawMessage) GetMessage() DecodedRawMessageMessage { + return s.Message +} + +// GetMode returns the value of Mode. +func (s *DecodedRawMessage) GetMode() int { + return s.Mode +} + +// SetMessage sets the value of Message. +func (s *DecodedRawMessage) SetMessage(val DecodedRawMessageMessage) { + s.Message = val +} + +// SetMode sets the value of Mode. +func (s *DecodedRawMessage) SetMode(val int) { + s.Mode = val +} + +type DecodedRawMessageMessage struct { + Boc string `json:"boc"` + DecodedOpName OptString `json:"decoded_op_name"` + OpCode OptString `json:"op_code"` + DecodedBody jx.Raw `json:"decoded_body"` +} + +// GetBoc returns the value of Boc. +func (s *DecodedRawMessageMessage) GetBoc() string { + return s.Boc +} + +// GetDecodedOpName returns the value of DecodedOpName. +func (s *DecodedRawMessageMessage) GetDecodedOpName() OptString { + return s.DecodedOpName +} + +// GetOpCode returns the value of OpCode. +func (s *DecodedRawMessageMessage) GetOpCode() OptString { + return s.OpCode +} + +// GetDecodedBody returns the value of DecodedBody. +func (s *DecodedRawMessageMessage) GetDecodedBody() jx.Raw { + return s.DecodedBody +} + +// SetBoc sets the value of Boc. +func (s *DecodedRawMessageMessage) SetBoc(val string) { + s.Boc = val +} + +// SetDecodedOpName sets the value of DecodedOpName. +func (s *DecodedRawMessageMessage) SetDecodedOpName(val OptString) { + s.DecodedOpName = val +} + +// SetOpCode sets the value of OpCode. +func (s *DecodedRawMessageMessage) SetOpCode(val OptString) { + s.OpCode = val +} + +// SetDecodedBody sets the value of DecodedBody. +func (s *DecodedRawMessageMessage) SetDecodedBody(val jx.Raw) { + s.DecodedBody = val +} + // Validator's participation in elections. // Ref: #/components/schemas/DepositStakeAction type DepositStakeAction struct { @@ -10017,6 +10318,190 @@ func (o OptCreditPhase) Or(d CreditPhase) CreditPhase { return d } +// NewOptDecodedMessageExtInMsgDecoded returns new OptDecodedMessageExtInMsgDecoded with value set to v. +func NewOptDecodedMessageExtInMsgDecoded(v DecodedMessageExtInMsgDecoded) OptDecodedMessageExtInMsgDecoded { + return OptDecodedMessageExtInMsgDecoded{ + Value: v, + Set: true, + } +} + +// OptDecodedMessageExtInMsgDecoded is optional DecodedMessageExtInMsgDecoded. +type OptDecodedMessageExtInMsgDecoded struct { + Value DecodedMessageExtInMsgDecoded + Set bool +} + +// IsSet returns true if OptDecodedMessageExtInMsgDecoded was set. +func (o OptDecodedMessageExtInMsgDecoded) IsSet() bool { return o.Set } + +// Reset unsets value. +func (o *OptDecodedMessageExtInMsgDecoded) Reset() { + var v DecodedMessageExtInMsgDecoded + o.Value = v + o.Set = false +} + +// SetTo sets value to v. +func (o *OptDecodedMessageExtInMsgDecoded) SetTo(v DecodedMessageExtInMsgDecoded) { + o.Set = true + o.Value = v +} + +// Get returns value and boolean that denotes whether value was set. +func (o OptDecodedMessageExtInMsgDecoded) Get() (v DecodedMessageExtInMsgDecoded, 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 OptDecodedMessageExtInMsgDecoded) Or(d DecodedMessageExtInMsgDecoded) DecodedMessageExtInMsgDecoded { + if v, ok := o.Get(); ok { + return v + } + return d +} + +// NewOptDecodedMessageExtInMsgDecodedWalletHighloadV2 returns new OptDecodedMessageExtInMsgDecodedWalletHighloadV2 with value set to v. +func NewOptDecodedMessageExtInMsgDecodedWalletHighloadV2(v DecodedMessageExtInMsgDecodedWalletHighloadV2) OptDecodedMessageExtInMsgDecodedWalletHighloadV2 { + return OptDecodedMessageExtInMsgDecodedWalletHighloadV2{ + Value: v, + Set: true, + } +} + +// OptDecodedMessageExtInMsgDecodedWalletHighloadV2 is optional DecodedMessageExtInMsgDecodedWalletHighloadV2. +type OptDecodedMessageExtInMsgDecodedWalletHighloadV2 struct { + Value DecodedMessageExtInMsgDecodedWalletHighloadV2 + Set bool +} + +// IsSet returns true if OptDecodedMessageExtInMsgDecodedWalletHighloadV2 was set. +func (o OptDecodedMessageExtInMsgDecodedWalletHighloadV2) IsSet() bool { return o.Set } + +// Reset unsets value. +func (o *OptDecodedMessageExtInMsgDecodedWalletHighloadV2) Reset() { + var v DecodedMessageExtInMsgDecodedWalletHighloadV2 + o.Value = v + o.Set = false +} + +// SetTo sets value to v. +func (o *OptDecodedMessageExtInMsgDecodedWalletHighloadV2) SetTo(v DecodedMessageExtInMsgDecodedWalletHighloadV2) { + o.Set = true + o.Value = v +} + +// Get returns value and boolean that denotes whether value was set. +func (o OptDecodedMessageExtInMsgDecodedWalletHighloadV2) Get() (v DecodedMessageExtInMsgDecodedWalletHighloadV2, 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 OptDecodedMessageExtInMsgDecodedWalletHighloadV2) Or(d DecodedMessageExtInMsgDecodedWalletHighloadV2) DecodedMessageExtInMsgDecodedWalletHighloadV2 { + if v, ok := o.Get(); ok { + return v + } + return d +} + +// NewOptDecodedMessageExtInMsgDecodedWalletV3 returns new OptDecodedMessageExtInMsgDecodedWalletV3 with value set to v. +func NewOptDecodedMessageExtInMsgDecodedWalletV3(v DecodedMessageExtInMsgDecodedWalletV3) OptDecodedMessageExtInMsgDecodedWalletV3 { + return OptDecodedMessageExtInMsgDecodedWalletV3{ + Value: v, + Set: true, + } +} + +// OptDecodedMessageExtInMsgDecodedWalletV3 is optional DecodedMessageExtInMsgDecodedWalletV3. +type OptDecodedMessageExtInMsgDecodedWalletV3 struct { + Value DecodedMessageExtInMsgDecodedWalletV3 + Set bool +} + +// IsSet returns true if OptDecodedMessageExtInMsgDecodedWalletV3 was set. +func (o OptDecodedMessageExtInMsgDecodedWalletV3) IsSet() bool { return o.Set } + +// Reset unsets value. +func (o *OptDecodedMessageExtInMsgDecodedWalletV3) Reset() { + var v DecodedMessageExtInMsgDecodedWalletV3 + o.Value = v + o.Set = false +} + +// SetTo sets value to v. +func (o *OptDecodedMessageExtInMsgDecodedWalletV3) SetTo(v DecodedMessageExtInMsgDecodedWalletV3) { + o.Set = true + o.Value = v +} + +// Get returns value and boolean that denotes whether value was set. +func (o OptDecodedMessageExtInMsgDecodedWalletV3) Get() (v DecodedMessageExtInMsgDecodedWalletV3, 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 OptDecodedMessageExtInMsgDecodedWalletV3) Or(d DecodedMessageExtInMsgDecodedWalletV3) DecodedMessageExtInMsgDecodedWalletV3 { + if v, ok := o.Get(); ok { + return v + } + return d +} + +// NewOptDecodedMessageExtInMsgDecodedWalletV4 returns new OptDecodedMessageExtInMsgDecodedWalletV4 with value set to v. +func NewOptDecodedMessageExtInMsgDecodedWalletV4(v DecodedMessageExtInMsgDecodedWalletV4) OptDecodedMessageExtInMsgDecodedWalletV4 { + return OptDecodedMessageExtInMsgDecodedWalletV4{ + Value: v, + Set: true, + } +} + +// OptDecodedMessageExtInMsgDecodedWalletV4 is optional DecodedMessageExtInMsgDecodedWalletV4. +type OptDecodedMessageExtInMsgDecodedWalletV4 struct { + Value DecodedMessageExtInMsgDecodedWalletV4 + Set bool +} + +// IsSet returns true if OptDecodedMessageExtInMsgDecodedWalletV4 was set. +func (o OptDecodedMessageExtInMsgDecodedWalletV4) IsSet() bool { return o.Set } + +// Reset unsets value. +func (o *OptDecodedMessageExtInMsgDecodedWalletV4) Reset() { + var v DecodedMessageExtInMsgDecodedWalletV4 + o.Value = v + o.Set = false +} + +// SetTo sets value to v. +func (o *OptDecodedMessageExtInMsgDecodedWalletV4) SetTo(v DecodedMessageExtInMsgDecodedWalletV4) { + o.Set = true + o.Value = v +} + +// Get returns value and boolean that denotes whether value was set. +func (o OptDecodedMessageExtInMsgDecodedWalletV4) Get() (v DecodedMessageExtInMsgDecodedWalletV4, 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 OptDecodedMessageExtInMsgDecodedWalletV4) Or(d DecodedMessageExtInMsgDecodedWalletV4) DecodedMessageExtInMsgDecodedWalletV4 { + if v, ok := o.Get(); ok { + return v + } + return d +} + // NewOptDepositStakeAction returns new OptDepositStakeAction with value set to v. func NewOptDepositStakeAction(v DepositStakeAction) OptDepositStakeAction { return OptDepositStakeAction{ diff --git a/tonapi/oas_validators_gen.go b/tonapi/oas_validators_gen.go index 7d5c483d..8e727f02 100644 --- a/tonapi/oas_validators_gen.go +++ b/tonapi/oas_validators_gen.go @@ -1524,6 +1524,151 @@ func (s *ContractDeployAction) Validate() error { return nil } +func (s *DecodedMessage) Validate() error { + var failures []validate.FieldError + if err := func() error { + if value, ok := s.ExtInMsgDecoded.Get(); ok { + if err := func() error { + if err := value.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + return err + } + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "ext_in_msg_decoded", + Error: err, + }) + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + return nil +} + +func (s *DecodedMessageExtInMsgDecoded) Validate() error { + var failures []validate.FieldError + if err := func() error { + if value, ok := s.WalletV3.Get(); ok { + if err := func() error { + if err := value.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + return err + } + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "wallet_v3", + Error: err, + }) + } + if err := func() error { + if value, ok := s.WalletV4.Get(); ok { + if err := func() error { + if err := value.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + return err + } + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "wallet_v4", + Error: err, + }) + } + if err := func() error { + if value, ok := s.WalletHighloadV2.Get(); ok { + if err := func() error { + if err := value.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + return err + } + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "wallet_highload_v2", + Error: err, + }) + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + return nil +} + +func (s *DecodedMessageExtInMsgDecodedWalletHighloadV2) Validate() error { + var failures []validate.FieldError + if err := func() error { + if s.RawMessages == nil { + return errors.New("nil is invalid value") + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "raw_messages", + Error: err, + }) + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + return nil +} + +func (s *DecodedMessageExtInMsgDecodedWalletV3) Validate() error { + var failures []validate.FieldError + if err := func() error { + if s.RawMessages == nil { + return errors.New("nil is invalid value") + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "raw_messages", + Error: err, + }) + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + return nil +} + +func (s *DecodedMessageExtInMsgDecodedWalletV4) Validate() error { + var failures []validate.FieldError + if err := func() error { + if s.RawMessages == nil { + return errors.New("nil is invalid value") + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "raw_messages", + Error: err, + }) + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + return nil +} + func (s *DepositStakeAction) Validate() error { var failures []validate.FieldError if err := func() error {