@ritbit/v4-client-js 2.5.1 → 2.6.0

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.
Files changed (162) hide show
  1. package/build/cjs/node_modules/@ritbit/v4-proto/src/codegen/ritbit/accountplus/models.js +19 -3
  2. package/build/cjs/node_modules/@ritbit/v4-proto/src/codegen/ritbit/accountplus/params.js +28 -3
  3. package/build/cjs/node_modules/@ritbit/v4-proto/src/codegen/ritbit/accountplus/tx.js +92 -5
  4. package/build/cjs/node_modules/@ritbit/v4-proto/src/codegen/ritbit/accountplus/tx.rpc.msg.js +7 -1
  5. package/build/cjs/node_modules/@ritbit/v4-proto/src/codegen/ritbit/assets/tx.js +19 -3
  6. package/build/cjs/node_modules/@ritbit/v4-proto/src/codegen/ritbit/bridge/tx.js +1 -1
  7. package/build/cjs/node_modules/@ritbit/v4-proto/src/codegen/ritbit/denomwrap/params.js +134 -0
  8. package/build/cjs/node_modules/@ritbit/v4-proto/src/codegen/ritbit/denomwrap/tx.js +204 -0
  9. package/build/cjs/node_modules/@ritbit/v4-proto/src/codegen/ritbit/denomwrap/tx.rpc.msg.js +57 -0
  10. package/build/cjs/node_modules/@ritbit/v4-proto/src/codegen/ritbit/lcd.js +4 -1
  11. package/build/cjs/node_modules/@ritbit/v4-proto/src/codegen/ritbit/rpc.query.js +3 -2
  12. package/build/cjs/node_modules/@ritbit/v4-proto/src/codegen/ritbit/rpc.tx.js +4 -2
  13. package/build/cjs/node_modules/@ritbit/v4-proto/src/codegen/ritbit/sending/tx.js +1 -1
  14. package/build/cjs/node_modules/@ritbit/v4-proto/src/codegen/ritbit/wrap/genesis.js +151 -0
  15. package/build/cjs/node_modules/@ritbit/v4-proto/src/codegen/ritbit/wrap/params.js +134 -0
  16. package/build/cjs/node_modules/@ritbit/v4-proto/src/codegen/ritbit/wrap/query.js +248 -0
  17. package/build/cjs/node_modules/@ritbit/v4-proto/src/codegen/ritbit/wrap/query.lcd.js +34 -0
  18. package/build/cjs/node_modules/@ritbit/v4-proto/src/codegen/ritbit/wrap/query.rpc.Query.js +71 -0
  19. package/build/cjs/node_modules/@ritbit/v4-proto/src/codegen/ritbit/wrap/tx.js +282 -0
  20. package/build/cjs/node_modules/@ritbit/v4-proto/src/codegen/ritbit/wrap/tx.rpc.msg.js +63 -0
  21. package/build/cjs/src/clients/composite-client.js +7 -3
  22. package/build/cjs/src/clients/constants.js +15 -3
  23. package/build/cjs/src/clients/lib/accounts.js +77 -0
  24. package/build/cjs/src/clients/lib/agent-approval-tx.js +83 -0
  25. package/build/cjs/src/clients/lib/agent-approval.js +119 -0
  26. package/build/cjs/src/clients/lib/eip712.js +592 -0
  27. package/build/cjs/src/clients/lib/eth-pubkey.js +68 -0
  28. package/build/cjs/src/clients/modules/composer.js +15 -2
  29. package/build/cjs/src/clients/modules/eip712-signer.js +189 -0
  30. package/build/cjs/src/clients/modules/eth-agent-wallet.js +101 -0
  31. package/build/cjs/src/clients/modules/eth-wallet.js +91 -0
  32. package/build/cjs/src/clients/modules/get.js +3 -3
  33. package/build/cjs/src/clients/modules/local-wallet.js +9 -2
  34. package/build/cjs/src/clients/modules/post.js +14 -4
  35. package/build/cjs/src/clients/modules/signer.js +13 -3
  36. package/build/cjs/src/clients/native.js +3 -3
  37. package/build/cjs/src/clients/types.js +1 -1
  38. package/build/cjs/src/index.js +38 -2
  39. package/build/cjs/src/lib/evm-address.js +92 -0
  40. package/build/cjs/src/lib/trading-key-utils.js +41 -3
  41. package/build/cjs/tsconfig.cjs.tsbuildinfo +1 -1
  42. package/build/esm/node_modules/@ritbit/v4-proto/src/codegen/ritbit/accountplus/models.d.ts +15 -0
  43. package/build/esm/node_modules/@ritbit/v4-proto/src/codegen/ritbit/accountplus/models.d.ts.map +1 -1
  44. package/build/esm/node_modules/@ritbit/v4-proto/src/codegen/ritbit/accountplus/models.js +19 -3
  45. package/build/esm/node_modules/@ritbit/v4-proto/src/codegen/ritbit/accountplus/params.d.ts +24 -1
  46. package/build/esm/node_modules/@ritbit/v4-proto/src/codegen/ritbit/accountplus/params.d.ts.map +1 -1
  47. package/build/esm/node_modules/@ritbit/v4-proto/src/codegen/ritbit/accountplus/params.js +28 -3
  48. package/build/esm/node_modules/@ritbit/v4-proto/src/codegen/ritbit/accountplus/tx.d.ts +43 -1
  49. package/build/esm/node_modules/@ritbit/v4-proto/src/codegen/ritbit/accountplus/tx.d.ts.map +1 -1
  50. package/build/esm/node_modules/@ritbit/v4-proto/src/codegen/ritbit/accountplus/tx.js +91 -4
  51. package/build/esm/node_modules/@ritbit/v4-proto/src/codegen/ritbit/accountplus/tx.rpc.msg.d.ts +4 -1
  52. package/build/esm/node_modules/@ritbit/v4-proto/src/codegen/ritbit/accountplus/tx.rpc.msg.d.ts.map +1 -1
  53. package/build/esm/node_modules/@ritbit/v4-proto/src/codegen/ritbit/accountplus/tx.rpc.msg.js +8 -2
  54. package/build/esm/node_modules/@ritbit/v4-proto/src/codegen/ritbit/assets/tx.d.ts +9 -0
  55. package/build/esm/node_modules/@ritbit/v4-proto/src/codegen/ritbit/assets/tx.d.ts.map +1 -1
  56. package/build/esm/node_modules/@ritbit/v4-proto/src/codegen/ritbit/assets/tx.js +19 -3
  57. package/build/esm/node_modules/@ritbit/v4-proto/src/codegen/ritbit/bridge/tx.d.ts +14 -1
  58. package/build/esm/node_modules/@ritbit/v4-proto/src/codegen/ritbit/bridge/tx.d.ts.map +1 -1
  59. package/build/esm/node_modules/@ritbit/v4-proto/src/codegen/ritbit/bridge/tx.js +1 -1
  60. package/build/esm/node_modules/@ritbit/v4-proto/src/codegen/ritbit/denomwrap/params.d.ts +116 -0
  61. package/build/esm/node_modules/@ritbit/v4-proto/src/codegen/ritbit/denomwrap/params.d.ts.map +1 -0
  62. package/build/esm/node_modules/@ritbit/v4-proto/src/codegen/ritbit/denomwrap/params.js +98 -0
  63. package/build/esm/node_modules/@ritbit/v4-proto/src/codegen/ritbit/denomwrap/tx.d.ts +80 -0
  64. package/build/esm/node_modules/@ritbit/v4-proto/src/codegen/ritbit/denomwrap/tx.d.ts.map +1 -0
  65. package/build/esm/node_modules/@ritbit/v4-proto/src/codegen/ritbit/denomwrap/tx.js +168 -0
  66. package/build/esm/node_modules/@ritbit/v4-proto/src/codegen/ritbit/denomwrap/tx.rpc.msg.d.ts +21 -0
  67. package/build/esm/node_modules/@ritbit/v4-proto/src/codegen/ritbit/denomwrap/tx.rpc.msg.d.ts.map +1 -0
  68. package/build/esm/node_modules/@ritbit/v4-proto/src/codegen/ritbit/denomwrap/tx.rpc.msg.js +20 -0
  69. package/build/esm/node_modules/@ritbit/v4-proto/src/codegen/ritbit/lcd.d.ts +1 -0
  70. package/build/esm/node_modules/@ritbit/v4-proto/src/codegen/ritbit/lcd.d.ts.map +1 -1
  71. package/build/esm/node_modules/@ritbit/v4-proto/src/codegen/ritbit/lcd.js +4 -1
  72. package/build/esm/node_modules/@ritbit/v4-proto/src/codegen/ritbit/rpc.query.d.ts +4 -0
  73. package/build/esm/node_modules/@ritbit/v4-proto/src/codegen/ritbit/rpc.query.d.ts.map +1 -1
  74. package/build/esm/node_modules/@ritbit/v4-proto/src/codegen/ritbit/rpc.query.js +3 -2
  75. package/build/esm/node_modules/@ritbit/v4-proto/src/codegen/ritbit/rpc.tx.d.ts +2 -0
  76. package/build/esm/node_modules/@ritbit/v4-proto/src/codegen/ritbit/rpc.tx.d.ts.map +1 -1
  77. package/build/esm/node_modules/@ritbit/v4-proto/src/codegen/ritbit/rpc.tx.js +4 -2
  78. package/build/esm/node_modules/@ritbit/v4-proto/src/codegen/ritbit/sending/tx.d.ts +0 -1
  79. package/build/esm/node_modules/@ritbit/v4-proto/src/codegen/ritbit/sending/tx.d.ts.map +1 -1
  80. package/build/esm/node_modules/@ritbit/v4-proto/src/codegen/ritbit/sending/tx.js +1 -1
  81. package/build/esm/node_modules/@ritbit/v4-proto/src/codegen/ritbit/wrap/genesis.d.ts +79 -0
  82. package/build/esm/node_modules/@ritbit/v4-proto/src/codegen/ritbit/wrap/genesis.d.ts.map +1 -0
  83. package/build/esm/node_modules/@ritbit/v4-proto/src/codegen/ritbit/wrap/genesis.js +115 -0
  84. package/build/esm/node_modules/@ritbit/v4-proto/src/codegen/ritbit/wrap/params.d.ts +116 -0
  85. package/build/esm/node_modules/@ritbit/v4-proto/src/codegen/ritbit/wrap/params.d.ts.map +1 -0
  86. package/build/esm/node_modules/@ritbit/v4-proto/src/codegen/ritbit/wrap/params.js +98 -0
  87. package/build/esm/node_modules/@ritbit/v4-proto/src/codegen/ritbit/wrap/query.d.ts +82 -0
  88. package/build/esm/node_modules/@ritbit/v4-proto/src/codegen/ritbit/wrap/query.d.ts.map +1 -0
  89. package/build/esm/node_modules/@ritbit/v4-proto/src/codegen/ritbit/wrap/query.js +212 -0
  90. package/build/esm/node_modules/@ritbit/v4-proto/src/codegen/ritbit/wrap/query.lcd.d.ts +11 -0
  91. package/build/esm/node_modules/@ritbit/v4-proto/src/codegen/ritbit/wrap/query.lcd.d.ts.map +1 -0
  92. package/build/esm/node_modules/@ritbit/v4-proto/src/codegen/ritbit/wrap/query.lcd.js +30 -0
  93. package/build/esm/node_modules/@ritbit/v4-proto/src/codegen/ritbit/wrap/query.rpc.Query.d.ts +29 -0
  94. package/build/esm/node_modules/@ritbit/v4-proto/src/codegen/ritbit/wrap/query.rpc.Query.d.ts.map +1 -0
  95. package/build/esm/node_modules/@ritbit/v4-proto/src/codegen/ritbit/wrap/query.rpc.Query.js +33 -0
  96. package/build/esm/node_modules/@ritbit/v4-proto/src/codegen/ritbit/wrap/tx.d.ts +123 -0
  97. package/build/esm/node_modules/@ritbit/v4-proto/src/codegen/ritbit/wrap/tx.d.ts.map +1 -0
  98. package/build/esm/node_modules/@ritbit/v4-proto/src/codegen/ritbit/wrap/tx.js +246 -0
  99. package/build/esm/node_modules/@ritbit/v4-proto/src/codegen/ritbit/wrap/tx.rpc.msg.d.ts +36 -0
  100. package/build/esm/node_modules/@ritbit/v4-proto/src/codegen/ritbit/wrap/tx.rpc.msg.d.ts.map +1 -0
  101. package/build/esm/node_modules/@ritbit/v4-proto/src/codegen/ritbit/wrap/tx.rpc.msg.js +26 -0
  102. package/build/esm/src/clients/composite-client.d.ts +8 -2
  103. package/build/esm/src/clients/composite-client.d.ts.map +1 -1
  104. package/build/esm/src/clients/composite-client.js +7 -3
  105. package/build/esm/src/clients/constants.d.ts +13 -1
  106. package/build/esm/src/clients/constants.d.ts.map +1 -1
  107. package/build/esm/src/clients/constants.js +13 -1
  108. package/build/esm/src/clients/lib/accounts.d.ts +29 -0
  109. package/build/esm/src/clients/lib/accounts.d.ts.map +1 -0
  110. package/build/esm/src/clients/lib/accounts.js +74 -0
  111. package/build/esm/src/clients/lib/agent-approval-tx.d.ts +46 -0
  112. package/build/esm/src/clients/lib/agent-approval-tx.d.ts.map +1 -0
  113. package/build/esm/src/clients/lib/agent-approval-tx.js +79 -0
  114. package/build/esm/src/clients/lib/agent-approval.d.ts +64 -0
  115. package/build/esm/src/clients/lib/agent-approval.d.ts.map +1 -0
  116. package/build/esm/src/clients/lib/agent-approval.js +112 -0
  117. package/build/esm/src/clients/lib/eip712.d.ts +95 -0
  118. package/build/esm/src/clients/lib/eip712.d.ts.map +1 -0
  119. package/build/esm/src/clients/lib/eip712.js +581 -0
  120. package/build/esm/src/clients/lib/eth-pubkey.d.ts +44 -0
  121. package/build/esm/src/clients/lib/eth-pubkey.d.ts.map +1 -0
  122. package/build/esm/src/clients/lib/eth-pubkey.js +61 -0
  123. package/build/esm/src/clients/modules/composer.d.ts +12 -1
  124. package/build/esm/src/clients/modules/composer.d.ts.map +1 -1
  125. package/build/esm/src/clients/modules/composer.js +15 -2
  126. package/build/esm/src/clients/modules/eip712-signer.d.ts +99 -0
  127. package/build/esm/src/clients/modules/eip712-signer.d.ts.map +1 -0
  128. package/build/esm/src/clients/modules/eip712-signer.js +183 -0
  129. package/build/esm/src/clients/modules/eth-agent-wallet.d.ts +39 -0
  130. package/build/esm/src/clients/modules/eth-agent-wallet.d.ts.map +1 -0
  131. package/build/esm/src/clients/modules/eth-agent-wallet.js +97 -0
  132. package/build/esm/src/clients/modules/eth-wallet.d.ts +32 -0
  133. package/build/esm/src/clients/modules/eth-wallet.d.ts.map +1 -0
  134. package/build/esm/src/clients/modules/eth-wallet.js +83 -0
  135. package/build/esm/src/clients/modules/get.d.ts +2 -1
  136. package/build/esm/src/clients/modules/get.d.ts.map +1 -1
  137. package/build/esm/src/clients/modules/get.js +2 -2
  138. package/build/esm/src/clients/modules/local-wallet.d.ts +2 -1
  139. package/build/esm/src/clients/modules/local-wallet.d.ts.map +1 -1
  140. package/build/esm/src/clients/modules/local-wallet.js +9 -2
  141. package/build/esm/src/clients/modules/post.d.ts +3 -2
  142. package/build/esm/src/clients/modules/post.d.ts.map +1 -1
  143. package/build/esm/src/clients/modules/post.js +14 -4
  144. package/build/esm/src/clients/modules/signer.d.ts +2 -1
  145. package/build/esm/src/clients/modules/signer.d.ts.map +1 -1
  146. package/build/esm/src/clients/modules/signer.js +13 -3
  147. package/build/esm/src/clients/native.d.ts.map +1 -1
  148. package/build/esm/src/clients/native.js +2 -2
  149. package/build/esm/src/clients/types.d.ts +1 -1
  150. package/build/esm/src/clients/types.d.ts.map +1 -1
  151. package/build/esm/src/clients/types.js +1 -1
  152. package/build/esm/src/index.d.ts +13 -0
  153. package/build/esm/src/index.d.ts.map +1 -1
  154. package/build/esm/src/index.js +9 -1
  155. package/build/esm/src/lib/evm-address.d.ts +31 -0
  156. package/build/esm/src/lib/evm-address.d.ts.map +1 -0
  157. package/build/esm/src/lib/evm-address.js +85 -0
  158. package/build/esm/src/lib/trading-key-utils.d.ts +3 -0
  159. package/build/esm/src/lib/trading-key-utils.d.ts.map +1 -1
  160. package/build/esm/src/lib/trading-key-utils.js +42 -4
  161. package/build/esm/tsconfig.esm.tsbuildinfo +1 -1
  162. package/package.json +2 -2
