-
Notifications
You must be signed in to change notification settings - Fork 97
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
feat(core): multi-pubkey DB support #2093
base: dev
Are you sure you want to change the base?
Changes from 183 commits
aa0909f
f051600
c8a434e
3e0061f
c6146d0
eff374c
fef8a4e
6247766
fa0f5ab
947ab8d
ae95d4e
c0d13e7
71c4e9c
be3dc81
ffbc262
07c1168
1ec96bc
3ccfa00
29763e2
cf749eb
368441c
7095605
8823be2
42a22b1
23f0566
65a07d2
71ae0b1
61c49bb
d184c1e
bd114fc
f58c80a
a99c8a6
5298f2b
d9d8e53
1538f81
c0355fa
a27ec3e
3407835
c27206c
ca13b41
3f053bd
f0e8016
f5e5245
f8d08cf
2d96232
d2152f8
04d2896
879438b
234a2aa
e2dacfc
a00c2c7
04e1d97
f904927
ea778d2
8fa9cec
86649f5
0699843
3480e26
b9375e0
4c3a61c
12537c0
77b43f5
fbe1fe2
795f718
42f5db0
88754f7
cc3a02f
ee8d9d0
acd6383
4d04128
e508b59
d7c4a83
3a7fa66
4e7ae81
69d9886
8796922
875c9df
4f7824d
4bba3fb
637286d
7cd60f8
b03a0aa
98cb993
061d1ff
398b93b
e2877a8
577e18b
9eaeb2e
9882ccc
8a2f4a7
4594ff6
9ff52de
49b9260
6db0236
f970a12
094a659
92b94ac
6d51390
a4c27b9
1c08ef5
a6d0b51
35b102a
474d641
0686d0e
ca440df
719862b
8921e4a
6d6169f
6954d62
79e7c89
20a4486
7a2ebaf
fdb4f55
6c93752
db397e5
393e825
6e515ae
22319bc
b036c62
9dcb662
0ac682d
c409ecc
23bb803
8281609
115a873
9062bee
b370bec
46f8712
5bde012
e036383
fab32e2
789ce8d
ac5cc96
d8caebd
76efdf3
24774a4
6a0d0b6
fbfe747
097a63e
8a6d0cd
f685f72
df3cf1e
c028061
309a5ac
3cfd616
0b5275c
a53bd38
ff42791
4b99dba
2d427d9
b516435
497a006
df10264
d32f8f6
966607d
19930d3
527efbc
bb41f41
916ce6a
0f7c075
bf12b01
41b61c1
54714eb
7699f55
e9ef701
1b3931b
4962351
f449cdd
a4ac369
99e6ca6
a94c791
33ba505
8a01341
b19d2ba
f35f371
0856b54
9a1f89d
5fdee3e
9a8494e
7c12cce
0b4d808
90f89b7
8f19481
e643ab3
a78704d
bdd79af
7e3d3a6
5470b25
d57e394
b690e93
1675a53
5e02fa4
5f72e83
a0cf3cb
0c817e8
34f9d27
79f3792
117aa44
2f3086c
c6b3648
06ce83b
eb9d74a
5cbfd89
cea464b
07a478c
342fab8
07177cf
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Large diffs are not rendered by default.
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
@@ -8,6 +8,7 @@ use crate::nft::nft_structs::Chain; | |||||||||||||||||||||||||||||||||||||
use common::executor::AbortedError; | ||||||||||||||||||||||||||||||||||||||
use crypto::{trezor::TrezorError, Bip32Error, CryptoCtxError, HwError}; | ||||||||||||||||||||||||||||||||||||||
use enum_derives::EnumFromTrait; | ||||||||||||||||||||||||||||||||||||||
#[cfg(not(target_arch = "wasm32"))] use futures::SinkExt; | ||||||||||||||||||||||||||||||||||||||
use instant::Instant; | ||||||||||||||||||||||||||||||||||||||
use mm2_err_handle::common_errors::WithInternal; | ||||||||||||||||||||||||||||||||||||||
#[cfg(target_arch = "wasm32")] | ||||||||||||||||||||||||||||||||||||||
|
@@ -662,6 +663,9 @@ pub(crate) async fn build_address_and_priv_key_policy( | |||||||||||||||||||||||||||||||||||||
.map_to_mm(|e| EthActivationV2Error::InternalError(e.to_string()))?; | ||||||||||||||||||||||||||||||||||||||
let bip39_secp_priv_key = global_hd_ctx.root_priv_key().clone(); | ||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||
#[cfg(not(target_arch = "wasm32"))] | ||||||||||||||||||||||||||||||||||||||
run_db_migration_for_new_eth_pubkey(ctx, dhash160(activated_key.public().as_bytes()).to_string()).await?; | ||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||
let hd_wallet_rmd160 = *ctx.rmd160(); | ||||||||||||||||||||||||||||||||||||||
let hd_wallet_storage = HDWalletCoinStorage::init_with_rmd160(ctx, ticker.to_string(), hd_wallet_rmd160) | ||||||||||||||||||||||||||||||||||||||
.await | ||||||||||||||||||||||||||||||||||||||
|
@@ -676,6 +680,7 @@ pub(crate) async fn build_address_and_priv_key_policy( | |||||||||||||||||||||||||||||||||||||
enabled_address: *path_to_address, | ||||||||||||||||||||||||||||||||||||||
gap_limit, | ||||||||||||||||||||||||||||||||||||||
}; | ||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||
let derivation_method = DerivationMethod::HDWallet(hd_wallet); | ||||||||||||||||||||||||||||||||||||||
Ok(( | ||||||||||||||||||||||||||||||||||||||
EthPrivKeyPolicy::HDWallet { | ||||||||||||||||||||||||||||||||||||||
|
@@ -916,3 +921,39 @@ fn compress_public_key(uncompressed: H520) -> MmResult<H264, EthActivationV2Erro | |||||||||||||||||||||||||||||||||||||
let compressed = public_key.serialize(); | ||||||||||||||||||||||||||||||||||||||
Ok(H264::from(compressed)) | ||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||
#[cfg(not(target_arch = "wasm32"))] | ||||||||||||||||||||||||||||||||||||||
async fn run_db_migration_for_new_eth_pubkey(ctx: &MmArc, db_id: String) -> MmResult<(), EthActivationV2Error> { | ||||||||||||||||||||||||||||||||||||||
info!("Public key hash: {db_id:?}"); | ||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||
let db_migration_sender = ctx | ||||||||||||||||||||||||||||||||||||||
.db_migration_watcher | ||||||||||||||||||||||||||||||||||||||
.as_option() | ||||||||||||||||||||||||||||||||||||||
.expect("Db migration watcher isn't intialized yet!") | ||||||||||||||||||||||||||||||||||||||
.get_sender(); | ||||||||||||||||||||||||||||||||||||||
let mut db_migration_sender = db_migration_sender.lock().await; | ||||||||||||||||||||||||||||||||||||||
db_migration_sender | ||||||||||||||||||||||||||||||||||||||
.send(db_id) | ||||||||||||||||||||||||||||||||||||||
.await | ||||||||||||||||||||||||||||||||||||||
.map_to_mm(|err| EthActivationV2Error::InternalError(err.to_string()))?; | ||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||
Ok(()) | ||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||
pub(super) async fn eth_shared_db_id(coin: &EthCoin, ctx: &MmArc) -> Option<String> { | ||||||||||||||||||||||||||||||||||||||
// Use the hd_wallet_rmd160 as the db_id in HD mode since it's unique to a device and not tied to a single address | ||||||||||||||||||||||||||||||||||||||
coin.derivation_method() | ||||||||||||||||||||||||||||||||||||||
.hd_wallet() | ||||||||||||||||||||||||||||||||||||||
.map(|_| ctx.default_shared_db_id().to_string()) | ||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||
pub(super) async fn eth_account_db_id(coin: &EthCoin) -> Option<String> { | ||||||||||||||||||||||||||||||||||||||
if let Some(hd_wallet) = coin.derivation_method().hd_wallet() { | ||||||||||||||||||||||||||||||||||||||
return hd_wallet | ||||||||||||||||||||||||||||||||||||||
.get_enabled_address() | ||||||||||||||||||||||||||||||||||||||
.await | ||||||||||||||||||||||||||||||||||||||
.map(|addr| hex::encode(dhash160(addr.pubkey().as_bytes()))); | ||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. We should use the address without the 0x prefix as the There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. We can use same pubkey hash as utxo and tendermint for external EVM wallets btw but it will be a bit more complex to do so. We request from the user to sign a message and extract the public key from it, it's actually implemented for metamask here for uncompressed format komodo-defi-framework/mm2src/crypto/src/metamask_ctx.rs Lines 56 to 73 in 0058f71
But we use compressed format for getting pubkey hash for utxo and tendermint so we should do the same for EVM. I will check if I can get the same public key from metamask as the one from Keplr for the same seed this way. Drawback of this is that for external wallets, we have to let the user sign a message at the start (while coin is activating) to get the public key. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. done |
||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||
None | ||||||||||||||||||||||||||||||||||||||
borngraced marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||||||||||||||||||||||||||||||||||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This should also use the same
db_id
aseth_account_db_id
stated in my first comment.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
done