Skip to content

Commit

Permalink
hacked bob
Browse files Browse the repository at this point in the history
  • Loading branch information
hashhavoccat committed May 4, 2024
1 parent 9cc6ef8 commit 478a4e4
Show file tree
Hide file tree
Showing 4 changed files with 132 additions and 42 deletions.
2 changes: 1 addition & 1 deletion internal/commands/bob/tokens/ft/ft.go
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ func CreateFungibleTokensCommand(props *props.AppProps) *cli.Command {
table: t,
viewportBottom: vpBottom,
viewportTop: vpTop,
client: props.HeroClient,
client: props.BobClient,
logger: props.Logger,
}

Expand Down
76 changes: 37 additions & 39 deletions internal/commands/bob/tokens/ft/table.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,8 @@ package ft

import (
"fmt"
"os"
"sort"
"strconv"
"strings"

"github.com/phuslu/log"

Expand All @@ -14,7 +12,7 @@ import (
tea "github.com/charmbracelet/bubbletea"
"github.com/charmbracelet/lipgloss"
"github.com/hashhavoc/teller/internal/common"
"github.com/hashhavoc/teller/pkg/api/hiro"
"github.com/hashhavoc/teller/pkg/api/gobob"
"github.com/hashhavoc/teller/pkg/utils"
)

Expand All @@ -25,7 +23,7 @@ type tableModel struct {
viewportTop viewport.Model
selected table.Row

client *hiro.APIClient
client *gobob.APIClient
logger log.Logger

windowHeight int
Expand Down Expand Up @@ -129,7 +127,7 @@ func (m tableModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
utils.OpenBrowser("https://explorer.gobob.xyz/token/" + selectedRow[4])
case "h":
m.selected = m.table.SelectedRow()
holders, err := m.client.GetTokenHolders(m.selected[4], 0)
holders, err := m.client.GetTokenHolders(m.selected[4])
if err != nil {
m.logger.Error().Err(err).Msg("Failed to get contract details")
return m, nil
Expand All @@ -156,36 +154,36 @@ func (m tableModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
return m, nil
}
m.logger.Info().Msg("Table dumped to tokens.csv")
case "s":
selectedRow := m.table.SelectedRow()
contract, err := m.client.GetContractSource(selectedRow[4])
if err != nil {
m.logger.Error().Err(err).Msg("Failed to get contract source")
return m, nil
}

var builder strings.Builder
builder.WriteString(selectedRow[0])
builder.WriteString("-")
builder.WriteString(selectedRow[1])
builder.WriteString("-")
builder.WriteString(selectedRow[4])
builder.WriteString(".clar")
filename := builder.String()

file, err := os.Create(filename)
if err != nil {
m.logger.Error().Err(err).Msg("Failed to create file")
return m, nil
}
defer file.Close()

_, err = file.WriteString(contract)
if err != nil {
m.logger.Error().Err(err).Msg("Failed to write to file")
return m, nil
}
m.viewportBottom.SetContent(fmt.Sprintf("Contract source saved to %s", filename))
// case "s":
// selectedRow := m.table.SelectedRow()
// contract, err := m.client.GetContractSource(selectedRow[4])
// if err != nil {
// m.logger.Error().Err(err).Msg("Failed to get contract source")
// return m, nil
// }

// var builder strings.Builder
// builder.WriteString(selectedRow[0])
// builder.WriteString("-")
// builder.WriteString(selectedRow[1])
// builder.WriteString("-")
// builder.WriteString(selectedRow[4])
// builder.WriteString(".clar")
// filename := builder.String()

// file, err := os.Create(filename)
// if err != nil {
// m.logger.Error().Err(err).Msg("Failed to create file")
// return m, nil
// }
// defer file.Close()

// _, err = file.WriteString(contract)
// if err != nil {
// m.logger.Error().Err(err).Msg("Failed to write to file")
// return m, nil
// }
// m.viewportBottom.SetContent(fmt.Sprintf("Contract source saved to %s", filename))
}
}
}
Expand All @@ -209,12 +207,12 @@ func (m tableModel) View() string {
m.viewportBottom.View())
}