@@ -0,0 +1,592 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.registerEip712AminoConverter = registerEip712AminoConverter;
7
+ exports.createEip712Domain = createEip712Domain;
8
+ exports.signDocToEip712Message = signDocToEip712Message;
9
+ exports.signDocToEip712TypedData = signDocToEip712TypedData;
10
+ exports.signDocBytesToEip712TypedData = signDocBytesToEip712TypedData;
11
+ exports.eip712Digest = eip712Digest;
12
+ const encoding_1 = require("@cosmjs/encoding");
13
+ const tx_1 = require("@ritbit/v4-proto/src/codegen/ritbit/accountplus/tx");
14
+ const transfer_1 = require("@ritbit/v4-proto/src/codegen/ritbit/sending/transfer");
15
+ const tx_2 = require("@ritbit/v4-proto/src/codegen/ritbit/affiliates/tx");
16
+ const tx_3 = require("@ritbit/v4-proto/src/codegen/ritbit/bridge/tx");
17
+ const tx_4 = require("@ritbit/v4-proto/src/codegen/ritbit/listing/tx");
18
+ const tx_5 = require("@ritbit/v4-proto/src/codegen/ritbit/sending/tx");
19
+ const tx_6 = require("@ritbit/v4-proto/src/codegen/ritbit/wrap/tx");
20
+ const tx_7 = require("@ritbit/v4-proto/src/codegen/ritbit/vault/tx");
21
+ const tx_8 = require("cosmjs-types/cosmos/bank/v1beta1/tx");
22
+ const tx_9 = require("cosmjs-types/cosmos/distribution/v1beta1/tx");
23
+ const tx_10 = require("cosmjs-types/cosmos/staking/v1beta1/tx");
24
+ const tx_11 = require("cosmjs-types/cosmos/tx/v1beta1/tx");
25
+ const ethers_1 = require("ethers");
26
+ const long_1 = __importDefault(require("long"));
27
+ const constants_1 = require("../constants");
28
+ function coinToAmino(coin) {
29
+ const value = {};
30
+ if (coin.denom !== '') {
31
+ value.denom = coin.denom;
32
+ }
33
+ // Coin.amount is amino.dont_omitempty: always rendered.
34
+ value.amount = coin.amount;
35
+ return value;
36
+ }
37
+ /**
38
+ * SubaccountId rendered as an amino JSON object. The chain's gogoproto
39
+ * declares subaccount ids as non-nullable embedded messages, so the field is
40
+ * always present on the wire (and thus always rendered, possibly as {}),
41
+ * while its own empty/zero subfields are omitted.
42
+ */
43
+ function subaccountIdToAmino(id) {
44
+ const value = {};
45
+ if (id !== undefined && id.owner !== '') {
46
+ value.owner = id.owner;
47
+ }
48
+ if (id !== undefined && id.number !== 0) {
49
+ value.number = id.number;
50
+ }
51
+ return value;
52
+ }
53
+ function isLongSet(value) {
54
+ return value !== undefined && !long_1.default.fromValue(value).isZero();
55
+ }
56
+ const defaultEip712AminoConverters = {
57
+ [constants_1.TYPE_URL_MSG_SEND]: (bytes) => {
58
+ const msg = tx_8.MsgSend.decode(bytes);
59
+ const value = {};
60
+ if (msg.fromAddress !== '') {
61
+ value.from_address = msg.fromAddress;
62
+ }
63
+ if (msg.toAddress !== '') {
64
+ value.to_address = msg.toAddress;
65
+ }
66
+ // amount is amino.dont_omitempty + legacy_coins: always rendered.
67
+ value.amount = msg.amount.map(coinToAmino);
68
+ return { type: 'cosmos-sdk/MsgSend', value };
69
+ },
70
+ [constants_1.TYPE_URL_MSG_ADD_AUTHENTICATOR]: (bytes) => {
71
+ const msg = tx_1.MsgAddAuthenticator.decode(bytes);
72
+ const value = {};
73
+ if (msg.sender !== '') {
74
+ value.sender = msg.sender;
75
+ }
76
+ if (msg.authenticatorType !== '') {
77
+ value.authenticator_type = msg.authenticatorType;
78
+ }
79
+ if (msg.data.length > 0) {
80
+ value.data = (0, encoding_1.toBase64)(msg.data);
81
+ }
82
+ if (msg.name !== '') {
83
+ value.name = msg.name;
84
+ }
85
+ if (isLongSet(msg.expiresAt)) {
86
+ value.expires_at = msg.expiresAt.toString();
87
+ }
88
+ return { type: 'ritbit/accountplus/MsgAddAuthenticator', value };
89
+ },
90
+ [constants_1.TYPE_URL_MSG_REMOVE_AUTHENTICATOR]: (bytes) => {
91
+ const msg = tx_1.MsgRemoveAuthenticator.decode(bytes);
92
+ const value = {};
93
+ if (msg.sender !== '') {
94
+ value.sender = msg.sender;
95
+ }
96
+ if (isLongSet(msg.id)) {
97
+ value.id = msg.id.toString();
98
+ }
99
+ return { type: 'ritbit/accountplus/MsgRemoveAuthenticator', value };
100
+ },
101
+ [constants_1.TYPE_URL_MSG_WITHDRAW_FROM_SUBACCOUNT]: (bytes) => {
102
+ const msg = transfer_1.MsgWithdrawFromSubaccount.decode(bytes);
103
+ const value = {};
104
+ // sender is gogoproto non-nullable: always present.
105
+ value.sender = subaccountIdToAmino(msg.sender);
106
+ if (msg.recipient !== '') {
107
+ value.recipient = msg.recipient;
108
+ }
109
+ if (msg.assetId !== 0) {
110
+ value.asset_id = msg.assetId;
111
+ }
112
+ if (isLongSet(msg.quantums)) {
113
+ value.quantums = msg.quantums.toString();
114
+ }
115
+ return { type: 'ritbit/sending/MsgWithdrawFromSubaccount', value };
116
+ },
117
+ [constants_1.TYPE_URL_MSG_DEPOSIT_TO_SUBACCOUNT]: (bytes) => {
118
+ const msg = transfer_1.MsgDepositToSubaccount.decode(bytes);
119
+ const value = {};
120
+ if (msg.sender !== '') {
121
+ value.sender = msg.sender;
122
+ }
123
+ // recipient is gogoproto non-nullable: always present.
124
+ value.recipient = subaccountIdToAmino(msg.recipient);
125
+ if (msg.assetId !== 0) {
126
+ value.asset_id = msg.assetId;
127
+ }
128
+ if (isLongSet(msg.quantums)) {
129
+ value.quantums = msg.quantums.toString();
130
+ }
131
+ return { type: 'ritbit/sending/MsgDepositToSubaccount', value };
132
+ },
133
+ [constants_1.TYPE_URL_MSG_CREATE_TRANSFER]: (bytes) => {
134
+ const msg = tx_5.MsgCreateTransfer.decode(bytes);
135
+ const value = {};
136
+ if (msg.transfer !== undefined) {
137
+ const transfer = {
138
+ // sender/recipient are gogoproto non-nullable: always present.
139
+ sender: subaccountIdToAmino(msg.transfer.sender),
140
+ recipient: subaccountIdToAmino(msg.transfer.recipient),
141
+ };
142
+ if (msg.transfer.assetId !== 0) {
143
+ transfer.asset_id = msg.transfer.assetId;
144
+ }
145
+ if (isLongSet(msg.transfer.amount)) {
146
+ transfer.amount = msg.transfer.amount.toString();
147
+ }
148
+ value.transfer = transfer;
149
+ }
150
+ return { type: 'ritbit/sending/MsgCreateTransfer', value };
151
+ },
152
+ // Staking from the web: master-account transactions the wallet signs.
153
+ // legacy coins render with both fields always present; the claim message
154
+ // keeps the SDK's historical amino name (…DelegationReward, not Delegator).
155
+ // Pinned by the MsgDelegate/MsgUndelegate/MsgWithdrawDelegatorReward goldens.
156
+ [constants_1.TYPE_URL_MSG_DELEGATE]: (bytes) => {
157
+ const msg = tx_10.MsgDelegate.decode(bytes);
158
+ const value = {};
159
+ if (msg.delegatorAddress !== '') {
160
+ value.delegator_address = msg.delegatorAddress;
161
+ }
162
+ if (msg.validatorAddress !== '') {
163
+ value.validator_address = msg.validatorAddress;
164
+ }
165
+ if (msg.amount !== undefined) {
166
+ value.amount = coinToAmino(msg.amount);
167
+ }
168
+ return { type: 'cosmos-sdk/MsgDelegate', value };
169
+ },
170
+ [constants_1.TYPE_URL_MSG_UNDELEGATE]: (bytes) => {
171
+ const msg = tx_10.MsgUndelegate.decode(bytes);
172
+ const value = {};
173
+ if (msg.delegatorAddress !== '') {
174
+ value.delegator_address = msg.delegatorAddress;
175
+ }
176
+ if (msg.validatorAddress !== '') {
177
+ value.validator_address = msg.validatorAddress;
178
+ }
179
+ if (msg.amount !== undefined) {
180
+ value.amount = coinToAmino(msg.amount);
181
+ }
182
+ return { type: 'cosmos-sdk/MsgUndelegate', value };
183
+ },
184
+ [constants_1.TYPE_URL_MSG_WITHDRAW_DELEGATOR_REWARD]: (bytes) => {
185
+ const msg = tx_9.MsgWithdrawDelegatorReward.decode(bytes);
186
+ const value = {};
187
+ if (msg.delegatorAddress !== '') {
188
+ value.delegator_address = msg.delegatorAddress;
189
+ }
190
+ if (msg.validatorAddress !== '') {
191
+ value.validator_address = msg.validatorAddress;
192
+ }
193
+ return { type: 'cosmos-sdk/MsgWithdrawDelegationReward', value };
194
+ },
195
+ // The bridge withdrawal the web's withdraw form sends. math.Int renders as a
196
+ // decimal string; uint64 as a string; zero scalars are omitted. Pinned by the
197
+ // MsgBridgeWithdrawal golden.
198
+ [constants_1.TYPE_URL_MSG_WITHDRAWAL]: (bytes) => {
199
+ const msg = tx_3.MsgWithdrawal.decode(bytes);
200
+ const value = {};
201
+ if (msg.sender !== '') {
202
+ value.sender = msg.sender;
203
+ }
204
+ if (msg.amount !== '' && msg.amount !== '0') {
205
+ value.amount = msg.amount;
206
+ }
207
+ if (msg.ethRecipient !== '') {
208
+ value.eth_recipient = msg.ethRecipient;
209
+ }
210
+ if (isLongSet(msg.ethChainId)) {
211
+ value.eth_chain_id = msg.ethChainId.toString();
212
+ }
213
+ if (msg.assetId !== 0) {
214
+ value.asset_id = msg.assetId;
215
+ }
216
+ return { type: 'ritbit/bridge/MsgWithdrawal', value };
217
+ },
218
+ [constants_1.TYPE_URL_MSG_REGISTER_AFFILIATE]: (bytes) => {
219
+ const msg = tx_2.MsgRegisterAffiliate.decode(bytes);
220
+ const value = {};
221
+ if (msg.referee !== '') {
222
+ value.referee = msg.referee;
223
+ }
224
+ if (msg.affiliate !== '') {
225
+ value.affiliate = msg.affiliate;
226
+ }
227
+ return { type: 'ritbit/affiliates/MsgRegisterAffiliate', value };
228
+ },
229
+ [constants_1.TYPE_URL_MSG_CREATE_MARKET_PERMISSIONLESS]: (bytes) => {
230
+ const msg = tx_4.MsgCreateMarketPermissionless.decode(bytes);
231
+ const value = {};
232
+ if (msg.ticker !== '') {
233
+ value.ticker = msg.ticker;
234
+ }
235
+ // subaccount_id is a nullable pointer: present only when set.
236
+ if (msg.subaccountId !== undefined) {
237
+ value.subaccount_id = subaccountIdToAmino(msg.subaccountId);
238
+ }
239
+ return { type: 'ritbit/listing/MsgCreateMarketPermissionless', value };
240
+ },
241
+ [constants_1.TYPE_URL_MSG_WRAP_WITHDRAW]: (bytes) => {
242
+ const msg = tx_6.MsgWithdraw.decode(bytes);
243
+ const value = {};
244
+ if (msg.sender !== '') {
245
+ value.sender = msg.sender;
246
+ }
247
+ if (msg.amount !== '' && msg.amount !== '0') {
248
+ value.amount = msg.amount;
249
+ }
250
+ if (msg.receiver !== '') {
251
+ value.receiver = msg.receiver;
252
+ }
253
+ if (isLongSet(msg.timeoutSeconds)) {
254
+ value.timeout_seconds = msg.timeoutSeconds.toString();
255
+ }
256
+ if (msg.voucherDenom !== '') {
257
+ value.voucher_denom = msg.voucherDenom;
258
+ }
259
+ return { type: 'ritbit/wrap/MsgWithdraw', value };
260
+ },
261
+ [constants_1.TYPE_URL_MSG_WRAP_REDEEM]: (bytes) => {
262
+ const msg = tx_6.MsgRedeem.decode(bytes);
263
+ const value = {};
264
+ if (msg.sender !== '') {
265
+ value.sender = msg.sender;
266
+ }
267
+ if (msg.amount !== '' && msg.amount !== '0') {
268
+ value.amount = msg.amount;
269
+ }
270
+ if (msg.voucherDenom !== '') {
271
+ value.voucher_denom = msg.voucherDenom;
272
+ }
273
+ return { type: 'ritbit/wrap/MsgRedeem', value };
274
+ },
275
+ // Vault deposits/withdrawals are master-account transactions the wallet
276
+ // signs directly (the web's vault form). Amino shapes mirror the chain's
277
+ // aminojson encoding exactly — pinned by the MsgDepositToMegavault /
278
+ // MsgWithdrawFromMegavault vectors in eip712_goldens.json.
279
+ [constants_1.TYPE_URL_MSG_DEPOSIT_TO_MEGAVAULT]: (bytes) => {
280
+ const msg = tx_7.MsgDepositToMegavault.decode(bytes);
281
+ const value = {};
282
+ // subaccount_id is a nullable pointer on the chain: present only when set.
283
+ if (msg.subaccountId !== undefined) {
284
+ value.subaccount_id = subaccountIdToAmino(msg.subaccountId);
285
+ }
286
+ // SerializableInt renders as the raw big-int bytes in base64.
287
+ if (msg.quoteQuantums.length > 0) {
288
+ value.quote_quantums = (0, encoding_1.toBase64)(msg.quoteQuantums);
289
+ }
290
+ return { type: 'ritbit/vault/MsgDepositToMegavault', value };
291
+ },
292
+ [constants_1.TYPE_URL_MSG_WITHDRAW_FROM_MEGAVAULT]: (bytes) => {
293
+ const msg = tx_7.MsgWithdrawFromMegavault.decode(bytes);
294
+ const value = {};
295
+ // subaccount_id and shares are gogoproto non-nullable: always present.
296
+ value.subaccount_id = subaccountIdToAmino(msg.subaccountId);
297
+ const shares = {};
298
+ if (msg.shares !== undefined && msg.shares.numShares.length > 0) {
299
+ shares.num_shares = (0, encoding_1.toBase64)(msg.shares.numShares);
300
+ }
301
+ value.shares = shares;
302
+ if (msg.minQuoteQuantums.length > 0) {
303
+ value.min_quote_quantums = (0, encoding_1.toBase64)(msg.minQuoteQuantums);
304
+ }
305
+ return { type: 'ritbit/vault/MsgWithdrawFromMegavault', value };
306
+ },
307
+ };
308
+ const eip712AminoConverters = {
309
+ ...defaultEip712AminoConverters,
310
+ };
311
+ /**
312
+ * Registers (or overrides) the amino converter for a msg typeUrl, extending
313
+ * the set of message types that can be EIP-712 signed.
314
+ */
315
+ function registerEip712AminoConverter(typeUrl, converter) {
316
+ eip712AminoConverters[typeUrl] = converter;
317
+ }
318
+ function convertAnyToAminoMsg(msgAny) {
319
+ const converter = eip712AminoConverters[msgAny.typeUrl];
320
+ if (converter === undefined) {
321
+ throw new Error(`EIP-712 signing does not support msg type ${msgAny.typeUrl}`);
322
+ }
323
+ return converter(msgAny.value);
324
+ }
325
+ // ---------------------------------------------------------------------------
326
+ // Types generation (port of cosmos/evm ethereum/eip712/types.go)
327
+ // ---------------------------------------------------------------------------
328
+ const ROOT_PREFIX = '_';
329
+ const TYPE_PREFIX = 'Type';
330
+ const TX_FIELD = 'Tx';
331
+ const MAX_DUPLICATE_TYPE_DEFS = 1000;
332
+ /** Port of message.go msgFieldForIndex: msgs[2] becomes 'msg2'. */
333
+ function msgFieldForIndex(i) {
334
+ return `msg${i}`;
335
+ }
336
+ /**
337
+ * Port of types.go sanitizeTypedef: '_.foo_bar.baz' -> 'TypeFooBarBaz'.
338
+ * Title-cases each underscore-separated subpart (first letter only, the rest
339
+ * of the casing is preserved — cases.Title with NoLower).
340
+ */
341
+ function sanitizeTypedef(str) {
342
+ return str
343
+ .split('.')
344
+ .map((part) => {
345
+ if (part === ROOT_PREFIX) {
346
+ return TYPE_PREFIX;
347
+ }
348
+ return part
349
+ .split('_')
350
+ .map((subpart) => (subpart === '' ? '' : subpart.charAt(0).toUpperCase() + subpart.slice(1)))
351
+ .join('');
352
+ })
353
+ .join('');
354
+ }
355
+ /**
356
+ * Port of types.go sortedJSONKeys: keys sorted in REVERSE lexicographic
357
+ * (byte-wise descending) order, for deterministic type generation.
358
+ */
359
+ function sortedJsonKeys(obj) {
360
+ return Object.keys(obj).sort((a, b) => (a < b ? 1 : a > b ? -1 : 0));
361
+ }
362
+ /** Port of types.go getEthTypeForJSON. Empty string for objects/arrays/null. */
363
+ function getEthTypeForJson(value) {
364
+ switch (typeof value) {
365
+ case 'boolean':
366
+ return 'bool';
367
+ case 'number':
368
+ return 'int64';
369
+ case 'string':
370
+ return 'string';
371
+ default:
372
+ return '';
373
+ }
374
+ }
375
+ function typesAreEqual(types1, types2) {
376
+ if (types1.length !== types2.length) {
377
+ return false;
378
+ }
379
+ for (let i = 0; i < types1.length; i++) {
380
+ if (types1[i].name !== types2[i].name || types1[i].type !== types2[i].type) {
381
+ return false;
382
+ }
383
+ }
384
+ return true;
385
+ }
386
+ /**
387
+ * Port of types.go addTypesToRoot: inserts the type list at the next
388
+ * available '<typeDef><n>' key (reusing an identical existing definition) and
389
+ * returns that key. All typedefs therefore carry a numeric suffix, e.g.
390
+ * 'TypeMsgSend0', 'TypeValue0'.
391
+ */
392
+ function addTypesToRoot(typeMap, typeDef, types) {
393
+ for (let index = 0; index < MAX_DUPLICATE_TYPE_DEFS; index++) {
394
+ const indexedTypeDef = `${typeDef}${index}`;
395
+ const existingTypes = typeMap[indexedTypeDef];
396
+ if (existingTypes !== undefined && typesAreEqual(types, existingTypes)) {
397
+ return indexedTypeDef;
398
+ }
399
+ if (existingTypes === undefined) {
400
+ typeMap[indexedTypeDef] = types;
401
+ return indexedTypeDef;
402
+ }
403
+ }
404
+ throw new Error('exceeded maximum number of duplicates for a single type definition');
405
+ }
406
+ /**
407
+ * Port of types.go recursivelyAddTypesToRoot: walks the msg JSON with keys in
408
+ * reverse-sorted order, unwrapping the first element of arrays, mapping JSON
409
+ * primitives to string/int64/bool and recursing into nested objects with the
410
+ * '_.field' prefix scheme.
411
+ */
412
+ function recursivelyAddTypesToRoot(typeMap, rootType, prefix, payload) {
413
+ const typesToAdd = [];
414
+ const typeDef = prefix === ROOT_PREFIX ? rootType : sanitizeTypedef(prefix);
415
+ for (const fieldName of sortedJsonKeys(payload)) {
416
+ let field = payload[fieldName];
417
+ if (field === null || field === undefined) {
418
+ continue;
419
+ }
420
+ // Handle array types by unwrapping the first element. Arrays with
421
+ // multiple types are not supported in EIP-712.
422
+ let isCollection = false;
423
+ if (Array.isArray(field)) {
424
+ if (field.length === 0) {
425
+ // Arbitrarily use string[] for empty arrays, since we cannot access
426
+ // the underlying object.
427
+ typesToAdd.push({ name: fieldName, type: 'string[]' });
428
+ continue;
429
+ }
430
+ [field] = field;
431
+ isCollection = true;
432
+ }
433
+ const ethType = getEthTypeForJson(field);
434
+ if (ethType !== '') {
435
+ typesToAdd.push({ name: fieldName, type: isCollection ? `${ethType}[]` : ethType });
436
+ continue;
437
+ }
438
+ if (typeof field === 'object' && !Array.isArray(field)) {
439
+ const fieldPrefix = `${prefix}.${fieldName}`;
440
+ let fieldTypeDef = recursivelyAddTypesToRoot(typeMap, rootType, fieldPrefix, field);
441
+ fieldTypeDef = sanitizeTypedef(fieldTypeDef);
442
+ if (isCollection) {
443
+ fieldTypeDef += '[]';
444
+ }
445
+ typesToAdd.push({ name: fieldName, type: fieldTypeDef });
446
+ }
447
+ }
448
+ return addTypesToRoot(typeMap, typeDef, typesToAdd);
449
+ }
450
+ /** Port of types.go msgRootType: e.g. 'cosmos-sdk/MsgSend' -> 'TypeMsgSend'. */
451
+ function msgRootType(msg) {
452
+ const typeTokenized = msg.type.split('/');
453
+ return `${TYPE_PREFIX}${typeTokenized[typeTokenized.length - 1]}`;
454
+ }
455
+ /**
456
+ * Port of types.go createEIP712Types: the static skeleton (EIP712Domain, Tx,
457
+ * Fee, Coin) plus recursively generated per-msg types, with each msgN's
458
+ * resolved typedef appended to Tx.
459
+ */
460
+ function createEip712Types(payload, numMsgs) {
461
+ const types = {
462
+ EIP712Domain: [
463
+ { name: 'name', type: 'string' },
464
+ { name: 'version', type: 'string' },
465
+ { name: 'chainId', type: 'uint256' },
466
+ { name: 'verifyingContract', type: 'string' },
467
+ { name: 'salt', type: 'string' },
468
+ ],
469
+ Tx: [
470
+ { name: 'account_number', type: 'string' },
471
+ { name: 'chain_id', type: 'string' },
472
+ { name: 'fee', type: 'Fee' },
473
+ { name: 'memo', type: 'string' },
474
+ { name: 'sequence', type: 'string' },
475
+ ],
476
+ Fee: [
477
+ { name: 'amount', type: 'Coin[]' },
478
+ { name: 'gas', type: 'string' },
479
+ ],
480
+ Coin: [
481
+ { name: 'denom', type: 'string' },
482
+ { name: 'amount', type: 'string' },
483
+ ],
484
+ };
485
+ for (let i = 0; i < numMsgs; i++) {
486
+ const field = msgFieldForIndex(i);
487
+ const msg = payload[field];
488
+ const msgTypeDef = recursivelyAddTypesToRoot(types, msgRootType(msg), ROOT_PREFIX, msg);
489
+ types[TX_FIELD].push({ name: field, type: msgTypeDef });
490
+ }
491
+ return types;
492
+ }
493
+ // ---------------------------------------------------------------------------
494
+ // Domain (port of domain.go) and SignDoc decoding (port of encoding.go)
495
+ // ---------------------------------------------------------------------------
496
+ /**
497
+ * Port of domain.go createEIP712Domain. The chainId is rendered the way geth's
498
+ * math.HexOrDecimal256 marshals it (0x-prefixed lowercase hex).
499
+ */
500
+ function createEip712Domain(evmChainId) {
501
+ return {
502
+ name: 'Cosmos Web3',
503
+ version: '1.0.0',
504
+ chainId: `0x${evmChainId.toString(16)}`,
505
+ verifyingContract: 'cosmos',
506
+ salt: '0',
507
+ };
508
+ }
509
+ /**
510
+ * Port of encoding.go decodeProtobufSignDoc + message.go FlattenPayloadMessages:
511
+ * decodes a SIGN_MODE_DIRECT SignDoc, renders the equivalent aminojson sign
512
+ * doc payload and flattens the msgs array into msg0/msg1/... fields.
513
+ *
514
+ * Returns the flattened payload (= the typed-data message) and the number of
515
+ * msgs it contains.
516
+ */
517
+ function signDocToEip712Message(signDoc) {
518
+ var _a, _b, _c, _d;
519
+ const body = tx_11.TxBody.decode(signDoc.bodyBytes);
520
+ const authInfo = tx_11.AuthInfo.decode(signDoc.authInfoBytes);
521
+ // Same restrictions as the chain-side decoder (encoding.go).
522
+ if (body.timeoutHeight.toString() !== '0') {
523
+ throw new Error('EIP-712 signing does not support TxBody.timeoutHeight');
524
+ }
525
+ if (body.extensionOptions.length !== 0 || body.nonCriticalExtensionOptions.length !== 0) {
526
+ throw new Error('EIP-712 signing does not support TxBody extensionOptions or nonCriticalExtensionOptions');
527
+ }
528
+ if (authInfo.signerInfos.length !== 1) {
529
+ throw new Error(`invalid number of signer infos provided, expected 1 got ${authInfo.signerInfos.length}`);
530
+ }
531
+ if (body.messages.length === 0) {
532
+ throw new Error('unable to build EIP-712 payload: transaction does not contain any messages');
533
+ }
534
+ // The aminojson sign doc envelope (x/tx AminoSignDoc): account_number,
535
+ // sequence, chain_id, memo, fee and msgs are amino.dont_omitempty (always
536
+ // rendered); timeout_height is omitted when 0 (and rejected above);
537
+ // fee.payer/granter are dropped by the chain-side conversion.
538
+ const message = {
539
+ account_number: signDoc.accountNumber.toString(),
540
+ chain_id: signDoc.chainId,
541
+ fee: {
542
+ amount: ((_b = (_a = authInfo.fee) === null || _a === void 0 ? void 0 : _a.amount) !== null && _b !== void 0 ? _b : []).map(coinToAmino),
543
+ gas: ((_d = (_c = authInfo.fee) === null || _c === void 0 ? void 0 : _c.gasLimit) !== null && _d !== void 0 ? _d : 0).toString(),
544
+ },
545
+ memo: body.memo,
546
+ sequence: authInfo.signerInfos[0].sequence.toString(),
547
+ };
548
+ // Flattening (message.go): msgs array -> msg0/msg1/... fields, msgs dropped.
549
+ body.messages.forEach((msgAny, i) => {
550
+ message[msgFieldForIndex(i)] = convertAnyToAminoMsg(msgAny);
551
+ });
552
+ return { message, numMsgs: body.messages.length };
553
+ }
554
+ /**
555
+ * Converts a SIGN_MODE_DIRECT SignDoc into the EIP-712 typed data the chain
556
+ * expects a browser wallet to sign (port of cosmos/evm's WrapTxToTypedData
557
+ * over decodeProtobufSignDoc).
558
+ *
559
+ * @param evmChainId The EIP-155 chain id of the chain (e.g. 111984).
560
+ */
561
+ function signDocToEip712TypedData(signDoc, evmChainId) {
562
+ const { message, numMsgs } = signDocToEip712Message(signDoc);
563
+ return {
564
+ types: createEip712Types(message, numMsgs),
565
+ primaryType: TX_FIELD,
566
+ domain: createEip712Domain(evmChainId),
567
+ message,
568
+ };
569
+ }
570
+ /** Same as signDocToEip712TypedData, from raw protobuf SignDoc bytes. */
571
+ function signDocBytesToEip712TypedData(signDocBytes, evmChainId) {
572
+ return signDocToEip712TypedData(tx_11.SignDoc.decode(signDocBytes), evmChainId);
573
+ }
574
+ // ---------------------------------------------------------------------------
575
+ // Digest
576
+ // ---------------------------------------------------------------------------
577
+ /**
578
+ * The EIP-712 digest the wallet signs:
579
+ * keccak256(0x1901 || hashStruct(EIP712Domain) || hashStruct(Tx)).
580
+ *
581
+ * The domain separator is hashed with the DECLARED domain types (geth's
582
+ * apitypes behavior) — verifyingContract and salt are 'string' fields here,
583
+ * not address/bytes32 — so it cannot go through ethers' built-in
584
+ * TypedDataEncoder.hash(), whose fixed domain schema differs.
585
+ */
586
+ function eip712Digest(typedData) {
587
+ const { EIP712Domain: domainTypes, ...messageTypes } = typedData.types;
588
+ const domainHash = ethers_1.TypedDataEncoder.hashStruct('EIP712Domain', { EIP712Domain: domainTypes }, typedData.domain);
589
+ const messageHash = ethers_1.TypedDataEncoder.hashStruct(typedData.primaryType, messageTypes, typedData.message);
590
+ return (0, ethers_1.getBytes)((0, ethers_1.keccak256)((0, ethers_1.concat)(['0x1901', domainHash, messageHash])));
591
+ }
592
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWlwNzEyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2NsaWVudHMvbGliL2VpcDcxMi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQW1hQSxvRUFLQztBQTJORCxnREFRQztBQVVELHdEQThDQztBQVNELDREQVFDO0FBR0Qsc0VBS0M7QUFlRCxvQ0FhQztBQXh2QkQsK0NBQTRDO0FBQzVDLDJFQUFpSDtBQUNqSCxtRkFHOEQ7QUFDOUQsMEVBQXlGO0FBQ3pGLHNFQUE4RTtBQUM5RSx1RUFBK0Y7QUFDL0YsdUVBQW1GO0FBQ25GLG9FQUdxRDtBQUNyRCxxRUFHc0Q7QUFFdEQsNERBQThEO0FBQzlELG9FQUF5RjtBQUN6RixnRUFBb0Y7QUFFcEYsMkRBQThFO0FBRTlFLG1DQUF1RTtBQUN2RSxnREFBd0I7QUFFeEIsNENBaUJzQjtBQW1FdEIsU0FBUyxXQUFXLENBQUMsSUFBVTtJQUM3QixNQUFNLEtBQUssR0FBb0IsRUFBRSxDQUFDO0lBQ2xDLElBQUksSUFBSSxDQUFDLEtBQUssS0FBSyxFQUFFLEVBQUUsQ0FBQztRQUN0QixLQUFLLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDM0IsQ0FBQztJQUNELHdEQUF3RDtJQUN4RCxLQUFLLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDM0IsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFTLG1CQUFtQixDQUFDLEVBQTRCO0lBQ3ZELE1BQU0sS0FBSyxHQUFvQixFQUFFLENBQUM7SUFDbEMsSUFBSSxFQUFFLEtBQUssU0FBUyxJQUFJLEVBQUUsQ0FBQyxLQUFLLEtBQUssRUFBRSxFQUFFLENBQUM7UUFDeEMsS0FBSyxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDO0lBQ3pCLENBQUM7SUFDRCxJQUFJLEVBQUUsS0FBSyxTQUFTLElBQUksRUFBRSxDQUFDLE1B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