@n1xyz/nord-ts 0.0.22 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -15,7 +15,7 @@ import type { Message } from "@bufbuild/protobuf";
15
15
  * Describes the file nord.proto.
16
16
  */
17
17
  export const file_nord: GenFile = /*@__PURE__*/
18
- fileDesc("Cgpub3JkLnByb3RvEgRub3JkItABCgZNYXJrZXQSEQoJbWFya2V0X2lkGAEgASgNEhYKDnByaWNlX2RlY2ltYWxzGAIgASgNEhUKDXNpemVfZGVjaW1hbHMYAyABKA0SFQoNYmFzZV90b2tlbl9pZBgEIAEoDRIlCgttYXJrZXRfdHlwZRgFIAEoDjIQLm5vcmQuTWFya2V0VHlwZRIPCgdpbWZfYnBzGAYgASgNEg8KB2NtZl9icHMYByABKA0SDwoHbW1mX2JwcxgIIAEoDRITCgt2aWV3X3N5bWJvbBgKIAEoCSJaCgVUb2tlbhIQCgh0b2tlbl9pZBgBIAEoDRIWCg50b2tlbl9kZWNpbWFscxgCIAEoDRISCgp3ZWlnaHRfYnBzGAQgASgNEhMKC3ZpZXdfc3ltYm9sGAUgASgJIigKCVF1b3RlU2l6ZRIMCgRzaXplGAEgASgEEg0KBXByaWNlGAIgASgEIk4KCk9yZGVyTGltaXQSDQoFcHJpY2UYBiABKAQSDAoEc2l6ZRgHIAEoBBIjCgpxdW90ZV9zaXplGAggASgLMg8ubm9yZC5RdW90ZVNpemUiYAoJT3JkZXJUeXBlEhgKBHNpZGUYAyABKA4yCi5ub3JkLlNpZGUSIQoJZmlsbF9tb2RlGAQgASgOMg4ubm9yZC5GaWxsTW9kZRIWCg5pc19yZWR1Y2Vfb25seRgFIAEoCCKZAQoMVHJhZGVPclBsYWNlEhEKCW1hcmtldF9pZBgCIAEoDRIjCgpvcmRlcl90eXBlGAMgASgLMg8ubm9yZC5PcmRlclR5cGUSHwoFbGltaXQYBiABKAsyEC5ub3JkLk9yZGVyTGltaXQSHAoPY2xpZW50X29yZGVyX2lkGCEgASgESACIAQFCEgoQX2NsaWVudF9vcmRlcl9pZCIfCgtDYW5jZWxPcmRlchIQCghvcmRlcl9pZBgCIAEoBCLbGQoGQWN0aW9uEhkKEWN1cnJlbnRfdGltZXN0YW1wGAEgASgDEg0KBW5vbmNlGAIgASgNEjQKDmNyZWF0ZV9zZXNzaW9uGAQgASgLMhoubm9yZC5BY3Rpb24uQ3JlYXRlU2Vzc2lvbkgAEjAKDGNyZWF0ZV90b2tlbhgFIAEoCzIYLm5vcmQuQWN0aW9uLkNyZWF0ZVRva2VuSAASMgoNY3JlYXRlX21hcmtldBgGIAEoCzIZLm5vcmQuQWN0aW9uLkNyZWF0ZU1hcmtldEgAEi4KC3BsYWNlX29yZGVyGAcgASgLMhcubm9yZC5BY3Rpb24uUGxhY2VPcmRlckgAEjoKEmNhbmNlbF9vcmRlcl9ieV9pZBgIIAEoCzIcLm5vcmQuQWN0aW9uLkNhbmNlbE9yZGVyQnlJZEgAEicKB2RlcG9zaXQYCSABKAsyFC5ub3JkLkFjdGlvbi5EZXBvc2l0SAASKQoId2l0aGRyYXcYCiABKAsyFS5ub3JkLkFjdGlvbi5XaXRoZHJhd0gAEkwKG3B5dGhfc2V0X3dvcm1ob2xlX2d1YXJkaWFucxgLIAEoCzIlLm5vcmQuQWN0aW9uLlB5dGhTZXRXb3JtaG9sZUd1YXJkaWFuc0gAEj4KFHB5dGhfc2V0X3N5bWJvbF9mZWVkGAwgASgLMh4ubm9yZC5BY3Rpb24uUHl0aFNldFN5bWJvbEZlZWRIABJCChZweXRoX3ByaWNlX2ZlZWRfdXBkYXRlGA0gASgLMiAubm9yZC5BY3Rpb24uUHl0aFByaWNlRmVlZFVwZGF0ZUgAEisKCWxpcXVpZGF0ZRgOIAEoCzIWLm5vcmQuQWN0aW9uLkxpcXVpZGF0ZUgAEjQKDnJldm9rZV9zZXNzaW9uGA8gASgLMhoubm9yZC5BY3Rpb24uUmV2b2tlU2Vzc2lvbkgAEiMKBXBhdXNlGBAgASgLMhIubm9yZC5BY3Rpb24uUGF1c2VIABInCgd1bnBhdXNlGBEgASgLMhQubm9yZC5BY3Rpb24uVW5wYXVzZUgAEikKCHRyYW5zZmVyGBIgASgLMhUubm9yZC5BY3Rpb24uVHJhbnNmZXJIABIuCgthZGRfdHJpZ2dlchggIAEoCzIXLm5vcmQuQWN0aW9uLkFkZFRyaWdnZXJIABI0Cg5yZW1vdmVfdHJpZ2dlchghIAEoCzIaLm5vcmQuQWN0aW9uLlJlbW92ZVRyaWdnZXJIABIyCg10YWtlX3Bvc2l0aW9uGCIgASgLMhkubm9yZC5BY3Rpb24uVGFrZVBvc2l0aW9uSAASHgoGYXRvbWljGCMgASgLMgwubm9yZC5BdG9taWNIABpTCg1DcmVhdGVTZXNzaW9uEhMKC3VzZXJfcHVia2V5GAEgASgMEhMKC2Jsc3RfcHVia2V5GAIgASgMEhgKEGV4cGlyeV90aW1lc3RhbXAYAyABKAMadwoLQ3JlYXRlVG9rZW4SFgoOdG9rZW5fZGVjaW1hbHMYASABKA0SEgoKd2VpZ2h0X2JwcxgDIAEoDRITCgt2aWV3X3N5bWJvbBgEIAEoCRIVCg1vcmFjbGVfc3ltYm9sGAUgASgJEhAKCHNvbF9hZGRyGAYgASgMGtoBCgxDcmVhdGVNYXJrZXQSFQoNc2l6ZV9kZWNpbWFscxgBIAEoDRIWCg5wcmljZV9kZWNpbWFscxgCIAEoDRIPCgdpbWZfYnBzGAMgASgNEg8KB2NtZl9icHMYBCABKA0SDwoHbW1mX2JwcxgFIAEoDRIlCgttYXJrZXRfdHlwZRgGIAEoDjIQLm5vcmQuTWFya2V0VHlwZRITCgt2aWV3X3N5bWJvbBgHIAEoCRIVCg1vcmFjbGVfc3ltYm9sGAggASgJEhUKDWJhc2VfdG9rZW5faWQYCSABKA0apgMKClBsYWNlT3JkZXISEgoKc2Vzc2lvbl9pZBgBIAEoBBIRCgltYXJrZXRfaWQYAiABKA0SGAoEc2lkZRgDIAEoDjIKLm5vcmQuU2lkZRIhCglmaWxsX21vZGUYBCABKA4yDi5ub3JkLkZpbGxNb2RlEhYKDmlzX3JlZHVjZV9vbmx5GAUgASgIEg0KBXByaWNlGAYgASgEEgwKBHNpemUYByABKAQSIwoKcXVvdGVfc2l6ZRgIIAEoCzIPLm5vcmQuUXVvdGVTaXplEiEKFGRlbGVnYXRvcl9hY2NvdW50X2lkGCAgASgNSACIAQESHAoPY2xpZW50X29yZGVyX2lkGCEgASgESAGIAQESHgoRc2VuZGVyX2FjY291bnRfaWQYIiABKA1IAogBARIfChJzZW5kZXJfdHJhY2tpbmdfaWQYIyABKARIA4gBAUIXChVfZGVsZWdhdG9yX2FjY291bnRfaWRCEgoQX2NsaWVudF9vcmRlcl9pZEIUChJfc2VuZGVyX2FjY291bnRfaWRCFQoTX3NlbmRlcl90cmFja2luZ19pZBqpAQoPQ2FuY2VsT3JkZXJCeUlkEhIKCnNlc3Npb25faWQYASABKAQSEAoIb3JkZXJfaWQYAiABKAQSIQoUZGVsZWdhdG9yX2FjY291bnRfaWQYICABKA1IAIgBARIeChFzZW5kZXJfYWNjb3VudF9pZBghIAEoDUgBiAEBQhcKFV9kZWxlZ2F0b3JfYWNjb3VudF9pZEIUChJfc2VuZGVyX2FjY291bnRfaWQaWAoHRGVwb3NpdBIUCgxhY3Rpb25fbm9uY2UYASABKAQSEgoKdG9rZW5fYWRkchgCIAEoDBIOCgZhbW91bnQYAyABKAQSEwoLdXNlcl9wdWJrZXkYBCABKAwaQAoIV2l0aGRyYXcSEAoIdG9rZW5faWQYASABKA0SEgoKc2Vzc2lvbl9pZBgCIAEoBBIOCgZhbW91bnQYAyABKAQaSQoYUHl0aFNldFdvcm1ob2xlR3VhcmRpYW5zEhoKEmd1YXJkaWFuX3NldF9pbmRleBgBIAEoDRIRCglhZGRyZXNzZXMYAiADKAwaQQoRUHl0aFNldFN5bWJvbEZlZWQSFQoNb3JhY2xlX3N5bWJvbBgBIAEoCRIVCg1wcmljZV9mZWVkX2lkGAIgASgMGi8KE1B5dGhQcmljZUZlZWRVcGRhdGUSGAoQcmF3X3B5dGhuZXRfZGF0YRgBIAEoDBqHAQoJTGlxdWlkYXRlEh0KFWxpcXVpZGF0b3Jfc2Vzc2lvbl9pZBgBIAEoBBIdChVsaXF1aWRhdGVlX2FjY291bnRfaWQYAiABKA0SIgoVbGlxdWlkYXRvcl9hY2NvdW50X2lkGAMgASgNSACIAQFCGAoWX2xpcXVpZGF0b3JfYWNjb3VudF9pZBojCg1SZXZva2VTZXNzaW9uEhIKCnNlc3Npb25faWQYASABKAQaBwoFUGF1c2UaCQoHVW5wYXVzZRrPAQoIVHJhbnNmZXISEgoKc2Vzc2lvbl9pZBgBIAEoBBIXCg9mcm9tX2FjY291bnRfaWQYAiABKA0SEAoIdG9rZW5faWQYAyABKA0SDgoGYW1vdW50GAQgASgEEhoKDXRvX2FjY291bnRfaWQYCCABKA1IAIgBARIyCg9zcGVjaWFsX2FjY291bnQYCSABKA4yFC5ub3JkLlNwZWNpYWxBY2NvdW50SAGIAQFCEAoOX3RvX2FjY291bnRfaWRCEgoQX3NwZWNpYWxfYWNjb3VudBqlAQoKQWRkVHJpZ2dlchISCgpzZXNzaW9uX2lkGAEgASgEEhEKCW1hcmtldF9pZBgCIAEoDRIfCgRraW5kGAMgASgOMhEubm9yZC5UcmlnZ2VyS2luZBIYCgRzaWRlGAQgASgOMgoubm9yZC5TaWRlEg0KBXByaWNlGAUgASgEEhcKCmFjY291bnRfaWQYCiABKA1IAIgBAUINCgtfYWNjb3VudF9pZBqoAQoNUmVtb3ZlVHJpZ2dlchISCgpzZXNzaW9uX2lkGAEgASgEEhEKCW1hcmtldF9pZBgCIAEoDRIfCgRraW5kGAMgASgOMhEubm9yZC5UcmlnZ2VyS2luZBIYCgRzaWRlGAQgASgOMgoubm9yZC5TaWRlEg0KBXByaWNlGAUgASgEEhcKCmFjY291bnRfaWQYCiABKA1IAIgBAUINCgtfYWNjb3VudF9pZBqXAQoMVGFrZVBvc2l0aW9uEhIKCnNlc3Npb25faWQYASABKAQSEQoJbWFya2V0X2lkGAIgASgNEgwKBHNpemUYAyABKAMSHgoRc2VuZGVyX2FjY291bnRfaWQYBCABKA1IAIgBARISCgVwcmljZRgFIAEoBEgBiAEBQhQKEl9zZW5kZXJfYWNjb3VudF9pZEIICgZfcHJpY2VCBgoEa2luZCJ3ChNBdG9taWNTdWJhY3Rpb25LaW5kEiwKDnRyYWRlX29yX3BsYWNlGAYgASgLMhIubm9yZC5UcmFkZU9yUGxhY2VIABIpCgxjYW5jZWxfb3JkZXIYByABKAsyES5ub3JkLkNhbmNlbE9yZGVySABCBwoFaW5uZXIicAoGQXRvbWljEhIKCnNlc3Npb25faWQYASABKAQSFwoKYWNjb3VudF9pZBgCIAEoDUgAiAEBEioKB2FjdGlvbnMYBiADKAsyGS5ub3JkLkF0b21pY1N1YmFjdGlvbktpbmRCDQoLX2FjY291bnRfaWQivRkKB1JlY2VpcHQSEQoJYWN0aW9uX2lkGAEgASgEEhoKA2VychggIAEoDjILLm5vcmQuRXJyb3JIABJCChVjcmVhdGVfc2Vzc2lvbl9yZXN1bHQYISABKAsyIS5ub3JkLlJlY2VpcHQuQ3JlYXRlU2Vzc2lvblJlc3VsdEgAEjwKEnBsYWNlX29yZGVyX3Jlc3VsdBgiIAEoCzIeLm5vcmQuUmVjZWlwdC5QbGFjZU9yZGVyUmVzdWx0SAASPgoTY2FuY2VsX29yZGVyX3Jlc3VsdBgjIAEoCzIfLm5vcmQuUmVjZWlwdC5DYW5jZWxPcmRlclJlc3VsdEgAEjUKDmRlcG9zaXRfcmVzdWx0GCQgASgLMhsubm9yZC5SZWNlaXB0LkRlcG9zaXRSZXN1bHRIABI+ChNpbnNlcnRfdG9rZW5fcmVzdWx0GCUgASgLMh8ubm9yZC5SZWNlaXB0Lkluc2VydFRva2VuUmVzdWx0SAASQAoUaW5zZXJ0X21hcmtldF9yZXN1bHQYJiABKAsyIC5ub3JkLlJlY2VpcHQuSW5zZXJ0TWFya2V0UmVzdWx0SAASNwoPd2l0aGRyYXdfcmVzdWx0GCcgASgLMhwubm9yZC5SZWNlaXB0LldpdGhkcmF3UmVzdWx0SAASSQoZb3JhY2xlX3N5bWJvbF9mZWVkX3Jlc3VsdBgoIAEoCzIkLm5vcmQuUmVjZWlwdC5PcmFjbGVTeW1ib2xGZWVkUmVzdWx0SAASQAoUb3JhY2xlX3VwZGF0ZV9yZXN1bHQYKSABKAsyIC5ub3JkLlJlY2VpcHQuT3JhY2xlVXBkYXRlUmVzdWx0SAASSwoadXBkYXRlX2d1YXJkaWFuX3NldF9yZXN1bHQYKiABKAsyJS5ub3JkLlJlY2VpcHQuVXBkYXRlR3VhcmRpYW5TZXRSZXN1bHRIABI1CgpsaXF1aWRhdGVkGCsgASgLMh8ubm9yZC5SZWNlaXB0LkFjY291bnRMaXF1aWRhdGVkSAASNwoPc2Vzc2lvbl9yZXZva2VkGCwgASgLMhwubm9yZC5SZWNlaXB0LlNlc3Npb25SZXZva2VkSAASJgoGcGF1c2VkGC0gASgLMhQubm9yZC5SZWNlaXB0LlBhdXNlZEgAEioKCHVucGF1c2VkGC4gASgLMhYubm9yZC5SZWNlaXB0LlVucGF1c2VkSAASMAoLdHJhbnNmZXJyZWQYLyABKAsyGS5ub3JkLlJlY2VpcHQuVHJhbnNmZXJyZWRIABIzCg10cmlnZ2VyX2FkZGVkGEAgASgLMhoubm9yZC5SZWNlaXB0LlRyaWdnZXJBZGRlZEgAEjcKD3RyaWdnZXJfcmVtb3ZlZBhBIAEoCzIcLm5vcmQuUmVjZWlwdC5UcmlnZ2VyUmVtb3ZlZEgAEk0KGHBvc2l0aW9uX3Rha2VuX29yX3RyYWRlZBhCIAEoCzIpLm5vcmQuUmVjZWlwdC5Qb3NpdGlvblRha2VuT3JUcmFkZWRSZXN1bHRIABIsCgZhdG9taWMYQyABKAsyGi5ub3JkLlJlY2VpcHQuQXRvbWljUmVzdWx0SAAaeAoGUG9zdGVkEhgKBHNpZGUYASABKA4yCi5ub3JkLlNpZGUSEQoJbWFya2V0X2lkGAIgASgNEg0KBXByaWNlGAMgASgEEgwKBHNpemUYBCABKAQSEAoIb3JkZXJfaWQYBSABKAQSEgoKYWNjb3VudF9pZBgGIAEoDRpKCgVUcmFkZRIQCghvcmRlcl9pZBgCIAEoBBINCgVwcmljZRgEIAEoBBIMCgRzaXplGAUgASgEEhIKCmFjY291bnRfaWQYBiABKA0aKQoTQ3JlYXRlU2Vzc2lvblJlc3VsdBISCgpzZXNzaW9uX2lkGAEgASgEGtYBChBQbGFjZU9yZGVyUmVzdWx0EikKBnBvc3RlZBgBIAEoCzIULm5vcmQuUmVjZWlwdC5Qb3N0ZWRIAIgBARIiCgVmaWxscxgCIAMoCzITLm5vcmQuUmVjZWlwdC5UcmFkZRIcCg9jbGllbnRfb3JkZXJfaWQYAyABKARIAYgBARIfChJzZW5kZXJfdHJhY2tpbmdfaWQYBCABKARIAogBAUIJCgdfcG9zdGVkQhIKEF9jbGllbnRfb3JkZXJfaWRCFQoTX3NlbmRlcl90cmFja2luZ19pZBpCCgtUYWtlblJlc3VsdBILCgNwbmwYASABKAMSDAoEc2l6ZRgCIAEoAxIYChB0YWtlcl9hY2NvdW50X2lkGAMgASgNGqsBChtQb3NpdGlvblRha2VuT3JUcmFkZWRSZXN1bHQSEQoJbWFya2V0X2lkGAEgASgNEioKBXRha2VuGAIgASgLMhkubm9yZC5SZWNlaXB0LlRha2VuUmVzdWx0SAASMAoGdHJhZGVkGAMgASgLMh4ubm9yZC5SZWNlaXB0LlBsYWNlT3JkZXJSZXN1bHRIAEIbChlQb3NpdGlvblRha2VuT3JUcmFkZWRLaW5kGjkKEUNhbmNlbE9yZGVyUmVzdWx0EhAKCG9yZGVyX2lkGAEgASgEEhIKCmFjY291bnRfaWQYAiABKA0acAoNRGVwb3NpdFJlc3VsdBIQCgh0b2tlbl9pZBgBIAEoDRIOCgZhbW91bnQYAiABKAQSEgoKYWNjb3VudF9pZBgDIAEoDRIUCgx1c2VyX2NyZWF0ZWQYBCABKAgSEwoLdXNlcl9wdWJrZXkYBSABKAwaQwoRSW5zZXJ0VG9rZW5SZXN1bHQSEgoKY2hhaW5fYWRkchgBIAEoDBIaCgV0b2tlbhgCIAEoCzILLm5vcmQuVG9rZW4aMgoSSW5zZXJ0TWFya2V0UmVzdWx0EhwKBm1hcmtldBgBIAEoCzIMLm5vcmQuTWFya2V0GnkKDldpdGhkcmF3UmVzdWx0EhAKCHRva2VuX2lkGAEgASgNEg4KBmFtb3VudBgCIAEoBBIPCgdiYWxhbmNlGAMgASgEEhIKCmFjY291bnRfaWQYBCABKA0SCwoDZmVlGAUgASgEEhMKC3VzZXJfcHVia2V5GAYgASgMGkAKFk9yYWNsZVN5bWJvbEZlZWRSZXN1bHQSFQoNb3JhY2xlX3N5bWJvbBgBIAEoCRIPCgdmZWVkX2lkGAIgASgMGicKEk9yYWNsZVVwZGF0ZVJlc3VsdBIRCgl0aW1lc3RhbXAYASABKAMaSAoXVXBkYXRlR3VhcmRpYW5TZXRSZXN1bHQSGgoSZ3VhcmRpYW5fc2V0X2luZGV4GAEgASgNEhEKCWFkZHJlc3NlcxgCIAMoDBpDCgxQZXJwUG9zaXRpb24SEQoJbWFya2V0X2lkGAEgASgNEhEKCWJhc2Vfc2l6ZRgCIAEoAxINCgVwcmljZRgDIAEoBBqeAQoRQWNjb3VudExpcXVpZGF0ZWQSHQoVbGlxdWlkYXRvcl9hY2NvdW50X2lkGAEgASgNEh0KFWxpcXVpZGF0ZWVfYWNjb3VudF9pZBgCIAEoDRIYChBjYW5jZWxsZWRfb3JkZXJzGAMgAygEEjEKDXJlbW92ZWRfcGVycHMYBCADKAsyGi5ub3JkLlJlY2VpcHQuUGVycFBvc2l0aW9uGhAKDlNlc3Npb25SZXZva2VkGggKBlBhdXNlZBoKCghVbnBhdXNlZBrhAQoLVHJhbnNmZXJyZWQSFwoPZnJvbV9hY2NvdW50X2lkGAEgASgNEhwKD3RvX3VzZXJfYWNjb3VudBgCIAEoDUgAiAEBEhAKCHRva2VuX2lkGAMgASgNEg4KBmFtb3VudBgEIAEoBBIXCg9hY2NvdW50X2NyZWF0ZWQYBSABKAgSNQoSdG9fc3BlY2lhbF9hY2NvdW50GAYgASgOMhQubm9yZC5TcGVjaWFsQWNjb3VudEgBiAEBQhIKEF90b191c2VyX2FjY291bnRCFQoTX3RvX3NwZWNpYWxfYWNjb3VudBoOCgxUcmlnZ2VyQWRkZWQaEAoOVHJpZ2dlclJlbW92ZWQamwEKGUF0b21pY1N1YmFjdGlvblJlc3VsdEtpbmQSPAoScGxhY2Vfb3JkZXJfcmVzdWx0GAEgASgLMh4ubm9yZC5SZWNlaXB0LlBsYWNlT3JkZXJSZXN1bHRIABI3CgxjYW5jZWxfb3JkZXIYAiABKAsyHy5ub3JkLlJlY2VpcHQuQ2FuY2VsT3JkZXJSZXN1bHRIAEIHCgVpbm5lchpICgxBdG9taWNSZXN1bHQSOAoHcmVzdWx0cxgBIAMoCzInLm5vcmQuUmVjZWlwdC5BdG9taWNTdWJhY3Rpb25SZXN1bHRLaW5kQgYKBGtpbmQqGAoEU2lkZRIHCgNBU0sQABIHCgNCSUQQASotCgtUcmlnZ2VyS2luZBINCglTVE9QX0xPU1MQABIPCgtUQUtFX1BST0ZJVBABKk8KCEZpbGxNb2RlEgkKBUxJTUlUEAASDQoJUE9TVF9PTkxZEAESFwoTSU1NRURJQVRFX09SX0NBTkNFTBACEhAKDEZJTExfT1JfS0lMTBADKiYKCk1hcmtldFR5cGUSCAoEU1BPVBAAEg4KClBFUlBFVFVBTFMQASqiFwoFRXJyb3ISDQoJRFVQTElDQVRFEAASEgoOREVDT0RFX0ZBSUxVUkUQAhIVChFJTlZBTElEX1NJR05BVFVSRRADEhQKEE1BUktFVF9OT1RfRk9VTkQQBBITCg9UT0tFTl9OT1RfRk9VTkQQBRISCg5VU0VSX05PVF9GT1VORBAGEhUKEVNFU1NJT05fTk9UX0ZPVU5EEAcSEwoPT1JERVJfTk9UX0ZPVU5EEAgSEwoPT1JERVJfU0laRV9aRVJPEAkSFwoTQVJJVEhNRVRJQ19PVkVSRkxPVxALEhcKE0lOVkFMSURfT1JERVJfT1dORVIQDhIaChZLRVlfQUxSRUFEWV9SRUdJU1RFUkVEEA8SHAoYRVhQSVJZX1RJTUVTVEFNUF9JTl9QQVNUEBASHAoYVVBEQVRFX1RJTUVTVEFNUF9JTl9QQVNUEBESGAoUVE9PX01BTllfT1BFTl9PUkRFUlMQEhIdChlXSVRIRFJBV19BTU9VTlRfVE9PX1NNQUxMEBUSFwoTUFlUSF9GRUVEX05PVF9BRERFRBBdEhUKEVBZVEhfRkVFRF9NSVNTSU5HEF4SGwoXUFlUSF9GRUVEX0FMUkVBRFlfQURERUQQXxIjCh9QWVRIX0dVQVJESUFOX1NFVF9VTklOSVRJQUxJWkVEEGASHQoZUFlUSF9HVUFSRElBTl9TRVRfSU5WQUxJRBBhEiMKH1BZVEhfRkVFRF9ERUNJTUFMU19PVVRfT0ZfUkFOR0UQYhIgChxQWVRIX0ZFRURfUFJJQ0VfT1VUX09GX1JBTkdFEGMSIwofUFlUSF9GRUVEX1ZBUklBTkNFX09VVF9PRl9SQU5HRRBkEjUKMVBZVEhfR1VBUkRJQU5fU0VUX0FORF9QWVRIX1NJR05BVFVSRV9ET19OT1RfTUFUQ0gQZRIcChhJTlZBTElEX1RPS0VOX1BBUkFNRVRFUlMQZhIcChhJTkRFWF9QUklDRV9PVVRfT0ZfUkFOR0UQZxIfChtJTkRFWF9ERUNJTUFMU19PVVRfT0ZfUkFOR0UQaBIZChVJTlZBTElEX1NUQVRFX1ZFUlNJT04QaRITCg9JTlZBTElEX01BUkdJTlMQaxIhCh1NQVJLRVRfREVDSU1BTFNfRVhDRUVEX0xJTUlUUxBtEhMKD1RPT19NQU5ZX1RPS0VOUxBuEhQKEEZVTkRJTkdfT1ZFUkZMT1cQexI3CjNDQU5fUkVEVUNFX1BPU0lUSU9OX09OTFlfSUZfQUxMX09SREVSU19BUkVfQ0FOQ0VMRUQQfBIXChNVTkVYUEVDVEVEX1RPS0VOX0lEEH8SFAoPVE9LRU5fTk9UX1JFQURZEIIBEhwKGFRPS0VOX0FMUkVBRFlfUkVHSVNURVJFRBBwEiEKHElNTUVESUFURV9PUkRFUl9HT1RfTk9fRklMTFMQhQESGQoURkFJTEVEX1RPX0ZJTExfTElNSVQQhgESMAorUE9TVF9PTkxZX01VU1RfTk9UX0ZJTExfQU5ZX09QUE9TSVRFX09SREVSUxCHARIMCgdJTlZBTElEEIgBEhAKC01BSU5URU5BTkNFEIkBEhoKFU1JTklNVU1fU0laRV9ERUNJTUFMUxCKARIyCi1QQVJBTUVURVJTX1dJTExfQ1JFQVRFX05PTl9PUEVSQVRJT05BTF9NQVJLRVQQiwESIgodT05MWV9JTU1FRElBVEVfT1JERVJTX0FMTE9XRUQQjAESGwoWVE9PX01BTllfVVNFUl9BQ0NPVU5UUxCNARIWChFBQ0NPVU5UX05PVF9GT1VORBCOARIaChVBQ0NPVU5UX0lOVkFMSURfT1dORVIQjwESEQoMRFVTVF9BQ0NPVU5UEJEBEgwKB0JBTEFOQ0UQoAESHQoYQkFMQU5DRV9ERVBPU0lUX09WRVJGTE9XEKEBEhwKF0JBTEFOQ0VfQ0hBTkdFX09WRVJGTE9XEKIBEiIKHUJBTEFOQ0VfQ0hBTkdFX0xJTUlUX0VYQ0VFREVEEKMBEhkKFEJBTEFOQ0VfSU5TVUZGSUNJRU5UEKQBEh4KGVVOQVVUSEVOVElDQVRFRF9MMV9BQ1RJT04QpQESHQoYRU5DT0RFRF9BQ1RJT05fVE9PX0xBUkdFEKYBEgwKB1RSSUdHRVIQqAESGgoVVFJJR0dFUl9JTlZBTElEX1BSSUNFEKkBEhYKEVRSSUdHRVJfTk9UX0ZPVU5EEKoBEg4KCVRJTUVTVEFNUBCwARIfChpUSU1FU1RBTVBfT1VUX09GX1RIUkVTSE9MRBCxARIUCg9USU1FU1RBTVBfU1RBTEUQsgESJQogQkFOS1JVUFRDWV9JTlNVRkZJQ0lFTlRfQ09WRVJBR0UQuQESGQoUQkFOS1JVUFRDWV9OT1RfRk9VTkQQugESGwoWQkFOS1JVUFRDWV9OT1RfQUxMT1dFRBC7ARIVChBNQVJLRVRfTk9UX1JFQURZEMABEhIKDU1BUktFVF9GUk9aRU4QwQESDQoIUE9TSVRJT04QyAESFwoSUE9TSVRJT05fTk9UX0ZPVU5EEMkBEhkKFFBPU0lUSU9OX1NUQVRFX09SREVSEMoBEh8KGlBPU0lUSU9OX1NUQVRFX09SREVSX1BSSUNFEMsBEh4KGVBPU0lUSU9OX1NUQVRFX09SREVSX1NJWkUQzAESHgoZUE9TSVRJT05fU1RBVEVfT1JERVJfU0lERRDNARIYChNQT1NJVElPTl9TSVpFX0xJTUlUEM4BEgoKBVBSSUNFENEBEhsKFlNJR05BVFVSRV9WRVJJRklDQVRJT04Q2QESMAorU0lHTkFUVVJFX1ZFUklGSUNBVElPTl9NQUxGT1JNRURfUFVCTElDX0tFWRDaARIqCiVTSUdOQVRVUkVfVkVSSUZJQ0FUSU9OX0lOVkFMSURfTEVOR1RIENsBEgkKBFJJU0sQ4AESNAovUklTS19ERUxFR0FUSU9OX01GX1RPX0JFX0xFU1NfVEhBTl9PUl9FUVVBTF9NTUYQ4QESJAofUklTS19PTUZfTEVTU19USEFOX09SX0VRVUFMX0lNRhDiARIkCh9SSVNLX09NRl9MRVNTX1RIQU5fT1JfRVFVQUxfQ01GEOMBEioKJVJJU0tfVFJBREVfT01GX0xFU1NfVEhBTl9PUl9FUVVBTF9DTUYQ5QESNQowUklTS19VTkhFQUxUSFlfTUZfQU5EX1BPTl9BRlRFUl9CRVRURVJfT0ZfQkVGT1JFEOQBEhQKD09SREVSX0VYRUNVVElPThDwARIaChVPUkRFUl9FWEVDVVRJT05fRU1QVFkQ8QESIQocT1JERVJfRVhFQ1VUSU9OX0ZJTExfT1JfS0lMTBDyARIjCh5PUkRFUl9FWEVDVVRJT05fTUlTU0lOR19MSU1JVFMQ8wESIgodT1JERVJfRVhFQ1VUSU9OX01JU1NJTkdfUFJJQ0UQ9AESHwoaT1JERVJfRVhFQ1VUSU9OX1NJWkVfTElNSVQQ9QESIAobT1JERVJfRVhFQ1VUSU9OX0xJTUlUX1BSSUNFEPYBEh4KGU9SREVSX1JFRFVDRV9JU19QT1NUX09OTFkQ9wESHwoaT1JERVJfRVhFQ1VUSU9OX1NFTExfUFJJQ0UQ+AESKAojQVRPTUlDU19UUkFERVNfQ0FOTk9UX0ZPTExPV19QTEFDRVMQgAISMAorQVRPTUlDU19DQU5DRUxTX0NBTk5PVF9GT0xMT1dfVFJBREVTX1BMQUNFUxCBAhImCiFBQ1RJT05fUE9TSVRJT05fU0hPVUxEX0JFX0NPVkVSRUQQkQISGQoUQUNUSU9OX0lOVkFMSURfTk9OQ0UQkgISKQokQUNUSU9OX1BST1BPU0VEX1BSSUNFX01VU1RfQkVfSElHSEVSEJMCEhQKD05PVF9JTVBMRU1FTlRFRBD0AxIMCgdEcm9wcGVkEOcHKh4KDlNwZWNpYWxBY2NvdW50EgwKCEZlZVZhdWx0EABiBnByb3RvMw");
18
+ fileDesc("Cgpub3JkLnByb3RvEgRub3JkItABCgZNYXJrZXQSEQoJbWFya2V0X2lkGAEgASgNEhYKDnByaWNlX2RlY2ltYWxzGAIgASgNEhUKDXNpemVfZGVjaW1hbHMYAyABKA0SFQoNYmFzZV90b2tlbl9pZBgEIAEoDRIlCgttYXJrZXRfdHlwZRgFIAEoDjIQLm5vcmQuTWFya2V0VHlwZRIPCgdpbWZfYnBzGAYgASgNEg8KB2NtZl9icHMYByABKA0SDwoHbW1mX2JwcxgIIAEoDRITCgt2aWV3X3N5bWJvbBgKIAEoCSJaCgVUb2tlbhIQCgh0b2tlbl9pZBgBIAEoDRIWCg50b2tlbl9kZWNpbWFscxgCIAEoDRISCgp3ZWlnaHRfYnBzGAQgASgNEhMKC3ZpZXdfc3ltYm9sGAUgASgJIigKCVF1b3RlU2l6ZRIMCgRzaXplGAEgASgEEg0KBXByaWNlGAIgASgEIk4KCk9yZGVyTGltaXQSDQoFcHJpY2UYBiABKAQSDAoEc2l6ZRgHIAEoBBIjCgpxdW90ZV9zaXplGAggASgLMg8ubm9yZC5RdW90ZVNpemUiYAoJT3JkZXJUeXBlEhgKBHNpZGUYAyABKA4yCi5ub3JkLlNpZGUSIQoJZmlsbF9tb2RlGAQgASgOMg4ubm9yZC5GaWxsTW9kZRIWCg5pc19yZWR1Y2Vfb25seRgFIAEoCCKZAQoMVHJhZGVPclBsYWNlEhEKCW1hcmtldF9pZBgCIAEoDRIjCgpvcmRlcl90eXBlGAMgASgLMg8ubm9yZC5PcmRlclR5cGUSHwoFbGltaXQYBiABKAsyEC5ub3JkLk9yZGVyTGltaXQSHAoPY2xpZW50X29yZGVyX2lkGCEgASgESACIAQFCEgoQX2NsaWVudF9vcmRlcl9pZCIfCgtDYW5jZWxPcmRlchIQCghvcmRlcl9pZBgCIAEoBCK/GgoGQWN0aW9uEhkKEWN1cnJlbnRfdGltZXN0YW1wGAEgASgDEg0KBW5vbmNlGAIgASgNEjQKDmNyZWF0ZV9zZXNzaW9uGAQgASgLMhoubm9yZC5BY3Rpb24uQ3JlYXRlU2Vzc2lvbkgAEjAKDGNyZWF0ZV90b2tlbhgFIAEoCzIYLm5vcmQuQWN0aW9uLkNyZWF0ZVRva2VuSAASMgoNY3JlYXRlX21hcmtldBgGIAEoCzIZLm5vcmQuQWN0aW9uLkNyZWF0ZU1hcmtldEgAEi4KC3BsYWNlX29yZGVyGAcgASgLMhcubm9yZC5BY3Rpb24uUGxhY2VPcmRlckgAEjoKEmNhbmNlbF9vcmRlcl9ieV9pZBgIIAEoCzIcLm5vcmQuQWN0aW9uLkNhbmNlbE9yZGVyQnlJZEgAEicKB2RlcG9zaXQYCSABKAsyFC5ub3JkLkFjdGlvbi5EZXBvc2l0SAASKQoId2l0aGRyYXcYCiABKAsyFS5ub3JkLkFjdGlvbi5XaXRoZHJhd0gAEkwKG3B5dGhfc2V0X3dvcm1ob2xlX2d1YXJkaWFucxgLIAEoCzIlLm5vcmQuQWN0aW9uLlB5dGhTZXRXb3JtaG9sZUd1YXJkaWFuc0gAEj4KFHB5dGhfc2V0X3N5bWJvbF9mZWVkGAwgASgLMh4ubm9yZC5BY3Rpb24uUHl0aFNldFN5bWJvbEZlZWRIABJCChZweXRoX3ByaWNlX2ZlZWRfdXBkYXRlGA0gASgLMiAubm9yZC5BY3Rpb24uUHl0aFByaWNlRmVlZFVwZGF0ZUgAEisKCWxpcXVpZGF0ZRgOIAEoCzIWLm5vcmQuQWN0aW9uLkxpcXVpZGF0ZUgAEjQKDnJldm9rZV9zZXNzaW9uGA8gASgLMhoubm9yZC5BY3Rpb24uUmV2b2tlU2Vzc2lvbkgAEiMKBXBhdXNlGBAgASgLMhIubm9yZC5BY3Rpb24uUGF1c2VIABInCgd1bnBhdXNlGBEgASgLMhQubm9yZC5BY3Rpb24uVW5wYXVzZUgAEikKCHRyYW5zZmVyGBIgASgLMhUubm9yZC5BY3Rpb24uVHJhbnNmZXJIABIuCgthZGRfdHJpZ2dlchggIAEoCzIXLm5vcmQuQWN0aW9uLkFkZFRyaWdnZXJIABI0Cg5yZW1vdmVfdHJpZ2dlchghIAEoCzIaLm5vcmQuQWN0aW9uLlJlbW92ZVRyaWdnZXJIABIyCg10YWtlX3Bvc2l0aW9uGCIgASgLMhkubm9yZC5BY3Rpb24uVGFrZVBvc2l0aW9uSAASHgoGYXRvbWljGCMgASgLMgwubm9yZC5BdG9taWNIABpTCg1DcmVhdGVTZXNzaW9uEhMKC3VzZXJfcHVia2V5GAEgASgMEhMKC2Jsc3RfcHVia2V5GAIgASgMEhgKEGV4cGlyeV90aW1lc3RhbXAYAyABKAMadwoLQ3JlYXRlVG9rZW4SFgoOdG9rZW5fZGVjaW1hbHMYASABKA0SEgoKd2VpZ2h0X2JwcxgDIAEoDRITCgt2aWV3X3N5bWJvbBgEIAEoCRIVCg1vcmFjbGVfc3ltYm9sGAUgASgJEhAKCHNvbF9hZGRyGAYgASgMGtoBCgxDcmVhdGVNYXJrZXQSFQoNc2l6ZV9kZWNpbWFscxgBIAEoDRIWCg5wcmljZV9kZWNpbWFscxgCIAEoDRIPCgdpbWZfYnBzGAMgASgNEg8KB2NtZl9icHMYBCABKA0SDwoHbW1mX2JwcxgFIAEoDRIlCgttYXJrZXRfdHlwZRgGIAEoDjIQLm5vcmQuTWFya2V0VHlwZRITCgt2aWV3X3N5bWJvbBgHIAEoCRIVCg1vcmFjbGVfc3ltYm9sGAggASgJEhUKDWJhc2VfdG9rZW5faWQYCSABKA0apgMKClBsYWNlT3JkZXISEgoKc2Vzc2lvbl9pZBgBIAEoBBIRCgltYXJrZXRfaWQYAiABKA0SGAoEc2lkZRgDIAEoDjIKLm5vcmQuU2lkZRIhCglmaWxsX21vZGUYBCABKA4yDi5ub3JkLkZpbGxNb2RlEhYKDmlzX3JlZHVjZV9vbmx5GAUgASgIEg0KBXByaWNlGAYgASgEEgwKBHNpemUYByABKAQSIwoKcXVvdGVfc2l6ZRgIIAEoCzIPLm5vcmQuUXVvdGVTaXplEiEKFGRlbGVnYXRvcl9hY2NvdW50X2lkGCAgASgNSACIAQESHAoPY2xpZW50X29yZGVyX2lkGCEgASgESAGIAQESHgoRc2VuZGVyX2FjY291bnRfaWQYIiABKA1IAogBARIfChJzZW5kZXJfdHJhY2tpbmdfaWQYIyABKARIA4gBAUIXChVfZGVsZWdhdG9yX2FjY291bnRfaWRCEgoQX2NsaWVudF9vcmRlcl9pZEIUChJfc2VuZGVyX2FjY291bnRfaWRCFQoTX3NlbmRlcl90cmFja2luZ19pZBqpAQoPQ2FuY2VsT3JkZXJCeUlkEhIKCnNlc3Npb25faWQYASABKAQSEAoIb3JkZXJfaWQYAiABKAQSIQoUZGVsZWdhdG9yX2FjY291bnRfaWQYICABKA1IAIgBARIeChFzZW5kZXJfYWNjb3VudF9pZBghIAEoDUgBiAEBQhcKFV9kZWxlZ2F0b3JfYWNjb3VudF9pZEIUChJfc2VuZGVyX2FjY291bnRfaWQaWAoHRGVwb3NpdBIUCgxhY3Rpb25fbm9uY2UYASABKAQSEgoKdG9rZW5fYWRkchgCIAEoDBIOCgZhbW91bnQYAyABKAQSEwoLdXNlcl9wdWJrZXkYBCABKAwaQAoIV2l0aGRyYXcSEAoIdG9rZW5faWQYASABKA0SEgoKc2Vzc2lvbl9pZBgCIAEoBBIOCgZhbW91bnQYAyABKAQaSQoYUHl0aFNldFdvcm1ob2xlR3VhcmRpYW5zEhoKEmd1YXJkaWFuX3NldF9pbmRleBgBIAEoDRIRCglhZGRyZXNzZXMYAiADKAwaQQoRUHl0aFNldFN5bWJvbEZlZWQSFQoNb3JhY2xlX3N5bWJvbBgBIAEoCRIVCg1wcmljZV9mZWVkX2lkGAIgASgMGi8KE1B5dGhQcmljZUZlZWRVcGRhdGUSGAoQcmF3X3B5dGhuZXRfZGF0YRgBIAEoDBqHAQoJTGlxdWlkYXRlEh0KFWxpcXVpZGF0b3Jfc2Vzc2lvbl9pZBgBIAEoBBIdChVsaXF1aWRhdGVlX2FjY291bnRfaWQYAiABKA0SIgoVbGlxdWlkYXRvcl9hY2NvdW50X2lkGAMgASgNSACIAQFCGAoWX2xpcXVpZGF0b3JfYWNjb3VudF9pZBojCg1SZXZva2VTZXNzaW9uEhIKCnNlc3Npb25faWQYASABKAQaBwoFUGF1c2UaCQoHVW5wYXVzZRrPAQoIVHJhbnNmZXISEgoKc2Vzc2lvbl9pZBgBIAEoBBIXCg9mcm9tX2FjY291bnRfaWQYAiABKA0SEAoIdG9rZW5faWQYAyABKA0SDgoGYW1vdW50GAQgASgEEhoKDXRvX2FjY291bnRfaWQYCCABKA1IAIgBARIyCg9zcGVjaWFsX2FjY291bnQYCSABKA4yFC5ub3JkLlNwZWNpYWxBY2NvdW50SAGIAQFCEAoOX3RvX2FjY291bnRfaWRCEgoQX3NwZWNpYWxfYWNjb3VudBrXAQoKQWRkVHJpZ2dlchISCgpzZXNzaW9uX2lkGAEgASgEEhEKCW1hcmtldF9pZBgCIAEoDRIfCgRraW5kGAMgASgOMhEubm9yZC5UcmlnZ2VyS2luZBIYCgRzaWRlGAQgASgOMgoubm9yZC5TaWRlEhUKDXRyaWdnZXJfcHJpY2UYBSABKAQSGAoLbGltaXRfcHJpY2UYBiABKARIAIgBARIXCgphY2NvdW50X2lkGAogASgNSAGIAQFCDgoMX2xpbWl0X3ByaWNlQg0KC19hY2NvdW50X2lkGtoBCg1SZW1vdmVUcmlnZ2VyEhIKCnNlc3Npb25faWQYASABKAQSEQoJbWFya2V0X2lkGAIgASgNEh8KBGtpbmQYAyABKA4yES5ub3JkLlRyaWdnZXJLaW5kEhgKBHNpZGUYBCABKA4yCi5ub3JkLlNpZGUSFQoNdHJpZ2dlcl9wcmljZRgFIAEoBBIYCgtsaW1pdF9wcmljZRgGIAEoBEgAiAEBEhcKCmFjY291bnRfaWQYCiABKA1IAYgBAUIOCgxfbGltaXRfcHJpY2VCDQoLX2FjY291bnRfaWQalwEKDFRha2VQb3NpdGlvbhISCgpzZXNzaW9uX2lkGAEgASgEEhEKCW1hcmtldF9pZBgCIAEoDRIMCgRzaXplGAMgASgDEh4KEXNlbmRlcl9hY2NvdW50X2lkGAQgASgNSACIAQESEgoFcHJpY2UYBSABKARIAYgBAUIUChJfc2VuZGVyX2FjY291bnRfaWRCCAoGX3ByaWNlQgYKBGtpbmQidwoTQXRvbWljU3ViYWN0aW9uS2luZBIsCg50cmFkZV9vcl9wbGFjZRgGIAEoCzISLm5vcmQuVHJhZGVPclBsYWNlSAASKQoMY2FuY2VsX29yZGVyGAcgASgLMhEubm9yZC5DYW5jZWxPcmRlckgAQgcKBWlubmVyInAKBkF0b21pYxISCgpzZXNzaW9uX2lkGAEgASgEEhcKCmFjY291bnRfaWQYAiABKA1IAIgBARIqCgdhY3Rpb25zGAYgAygLMhkubm9yZC5BdG9taWNTdWJhY3Rpb25LaW5kQg0KC19hY2NvdW50X2lkItAZCgdSZWNlaXB0EhEKCWFjdGlvbl9pZBgBIAEoBBIaCgNlcnIYICABKA4yCy5ub3JkLkVycm9ySAASQgoVY3JlYXRlX3Nlc3Npb25fcmVzdWx0GCEgASgLMiEubm9yZC5SZWNlaXB0LkNyZWF0ZVNlc3Npb25SZXN1bHRIABI8ChJwbGFjZV9vcmRlcl9yZXN1bHQYIiABKAsyHi5ub3JkLlJlY2VpcHQuUGxhY2VPcmRlclJlc3VsdEgAEj4KE2NhbmNlbF9vcmRlcl9yZXN1bHQYIyABKAsyHy5ub3JkLlJlY2VpcHQuQ2FuY2VsT3JkZXJSZXN1bHRIABI1Cg5kZXBvc2l0X3Jlc3VsdBgkIAEoCzIbLm5vcmQuUmVjZWlwdC5EZXBvc2l0UmVzdWx0SAASPgoTaW5zZXJ0X3Rva2VuX3Jlc3VsdBglIAEoCzIfLm5vcmQuUmVjZWlwdC5JbnNlcnRUb2tlblJlc3VsdEgAEkAKFGluc2VydF9tYXJrZXRfcmVzdWx0GCYgASgLMiAubm9yZC5SZWNlaXB0Lkluc2VydE1hcmtldFJlc3VsdEgAEjcKD3dpdGhkcmF3X3Jlc3VsdBgnIAEoCzIcLm5vcmQuUmVjZWlwdC5XaXRoZHJhd1Jlc3VsdEgAEkkKGW9yYWNsZV9zeW1ib2xfZmVlZF9yZXN1bHQYKCABKAsyJC5ub3JkLlJlY2VpcHQuT3JhY2xlU3ltYm9sRmVlZFJlc3VsdEgAEkAKFG9yYWNsZV91cGRhdGVfcmVzdWx0GCkgASgLMiAubm9yZC5SZWNlaXB0Lk9yYWNsZVVwZGF0ZVJlc3VsdEgAEksKGnVwZGF0ZV9ndWFyZGlhbl9zZXRfcmVzdWx0GCogASgLMiUubm9yZC5SZWNlaXB0LlVwZGF0ZUd1YXJkaWFuU2V0UmVzdWx0SAASNQoKbGlxdWlkYXRlZBgrIAEoCzIfLm5vcmQuUmVjZWlwdC5BY2NvdW50TGlxdWlkYXRlZEgAEjcKD3Nlc3Npb25fcmV2b2tlZBgsIAEoCzIcLm5vcmQuUmVjZWlwdC5TZXNzaW9uUmV2b2tlZEgAEiYKBnBhdXNlZBgtIAEoCzIULm5vcmQuUmVjZWlwdC5QYXVzZWRIABIqCgh1bnBhdXNlZBguIAEoCzIWLm5vcmQuUmVjZWlwdC5VbnBhdXNlZEgAEjAKC3RyYW5zZmVycmVkGC8gASgLMhkubm9yZC5SZWNlaXB0LlRyYW5zZmVycmVkSAASMwoNdHJpZ2dlcl9hZGRlZBhAIAEoCzIaLm5vcmQuUmVjZWlwdC5UcmlnZ2VyQWRkZWRIABJEChZ0cmlnZ2VyX3N0YXR1c19jaGFuZ2VkGEEgASgLMiIubm9yZC5SZWNlaXB0LlRyaWdnZXJTdGF0dXNDaGFuZ2VkSAASTQoYcG9zaXRpb25fdGFrZW5fb3JfdHJhZGVkGEIgASgLMikubm9yZC5SZWNlaXB0LlBvc2l0aW9uVGFrZW5PclRyYWRlZFJlc3VsdEgAEiwKBmF0b21pYxhDIAEoCzIaLm5vcmQuUmVjZWlwdC5BdG9taWNSZXN1bHRIABp4CgZQb3N0ZWQSGAoEc2lkZRgBIAEoDjIKLm5vcmQuU2lkZRIRCgltYXJrZXRfaWQYAiABKA0SDQoFcHJpY2UYAyABKAQSDAoEc2l6ZRgEIAEoBBIQCghvcmRlcl9pZBgFIAEoBBISCgphY2NvdW50X2lkGAYgASgNGkoKBVRyYWRlEhAKCG9yZGVyX2lkGAIgASgEEg0KBXByaWNlGAQgASgEEgwKBHNpemUYBSABKAQSEgoKYWNjb3VudF9pZBgGIAEoDRopChNDcmVhdGVTZXNzaW9uUmVzdWx0EhIKCnNlc3Npb25faWQYASABKAQa1gEKEFBsYWNlT3JkZXJSZXN1bHQSKQoGcG9zdGVkGAEgASgLMhQubm9yZC5SZWNlaXB0LlBvc3RlZEgAiAEBEiIKBWZpbGxzGAIgAygLMhMubm9yZC5SZWNlaXB0LlRyYWRlEhwKD2NsaWVudF9vcmRlcl9pZBgDIAEoBEgBiAEBEh8KEnNlbmRlcl90cmFja2luZ19pZBgEIAEoBEgCiAEBQgkKB19wb3N0ZWRCEgoQX2NsaWVudF9vcmRlcl9pZEIVChNfc2VuZGVyX3RyYWNraW5nX2lkGkIKC1Rha2VuUmVzdWx0EgsKA3BubBgBIAEoAxIMCgRzaXplGAIgASgDEhgKEHRha2VyX2FjY291bnRfaWQYAyABKA0aqwEKG1Bvc2l0aW9uVGFrZW5PclRyYWRlZFJlc3VsdBIRCgltYXJrZXRfaWQYASABKA0SKgoFdGFrZW4YAiABKAsyGS5ub3JkLlJlY2VpcHQuVGFrZW5SZXN1bHRIABIwCgZ0cmFkZWQYAyABKAsyHi5ub3JkLlJlY2VpcHQuUGxhY2VPcmRlclJlc3VsdEgAQhsKGVBvc2l0aW9uVGFrZW5PclRyYWRlZEtpbmQaOQoRQ2FuY2VsT3JkZXJSZXN1bHQSEAoIb3JkZXJfaWQYASABKAQSEgoKYWNjb3VudF9pZBgCIAEoDRpwCg1EZXBvc2l0UmVzdWx0EhAKCHRva2VuX2lkGAEgASgNEg4KBmFtb3VudBgCIAEoBBISCgphY2NvdW50X2lkGAMgASgNEhQKDHVzZXJfY3JlYXRlZBgEIAEoCBITCgt1c2VyX3B1YmtleRgFIAEoDBpDChFJbnNlcnRUb2tlblJlc3VsdBISCgpjaGFpbl9hZGRyGAEgASgMEhoKBXRva2VuGAIgASgLMgsubm9yZC5Ub2tlbhoyChJJbnNlcnRNYXJrZXRSZXN1bHQSHAoGbWFya2V0GAEgASgLMgwubm9yZC5NYXJrZXQaeQoOV2l0aGRyYXdSZXN1bHQSEAoIdG9rZW5faWQYASABKA0SDgoGYW1vdW50GAIgASgEEg8KB2JhbGFuY2UYAyABKAQSEgoKYWNjb3VudF9pZBgEIAEoDRILCgNmZWUYBSABKAQSEwoLdXNlcl9wdWJrZXkYBiABKAwaQAoWT3JhY2xlU3ltYm9sRmVlZFJlc3VsdBIVCg1vcmFjbGVfc3ltYm9sGAEgASgJEg8KB2ZlZWRfaWQYAiABKAwaJwoST3JhY2xlVXBkYXRlUmVzdWx0EhEKCXRpbWVzdGFtcBgBIAEoAxpIChdVcGRhdGVHdWFyZGlhblNldFJlc3VsdBIaChJndWFyZGlhbl9zZXRfaW5kZXgYASABKA0SEQoJYWRkcmVzc2VzGAIgAygMGkMKDFBlcnBQb3NpdGlvbhIRCgltYXJrZXRfaWQYASABKA0SEQoJYmFzZV9zaXplGAIgASgDEg0KBXByaWNlGAMgASgEGp4BChFBY2NvdW50TGlxdWlkYXRlZBIdChVsaXF1aWRhdG9yX2FjY291bnRfaWQYASABKA0SHQoVbGlxdWlkYXRlZV9hY2NvdW50X2lkGAIgASgNEhgKEGNhbmNlbGxlZF9vcmRlcnMYAyADKAQSMQoNcmVtb3ZlZF9wZXJwcxgEIAMoCzIaLm5vcmQuUmVjZWlwdC5QZXJwUG9zaXRpb24aEAoOU2Vzc2lvblJldm9rZWQaCAoGUGF1c2VkGgoKCFVucGF1c2VkGuEBCgtUcmFuc2ZlcnJlZBIXCg9mcm9tX2FjY291bnRfaWQYASABKA0SHAoPdG9fdXNlcl9hY2NvdW50GAIgASgNSACIAQESEAoIdG9rZW5faWQYAyABKA0SDgoGYW1vdW50GAQgASgEEhcKD2FjY291bnRfY3JlYXRlZBgFIAEoCBI1ChJ0b19zcGVjaWFsX2FjY291bnQYBiABKA4yFC5ub3JkLlNwZWNpYWxBY2NvdW50SAGIAQFCEgoQX3RvX3VzZXJfYWNjb3VudEIVChNfdG9fc3BlY2lhbF9hY2NvdW50Gg4KDFRyaWdnZXJBZGRlZBoWChRUcmlnZ2VyU3RhdHVzQ2hhbmdlZBqbAQoZQXRvbWljU3ViYWN0aW9uUmVzdWx0S2luZBI8ChJwbGFjZV9vcmRlcl9yZXN1bHQYASABKAsyHi5ub3JkLlJlY2VpcHQuUGxhY2VPcmRlclJlc3VsdEgAEjcKDGNhbmNlbF9vcmRlchgCIAEoCzIfLm5vcmQuUmVjZWlwdC5DYW5jZWxPcmRlclJlc3VsdEgAQgcKBWlubmVyGkgKDEF0b21pY1Jlc3VsdBI4CgdyZXN1bHRzGAEgAygLMicubm9yZC5SZWNlaXB0LkF0b21pY1N1YmFjdGlvblJlc3VsdEtpbmRCBgoEa2luZCoYCgRTaWRlEgcKA0FTSxAAEgcKA0JJRBABKi0KC1RyaWdnZXJLaW5kEg0KCVNUT1BfTE9TUxAAEg8KC1RBS0VfUFJPRklUEAEqSgoNVHJpZ2dlclN0YXR1cxIKCgZBQ1RJVkUQABILCgdTVUNDRVNTEAESCgoGQ0FOQ0VMEAISCAoERkFJTBADEgoKBlJFTU9WRRAEKk8KCEZpbGxNb2RlEgkKBUxJTUlUEAASDQoJUE9TVF9PTkxZEAESFwoTSU1NRURJQVRFX09SX0NBTkNFTBACEhAKDEZJTExfT1JfS0lMTBADKiYKCk1hcmtldFR5cGUSCAoEU1BPVBAAEg4KClBFUlBFVFVBTFMQASqxGAoFRXJyb3ISDQoJRFVQTElDQVRFEAASEgoOREVDT0RFX0ZBSUxVUkUQAhIVChFJTlZBTElEX1NJR05BVFVSRRADEhQKEE1BUktFVF9OT1RfRk9VTkQQBBITCg9UT0tFTl9OT1RfRk9VTkQQBRISCg5VU0VSX05PVF9GT1VORBAGEhUKEVNFU1NJT05fTk9UX0ZPVU5EEAcSEwoPT1JERVJfTk9UX0ZPVU5EEAgSEwoPT1JERVJfU0laRV9aRVJPEAkSFwoTQVJJVEhNRVRJQ19PVkVSRkxPVxALEhcKE0lOVkFMSURfT1JERVJfT1dORVIQDhIaChZLRVlfQUxSRUFEWV9SRUdJU1RFUkVEEA8SHAoYRVhQSVJZX1RJTUVTVEFNUF9JTl9QQVNUEBASHAoYVVBEQVRFX1RJTUVTVEFNUF9JTl9QQVNUEBESGAoUVE9PX01BTllfT1BFTl9PUkRFUlMQEhIdChlXSVRIRFJBV19BTU9VTlRfVE9PX1NNQUxMEBUSIAocREVDT0RFX0ZBSUxVUkVfTEVOR1RIX1BSRUZJWBAhEhYKEkRFQ09ERV9GQUlMVVJFX1JBVxAiEhkKFURFQ09ERV9GQUlMVVJFX0RPTUFJThAjEhcKE1BZVEhfRkVFRF9OT1RfQURERUQQXRIVChFQWVRIX0ZFRURfTUlTU0lORxBeEhsKF1BZVEhfRkVFRF9BTFJFQURZX0FEREVEEF8SIwofUFlUSF9HVUFSRElBTl9TRVRfVU5JTklUSUFMSVpFRBBgEh0KGVBZVEhfR1VBUkRJQU5fU0VUX0lOVkFMSUQQYRIjCh9QWVRIX0ZFRURfREVDSU1BTFNfT1VUX09GX1JBTkdFEGISIAocUFlUSF9GRUVEX1BSSUNFX09VVF9PRl9SQU5HRRBjEiMKH1BZVEhfRkVFRF9WQVJJQU5DRV9PVVRfT0ZfUkFOR0UQZBI1CjFQWVRIX0dVQVJESUFOX1NFVF9BTkRfUFlUSF9TSUdOQVRVUkVfRE9fTk9UX01BVENIEGUSHAoYSU5WQUxJRF9UT0tFTl9QQVJBTUVURVJTEGYSHAoYSU5ERVhfUFJJQ0VfT1VUX09GX1JBTkdFEGcSHwobSU5ERVhfREVDSU1BTFNfT1VUX09GX1JBTkdFEGgSGQoVSU5WQUxJRF9TVEFURV9WRVJTSU9OEGkSEwoPSU5WQUxJRF9NQVJHSU5TEGsSIQodTUFSS0VUX0RFQ0lNQUxTX0VYQ0VFRF9MSU1JVFMQbRITCg9UT09fTUFOWV9UT0tFTlMQbhIUChBGVU5ESU5HX09WRVJGTE9XEHsSNwozQ0FOX1JFRFVDRV9QT1NJVElPTl9PTkxZX0lGX0FMTF9PUkRFUlNfQVJFX0NBTkNFTEVEEHwSFwoTVU5FWFBFQ1RFRF9UT0tFTl9JRBB/EhQKD1RPS0VOX05PVF9SRUFEWRCCARIcChhUT0tFTl9BTFJFQURZX1JFR0lTVEVSRUQQcBIhChxJTU1FRElBVEVfT1JERVJfR09UX05PX0ZJTExTEIUBEhkKFEZBSUxFRF9UT19GSUxMX0xJTUlUEIYBEjAKK1BPU1RfT05MWV9NVVNUX05PVF9GSUxMX0FOWV9PUFBPU0lURV9PUkRFUlMQhwESDAoHSU5WQUxJRBCIARIQCgtNQUlOVEVOQU5DRRCJARIaChVNSU5JTVVNX1NJWkVfREVDSU1BTFMQigESMgotUEFSQU1FVEVSU19XSUxMX0NSRUFURV9OT05fT1BFUkFUSU9OQUxfTUFSS0VUEIsBEiIKHU9OTFlfSU1NRURJQVRFX09SREVSU19BTExPV0VEEIwBEhsKFlRPT19NQU5ZX1VTRVJfQUNDT1VOVFMQjQESFgoRQUNDT1VOVF9OT1RfRk9VTkQQjgESGgoVQUNDT1VOVF9JTlZBTElEX09XTkVSEI8BEhEKDERVU1RfQUNDT1VOVBCRARIMCgdCQUxBTkNFEKABEh0KGEJBTEFOQ0VfREVQT1NJVF9PVkVSRkxPVxChARIcChdCQUxBTkNFX0NIQU5HRV9PVkVSRkxPVxCiARIiCh1CQUxBTkNFX0NIQU5HRV9MSU1JVF9FWENFRURFRBCjARIZChRCQUxBTkNFX0lOU1VGRklDSUVOVBCkARIeChlVTkFVVEhFTlRJQ0FURURfTDFfQUNUSU9OEKUBEh0KGEVOQ09ERURfQUNUSU9OX1RPT19MQVJHRRCmARIMCgdUUklHR0VSEKgBEhoKFVRSSUdHRVJfSU5WQUxJRF9QUklDRRCpARIWChFUUklHR0VSX05PVF9GT1VORBCqARIOCglUSU1FU1RBTVAQsAESHwoaVElNRVNUQU1QX09VVF9PRl9USFJFU0hPTEQQsQESFAoPVElNRVNUQU1QX1NUQUxFELIBEiUKIEJBTktSVVBUQ1lfSU5TVUZGSUNJRU5UX0NPVkVSQUdFELkBEhkKFEJBTktSVVBUQ1lfTk9UX0ZPVU5EELoBEhsKFkJBTktSVVBUQ1lfTk9UX0FMTE9XRUQQuwESFQoQTUFSS0VUX05PVF9SRUFEWRDAARISCg1NQVJLRVRfRlJPWkVOEMEBEhEKDE1BUktFVF9FTVBUWRDCARINCghQT1NJVElPThDIARIXChJQT1NJVElPTl9OT1RfRk9VTkQQyQESGQoUUE9TSVRJT05fU1RBVEVfT1JERVIQygESHwoaUE9TSVRJT05fU1RBVEVfT1JERVJfUFJJQ0UQywESHgoZUE9TSVRJT05fU1RBVEVfT1JERVJfU0laRRDMARIeChlQT1NJVElPTl9TVEFURV9PUkRFUl9TSURFEM0BEhgKE1BPU0lUSU9OX1NJWkVfTElNSVQQzgESCgoFUFJJQ0UQ0QESGwoWU0lHTkFUVVJFX1ZFUklGSUNBVElPThDZARIwCitTSUdOQVRVUkVfVkVSSUZJQ0FUSU9OX01BTEZPUk1FRF9QVUJMSUNfS0VZENoBEioKJVNJR05BVFVSRV9WRVJJRklDQVRJT05fSU5WQUxJRF9MRU5HVEgQ2wESCQoEUklTSxDgARI0Ci9SSVNLX0RFTEVHQVRJT05fTUZfVE9fQkVfTEVTU19USEFOX09SX0VRVUFMX01NRhDhARIkCh9SSVNLX09NRl9MRVNTX1RIQU5fT1JfRVFVQUxfSU1GEOIBEiQKH1JJU0tfT01GX0xFU1NfVEhBTl9PUl9FUVVBTF9DTUYQ4wESKgolUklTS19UUkFERV9PTUZfTEVTU19USEFOX09SX0VRVUFMX0NNRhDlARI1CjBSSVNLX1VOSEVBTFRIWV9NRl9BTkRfUE9OX0FGVEVSX0JFVFRFUl9PRl9CRUZPUkUQ5AESFAoPT1JERVJfRVhFQ1VUSU9OEPABEhoKFU9SREVSX0VYRUNVVElPTl9FTVBUWRDxARIhChxPUkRFUl9FWEVDVVRJT05fRklMTF9PUl9LSUxMEPIBEiMKHk9SREVSX0VYRUNVVElPTl9NSVNTSU5HX0xJTUlUUxDzARIiCh1PUkRFUl9FWEVDVVRJT05fTUlTU0lOR19QUklDRRD0ARIfChpPUkRFUl9FWEVDVVRJT05fU0laRV9MSU1JVBD1ARIgChtPUkRFUl9FWEVDVVRJT05fTElNSVRfUFJJQ0UQ9gESHgoZT1JERVJfUkVEVUNFX0lTX1BPU1RfT05MWRD3ARIfChpPUkRFUl9FWEVDVVRJT05fU0VMTF9QUklDRRD4ARIlCiBPUkRFUl9TSVpFX0VYQ0VFRFNfUE9TSVRJT05fU0laRRD5ARIoCiNBVE9NSUNTX1RSQURFU19DQU5OT1RfRk9MTE9XX1BMQUNFUxCAAhIwCitBVE9NSUNTX0NBTkNFTFNfQ0FOTk9UX0ZPTExPV19UUkFERVNfUExBQ0VTEIECEiYKIUFDVElPTl9QT1NJVElPTl9TSE9VTERfQkVfQ09WRVJFRBCRAhIZChRBQ1RJT05fSU5WQUxJRF9OT05DRRCSAhIpCiRBQ1RJT05fUFJPUE9TRURfUFJJQ0VfTVVTVF9CRV9ISUdIRVIQkwISFAoPTk9UX0lNUExFTUVOVEVEEPQDEgwKB0Ryb3BwZWQQ5wcqHgoOU3BlY2lhbEFjY291bnQSDAoIRmVlVmF1bHQQAGIGcHJvdG8z");
19
19
 