func generateHolderTableData(holders hiro.ContractHoldersResponse, i int) []common.TableData {
func generateHolderTableData(holders []gobob.TokenHolderItem, i int) []common.TableData {
var dataRows []common.TableData
for k, d := range holders {
strData := common.InsertDecimal(d, i)
for _, d := range holders {
strData := common.InsertDecimal(d.Value, i)
row := common.TableData{
k,
d.Address.Hash,
strData,
}
dataRows = append(dataRows, row)
Expand Down
53 changes: 51 additions & 2 deletions pkg/api/gobob/gobob.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,6 @@ func (c *APIClient) GetAllTokens() ([]TokenItems, error) {
url = fmt.Sprintf("%s/api/v2/tokens?%s", c.BaseURL, v.Encode())
}

fmt.Println(url)
req, err := http.NewRequest("GET", url, nil)
if err != nil {
return nil, err
Expand All @@ -50,7 +49,7 @@ func (c *APIClient) GetAllTokens() ([]TokenItems, error) {
defer res.Body.Close()

if res.StatusCode != 200 {
return nil, fmt.Errorf("failed to get contract source: %s", res.Status)
return nil, fmt.Errorf("failed to get all tokens: %s", res.Status)
}

body, err := io.ReadAll(res.Body)
Expand All @@ -73,3 +72,53 @@ func (c *APIClient) GetAllTokens() ([]TokenItems, error) {

return allResults, nil
}

func (c *APIClient) GetTokenHolders(contractId string) ([]TokenHolderItem, error) {
var allResults []TokenHolderItem
var params TokenHoldersNextPageParams

for {
var url string
if params == (TokenHoldersNextPageParams{}) {
url = fmt.Sprintf("%s/api/v2/tokens/%s/holders", c.BaseURL, contractId)
} else {
v, _ := query.Values(params)
url = fmt.Sprintf("%s/api/v2/tokens/%s/holders?%s", c.BaseURL, contractId, v.Encode())
}

req, err := http.NewRequest("GET", url, nil)
if err != nil {
return nil, err
}
req.Header.Add("Accept", "application/json")

res, err := c.Client.Do(req)
if err != nil {
return nil, err
}
defer res.Body.Close()

if res.StatusCode != 200 {
return nil, fmt.Errorf("failed to get token holders: %s", res.Status)
}

body, err := io.ReadAll(res.Body)
if err != nil {
return nil, err
}

var response TokenHoldersResponse
err = json.Unmarshal(body, &response)
if err != nil {
return nil, err
}
allResults = append(allResults, response.Items...)
params = response.NextPageParams

if response.NextPageParams == (TokenHoldersNextPageParams{}) {
break
}
}

return allResults, nil
}
43 changes: 43 additions & 0 deletions pkg/api/gobob/structs.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,3 +27,46 @@ type NextPageParams struct {
MarketCap string `json:"market_cap" url:"market_cap"`
Name string `json:"name" url:"name"`
}

type TokenHoldersResponse struct {
Items []TokenHolderItem `json:"items,omitempty"`
NextPageParams TokenHoldersNextPageParams `json:"next_page_params,omitempty"`
}
type TokenHolderAddress struct {
EnsDomainName string `json:"ens_domain_name,omitempty"`
Hash string `json:"hash,omitempty"`
ImplementationName string `json:"implementation_name,omitempty"`
IsContract bool `json:"is_contract,omitempty"`
IsVerified string `json:"is_verified,omitempty"`
Metadata string `json:"metadata,omitempty"`
Name string `json:"name,omitempty"`
PrivateTags []string `json:"private_tags,omitempty"`
PublicTags []string `json:"public_tags,omitempty"`
WatchlistNames []string `json:"watchlist_names,omitempty"`
}
type TokenHolderToken struct {
Address string `json:"address,omitempty"`
CirculatingMarketCap string `json:"circulating_market_cap,omitempty"`
Decimals string `json:"decimals,omitempty"`
ExchangeRate string `json:"exchange_rate,omitempty"`
Holders string `json:"holders,omitempty"`
IconURL string `json:"icon_url,omitempty"`
Name string `json:"name,omitempty"`
Symbol string `json:"symbol,omitempty"`
TotalSupply string `json:"total_supply,omitempty"`
Type string `json:"type,omitempty"`
Volume24H string `json:"volume_24h,omitempty"`
}

type TokenHolderItem struct {
Address TokenHolderAddress `json:"address,omitempty"`
Token TokenHolderToken `json:"token,omitempty"`
TokenID string `json:"token_id,omitempty"`
Value string `json:"value,omitempty"`
}

type TokenHoldersNextPageParams struct {
AddressHash string `json:"address_hash,omitempty" url:"address_hash,omitempty"`
ItemsCount int `json:"items_count,omitempty" url:"items_count,omitempty"`
Value int64 `json:"value,omitempty" url:"value,omitempty"`
}

0 comments on commit 478a4e4

Please sign in to comment.