> For the complete documentation index, see [llms.txt](https://docs.dydx.community/dydx-chain-technical-docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.dydx.community/dydx-chain-technical-docs/getting-started/developer-tools/dydx-cli/eoa-wallets.md).

# EOA Wallets

### Prerequisites

{% content-ref url="/pages/kFmJGDEHByceRa56HMoy" %}
[Setup the dYdX CLI](/dydx-chain-technical-docs/getting-started/developer-tools/dydx-cli/setup-the-dydx-cli.md)
{% endcontent-ref %}

### 1. List wallets

{% hint style="info" %}
The command below will not read data from the blockchain, but only what has been added or imported into your local installation (By default the `keyring-backend`is set to `os)` \
You can change the keyring as preferred. When using the MacOS default keyring it may require you to unlock access to your Keychain app.
{% endhint %}

```bash
$ dydxprotocold keys list
- address: dydx1m4...dfpel
  name: test
  pubkey: '{"@type":"/cosmos.crypto.secp256k1.PubKey","key":"Ara...zbQ0"}'
  type: local
```

{% hint style="info" %}
Note that the pubkey value can be used for sharing with multisig counterparties, when they instantiate the multisig on their workstations
{% endhint %}

```bash
dydxprotocold keys show test
```

###

### 2. Generate new wallet

Let’s say you want to name your wallet `myNewWallet` - you can choose an arbitrary name, that is meaningful to you. Spaces are allowed, although they might not be convenient when you try to use the wallet&#x20;

```bash
$ dydxprotocold keys add myNewWallet 
- address: dydx1cza...069c
  name: myNewWallet
  pubkey: '{"@type":"/cosmos.crypto.secp256k1.PubKey","key":"A9QEyr+iQoCI...6IjzVG2vEMf"}'
  type: local


**Important** write this mnemonic phrase in a safe place.
It is the only way to recover your account if you ever forget your password.

some mnemonic keywords will appear here
```

This will output the newly created wallet information, as well as the mnemonic for it.

### 3. Import an existing wallet with a mnemonic

You will need to have the mnemonic of the wallet available. `myImportedWallet` is an example, use a name that is meaningful to you.

The command will halt with the message > Enter your bip39 mnemonic asking for your mnemonic - paste it (or enter it manually) and hit enter:

```bash
dydxprotocold keys add myImportedWallet --recover
```

### 4. Add an offline wallet

`dydxprotocold` allows you to add the public key of someone else’s wallet, so that you can, for example, work with a multisig containing that wallet. The section can help obtain a wallet’s public key.&#x20;

To add it to your setup, execute the following command, adjusting the name `offllineWallet` accordingly

```bash
$ dydxprotocold keys add offllineWallet --pubkey='{"@type":"/cosmos.crypto.secp256k1.PubKey","key":"A9QEyr+iQoCI...6IjzVG2vEMf"}'
- address: dydx1cza...069c
  name: offllineWallet
  pubkey: '{"@type":"/cosmos.crypto.secp256k1.PubKey","key":"A9QEyr+iQoCI...6IjzVG2vEMf"}'
  type: offline
```

### 5. Connect a Ledger HW wallet

{% hint style="warning" %}
💡 If you encounter the following error during the process, please perform the steps in Ledger Wallet and try again.

`Error: failed to generate ledger key: failed to retrieve device: ledger nano S: hidapi: failed to open device`
{% endhint %}

1. Connect your Ledger device to your workstation&#x20;
2. Make sure the Cosmos App is installed - open it&#x20;
3. Run the following command: (note that `myLedgerWallet` is an arbitrary name - you can choose your own name)

```bash
dydxprotocold keys add myLedgerWallet --ledger
- address: dydx1cza...069c
 name: myLedgerWallet
 pubkey: '{"@type":"/cosmos.crypto.secp256k1.PubKey","key":"A9QEyr+iQoCI...6IjzVG2vEMf"}'
 type: ledger
```

To output the wallet address in the Ledger device - this will allow you to review the address on the device.

```bash
dydxprotocold keys show myLedgerWallet --device
```

{% hint style="info" %}
Every time you use dydxprotocold with `myLedgerWallet` you will need to have your Ledger device connected, the Cosmos app open on it
{% endhint %}

### 6. Rename a wallet

```bash
dydxprotocold keys rename <old name> <new name>
```

{% hint style="info" %}
💡 On MacOS, this may require you to input your password in Keychain several times.
{% endhint %}

### 7. Query token balances

You can list the tokens balances of an address with

```bash
dydxprotocold query bank balances dydx1y66c5c7zpcqxqgqec9ttutuwu60qkzav22h3ue
balances:
- amount: "22071848837500000000"
  denom: adydx
pagination:
  next_key: null
  total: "0"
```

### 8. Send a transaction

```bash
dydxprotocold tx bank send <from> <to> <amount><denom> --fees <fee amount><feedenom>
```

* `from:`can be either wallet name, or wallet address, but it cannot be an offline wallet&#x20;
* `to:`is the recipient’s wallet address&#x20;
* `amount denom:`e.g. 1000000000000000000 adydx for sending 1 DYDX&#x20;
* `fee amount denom:`e.g. 5000000000000000 adydx - this value may need adjustment

Let's take a look at an example on testnet:

```bash

$ dydxprotocold tx bank send testnetWallet \
dydx14zzueazeh0hj67cghhf9jypslcf9sh2n5k6art \
100000000000000000adv4tnt \
--fees 5000000000000000adv4tnt \
--node https://dydx-testnet-rpc.polkachu.com:443 \
--chain-id dydx-testnet-4


auth_info:
  fee:
    amount:
    - amount: "5000000000000000"
      denom: adv4tnt
    gas_limit: "200000"
    granter: ""
    payer: ""
  signer_infos: []
  tip: null
body:
  extension_options: []
  memo: ""
  messages:
  - '@type': /cosmos.bank.v1beta1.MsgSend
    amount:
    - amount: "100000000000000000"
      denom: adv4tnt
    from_address: dydx14zzueazeh0hj67cghhf9jypslcf9sh2n5k6art
    to_address: dydx14zzueazeh0hj67cghhf9jypslcf9sh2n5k6art
  non_critical_extension_options: []
  timeout_height: "0"
signatures: []
code: 0
codespace: ""
data: ""
events: []
gas_used: "0"
gas_wanted: "0"
height: "0"
info: ""
logs: []
raw_log: '[]'
timestamp: ""
tx: null
txhash: 985DB721FF8B65DB5FCAF57C93599DEDA5B5EDF7C24C8013112CE8752C7E2866

```

{% hint style="info" %}
For mainnet, pass `--chain-id dydx-mainnet-1` instead. Also make sur the node is a mainnet RPC endpoint.
{% endhint %}

### 9. Vote for a proposal

```bash
dydxprotocold query gov proposals
```

View a specific proposal details

```bash
$ dydxprotocold query gov proposal 22

deposit_end_time: "2024-02-28T06:16:24.014055663Z"
final_tally_result:
  abstain_count: "289052466830663152761344"
  no_count: "4808846255497145968117"
  no_with_veto_count: "19555000000000000000"
  yes_count: "90144414592955946800079127"
id: "22"
messages:
- '@type': /dydxprotocol.prices.MsgCreateOracleMarket
  authority: dydx10d07y265gmmuvt4z0w9aw880jnsr700jnmapky
  params:
    exchange_config_json: '{"exchanges":[{"exchangeName":"Binance","ticker":"STRKUSDT","adjustByMarket":"USDT-USD"},{"exchangeName":"Bybit","ticker":"STRKUSDT","adjustByMarket":"USDT-USD"},{"exchangeName":"Kraken","ticker":"STRKUSD"},{"exchangeName":"Kucoin","ticker":"STRK-USDT","adjustByMarket":"USDT-USD"},{"exchangeName":"Okx","ticker":"STRK-USDT","adjustByMarket":"USDT-USD"},{"exchangeName":"Gate","ticker":"STRK_USDT","adjustByMarket":"USDT-USD"}]}'
    exponent: -9
    id: 43
    min_exchanges: 3
    min_price_change_ppm: 4000
    pair: STRK-USD
- '@type': /dydxprotocol.perpetuals.MsgCreatePerpetual
  authority: dydx10d07y265gmmuvt4z0w9aw880jnsr700jnmapky
  params:
    atomic_resolution: -6
    default_funding_ppm: 0
    id: 43
    liquidity_tier: 2
    market_id: 43
    ticker: STRK-USD
- '@type': /dydxprotocol.clob.MsgCreateClobPair
  authority: dydx10d07y265gmmuvt4z0w9aw880jnsr700jnmapky
  clob_pair:
    id: 43
    perpetual_clob_metadata:
      perpetual_id: 43
    quantum_conversion_exponent: -9
    status: STATUS_INITIALIZING
    step_base_quantums: "1000000"
    subticks_per_tick: 1000000
- '@type': /dydxprotocol.delaymsg.MsgDelayMessage
  authority: dydx10d07y265gmmuvt4z0w9aw880jnsr700jnmapky
  delay_blocks: 3600
  msg:
    '@type': /dydxprotocol.clob.MsgUpdateClobPair
    authority: dydx1mkkvp26dngu6n8rmalaxyp3gwkjuzztq5zx6tr
    clob_pair:
      id: 43
      perpetual_clob_metadata:
        perpetual_id: 43
      quantum_conversion_exponent: -9
      status: STATUS_ACTIVE
      step_base_quantums: "1000000"
      subticks_per_tick: 1000000
metadata: ""
proposer: dydx19rl2uqr87c6sv8p7lhg9yz4mde3cdaluk4ss5w
status: PROPOSAL_STATUS_PASSED
submit_time: "2024-02-21T06:16:24.014055663Z"
summary: Add the x/prices, x/perpetuals and x/clob parameters needed for a STRK-USD
  perpetual market. Create the market in INITIALIZING status and transition it to
  ACTIVE status after 3600 blocks.
title: Add STRK-USD perpetual market
total_deposit:
- amount: "2000000000000000000000"
  denom: adydx
voting_end_time: "2024-02-25T06:16:24.014055663Z"
voting_start_time: "2024-02-21T06:16:24.014055663Z"
```

### 10. Submit vote

```bash
dydxprotocold tx gov vote <proposal id> <option> --from <addres or wallet name> --fees 
```

* `option`: should be either Yes , No , NoWithVeto , or Abstain&#x20;
* `Fees`: 5000000000000000adydx - this value may need some adjustment

### 11. Query vote tally

```bash
$ dydxprotocold query gov tally 22

abstain_count: "289052466830663152761344"
no_count: "4808846255497145968117"
no_with_veto_count: "19555000000000000000"
yes_count: "90144414592955946800079127"
```
