{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true,
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "### Sign message by Ethereum address"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "\n",
      "Ethereum address 0x748097fc1a3c8ea7ab83bc4e6eeebb5ff783a2e7\n",
      "private key: 0x3e4f18c8d4e2f34c281485ccd4d8b1941ab4f21d0db5ae139f59d15d6bcffa09\n",
      "\n",
      "Bostrom address: bostrom1phsqglvjxm4n3463yarzf6qma4wpqg4h6ms3h9\n",
      "Cosmos address: cosmos1phsqglvjxm4n3463yarzf6qma4wpqg4hegyzfz\n",
      "seed: 'wrestle slide please stuff oil odor estate original wrestle toilet valve rebel tunnel basket scheme myself margin fly pyramid fox when whip height evoke'\n",
      "\n",
      "message: {\"nickname\": \"john\", \"avatar_cid\": \"QmNqdEgYJwe8QSZvcpBXqcNoG9BRoSf71q6mJLe3aRhZAW\", \"gift_claiming_address_type\": \"ethereum\", \"gift_claiming_address\": \"0x748097fC1a3c8ea7aB83BC4e6eeebB5fF783A2e7\", \"target_address\": \"bostrom1phsqglvjxm4n3463yarzf6qma4wpqg4h6ms3h9\", \"relay_reward\": \"0.01\"}\n",
      "\n",
      "message signature: 0x7574df94fa11eb9b097149c34e161a38220d4ca231a00ffa884a7d6de474301f7b742e674f5e21ac3f287f0500b2a20298f854a5698c41bcd0d5fc4b73173e5f1b\n",
      "\n",
      "\n",
      "Ethereum address 0x7fc49137179a320e6064b2a3079dc49995739248\n",
      "private key: 0xa11d6dec785574e9f8f9eb06227802515b268d34e248797d4064173bdba2a588\n",
      "\n",
      "Bostrom address: bostrom1g7aaxxmnzg3yh0j4qnj5ws5tshw2nkg97zt30z\n",
      "Cosmos address: cosmos1g7aaxxmnzg3yh0j4qnj5ws5tshw2nkg9a3lz39\n",
      "seed: 'dawn theory craft comfort tribe day hamster click merge hunt icon foot oval help never myself taste exchange episode pear dutch grass this unit'\n",
      "\n",
      "message: {\"nickname\": \"john\", \"avatar_cid\": \"QmNqdEgYJwe8QSZvcpBXqcNoG9BRoSf71q6mJLe3aRhZAW\", \"gift_claiming_address_type\": \"ethereum\", \"gift_claiming_address\": \"0x7fC49137179A320e6064b2A3079dC49995739248\", \"target_address\": \"bostrom1g7aaxxmnzg3yh0j4qnj5ws5tshw2nkg97zt30z\", \"relay_reward\": \"0.01\"}\n",
      "\n",
      "message signature: 0x9c50f1224ad9b61ac415d59f85599415c7ac43f17420e09869e8f05063a850c768931e12adfa8b49580175235eebc084323978d8e1cc7bd701d3938a33658d1d1c\n",
      "\n",
      "\n",
      "Ethereum address 0xa31877153b567e2a9b53cb7287335b65a85840eb\n",
      "private key: 0x176f0a2e75102b69b149c89377be69b3f654a76d321c7b9db46d36617878ed68\n",
      "\n",
      "Bostrom address: bostrom1r3vcguw2378dhmf6sxe0q38dyw350faczs077q\n",
      "Cosmos address: cosmos1r3vcguw2378dhmf6sxe0q38dyw350facprmdq8\n",
      "seed: 'honey top crouch feed carbon horn plastic wheat ranch torch puzzle toilet limb boat reason okay select utility seed carry velvet wash scrap dolphin'\n",
      "\n",
      "message: {\"nickname\": \"john\", \"avatar_cid\": \"QmNqdEgYJwe8QSZvcpBXqcNoG9BRoSf71q6mJLe3aRhZAW\", \"gift_claiming_address_type\": \"ethereum\", \"gift_claiming_address\": \"0xa31877153B567E2A9B53CB7287335B65A85840eb\", \"target_address\": \"bostrom1r3vcguw2378dhmf6sxe0q38dyw350faczs077q\", \"relay_reward\": \"0.01\"}\n",
      "\n",
      "message signature: 0x0d75fc2d71a988a3115cc3bd50c2a58f524d0a34d5f6153d4283854448e7ca2d59abcdf70f34ea8017e6146503f8211bbb1b911da102241921d0c43c3a7591371b\n"
     ]
    }
   ],
   "source": [
    "from web3.auto import w3\n",
    "from cyberpy import generate_wallet, address_to_address\n",
    "from eth_account.messages import encode_defunct\n",
    "import json\n",
    "for _ in range(3):\n",
    "    # Generate Ethereum wallet\n",
    "    ethereum_wallet = w3.eth.account.create('KEY PHRASE')\n",
    "    print(f'\\n\\nEthereum address {ethereum_wallet.address.lower()}\\nprivate key: {ethereum_wallet.privateKey.hex()}')\n",
    "\n",
    "    # Generate Bostrom and Cosmos wallet\n",
    "    bostrom_wallet = generate_wallet()\n",
    "    bostrom_wallet['cosmos_address'] = address_to_address(bostrom_wallet['address'], 'cosmos')\n",
    "    print(f\"\\nBostrom address: {bostrom_wallet['address']}\\nCosmos address: {bostrom_wallet['cosmos_address']}\\nseed: '{bostrom_wallet['seed']}'\")\n",
    "\n",
    "    # Create message\n",
    "    message_json = {\n",
    "        \"nickname\": \"john\",\n",
    "        \"avatar_cid\": \"QmNqdEgYJwe8QSZvcpBXqcNoG9BRoSf71q6mJLe3aRhZAW\",\n",
    "        \"gift_claiming_address_type\": \"ethereum\",\n",
    "        \"gift_claiming_address\": ethereum_wallet.address,\n",
    "        \"target_address\": bostrom_wallet['address'],\n",
    "        \"relay_reward\": \"0.01\"\n",
    "    }\n",
    "    message = json.dumps(message_json)\n",
    "    print(f'\\nmessage: {message}')\n",
    "\n",
    "    # Sign message form Ethereum address\n",
    "    signed_message = \\\n",
    "        w3.eth.account.sign_message(\n",
    "            signable_message=encode_defunct(text=message),\n",
    "            private_key=ethereum_wallet.privateKey)\n",
    "    print(f'\\nmessage signature: {signed_message.signature.hex()}')"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "#### Verify message"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%% md\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Signer address: 0xa31877153B567E2A9B53CB7287335B65A85840eb\n"
     ]
    }
   ],
   "source": [
    "signer_address = \\\n",
    "    w3.eth.account.recover_message(\n",
    "        signable_message=encode_defunct(text=message),\n",
    "        signature=signed_message.signature.hex()\n",
    "        )\n",
    "print(f'Signer address: {signer_address}')"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "### Sign message by Cosmos address\n",
    "*TODO: add script for signature generation. You can sign a message only in the Keplr extension now*\n",
    "\n",
    "\n",
    "message:\n",
    "```json\n",
    "{\"nickname\":\"bob-cosmos\",\"avatar_cid\":\"QmU1Nf2opJGZGNWmqxAa9bb8X6wVSHRBDCY6nbm3RmVXGb\",\"gift_claiming_address_type\":\"cosmos\",\"gift_claiming_address\":\"cosmos1qjjjur5et06eszh82pfv7kvdnu3sur23x00t3g\",\"target_address\":\"bostrom1qjjjur5et06eszh82pfv7kvdnu3sur239umc00\",\"relay_reward\":\"0.01\"}\n",
    "```\n",
    "signature:\n",
    "`CvMkqkQHVPV3DTyVErth16OdTjAwqQD6t+r9ImSpdwUZFin+UPeGSfH9hhuAmqYAp4CffhNNSEisdfzwwvlN/w==`\n",
    "\n",
    "\n"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%% md\n"
    }
   }
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 0
}

Local Graph