text: const createKeccakHash  = require('keccak')
  const RLP               = require('rlp')
  const secp256k1         = require('secp256k1')
  let bip32               = require('bip32')
  let bip39               = require('bip39')
  let bip44               = require('bip44-constants'), BIP44 = {}
  let Base58              = require('base-58')
  const key               = require('./key')
  bip44.splice(450, 0, [ 0x800001c8, 'SEELE', 'Seele' ]) // right before 'AE'
  for ( var c of bip44 ) { BIP44[c[1]] = { name: c[2], index: c[0] - 2147483648 } }
  bip44 = BIP44
  
  const maxShard    = 4
  
  /** @namespace*/
  var wallet = {
  
  
    /**
     * @method
     * @param {string} word A string of mnemonic words
     * @return {object} Account object containing 4 keypairs, one from each of 4 shards
     * @example
     * wallet.fromWord()
     * // returns
     */
    fromWord: function accountFromWord(word){
      // check word validity
      return this.fromSeed(bip39.mnemonicToSeedSync(word).toString('hex'))
    },
  
  
    /**
     * @method
     * @param {string} seed A string of seed in base 58
     * @return {object} Account object containing 4 keypairs, one from each of 4 shards
     * @example
     * wallet.fromSeed()
     * // returns
     */
    fromSeed: function accountFromSeed(seed){
      // check seed validity
      var seedB = Buffer.from(seed, 'hex')
      var account = []
      var root = bip32.fromSeed(seedB);
      for ( var shard = 1 ; shard <= maxShard ; shard++ ){
        var info = {
          shard: null,
          privateKey: null,
          address: null
        }, i = 0;
        while( info.shard != shard ){
          var path = `m/44'/${bip44.SEELE.index}'/0'/0/${i}`
          var node = root.derivePath(path)
          var priv = '0x'+node.privateKey.toString('hex')
          var addr = key.addof(priv)
          var shrd = key.shard(addr)
          info.shard      = shrd
          info.privateKey = priv
          info.address    = addr
          info.index      = i
          i++;
        }
        account.push(info)
      }
      return account
    },
  
  
    /**
     * @method
     * @param {string} word A string of mnemonic words
     * @param {number} depth The number of addresses to discover
     * @return {object} Object containing shard distribution and address by index
     * @example
     * wallet.distWord()
     * // returns
     */
    distWord: function distributionFromWord(word, depth){
      return this.distSeed(bip39.mnemonicToSeedSync(word), depth)
    },
  
  
    /**
     * @method
     * @param {string} seed A string of seed in base 58
     * @param {number} depth The number of addresses to discover
     * @return {object} Object containing shard distribution and address by index
     * @example
     * wallet.distSeed()
     * // returns
     */
    distSeed: function distributionFromSeed(seed, depth){
      var i = 0, shards = []
      var root = bip32.fromSeed(seed);
      while ( i < depth ) {
        var path = `m/44'/${bip44.SEELE.index}'/0'/0/${i}`
        // console.log(path);
        var node = root.derivePath(path)
        var priv = '0x'+node.privateKey.toString('hex')
        var addr = key.addof(priv)
        var shrd = key.shard(addr)
        shards.push({
          'index': i,
          'shard': shrd,
          'address': addr
        })
        i++;
      }
      return shards;
    }
  }
  
  
  module.exports = wallet
  