Skip to content

Commit

Permalink
Merge branch 'dev' into feat/link-suggest
Browse files Browse the repository at this point in the history
  • Loading branch information
jacobryas4 authored Sep 22, 2023
2 parents ffb6c33 + af0bc08 commit 0cf4f32
Show file tree
Hide file tree
Showing 7 changed files with 215 additions and 19 deletions.
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,7 @@ The usage guide for the Cacti chatbot is available [here](./usage_guide.md)

## Steps to add new widget command
- Update `widgets.yaml` with the widget command details
- If no value has to be returned please specify an empty string '' for `return_value_description`
- Increment the numeric version in `WIDGET_INDEX_NAME` constant in `utils/constants.py`
- For local env, the widget index name would use your OS login name to create an isolated index. For dev/prod, the widget index would be the numeric version mentioned above. (more info in `scripts/check_update_widget_index.py`)
- Run this Python command to update your widget index with the new widget `python -m scripts.check_update_widget_index`
Expand Down
32 changes: 31 additions & 1 deletion chat/display_widgets.py
Original file line number Diff line number Diff line change
Expand Up @@ -170,7 +170,37 @@ def _widgetize_inner(command: str, params: str, depth: int = 0) -> str:
lines.append(f"yield protocol borrow action for borrow token: {items[0]}, borrow amount: {items[1]}, collateral token: {items[2]}, collateral amount: {items[3]}.")
elif command == 'yield-protocol-borrow-close':
items = params.split(",")
lines.append(f"yield protocol borrow close action: {items[0]}")
lines.append(f"yield protocol borrow close action: {items[0]}")
elif command == 'hop-protocol-bridge':
items = params.split(",")
lines.append(f"hop protocol bridge action for amount: {items[0]}, token symbol: {items[1]}, from chain: {items[2]}, to chain: {items[3]}.")
elif command == 'tx-replay':
items = params.split(",")
lines.append(f"replay transaction with tx hash: {items[0]}")
elif command == "deposit-eth-lido":
items = params.split(",")
lines.append(f"deposit eth to lido action for amount: {items[0]}.")
elif command == "withdraw-eth-lido":
items = params.split(",")
lines.append(f"withdraw eth from lido action for amount: {items[0]}.")
elif command == "deposit-eth-reth":
items = params.split(",")
lines.append(f"deposit eth to reth action for amount: {items[0]}.")
elif command == "withdraw-eth-reth":
items = params.split(",")
lines.append(f"withdraw eth from reth action for amount: {items[0]}.")
elif command == 'savings-dai-deposit':
items = params.split(",")
lines.append(f"DAI deposit action for amount: {items[0]}.")
elif command == 'savings-dai-withdraw':
items = params.split(",")
lines.append(f"DAI withdraw action for amount: {items[0]}.")
elif command == 'deposit-vault':
items = params.split(",")
lines.append(f"Deposit vault action for token: {items[0]}, amount: {items[1]}.")
elif command == 'withdraw-vault':
items = params.split(",")
lines.append(f"Withdraw vault action for token: {items[0]}, amount: {items[1]}.")
else:
# assert 0, f'unrecognized command: {command}({params})'
lines.append(f"An unrecognized command: {command}({params})")
Expand Down
Empty file added integrations/__init__.py
Empty file.
54 changes: 38 additions & 16 deletions integrations/center.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,11 @@
import requests
import web3

from fastapi.responses import Response

import env
import utils
import auth

from utils import ETH_MAINNET_CHAIN_ID, nft, FetchError, ExecError
import utils.timing as timing
Expand All @@ -26,8 +29,7 @@
#"polygon-mainnet",
]

API_URL = "https://api.center.dev/v1"
API_V2_URL = "https://api.center.dev/v2"
API_URL = "https://api.center.dev"

MAX_RESULTS = 12
PAGE_LIMIT = 12
Expand Down Expand Up @@ -126,6 +128,7 @@ class NFTAsset(ContainerMixin):
preview_image_url: str
description: str = ''
price: Optional[str] = None
attributes: Optional[ List ] = None

