SwapChan
Never holds your keys ยท your wallet signs
blocktools CLI

Ethereum keystore JSON (UTC--... file, MyEtherWallet, Geth)

Password in secrets/keystore.pw. Test vector: the Web3 Secret Storage spec's scrypt example (password testpassword).

Password in secrets/keystore.pw. Test vector: the Web3 Secret Storage spec's scrypt example (password testpassword).

./blocktools run 'classify /in/keystore.json'


./blocktools run 'read-file /secrets/keystore.pw /in/keystore.json | keystore-open'

Sweep: recipes/recover.sh in/keystore.json 0xDEST --password-file secrets/keystore.pw --chain-id 1 (see chain-ethereum.md). ERC-20 tokens need a gas top-up first (tx-build --topup).

Presale wallet (2014 Ethereum crowdsale JSON: encseed, ethaddr, email, btcaddr)

classify reports eth_presale; keystore-open reads it with the same input (password line, then the JSON) and recover.sh sweeps it like a keystore. Algorithm as in go-ethereum accounts/keystore/presale.go: an AES-128 key from PBKDF2-HMAC-SHA256 with the password as its own salt; encseed = IV || AES-128-CBC(seed); private key = keccak256(seed). The format has no MAC: a wrong password gives wrong_password because the padding fails or the derived address is not ethaddr. Test vectors: go-ethereum's TestImportPreSaleKey file (password foo, address 0xd4584b5F6229b7BE90727b0FC8C6b91BB427821f) and one generated independently in Python (crates/secrets/src/keystore.rs tests; e2e: scripts/e2e.d/recover.sh presale).