20
20
  /**
21
21
  * @generated from message nord.Market
@@ -195,14 +195,14 @@ export const TokenSchema: GenMessage<Token, {jsonType: TokenJson}> = /*@__PURE__
195
195
  */
196
196
  export type QuoteSize = Message<"nord.QuoteSize"> & {
197
197
  /**
198
- * In `Market.size_decimals` decimals
198
+ * In `Market.size_decimals` decimals. 63 bit positive integer.
199
199
  *
200
200
  * @generated from field: uint64 size = 1;
201
201
  */
202
202
  size: bigint;
203
203
 
204
204
  /**
205
- * In `Market.price_decimals` decimals
205
+ * In `Market.price_decimals` decimals. 64 bit positive integer.
206
206
  *
207
207
  * @generated from field: uint64 price = 2;
208
208
  */
@@ -219,14 +219,14 @@ export type QuoteSize = Message<"nord.QuoteSize"> & {
219
219
  */
220
220
  export type QuoteSizeJson = {
221
221
  /**
222
- * In `Market.size_decimals` decimals
222
+ * In `Market.size_decimals` decimals. 63 bit positive integer.
223
223
  *
224
224
  * @generated from field: uint64 size = 1;
225
225
  */
226
226
  size?: string;
227
227
 
228
228
  /**
229
- * In `Market.price_decimals` decimals
229
+ * In `Market.price_decimals` decimals. 64 bit positive integer.
230
230
  *
231
231
  * @generated from field: uint64 price = 2;
232
232
  */
@@ -1063,7 +1063,7 @@ export type Action_PlaceOrder = Message<"nord.Action.PlaceOrder"> & {
1063
1063
 
1064
1064
  /**
1065
1065
  * Quote size limit.
1066
- * Optional, treated as not set if 0.
1066
+ * Optional.
1067
1067
  *
1068
1068
  * @generated from field: nord.QuoteSize quote_size = 8;
1069
1069
  */
@@ -1184,7 +1184,7 @@ export type Action_PlaceOrderJson = {
1184
1184
 
1185
1185
  /**
1186
1186
  * Quote size limit.
1187
- * Optional, treated as not set if 0.
1187
+ * Optional.
1188
1188
  *
1189
1189
  * @generated from field: nord.QuoteSize quote_size = 8;
1190
1190
  */
@@ -1783,11 +1783,14 @@ export type Action_AddTrigger = Message<"nord.Action.AddTrigger"> & {
1783
1783
  side: Side;
1784
1784
 
1785
1785
  /**
1786
- * Same price format as when placing order
1787
- *
1788
- * @generated from field: uint64 price = 5;
1786
+ * @generated from field: uint64 trigger_price = 5;
1789
1787
  */
1790
- price: bigint;
1788
+ triggerPrice: bigint;
1789
+
1790
+ /**
1791
+ * @generated from field: optional uint64 limit_price = 6;
1792
+ */
1793
+ limitPrice?: bigint;
1791
1794
 
1792
1795
  /**
1793
1796
  * @generated from field: optional uint32 account_id = 10;
@@ -1820,11 +1823,14 @@ export type Action_AddTriggerJson = {
1820
1823
  side?: SideJson;
1821
1824
 
1822
1825
  /**
1823
- * Same price format as when placing order
1824
- *
1825
- * @generated from field: uint64 price = 5;
1826
+ * @generated from field: uint64 trigger_price = 5;
1826
1827
  */
1827
- price?: string;
1828
+ triggerPrice?: string;
1829
+
1830
+ /**
1831
+ * @generated from field: optional uint64 limit_price = 6;
1832
+ */
1833
+ limitPrice?: string;
1828
1834
 
1829
1835
  /**
1830
1836
  * @generated from field: optional uint32 account_id = 10;
@@ -1864,9 +1870,14 @@ export type Action_RemoveTrigger = Message<"nord.Action.RemoveTrigger"> & {
1864
1870
  side: Side;
1865
1871
 
1866
1872
  /**
1867
- * @generated from field: uint64 price = 5;
1873
+ * @generated from field: uint64 trigger_price = 5;
1868
1874
  */
1869
- price: bigint;
1875
+ triggerPrice: bigint;
1876
+
1877
+ /**
1878
+ * @generated from field: optional uint64 limit_price = 6;
1879
+ */
1880
+ limitPrice?: bigint;
1870
1881
 
1871
1882
  /**
1872
1883
  * @generated from field: optional uint32 account_id = 10;
@@ -1899,9 +1910,14 @@ export type Action_RemoveTriggerJson = {
1899
1910
  side?: SideJson;
1900
1911
 
1901
1912
  /**
1902
- * @generated from field: uint64 price = 5;
1913
+ * @generated from field: uint64 trigger_price = 5;
1903
1914
  */
1904
- price?: string;
1915
+ triggerPrice?: string;
1916
+
1917
+ /**
1918
+ * @generated from field: optional uint64 limit_price = 6;
1919
+ */
1920
+ limitPrice?: string;
1905
1921
 
1906
1922
  /**
1907
1923
  * @generated from field: optional uint32 account_id = 10;
@@ -2218,10 +2234,10 @@ export type Receipt = Message<"nord.Receipt"> & {
2218
2234
  case: "triggerAdded";
2219
2235
  } | {
2220
2236
  /**
2221
- * @generated from field: nord.Receipt.TriggerRemoved trigger_removed = 65;
2237
+ * @generated from field: nord.Receipt.TriggerStatusChanged trigger_status_changed = 65;
2222
2238
  */
2223
- value: Receipt_TriggerRemoved;
2224
- case: "triggerRemoved";
2239
+ value: Receipt_TriggerStatusChanged;
2240
+ case: "triggerStatusChanged";
2225
2241
  } | {
2226
2242
  /**
2227
2243
  * @generated from field: nord.Receipt.PositionTakenOrTradedResult position_taken_or_traded = 66;
@@ -2336,9 +2352,9 @@ export type ReceiptJson = {
2336
2352
  triggerAdded?: Receipt_TriggerAddedJson;
2337
2353
 
2338
2354
  /**
2339
- * @generated from field: nord.Receipt.TriggerRemoved trigger_removed = 65;
2355
+ * @generated from field: nord.Receipt.TriggerStatusChanged trigger_status_changed = 65;
2340
2356
  */
2341
- triggerRemoved?: Receipt_TriggerRemovedJson;
2357
+ triggerStatusChanged?: Receipt_TriggerStatusChangedJson;
2342
2358
 
2343
2359
  /**
2344
2360
  * @generated from field: nord.Receipt.PositionTakenOrTradedResult position_taken_or_traded = 66;
@@ -3305,22 +3321,22 @@ export const Receipt_TriggerAddedSchema: GenMessage<Receipt_TriggerAdded, {jsonT
3305
3321
  messageDesc(file_nord, 10, 20);
3306
3322
 
3307
3323
  /**
3308
- * @generated from message nord.Receipt.TriggerRemoved
3324
+ * @generated from message nord.Receipt.TriggerStatusChanged
3309
3325
  */
3310
- export type Receipt_TriggerRemoved = Message<"nord.Receipt.TriggerRemoved"> & {
3326
+ export type Receipt_TriggerStatusChanged = Message<"nord.Receipt.TriggerStatusChanged"> & {
3311
3327
  };
3312
3328
 
3313
3329
  /**
3314
- * @generated from message nord.Receipt.TriggerRemoved
3330
+ * @generated from message nord.Receipt.TriggerStatusChanged
3315
3331
  */
3316
- export type Receipt_TriggerRemovedJson = {
3332
+ export type Receipt_TriggerStatusChangedJson = {
3317
3333
  };
3318
3334
 
3319
3335
  /**
3320
- * Describes the message nord.Receipt.TriggerRemoved.
3321
- * Use `create(Receipt_TriggerRemovedSchema)` to create a new message.
3336
+ * Describes the message nord.Receipt.TriggerStatusChanged.
3337
+ * Use `create(Receipt_TriggerStatusChangedSchema)` to create a new message.
3322
3338
  */
3323
- export const Receipt_TriggerRemovedSchema: GenMessage<Receipt_TriggerRemoved, {jsonType: Receipt_TriggerRemovedJson}> = /*@__PURE__*/
3339
+ export const Receipt_TriggerStatusChangedSchema: GenMessage<Receipt_TriggerStatusChanged, {jsonType: Receipt_TriggerStatusChangedJson}> = /*@__PURE__*/
3324
3340
  messageDesc(file_nord, 10, 21);
3325
3341
 
3326
3342
  /**
@@ -3454,6 +3470,47 @@ export type TriggerKindJson = "STOP_LOSS" | "TAKE_PROFIT";
3454
3470
  export const TriggerKindSchema: GenEnum<TriggerKind, TriggerKindJson> = /*@__PURE__*/
3455
3471
  enumDesc(file_nord, 1);
3456
3472
 
3473
+ /**
3474
+ * @generated from enum nord.TriggerStatus
3475
+ */
3476
+ export enum TriggerStatus {
3477
+ /**
3478
+ * @generated from enum value: ACTIVE = 0;
3479
+ */
3480
+ ACTIVE = 0,
3481
+
3482
+ /**
3483
+ * @generated from enum value: SUCCESS = 1;
3484
+ */
3485
+ SUCCESS = 1,
3486
+
3487
+ /**
3488
+ * @generated from enum value: CANCEL = 2;
3489
+ */
3490
+ CANCEL = 2,
3491
+
3492
+ /**
3493
+ * @generated from enum value: FAIL = 3;
3494
+ */
3495
+ FAIL = 3,
3496
+
3497
+ /**
3498
+ * @generated from enum value: REMOVE = 4;
3499
+ */
3500
+ REMOVE = 4,
3501
+ }
3502
+
3503
+ /**
3504
+ * @generated from enum nord.TriggerStatus
3505
+ */
3506
+ export type TriggerStatusJson = "ACTIVE" | "SUCCESS" | "CANCEL" | "FAIL" | "REMOVE";
3507
+
3508
+ /**
3509
+ * Describes the enum nord.TriggerStatus.
3510
+ */
3511
+ export const TriggerStatusSchema: GenEnum<TriggerStatus, TriggerStatusJson> = /*@__PURE__*/
3512
+ enumDesc(file_nord, 2);
3513
+
3457
3514
  /**
3458
3515
  * @generated from enum nord.FillMode
3459
3516
  */
@@ -3488,7 +3545,7 @@ export type FillModeJson = "LIMIT" | "POST_ONLY" | "IMMEDIATE_OR_CANCEL" | "FILL
3488
3545
  * Describes the enum nord.FillMode.
3489
3546
  */
3490
3547
  export const FillModeSchema: GenEnum<FillMode, FillModeJson> = /*@__PURE__*/
3491
- enumDesc(file_nord, 2);
3548
+ enumDesc(file_nord, 3);
3492
3549
 
3493
3550
  /**
3494
3551
  * @generated from enum nord.MarketType
@@ -3514,7 +3571,7 @@ export type MarketTypeJson = "SPOT" | "PERPETUALS";
3514
3571
  * Describes the enum nord.MarketType.
3515
3572
  */
3516
3573
  export const MarketTypeSchema: GenEnum<MarketType, MarketTypeJson> = /*@__PURE__*/
3517
- enumDesc(file_nord, 3);
3574
+ enumDesc(file_nord, 4);
3518
3575
 
3519
3576
  /**
3520
3577
  * Error codes returned by the engine.
@@ -3607,6 +3664,21 @@ export enum Error {
3607
3664
  */
3608
3665
  WITHDRAW_AMOUNT_TOO_SMALL = 21,
3609
3666
 
3667
+ /**
3668
+ * @generated from enum value: DECODE_FAILURE_LENGTH_PREFIX = 33;
3669
+ */
3670
+ DECODE_FAILURE_LENGTH_PREFIX = 33,
3671
+
3672
+ /**
3673
+ * @generated from enum value: DECODE_FAILURE_RAW = 34;
3674
+ */
3675
+ DECODE_FAILURE_RAW = 34,
3676
+
3677
+ /**
3678
+ * @generated from enum value: DECODE_FAILURE_DOMAIN = 35;
3679
+ */
3680
+ DECODE_FAILURE_DOMAIN = 35,
3681
+
3610
3682
  /**
3611
3683
  * @generated from enum value: PYTH_FEED_NOT_ADDED = 93;
3612
3684
  */
@@ -3939,6 +4011,14 @@ export enum Error {
3939
4011
  */
3940
4012
  MARKET_FROZEN = 193,
3941
4013
 
4014
+ /**
4015
+ * Happens when there is no liquidity on the market at the moment of trigger
4016
+ * execution
4017
+ *
4018
+ * @generated from enum value: MARKET_EMPTY = 194;
4019
+ */
4020
+ MARKET_EMPTY = 194,
4021
+
3942
4022
  /**
3943
4023
  * 11001_000
3944
4024
  *
@@ -4089,6 +4169,11 @@ export enum Error {
4089
4169
  */
4090
4170
  ORDER_EXECUTION_SELL_PRICE = 248,
4091
4171
 
4172
+ /**
4173
+ * @generated from enum value: ORDER_SIZE_EXCEEDS_POSITION_SIZE = 249;
4174
+ */
4175
+ ORDER_SIZE_EXCEEDS_POSITION_SIZE = 249,
4176
+
4092
4177
  /**
4093
4178
  * 10000_0000
4094
4179
  *
@@ -4141,13 +4226,13 @@ export enum Error {
4141
4226
  *
4142
4227
  * @generated from enum nord.Error
4143
4228
  */
4144
- export type ErrorJson = "DUPLICATE" | "DECODE_FAILURE" | "INVALID_SIGNATURE" | "MARKET_NOT_FOUND" | "TOKEN_NOT_FOUND" | "USER_NOT_FOUND" | "SESSION_NOT_FOUND" | "ORDER_NOT_FOUND" | "ORDER_SIZE_ZERO" | "ARITHMETIC_OVERFLOW" | "INVALID_ORDER_OWNER" | "KEY_ALREADY_REGISTERED" | "EXPIRY_TIMESTAMP_IN_PAST" | "UPDATE_TIMESTAMP_IN_PAST" | "TOO_MANY_OPEN_ORDERS" | "WITHDRAW_AMOUNT_TOO_SMALL" | "PYTH_FEED_NOT_ADDED" | "PYTH_FEED_MISSING" | "PYTH_FEED_ALREADY_ADDED" | "PYTH_GUARDIAN_SET_UNINITIALIZED" | "PYTH_GUARDIAN_SET_INVALID" | "PYTH_FEED_DECIMALS_OUT_OF_RANGE" | "PYTH_FEED_PRICE_OUT_OF_RANGE" | "PYTH_FEED_VARIANCE_OUT_OF_RANGE" | "PYTH_GUARDIAN_SET_AND_PYTH_SIGNATURE_DO_NOT_MATCH" | "INVALID_TOKEN_PARAMETERS" | "INDEX_PRICE_OUT_OF_RANGE" | "INDEX_DECIMALS_OUT_OF_RANGE" | "INVALID_STATE_VERSION" | "INVALID_MARGINS" | "MARKET_DECIMALS_EXCEED_LIMITS" | "TOO_MANY_TOKENS" | "FUNDING_OVERFLOW" | "CAN_REDUCE_POSITION_ONLY_IF_ALL_ORDERS_ARE_CANCELED" | "UNEXPECTED_TOKEN_ID" | "TOKEN_NOT_READY" | "TOKEN_ALREADY_REGISTERED" | "IMMEDIATE_ORDER_GOT_NO_FILLS" | "FAILED_TO_FILL_LIMIT" | "POST_ONLY_MUST_NOT_FILL_ANY_OPPOSITE_ORDERS" | "INVALID" | "MAINTENANCE" | "MINIMUM_SIZE_DECIMALS" | "PARAMETERS_WILL_CREATE_NON_OPERATIONAL_MARKET" | "ONLY_IMMEDIATE_ORDERS_ALLOWED" | "TOO_MANY_USER_ACCOUNTS" | "ACCOUNT_NOT_FOUND" | "ACCOUNT_INVALID_OWNER" | "DUST_ACCOUNT" | "BALANCE" | "BALANCE_DEPOSIT_OVERFLOW" | "BALANCE_CHANGE_OVERFLOW" | "BALANCE_CHANGE_LIMIT_EXCEEDED" | "BALANCE_INSUFFICIENT" | "UNAUTHENTICATED_L1_ACTION" | "ENCODED_ACTION_TOO_LARGE" | "TRIGGER" | "TRIGGER_INVALID_PRICE" | "TRIGGER_NOT_FOUND" | "TIMESTAMP" | "TIMESTAMP_OUT_OF_THRESHOLD" | "TIMESTAMP_STALE" | "BANKRUPTCY_INSUFFICIENT_COVERAGE" | "BANKRUPTCY_NOT_FOUND" | "BANKRUPTCY_NOT_ALLOWED" | "MARKET_NOT_READY" | "MARKET_FROZEN" | "POSITION" | "POSITION_NOT_FOUND" | "POSITION_STATE_ORDER" | "POSITION_STATE_ORDER_PRICE" | "POSITION_STATE_ORDER_SIZE" | "POSITION_STATE_ORDER_SIDE" | "POSITION_SIZE_LIMIT" | "PRICE" | "SIGNATURE_VERIFICATION" | "SIGNATURE_VERIFICATION_MALFORMED_PUBLIC_KEY" | "SIGNATURE_VERIFICATION_INVALID_LENGTH" | "RISK" | "RISK_DELEGATION_MF_TO_BE_LESS_THAN_OR_EQUAL_MMF" | "RISK_OMF_LESS_THAN_OR_EQUAL_IMF" | "RISK_OMF_LESS_THAN_OR_EQUAL_CMF" | "RISK_TRADE_OMF_LESS_THAN_OR_EQUAL_CMF" | "RISK_UNHEALTHY_MF_AND_PON_AFTER_BETTER_OF_BEFORE" | "ORDER_EXECUTION" | "ORDER_EXECUTION_EMPTY" | "ORDER_EXECUTION_FILL_OR_KILL" | "ORDER_EXECUTION_MISSING_LIMITS" | "ORDER_EXECUTION_MISSING_PRICE" | "ORDER_EXECUTION_SIZE_LIMIT" | "ORDER_EXECUTION_LIMIT_PRICE" | "ORDER_REDUCE_IS_POST_ONLY" | "ORDER_EXECUTION_SELL_PRICE" | "ATOMICS_TRADES_CANNOT_FOLLOW_PLACES" | "ATOMICS_CANCELS_CANNOT_FOLLOW_TRADES_PLACES" | "ACTION_POSITION_SHOULD_BE_COVERED" | "ACTION_INVALID_NONCE" | "ACTION_PROPOSED_PRICE_MUST_BE_HIGHER" | "NOT_IMPLEMENTED" | "Dropped";
4229
+ export type ErrorJson = "DUPLICATE" | "DECODE_FAILURE" | "INVALID_SIGNATURE" | "MARKET_NOT_FOUND" | "TOKEN_NOT_FOUND" | "USER_NOT_FOUND" | "SESSION_NOT_FOUND" | "ORDER_NOT_FOUND" | "ORDER_SIZE_ZERO" | "ARITHMETIC_OVERFLOW" | "INVALID_ORDER_OWNER" | "KEY_ALREADY_REGISTERED" | "EXPIRY_TIMESTAMP_IN_PAST" | "UPDATE_TIMESTAMP_IN_PAST" | "TOO_MANY_OPEN_ORDERS" | "WITHDRAW_AMOUNT_TOO_SMALL" | "DECODE_FAILURE_LENGTH_PREFIX" | "DECODE_FAILURE_RAW" | "DECODE_FAILURE_DOMAIN" | "PYTH_FEED_NOT_ADDED" | "PYTH_FEED_MISSING" | "PYTH_FEED_ALREADY_ADDED" | "PYTH_GUARDIAN_SET_UNINITIALIZED" | "PYTH_GUARDIAN_SET_INVALID" | "PYTH_FEED_DECIMALS_OUT_OF_RANGE" | "PYTH_FEED_PRICE_OUT_OF_RANGE" | "PYTH_FEED_VARIANCE_OUT_OF_RANGE" | "PYTH_GUARDIAN_SET_AND_PYTH_SIGNATURE_DO_NOT_MATCH" | "INVALID_TOKEN_PARAMETERS" | "INDEX_PRICE_OUT_OF_RANGE" | "INDEX_DECIMALS_OUT_OF_RANGE" | "INVALID_STATE_VERSION" | "INVALID_MARGINS" | "MARKET_DECIMALS_EXCEED_LIMITS" | "TOO_MANY_TOKENS" | "FUNDING_OVERFLOW" | "CAN_REDUCE_POSITION_ONLY_IF_ALL_ORDERS_ARE_CANCELED" | "UNEXPECTED_TOKEN_ID" | "TOKEN_NOT_READY" | "TOKEN_ALREADY_REGISTERED" | "IMMEDIATE_ORDER_GOT_NO_FILLS" | "FAILED_TO_FILL_LIMIT" | "POST_ONLY_MUST_NOT_FILL_ANY_OPPOSITE_ORDERS" | "INVALID" | "MAINTENANCE" | "MINIMUM_SIZE_DECIMALS" | "PARAMETERS_WILL_CREATE_NON_OPERATIONAL_MARKET" | "ONLY_IMMEDIATE_ORDERS_ALLOWED" | "TOO_MANY_USER_ACCOUNTS" | "ACCOUNT_NOT_FOUND" | "ACCOUNT_INVALID_OWNER" | "DUST_ACCOUNT" | "BALANCE" | "BALANCE_DEPOSIT_OVERFLOW" | "BALANCE_CHANGE_OVERFLOW" | "BALANCE_CHANGE_LIMIT_EXCEEDED" | "BALANCE_INSUFFICIENT" | "UNAUTHENTICATED_L1_ACTION" | "ENCODED_ACTION_TOO_LARGE" | "TRIGGER" | "TRIGGER_INVALID_PRICE" | "TRIGGER_NOT_FOUND" | "TIMESTAMP" | "TIMESTAMP_OUT_OF_THRESHOLD" | "TIMESTAMP_STALE" | "BANKRUPTCY_INSUFFICIENT_COVERAGE" | "BANKRUPTCY_NOT_FOUND" | "BANKRUPTCY_NOT_ALLOWED" | "MARKET_NOT_READY" | "MARKET_FROZEN" | "MARKET_EMPTY" | "POSITION" | "POSITION_NOT_FOUND" | "POSITION_STATE_ORDER" | "POSITION_STATE_ORDER_PRICE" | "POSITION_STATE_ORDER_SIZE" | "POSITION_STATE_ORDER_SIDE" | "POSITION_SIZE_LIMIT" | "PRICE" | "SIGNATURE_VERIFICATION" | "SIGNATURE_VERIFICATION_MALFORMED_PUBLIC_KEY" | "SIGNATURE_VERIFICATION_INVALID_LENGTH" | "RISK" | "RISK_DELEGATION_MF_TO_BE_LESS_THAN_OR_EQUAL_MMF" | "RISK_OMF_LESS_THAN_OR_EQUAL_IMF" | "RISK_OMF_LESS_THAN_OR_EQUAL_CMF" | "RISK_TRADE_OMF_LESS_THAN_OR_EQUAL_CMF" | "RISK_UNHEALTHY_MF_AND_PON_AFTER_BETTER_OF_BEFORE" | "ORDER_EXECUTION" | "ORDER_EXECUTION_EMPTY" | "ORDER_EXECUTION_FILL_OR_KILL" | "ORDER_EXECUTION_MISSING_LIMITS" | "ORDER_EXECUTION_MISSING_PRICE" | "ORDER_EXECUTION_SIZE_LIMIT" | "ORDER_EXECUTION_LIMIT_PRICE" | "ORDER_REDUCE_IS_POST_ONLY" | "ORDER_EXECUTION_SELL_PRICE" | "ORDER_SIZE_EXCEEDS_POSITION_SIZE" | "ATOMICS_TRADES_CANNOT_FOLLOW_PLACES" | "ATOMICS_CANCELS_CANNOT_FOLLOW_TRADES_PLACES" | "ACTION_POSITION_SHOULD_BE_COVERED" | "ACTION_INVALID_NONCE" | "ACTION_PROPOSED_PRICE_MUST_BE_HIGHER" | "NOT_IMPLEMENTED" | "Dropped";
4145
4230
 
4146
4231
  /**
4147
4232
  * Describes the enum nord.Error.
4148
4233
  */
4149
4234
  export const ErrorSchema: GenEnum<Error, ErrorJson> = /*@__PURE__*/
4150
- enumDesc(file_nord, 4);
4235
+ enumDesc(file_nord, 5);
4151
4236
 
4152
4237
  /**
4153
4238
  * @generated from enum nord.SpecialAccount
@@ -4168,5 +4253,5 @@ export type SpecialAccountJson = "FeeVault";
4168
4253
  * Describes the enum nord.SpecialAccount.
4169
4254
  */
4170
4255
  export const SpecialAccountSchema: GenEnum<SpecialAccount, SpecialAccountJson> = /*@__PURE__*/
4171
- enumDesc(file_nord, 5);
4256
+ enumDesc(file_nord, 6);
4172
4257
 
@@ -112,11 +112,13 @@ export interface paths {
112
112
  };
113
113
  };
114
114
  put?: never;
115
- /** @description Send an action to nord to execute. */
115
+ /** @description Send an action to nord to execute. This doesn't use `Protobuf<T>` since we want to length-delimit this message. `body` - (length prefix of action, action data protobuf, and signature). signature has exact length, but depend on action kind. body is exact payload used via other transports and journalled for rexecution */
116
116
  post: {
117
117
  parameters: {
118
118
  query?: never;
119
- header?: never;
119
+ header: {
120
+ "content-type": string;
121
+ };
120
122
  path?: never;
121
123
  cookie?: never;
122
124
  };
@@ -135,6 +137,27 @@ export interface paths {
135
137
  "application/octet-stream": unknown;
136
138
  };
137
139
  };
140
+ 413: {
141
+ headers: {
142
+ [name: string]: unknown;
143
+ };
144
+ content: {
145
+ "application/json": components["schemas"]["PayloadTooLarge"];
146
+ };
147
+ };
148
+ 415: {
149
+ headers: {
150
+ /**
151
+ * @description Expected request media type
152
+ * @example application/octet-stream
153
+ */
154
+ accept: string;
155
+ [name: string]: unknown;
156
+ };
157
+ content: {
158
+ "application/json": components["schemas"]["AcceptedMediaType"];
159
+ };
160
+ };
138
161
  };
139
162
  };
140
163
  delete?: never;
@@ -1893,6 +1916,13 @@ export interface components {
1893
1916
  /** Format: uint16 */
1894
1917
  weightBps: number;
1895
1918
  };
1919
+ AcceptedMediaType: {
1920
+ expected: string;
1921
+ };
1922
+ PayloadTooLarge: {
1923
+ /** Format: uint */
1924
+ limit: number;
1925
+ };
1896
1926
  ActionsQuery: {
1897
1927
  /** Format: uint64 */
1898
1928
  from: number;
@@ -2224,8 +2254,6 @@ export interface components {
2224
2254
  HistoryTriggerInfo: {
2225
2255
  /** Format: uint32 */
2226
2256
  accountId: number;
2227
- /** Format: uint64 */
2228
- actionId: number;
2229
2257
  /** Format: uint32 */
2230
2258
  marketId: number;
2231
2259
  /** Format: uint64 */
@@ -2233,21 +2261,30 @@ export interface components {
2233
2261
  side: components["schemas"]["Side"];
2234
2262
  kind: components["schemas"]["TriggerKind"];
2235
2263
  status: components["schemas"]["TriggerStatus"];
2264
+ /** Format: uint64 */
2265
+ createdAtActionId: number;
2266
+ /** Format: uint64 */
2267
+ finalizedAtActionId?: number | null;
2236
2268
  createdAt: string;
2237
- updatedAt: string;
2269
+ finalizedAt: string;
2238
2270
  };
2239
2271
  /** @enum {string} */
2240
2272
  TriggerKind: "stopLoss" | "takeProfit";
2241
2273
  /** @enum {string} */
2242
- TriggerStatus: "added" | "succeeded" | "failed" | "removed";
2274
+ TriggerStatus: "active" | "success" | "cancel" | "fail" | "remove";
2243
2275
  TriggerInfo: {
2244
2276
  /** Format: uint32 */
2245
2277
  marketId: number;
2246
- /** Format: uint64 */
2247
- price: number;
2248
2278
  side: components["schemas"]["Side"];
2249
2279
  kind: components["schemas"]["TriggerKind"];
2280
+ triggerPrice: components["schemas"]["PositivePriceMantissa"];
2281
+ limitPrice?: components["schemas"]["PositivePriceMantissa"] | null;
2250
2282
  };
2283
+ /**
2284
+ * Format: uint64
2285
+ * @description 63 bit integer, which is always positive
2286
+ */
2287
+ PositivePriceMantissa: number;
2251
2288
  OrderNotFound: null;
2252
2289
  PageResult_for_String_and_Trade: {
2253
2290
  /** @description Set of items for requested by query. */
@@ -1,5 +1,8 @@
1
1
  import Decimal from "decimal.js";
2
2
  import * as proto from "../../gen/nord_pb";
3
+ import { paths } from "../../gen/openapi";
4
+ import createClient from "openapi-fetch";
5
+
3
6
  import { create } from "@bufbuild/protobuf";
4
7
  import {
5
8
  FillMode,
@@ -11,7 +14,6 @@ import {
11
14
  import {
12
15
  assert,
13
16
  BigIntValue,
14
- checkedFetch,
15
17
  checkPubKeyLength,
16
18
  decodeLengthDelimited,
17
19
  SESSION_TTL,
@@ -52,27 +54,30 @@ async function sendAction(
52
54
  serverUrl: string,
53
55
  makeSignedMessage: (message: Uint8Array) => Promise<Uint8Array>,
54
56
  action: proto.Action,
55
- actionErrorDesc: string,
56
57
  ): Promise<proto.Receipt> {
57
- const encoded = sizeDelimitedEncode(proto.ActionSchema, action);
58
- // validate the payload size
59
- const MAX_PAYLOAD_SIZE = 100 * 1024; // 100 kB
60
- if (encoded.byteLength > MAX_PAYLOAD_SIZE) {
58
+ const body = await prepareAction(action, makeSignedMessage);
59
+ // NOTE: restructure and reuse client as it is in Nord.ts
60
+ const client = createClient<paths>({ baseUrl: serverUrl });
61
+ const response = await client.POST("/action", {
62
+ params: {
63
+ header: {
64
+ "content-type": "application/octet-stream",
65
+ },
66
+ },
67
+ body: body,
68
+ // NOTE: openapi-fetch ignores headers and types/const headers in schema, and always assume all things are JSON
69
+ // to handle multi type bodies, need these overrides and later adhoc parsing
70
+ bodySerializer: (body) => body,
71
+ parseAs: "stream",
72
+ });
73
+
74
+ if (response.error) {
61
75
  throw new Error(
62
- `Encoded message size (${encoded.byteLength} bytes) is greater than max payload size (${MAX_PAYLOAD_SIZE} bytes).`,
76
+ `Failed to ${action.kind.case}, HTTP status ${JSON.stringify(response.error)}`,
63
77
  );
64
78
  }
65
- const body = await makeSignedMessage(encoded);
66
79
 
67
- // TODO: this should be changed to use openapi
68
- const response = await checkedFetch(`${serverUrl}/action`, {
69
- method: "POST",
70
- headers: {
71
- "Content-Type": "application/json",
72
- },
73
- body,
74
- });
75
- const rawResp = new Uint8Array(await response.arrayBuffer());
80
+ const rawResp = new Uint8Array(await response.response.bytes());
76
81
 
77
82
  const resp: proto.Receipt = decodeLengthDelimited(
78
83
  rawResp,
@@ -81,13 +86,38 @@ async function sendAction(
81
86
 
82
87
  if (resp.kind?.case === "err") {
83
88
  throw new Error(
84
- `Could not ${actionErrorDesc}, reason: ${proto.Error[resp.kind.value]}`,
89
+ `Could not execute ${action.kind.case}, reason: ${proto.Error[resp.kind.value]}`,
85
90
  );
86
91
  }
87
92
 
88
93
  return resp;
89
94
  }
90
95
 
96
+ // Given action and signature function, prepare the signed message to send to server as `body`.
97
+ // `makeSignedMessage` must include the original message and signature.
98
+ export async function prepareAction(
99
+ action: proto.Action,
100
+ makeSignedMessage: (message: Uint8Array) => Promise<Uint8Array>,
101
+ ) {
102
+ const encoded = sizeDelimitedEncode(proto.ActionSchema, action);
103
+ // NOTE(agent): keep in sync with MAX_ENCODED_ACTION_SIZE in Rust code
104
+ const MAX_ENCODED_ACTION_SIZE = 1024;
105
+ if (encoded.byteLength > MAX_ENCODED_ACTION_SIZE) {
106
+ console.warn("Encoded message:", encoded);
107
+ throw new Error(
108
+ `Encoded message size (${encoded.byteLength} bytes) is greater than max payload size (${MAX_ENCODED_ACTION_SIZE} bytes).`,
109
+ );
110
+ }
111
+ const body = await makeSignedMessage(encoded);
112
+ if (body.byteLength > MAX_ENCODED_ACTION_SIZE) {
113
+ console.warn("Encoded length:", encoded.byteLength);
114
+ throw new Error(
115
+ `Signed message size (${body.byteLength} bytes) is greater than max payload size (${MAX_ENCODED_ACTION_SIZE} bytes).`,
116
+ );
117
+ }
118
+ return body;
119
+ }
120
+
91
121
  export async function createSession(
92
122
  serverUrl: string,
93
123
  walletSignFn: (message: string | Uint8Array) => Promise<Uint8Array>,
@@ -128,7 +158,6 @@ export async function createSession(
128
158
  serverUrl,
129
159
  (m) => walletSign(walletSignFn, m),
130
160
  action,
131
- "create a new session",
132
161
  );
133
162
 
134
163
  if (resp.kind?.case === "createSessionResult") {
@@ -161,7 +190,6 @@ export async function revokeSession(
161
190
  serverUrl,
162
191
  (m) => walletSign(walletSignFn, m),
163
192
  action,
164
- "revoke session",
165
193
  );
166
194
 
167
195
  return { actionId: resp.actionId };
@@ -198,7 +226,6 @@ export async function withdraw(
198
226
  serverUrl,
199
227
  (m) => sessionSign(signFn, m),
200
228
  action,
201
- "withdraw",
202
229
  );
203
230
 
204
231
  if (resp.kind?.case === "withdrawResult") {
@@ -241,6 +268,11 @@ export async function placeOrder(
241
268
  ? params.quoteSize.toScaledU64(params.priceDecimals, params.sizeDecimals)
242
269
  : undefined;
243
270
 
271
+ assert(
272
+ price > 0n || size > 0n || scaledQuote !== undefined,
273
+ "OrderLimit must include at least one of: size, price, or quoteSize",
274
+ );
275
+
244
276
  const action = createAction(currentTimestamp, nonce, {
245
277
  case: "placeOrder",
246
278
  value: create(proto.Action_PlaceOrderSchema, {
@@ -271,7 +303,6 @@ export async function placeOrder(
271
303
  serverUrl,
272
304
  (m) => sessionSign(signFn, m),
273
305
  action,
274
- "place order",
275
306
  );
276
307
 
277
308
  if (resp.kind?.case === "placeOrderResult") {
@@ -315,7 +346,6 @@ export async function cancelOrder(
315
346
  serverUrl,
316
347
  (m) => sessionSign(signFn, m),
317
348
  action,
318
- "cancel order",
319
349
  );
320
350
 
321
351
  if (resp.kind?.case === "cancelOrderResult") {
@@ -365,7 +395,6 @@ export async function transfer(
365
395
  serverUrl,
366
396
  (m) => sessionSign(signFn, m),
367
397
  action,
368
- "transfer",
369
398
  );
370
399
 
371
400
  if (resp.kind?.case === "transferred") {
@@ -431,6 +460,12 @@ export async function atomic(
431
460
  ? a.quoteSize.toScaledU64(a.priceDecimals, a.sizeDecimals)
432
461
  : undefined;
433
462
 
463
+ // Require at least one limit to be set (non-zero size, non-zero price, or quoteSize)
464
+ assert(
465
+ price > 0n || size > 0n || scaledQuote !== undefined,
466
+ "OrderLimit must include at least one of: size, price, or quoteSize",
467
+ );
468
+
434
469
  const tradeOrPlace: proto.TradeOrPlace = create(
435
470
  proto.TradeOrPlaceSchema,
436
471
  {
@@ -480,7 +515,6 @@ export async function atomic(
480
515
  serverUrl,
481
516
  (m) => sessionSign(signFn, m),
482
517
  action,
483
- "execute atomic action",
484
518
  );
485
519
  if (resp.kind?.case === "atomic") {
486
520
  return {