mango-explorer/mango/spltokenlookup.py

83 lines
3.0 KiB
Python

# # ⚠ Warning
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
# LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
# NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
# [🥭 Mango Markets](https://mango.markets/) support is available at:
# [Docs](https://docs.mango.markets/)
# [Discord](https://discord.gg/67jySBhxrg)
# [Twitter](https://twitter.com/mangomarkets)
# [Github](https://github.com/blockworks-foundation)
# [Email](mailto:hello@blockworks.foundation)
import json
import logging
import os.path
import typing
from decimal import Decimal
from solana.publickey import PublicKey
from .token import Token
from .tokenlookup import TokenLookup
# # 🥭 SplTokenLookup class
#
# This class allows us to look up token data specifically from Solana static data.
#
# The Solana static data is the [Solana token list](https://raw.githubusercontent.com/solana-labs/token-list/main/src/tokens/solana.tokenlist.json) provided by Serum.
#
# You can load an `SplTokenLookup` class by something like:
# ```
# with open("solana.tokenlist.json") as json_file:
# token_data = json.load(json_file)
# token_lookup = TokenLookup(token_data)
# ```
#
class SplTokenLookup(TokenLookup):
DefaultDataFilepath = os.path.join(os.path.dirname(__file__), "../data/solana.tokenlist.json")
def __init__(self, token_data: typing.Dict) -> None:
self.logger: logging.Logger = logging.getLogger(self.__class__.__name__)
self.token_data = token_data
def find_by_symbol(self, symbol: str) -> typing.Optional[Token]:
for token in self.token_data["tokens"]:
if token["symbol"] == symbol:
return Token(token["symbol"], token["name"], PublicKey(token["address"]), Decimal(token["decimals"]))
return None
def find_by_mint(self, mint: PublicKey) -> typing.Optional[Token]:
mint_string: str = str(mint)
for token in self.token_data["tokens"]:
if token["address"] == mint_string:
return Token(token["symbol"], token["name"], PublicKey(token["address"]), Decimal(token["decimals"]))
return None
def find_by_symbol_or_raise(self, symbol: str) -> Token:
token = self.find_by_symbol(symbol)
if token is None:
raise Exception(f"Could not find token with symbol '{symbol}'.")
return token
def find_by_mint_or_raise(self, mint: PublicKey) -> Token:
token = self.find_by_mint(mint)
if token is None:
raise Exception(f"Could not find token with mint {mint}.")
return token
@staticmethod
def load(filename: str) -> "TokenLookup":
with open(filename) as json_file:
token_data = json.load(json_file)
return SplTokenLookup(token_data)