diff --git a/api/openapi.json b/api/openapi.json index d7da7083..685bccc7 100644 --- a/api/openapi.json +++ b/api/openapi.json @@ -3532,6 +3532,10 @@ "format": "int64", "type": "integer" }, + "hash": { + "example": "97264395BD65A255A429B11326C84128B7D70FFED7949ABAE3036D506BA38621", + "type": "string" + }, "ihr_disabled": { "example": true, "type": "boolean" @@ -3549,6 +3553,15 @@ "init": { "$ref": "#/components/schemas/StateInit" }, + "msg_type": { + "enum": [ + "int_msg", + "ext_in_msg", + "ext_out_msg" + ], + "example": "int_msg", + "type": "string" + }, "op_code": { "example": "0xdeadbeaf", "type": "string" @@ -3568,6 +3581,8 @@ } }, "required": [ + "msg_type", + "hash", "created_lt", "ihr_disabled", "bounce", diff --git a/api/openapi.yml b/api/openapi.yml index b8030bb9..6f4a8435 100644 --- a/api/openapi.yml +++ b/api/openapi.yml @@ -2923,6 +2923,8 @@ components: Message: type: object required: + - msg_type + - hash - created_lt - ihr_disabled - bounce @@ -2933,6 +2935,16 @@ components: - import_fee - created_at properties: + msg_type: + type: string + example: int_msg + enum: + - int_msg + - ext_in_msg + - ext_out_msg + hash: + type: string + example: 97264395BD65A255A429B11326C84128B7D70FFED7949ABAE3036D506BA38621 created_lt: type: integer format: int64 diff --git a/pkg/api/blockchain_converters.go b/pkg/api/blockchain_converters.go index 6eb2f17c..ba2b1e86 100644 --- a/pkg/api/blockchain_converters.go +++ b/pkg/api/blockchain_converters.go @@ -181,19 +181,37 @@ func convertTransaction(t core.Transaction, book addressBook) oas.Transaction { return tx } +func convertMsgType(msgType core.MsgType) oas.MessageMsgType { + switch msgType { + case core.ExtInMsg: + return oas.MessageMsgTypeExtInMsg + case core.ExtOutMsg: + return oas.MessageMsgTypeExtOutMsg + default: + return oas.MessageMsgTypeIntMsg + } +} + func convertMessage(m core.Message, book addressBook) oas.Message { msg := oas.Message{ - CreatedLt: int64(m.CreatedLt), - IhrDisabled: m.IhrDisabled, - Bounce: m.Bounce, - Bounced: m.Bounced, - Value: m.Value, - FwdFee: m.FwdFee, - IhrFee: m.IhrFee, - Destination: convertOptAccountAddress(m.Destination, book), - Source: convertOptAccountAddress(m.Source, book), - ImportFee: m.ImportFee, - CreatedAt: int64(m.CreatedAt), + MsgType: convertMsgType(m.MsgType), + Hash: m.Hash.Hex(), + CreatedLt: int64(m.CreatedLt), + IhrDisabled: m.IhrDisabled, + Bounce: m.Bounce, + Bounced: m.Bounced, + Value: m.Value, + FwdFee: m.FwdFee, + IhrFee: m.IhrFee, + Destination: convertOptAccountAddress(m.Destination, book), + Source: convertOptAccountAddress(m.Source, book), + ImportFee: m.ImportFee, + CreatedAt: int64(m.CreatedAt), + OpCode: oas.OptString{}, + Init: oas.OptStateInit{}, + RawBody: oas.OptString{}, + DecodedOpName: oas.OptString{}, + DecodedBody: nil, } if len(m.Body) != 0 { msg.RawBody.SetTo(hex.EncodeToString(m.Body)) diff --git a/pkg/core/converters.go b/pkg/core/converters.go index dbdc01ee..473ee555 100644 --- a/pkg/core/converters.go +++ b/pkg/core/converters.go @@ -303,6 +303,8 @@ func ConvertMessage(message tlb.Message, txLT uint64) (Message, error) { Source: source, Destination: dest, }, + MsgType: IntMsg, + Hash: tongo.Bits256(message.Hash()), IhrDisabled: info.IhrDisabled, Bounce: info.Bounce, Bounced: info.Bounced, @@ -327,6 +329,8 @@ func ConvertMessage(message tlb.Message, txLT uint64) (Message, error) { CreatedLt: txLT, Destination: dest, }, + MsgType: ExtInMsg, + Hash: tongo.Bits256(message.Hash()), SourceExtern: externalAddressFromTlb(info.Src), ImportFee: int64(info.ImportFee), Body: body, @@ -345,6 +349,8 @@ func ConvertMessage(message tlb.Message, txLT uint64) (Message, error) { CreatedLt: info.CreatedLt, Source: source, }, + MsgType: ExtOutMsg, + Hash: tongo.Bits256(message.Hash()), DestinationExtern: externalAddressFromTlb(info.Dest), Body: body, DecodedBody: decodedBody, diff --git a/pkg/core/testdata/convert-tx-1.json b/pkg/core/testdata/convert-tx-1.json index d149a287..f69422ff 100644 --- a/pkg/core/testdata/convert-tx-1.json +++ b/pkg/core/testdata/convert-tx-1.json @@ -9,6 +9,8 @@ "CreatedLt": 37362820000002, "Source": "0:6ccd325a858c379693fae2bcaab1c2906831a4e10a6c3bb44ee8b615bca1d220", "Destination": "0:6dcb8357c6bef52b43f0f681d976f5a46068ae195cb95f7a959d25c71b0cac6c", + "MsgType": "IntMsg", + "Hash": "ec658106d3196e2ae0a2471ff8a36f9ee304c3b035862f184791f3f1097de72d", "SourceExtern": null, "DestinationExtern": null, "IhrDisabled": true, @@ -30,6 +32,8 @@ "CreatedLt": 37362820000004, "Source": "0:6dcb8357c6bef52b43f0f681d976f5a46068ae195cb95f7a959d25c71b0cac6c", "Destination": "0:e185f22dd230150f2a9d6e9d2bf833b5c03d6215bdfd031d2691f8b835dd99de", + "MsgType": "IntMsg", + "Hash": "81a3c7682efc9187b59f210432169d34e4f088fa70994b0c6a5f893f6a90d896", "SourceExtern": null, "DestinationExtern": null, "IhrDisabled": true, diff --git a/pkg/core/transactions.go b/pkg/core/transactions.go index a050c9c3..b581bd5c 100644 --- a/pkg/core/transactions.go +++ b/pkg/core/transactions.go @@ -1,9 +1,10 @@ package core import ( - "github.com/tonkeeper/tongo/boc" "math/big" + "github.com/tonkeeper/tongo/boc" + "github.com/tonkeeper/tongo/abi" "github.com/tonkeeper/tongo/tlb" @@ -122,8 +123,18 @@ func (m Message) IsEmission() bool { return m.Source != nil && m.Source.IsZero() && m.Source.Workchain == -1 && m.Bounced == false } +type MsgType string + +const ( + IntMsg MsgType = "IntMsg" + ExtInMsg MsgType = "ExtInMsg" + ExtOutMsg MsgType = "ExtOutMsg" +) + type Message struct { MessageID + MsgType MsgType + Hash tongo.Bits256 SourceExtern *ExternalAddress DestinationExtern *ExternalAddress IhrDisabled bool diff --git a/pkg/oas/oas_json_gen.go b/pkg/oas/oas_json_gen.go index 53e4dbb0..914abf94 100644 --- a/pkg/oas/oas_json_gen.go +++ b/pkg/oas/oas_json_gen.go @@ -22261,6 +22261,14 @@ func (s *Message) Encode(e *jx.Encoder) { // encodeFields encodes fields. func (s *Message) encodeFields(e *jx.Encoder) { + { + e.FieldStart("msg_type") + s.MsgType.Encode(e) + } + { + e.FieldStart("hash") + e.Str(s.Hash) + } { e.FieldStart("created_lt") e.Int64(s.CreatedLt) @@ -22341,23 +22349,25 @@ func (s *Message) encodeFields(e *jx.Encoder) { } } -var jsonFieldsNameOfMessage = [16]string{ - 0: "created_lt", - 1: "ihr_disabled", - 2: "bounce", - 3: "bounced", - 4: "value", - 5: "fwd_fee", - 6: "ihr_fee", - 7: "destination", - 8: "source", - 9: "import_fee", - 10: "created_at", - 11: "op_code", - 12: "init", - 13: "raw_body", - 14: "decoded_op_name", - 15: "decoded_body", +var jsonFieldsNameOfMessage = [18]string{ + 0: "msg_type", + 1: "hash", + 2: "created_lt", + 3: "ihr_disabled", + 4: "bounce", + 5: "bounced", + 6: "value", + 7: "fwd_fee", + 8: "ihr_fee", + 9: "destination", + 10: "source", + 11: "import_fee", + 12: "created_at", + 13: "op_code", + 14: "init", + 15: "raw_body", + 16: "decoded_op_name", + 17: "decoded_body", } // Decode decodes Message from json. @@ -22365,12 +22375,34 @@ func (s *Message) Decode(d *jx.Decoder) error { if s == nil { return errors.New("invalid: unable to decode Message to nil") } - var requiredBitSet [2]uint8 + var requiredBitSet [3]uint8 if err := d.ObjBytes(func(d *jx.Decoder, k []byte) error { switch string(k) { - case "created_lt": + case "msg_type": requiredBitSet[0] |= 1 << 0 + if err := func() error { + if err := s.MsgType.Decode(d); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"msg_type\"") + } + case "hash": + requiredBitSet[0] |= 1 << 1 + if err := func() error { + v, err := d.Str() + s.Hash = string(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"hash\"") + } + case "created_lt": + requiredBitSet[0] |= 1 << 2 if err := func() error { v, err := d.Int64() s.CreatedLt = int64(v) @@ -22382,7 +22414,7 @@ func (s *Message) Decode(d *jx.Decoder) error { return errors.Wrap(err, "decode field \"created_lt\"") } case "ihr_disabled": - requiredBitSet[0] |= 1 << 1 + requiredBitSet[0] |= 1 << 3 if err := func() error { v, err := d.Bool() s.IhrDisabled = bool(v) @@ -22394,7 +22426,7 @@ func (s *Message) Decode(d *jx.Decoder) error { return errors.Wrap(err, "decode field \"ihr_disabled\"") } case "bounce": - requiredBitSet[0] |= 1 << 2 + requiredBitSet[0] |= 1 << 4 if err := func() error { v, err := d.Bool() s.Bounce = bool(v) @@ -22406,7 +22438,7 @@ func (s *Message) Decode(d *jx.Decoder) error { return errors.Wrap(err, "decode field \"bounce\"") } case "bounced": - requiredBitSet[0] |= 1 << 3 + requiredBitSet[0] |= 1 << 5 if err := func() error { v, err := d.Bool() s.Bounced = bool(v) @@ -22418,7 +22450,7 @@ func (s *Message) Decode(d *jx.Decoder) error { return errors.Wrap(err, "decode field \"bounced\"") } case "value": - requiredBitSet[0] |= 1 << 4 + requiredBitSet[0] |= 1 << 6 if err := func() error { v, err := d.Int64() s.Value = int64(v) @@ -22430,7 +22462,7 @@ func (s *Message) Decode(d *jx.Decoder) error { return errors.Wrap(err, "decode field \"value\"") } case "fwd_fee": - requiredBitSet[0] |= 1 << 5 + requiredBitSet[0] |= 1 << 7 if err := func() error { v, err := d.Int64() s.FwdFee = int64(v) @@ -22442,7 +22474,7 @@ func (s *Message) Decode(d *jx.Decoder) error { return errors.Wrap(err, "decode field \"fwd_fee\"") } case "ihr_fee": - requiredBitSet[0] |= 1 << 6 + requiredBitSet[1] |= 1 << 0 if err := func() error { v, err := d.Int64() s.IhrFee = int64(v) @@ -22474,7 +22506,7 @@ func (s *Message) Decode(d *jx.Decoder) error { return errors.Wrap(err, "decode field \"source\"") } case "import_fee": - requiredBitSet[1] |= 1 << 1 + requiredBitSet[1] |= 1 << 3 if err := func() error { v, err := d.Int64() s.ImportFee = int64(v) @@ -22486,7 +22518,7 @@ func (s *Message) Decode(d *jx.Decoder) error { return errors.Wrap(err, "decode field \"import_fee\"") } case "created_at": - requiredBitSet[1] |= 1 << 2 + requiredBitSet[1] |= 1 << 4 if err := func() error { v, err := d.Int64() s.CreatedAt = int64(v) @@ -22557,9 +22589,10 @@ func (s *Message) Decode(d *jx.Decoder) error { } // Validate required fields. var failures []validate.FieldError - for i, mask := range [2]uint8{ - 0b01111111, - 0b00000110, + for i, mask := range [3]uint8{ + 0b11111111, + 0b00011001, + 0b00000000, } { if result := (requiredBitSet[i] & mask) ^ mask; result != 0 { // Mask only required fields and check equality to mask using XOR. @@ -22729,6 +22762,48 @@ func (s *MessageConsequences) UnmarshalJSON(data []byte) error { return s.Decode(d) } +// Encode encodes MessageMsgType as json. +func (s MessageMsgType) Encode(e *jx.Encoder) { + e.Str(string(s)) +} + +// Decode decodes MessageMsgType from json. +func (s *MessageMsgType) Decode(d *jx.Decoder) error { + if s == nil { + return errors.New("invalid: unable to decode MessageMsgType to nil") + } + v, err := d.StrBytes() + if err != nil { + return err + } + // Try to use constant string. + switch MessageMsgType(v) { + case MessageMsgTypeIntMsg: + *s = MessageMsgTypeIntMsg + case MessageMsgTypeExtInMsg: + *s = MessageMsgTypeExtInMsg + case MessageMsgTypeExtOutMsg: + *s = MessageMsgTypeExtOutMsg + default: + *s = MessageMsgType(v) + } + + return nil +} + +// MarshalJSON implements stdjson.Marshaler. +func (s MessageMsgType) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *MessageMsgType) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + // Encode implements json.Marshaler. func (s *MethodExecutionResult) Encode(e *jx.Encoder) { e.ObjStart() diff --git a/pkg/oas/oas_schemas_gen.go b/pkg/oas/oas_schemas_gen.go index 04141486..88330e65 100644 --- a/pkg/oas/oas_schemas_gen.go +++ b/pkg/oas/oas_schemas_gen.go @@ -7358,6 +7358,8 @@ func (s *JettonsBalances) SetBalances(val []JettonBalance) { // Ref: #/components/schemas/Message type Message struct { + MsgType MessageMsgType `json:"msg_type"` + Hash string `json:"hash"` CreatedLt int64 `json:"created_lt"` IhrDisabled bool `json:"ihr_disabled"` Bounce bool `json:"bounce"` @@ -7377,6 +7379,16 @@ type Message struct { DecodedBody jx.Raw `json:"decoded_body"` } +// GetMsgType returns the value of MsgType. +func (s *Message) GetMsgType() MessageMsgType { + return s.MsgType +} + +// GetHash returns the value of Hash. +func (s *Message) GetHash() string { + return s.Hash +} + // GetCreatedLt returns the value of CreatedLt. func (s *Message) GetCreatedLt() int64 { return s.CreatedLt @@ -7457,6 +7469,16 @@ func (s *Message) GetDecodedBody() jx.Raw { return s.DecodedBody } +// SetMsgType sets the value of MsgType. +func (s *Message) SetMsgType(val MessageMsgType) { + s.MsgType = val +} + +// SetHash sets the value of Hash. +func (s *Message) SetHash(val string) { + s.Hash = val +} + // SetCreatedLt sets the value of CreatedLt. func (s *Message) SetCreatedLt(val int64) { s.CreatedLt = val @@ -7574,6 +7596,54 @@ func (s *MessageConsequences) SetEvent(val AccountEvent) { s.Event = val } +type MessageMsgType string + +const ( + MessageMsgTypeIntMsg MessageMsgType = "int_msg" + MessageMsgTypeExtInMsg MessageMsgType = "ext_in_msg" + MessageMsgTypeExtOutMsg MessageMsgType = "ext_out_msg" +) + +// AllValues returns all MessageMsgType values. +func (MessageMsgType) AllValues() []MessageMsgType { + return []MessageMsgType{ + MessageMsgTypeIntMsg, + MessageMsgTypeExtInMsg, + MessageMsgTypeExtOutMsg, + } +} + +// MarshalText implements encoding.TextMarshaler. +func (s MessageMsgType) MarshalText() ([]byte, error) { + switch s { + case MessageMsgTypeIntMsg: + return []byte(s), nil + case MessageMsgTypeExtInMsg: + return []byte(s), nil + case MessageMsgTypeExtOutMsg: + return []byte(s), nil + default: + return nil, errors.Errorf("invalid value: %q", s) + } +} + +// UnmarshalText implements encoding.TextUnmarshaler. +func (s *MessageMsgType) UnmarshalText(data []byte) error { + switch MessageMsgType(data) { + case MessageMsgTypeIntMsg: + *s = MessageMsgTypeIntMsg + return nil + case MessageMsgTypeExtInMsg: + *s = MessageMsgTypeExtInMsg + return nil + case MessageMsgTypeExtOutMsg: + *s = MessageMsgTypeExtOutMsg + return nil + default: + return errors.Errorf("invalid value: %q", data) + } +} + // Ref: #/components/schemas/MethodExecutionResult type MethodExecutionResult struct { Success bool `json:"success"` diff --git a/pkg/oas/oas_validators_gen.go b/pkg/oas/oas_validators_gen.go index 59cbdead..97a60272 100644 --- a/pkg/oas/oas_validators_gen.go +++ b/pkg/oas/oas_validators_gen.go @@ -2677,6 +2677,25 @@ func (s *JettonsBalances) Validate() error { return nil } +func (s *Message) Validate() error { + var failures []validate.FieldError + if err := func() error { + if err := s.MsgType.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "msg_type", + Error: err, + }) + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + return nil +} + func (s *MessageConsequences) Validate() error { var failures []validate.FieldError if err := func() error { @@ -2718,6 +2737,19 @@ func (s *MessageConsequences) Validate() error { return nil } +func (s MessageMsgType) Validate() error { + switch s { + case "int_msg": + return nil + case "ext_in_msg": + return nil + case "ext_out_msg": + return nil + default: + return errors.Errorf("invalid value: %v", s) + } +} + func (s *MethodExecutionResult) Validate() error { var failures []validate.FieldError if err := func() error { @@ -3419,10 +3451,45 @@ func (s *Transaction) Validate() error { Error: err, }) } + if err := func() error { + if value, ok := s.InMsg.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: "in_msg", + Error: err, + }) + } if err := func() error { if s.OutMsgs == nil { return errors.New("nil is invalid value") } + var failures []validate.FieldError + for i, elem := range s.OutMsgs { + if err := func() error { + if err := elem.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: fmt.Sprintf("[%d]", i), + Error: err, + }) + } + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } return nil }(); err != nil { failures = append(failures, validate.FieldError{ diff --git a/tonapi/oas_json_gen.go b/tonapi/oas_json_gen.go index 686df70c..cce5423a 100644 --- a/tonapi/oas_json_gen.go +++ b/tonapi/oas_json_gen.go @@ -22261,6 +22261,14 @@ func (s *Message) Encode(e *jx.Encoder) { // encodeFields encodes fields. func (s *Message) encodeFields(e *jx.Encoder) { + { + e.FieldStart("msg_type") + s.MsgType.Encode(e) + } + { + e.FieldStart("hash") + e.Str(s.Hash) + } { e.FieldStart("created_lt") e.Int64(s.CreatedLt) @@ -22341,23 +22349,25 @@ func (s *Message) encodeFields(e *jx.Encoder) { } } -var jsonFieldsNameOfMessage = [16]string{ - 0: "created_lt", - 1: "ihr_disabled", - 2: "bounce", - 3: "bounced", - 4: "value", - 5: "fwd_fee", - 6: "ihr_fee", - 7: "destination", - 8: "source", - 9: "import_fee", - 10: "created_at", - 11: "op_code", - 12: "init", - 13: "raw_body", - 14: "decoded_op_name", - 15: "decoded_body", +var jsonFieldsNameOfMessage = [18]string{ + 0: "msg_type", + 1: "hash", + 2: "created_lt", + 3: "ihr_disabled", + 4: "bounce", + 5: "bounced", + 6: "value", + 7: "fwd_fee", + 8: "ihr_fee", + 9: "destination", + 10: "source", + 11: "import_fee", + 12: "created_at", + 13: "op_code", + 14: "init", + 15: "raw_body", + 16: "decoded_op_name", + 17: "decoded_body", } // Decode decodes Message from json. @@ -22365,12 +22375,34 @@ func (s *Message) Decode(d *jx.Decoder) error { if s == nil { return errors.New("invalid: unable to decode Message to nil") } - var requiredBitSet [2]uint8 + var requiredBitSet [3]uint8 if err := d.ObjBytes(func(d *jx.Decoder, k []byte) error { switch string(k) { - case "created_lt": + case "msg_type": requiredBitSet[0] |= 1 << 0 + if err := func() error { + if err := s.MsgType.Decode(d); err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"msg_type\"") + } + case "hash": + requiredBitSet[0] |= 1 << 1 + if err := func() error { + v, err := d.Str() + s.Hash = string(v) + if err != nil { + return err + } + return nil + }(); err != nil { + return errors.Wrap(err, "decode field \"hash\"") + } + case "created_lt": + requiredBitSet[0] |= 1 << 2 if err := func() error { v, err := d.Int64() s.CreatedLt = int64(v) @@ -22382,7 +22414,7 @@ func (s *Message) Decode(d *jx.Decoder) error { return errors.Wrap(err, "decode field \"created_lt\"") } case "ihr_disabled": - requiredBitSet[0] |= 1 << 1 + requiredBitSet[0] |= 1 << 3 if err := func() error { v, err := d.Bool() s.IhrDisabled = bool(v) @@ -22394,7 +22426,7 @@ func (s *Message) Decode(d *jx.Decoder) error { return errors.Wrap(err, "decode field \"ihr_disabled\"") } case "bounce": - requiredBitSet[0] |= 1 << 2 + requiredBitSet[0] |= 1 << 4 if err := func() error { v, err := d.Bool() s.Bounce = bool(v) @@ -22406,7 +22438,7 @@ func (s *Message) Decode(d *jx.Decoder) error { return errors.Wrap(err, "decode field \"bounce\"") } case "bounced": - requiredBitSet[0] |= 1 << 3 + requiredBitSet[0] |= 1 << 5 if err := func() error { v, err := d.Bool() s.Bounced = bool(v) @@ -22418,7 +22450,7 @@ func (s *Message) Decode(d *jx.Decoder) error { return errors.Wrap(err, "decode field \"bounced\"") } case "value": - requiredBitSet[0] |= 1 << 4 + requiredBitSet[0] |= 1 << 6 if err := func() error { v, err := d.Int64() s.Value = int64(v) @@ -22430,7 +22462,7 @@ func (s *Message) Decode(d *jx.Decoder) error { return errors.Wrap(err, "decode field \"value\"") } case "fwd_fee": - requiredBitSet[0] |= 1 << 5 + requiredBitSet[0] |= 1 << 7 if err := func() error { v, err := d.Int64() s.FwdFee = int64(v) @@ -22442,7 +22474,7 @@ func (s *Message) Decode(d *jx.Decoder) error { return errors.Wrap(err, "decode field \"fwd_fee\"") } case "ihr_fee": - requiredBitSet[0] |= 1 << 6 + requiredBitSet[1] |= 1 << 0 if err := func() error { v, err := d.Int64() s.IhrFee = int64(v) @@ -22474,7 +22506,7 @@ func (s *Message) Decode(d *jx.Decoder) error { return errors.Wrap(err, "decode field \"source\"") } case "import_fee": - requiredBitSet[1] |= 1 << 1 + requiredBitSet[1] |= 1 << 3 if err := func() error { v, err := d.Int64() s.ImportFee = int64(v) @@ -22486,7 +22518,7 @@ func (s *Message) Decode(d *jx.Decoder) error { return errors.Wrap(err, "decode field \"import_fee\"") } case "created_at": - requiredBitSet[1] |= 1 << 2 + requiredBitSet[1] |= 1 << 4 if err := func() error { v, err := d.Int64() s.CreatedAt = int64(v) @@ -22557,9 +22589,10 @@ func (s *Message) Decode(d *jx.Decoder) error { } // Validate required fields. var failures []validate.FieldError - for i, mask := range [2]uint8{ - 0b01111111, - 0b00000110, + for i, mask := range [3]uint8{ + 0b11111111, + 0b00011001, + 0b00000000, } { if result := (requiredBitSet[i] & mask) ^ mask; result != 0 { // Mask only required fields and check equality to mask using XOR. @@ -22729,6 +22762,48 @@ func (s *MessageConsequences) UnmarshalJSON(data []byte) error { return s.Decode(d) } +// Encode encodes MessageMsgType as json. +func (s MessageMsgType) Encode(e *jx.Encoder) { + e.Str(string(s)) +} + +// Decode decodes MessageMsgType from json. +func (s *MessageMsgType) Decode(d *jx.Decoder) error { + if s == nil { + return errors.New("invalid: unable to decode MessageMsgType to nil") + } + v, err := d.StrBytes() + if err != nil { + return err + } + // Try to use constant string. + switch MessageMsgType(v) { + case MessageMsgTypeIntMsg: + *s = MessageMsgTypeIntMsg + case MessageMsgTypeExtInMsg: + *s = MessageMsgTypeExtInMsg + case MessageMsgTypeExtOutMsg: + *s = MessageMsgTypeExtOutMsg + default: + *s = MessageMsgType(v) + } + + return nil +} + +// MarshalJSON implements stdjson.Marshaler. +func (s MessageMsgType) MarshalJSON() ([]byte, error) { + e := jx.Encoder{} + s.Encode(&e) + return e.Bytes(), nil +} + +// UnmarshalJSON implements stdjson.Unmarshaler. +func (s *MessageMsgType) UnmarshalJSON(data []byte) error { + d := jx.DecodeBytes(data) + return s.Decode(d) +} + // Encode implements json.Marshaler. func (s *MethodExecutionResult) Encode(e *jx.Encoder) { e.ObjStart() diff --git a/tonapi/oas_schemas_gen.go b/tonapi/oas_schemas_gen.go index 73d6adb1..2d520b4a 100644 --- a/tonapi/oas_schemas_gen.go +++ b/tonapi/oas_schemas_gen.go @@ -7358,6 +7358,8 @@ func (s *JettonsBalances) SetBalances(val []JettonBalance) { // Ref: #/components/schemas/Message type Message struct { + MsgType MessageMsgType `json:"msg_type"` + Hash string `json:"hash"` CreatedLt int64 `json:"created_lt"` IhrDisabled bool `json:"ihr_disabled"` Bounce bool `json:"bounce"` @@ -7377,6 +7379,16 @@ type Message struct { DecodedBody jx.Raw `json:"decoded_body"` } +// GetMsgType returns the value of MsgType. +func (s *Message) GetMsgType() MessageMsgType { + return s.MsgType +} + +// GetHash returns the value of Hash. +func (s *Message) GetHash() string { + return s.Hash +} + // GetCreatedLt returns the value of CreatedLt. func (s *Message) GetCreatedLt() int64 { return s.CreatedLt @@ -7457,6 +7469,16 @@ func (s *Message) GetDecodedBody() jx.Raw { return s.DecodedBody } +// SetMsgType sets the value of MsgType. +func (s *Message) SetMsgType(val MessageMsgType) { + s.MsgType = val +} + +// SetHash sets the value of Hash. +func (s *Message) SetHash(val string) { + s.Hash = val +} + // SetCreatedLt sets the value of CreatedLt. func (s *Message) SetCreatedLt(val int64) { s.CreatedLt = val @@ -7574,6 +7596,54 @@ func (s *MessageConsequences) SetEvent(val AccountEvent) { s.Event = val } +type MessageMsgType string + +const ( + MessageMsgTypeIntMsg MessageMsgType = "int_msg" + MessageMsgTypeExtInMsg MessageMsgType = "ext_in_msg" + MessageMsgTypeExtOutMsg MessageMsgType = "ext_out_msg" +) + +// AllValues returns all MessageMsgType values. +func (MessageMsgType) AllValues() []MessageMsgType { + return []MessageMsgType{ + MessageMsgTypeIntMsg, + MessageMsgTypeExtInMsg, + MessageMsgTypeExtOutMsg, + } +} + +// MarshalText implements encoding.TextMarshaler. +func (s MessageMsgType) MarshalText() ([]byte, error) { + switch s { + case MessageMsgTypeIntMsg: + return []byte(s), nil + case MessageMsgTypeExtInMsg: + return []byte(s), nil + case MessageMsgTypeExtOutMsg: + return []byte(s), nil + default: + return nil, errors.Errorf("invalid value: %q", s) + } +} + +// UnmarshalText implements encoding.TextUnmarshaler. +func (s *MessageMsgType) UnmarshalText(data []byte) error { + switch MessageMsgType(data) { + case MessageMsgTypeIntMsg: + *s = MessageMsgTypeIntMsg + return nil + case MessageMsgTypeExtInMsg: + *s = MessageMsgTypeExtInMsg + return nil + case MessageMsgTypeExtOutMsg: + *s = MessageMsgTypeExtOutMsg + return nil + default: + return errors.Errorf("invalid value: %q", data) + } +} + // Ref: #/components/schemas/MethodExecutionResult type MethodExecutionResult struct { Success bool `json:"success"` diff --git a/tonapi/oas_validators_gen.go b/tonapi/oas_validators_gen.go index 8e727f02..16c9cc9d 100644 --- a/tonapi/oas_validators_gen.go +++ b/tonapi/oas_validators_gen.go @@ -2677,6 +2677,25 @@ func (s *JettonsBalances) Validate() error { return nil } +func (s *Message) Validate() error { + var failures []validate.FieldError + if err := func() error { + if err := s.MsgType.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: "msg_type", + Error: err, + }) + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } + return nil +} + func (s *MessageConsequences) Validate() error { var failures []validate.FieldError if err := func() error { @@ -2718,6 +2737,19 @@ func (s *MessageConsequences) Validate() error { return nil } +func (s MessageMsgType) Validate() error { + switch s { + case "int_msg": + return nil + case "ext_in_msg": + return nil + case "ext_out_msg": + return nil + default: + return errors.Errorf("invalid value: %v", s) + } +} + func (s *MethodExecutionResult) Validate() error { var failures []validate.FieldError if err := func() error { @@ -3419,10 +3451,45 @@ func (s *Transaction) Validate() error { Error: err, }) } + if err := func() error { + if value, ok := s.InMsg.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: "in_msg", + Error: err, + }) + } if err := func() error { if s.OutMsgs == nil { return errors.New("nil is invalid value") } + var failures []validate.FieldError + for i, elem := range s.OutMsgs { + if err := func() error { + if err := elem.Validate(); err != nil { + return err + } + return nil + }(); err != nil { + failures = append(failures, validate.FieldError{ + Name: fmt.Sprintf("[%d]", i), + Error: err, + }) + } + } + if len(failures) > 0 { + return &validate.Error{Fields: failures} + } return nil }(); err != nil { failures = append(failures, validate.FieldError{