Skip to content

Commit

Permalink
Merge pull request #553 from eco-stake/full-authz
Browse files Browse the repository at this point in the history
Full UI Authz functionality
  • Loading branch information
tombeynon committed Jul 10, 2022
2 parents 69e3fd8 + a14848a commit 24e802b
Show file tree
Hide file tree
Showing 28 changed files with 843 additions and 378 deletions.
12 changes: 6 additions & 6 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

32 changes: 11 additions & 21 deletions scripts/base.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,13 @@ import { add, bignumber, floor, smaller, smallerEq } from 'mathjs'
import { DirectSecp256k1HdWallet } from "@cosmjs/proto-signing";
import { Slip10RawIndex, pathToString } from "@cosmjs/crypto";

import { Wallet } from "@ethersproject/wallet";
import { ETH } from "@tharsis/address-converter";
import Bech32 from "bech32";
import { Wallet as EthWallet } from "@ethersproject/wallet";

import { MsgDelegate } from "cosmjs-types/cosmos/staking/v1beta1/tx.js";
import { MsgExec } from "cosmjs-types/cosmos/authz/v1beta1/tx.js";

import Network from '../src/utils/Network.mjs'
import Wallet from '../src/utils/Wallet.mjs';
import AutostakeHealth from "../src/utils/AutostakeHealth.mjs";
import {coin, timeStamp, mapSync, executeSync, overrideNetworks, parseGrants} from '../src/utils/Helpers.mjs'
import EthSigner from '../src/utils/EthSigner.mjs';
Expand Down Expand Up @@ -106,7 +105,9 @@ export class Autostake {

timeStamp('Starting', network.prettyName)

const { wallet, botAddress, slip44 } = await this.getWallet(network)
const { signer, slip44 } = await this.getSigner(network)
const wallet = new Wallet(network, signer)
const botAddress = await wallet.getAddress()

timeStamp('Bot address is', botAddress)

Expand All @@ -123,7 +124,7 @@ export class Autostake {
await network.connect()
if (!network.restUrl) throw new Error('Could not connect to REST API')

const client = await network.signingClient(wallet)
const client = wallet.signingClient
client.registry.register("/cosmos.authz.v1beta1.MsgExec", MsgExec)

return {
Expand All @@ -135,7 +136,7 @@ export class Autostake {
}
}

async getWallet(network){
async getSigner(network){
let slip44
if(network.data.autostake?.correctSlip44 || network.slip44 === 60){
if(network.slip44 === 60) timeStamp('Found ETH coin type')
Expand All @@ -152,28 +153,17 @@ export class Autostake {
];
slip44 != 118 && timeStamp('Using HD Path', pathToString(hdPath))

const wallet = await DirectSecp256k1HdWallet.fromMnemonic(this.mnemonic, {
let signer = await DirectSecp256k1HdWallet.fromMnemonic(this.mnemonic, {
prefix: network.prefix,
hdPaths: [hdPath]
});

if(network.slip44 === 60){
return await this.getEthWallet(network, wallet)
const ethSigner = EthWallet.fromMnemonic(this.mnemonic);
signer = EthSigner(signer, ethSigner, network.prefix)
}

const accounts = await wallet.getAccounts()
const botAddress = accounts[0].address

return { wallet, botAddress, slip44 }
}

async getEthWallet(network, signer){
const wallet = Wallet.fromMnemonic(this.mnemonic);
const ethereumAddress = await wallet.getAddress();
const data = ETH.decoder(ethereumAddress);
const botAddress = Bech32.encode(network.prefix, Bech32.toWords(data))

return { wallet: EthSigner(signer, wallet), botAddress, slip44: 60 }
return { signer, slip44 }
}

checkBalance(client) {
Expand Down
115 changes: 115 additions & 0 deletions src/components/AddressModal.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,115 @@
import React, { useState, useEffect } from 'react';

import {
Modal,
Table,
Form,
Button
} from 'react-bootstrap'

import {
XCircle,
Eye,
Key
} from 'react-bootstrap-icons'
import CopyToClipboard from 'react-copy-to-clipboard';

function AddressModal(props) {
const { show, network, networks, favouriteAddresses, updateFavouriteAddresses } = props
const [newAddress, setNewAddress] = useState('')
const [newLabel, setNewLabel] = useState('')
const [selectedNetwork, setSelectedNetwork] = useState(network)

const networkAddresses = (selectedNetwork && favouriteAddresses[selectedNetwork.path]) || []

useEffect(() => {
setSelectedNetwork(network)
}, [network])

function onHide(){
props.onHide()
}

function updateAddress(address, label){
updateFavouriteAddresses({...favouriteAddresses, [network.path]: networkAddresses.map(data => {
if(data.address === address){
return {...data, label}
}
return data
})})
}

function removeAddress(address){
updateFavouriteAddresses({...favouriteAddresses, [network.path]: networkAddresses.filter(data => data.address !== address)})
}

function addAddress(){
if(!validNewAddress()) return

updateFavouriteAddresses({...favouriteAddresses, [network.path]: [...networkAddresses, {address: newAddress, label: newLabel}]})
setNewAddress('')
setNewLabel('')
}

function validNewAddress(){
return newAddress !== '' && !networkAddresses.some(el => el.address === newAddress)
}

return (
<>
<Modal size="lg" show={show} onHide={() => onHide()}>
<Modal.Header closeButton>
<Modal.Title>Saved Addresses</Modal.Title>
</Modal.Header>
<Modal.Body className="small">
<select className="form-select mb-2" aria-label="Network" value={selectedNetwork?.path} onChange={(e) => setSelectedNetwork(networks.find(el => el.path === e.target.value))}>
{networks.map(network => {
return <option key={network.path} value={network.path}>{network.prettyName}</option>
})}
</select>
{selectedNetwork && (
<Table className="align-middle table-striped">
<thead>
<tr>
<th>Address</th>
<th>Label</th>
<th></th>
</tr>
</thead>
<tbody>
{networkAddresses.map(({ label, address }) => {
return (
<tr key={address}>
<td>
<CopyToClipboard text={address}>
<span role="button">{address}</span>
</CopyToClipboard>
</td>
<td><Form.Control value={label || ''} onChange={(e) => updateAddress(address, e.target.value)} /></td>
<td>
<XCircle role="button" onClick={() => removeAddress(address)} />
{props.wallet?.address === address && (
<span className="ps-2"><Key /></span>
)}
{props.address === address && (
<span className="ps-2"><Eye /></span>
)}
</td>
</tr>
)
})}
<tr>
<td><Form.Control placeholder={`${selectedNetwork.prefix}1...`} value={newAddress} isInvalid={newAddress !== '' && !validNewAddress()} onChange={(e) => setNewAddress(e.target.value)} /></td>
<td><Form.Control value={newLabel} onChange={(e) => setNewLabel(e.target.value)} /></td>
<td><Button variant="secondary" size="sm" onClick={addAddress}>Save</Button></td>
</tr>
</tbody>
</Table>
)}
</Modal.Body>
</Modal>
</>
);
}

export default AddressModal
4 changes: 2 additions & 2 deletions src/components/App.css
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ code p{

.favourite-on .on,
.favourite-off .off {
display: inline;
display: block;
}

.favourite-on .off,
Expand All @@ -64,7 +64,7 @@ code p{
@media (hover: hover) {
.favourite-on:hover .off,
.favourite-off:hover .on {
display: inline;
display: block;
}

.favourite-on:hover .on,
Expand Down
Loading

0 comments on commit 24e802b

Please sign in to comment.