@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,68 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ETH_SECP256K1_PUBKEY_TYPE_URL = exports.ETH_SECP256K1_PUBKEY_TYPE = exports.ETH_SECP256K1_ALGO = void 0;
|
|
4
|
+
exports.isEthSecp256k1Pubkey = isEthSecp256k1Pubkey;
|
|
5
|
+
exports.encodeEthSecp256k1Pubkey = encodeEthSecp256k1Pubkey;
|
|
6
|
+
exports.ethSecp256k1PubkeyToAny = ethSecp256k1PubkeyToAny;
|
|
7
|
+
exports.decodeEthSecp256k1Pubkey = decodeEthSecp256k1Pubkey;
|
|
8
|
+
const encoding_1 = require("@cosmjs/encoding");
|
|
9
|
+
const keys_1 = require("cosmjs-types/cosmos/crypto/secp256k1/keys");
|
|
10
|
+
const any_1 = require("cosmjs-types/google/protobuf/any");
|
|
11
|
+
/**
|
|
12
|
+
* Pubkey helpers for the eth_secp256k1 key type accepted by the chain
|
|
13
|
+
* (cosmos/evm). The proto wire format of the pubkey is identical to
|
|
14
|
+
* `cosmos.crypto.secp256k1.PubKey` (field 1: 33-byte compressed key) — only
|
|
15
|
+
* the Any typeUrl differs. Signing differs too: SIGN_MODE_DIRECT sign bytes
|
|
16
|
+
* are hashed with keccak256 instead of sha256 (see eth-wallet.ts), and the
|
|
17
|
+
* address is derived ethereum-style (see lib/evm-address.ts).
|
|
18
|
+
*/
|
|
19
|
+
/**
|
|
20
|
+
* `AccountData.algo` marker reported by the eth offline signer. Typed as plain
|
|
21
|
+
* `string` (not a literal) so it can be compared against and asserted to
|
|
22
|
+
* cosmjs's `Algo` union, which does not include an eth variant.
|
|
23
|
+
*/
|
|
24
|
+
exports.ETH_SECP256K1_ALGO = 'eth_secp256k1';
|
|
25
|
+
/** Amino-style type discriminator, analogous to 'tendermint/PubKeySecp256k1'. */
|
|
26
|
+
exports.ETH_SECP256K1_PUBKEY_TYPE = 'evm/PubKeyEthSecp256k1';
|
|
27
|
+
/** Any typeUrl of the eth pubkey, as registered by cosmos/evm. */
|
|
28
|
+
exports.ETH_SECP256K1_PUBKEY_TYPE_URL = '/cosmos.evm.crypto.v1.ethsecp256k1.PubKey';
|
|
29
|
+
function isEthSecp256k1Pubkey(pubkey) {
|
|
30
|
+
return pubkey.type === exports.ETH_SECP256K1_PUBKEY_TYPE;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Wraps a raw compressed secp256k1 public key into the eth pubkey object,
|
|
34
|
+
* analogous to cosmjs's `encodeSecp256k1Pubkey()`.
|
|
35
|
+
*/
|
|
36
|
+
function encodeEthSecp256k1Pubkey(pubkey) {
|
|
37
|
+
if (pubkey.length !== 33 || (pubkey[0] !== 0x02 && pubkey[0] !== 0x03)) {
|
|
38
|
+
throw new Error('Public key must be compressed secp256k1, i.e. 33 bytes starting with 0x02 or 0x03');
|
|
39
|
+
}
|
|
40
|
+
return {
|
|
41
|
+
type: exports.ETH_SECP256K1_PUBKEY_TYPE,
|
|
42
|
+
value: (0, encoding_1.toBase64)(pubkey),
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Encodes the eth pubkey into a protobuf `Any`, analogous to cosmjs's
|
|
47
|
+
* `encodePubkey()` (which throws for non-cosmos key types). The value bytes
|
|
48
|
+
* reuse the `cosmos.crypto.secp256k1.PubKey` encoder — the wire format is the
|
|
49
|
+
* same, only the typeUrl differs.
|
|
50
|
+
*/
|
|
51
|
+
function ethSecp256k1PubkeyToAny(pubkey) {
|
|
52
|
+
const pubkeyProto = keys_1.PubKey.fromPartial({
|
|
53
|
+
key: (0, encoding_1.fromBase64)(pubkey.value),
|
|
54
|
+
});
|
|
55
|
+
return any_1.Any.fromPartial({
|
|
56
|
+
typeUrl: exports.ETH_SECP256K1_PUBKEY_TYPE_URL,
|
|
57
|
+
value: Uint8Array.from(keys_1.PubKey.encode(pubkeyProto).finish()),
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Decodes the value bytes of an eth pubkey `Any` (the reverse of
|
|
62
|
+
* `ethSecp256k1PubkeyToAny()`).
|
|
63
|
+
*/
|
|
64
|
+
function decodeEthSecp256k1Pubkey(value) {
|
|
65
|
+
const { key } = keys_1.PubKey.decode(value);
|
|
66
|
+
return encodeEthSecp256k1Pubkey(key);
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXRoLXB1YmtleS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9jbGllbnRzL2xpYi9ldGgtcHVia2V5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQWlDQSxvREFFQztBQU1ELDREQVVDO0FBUUQsMERBUUM7QUFNRCw0REFHQztBQTNFRCwrQ0FBd0Q7QUFDeEQsb0VBQTJGO0FBQzNGLDBEQUF1RDtBQUV2RDs7Ozs7OztHQU9HO0FBRUg7Ozs7R0FJRztBQUNVLFFBQUEsa0JBQWtCLEdBQVcsZUFBZSxDQUFDO0FBRTFELGlGQUFpRjtBQUNwRSxRQUFBLHlCQUF5QixHQUFHLHdCQUF3QixDQUFDO0FBRWxFLGtFQUFrRTtBQUNyRCxRQUFBLDZCQUE2QixHQUFHLDJDQUEyQyxDQUFDO0FBUXpGLFNBQWdCLG9CQUFvQixDQUFDLE1BQWM7SUFDakQsT0FBTyxNQUFNLENBQUMsSUFBSSxLQUFLLGlDQUF5QixDQUFDO0FBQ25ELENBQUM7QUFFRDs7O0dBR0c7QUFDSCxTQUFnQix3QkFBd0IsQ0FBQyxNQUFrQjtJQUN6RCxJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUN2RSxNQUFNLElBQUksS0FBSyxDQUNiLG1GQUFtRixDQUNwRixDQUFDO0lBQ0osQ0FBQztJQUNELE9BQU87UUFDTCxJQUFJLEVBQUUsaUNBQXlCO1FBQy9CLEtBQUssRUFBRSxJQUFBLG1CQUFRLEVBQUMsTUFBTSxDQUFDO0tBQ3hCLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFnQix1QkFBdUIsQ0FBQyxNQUEwQjtJQUNoRSxNQUFNLFdBQVcsR0FBRyxhQUFvQixDQUFDLFdBQVcsQ0FBQztRQUNuRCxHQUFHLEVBQUUsSUFBQSxxQkFBVSxFQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7S0FDOUIsQ0FBQyxDQUFDO0lBQ0gsT0FBTyxTQUFHLENBQUMsV0FBVyxDQUFDO1FBQ3JCLE9BQU8sRUFBRSxxQ0FBNkI7UUFDdEMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxJQUFJLENBQUMsYUFBb0IsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7S0FDMUUsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQWdCLHdCQUF3QixDQUFDLEtBQWlCO0lBQ3hELE1BQU0sRUFBRSxHQUFHLEVBQUUsR0FBRyxhQUFvQixDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNuRCxPQUFPLHdCQUF3QixDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3ZDLENBQUMifQ==
|
|
@@ -376,11 +376,24 @@ class Composer {
|
|
|
376
376
|
};
|
|
377
377
|
}
|
|
378
378
|
// ----------- x/accountplus --------
|
|
379
|
-
|
|
379
|
+
/**
|
|
380
|
+
* Approves an agent (trading key) by naming what it may do, letting the chain
|
|
381
|
+
* build the authenticator itself. Prefer this over composeMsgAddAuthenticator:
|
|
382
|
+
* the wallet then shows the agent, its name, expiry and rights as words
|
|
383
|
+
* instead of a serialized tree the signer cannot read.
|
|
384
|
+
*/
|
|
385
|
+
composeMsgAddAuthenticator(address, authenticatorType, data,
|
|
386
|
+
/** Human-readable key name. Empty = the unnamed session slot, which does not count
|
|
387
|
+
* toward the chain's per-account named-key limit and is replaced by the next unnamed key. */
|
|
388
|
+
name = '',
|
|
389
|
+
/** Unix seconds the key expires at. 0 lets the chain apply its own maximum lifetime. */
|
|
390
|
+
expiresAt = 0) {
|
|
380
391
|
const msg = {
|
|
381
392
|
sender: address,
|
|
382
393
|
authenticatorType,
|
|
383
394
|
data,
|
|
395
|
+
name,
|
|
396
|
+
expiresAt: long_1.default.fromValue(expiresAt),
|
|
384
397
|
};
|
|
385
398
|
return {
|
|
386
399
|
typeUrl: constants_1.TYPE_URL_MSG_ADD_AUTHENTICATOR,
|
|
@@ -415,4 +428,4 @@ class Composer {
|
|
|
415
428
|
}
|
|
416
429
|
}
|
|
417
430
|
exports.Composer = Composer;
|
|
418
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9zZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvY2xpZW50cy9tb2R1bGVzL2NvbXBvc2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQVdBLGtGQUFxRjtBQW1CckYsZ0RBQXdCO0FBQ3hCLDREQUFrQztBQUVsQyw0Q0EyQnNCO0FBRXRCLHFEQWMwQjtBQUUxQixvQkFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsY0FBSSxDQUFDO0FBQzFCLG9CQUFRLENBQUMsU0FBUyxFQUFFLENBQUM7QUFFckIsTUFBYSxRQUFRO0lBQ25CLG1DQUFtQztJQUM1QixvQkFBb0IsQ0FDekIsT0FBZSxFQUNmLGdCQUF3QixFQUN4QixRQUFnQixFQUNoQixVQUFrQixFQUNsQixVQUFrQixFQUNsQixZQUFvQixFQUNwQixnQkFBd0IsRUFDeEIsSUFBZ0IsRUFDaEIsUUFBYyxFQUNkLFFBQWMsRUFDZCxXQUE4QixFQUM5QixVQUFtQixFQUNuQixjQUFzQixFQUN0QixnQkFBcUMsb0NBQW1CLENBQUMsMEJBQTBCLEVBQ25GLGtDQUF3QyxjQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUN2RCxjQUFnQyxFQUNoQyxxQkFBOEMsRUFDOUMscUJBQTZCLEVBQUU7UUFFL0IsSUFBSSxDQUFDLDJCQUEyQixDQUFDLFVBQVUsRUFBRSxZQUFZLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztRQUU3RSxNQUFNLFlBQVksR0FBaUI7WUFDakMsS0FBSyxFQUFFLE9BQU87WUFDZCxNQUFNLEVBQUUsZ0JBQWdCO1NBQ3pCLENBQUM7UUFFRixNQUFNLE9BQU8sR0FBWTtZQUN2QixZQUFZO1lBQ1osUUFBUTtZQUNSLFVBQVU7WUFDVixVQUFVO1NBQ1gsQ0FBQztRQUVGLE1BQU0sS0FBSyxHQUFVO1lBQ25CLE9BQU87WUFDUCxJQUFJO1lBQ0osUUFBUTtZQUNSLFFBQVE7WUFDUixZQUFZLEVBQUUsWUFBWSxLQUFLLENBQUMs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
|
|
431
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9zZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvY2xpZW50cy9tb2R1bGVzL2NvbXBvc2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQVdBLGtGQUFxRjtBQW1CckYsZ0RBQXdCO0FBQ3hCLDREQUFrQztBQUVsQyw0Q0EyQnNCO0FBRXRCLHFEQWMwQjtBQUUxQixvQkFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsY0FBSSxDQUFDO0FBQzFCLG9CQUFRLENBQUMsU0FBUyxFQUFFLENBQUM7QUFFckIsTUFBYSxRQUFRO0lBQ25CLG1DQUFtQztJQUM1QixvQkFBb0IsQ0FDekIsT0FBZSxFQUNmLGdCQUF3QixFQUN4QixRQUFnQixFQUNoQixVQUFrQixFQUNsQixVQUFrQixFQUNsQixZQUFvQixFQUNwQixnQkFBd0IsRUFDeEIsSUFBZ0IsRUFDaEIsUUFBYyxFQUNkLFFBQWMsRUFDZCxXQUE4QixFQUM5QixVQUFtQixFQUNuQixjQUFzQixFQUN0QixnQkFBcUMsb0NBQW1CLENBQUMsMEJBQTBCLEVBQ25GLGtDQUF3QyxjQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUN2RCxjQUFnQyxFQUNoQyxxQkFBOEMsRUFDOUMscUJBQTZCLEVBQUU7UUFFL0IsSUFBSSxDQUFDLDJCQUEyQixDQUFDLFVBQVUsRUFBRSxZQUFZLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztRQUU3RSxNQUFNLFlBQVksR0FBaUI7WUFDakMsS0FBSyxFQUFFLE9BQU87WUFDZCxNQUFNLEVBQUUsZ0JBQWdCO1NBQ3pCLENBQUM7UUFFRixNQUFNLE9BQU8sR0FBWTtZQUN2QixZQUFZO1lBQ1osUUFBUTtZQUNSLFVBQVU7WUFDVixVQUFVO1NBQ1gsQ0FBQztRQUVGLE1BQU0sS0FBSyxHQUFVO1lBQ25CLE9BQU87WUFDUCxJQUFJO1lBQ0osUUFBUTtZQUNSLFFBQVE7WUFDUixZQUFZLEVBQUUsWUFBWSxLQUFLLENBQUMs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
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Eip712Signer = void 0;
|
|
4
|
+
exports.recoverPubKeyFromTypedDataSignature = recoverPubKeyFromTypedDataSignature;
|
|
5
|
+
exports.signCosmosTxWithEip712 = signCosmosTxWithEip712;
|
|
6
|
+
const encoding_1 = require("@cosmjs/encoding");
|
|
7
|
+
const math_1 = require("@cosmjs/math");
|
|
8
|
+
const proto_signing_1 = require("@cosmjs/proto-signing");
|
|
9
|
+
const tx_1 = require("cosmjs-types/cosmos/tx/v1beta1/tx");
|
|
10
|
+
const secp256k1_1 = require("ethereum-cryptography/secp256k1");
|
|
11
|
+
const constants_1 = require("../../lib/constants");
|
|
12
|
+
const evm_address_1 = require("../../lib/evm-address");
|
|
13
|
+
const helpers_1 = require("../../lib/helpers");
|
|
14
|
+
const eth_pubkey_1 = require("../lib/eth-pubkey");
|
|
15
|
+
const eip712_1 = require("../lib/eip712");
|
|
16
|
+
const registry_1 = require("../lib/registry");
|
|
17
|
+
/**
|
|
18
|
+
* Parses a 0x-prefixed (or bare) hex EIP-712 signature into 65 bytes,
|
|
19
|
+
* normalizing nothing — r||s||v is kept as the wallet produced it.
|
|
20
|
+
*/
|
|
21
|
+
function parseSignature(signatureHex) {
|
|
22
|
+
const signature = (0, encoding_1.fromHex)((0, helpers_1.stripHexPrefix)(signatureHex));
|
|
23
|
+
if (signature.length !== 65) {
|
|
24
|
+
throw new Error(`Expected a 65-byte EIP-712 signature, got ${signature.length} bytes`);
|
|
25
|
+
}
|
|
26
|
+
return signature;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Stand-in pubkey for the bootstrap path: a well-formed compressed secp256k1
|
|
30
|
+
* key that only ever occupies AuthInfo while the typed data is derived, and is
|
|
31
|
+
* replaced by the recovered one before the tx is assembled.
|
|
32
|
+
*/
|
|
33
|
+
const PLACEHOLDER_PUBKEY = new Uint8Array([0x02, ...new Array(32).fill(0)]);
|
|
34
|
+
/**
|
|
35
|
+
* Recovers the compressed secp256k1 public key from an EIP-712 typed-data
|
|
36
|
+
* signature, so the web app can obtain the account's pubkey from the FIRST
|
|
37
|
+
* signature a wallet produces without an extra personal_sign prompt.
|
|
38
|
+
*
|
|
39
|
+
* @param typedData The typed data that was signed.
|
|
40
|
+
* @param signatureHex The 65-byte r||s||v hex signature (v may be 0/1 or 27/28).
|
|
41
|
+
* @returns The 33-byte compressed public key.
|
|
42
|
+
*/
|
|
43
|
+
function recoverPubKeyFromTypedDataSignature(typedData, signatureHex) {
|
|
44
|
+
const signature = parseSignature(signatureHex);
|
|
45
|
+
let recovery = signature[64];
|
|
46
|
+
if (recovery >= 27) {
|
|
47
|
+
recovery -= 27;
|
|
48
|
+
}
|
|
49
|
+
if (recovery !== 0 && recovery !== 1) {
|
|
50
|
+
throw new Error(`Invalid recovery byte in EIP-712 signature: ${signature[64]}`);
|
|
51
|
+
}
|
|
52
|
+
const digest = (0, eip712_1.eip712Digest)(typedData);
|
|
53
|
+
const point = secp256k1_1.secp256k1.Signature.fromCompact(signature.slice(0, 64))
|
|
54
|
+
.addRecoveryBit(recovery)
|
|
55
|
+
.recoverPublicKey(digest);
|
|
56
|
+
return point.toRawBytes(true);
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Builds, EIP-712-signs and assembles a cosmos transaction.
|
|
60
|
+
*
|
|
61
|
+
* The SignDoc mirrors signer.ts (registry-encoded messages, memo, eth pubkey
|
|
62
|
+
* Any in AuthInfo) minus the TxExtension nonCriticalExtensionOptions. The
|
|
63
|
+
* typed data is derived from the SignDoc bytes, signed via the callback, and
|
|
64
|
+
* the 65-byte signature is attached as-is.
|
|
65
|
+
*
|
|
66
|
+
* @returns The signed TxRaw bytes, ready for broadcastTxSync.
|
|
67
|
+
*/
|
|
68
|
+
async function signCosmosTxWithEip712(messages, fee, memo, options, signTypedData,
|
|
69
|
+
/**
|
|
70
|
+
* The signer's compressed pubkey, or undefined to recover it from the
|
|
71
|
+
* signature itself (see the bootstrap note below).
|
|
72
|
+
*/
|
|
73
|
+
compressedPubkey, registry = (0, registry_1.generateRegistry)(), bootstrap = {}) {
|
|
74
|
+
var _a;
|
|
75
|
+
const encodedMessages = messages.map((msg) => registry.encodeAsAny(msg));
|
|
76
|
+
// Plain TxBody: messages + memo only. The chain's EIP-712 decoder rejects
|
|
77
|
+
// timeoutHeight/extensionOptions/nonCriticalExtensionOptions.
|
|
78
|
+
const txBody = tx_1.TxBody.fromPartial({
|
|
79
|
+
messages: encodedMessages,
|
|
80
|
+
memo,
|
|
81
|
+
});
|
|
82
|
+
const bodyBytes = tx_1.TxBody.encode(txBody).finish();
|
|
83
|
+
const gasLimit = math_1.Int53.fromString(String(fee.gas)).toNumber();
|
|
84
|
+
const buildAuthInfoBytes = (pubkey) => (0, proto_signing_1.makeAuthInfoBytes)([
|
|
85
|
+
{
|
|
86
|
+
pubkey: (0, eth_pubkey_1.ethSecp256k1PubkeyToAny)((0, eth_pubkey_1.encodeEthSecp256k1Pubkey)(pubkey)),
|
|
87
|
+
sequence: options.sequence,
|
|
88
|
+
},
|
|
89
|
+
], fee.amount, gasLimit, undefined, undefined);
|
|
90
|
+
// Pubkey bootstrap: the EIP-712 typed data is derived from the SignDoc's
|
|
91
|
+
// *amino JSON* — account_number, chain_id, fee, memo, sequence and the msgs.
|
|
92
|
+
// The signer's pubkey is not among them, so the digest is identical whichever
|
|
93
|
+
// pubkey sits in AuthInfo. That lets a wallet whose pubkey we do not know yet
|
|
94
|
+
// sign first, and the pubkey be recovered from that very signature — one
|
|
95
|
+
// popup instead of a separate derivation prompt.
|
|
96
|
+
const authInfoBytesForSigning = buildAuthInfoBytes(compressedPubkey !== null && compressedPubkey !== void 0 ? compressedPubkey : PLACEHOLDER_PUBKEY);
|
|
97
|
+
// makeSignDoc() types accountNumber as `number` but wraps it in BigInt(),
|
|
98
|
+
// so passing a bigint is safe at runtime (see signer.ts).
|
|
99
|
+
const signDoc = (0, proto_signing_1.makeSignDoc)(bodyBytes, authInfoBytesForSigning, options.chainId, options.accountNumber);
|
|
100
|
+
const typedData = (0, eip712_1.signDocBytesToEip712TypedData)((0, proto_signing_1.makeSignBytes)(signDoc), options.evmChainId);
|
|
101
|
+
const signatureHex = await signTypedData(typedData);
|
|
102
|
+
const signature = parseSignature(signatureHex);
|
|
103
|
+
let authInfoBytes = authInfoBytesForSigning;
|
|
104
|
+
if (compressedPubkey == null) {
|
|
105
|
+
const recovered = recoverPubKeyFromTypedDataSignature(typedData, signatureHex);
|
|
106
|
+
const { expectedEthAddress } = bootstrap;
|
|
107
|
+
if (expectedEthAddress != null) {
|
|
108
|
+
const recoveredAddress = `0x${(0, encoding_1.toHex)((0, evm_address_1.ethAddressBytesFromPubkey)(recovered))}`;
|
|
109
|
+
if (recoveredAddress !== expectedEthAddress.toLowerCase()) {
|
|
110
|
+
throw new Error(`The wallet signed with ${recoveredAddress}, expected ${expectedEthAddress.toLowerCase()}`);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
authInfoBytes = buildAuthInfoBytes(recovered);
|
|
114
|
+
(_a = bootstrap.onPubkeyRecovered) === null || _a === void 0 ? void 0 : _a.call(bootstrap, recovered);
|
|
115
|
+
}
|
|
116
|
+
const txRaw = tx_1.TxRaw.fromPartial({
|
|
117
|
+
bodyBytes,
|
|
118
|
+
authInfoBytes,
|
|
119
|
+
signatures: [signature],
|
|
120
|
+
});
|
|
121
|
+
return Uint8Array.from(tx_1.TxRaw.encode(txRaw).finish());
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* A LocalWallet-compatible signing surface backed by a browser wallet's
|
|
125
|
+
* signTypedData (MetaMask via wagmi/viem). Construct it with the account's
|
|
126
|
+
* compressed pubkey — recoverable from the first typed-data signature via
|
|
127
|
+
* recoverPubKeyFromTypedDataSignature() — and use signTransaction() exactly
|
|
128
|
+
* like LocalWallet.signTransaction().
|
|
129
|
+
*/
|
|
130
|
+
class Eip712Signer {
|
|
131
|
+
constructor(evmChainId, signTypedData, compressedPubkey, prefix = constants_1.BECH32_PREFIX) {
|
|
132
|
+
if (compressedPubkey.length !== 33 || (compressedPubkey[0] !== 0x02 && compressedPubkey[0] !== 0x03)) {
|
|
133
|
+
throw new Error('Public key must be compressed secp256k1, i.e. 33 bytes starting with 0x02 or 0x03');
|
|
134
|
+
}
|
|
135
|
+
this.evmChainId = evmChainId;
|
|
136
|
+
this.signTypedDataCallback = signTypedData;
|
|
137
|
+
this.compressedPubkey = compressedPubkey;
|
|
138
|
+
this.address = (0, encoding_1.toBech32)(prefix, (0, evm_address_1.ethAddressBytesFromPubkey)(compressedPubkey));
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* The key to use for gas simulation: the real one once known, otherwise the
|
|
142
|
+
* placeholder. Simulation never checks that the pubkey matches the signer
|
|
143
|
+
* address (the SDK skips that check when simulate=true), and the estimate is
|
|
144
|
+
* identical either way — both are 33-byte compressed keys.
|
|
145
|
+
*/
|
|
146
|
+
get simulationPubkey() {
|
|
147
|
+
var _a;
|
|
148
|
+
return (_a = this.compressedPubkey) !== null && _a !== void 0 ? _a : PLACEHOLDER_PUBKEY;
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* A signer for a wallet whose pubkey is not known yet — the 0x address is
|
|
152
|
+
* enough. The pubkey is recovered from the signature the wallet returns, so
|
|
153
|
+
* onboarding costs exactly one popup: the transaction itself, with no
|
|
154
|
+
* separate prompt whose only purpose is to expose the key.
|
|
155
|
+
*/
|
|
156
|
+
static forEthAddress(evmChainId, signTypedData, ethAddress, prefix = constants_1.BECH32_PREFIX) {
|
|
157
|
+
const signer = Object.create(Eip712Signer.prototype);
|
|
158
|
+
signer.evmChainId = evmChainId;
|
|
159
|
+
signer.signTypedDataCallback = signTypedData;
|
|
160
|
+
signer.compressedPubkey = undefined;
|
|
161
|
+
signer.ethAddress = ethAddress;
|
|
162
|
+
signer.address = (0, encoding_1.toBech32)(prefix, (0, encoding_1.fromHex)((0, helpers_1.stripHexPrefix)(ethAddress)));
|
|
163
|
+
return signer;
|
|
164
|
+
}
|
|
165
|
+
async signTransaction(messages, transactionOptions, fee, memo = '') {
|
|
166
|
+
if (!fee) {
|
|
167
|
+
throw new Error('Fee cannot be undefined');
|
|
168
|
+
}
|
|
169
|
+
if (transactionOptions.authenticators !== undefined && transactionOptions.authenticators.length > 0) {
|
|
170
|
+
throw new Error('EIP-712 signing does not support selected authenticators: the TxExtension ' +
|
|
171
|
+
'nonCriticalExtensionOption is rejected by the chain-side EIP-712 decoder');
|
|
172
|
+
}
|
|
173
|
+
return signCosmosTxWithEip712(messages, fee, memo, {
|
|
174
|
+
chainId: transactionOptions.chainId,
|
|
175
|
+
accountNumber: transactionOptions.accountNumber,
|
|
176
|
+
sequence: transactionOptions.sequence,
|
|
177
|
+
evmChainId: this.evmChainId,
|
|
178
|
+
}, this.signTypedDataCallback, this.compressedPubkey, undefined, {
|
|
179
|
+
expectedEthAddress: this.ethAddress,
|
|
180
|
+
// Keep it: every later transaction then signs with the pubkey known up
|
|
181
|
+
// front, and the app can store it for master-signed transfers.
|
|
182
|
+
onPubkeyRecovered: (pubkey) => {
|
|
183
|
+
this.compressedPubkey = pubkey;
|
|
184
|
+
},
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
exports.Eip712Signer = Eip712Signer;
|
|
189
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWlwNzEyLXNpZ25lci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9jbGllbnRzL21vZHVsZXMvZWlwNzEyLXNpZ25lci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUE2RkEsa0ZBaUJDO0FBWUQsd0RBa0ZDO0FBM01ELCtDQUE0RDtBQUM1RCx1Q0FBcUM7QUFDckMseURBTStCO0FBQy9CLDBEQUFrRTtBQUNsRSwrREFBNEQ7QUFFNUQsbURBQW9EO0FBQ3BELHVEQUFrRTtBQUNsRSwrQ0FBbUQ7QUFDbkQsa0RBQXNGO0FBQ3RGLDBDQUl1QjtBQUN2Qiw4Q0FBbUQ7QUEyQ25EOzs7R0FHRztBQUNILFNBQVMsY0FBYyxDQUFDLFlBQW9CO0lBQzFDLE1BQU0sU0FBUyxHQUFHLElBQUEsa0JBQU8sRUFBQyxJQUFBLHdCQUFjLEVBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztJQUN4RCxJQUFJLFNBQVMsQ0FBQyxNQUFNLEtBQUssRUFBRSxFQUFFLENBQUM7UUFDNUIsTUFBTSxJQUFJLEtBQUssQ0FBQyw2Q0FBNkMsU0FBUyxDQUFDLE1BQU0sUUFBUSxDQUFDLENBQUM7SUFDekYsQ0FBQztJQUNELE9BQU8sU0FBUyxDQUFDO0FBQ25CLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLFVBQVUsQ0FBQyxDQUFDLElBQUksRUFBRSxHQUFHLElBQUksS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFFNUU7Ozs7Ozs7O0dBUUc7QUFDSCxTQUFnQixtQ0FBbUMsQ0FDakQsU0FBMEIsRUFDMUIsWUFBb0I7SUFFcEIsTUFBTSxTQUFTLEdBQUcsY0FBYyxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQy9DLElBQUksUUFBUSxHQUFHLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUM3QixJQUFJLFFBQVEsSUFBSSxFQUFFLEVBQUUsQ0FB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
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.EthAgentWallet = void 0;
|
|
4
|
+
const proto_signing_1 = require("@cosmjs/proto-signing");
|
|
5
|
+
const math_1 = require("@cosmjs/math");
|
|
6
|
+
const encoding_1 = require("@cosmjs/encoding");
|
|
7
|
+
const tx_1 = require("cosmjs-types/cosmos/tx/v1beta1/tx");
|
|
8
|
+
const any_1 = require("cosmjs-types/google/protobuf/any");
|
|
9
|
+
const keccak_1 = require("ethereum-cryptography/keccak");
|
|
10
|
+
const secp256k1_1 = require("ethereum-cryptography/secp256k1");
|
|
11
|
+
const tx_2 = require("@ritbit/v4-proto/src/codegen/ritbit/accountplus/tx");
|
|
12
|
+
const constants_1 = require("../../lib/constants");
|
|
13
|
+
const evm_address_1 = require("../../lib/evm-address");
|
|
14
|
+
const eth_pubkey_1 = require("../lib/eth-pubkey");
|
|
15
|
+
const registry_1 = require("../lib/registry");
|
|
16
|
+
/**
|
|
17
|
+
* A trading key that signs the way Ethereum does: keccak256 over the sign bytes
|
|
18
|
+
* and a 65-byte recoverable signature.
|
|
19
|
+
*
|
|
20
|
+
* That shape is what lets an agent be authorized by address alone. A cosmos
|
|
21
|
+
* signature is 64 bytes with no recovery id, so the chain would have to be told
|
|
22
|
+
* the public key up front — which is exactly the unreadable field the approval
|
|
23
|
+
* dialog was trying to lose. With a recovery id the chain derives the key from
|
|
24
|
+
* each signature and compares it to the approved address
|
|
25
|
+
* (x/accountplus/authenticator/eth_address_signature.go).
|
|
26
|
+
*
|
|
27
|
+
* Everything else about the transaction is identical to the ordinary signer,
|
|
28
|
+
* including the accountplus TxExtension that names which authenticator applies.
|
|
29
|
+
*/
|
|
30
|
+
class EthAgentWallet {
|
|
31
|
+
constructor(privateKey, prefix = constants_1.BECH32_PREFIX) {
|
|
32
|
+
if (privateKey.length !== 32) {
|
|
33
|
+
throw new Error(`Expected a 32-byte private key, got ${privateKey.length} bytes`);
|
|
34
|
+
}
|
|
35
|
+
this.privateKey = privateKey;
|
|
36
|
+
this.compressedPubkey = secp256k1_1.secp256k1.getPublicKey(privateKey, true);
|
|
37
|
+
this.address = (0, encoding_1.toBech32)(prefix, (0, evm_address_1.ethAddressBytesFromPubkey)(this.compressedPubkey));
|
|
38
|
+
}
|
|
39
|
+
/** The pubkey in the shape AuthInfo expects, for gas simulation. */
|
|
40
|
+
get pubKey() {
|
|
41
|
+
return (0, eth_pubkey_1.encodeEthSecp256k1Pubkey)(this.compressedPubkey);
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Signs a transaction on behalf of the account that approved this agent.
|
|
45
|
+
*
|
|
46
|
+
* LocalWallet-compatible, so a SubaccountInfo built with this wallet goes
|
|
47
|
+
* through the same post/composite-client paths as any other.
|
|
48
|
+
*/
|
|
49
|
+
async signTransaction(messages, transactionOptions, fee, memo = '', registry = (0, registry_1.generateRegistry)()) {
|
|
50
|
+
var _a;
|
|
51
|
+
if (!fee) {
|
|
52
|
+
throw new Error('Fee cannot be undefined');
|
|
53
|
+
}
|
|
54
|
+
const txExtension = tx_2.TxExtension.encode({
|
|
55
|
+
selectedAuthenticators: (_a = transactionOptions.authenticators) !== null && _a !== void 0 ? _a : [],
|
|
56
|
+
}).finish();
|
|
57
|
+
const txBody = tx_1.TxBody.fromPartial({
|
|
58
|
+
messages: messages.map((msg) => registry.encodeAsAny(msg)),
|
|
59
|
+
memo,
|
|
60
|
+
extensionOptions: [],
|
|
61
|
+
nonCriticalExtensionOptions: [
|
|
62
|
+
any_1.Any.fromPartial({
|
|
63
|
+
typeUrl: '/ritbit.accountplus.TxExtension',
|
|
64
|
+
value: txExtension,
|
|
65
|
+
}),
|
|
66
|
+
],
|
|
67
|
+
});
|
|
68
|
+
const bodyBytes = tx_1.TxBody.encode(txBody).finish();
|
|
69
|
+
const authInfoBytes = (0, proto_signing_1.makeAuthInfoBytes)([
|
|
70
|
+
{
|
|
71
|
+
pubkey: (0, eth_pubkey_1.ethSecp256k1PubkeyToAny)((0, eth_pubkey_1.encodeEthSecp256k1Pubkey)(this.compressedPubkey)),
|
|
72
|
+
sequence: transactionOptions.sequence,
|
|
73
|
+
},
|
|
74
|
+
], fee.amount, math_1.Int53.fromString(String(fee.gas)).toNumber(), undefined, undefined);
|
|
75
|
+
// makeSignDoc() types accountNumber as `number` but wraps it in BigInt(), so
|
|
76
|
+
// an account number above 2^53 survives (see signer.ts).
|
|
77
|
+
const signDoc = (0, proto_signing_1.makeSignDoc)(bodyBytes, authInfoBytes, transactionOptions.chainId, transactionOptions.accountNumber);
|
|
78
|
+
const signature = this.signRecoverable((0, proto_signing_1.makeSignBytes)(signDoc));
|
|
79
|
+
return Uint8Array.from(tx_1.TxRaw.encode(tx_1.TxRaw.fromPartial({
|
|
80
|
+
bodyBytes,
|
|
81
|
+
authInfoBytes,
|
|
82
|
+
signatures: [signature],
|
|
83
|
+
})).finish());
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* keccak256 over the sign bytes, signed as r ‖ s ‖ v — the same preimage the
|
|
87
|
+
* chain hashes when it recovers the signer.
|
|
88
|
+
*/
|
|
89
|
+
signRecoverable(signBytes) {
|
|
90
|
+
var _a;
|
|
91
|
+
const digest = (0, keccak_1.keccak256)(signBytes);
|
|
92
|
+
const signature = secp256k1_1.secp256k1.sign(digest, this.privateKey);
|
|
93
|
+
const bytes = new Uint8Array(65);
|
|
94
|
+
bytes.set(signature.toCompactRawBytes());
|
|
95
|
+
// The chain accepts 0/1 and 27/28 alike; emit the raw recovery bit.
|
|
96
|
+
bytes[64] = (_a = signature.recovery) !== null && _a !== void 0 ? _a : 0;
|
|
97
|
+
return bytes;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
exports.EthAgentWallet = EthAgentWallet;
|
|
101
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXRoLWFnZW50LXdhbGxldC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9jbGllbnRzL21vZHVsZXMvZXRoLWFnZW50LXdhbGxldC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSx5REFBOEc7QUFDOUcsdUNBQXFDO0FBRXJDLCtDQUE0QztBQUM1QywwREFBa0U7QUFDbEUsMERBQXVEO0FBQ3ZELHlEQUF5RDtBQUN6RCwrREFBNEQ7QUFFNUQsMkVBQWlGO0FBRWpGLG1EQUFvRDtBQUNwRCx1REFBa0U7QUFDbEUsa0RBQXNGO0FBQ3RGLDhDQUFtRDtBQUduRDs7Ozs7Ozs7Ozs7OztHQWFHO0FBQ0gsTUFBYSxjQUFjO0lBTXpCLFlBQVksVUFBc0IsRUFBRSxTQUFpQix5QkFBYTtRQUNoRSxJQUFJLFVBQVUsQ0FBQyxNQUFNLEtBQUssRUFBRSxFQUFFLENBQUM7WUFDN0IsTUFBTSxJQUFJLEtBQUssQ0FBQyx1Q0FBdUMsVUFBVSxDQUFDLE1BQU0sUUFBUSxDQUFDLENBQUM7UUFDcEYsQ0FBQztRQUNELElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO1FBQzdCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxxQkFBUyxDQUFDLFlBQVksQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDakUsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFBLG1CQUFRLEVBQUMsTUFBTSxFQUFFLElBQUEsdUNBQXlCLEVBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQztJQUNwRixDQUFDO0lBRUQsb0VBQW9FO0lBQ3BFLElBQVcsTUFBTTtRQUNmLE9BQU8sSUFBQSxxQ0FBd0IsRUFBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxLQUFLLENBQUMsZUFBZSxDQUMxQixRQUF3QixFQUN4QixrQkFBc0MsRUFDdEMsR0FBWSxFQUNaLE9BQWUsRUFBRSxF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
|
|
@@ -0,0 +1,91 @@
|
|
|
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.DirectEthSecp256k1Signer = exports.ETH_BIP44_HD_PATH = void 0;
|
|
7
|
+
const encoding_1 = require("@cosmjs/encoding");
|
|
8
|
+
const proto_signing_1 = require("@cosmjs/proto-signing");
|
|
9
|
+
const keccak_1 = require("ethereum-cryptography/keccak");
|
|
10
|
+
const secp256k1_1 = require("ethereum-cryptography/secp256k1");
|
|
11
|
+
const constants_1 = require("../../lib/constants");
|
|
12
|
+
const evm_address_1 = require("../../lib/evm-address");
|
|
13
|
+
const helpers_1 = require("../../lib/helpers");
|
|
14
|
+
const onboarding_1 = require("../../lib/onboarding");
|
|
15
|
+
const eth_pubkey_1 = require("../lib/eth-pubkey");
|
|
16
|
+
const local_wallet_1 = __importDefault(require("./local-wallet"));
|
|
17
|
+
/** The standard ethereum BIP44 derivation path (coin type 60). */
|
|
18
|
+
exports.ETH_BIP44_HD_PATH = "m/44'/60'/0'/0/0";
|
|
19
|
+
/**
|
|
20
|
+
* OfflineDirectSigner for eth_secp256k1 keys: SIGN_MODE_DIRECT sign bytes are
|
|
21
|
+
* hashed with keccak256 (instead of sha256) and signed with secp256k1,
|
|
22
|
+
* producing the cosmjs-style 64-byte r||s signature the chain verifies via
|
|
23
|
+
* cosmos/evm's ethsecp256k1.PubKey.VerifySignature. The reported address is
|
|
24
|
+
* ethereum-style: bech32(keccak256(uncompressed pubkey without the 04
|
|
25
|
+
* prefix)[12:]).
|
|
26
|
+
*/
|
|
27
|
+
class DirectEthSecp256k1Signer {
|
|
28
|
+
constructor(privateKey, prefix = constants_1.BECH32_PREFIX) {
|
|
29
|
+
if (privateKey.length !== 32) {
|
|
30
|
+
throw new Error('Eth private key must be 32 bytes');
|
|
31
|
+
}
|
|
32
|
+
this.privateKey = privateKey;
|
|
33
|
+
this.compressedPubkey = secp256k1_1.secp256k1.getPublicKey(privateKey, true);
|
|
34
|
+
this.address = (0, encoding_1.toBech32)(prefix, (0, evm_address_1.ethAddressBytesFromPubkey)(this.compressedPubkey));
|
|
35
|
+
}
|
|
36
|
+
async getAccounts() {
|
|
37
|
+
return [
|
|
38
|
+
{
|
|
39
|
+
address: this.address,
|
|
40
|
+
// cosmjs's Algo union has no eth variant; local-wallet.ts branches on
|
|
41
|
+
// this marker to build the eth pubkey type.
|
|
42
|
+
algo: eth_pubkey_1.ETH_SECP256K1_ALGO,
|
|
43
|
+
pubkey: this.compressedPubkey,
|
|
44
|
+
},
|
|
45
|
+
];
|
|
46
|
+
}
|
|
47
|
+
async signDirect(signerAddress, signDoc) {
|
|
48
|
+
if (signerAddress !== this.address) {
|
|
49
|
+
throw new Error(`Address ${signerAddress} not found in wallet`);
|
|
50
|
+
}
|
|
51
|
+
const signBytes = (0, proto_signing_1.makeSignBytes)(signDoc);
|
|
52
|
+
const hash = (0, keccak_1.keccak256)(signBytes);
|
|
53
|
+
// noble's sign() normalizes to low-s by default, matching what the chain
|
|
54
|
+
// (and cosmjs's Secp256k1.createSignature) expects.
|
|
55
|
+
const signature = secp256k1_1.secp256k1.sign(hash, this.privateKey);
|
|
56
|
+
const signatureBytes = signature.toCompactRawBytes(); // 64-byte r||s
|
|
57
|
+
const stdSignature = {
|
|
58
|
+
pub_key: (0, eth_pubkey_1.encodeEthSecp256k1Pubkey)(this.compressedPubkey),
|
|
59
|
+
signature: (0, encoding_1.toBase64)(signatureBytes),
|
|
60
|
+
};
|
|
61
|
+
return {
|
|
62
|
+
signed: signDoc,
|
|
63
|
+
signature: stdSignature,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
exports.DirectEthSecp256k1Signer = DirectEthSecp256k1Signer;
|
|
68
|
+
/**
|
|
69
|
+
* LocalWallet backed by an eth_secp256k1 key (the 0x == rit1 wallet model).
|
|
70
|
+
* Behaves exactly like LocalWallet — including as the master signer of a
|
|
71
|
+
* SubaccountInfo — but derives keys on the ethereum BIP44 path, reports the
|
|
72
|
+
* ethereum-style address, and signs SIGN_MODE_DIRECT with keccak256 hashing.
|
|
73
|
+
*/
|
|
74
|
+
class EthLocalWallet extends local_wallet_1.default {
|
|
75
|
+
static async fromMnemonic(mnemonic, prefix = constants_1.BECH32_PREFIX) {
|
|
76
|
+
const wallet = new EthLocalWallet();
|
|
77
|
+
const { privateKey } = (0, onboarding_1.deriveHDKeyFromMnemonic)(mnemonic, exports.ETH_BIP44_HD_PATH);
|
|
78
|
+
if (privateKey === null) {
|
|
79
|
+
throw new Error('Could not derive a private key from the mnemonic');
|
|
80
|
+
}
|
|
81
|
+
await wallet.setSigner(new DirectEthSecp256k1Signer(privateKey, prefix));
|
|
82
|
+
return wallet;
|
|
83
|
+
}
|
|
84
|
+
static async fromPrivateKey(pkHex, prefix = constants_1.BECH32_PREFIX) {
|
|
85
|
+
const wallet = new EthLocalWallet();
|
|
86
|
+
await wallet.setSigner(new DirectEthSecp256k1Signer((0, encoding_1.fromHex)((0, helpers_1.stripHexPrefix)(pkHex)), prefix));
|
|
87
|
+
return wallet;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
exports.default = EthLocalWallet;
|
|
91
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXRoLXdhbGxldC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9jbGllbnRzL21vZHVsZXMvZXRoLXdhbGxldC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFDQSwrQ0FBK0Q7QUFDL0QseURBTStCO0FBRS9CLHlEQUF5RDtBQUN6RCwrREFBNEQ7QUFFNUQsbURBQW9EO0FBQ3BELHVEQUFrRTtBQUNsRSwrQ0FBbUQ7QUFDbkQscURBQStEO0FBQy9ELGtEQUFpRjtBQUNqRixrRUFBeUM7QUFFekMsa0VBQWtFO0FBQ3JELFFBQUEsaUJBQWlCLEdBQUcsa0JBQWtCLENBQUM7QUFFcEQ7Ozs7Ozs7R0FPRztBQUNILE1BQWEsd0JBQXdCO0lBS25DLFlBQVksVUFBc0IsRUFBRSxTQUFpQix5QkFBYTtRQUNoRSxJQUFJLFVBQVUsQ0FBQyxNQUFNLEtBQUssRUFBRSxFQUFFLENBQUM7WUFDN0IsTUFBTSxJQUFJLEtBQUssQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDO1FBQ3RELENBQUM7UUFDRCxJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztRQUM3QixJQUFJLENBQUMsZ0JBQWdCLEdBQUcscUJBQVMsQ0FBQyxZQUFZLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ2pFLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBQSxtQkFBUSxFQUFDLE1BQU0sRUFBRSxJQUFBLHVDQUF5QixFQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUM7SUFDcEYsQ0FBQztJQUVELEtBQUssQ0FBQyxXQUFXO1FBQ2YsT0FBTztZQUNMO2dCQUNFLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTztnQkFDckIsc0VBQXNFO2dCQUN0RSw0Q0FBNEM7Z0JBQzVDLElBQUksRUFBRSwrQkFBMEI7Z0JBQ2hDLE1BQU0sRUFBRSxJQUFJLENBQUMsZ0JBQWdCO2FBQzlCO1NBQ0YsQ0FBQztJQUNKLENBQUM7SUFFRCxLQUFLLENBQUMsVUFBVSxDQUFDLGFBQXFCLEVBQUUsT0FBZ0I7UUFDdEQsSUFBSSxhQUFhLEtBQUssSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ25DLE1BQU0sSUFBSSxLQUFLLENBQUMsV0FBVyxhQUFhLHNCQUFzQixDQUFDLENBQUM7UUFDbEUsQ0FBQztRQUNELE1BQU0sU0FBUyxHQUFHLElBQUEsNkJBQWEsRUFBQyxPQUFPLENBQUMsQ0FBQztRQUN6QyxNQUFNLElBQUksR0FBRyxJQUFBLGtCQUFTLEVBQUMsU0FBUyxDQUFDLENBQUM7UUFDbEMseUVBQXlFO1FBQ3pFLG9EQUFvRDtRQUNwRCxNQUFNLFNBQVMsR0FBRyxxQkFBUyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3hELE1BQU0sY0FBYyxHQUFHLFNBQVMsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLENBQUMsZUFBZTtRQUNyRSxNQUFNLFlBQVksR0FBaUI7WUFDakMsT0FBTyxFQUFFLElBQUEscUNBQXdCLEVBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDO1lBQ3hELFNBQVMsRUFBRSxJQUFBLG1CQUFRLEVBQUMsY0FBYyxDQUFDO1NBQ3BDLENBQUM7UUFDRixPQUFPO1lBQ0wsTUFBTSxFQUFFLE9BQU87WUFDZixTQUFTLEVBQUUsWUFBWTtTQUN4QixDQUFDO0lBQ0osQ0FBQztDQUNGO0FBN0NELDREQTZDQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBcUIsY0FBZSxTQUFRLHNCQUFXO0lBQ3JELE1BQU0sQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUN2QixRQUFnQixFQUNoQixTQUFpQix5QkFBYTtRQUU5QixNQUFNLE1BQU0sR0FBRyxJQUFJLGNBQWMsRUFBRSxDQUFDO1FBQ3BDLE1BQU0sRUFBRSxVQUFVLEVBQUUsR0FBRyxJQUFBLG9DQUF1QixFQUFDLFFBQVEsRUFBRSx5QkFBaUIsQ0FBQyxDQUFDO1FBQzVFLElBQUksVUFBVSxLQUFLLElBQUksRUFBRSxDQUFDO1lBQ3hCLE1BQU0sSUFBSSxLQUFLLENBQUMsa0RBQWtELENBQUMsQ0FBQztRQUN0RSxDQUFDO1FBQ0QsTUFBTSxNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksd0JBQXdCLENBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDekUsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVELE1BQU0sQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUN6QixLQUFhLEVBQ2IsU0FBaUIseUJBQWE7UUFFOUIsTUFBTSxNQUFNLEdBQUcsSUFBSSxjQUFjLEVBQUUsQ0FBQztRQUNwQyxNQUFNLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSx3QkFBd0IsQ0FBQyxJQUFBLGtCQUFPLEVBQUMsSUFBQSx3QkFBYyxFQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUM3RixPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0NBQ0Y7QUF0QkQsaUNBc0JDIn0=
|
|
@@ -10,6 +10,7 @@ const stargate_1 = require("@cosmjs/stargate");
|
|
|
10
10
|
const long_1 = __importDefault(require("long"));
|
|
11
11
|
const protobufjs_1 = __importDefault(require("protobufjs"));
|
|
12
12
|
const helpers_1 = require("../../lib/helpers");
|
|
13
|
+
const eth_pubkey_1 = require("../lib/eth-pubkey");
|
|
13
14
|
const registry_1 = require("../lib/registry");
|
|
14
15
|
const signer_1 = require("./signer");
|
|
15
16
|
// Required for encoding and decoding queries that are of type Long.
|
|
@@ -40,7 +41,13 @@ class LocalWallet {
|
|
|
40
41
|
const firstAccount = accountData[0];
|
|
41
42
|
this.accounts = [...accountData];
|
|
42
43
|
this.address = firstAccount.address;
|
|
43
|
-
|
|
44
|
+
// Eth signers (see eth-wallet.ts) report the eth_secp256k1 algo marker;
|
|
45
|
+
// their pubkey must be encoded with the eth type so signer.ts puts the
|
|
46
|
+
// right Any typeUrl into AuthInfo.
|
|
47
|
+
this.pubKey =
|
|
48
|
+
firstAccount.algo === eth_pubkey_1.ETH_SECP256K1_ALGO
|
|
49
|
+
? (0, eth_pubkey_1.encodeEthSecp256k1Pubkey)(firstAccount.pubkey)
|
|
50
|
+
: (0, amino_1.encodeSecp256k1Pubkey)(firstAccount.pubkey);
|
|
44
51
|
this.signer = new signer_1.TransactionSigner(this.address, stargateClient, signer);
|
|
45
52
|
}
|
|
46
53
|
async setMnemonic(mnemonic, prefix) {
|
|
@@ -56,4 +63,4 @@ class LocalWallet {
|
|
|
56
63
|
}
|
|
57
64
|
}
|
|
58
65
|
exports.default = LocalWallet;
|
|
59
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
66
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9jYWwtd2FsbGV0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2NsaWVudHMvbW9kdWxlcy9sb2NhbC13YWxsZXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSx5Q0FBK0U7QUFDL0UsK0NBQTJDO0FBQzNDLHlEQU0rQjtBQUMvQiwrQ0FBeUQ7QUFDekQsZ0RBQXdCO0FBQ3hCLDREQUFrQztBQUVsQywrQ0FBbUQ7QUFDbkQsa0RBSTJCO0FBQzNCLDhDQUFtRDtBQUVuRCxxQ0FBNkM7QUFFN0Msb0VBQW9FO0FBQ3BFLG9CQUFRLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxjQUFJLENBQUM7QUFDMUIsb0JBQVEsQ0FBQyxTQUFTLEVBQUUsQ0FBQztBQUVyQixNQUFxQixXQUFXO0lBTzlCLE1BQU0sQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsTUFBcUI7UUFDbEQsTUFBTSxNQUFNLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQztRQUNqQyxNQUFNLE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDL0IsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVELE1BQU0sQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLFFBQWdCLEVBQUUsTUFBZTtRQUN6RCxNQUFNLE1BQU0sR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDO1FBQ2pDLE1BQU0sTUFBTSxDQUFDLFdBQVcsQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDM0MsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVELE1BQU0sQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLEtBQWEsRUFBRSxNQUFlO1FBQ3hELE1BQU0sTUFBTSxHQUFHLElBQUksV0FBVyxFQUFFLENBQUM7UUFDakMsTUFBTSxNQUFNLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztRQUMxQyxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRUQsS0FBSyxDQUFDLFNBQVMsQ0FBQyxNQUFxQjtRQUNuQyxJQUFJLENBQUMsYUFBYSxHQUFHLE1BQU0sQ0FBQztRQUM1QixNQUFNLGNBQWMsR0FBRyxNQUFNLGdDQUFxQixDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUU7WUFDakUsUUFBUSxFQUFFLElBQUEsMkJBQWdCLEdBQUU7U0FDN0IsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxXQUFXLEdBQUcsTUFBTSxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDL0MsTUFBTSxZQUFZLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBRSxDQUFDO1FBQ3JDLElBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxDQUFDO1FBQ2pDLElBQUksQ0FBQyxPQUFPLEdBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQztRQUNwQyx3RUFBd0U7UUFDeEUsdUVBQXVFO1FBQ3ZFLG1DQUFtQztRQUNuQyxJQUFJLENBQUMsTUFBTTtZQUNULFlBQVksQ0FBQyxJQUFJLEtBQUssK0JBQWtCO2dCQUN0QyxDQUFDLENBQUMsSUFBQSxxQ0FBd0IsRUFBQyxZQUFZLENBQUMsTUFBTSxDQUFDO2dCQUMvQyxDQUFDLENBQUMsSUFBQSw2QkFBcUIsRUFBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDakQsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLDBCQUFpQixDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQzVFLENBQUM7SUFFRCxLQUFLLENBQUMsV0FBVyxDQUFDLFFBQWdCLEVBQUUsTUFBZTtRQUNqRCxNQUFNLE1BQU0sR0FBRyxNQUFNLHVDQUF1QixDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQ2hGLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBRUQsS0FBSyxDQUFDLGFBQWEsQ0FBQyxLQUFhLEVBQUUsTUFBZTtRQUNoRCxNQUFNLE1BQU0sR0FBRyxNQUFNLHFDQUFxQixDQUFDLE9BQU8sQ0FBQyxJQUFBLGtCQUFPLEVBQUMsSUFBQSx3QkFBYyxFQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDM0YsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFTSxLQUFLLENBQUMsZUFBZSxDQUMxQixRQUF3QixFQUN4QixrQkFBc0MsRUFDdEMsR0FBWSxFQUNaLE9BQWUsRUFBRTtRQUVqQixPQUFPLElBQUksQ0FBQyxNQUFPLENBQUMsZUFBZSxDQUFDLFFBQVEsRUFBRSxrQkFBa0IsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM1RixDQUFDO0NBQ0Y7QUE5REQsOEJBOERDIn0=
|