def container_name(self) -> str:
return 'display-nft-asset-container'
Expand Down Expand Up @@ -214,7 +217,7 @@ def fetch_nft_search(search_str: str) -> Generator[Union[NFTCollection, NFTAsset
))
count = 0
for network in NETWORKS:
url = f"{API_V2_URL}/{network}/search?{q}"
url = f"{API_URL}/v2/{network}/search?{q}"
timing.log('search_begin')
response = requests.get(url, headers=HEADERS)
try:
Expand Down Expand Up @@ -295,7 +298,7 @@ def fetch_nft_search_collection_by_trait(network: str, address: str, trait_name:
limit=limit,
offset=offset,
))
url = f"{API_URL}/{network}/{address}/assets/searchByTraits?{q}"
url = f"{API_URL}/v1/{network}/{address}/assets/searchByTraits?{q}"
response = requests.post(url, headers=headers, json=payload)
try:
response.raise_for_status()
Expand Down Expand Up @@ -337,15 +340,15 @@ def fetch_nft_search_collection_by_trait(network: str, address: str, trait_name:


def fetch_nft_collection(network: str, address: str) -> NFTCollection:
url = f"{API_V2_URL}/{network}/{address}/nft/metadata"
url = f"{API_URL}/v2/{network}/{address}/nft/metadata"
response = requests.get(url, headers=HEADERS)
response.raise_for_status()
obj = response.json()
num_assets = obj['totalSupply']
if num_assets == 0: # seems to return 0 incorrectly
# use the asset endpoint with dummy token
token_id = 1
url = f"{API_V2_URL}/{network}/{address}/nft/{token_id}/metadata"
url = f"{API_URL}/v2/{network}/{address}/nft/{token_id}/metadata"
response = requests.get(url, headers=HEADERS)
if response.status_code == 200:
token_obj = response.json()
Expand Down Expand Up @@ -375,7 +378,7 @@ def fetch_nft_collection_assets(network: str, address: str) -> NFTCollectionAsse
{"Address": address, "TokenID": token_id}
for token_id in token_ids[offset: offset + limit]
]}
url = f"{API_URL}/{network}/assets"
url = f"{API_URL}/v1/{network}/assets"
response = requests.post(url, headers=HEADERS, json=payload)
try:
response.raise_for_status()
Expand All @@ -400,6 +403,7 @@ def fetch_nft_collection_assets(network: str, address: str) -> NFTCollectionAsse
name=item['name'],
preview_image_url=item['mediumPreviewImageUrl'],
price=price,

)
if not _is_valid_asset(asset):
continue
Expand Down Expand Up @@ -434,7 +438,7 @@ def fetch_nft_collection_assets_for_sale(network: str, address: str) -> Generato
{"Address": address, "TokenID": token_id}
for token_id in token_ids[offset: offset + limit]
]}
url = f"{API_URL}/{network}/assets"
url = f"{API_URL}/v1/{network}/assets"
response = requests.post(url, headers=HEADERS, json=payload)
try:
response.raise_for_status()
Expand Down Expand Up @@ -482,7 +486,7 @@ def fetch_nft_collection_traits(network: str, address: str) -> NFTCollectionTrai
limit=limit,
offset=offset,
))
url = f"{API_URL}/{network}/{address}/traits?{q}"
url = f"{API_URL}/v1/{network}/{address}/traits?{q}"
response = requests.get(url, headers=HEADERS)
try:
response.raise_for_status()
Expand Down Expand Up @@ -525,7 +529,7 @@ def fetch_nft_collection_trait_values(network: str, address: str, trait: str) ->
limit=limit,
offset=offset,
))
url = f"{API_URL}/{network}/{address}/traits/{trait}?{q}"
url = f"{API_URL}/v1/{network}/{address}/traits/{trait}?{q}"
response = requests.get(url, headers=HEADERS)
try:
response.raise_for_status()
Expand Down Expand Up @@ -557,24 +561,26 @@ def fetch_nft_collection_trait_values(network: str, address: str, trait: str) ->


def fetch_nft_asset(network: str, address: str, token_id: str) -> NFTAsset:
url = f"{API_URL}/{network}/{address}/{token_id}"
url = f"{API_URL}/v2/{network}/{address}/nft/{token_id}/metadata"
response = requests.get(url, headers=HEADERS)
response.raise_for_status()
obj = response.json()
return NFTAsset(
network=network,
address=address,
token_id=token_id,
collection_name=obj['collectionName'],
name=obj['name'],
preview_image_url=obj['mediumPreviewImageUrl'],
collection_name=obj['collection']['name'],
name=obj['metadata']['name'],
preview_image_url=f"{API_URL}{obj['media']['small']}",
# image_url=f"{API_URL}{obj['media']['medium']}",
description=obj['metadata']['description'],
attributes=obj['metadata']['attributes'],
)


def fetch_nft_asset_traits(network: str, address: str, token_id: str) -> NFTAssetTraits:
price = _fetch_nft_asset_price_str(network, address, token_id)
url = f"{API_URL}/{network}/{address}/{token_id}"
url = f"{API_URL}/v1/{network}/{address}/{token_id}"
response = requests.get(url, headers=HEADERS)
response.raise_for_status()
obj = response.json()
Expand Down Expand Up @@ -622,7 +628,7 @@ def fetch_nfts_owned_by_address_or_domain(network: str, address_or_domain: str)
limit=limit,
offset=offset,
))
url = f"{API_V2_URL}/{normalized_network}/{address_or_domain}/nfts-owned?{q}"
url = f"{API_URL}/v2/{normalized_network}/{address_or_domain}/nfts-owned?{q}"

try:
response = requests.get(url, headers=HEADERS)
Expand Down Expand Up @@ -691,3 +697,19 @@ def _fetch_nft_asset_price_str(network: str, address: str, token_id: str) -> Opt
else:
price = None
return price

