@ritbit/v4-client-js 2.5.2 → 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.
- package/build/cjs/node_modules/@ritbit/v4-proto/src/codegen/ritbit/accountplus/models.js +19 -3
- package/build/cjs/node_modules/@ritbit/v4-proto/src/codegen/ritbit/accountplus/params.js +28 -3
- package/build/cjs/node_modules/@ritbit/v4-proto/src/codegen/ritbit/accountplus/tx.js +92 -5
- package/build/cjs/node_modules/@ritbit/v4-proto/src/codegen/ritbit/accountplus/tx.rpc.msg.js +7 -1
- package/build/cjs/node_modules/@ritbit/v4-proto/src/codegen/ritbit/assets/tx.js +19 -3
- package/build/cjs/node_modules/@ritbit/v4-proto/src/codegen/ritbit/bridge/tx.js +1 -1
- package/build/cjs/node_modules/@ritbit/v4-proto/src/codegen/ritbit/denomwrap/params.js +134 -0
- package/build/cjs/node_modules/@ritbit/v4-proto/src/codegen/ritbit/denomwrap/tx.js +204 -0
- package/build/cjs/node_modules/@ritbit/v4-proto/src/codegen/ritbit/denomwrap/tx.rpc.msg.js +57 -0
- package/build/cjs/node_modules/@ritbit/v4-proto/src/codegen/ritbit/lcd.js +4 -1
- package/build/cjs/node_modules/@ritbit/v4-proto/src/codegen/ritbit/rpc.query.js +3 -2
- package/build/cjs/node_modules/@ritbit/v4-proto/src/codegen/ritbit/rpc.tx.js +4 -2
- package/build/cjs/node_modules/@ritbit/v4-proto/src/codegen/ritbit/sending/tx.js +1 -1
- package/build/cjs/node_modules/@ritbit/v4-proto/src/codegen/ritbit/wrap/genesis.js +151 -0
- package/build/cjs/node_modules/@ritbit/v4-proto/src/codegen/ritbit/wrap/params.js +134 -0
- package/build/cjs/node_modules/@ritbit/v4-proto/src/codegen/ritbit/wrap/query.js +248 -0
- package/build/cjs/node_modules/@ritbit/v4-proto/src/codegen/ritbit/wrap/query.lcd.js +34 -0
- package/build/cjs/node_modules/@ritbit/v4-proto/src/codegen/ritbit/wrap/query.rpc.Query.js +71 -0
- package/build/cjs/node_modules/@ritbit/v4-proto/src/codegen/ritbit/wrap/tx.js +282 -0
- package/build/cjs/node_modules/@ritbit/v4-proto/src/codegen/ritbit/wrap/tx.rpc.msg.js +63 -0
- package/build/cjs/src/clients/composite-client.js +7 -3
- package/build/cjs/src/clients/constants.js +15 -3
- package/build/cjs/src/clients/lib/accounts.js +44 -5
- package/build/cjs/src/clients/lib/agent-approval-tx.js +83 -0
- package/build/cjs/src/clients/lib/agent-approval.js +119 -0
- package/build/cjs/src/clients/lib/eip712.js +592 -0
- package/build/cjs/src/clients/lib/eth-pubkey.js +68 -0
- package/build/cjs/src/clients/modules/composer.js +15 -2
- package/build/cjs/src/clients/modules/eip712-signer.js +189 -0
- package/build/cjs/src/clients/modules/eth-agent-wallet.js +101 -0
- package/build/cjs/src/clients/modules/eth-wallet.js +91 -0
- package/build/cjs/src/clients/modules/local-wallet.js +9 -2
- package/build/cjs/src/clients/modules/post.js +14 -4
- package/build/cjs/src/clients/modules/signer.js +7 -2
- package/build/cjs/src/index.js +38 -2
- package/build/cjs/src/lib/evm-address.js +92 -0
- package/build/cjs/src/lib/trading-key-utils.js +41 -3
- package/build/cjs/tsconfig.cjs.tsbuildinfo +1 -1
- package/build/esm/node_modules/@ritbit/v4-proto/src/codegen/ritbit/accountplus/models.d.ts +15 -0
- package/build/esm/node_modules/@ritbit/v4-proto/src/codegen/ritbit/accountplus/models.d.ts.map +1 -1
- package/build/esm/node_modules/@ritbit/v4-proto/src/codegen/ritbit/accountplus/models.js +19 -3
- package/build/esm/node_modules/@ritbit/v4-proto/src/codegen/ritbit/accountplus/params.d.ts +24 -1
- package/build/esm/node_modules/@ritbit/v4-proto/src/codegen/ritbit/accountplus/params.d.ts.map +1 -1
- package/build/esm/node_modules/@ritbit/v4-proto/src/codegen/ritbit/accountplus/params.js +28 -3
- package/build/esm/node_modules/@ritbit/v4-proto/src/codegen/ritbit/accountplus/tx.d.ts +43 -1
- package/build/esm/node_modules/@ritbit/v4-proto/src/codegen/ritbit/accountplus/tx.d.ts.map +1 -1
- package/build/esm/node_modules/@ritbit/v4-proto/src/codegen/ritbit/accountplus/tx.js +91 -4
- package/build/esm/node_modules/@ritbit/v4-proto/src/codegen/ritbit/accountplus/tx.rpc.msg.d.ts +4 -1
- package/build/esm/node_modules/@ritbit/v4-proto/src/codegen/ritbit/accountplus/tx.rpc.msg.d.ts.map +1 -1
- package/build/esm/node_modules/@ritbit/v4-proto/src/codegen/ritbit/accountplus/tx.rpc.msg.js +8 -2
- package/build/esm/node_modules/@ritbit/v4-proto/src/codegen/ritbit/assets/tx.d.ts +9 -0
- package/build/esm/node_modules/@ritbit/v4-proto/src/codegen/ritbit/assets/tx.d.ts.map +1 -1
- package/build/esm/node_modules/@ritbit/v4-proto/src/codegen/ritbit/assets/tx.js +19 -3
- package/build/esm/node_modules/@ritbit/v4-proto/src/codegen/ritbit/bridge/tx.d.ts +14 -1
- package/build/esm/node_modules/@ritbit/v4-proto/src/codegen/ritbit/bridge/tx.d.ts.map +1 -1
- package/build/esm/node_modules/@ritbit/v4-proto/src/codegen/ritbit/bridge/tx.js +1 -1
- package/build/esm/node_modules/@ritbit/v4-proto/src/codegen/ritbit/denomwrap/params.d.ts +116 -0
- package/build/esm/node_modules/@ritbit/v4-proto/src/codegen/ritbit/denomwrap/params.d.ts.map +1 -0
- package/build/esm/node_modules/@ritbit/v4-proto/src/codegen/ritbit/denomwrap/params.js +98 -0
- package/build/esm/node_modules/@ritbit/v4-proto/src/codegen/ritbit/denomwrap/tx.d.ts +80 -0
- package/build/esm/node_modules/@ritbit/v4-proto/src/codegen/ritbit/denomwrap/tx.d.ts.map +1 -0
- package/build/esm/node_modules/@ritbit/v4-proto/src/codegen/ritbit/denomwrap/tx.js +168 -0
- package/build/esm/node_modules/@ritbit/v4-proto/src/codegen/ritbit/denomwrap/tx.rpc.msg.d.ts +21 -0
- package/build/esm/node_modules/@ritbit/v4-proto/src/codegen/ritbit/denomwrap/tx.rpc.msg.d.ts.map +1 -0
- package/build/esm/node_modules/@ritbit/v4-proto/src/codegen/ritbit/denomwrap/tx.rpc.msg.js +20 -0
- package/build/esm/node_modules/@ritbit/v4-proto/src/codegen/ritbit/lcd.d.ts +1 -0
- package/build/esm/node_modules/@ritbit/v4-proto/src/codegen/ritbit/lcd.d.ts.map +1 -1
- package/build/esm/node_modules/@ritbit/v4-proto/src/codegen/ritbit/lcd.js +4 -1
- package/build/esm/node_modules/@ritbit/v4-proto/src/codegen/ritbit/rpc.query.d.ts +4 -0
- package/build/esm/node_modules/@ritbit/v4-proto/src/codegen/ritbit/rpc.query.d.ts.map +1 -1
- package/build/esm/node_modules/@ritbit/v4-proto/src/codegen/ritbit/rpc.query.js +3 -2
- package/build/esm/node_modules/@ritbit/v4-proto/src/codegen/ritbit/rpc.tx.d.ts +2 -0
- package/build/esm/node_modules/@ritbit/v4-proto/src/codegen/ritbit/rpc.tx.d.ts.map +1 -1
- package/build/esm/node_modules/@ritbit/v4-proto/src/codegen/ritbit/rpc.tx.js +4 -2
- package/build/esm/node_modules/@ritbit/v4-proto/src/codegen/ritbit/sending/tx.d.ts +0 -1
- package/build/esm/node_modules/@ritbit/v4-proto/src/codegen/ritbit/sending/tx.d.ts.map +1 -1
- package/build/esm/node_modules/@ritbit/v4-proto/src/codegen/ritbit/sending/tx.js +1 -1
- package/build/esm/node_modules/@ritbit/v4-proto/src/codegen/ritbit/wrap/genesis.d.ts +79 -0
- package/build/esm/node_modules/@ritbit/v4-proto/src/codegen/ritbit/wrap/genesis.d.ts.map +1 -0
- package/build/esm/node_modules/@ritbit/v4-proto/src/codegen/ritbit/wrap/genesis.js +115 -0
- package/build/esm/node_modules/@ritbit/v4-proto/src/codegen/ritbit/wrap/params.d.ts +116 -0
- package/build/esm/node_modules/@ritbit/v4-proto/src/codegen/ritbit/wrap/params.d.ts.map +1 -0
- package/build/esm/node_modules/@ritbit/v4-proto/src/codegen/ritbit/wrap/params.js +98 -0
- package/build/esm/node_modules/@ritbit/v4-proto/src/codegen/ritbit/wrap/query.d.ts +82 -0
- package/build/esm/node_modules/@ritbit/v4-proto/src/codegen/ritbit/wrap/query.d.ts.map +1 -0
- package/build/esm/node_modules/@ritbit/v4-proto/src/codegen/ritbit/wrap/query.js +212 -0
- package/build/esm/node_modules/@ritbit/v4-proto/src/codegen/ritbit/wrap/query.lcd.d.ts +11 -0
- package/build/esm/node_modules/@ritbit/v4-proto/src/codegen/ritbit/wrap/query.lcd.d.ts.map +1 -0
- package/build/esm/node_modules/@ritbit/v4-proto/src/codegen/ritbit/wrap/query.lcd.js +30 -0
- package/build/esm/node_modules/@ritbit/v4-proto/src/codegen/ritbit/wrap/query.rpc.Query.d.ts +29 -0
- package/build/esm/node_modules/@ritbit/v4-proto/src/codegen/ritbit/wrap/query.rpc.Query.d.ts.map +1 -0
- package/build/esm/node_modules/@ritbit/v4-proto/src/codegen/ritbit/wrap/query.rpc.Query.js +33 -0
- package/build/esm/node_modules/@ritbit/v4-proto/src/codegen/ritbit/wrap/tx.d.ts +123 -0
- package/build/esm/node_modules/@ritbit/v4-proto/src/codegen/ritbit/wrap/tx.d.ts.map +1 -0
- package/build/esm/node_modules/@ritbit/v4-proto/src/codegen/ritbit/wrap/tx.js +246 -0
- package/build/esm/node_modules/@ritbit/v4-proto/src/codegen/ritbit/wrap/tx.rpc.msg.d.ts +36 -0
- package/build/esm/node_modules/@ritbit/v4-proto/src/codegen/ritbit/wrap/tx.rpc.msg.d.ts.map +1 -0
- package/build/esm/node_modules/@ritbit/v4-proto/src/codegen/ritbit/wrap/tx.rpc.msg.js +26 -0
- package/build/esm/src/clients/composite-client.d.ts +6 -1
- package/build/esm/src/clients/composite-client.d.ts.map +1 -1
- package/build/esm/src/clients/composite-client.js +7 -3
- package/build/esm/src/clients/constants.d.ts +13 -1
- package/build/esm/src/clients/constants.d.ts.map +1 -1
- package/build/esm/src/clients/constants.js +13 -1
- package/build/esm/src/clients/lib/accounts.d.ts +4 -3
- package/build/esm/src/clients/lib/accounts.d.ts.map +1 -1
- package/build/esm/src/clients/lib/accounts.js +44 -5
- package/build/esm/src/clients/lib/agent-approval-tx.d.ts +46 -0
- package/build/esm/src/clients/lib/agent-approval-tx.d.ts.map +1 -0
- package/build/esm/src/clients/lib/agent-approval-tx.js +79 -0
- package/build/esm/src/clients/lib/agent-approval.d.ts +64 -0
- package/build/esm/src/clients/lib/agent-approval.d.ts.map +1 -0
- package/build/esm/src/clients/lib/agent-approval.js +112 -0
- package/build/esm/src/clients/lib/eip712.d.ts +95 -0
- package/build/esm/src/clients/lib/eip712.d.ts.map +1 -0
- package/build/esm/src/clients/lib/eip712.js +581 -0
- package/build/esm/src/clients/lib/eth-pubkey.d.ts +44 -0
- package/build/esm/src/clients/lib/eth-pubkey.d.ts.map +1 -0
- package/build/esm/src/clients/lib/eth-pubkey.js +61 -0
- package/build/esm/src/clients/modules/composer.d.ts +12 -1
- package/build/esm/src/clients/modules/composer.d.ts.map +1 -1
- package/build/esm/src/clients/modules/composer.js +15 -2
- package/build/esm/src/clients/modules/eip712-signer.d.ts +99 -0
- package/build/esm/src/clients/modules/eip712-signer.d.ts.map +1 -0
- package/build/esm/src/clients/modules/eip712-signer.js +183 -0
- package/build/esm/src/clients/modules/eth-agent-wallet.d.ts +39 -0
- package/build/esm/src/clients/modules/eth-agent-wallet.d.ts.map +1 -0
- package/build/esm/src/clients/modules/eth-agent-wallet.js +97 -0
- package/build/esm/src/clients/modules/eth-wallet.d.ts +32 -0
- package/build/esm/src/clients/modules/eth-wallet.d.ts.map +1 -0
- package/build/esm/src/clients/modules/eth-wallet.js +83 -0
- package/build/esm/src/clients/modules/local-wallet.d.ts +2 -1
- package/build/esm/src/clients/modules/local-wallet.d.ts.map +1 -1
- package/build/esm/src/clients/modules/local-wallet.js +9 -2
- package/build/esm/src/clients/modules/post.d.ts +1 -1
- package/build/esm/src/clients/modules/post.d.ts.map +1 -1
- package/build/esm/src/clients/modules/post.js +14 -4
- package/build/esm/src/clients/modules/signer.d.ts +2 -1
- package/build/esm/src/clients/modules/signer.d.ts.map +1 -1
- package/build/esm/src/clients/modules/signer.js +7 -2
- package/build/esm/src/index.d.ts +13 -0
- package/build/esm/src/index.d.ts.map +1 -1
- package/build/esm/src/index.js +9 -1
- package/build/esm/src/lib/evm-address.d.ts +31 -0
- package/build/esm/src/lib/evm-address.d.ts.map +1 -0
- package/build/esm/src/lib/evm-address.js +85 -0
- package/build/esm/src/lib/trading-key-utils.d.ts +3 -0
- package/build/esm/src/lib/trading-key-utils.d.ts.map +1 -1
- package/build/esm/src/lib/trading-key-utils.js +42 -4
- package/build/esm/tsconfig.esm.tsbuildinfo +1 -1
- 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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
|