From 77cab9a927868c44f0c86448599899c8b0eb61fb Mon Sep 17 00:00:00 2001 From: Mateusz Jasiuk Date: Tue, 8 Aug 2023 13:29:56 +0200 Subject: [PATCH] refactor: cleanup after update to 0.21.0 --- .../src/background/keyring/handler.ts | 15 --- apps/extension/src/background/keyring/init.ts | 2 - .../src/background/keyring/keyring.ts | 10 +- .../src/background/keyring/service.ts | 13 --- .../src/background/ledger/service.ts | 7 +- apps/extension/src/provider/InjectedNamada.ts | 38 +++---- apps/extension/src/provider/Namada.test.ts | 17 --- apps/extension/src/provider/Namada.ts | 12 -- apps/extension/src/provider/Signer.ts | 24 +--- apps/extension/src/provider/messages.ts | 29 ----- packages/shared/lib/src/sdk/mod.rs | 107 +++++++----------- packages/types/src/namada.ts | 4 - packages/types/src/signer.ts | 5 - packages/types/src/tx/types.ts | 4 - specs/interface/transparent-transactions.md | 20 ---- 15 files changed, 62 insertions(+), 245 deletions(-) diff --git a/apps/extension/src/background/keyring/handler.ts b/apps/extension/src/background/keyring/handler.ts index 6394934175..cadd047634 100644 --- a/apps/extension/src/background/keyring/handler.ts +++ b/apps/extension/src/background/keyring/handler.ts @@ -21,7 +21,6 @@ import { } from "./messages"; import { ConnectInterfaceMsg, - EncodeInitAccountMsg, QueryAccountsMsg, QueryBalancesMsg, SubmitIbcTransferMsg, @@ -89,11 +88,6 @@ export const getHandler: (service: KeyRingService) => Handler = (service) => { env, msg as SubmitIbcTransferMsg ); - case EncodeInitAccountMsg: - return handleEncodeInitAccountMsg(service)( - env, - msg as EncodeInitAccountMsg - ); case CloseOffscreenDocumentMsg: return handleCloseOffscreenDocumentMsg(service)( env, @@ -258,15 +252,6 @@ const handleSubmitIbcTransferMsg: ( }; }; -const handleEncodeInitAccountMsg: ( - service: KeyRingService -) => InternalHandler = (service) => { - return (_, msg) => { - const { address, txMsg } = msg; - return service.encodeInitAccount(txMsg, address); - }; -}; - const handleSetActiveAccountMsg: ( service: KeyRingService ) => InternalHandler = (service) => { diff --git a/apps/extension/src/background/keyring/init.ts b/apps/extension/src/background/keyring/init.ts index 80f7362cbe..9d1a60952b 100644 --- a/apps/extension/src/background/keyring/init.ts +++ b/apps/extension/src/background/keyring/init.ts @@ -20,7 +20,6 @@ import { } from "./messages"; import { ConnectInterfaceMsg, - EncodeInitAccountMsg, QueryAccountsMsg, QueryBalancesMsg, SubmitIbcTransferMsg, @@ -38,7 +37,6 @@ export function init(router: Router, service: KeyRingService): void { router.registerMessage(CloseOffscreenDocumentMsg); router.registerMessage(ConnectInterfaceMsg); router.registerMessage(DeriveAccountMsg); - router.registerMessage(EncodeInitAccountMsg); router.registerMessage(GenerateMnemonicMsg); router.registerMessage(GetActiveAccountMsg); router.registerMessage(LockKeyRingMsg); diff --git a/apps/extension/src/background/keyring/keyring.ts b/apps/extension/src/background/keyring/keyring.ts index 393ee1c9fd..a70d74de20 100644 --- a/apps/extension/src/background/keyring/keyring.ts +++ b/apps/extension/src/background/keyring/keyring.ts @@ -334,7 +334,7 @@ export class KeyRing { parentId: string ): DerivedAccountInfo { const { index = 0 } = path; - const id = generateId("shielded-account", parentId, index); + const id = generateId(UUID_NAMESPACE, "shielded-account", parentId, index); const zip32 = new ShieldedHDWallet(seed); const account = zip32.derive_to_serialized_keys(index); @@ -593,14 +593,6 @@ export class KeyRing { return getAccountValuesFromStore(accounts); } - //TOOD: remove - async encodeInitAccount( - _address: string, - _txMsg: Uint8Array - ): Promise { - return Promise.resolve(new Uint8Array()); - } - async submitBond(txMsg: Uint8Array): Promise { if (!this._password) { throw new Error("Not authenticated!"); diff --git a/apps/extension/src/background/keyring/service.ts b/apps/extension/src/background/keyring/service.ts index b49f159aa5..61612f5111 100644 --- a/apps/extension/src/background/keyring/service.ts +++ b/apps/extension/src/background/keyring/service.ts @@ -316,19 +316,6 @@ export class KeyRingService { } } - /** - * Creating an InitAccount for Namada requires a secret, - * therefore, we need to query the private key for this account from - * storage - */ - async encodeInitAccount(txMsg: string, address: string): Promise { - const tx_data = await this._keyRing.encodeInitAccount( - address, - fromBase64(txMsg) - ); - return toBase64(tx_data); - } - async setActiveAccount(id: string, type: ParentAccount): Promise { await this._keyRing.setActiveAccount(id, type); await this.broadcastAccountsChanged(); diff --git a/apps/extension/src/background/ledger/service.ts b/apps/extension/src/background/ledger/service.ts index 2313c514fe..1d1678d8e8 100644 --- a/apps/extension/src/background/ledger/service.ts +++ b/apps/extension/src/background/ledger/service.ts @@ -49,6 +49,10 @@ export class LedgerService { TxMsgValue ); + if (!publicKey) { + throw new Error("Public key not found in txMsg"); + } + // Query account from Ledger storage to determine path for signer const account = await this._ledgerStore.getRecord("publicKey", publicKey); @@ -59,8 +63,7 @@ export class LedgerService { const bytes = await this.sdk.build_tx( TxType.RevealPK, fromBase64(txMsg), - //TODO: - publicKey as string + publicKey ); const path = makeBip44Path(coinType, account.path); diff --git a/apps/extension/src/provider/InjectedNamada.ts b/apps/extension/src/provider/InjectedNamada.ts index f2fc5b07c2..2ab180f61e 100644 --- a/apps/extension/src/provider/InjectedNamada.ts +++ b/apps/extension/src/provider/InjectedNamada.ts @@ -6,8 +6,8 @@ import { Signer as ISigner, TxMsgProps, } from "@namada/types"; -import {InjectedProxy} from "./InjectedProxy"; -import {Signer} from "./Signer"; +import { InjectedProxy } from "./InjectedProxy"; +import { Signer } from "./Signer"; export class InjectedNamada implements INamada { constructor(private readonly _version: string) {} @@ -40,10 +40,10 @@ export class InjectedNamada implements INamada { public async balances( owner: string - ): Promise<{token: string; amount: string}[]> { + ): Promise<{ token: string; amount: string }[]> { return await InjectedProxy.requestMethod< string, - {token: string; amount: string}[] + { token: string; amount: string }[] >("balances", owner); } @@ -52,9 +52,9 @@ export class InjectedNamada implements INamada { } public async submitBond(props: TxMsgProps): Promise { - const {txMsg, type} = props; + const { txMsg, type } = props; return await InjectedProxy.requestMethod< - {txMsg: string; type: AccountType}, + { txMsg: string; type: AccountType }, void >("submitBond", { txMsg, @@ -63,28 +63,28 @@ export class InjectedNamada implements INamada { } public async submitUnbond(props: TxMsgProps): Promise { - const {txMsg, type} = props; + const { txMsg, type } = props; return await InjectedProxy.requestMethod< - {txMsg: string; type: AccountType}, + { txMsg: string; type: AccountType }, void - >("submitUnbond", {txMsg, type}); + >("submitUnbond", { txMsg, type }); } public async submitWithdraw(props: TxMsgProps): Promise { - const {txMsg, type} = props; + const { txMsg, type } = props; return await InjectedProxy.requestMethod< - {txMsg: string; type: AccountType}, + { txMsg: string; type: AccountType }, void - >("submitWithdraw", {txMsg, type}); + >("submitWithdraw", { txMsg, type }); } public async submitTransfer(props: { txMsg: string; type: AccountType; }): Promise { - const {txMsg, type} = props; + const { txMsg, type } = props; return await InjectedProxy.requestMethod< - {txMsg: string; type: AccountType}, + { txMsg: string; type: AccountType }, void >("submitTransfer", { txMsg, @@ -99,16 +99,6 @@ export class InjectedNamada implements INamada { ); } - public async encodeInitAccount(props: { - txMsg: string; - address: string; - }): Promise { - return await InjectedProxy.requestMethod< - {txMsg: string; address: string}, - string - >("encodeInitAccount", props); - } - public version(): string { return this._version; } diff --git a/apps/extension/src/provider/Namada.test.ts b/apps/extension/src/provider/Namada.test.ts index cc035f321e..1f555e7145 100644 --- a/apps/extension/src/provider/Namada.test.ts +++ b/apps/extension/src/provider/Namada.test.ts @@ -149,21 +149,4 @@ describe("Namada", () => { await expect(res).resolves.not.toBeDefined(); }); - - // This test shows that init account is NOT working - it is also unused. - // We will have to change assertion after fixing initAccount fn - it("should THROW AN ERROR on encode init account", async () => { - const accountMsgValue = new AccountMsgValue({ - vpCode: new Uint8Array(), - }); - const accountMessage = new Message(); - const serialized = accountMessage.encode(accountMsgValue); - - await expect( - namada.encodeInitAccount({ - txMsg: toBase64(serialized), - address: keyStore[0].address, - }) - ).rejects.toThrow(); - }); }); diff --git a/apps/extension/src/provider/Namada.ts b/apps/extension/src/provider/Namada.ts index c7db8bb313..6066c83034 100644 --- a/apps/extension/src/provider/Namada.ts +++ b/apps/extension/src/provider/Namada.ts @@ -15,7 +15,6 @@ import { GetChainMsg, GetChainsMsg, SuggestChainMsg, - EncodeInitAccountMsg, QueryAccountsMsg, FetchAndStoreMaspParamsMsg, HasMaspParamsMsg, @@ -140,17 +139,6 @@ export class Namada implements INamada { ); } - public async encodeInitAccount(props: { - txMsg: string; - address: string; - }): Promise { - const { txMsg, address } = props; - return await this.requester?.sendMessage( - Ports.Background, - new EncodeInitAccountMsg(txMsg, address) - ); - } - public version(): string { return this._version; } diff --git a/apps/extension/src/provider/Signer.ts b/apps/extension/src/provider/Signer.ts index 68d03de124..77435624ba 100644 --- a/apps/extension/src/provider/Signer.ts +++ b/apps/extension/src/provider/Signer.ts @@ -2,10 +2,8 @@ import { toBase64 } from "@cosmjs/encoding"; import { Account, Namada, - AccountMsgValue, IbcTransferMsgValue, IbcTransferProps, - InitAccountProps, Message, Signer as ISigner, TransferMsgValue, @@ -21,7 +19,7 @@ export class Signer implements ISigner { constructor( protected readonly chainId: string, private readonly _namada: Namada - ) { } + ) {} public async accounts(): Promise { return (await this._namada.accounts(this.chainId))?.map( @@ -114,24 +112,4 @@ export class Signer implements ISigner { toBase64(serializedIbcTransfer) ); } - - /** - * Encode an InitAccount message - */ - public async encodeInitAccount( - args: InitAccountProps, - signer: string - ): Promise { - const { vpCode } = args; - const accountMsgValue = new AccountMsgValue({ - vpCode, - }); - const accountMessage = new Message(); - const serialized = accountMessage.encode(accountMsgValue); - - return await this._namada.encodeInitAccount({ - txMsg: toBase64(serialized), - address: signer, - }); - } } diff --git a/apps/extension/src/provider/messages.ts b/apps/extension/src/provider/messages.ts index c25267259c..8783708b05 100644 --- a/apps/extension/src/provider/messages.ts +++ b/apps/extension/src/provider/messages.ts @@ -23,7 +23,6 @@ enum MessageType { QueryBalances = "query-balances", SubmitIbcTransfer = "submit-ibc-transfer", SubmitLedgerTransfer = "submit-ledger-transfer", - EncodeInitAccount = "encode-init-account", EncodeRevealPublicKey = "encode-reveal-public-key", GetChain = "get-chain", GetChains = "get-chains", @@ -207,34 +206,6 @@ export class SubmitIbcTransferMsg extends Message { } } -export class EncodeInitAccountMsg extends Message { - public static type(): MessageType { - return MessageType.EncodeInitAccount; - } - - constructor(public readonly txMsg: string, public readonly address: string) { - super(); - } - - validate(): void { - if (!this.address) { - throw new Error("An address is required!"); - } - if (!this.txMsg) { - throw new Error("An encoded txMsg is required!"); - } - return; - } - - route(): string { - return Route.KeyRing; - } - - type(): string { - return EncodeInitAccountMsg.type(); - } -} - export class ApproveTransferMsg extends Message { public static type(): MessageType { return MessageType.ApproveTransfer; diff --git a/packages/shared/lib/src/sdk/mod.rs b/packages/shared/lib/src/sdk/mod.rs index 1928349fe5..47933d73e0 100644 --- a/packages/shared/lib/src/sdk/mod.rs +++ b/packages/shared/lib/src/sdk/mod.rs @@ -8,6 +8,7 @@ use crate::{ }; use borsh::{BorshDeserialize, BorshSerialize}; use namada::ledger::signing::SigningTxData; +use namada::ledger::tx::Error; use namada::types::address::Address; use namada::types::key::common::SecretKey; use namada::types::tx::TxBuilder; @@ -123,22 +124,23 @@ impl Sdk { &mut self, args: &args::Tx, pk: &PublicKey, - gas_payer: &PublicKey, - sk: Option, + gas_payer: Option, ) -> Result<(), JsError> { // Build a transaction to reveal the signer of this transaction let mut tx_builder = namada::ledger::tx::build_reveal_pk( &self.client, args, - //TODO: This is only needed for logging, we can remove it later + //TODO: This is only needed for logging, I imagine it will be cleaned up in Namada &args.gas_token, &pk, - &gas_payer, + // In the case of web interface gas_payer is the same as the signer + &pk, ) .await?; - if let Some(sk) = sk { - tx_builder = tx_builder.add_gas_payer(sk); + // Add gas payer - hardware wallets should do it automatically + if let Some(gas_payer) = gas_payer { + tx_builder = tx_builder.add_gas_payer(gas_payer); } namada::ledger::tx::process_tx(&self.client, &mut self.wallet, &args, tx_builder.build()) @@ -154,8 +156,8 @@ impl Sdk { tx_builder: TxBuilder, signing_data: SigningTxData, ) -> Result<(), JsError> { - // In our case "signer" is the one we want to reveal. - // We support only one signer. + // We are revealing the signer of this transaction(if needed) + // We only support one signer(for now) let pk = &signing_data .public_keys .clone() @@ -168,16 +170,13 @@ impl Sdk { .expect("No secret key found"); // Submit a reveal pk tx if necessary - self.submit_reveal_pk(&args, &pk, &signing_data.gas_payer, Some(sk)) - .await?; + self.submit_reveal_pk(&args, &pk, Some(sk)).await?; // Sign tx let tx_builder = signing::sign_tx(&mut self.wallet, &args, tx_builder, signing_data)?; let tx = tx_builder.build(); // Submit tx - namada::ledger::tx::process_tx(&self.client, &mut self.wallet, &args, tx) - .await - .map_err(JsError::from)?; + namada::ledger::tx::process_tx(&self.client, &mut self.wallet, &args, tx).await?; Ok(()) } @@ -191,11 +190,9 @@ impl Sdk { wrapper_sig_bytes: &[u8], ) -> Result<(), JsError> { let reveal_pk_tx = self.sign_tx(tx_bytes, raw_sig_bytes, wrapper_sig_bytes)?; - let args = tx::tx_args_from_slice(&tx_msg).map_err(JsError::from)?; + let args = tx::tx_args_from_slice(&tx_msg)?; - namada::ledger::tx::process_tx(&self.client, &mut self.wallet, &args, reveal_pk_tx) - .await - .map_err(JsError::from)?; + namada::ledger::tx::process_tx(&self.client, &mut self.wallet, &args, reveal_pk_tx).await?; Ok(()) } @@ -207,6 +204,7 @@ impl Sdk { tx_msg: &[u8], gas_payer: String, ) -> Result { + //TODO: verify if this works let gas_payer = PublicKey::from_str(&gas_payer)?; let tx_builder = match tx_type { @@ -269,8 +267,6 @@ impl Sdk { namada::ledger::tx::build_withdraw(&self.client, args.clone(), &gas_payer).await? } }; - // TODO: - // tx.add_gas_payer(gas_payer); let tx = tx_builder.build(); to_js_result(tx.try_to_vec()?) @@ -309,8 +305,7 @@ impl Sdk { let verification_key = args.verification_key.clone(); let pk = validate_pk(verification_key)?; - //TODO: gas_payer &pk - self.submit_reveal_pk(&args, &pk, &pk, None).await?; + self.submit_reveal_pk(&args, &pk, None).await?; namada::ledger::tx::process_tx(&self.client, &mut self.wallet, &args, transfer_tx) .await @@ -319,6 +314,22 @@ impl Sdk { Ok(()) } + async fn signing_data( + &mut self, + address: Address, + tx_args: args::Tx, + ) -> Result { + let default_signer = signing::signer_from_address(Some(address.clone())); + signing::aux_signing_data( + &self.client, + &mut self.wallet, + &tx_args, + &address, + default_signer, + ) + .await + } + pub async fn submit_transfer( &mut self, tx_msg: &[u8], @@ -326,15 +337,9 @@ impl Sdk { xsk: Option, ) -> Result<(), JsError> { let args = tx::transfer_tx_args(tx_msg, password, xsk)?; - let default_signer = signing::signer_from_address(Some(args.source.effective_address())); - let signing_data = signing::aux_signing_data( - &self.client, - &mut self.wallet, - &args.tx, - &args.source.effective_address(), - default_signer, - ) - .await?; + let signing_data = self + .signing_data(args.source.effective_address(), args.tx.clone()) + .await?; let (tx_builder, _) = namada::ledger::tx::build_transfer( &self.client, @@ -357,15 +362,9 @@ impl Sdk { password: Option, ) -> Result<(), JsError> { let args = tx::ibc_transfer_tx_args(tx_msg, password)?; - let default_signer = signing::signer_from_address(Some(args.source.clone())); - let signing_data = signing::aux_signing_data( - &self.client, - &mut self.wallet, - &args.tx, - &args.source, - default_signer, - ) - .await?; + let signing_data = self + .signing_data(args.source.clone(), args.tx.clone()) + .await?; let tx_builder = namada::ledger::tx::build_ibc_transfer( &self.client, @@ -387,15 +386,7 @@ impl Sdk { ) -> Result<(), JsError> { let args = tx::bond_tx_args(tx_msg, password)?; let source = args.source.as_ref().expect("Source address is required"); - let default_signer = signing::signer_from_address(Some(source.clone())); - let signing_data = signing::aux_signing_data( - &self.client, - &mut self.wallet, - &args.tx, - &source, - default_signer, - ) - .await?; + let signing_data = self.signing_data(source.clone(), args.tx.clone()).await?; let tx_builder = namada::ledger::tx::build_bond(&mut self.client, args.clone(), &signing_data.gas_payer) @@ -415,15 +406,7 @@ impl Sdk { ) -> Result<(), JsError> { let args = tx::unbond_tx_args(tx_msg, password)?; let source = args.source.as_ref().expect("Source address is required"); - let default_signer = signing::signer_from_address(Some(source.clone())); - let signing_data = signing::aux_signing_data( - &self.client, - &mut self.wallet, - &args.tx, - &source, - default_signer, - ) - .await?; + let signing_data = self.signing_data(source.clone(), args.tx.clone()).await?; let (tx_builder, _) = namada::ledger::tx::build_unbond( &mut self.client, @@ -446,15 +429,7 @@ impl Sdk { ) -> Result<(), JsError> { let args = tx::withdraw_tx_args(tx_msg, password)?; let source = args.source.as_ref().expect("Source address is required"); - let default_signer = signing::signer_from_address(Some(source.clone())); - let signing_data = signing::aux_signing_data( - &self.client, - &mut self.wallet, - &args.tx, - &source, - default_signer, - ) - .await?; + let signing_data = self.signing_data(source.clone(), args.tx.clone()).await?; let tx_builder = namada::ledger::tx::build_withdraw( &mut self.client, diff --git a/packages/types/src/namada.ts b/packages/types/src/namada.ts index 7f9365a200..690a83d374 100644 --- a/packages/types/src/namada.ts +++ b/packages/types/src/namada.ts @@ -18,10 +18,6 @@ export interface Namada { submitWithdraw: (props: TxMsgProps) => Promise; submitTransfer: (props: TxMsgProps) => Promise; submitIbcTransfer: (txMsg: string) => Promise; - encodeInitAccount: (props: { - txMsg: string; - address: string; - }) => Promise; version: () => string; } diff --git a/packages/types/src/signer.ts b/packages/types/src/signer.ts index 0ce0afb611..22c72c4be6 100644 --- a/packages/types/src/signer.ts +++ b/packages/types/src/signer.ts @@ -1,7 +1,6 @@ import { Account, AccountType } from "./account"; import { IbcTransferProps, - InitAccountProps, SubmitBondProps, SubmitUnbondProps, SubmitWithdrawProps, @@ -15,8 +14,4 @@ export interface Signer { submitWithdraw(args: SubmitWithdrawProps, type: AccountType): Promise; submitTransfer(args: TransferProps, type: AccountType): Promise; submitIbcTransfer(args: IbcTransferProps): Promise; - encodeInitAccount( - args: InitAccountProps, - signer: string - ): Promise; } diff --git a/packages/types/src/tx/types.ts b/packages/types/src/tx/types.ts index 9e1f03b456..c5178a83a3 100644 --- a/packages/types/src/tx/types.ts +++ b/packages/types/src/tx/types.ts @@ -64,10 +64,6 @@ export type BridgeTransferProps = { amount: BigNumber; }; -export type InitAccountProps = { - vpCode: Uint8Array; -}; - export type SignatureProps = { salt: Uint8Array; indices: Uint8Array; diff --git a/specs/interface/transparent-transactions.md b/specs/interface/transparent-transactions.md index fb81aeae54..572b7d98e7 100644 --- a/specs/interface/transparent-transactions.md +++ b/specs/interface/transparent-transactions.md @@ -188,26 +188,6 @@ Ok(Transaction { _In namada CLI:_ https://github.com/anoma/namada/blob/f6e78278608aaef253617885bb7ef95a50057268/apps/src/lib/client/tx.rs#L810-L814 -## Part 2 - Initialize Account Transaction - -Constructing an Initialize Account transaction follows a similar process to a transfer, however, in addition to providing a `tx_init_account` wasm, we need to provide the `vp_user` wasm as well, as this is required when constructing the transaction: - -```rust -// namada-lib/src/account.rs - -let vp_code: Vec = vp_code.to_vec(); -let keypair = &Keypair::deserialize(serialized_keypair.clone()) - .expect("Keypair could not be deserialized"); -let public_key = PublicKey::from(keypair.0.public.clone()); - -let data = InitAccount { - public_key, - vp_code: vp_code.clone(), -}; -``` - -Following this, we will pass `data` into to our new transaction as before, along with `tx_code` and required values for `WrapperTx`, returning the final result in a `JsValue` containing the transaction hash and returned byte array. - ## Submitting Transparent Transactions See [RPC](./rpc.md) for more information on HTTP and WebSocket RPC interaction with ledger.