@auth.authenticate_user_id()
def fetch_center_image(response, network: str, address: str, token_id: str, size: str, user_id:str=None):

url = f"{API_URL}/v2/{network}/{address}/nft/{token_id}/render/{size}"
resp = requests.get(url, headers=HEADERS)

# Check if user is authenticated
if not user_id: return None

# return response.content
if resp.status_code != 200:
# Handle error appropriately, return a message, or another status code
return Response(content="Could not retrieve image", status_code=resp.status_code)

return Response(content=resp.content)
138 changes: 138 additions & 0 deletions knowledge_base/widgets.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -717,3 +717,141 @@
- borrowToken
type: object
return_value_description: ""
- _name_: display_hop_protocol_bridge
description: use the hop protocol to bridge/deposit tokens from a supported chain to a different supported chain
parameters:
properties:
amount:
description: token amount
type: string
tokenSymbol:
description: token symbol
type: string
fromChain:
description: chain to bridge from
type: string
toChain:
description: chain to bridge to
type: string
required:
- amount
- tokenSymbol
- fromChain
- toChain
type: object
return_value_description: ""
- _name_: display_tx_replay
description: replay a transaction with the same parameters
parameters:
properties:
txHash:
description: the transaction with tx hash to replay
type: string
required:
- txHash
type: object
return_value_description: ""
- _name_: display_deposit_eth_lido
description: This widget is only used when the user wants to deposit/stake ETH into the Lido protocol to get steth
parameters:
properties:
amount:
description: Amount of ETH to deposit/stake into Lido (and obtain stETH)
type: string
required:
- amount
type: object
return_value_description: ''
- _name_: display_withdraw_eth_lido
description: This widget is only used when the user wants to withdraw ETH from Lido (convert stETH to ETH)
parameters:
properties:
amount:
description: Amount of ETH to withdraw from Lido
type: string
required:
- amount
type: object
return_value_description: ''
- _name_: deposit_eth_reth
description: This widget is only used when the user wants to deposit ETH into the rocket pool protocol to get rETH
parameters:
properties:
amount:
description: Amount of ETH to deposit into rocket pool (and obtain rETH)
type: string
required:
- amount
type: object
return_value_description: ''
- _name_: display_withdraw_eth_reth
description: This widget is only used when the user wants to withdraw ETH from rETH (convert rETH to ETH)
parameters:
properties:
amount:
description: Amount of ETH to withdraw from rocket pool
type: string
required:
- amount
type: object
return_value_description: ''
- _name_: display_savings_dai_deposit
description: Used to deposit DAI into the DAI savings account.
parameters:
properties:
amount:
description: Amount of DAI to deposit.
type: string
required:
- amount
type: object
return_value_description: ''
- _name_: display_savings_dai_withdraw
description: Used to withdraw DAI from the DAI savings account.
parameters:
properties:
amount:
description: Amount of DAI to withdraw.
type: string
required:
- amount
type: object
return_value_description: ''
- _name_: display_deposit_vault
description: Used to deposit a token into a vault
parameters:
properties:
depositToken:
description: Token to deposit into the vault.
type: string
amount:
description: Amount of token to deposit.
type: string
vault:
description: Vault to deposit the token in.
type: string
required:
- depositToken
- amount
- vault
type: object
return_value_description: ''
- _name_: display_withdraw_vault
description: Used to withdraw a token from a vault
parameters:
properties:
withdrawToken:
description: Token to withdraw from the vault.
type: string
amount:
description: Amount of token to withdraw.
type: string
vault:
description: Vault to withdraw the token in.
type: string
required:
- withdrawToken
- amount
- vault
type: object
return_value_description: ''
7 changes: 6 additions & 1 deletion main.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,10 @@
from dataclasses import dataclass
from typing import Any, Dict, Optional, Set

from fastapi import FastAPI, Request, Response, Body, WebSocket, WebSocketDisconnect
from fastapi import FastAPI, Request, WebSocket, WebSocketDisconnect
from fastapi.middleware.cors import CORSMiddleware
from starlette.middleware.sessions import SessionMiddleware
from fastapi.responses import StreamingResponse

import server
import chat
Expand All @@ -15,6 +16,7 @@
from app import chat as app_chat
from app import share as app_share

from integrations import center

app = FastAPI()

Expand Down Expand Up @@ -80,6 +82,9 @@ class ClientState:
async def api_nonce(request: Request):
return auth.api_nonce(request)

@app.get("/center_image/{network}/{address}/{token_id}/{size}")
async def fetch_nft_image(request: Request, network: str, address: str, token_id: str, size: str):
return center.fetch_center_image(request, network, address, token_id, size)

@app.post("/login")
async def api_login(request: Request, data: auth.AcceptJSON):
Expand Down
Loading

0 comments on commit 0cf4f32

Please sign in to comment.