Skip to content

Instantly share code, notes, and snippets.

@bennofs
Created June 30, 2022 19:31
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save bennofs/5393ae681f84aa59bd9b18c242eaede8 to your computer and use it in GitHub Desktop.
Save bennofs/5393ae681f84aa59bd9b18c242eaede8 to your computer and use it in GitHub Desktop.
#!/usr/bin/env python3
"""Contains code for parsing the IDL file."""
from hashlib import sha256
from keyword import kwlist
from dataclasses import dataclass, field, asdict, make_dataclass, fields as dc_fields
from types import MappingProxyType
from typing import List, Union, Optional, Dict, Any, Literal, Tuple, TypedDict, TypeVar, Type, Mapping, cast, Protocol
import re
import typing
from apischema import deserialize, alias
from apischema.metadata import conversion
from borsh_construct import (
CStruct,
TupleStruct,
Vec,
Enum,
Bool,
U8,
I8,
U16,
I16,
U32,
I32,
F32,
U64,
I64,
F64,
U128,
I128,
String,
Option,
)
import solana.publickey # noqa: WPS301
from construct import Adapter, Bytes, Construct, Padding, IfThenElse, Switch, Renamed, Container, Sequence
class BorshPubkeyAdapter(Adapter):
def __init__(self) -> None:
super().__init__(Bytes(32)) # type: ignore
def _decode(self, obj: bytes, context, path) -> solana.publickey.PublicKey:
return solana.publickey.PublicKey(obj)
def _encode(self, obj: solana.publickey.PublicKey, context, path) -> bytes:
return bytes(obj)
BorshPubkey = BorshPubkeyAdapter()
class COption(Adapter):
_discriminator_key = "discriminator"
_value_key = "value"
def __init__(self, subcon: Construct) -> None:
option_struct = CStruct(
self._discriminator_key / U8,
self._value_key
/ IfThenElse(
lambda this: this[self._discriminator_key] == 0,
Padding(subcon.sizeof()),
subcon,
),
)
super().__init__(option_struct) # type: ignore
def _decode(self, obj, context, path) -> Any:
discriminator = obj[self._discriminator_key]
return None if discriminator == 0 else obj[self._value_key]
def _encode(self, obj, context, path) -> dict:
discriminator = 0 if obj is None else 1
return {self._discriminator_key: discriminator, self._value_key: obj}
T = TypeVar("T")
class _DataclassStruct(Adapter):
"""Converts dataclasses to/from `borsh_construct.CStruct`."""
def __init__(self, cstruct: CStruct, datacls: Type[T]) -> None:
"""Init.
Args:
cstruct: The underlying `CStruct`.
datacls: The dataclass type.
"""
super().__init__(cstruct) # type: ignore
self.datacls = datacls
def _decode(self, obj: Container, context, path) -> T:
kwargs = {}
for key, value in obj.items():
if key[0] != "_":
key_to_use = f"{key}_" if key in kwlist else key
kwargs[key_to_use] = value
return self.datacls(**kwargs) # type: ignore
def _encode(self, obj: T, context, path) -> Dict[str, Any]:
if isinstance(obj, dict):
return obj
return asdict(obj)
_LiteralStrings = Literal[
"bool",
"u8",
"i8",
"u16",
"i16",
"u32",
"i32",
"f32",
"u64",
"i64",
"f64",
"u128",
"i128",
"bytes",
"string",
"publicKey",
]
_NonLiteralIdlTypes = Union[
"_IdlTypeVec",
"_IdlTypeOption",
"_IdlTypeCOption",
"_IdlTypeDefined",
"_IdlTypeArray",
]
_IdlType = Union[_NonLiteralIdlTypes, _LiteralStrings]
# We have to define these wrappers because snake and upper_camel
# don't have annotations
RE_TO_SNAKE = re.compile(r'(?<!^)(?=[A-Z])')
def underscore(s: str) -> str:
return RE_TO_SNAKE.sub('_', s).lower()
def camelize(s: str) -> str:
return ''.join(word.title() for word in s.split('_'))
snake_case_conversion = conversion(underscore, camelize)
@dataclass
class _IdlTypeVec:
"""IDL vector type."""
vec: _IdlType
@dataclass
class _IdlTypeOption:
"""IDL option type."""
option: _IdlType
@dataclass
class _IdlTypeCOption:
"""IDL coption type."""
coption: _IdlType
@dataclass
class _IdlTypeDefined:
"""IDL type that points to a user-defined type."""
defined: str
@dataclass
class _IdlField:
"""IDL representation of a field.
Used in instructions and user-defined types.
"""
name: str = field(metadata=snake_case_conversion)
type: _IdlType
_IdlSeed = Any
@dataclass
class _IdlPda:
seeds: List[_IdlSeed]
program_id: Optional[_IdlSeed] = None
@dataclass
class _IdlAccount:
"""IDL account type."""
name: str = field(metadata=snake_case_conversion)
is_mut: bool = field(metadata=alias("isMut"))
is_signer: bool = field(metadata=alias("isSigner"))
pda: Optional[_IdlPda] = None
@dataclass
class _IdlAccounts:
"""Nested/recursive version of _IdlAccount."""
name: str = field(metadata=snake_case_conversion)
accounts: List["_IdlAccountItem"]
_IdlAccountItem = Union[_IdlAccounts, _IdlAccount]
@dataclass
class _IdlInstruction:
"""IDL representation of a program instruction."""
name: str = field(metadata=snake_case_conversion)
accounts: List[_IdlAccountItem]
args: List[_IdlField]
returns: Optional[_IdlType] = None
_IdlEnumFieldsNamed = List[_IdlField]
_IdlEnumFieldsTuple = List[_IdlType]
_IdlEnumFields = Union[_IdlEnumFieldsNamed, _IdlEnumFieldsTuple]
@dataclass
class _IdlEnumVariant:
"""IDL representation of a variant of an enum."""
name: str
fields: Optional[_IdlEnumFields] = None
_IdlTypeDefStruct = List[_IdlField]
@dataclass
class _IdlTypeDefTyStruct:
"""IDL representation of a struct."""
fields: _IdlTypeDefStruct
kind: Literal["struct"] = "struct"
@dataclass
class _IdlTypeDefTyEnum:
"""IDL representation of an enum."""
variants: List[_IdlEnumVariant]
kind: Literal["enum"] = "enum"
_IdlTypeDefTy = Union[_IdlTypeDefTyEnum, _IdlTypeDefTyStruct]
@dataclass
class _IdlTypeDef:
"""IDL representation of a user-defined type."""
name: str
type: _IdlTypeDefTy
@dataclass
class _IdlAccountDef:
"""IDL representation of an account."""
name: str
type: _IdlTypeDefTyStruct
_IdlStateMethod = _IdlInstruction
@dataclass
class _IdlState:
"""IDL representation of a program state method."""
struct: _IdlTypeDef
methods: List[_IdlStateMethod]
@dataclass
class _IdlTypeArray:
"""IDL array type."""
array: Tuple[_IdlType, int]
@dataclass
class _IdlEventField:
"""IDL representation of an event field."""
name: str
type: _IdlType
index: bool
@dataclass
class _IdlConstant:
"""IDL representation of a constant value."""
name: str
type: _IdlType
value: str
@dataclass
class _IdlEvent:
"""IDL representation of an event.
Composed of a list of event fields.
"""
name: str
fields: List[_IdlEventField]
@dataclass
class _IdlErrorCode:
"""IDL error code type."""
code: int
name: str
msg: Optional[str] = None
@dataclass
class _Metadata:
"""IDL metadata field."""
address: str
@dataclass
class Idl:
"""A parsed IDL object."""
version: str
name: str
instructions: List[_IdlInstruction]
state: Optional[_IdlState] = None
accounts: List[_IdlAccountDef] = field(default_factory=list)
types: List[_IdlTypeDef] = field(default_factory=list)
events: List[_IdlEvent] = field(default_factory=list)
errors: List[_IdlErrorCode] = field(default_factory=list)
constants: List[_IdlConstant] = field(default_factory=list)
metadata: Optional[_Metadata] = None
@classmethod
def from_json(cls, idl: Dict[str, Any]) -> "Idl":
"""Generate a parsed IDL from a JSON dict.
Args:
idl: The raw IDL dict.
Returns:
The parsed Idl object.
"""
return deserialize(cls, idl)
def _idl_address(program_id: solana.publickey.PublicKey) -> solana.publickey.PublicKey:
"""Deterministic IDL address as a function of the program id.
Args:
program_id: The program ID.
Returns:
The public key of the IDL.
"""
base = solana.publickey.PublicKey.find_program_address([], program_id)[0]
return solana.publickey.PublicKey.create_with_seed(base, "anchor:idl", program_id)
class IdlProgramAccount(TypedDict):
"""The on-chain account of the IDL."""
authority: solana.publickey.PublicKey
data: bytes
IDL_ACCOUNT_LAYOUT = CStruct("authority" / BorshPubkey, "data" / Vec(U8))
def _decode_idl_account(data: bytes) -> IdlProgramAccount:
"""Decode on-chain IDL.
Args:
data: binary data from the account that stores the IDL.
Returns:
Decoded IDL.
"""
return IDL_ACCOUNT_LAYOUT.parse(data)
_AccountDefOrTypeDef = Union[_IdlTypeDef, _IdlAccountDef]
_AccountDefsOrTypeDefs = typing.Sequence[_AccountDefOrTypeDef]
FIELD_TYPE_MAP: Mapping[str, Construct] = MappingProxyType(
{
"bool": Bool,
"u8": U8,
"i8": I8,
"u16": U16,
"i16": I16,
"u32": U32,
"i32": I32,
"f32": F32,
"u64": U64,
"i64": I64,
"f64": F64,
"u128": U128,
"i128": I128,
"bytes": Bytes,
"string": String,
"publicKey": BorshPubkey,
},
)
_enums_cache: dict[tuple[str, str], Enum] = {}
def _handle_enum_variants(
idl_enum: _IdlTypeDefTyEnum,
types: _AccountDefsOrTypeDefs,
name: str,
) -> Enum:
dict_key = (name, str(idl_enum))
try:
return _enums_cache[dict_key]
except KeyError:
result = _handle_enum_variants_no_cache(idl_enum, types, name)
_enums_cache[dict_key] = result
return result
def _handle_enum_variants_no_cache(
idl_enum: _IdlTypeDefTyEnum,
types: _AccountDefsOrTypeDefs,
name: str,
) -> Enum:
variants = []
dclasses = {}
for variant in idl_enum.variants:
variant_name = variant.name
if variant.fields is None:
variants.append(variant_name)
else:
variant_fields = variant.fields
if isinstance(variant_fields[0], _IdlField):
fields = []
named_fields = cast(_IdlEnumFieldsNamed, variant_fields)
for fld in named_fields:
fields.append(_field_layout(fld, types))
cstruct = CStruct(*fields)
datacls = _idl_enum_fields_named_to_dataclass_type(
named_fields,
variant_name,
)
dclasses[variant_name] = datacls
renamed = variant_name / cstruct
else:
fields = []
unnamed_fields = cast(_IdlEnumFieldsTuple, variant_fields)
for type_ in unnamed_fields:
fields.append(_type_layout(type_, types))
tuple_struct = TupleStruct(*fields)
renamed = variant_name / tuple_struct
variants.append(renamed) # type: ignore
enum_without_types = Enum(*variants, enum_name=name)
if dclasses:
for cname in enum_without_types.enum._sumtype_constructor_names:
try:
dclass = dclasses[cname]
except KeyError:
continue
dclass_fields = dc_fields(dclass)
constructr = getattr(enum_without_types.enum, cname)
for constructor_field in constructr._sumtype_attribs:
attrib = constructor_field[1] # type: ignore
fld_name = constructor_field[0] # type: ignore
dclass_field = [f for f in dclass_fields if f.name == fld_name][0]
attrib.type = dclass_field.type # type: ignore
return enum_without_types
def _typedef_layout_without_field_name(
typedef: _AccountDefOrTypeDef,
types: _AccountDefsOrTypeDefs,
) -> Construct:
typedef_type = typedef.type
name = typedef.name
if isinstance(typedef_type, _IdlTypeDefTyStruct):
field_layouts = [_field_layout(field, types) for field in typedef_type.fields]
cstruct = CStruct(*field_layouts)
datacls = _idl_typedef_ty_struct_to_dataclass_type(typedef_type, name)
return _DataclassStruct(cstruct, datacls=datacls)
elif isinstance(typedef_type, _IdlTypeDefTyEnum):
return _handle_enum_variants(typedef_type, types, name)
unknown_type = typedef_type.kind
raise ValueError(f"Unknown type {unknown_type}")
def _typedef_layout(
typedef: _AccountDefOrTypeDef,
types: list[_IdlTypeDef],
field_name: str,
) -> Construct:
"""Map an IDL typedef to a `Construct` object.
Args:
typedef: The IDL typedef object.
types: IDL type definitions.
field_name: The name of the field.
Raises:
ValueError: If an unknown type is passed.
Returns:
`Construct` object from `borsh-construct`.
""" # noqa: DAR402
return field_name / _typedef_layout_without_field_name(typedef, types)
def _type_layout(type_: _IdlType, types: _AccountDefsOrTypeDefs) -> Construct:
if isinstance(type_, str):
return FIELD_TYPE_MAP[type_]
field_type = cast(
_NonLiteralIdlTypes,
type_,
)
if isinstance(field_type, _IdlTypeVec):
return Vec(_type_layout(field_type.vec, types))
elif isinstance(field_type, _IdlTypeOption):
return Option(_type_layout(field_type.option, types))
elif isinstance(field_type, _IdlTypeCOption):
return COption(_type_layout(field_type.coption, types))
elif isinstance(field_type, _IdlTypeDefined):
defined = field_type.defined
if not types:
raise ValueError("User defined types not provided")
filtered = [t for t in types if t.name == defined]
if len(filtered) != 1:
raise ValueError(f"Type not found {defined}")
return _typedef_layout_without_field_name(filtered[0], types)
elif isinstance(field_type, _IdlTypeArray):
array_ty = field_type.array[0]
array_len = field_type.array[1]
inner_layout = _type_layout(array_ty, types)
return inner_layout[array_len]
raise ValueError(f"Type {field_type} not implemented yet")
def _field_layout(field: _IdlField, types: _AccountDefsOrTypeDefs) -> Construct:
"""Map IDL spec to `borsh-construct` types.
Args:
field: field object from the IDL.
types: IDL type definitions.
Raises:
ValueError: If the user-defined types are not provided.
ValueError: If the type is not found.
ValueError: If the type is not implemented yet.
Returns:
`Construct` object from `borsh-construct`.
""" # noqa: DAR402
field_name = field.name if field.name else ""
return field_name / _type_layout(field.type, types)
def _make_datacls(name: str, fields: list[str]) -> type:
return make_dataclass(name, fields)
_idl_typedef_ty_struct_to_dataclass_type_cache: dict[tuple[str, str], Type] = {}
def _idl_typedef_ty_struct_to_dataclass_type(
typedef_type: _IdlTypeDefTyStruct,
name: str,
) -> Type:
dict_key = (name, str(typedef_type))
try:
return _idl_typedef_ty_struct_to_dataclass_type_cache[dict_key]
except KeyError:
result = _idl_typedef_ty_struct_to_dataclass_type_no_cache(typedef_type, name)
_idl_typedef_ty_struct_to_dataclass_type_cache[dict_key] = result
return result
def _idl_typedef_ty_struct_to_dataclass_type_no_cache(
typedef_type: _IdlTypeDefTyStruct,
name: str,
) -> Type:
"""Generate a dataclass definition from an IDL struct.
Args:
typedef_type: The IDL type.
name: The name of the dataclass.
Returns:
Dataclass definition.
"""
dataclass_fields = []
for field in typedef_type.fields:
field_name = field.name
field_name_to_use = f"{field_name}_" if field_name in kwlist else field_name
dataclass_fields.append(
field_name_to_use,
)
return _make_datacls(name, dataclass_fields)
_idl_enum_fields_named_to_dataclass_type_cache: dict[tuple[str, str], Type] = {}
def _idl_enum_fields_named_to_dataclass_type(
fields: _IdlEnumFieldsNamed,
name: str,
) -> Type:
dict_key = (name, str(fields))
try:
return _idl_enum_fields_named_to_dataclass_type_cache[dict_key]
except KeyError:
result = _idl_enum_fields_named_to_dataclass_type_no_cache(fields, name)
_idl_enum_fields_named_to_dataclass_type_cache[dict_key] = result
return result
def _idl_enum_fields_named_to_dataclass_type_no_cache(
fields: _IdlEnumFieldsNamed,
name: str,
) -> Type:
"""Generate a dataclass definition from IDL named enum fields.
Args:
fields: The IDL enum fields.
name: The name of the dataclass.
Returns:
Dataclass type definition.
"""
dataclass_fields = []
for field in fields:
field_name = field.name
field_name_to_use = f"{field_name}_" if field_name in kwlist else field_name
dataclass_fields.append(
field_name_to_use,
)
return _make_datacls(name, dataclass_fields)
def _idl_typedef_to_python_type(
typedef: _AccountDefOrTypeDef,
types: _AccountDefsOrTypeDefs,
) -> Type:
"""Generate Python type from IDL user-defined type.
Args:
typedef: The user-defined type.
types: IDL type definitions.
Raises:
ValueError: If an unknown type is passed.
Returns:
The Python type.
"""
typedef_type = typedef.type
if isinstance(typedef_type, _IdlTypeDefTyStruct):
return _idl_typedef_ty_struct_to_dataclass_type(
typedef_type,
typedef.name,
)
elif isinstance(typedef_type, _IdlTypeDefTyEnum):
return _handle_enum_variants(typedef_type, types, typedef.name).enum
unknown_type = typedef_type.kind
raise ValueError(f"Unknown type {unknown_type}")
def _sighash(ix_name: str) -> bytes:
"""Not technically sighash, since we don't include the arguments.
(Because Rust doesn't allow function overloading.)
Args:
ix_name: The instruction name.
Returns:
The sighash bytes.
"""
formatted_str = f"global:{ix_name}"
return sha256(formatted_str.encode()).digest()[:8]
class _Sighash(Adapter):
"""Sighash as a Construct Adapter."""
def __init__(self) -> None:
"""Initialize."""
super().__init__(Bytes(8)) # type: ignore
def _encode(self, obj: str, context, path) -> bytes:
return _sighash(obj)
def _decode(self, obj: bytes, context, path):
raise ValueError("Sighash cannot be reversed")
class InstructionCoder(Adapter):
"""Encodes and decodes program instructions."""
def __init__(self, idl: Idl) -> None:
"""Init.
Args:
idl: The parsed IDL object.
"""
self.ix_layout = _parse_ix_layout(idl)
sighasher = _Sighash()
sighash_layouts: Dict[bytes, Construct] = {}
sighashes: Dict[str, bytes] = {}
sighash_to_name: Dict[bytes, str] = {}
for ix in idl.instructions:
sh = sighasher.build(ix.name)
sighashes[ix.name] = sh
sighash_layouts[sh] = self.ix_layout[ix.name]
sighash_to_name[sh] = ix.name
self.sighash_layouts = sighash_layouts
self.sighashes = sighashes
self.sighash_to_name = sighash_to_name
subcon = Sequence(
"sighash" / Bytes(8),
Switch(lambda this: this.sighash, sighash_layouts),
)
super().__init__(subcon) # type: ignore
def _decode(self, obj: Tuple[bytes, Any], context, path) -> dict[str, Any]:
return { 'data': obj[1], 'name': self.sighash_to_name[obj[0]] }
_SA = TypeVar("_SA", bound="_SupportsAdd")
class _SupportsAdd(Protocol):
"""Any type T where +(:T, :T) -> T."""
def __add__(self: _SA, other: _SA) -> _SA:
...
def _parse_ix_layout(idl: Idl) -> Dict[str, Construct]:
ix_layout: Dict[str, Construct] = {}
for ix in idl.instructions:
typedefs = cast(_SupportsAdd, idl.accounts) + cast(_SupportsAdd, idl.types)
field_layouts = [
_field_layout(arg, cast(_AccountDefsOrTypeDefs, typedefs))
for arg in ix.args
]
ix_layout[ix.name] = ix.name / CStruct(*field_layouts)
return ix_layout
#!/usr/bin/env python3
VOTE_PROGRAM_ID = 'Vote111111111111111111111111111111111111111'
SYSTEM_PROGRAM_ID = '11111111111111111111111111111111'
STAKE_PROGRAM_ID = 'Stake11111111111111111111111111111111111111'
SPL_TOKEN_ID = 'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA'
SPL_ATA_ID = 'ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL'
SCAM_NOOP_PROGRAM_ID = 'DeJBGdMFa1uynnnKiwrVioatTuHmNLpyFKnmB5kaFdzQ'
WSOL_MINT_ID = 'So11111111111111111111111111111111111111112'
TOKEN_RENT_EXEMPT_AMOUNT = 2039280
STAKE_RENT_EXEMPT_AMOUNT = 2282880
BPF_LOADER_ID = 'BPFLoader2111111111111111111111111111111111'
BPF_UPGRADEABLE_LOADER_ID = 'BPFLoaderUpgradeab1e11111111111111111111111'
JUP_ID = 'JUP2jxvXaqu7NQY1GmNF4m1vodw12LVXYxbFL2uJvfo'
ORCA_ID = '9W959DqEETiGZocYWCQPaJ6sBmUzgfxXfqGeTEdp3aQP'
RAYDIUM_V4_ID = '675kPX9MHTjS2zt1qfr1NYHuzeLXfQM9H24wFSUt1Mp8'
#!/usr/bin/env python3
"""Fetch staking rewards for the given solana account addresses
Usage:
fetch-staking-rewards.py [options] PUBKEY...
Options:
-u URL,--rpc=URL Solana RPC API endpoint [default: https://api.mainnet-beta.solana.com]
-f FILE, --file=FILE CSV File to write the reward records to [default: rewards.csv]
"""
from docopt import docopt
from lib import SolRpc, fetch_staking_rewards
def main():
args = docopt(__doc__ or "")
rpc = SolRpc(args["--rpc"])
fetch_staking_rewards(rpc, args['PUBKEY'], args['--file'])
if __name__ == "__main__":
main()
{
"version": "0.0.0",
"name": "vault",
"instructions": [
{
"name": "createVaultMetadata",
"accounts": [
{
"name": "management",
"isMut": false,
"isSigner": false
},
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "vaultMetadataAccount",
"isMut": true,
"isSigner": false
},
{
"name": "ammId",
"isMut": false,
"isSigner": false
},
{
"name": "ammOpenOrders",
"isMut": false,
"isSigner": false
},
{
"name": "ammQuantitiesOrTargetOrders",
"isMut": false,
"isSigner": false
},
{
"name": "poolCoinTokenaccount",
"isMut": false,
"isSigner": false
},
{
"name": "poolPcTokenaccount",
"isMut": false,
"isSigner": false
},
{
"name": "serumMarket",
"isMut": false,
"isSigner": false
},
{
"name": "serumBids",
"isMut": false,
"isSigner": false
},
{
"name": "serumAsks",
"isMut": false,
"isSigner": false
},
{
"name": "serumEventQueue",
"isMut": false,
"isSigner": false
},
{
"name": "serumCoinVaultAccount",
"isMut": false,
"isSigner": false
},
{
"name": "serumPcVaultAccount",
"isMut": false,
"isSigner": false
},
{
"name": "serumVaultSigner",
"isMut": false,
"isSigner": false
},
{
"name": "lpMintAddress",
"isMut": false,
"isSigner": false
},
{
"name": "poolId",
"isMut": false,
"isSigner": false
},
{
"name": "poolAuthority",
"isMut": false,
"isSigner": false
},
{
"name": "poolLpTokenaccount",
"isMut": false,
"isSigner": false
},
{
"name": "poolRewardTokenaccount",
"isMut": false,
"isSigner": false
},
{
"name": "swapOrLiquidityProgramId",
"isMut": false,
"isSigner": false
},
{
"name": "systemProgram",
"isMut": false,
"isSigner": false
},
{
"name": "rent",
"isMut": false,
"isSigner": false
},
{
"name": "ammAuthority",
"isMut": false,
"isSigner": false
},
{
"name": "serumProgramId",
"isMut": false,
"isSigner": false
}
],
"args": [
{
"name": "slippage",
"type": "u64"
},
{
"name": "rayPoolVersion",
"type": "u64"
}
]
},
{
"name": "applyVaultMetadata",
"accounts": [
{
"name": "management",
"isMut": false,
"isSigner": false
},
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "vaultMetadataAccount",
"isMut": true,
"isSigner": false
},
{
"name": "ammId",
"isMut": false,
"isSigner": false
},
{
"name": "ammOpenOrders",
"isMut": false,
"isSigner": false
},
{
"name": "ammQuantitiesOrTargetOrders",
"isMut": false,
"isSigner": false
},
{
"name": "poolCoinTokenaccount",
"isMut": false,
"isSigner": false
},
{
"name": "poolPcTokenaccount",
"isMut": false,
"isSigner": false
},
{
"name": "serumMarket",
"isMut": false,
"isSigner": false
},
{
"name": "serumBids",
"isMut": false,
"isSigner": false
},
{
"name": "serumAsks",
"isMut": false,
"isSigner": false
},
{
"name": "serumEventQueue",
"isMut": false,
"isSigner": false
},
{
"name": "serumCoinVaultAccount",
"isMut": false,
"isSigner": false
},
{
"name": "serumPcVaultAccount",
"isMut": false,
"isSigner": false
},
{
"name": "serumVaultSigner",
"isMut": false,
"isSigner": false
},
{
"name": "lpMintAddress",
"isMut": false,
"isSigner": false
},
{
"name": "poolId",
"isMut": false,
"isSigner": false
},
{
"name": "poolAuthority",
"isMut": false,
"isSigner": false
},
{
"name": "poolLpTokenaccount",
"isMut": false,
"isSigner": false
},
{
"name": "poolRewardTokenaccount",
"isMut": false,
"isSigner": false
},
{
"name": "swapOrLiquidityProgramId",
"isMut": false,
"isSigner": false
},
{
"name": "systemProgram",
"isMut": false,
"isSigner": false
},
{
"name": "rent",
"isMut": false,
"isSigner": false
},
{
"name": "ammAuthority",
"isMut": false,
"isSigner": false
},
{
"name": "serumProgramId",
"isMut": false,
"isSigner": false
}
],
"args": [
{
"name": "slippage",
"type": "u64"
},
{
"name": "rayPoolVersion",
"type": "u64"
}
]
},
{
"name": "applyVaultUpdate",
"accounts": [
{
"name": "management",
"isMut": false,
"isSigner": false
},
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "vault",
"isMut": true,
"isSigner": false
},
{
"name": "rewardAAccount",
"isMut": false,
"isSigner": false
},
{
"name": "rewardBAccount",
"isMut": false,
"isSigner": false
}
],
"args": [
{
"name": "args",
"type": {
"defined": "VaultUpdateArgs"
}
}
]
},
{
"name": "createVault",
"accounts": [
{
"name": "management",
"isMut": false,
"isSigner": false
},
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "vaultAuthority",
"isMut": false,
"isSigner": false
},
{
"name": "vault",
"isMut": true,
"isSigner": false
},
{
"name": "vaultMetadataAccount",
"isMut": false,
"isSigner": false
},
{
"name": "vaultTokenAccount",
"isMut": false,
"isSigner": false
},
{
"name": "lpTokenMint",
"isMut": false,
"isSigner": false
},
{
"name": "lpTokenAccount",
"isMut": false,
"isSigner": false
},
{
"name": "rewardMintA",
"isMut": false,
"isSigner": false
},
{
"name": "rewardMintB",
"isMut": false,
"isSigner": false
},
{
"name": "pda",
"isMut": true,
"isSigner": false
},
{
"name": "infoAccountPda",
"isMut": true,
"isSigner": false
},
{
"name": "rewardAccountPda",
"isMut": true,
"isSigner": false
},
{
"name": "rewardBAccountPda",
"isMut": true,
"isSigner": false
},
{
"name": "swapToPda",
"isMut": true,
"isSigner": false
},
{
"name": "swapToMint",
"isMut": false,
"isSigner": false
},
{
"name": "systemProgram",
"isMut": false,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
},
{
"name": "rent",
"isMut": false,
"isSigner": false
},
{
"name": "poolRewardATokenAccount",
"isMut": false,
"isSigner": false
},
{
"name": "poolRewardBTokenAccount",
"isMut": false,
"isSigner": false
},
{
"name": "poolLpTokenAccount",
"isMut": false,
"isSigner": false
},
{
"name": "poolAuthority",
"isMut": false,
"isSigner": false
},
{
"name": "poolId",
"isMut": false,
"isSigner": false
},
{
"name": "stakeProgramId",
"isMut": false,
"isSigner": false
},
{
"name": "dexProgramId",
"isMut": false,
"isSigner": false
},
{
"name": "openOrdersAccount",
"isMut": true,
"isSigner": false
}
],
"args": [
{
"name": "vaultArgs",
"type": {
"defined": "NewVaultArgs"
}
}
]
},
{
"name": "createDualVault",
"accounts": [
{
"name": "management",
"isMut": false,
"isSigner": false
},
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "vaultAuthority",
"isMut": false,
"isSigner": false
},
{
"name": "vault",
"isMut": true,
"isSigner": false
},
{
"name": "vaultMetadataAccount",
"isMut": false,
"isSigner": false
},
{
"name": "vaultTokenAccount",
"isMut": false,
"isSigner": false
},
{
"name": "lpTokenMint",
"isMut": false,
"isSigner": false
},
{
"name": "lpTokenAccount",
"isMut": false,
"isSigner": false
},
{
"name": "rewardMintA",
"isMut": false,
"isSigner": false
},
{
"name": "rewardMintB",
"isMut": false,
"isSigner": false
},
{
"name": "pda",
"isMut": true,
"isSigner": false
},
{
"name": "infoAccountPda",
"isMut": true,
"isSigner": false
},
{
"name": "rewardAccountPda",
"isMut": true,
"isSigner": false
},
{
"name": "rewardBAccountPda",
"isMut": true,
"isSigner": false
},
{
"name": "swapToPda",
"isMut": true,
"isSigner": false
},
{
"name": "swapToMint",
"isMut": false,
"isSigner": false
},
{
"name": "systemProgram",
"isMut": false,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
},
{
"name": "rent",
"isMut": false,
"isSigner": false
},
{
"name": "poolRewardATokenAccount",
"isMut": false,
"isSigner": false
},
{
"name": "poolRewardBTokenAccount",
"isMut": false,
"isSigner": false
},
{
"name": "poolLpTokenAccount",
"isMut": false,
"isSigner": false
},
{
"name": "poolAuthority",
"isMut": false,
"isSigner": false
},
{
"name": "poolId",
"isMut": false,
"isSigner": false
},
{
"name": "stakeProgramId",
"isMut": false,
"isSigner": false
},
{
"name": "dexProgramId",
"isMut": false,
"isSigner": false
},
{
"name": "openOrdersAccount",
"isMut": true,
"isSigner": false
}
],
"args": [
{
"name": "vaultArgs",
"type": {
"defined": "NewVaultArgs"
}
}
]
},
{
"name": "depositVault",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "authorityTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "vaultPdaAccount",
"isMut": true,
"isSigner": false
},
{
"name": "vault",
"isMut": true,
"isSigner": false
},
{
"name": "lpTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "userBalanceAccount",
"isMut": true,
"isSigner": false
},
{
"name": "systemProgram",
"isMut": false,
"isSigner": false
},
{
"name": "stakeProgramId",
"isMut": false,
"isSigner": false
},
{
"name": "poolId",
"isMut": true,
"isSigner": false
},
{
"name": "poolAuthority",
"isMut": true,
"isSigner": false
},
{
"name": "userInfoAccount",
"isMut": true,
"isSigner": false
},
{
"name": "poolLpTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "userRewardATokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "poolRewardATokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "userRewardBTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "poolRewardBTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "clock",
"isMut": false,
"isSigner": false
},
{
"name": "rent",
"isMut": false,
"isSigner": false
},
{
"name": "tokenProgramId",
"isMut": false,
"isSigner": false
},
{
"name": "userBalanceMetadata",
"isMut": true,
"isSigner": false
}
],
"args": [
{
"name": "depositArgs",
"type": {
"defined": "DepositVaultArgs"
}
}
]
},
{
"name": "harvestMigrateTulips",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "vault",
"isMut": true,
"isSigner": false
},
{
"name": "vaultPdaAccount",
"isMut": true,
"isSigner": false
},
{
"name": "userInfoAccount",
"isMut": true,
"isSigner": false
},
{
"name": "userBalanceAccount",
"isMut": true,
"isSigner": false
},
{
"name": "userBalanceMetadata",
"isMut": true,
"isSigner": false
},
{
"name": "userTulipRewardMetadata",
"isMut": true,
"isSigner": false
},
{
"name": "userTulipTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "vaultTulipTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "oldUserBalanceAccount",
"isMut": true,
"isSigner": false
},
{
"name": "oldUserBalanceMetadata",
"isMut": true,
"isSigner": false
},
{
"name": "oldUserTulipRewardMetadata",
"isMut": true,
"isSigner": false
},
{
"name": "tokenProgramId",
"isMut": false,
"isSigner": false
},
{
"name": "clock",
"isMut": false,
"isSigner": false
},
{
"name": "rent",
"isMut": false,
"isSigner": false
},
{
"name": "systemProgram",
"isMut": false,
"isSigner": false
}
],
"args": [
{
"name": "harvestArgs",
"type": {
"defined": "HarvestMigrateTulipsArgs"
}
}
]
},
{
"name": "harvestTulips",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "vault",
"isMut": true,
"isSigner": false
},
{
"name": "vaultPdaAccount",
"isMut": true,
"isSigner": false
},
{
"name": "userInfoAccount",
"isMut": true,
"isSigner": false
},
{
"name": "userBalanceAccount",
"isMut": true,
"isSigner": false
},
{
"name": "userTulipRewardMetadata",
"isMut": true,
"isSigner": false
},
{
"name": "userTulipTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "vaultTulipTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "tokenProgramId",
"isMut": false,
"isSigner": false
},
{
"name": "clock",
"isMut": false,
"isSigner": false
},
{
"name": "rent",
"isMut": false,
"isSigner": false
},
{
"name": "systemProgram",
"isMut": false,
"isSigner": false
}
],
"args": [
{
"name": "harvestArgs",
"type": {
"defined": "HarvestTulipsArgs"
}
}
]
},
{
"name": "withdrawVault",
"accounts": [
{
"name": "authority",
"isMut": true,
"isSigner": true
},
{
"name": "authorityTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "vault",
"isMut": true,
"isSigner": false
},
{
"name": "lpTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "userBalanceAccount",
"isMut": true,
"isSigner": false
},
{
"name": "userInfoAccount",
"isMut": true,
"isSigner": false
},
{
"name": "userRewardATokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "poolRewardATokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "userRewardBTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "poolRewardBTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "tokenProgramId",
"isMut": false,
"isSigner": false
},
{
"name": "clock",
"isMut": false,
"isSigner": false
},
{
"name": "vaultPdaAccount",
"isMut": true,
"isSigner": false
},
{
"name": "poolLpTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "poolAuthority",
"isMut": true,
"isSigner": false
},
{
"name": "poolId",
"isMut": true,
"isSigner": false
},
{
"name": "stakeProgramId",
"isMut": false,
"isSigner": false
},
{
"name": "userBalanceMeta",
"isMut": true,
"isSigner": false
}
],
"args": [
{
"name": "withdrawArgs",
"type": {
"defined": "WithdrawVaultArgs"
}
}
]
},
{
"name": "withdrawVaultNew",
"accounts": [
{
"name": "authority",
"isMut": true,
"isSigner": true
},
{
"name": "authorityTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "vault",
"isMut": true,
"isSigner": false
},
{
"name": "lpTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "userBalanceAccount",
"isMut": true,
"isSigner": false
},
{
"name": "userInfoAccount",
"isMut": true,
"isSigner": false
},
{
"name": "userRewardATokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "poolRewardATokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "userRewardBTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "poolRewardBTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "tokenProgramId",
"isMut": false,
"isSigner": false
},
{
"name": "clock",
"isMut": false,
"isSigner": false
},
{
"name": "vaultPdaAccount",
"isMut": true,
"isSigner": false
},
{
"name": "poolLpTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "poolAuthority",
"isMut": true,
"isSigner": false
},
{
"name": "poolId",
"isMut": true,
"isSigner": false
},
{
"name": "stakeProgramId",
"isMut": false,
"isSigner": false
},
{
"name": "userBalanceMeta",
"isMut": true,
"isSigner": false
},
{
"name": "auxInfoAccount",
"isMut": true,
"isSigner": false
}
],
"args": [
{
"name": "withdrawArgs",
"type": {
"defined": "WithdrawVaultArgs"
}
}
]
},
{
"name": "withdrawTulips",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "vault",
"isMut": true,
"isSigner": false
},
{
"name": "vaultPdaAccount",
"isMut": true,
"isSigner": false
},
{
"name": "withdrawTulipTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "vaultTulipTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "tokenProgramId",
"isMut": false,
"isSigner": false
},
{
"name": "clock",
"isMut": false,
"isSigner": false
},
{
"name": "rent",
"isMut": false,
"isSigner": false
},
{
"name": "systemProgram",
"isMut": false,
"isSigner": false
}
],
"args": [
{
"name": "amountToWithdraw",
"type": "u64"
}
]
},
{
"name": "harvestVault",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "vaultPdaAccount",
"isMut": true,
"isSigner": false
},
{
"name": "vault",
"isMut": true,
"isSigner": false
},
{
"name": "lpTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
},
{
"name": "systemProgram",
"isMut": false,
"isSigner": false
},
{
"name": "stakeProgramId",
"isMut": false,
"isSigner": false
},
{
"name": "poolId",
"isMut": true,
"isSigner": false
},
{
"name": "poolAuthority",
"isMut": true,
"isSigner": false
},
{
"name": "userInfoAccount",
"isMut": true,
"isSigner": false
},
{
"name": "poolLpTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "userRewardATokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "poolRewardATokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "userRewardBTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "poolRewardBTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "clock",
"isMut": false,
"isSigner": false
},
{
"name": "rent",
"isMut": false,
"isSigner": false
},
{
"name": "vaultDepositQueue",
"isMut": true,
"isSigner": false
}
],
"args": []
},
{
"name": "swapVaultToken",
"accounts": [
{
"name": "management",
"isMut": false,
"isSigner": false
},
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "swapOrLiquidityProgramId",
"isMut": false,
"isSigner": false
},
{
"name": "ammId",
"isMut": true,
"isSigner": false
},
{
"name": "ammAuthority",
"isMut": true,
"isSigner": false
},
{
"name": "ammOpenOrders",
"isMut": true,
"isSigner": false
},
{
"name": "ammQuantitiesOrTargetOrders",
"isMut": true,
"isSigner": false
},
{
"name": "poolCoinTokenaccount",
"isMut": true,
"isSigner": false
},
{
"name": "poolPcTokenaccount",
"isMut": true,
"isSigner": false
},
{
"name": "serumProgramId",
"isMut": false,
"isSigner": false
},
{
"name": "serumMarket",
"isMut": true,
"isSigner": false
},
{
"name": "serumBids",
"isMut": true,
"isSigner": false
},
{
"name": "serumAsks",
"isMut": true,
"isSigner": false
},
{
"name": "serumEventQueue",
"isMut": true,
"isSigner": false
},
{
"name": "serumCoinVaultAccount",
"isMut": true,
"isSigner": false
},
{
"name": "serumPcVaultAccount",
"isMut": true,
"isSigner": false
},
{
"name": "serumVaultSigner",
"isMut": true,
"isSigner": false
},
{
"name": "rewardAccount",
"isMut": true,
"isSigner": false
},
{
"name": "swapToAccount",
"isMut": true,
"isSigner": false
},
{
"name": "vaultPdaAccount",
"isMut": true,
"isSigner": false
},
{
"name": "vault",
"isMut": true,
"isSigner": false
},
{
"name": "vaultMetadata",
"isMut": true,
"isSigner": false
},
{
"name": "tokenProgramId",
"isMut": false,
"isSigner": false
}
],
"args": []
},
{
"name": "swapVaultRewards",
"accounts": [
{
"name": "management",
"isMut": false,
"isSigner": false
},
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "swapOrLiquidityProgramId",
"isMut": false,
"isSigner": false
},
{
"name": "ammId",
"isMut": true,
"isSigner": false
},
{
"name": "ammAuthority",
"isMut": true,
"isSigner": false
},
{
"name": "ammOpenOrders",
"isMut": true,
"isSigner": false
},
{
"name": "ammQuantitiesOrTargetOrders",
"isMut": true,
"isSigner": false
},
{
"name": "poolCoinTokenaccount",
"isMut": true,
"isSigner": false
},
{
"name": "poolPcTokenaccount",
"isMut": true,
"isSigner": false
},
{
"name": "serumProgramId",
"isMut": false,
"isSigner": false
},
{
"name": "serumMarket",
"isMut": true,
"isSigner": false
},
{
"name": "serumBids",
"isMut": true,
"isSigner": false
},
{
"name": "serumAsks",
"isMut": true,
"isSigner": false
},
{
"name": "serumEventQueue",
"isMut": true,
"isSigner": false
},
{
"name": "serumCoinVaultAccount",
"isMut": true,
"isSigner": false
},
{
"name": "serumPcVaultAccount",
"isMut": true,
"isSigner": false
},
{
"name": "serumVaultSigner",
"isMut": true,
"isSigner": false
},
{
"name": "rewardAccount",
"isMut": true,
"isSigner": false
},
{
"name": "swapToAccount",
"isMut": true,
"isSigner": false
},
{
"name": "vaultPdaAccount",
"isMut": true,
"isSigner": false
},
{
"name": "vault",
"isMut": true,
"isSigner": false
},
{
"name": "vaultMetadata",
"isMut": true,
"isSigner": false
},
{
"name": "tokenProgramId",
"isMut": false,
"isSigner": false
},
{
"name": "feeRecipient",
"isMut": true,
"isSigner": false
}
],
"args": []
},
{
"name": "swapDualVaultRewards",
"accounts": [
{
"name": "management",
"isMut": false,
"isSigner": false
},
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "swapOrLiquidityProgramId",
"isMut": false,
"isSigner": false
},
{
"name": "ammId",
"isMut": true,
"isSigner": false
},
{
"name": "ammAuthority",
"isMut": true,
"isSigner": false
},
{
"name": "ammOpenOrders",
"isMut": true,
"isSigner": false
},
{
"name": "ammQuantitiesOrTargetOrders",
"isMut": true,
"isSigner": false
},
{
"name": "poolCoinTokenaccount",
"isMut": true,
"isSigner": false
},
{
"name": "poolPcTokenaccount",
"isMut": true,
"isSigner": false
},
{
"name": "serumProgramId",
"isMut": false,
"isSigner": false
},
{
"name": "serumMarket",
"isMut": true,
"isSigner": false
},
{
"name": "serumBids",
"isMut": true,
"isSigner": false
},
{
"name": "serumAsks",
"isMut": true,
"isSigner": false
},
{
"name": "serumEventQueue",
"isMut": true,
"isSigner": false
},
{
"name": "serumCoinVaultAccount",
"isMut": true,
"isSigner": false
},
{
"name": "serumPcVaultAccount",
"isMut": true,
"isSigner": false
},
{
"name": "serumVaultSigner",
"isMut": true,
"isSigner": false
},
{
"name": "coinRewardAccount",
"isMut": true,
"isSigner": false
},
{
"name": "pcRewardAccount",
"isMut": true,
"isSigner": false
},
{
"name": "vaultPdaAccount",
"isMut": true,
"isSigner": false
},
{
"name": "vault",
"isMut": true,
"isSigner": false
},
{
"name": "vaultMetadata",
"isMut": true,
"isSigner": false
},
{
"name": "tokenProgramId",
"isMut": false,
"isSigner": false
},
{
"name": "coinFeeRecipient",
"isMut": true,
"isSigner": false
},
{
"name": "pcFeeRecipient",
"isMut": true,
"isSigner": false
}
],
"args": [
{
"name": "args",
"type": {
"defined": "AddLiquidityArgs"
}
}
]
},
{
"name": "addLiquidity",
"accounts": [
{
"name": "management",
"isMut": false,
"isSigner": false
},
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "liquidityProgramId",
"isMut": false,
"isSigner": false
},
{
"name": "ammId",
"isMut": true,
"isSigner": false
},
{
"name": "ammAuthority",
"isMut": true,
"isSigner": false
},
{
"name": "ammOpenOrders",
"isMut": true,
"isSigner": false
},
{
"name": "ammQuantitiesOrTargetOrders",
"isMut": true,
"isSigner": false
},
{
"name": "lpMintAddress",
"isMut": true,
"isSigner": false
},
{
"name": "poolCoinTokenaccount",
"isMut": true,
"isSigner": false
},
{
"name": "poolPcTokenaccount",
"isMut": true,
"isSigner": false
},
{
"name": "serumMarket",
"isMut": true,
"isSigner": false
},
{
"name": "vaultCoinTokenaccount",
"isMut": true,
"isSigner": false
},
{
"name": "vaultPcTokenaccount",
"isMut": true,
"isSigner": false
},
{
"name": "vaultLpTokenaccount",
"isMut": true,
"isSigner": false
},
{
"name": "vaultPdaAccount",
"isMut": true,
"isSigner": false
},
{
"name": "vault",
"isMut": true,
"isSigner": false
},
{
"name": "vaultMetadata",
"isMut": true,
"isSigner": false
},
{
"name": "tokenProgramId",
"isMut": false,
"isSigner": false
}
],
"args": [
{
"name": "args",
"type": {
"defined": "AddLiquidityArgs"
}
}
]
},
{
"name": "addLiquidityIssueShares",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "liquidityProgramId",
"isMut": false,
"isSigner": false
},
{
"name": "ammId",
"isMut": true,
"isSigner": false
},
{
"name": "ammAuthority",
"isMut": true,
"isSigner": false
},
{
"name": "ammOpenOrders",
"isMut": true,
"isSigner": false
},
{
"name": "ammQuantitiesOrTargetOrders",
"isMut": true,
"isSigner": false
},
{
"name": "lpMintAddress",
"isMut": true,
"isSigner": false
},
{
"name": "poolCoinTokenaccount",
"isMut": true,
"isSigner": false
},
{
"name": "poolPcTokenaccount",
"isMut": true,
"isSigner": false
},
{
"name": "serumMarket",
"isMut": true,
"isSigner": false
},
{
"name": "vaultPdaAccount",
"isMut": true,
"isSigner": false
},
{
"name": "vault",
"isMut": true,
"isSigner": false
},
{
"name": "vaultMetadata",
"isMut": true,
"isSigner": false
},
{
"name": "tokenProgramId",
"isMut": false,
"isSigner": false
},
{
"name": "userBalanceAccount",
"isMut": true,
"isSigner": false
},
{
"name": "userBalanceMetadata",
"isMut": true,
"isSigner": false
},
{
"name": "authorityCoinTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "authorityPcTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "vaultDepositQueue",
"isMut": true,
"isSigner": false
},
{
"name": "systemProgram",
"isMut": false,
"isSigner": false
},
{
"name": "tokenAuthority",
"isMut": false,
"isSigner": true
}
],
"args": [
{
"name": "args",
"type": {
"defined": "AddLiquidityIssueSharesArgs"
}
}
]
},
{
"name": "depositFarm",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "vaultPdaAccount",
"isMut": true,
"isSigner": false
},
{
"name": "vault",
"isMut": true,
"isSigner": false
},
{
"name": "lpTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
},
{
"name": "systemProgram",
"isMut": false,
"isSigner": false
},
{
"name": "stakeProgramId",
"isMut": false,
"isSigner": false
},
{
"name": "poolId",
"isMut": true,
"isSigner": false
},
{
"name": "poolAuthority",
"isMut": true,
"isSigner": false
},
{
"name": "userInfoAccount",
"isMut": true,
"isSigner": false
},
{
"name": "poolLpTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "userRewardATokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "poolRewardATokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "userRewardBTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "poolRewardBTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "clock",
"isMut": false,
"isSigner": false
},
{
"name": "rent",
"isMut": false,
"isSigner": false
},
{
"name": "vaultDepositQueue",
"isMut": true,
"isSigner": false
}
],
"args": [
{
"name": "single",
"type": "bool"
}
]
},
{
"name": "createAssociatedLedgerAccount",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "vault",
"isMut": true,
"isSigner": false
},
{
"name": "vaultPda",
"isMut": true,
"isSigner": false
},
{
"name": "management",
"isMut": false,
"isSigner": false
},
{
"name": "stakeProgramId",
"isMut": false,
"isSigner": false
},
{
"name": "poolId",
"isMut": true,
"isSigner": false
},
{
"name": "associatedLedgerAccount",
"isMut": true,
"isSigner": false
},
{
"name": "systemProgram",
"isMut": false,
"isSigner": false
},
{
"name": "rent",
"isMut": false,
"isSigner": false
}
],
"args": []
},
{
"name": "createVaultDepositQueueAccount",
"accounts": [
{
"name": "authority",
"isMut": true,
"isSigner": true
},
{
"name": "vault",
"isMut": true,
"isSigner": false
},
{
"name": "vaultPda",
"isMut": true,
"isSigner": false
},
{
"name": "management",
"isMut": false,
"isSigner": false
},
{
"name": "depositQueue",
"isMut": true,
"isSigner": false
},
{
"name": "tokenMint",
"isMut": false,
"isSigner": false
},
{
"name": "rent",
"isMut": false,
"isSigner": false
},
{
"name": "systemProgram",
"isMut": false,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
}
],
"args": []
},
{
"name": "serumSwapOrder",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "market",
"isMut": true,
"isSigner": false
},
{
"name": "openOrdersAccount",
"isMut": true,
"isSigner": false
},
{
"name": "requestQueue",
"isMut": true,
"isSigner": false
},
{
"name": "eventQueue",
"isMut": true,
"isSigner": false
},
{
"name": "marketBids",
"isMut": true,
"isSigner": false
},
{
"name": "marketAsks",
"isMut": true,
"isSigner": false
},
{
"name": "orderPayer",
"isMut": true,
"isSigner": false
},
{
"name": "openOrdersAccountOwner",
"isMut": true,
"isSigner": false
},
{
"name": "coinVault",
"isMut": true,
"isSigner": false
},
{
"name": "pcVault",
"isMut": true,
"isSigner": false
},
{
"name": "splTokenProgramId",
"isMut": false,
"isSigner": false
},
{
"name": "rent",
"isMut": false,
"isSigner": false
},
{
"name": "dexProgramId",
"isMut": false,
"isSigner": false
},
{
"name": "vault",
"isMut": true,
"isSigner": false
},
{
"name": "vaultPda",
"isMut": true,
"isSigner": false
},
{
"name": "coinWallet",
"isMut": true,
"isSigner": false
},
{
"name": "pcWallet",
"isMut": true,
"isSigner": false
},
{
"name": "vaultSigner",
"isMut": true,
"isSigner": false
},
{
"name": "metadataAccount",
"isMut": true,
"isSigner": false
},
{
"name": "feeRecipient",
"isMut": true,
"isSigner": false
},
{
"name": "orderPayerMint",
"isMut": false,
"isSigner": false
}
],
"args": [
{
"name": "args",
"type": {
"defined": "SerumSwapArgs"
}
}
]
},
{
"name": "serumSwapSettle",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "market",
"isMut": true,
"isSigner": false
},
{
"name": "openOrdersAccount",
"isMut": true,
"isSigner": false
},
{
"name": "requestQueue",
"isMut": true,
"isSigner": false
},
{
"name": "eventQueue",
"isMut": true,
"isSigner": false
},
{
"name": "marketBids",
"isMut": true,
"isSigner": false
},
{
"name": "marketAsks",
"isMut": true,
"isSigner": false
},
{
"name": "orderPayer",
"isMut": true,
"isSigner": false
},
{
"name": "openOrdersAccountOwner",
"isMut": true,
"isSigner": false
},
{
"name": "coinVault",
"isMut": true,
"isSigner": false
},
{
"name": "pcVault",
"isMut": true,
"isSigner": false
},
{
"name": "splTokenProgramId",
"isMut": false,
"isSigner": false
},
{
"name": "rent",
"isMut": false,
"isSigner": false
},
{
"name": "dexProgramId",
"isMut": false,
"isSigner": false
},
{
"name": "vault",
"isMut": true,
"isSigner": false
},
{
"name": "vaultPda",
"isMut": true,
"isSigner": false
},
{
"name": "coinWallet",
"isMut": true,
"isSigner": false
},
{
"name": "pcWallet",
"isMut": true,
"isSigner": false
},
{
"name": "vaultSigner",
"isMut": true,
"isSigner": false
},
{
"name": "metadataAccount",
"isMut": true,
"isSigner": false
},
{
"name": "feeRecipient",
"isMut": true,
"isSigner": false
},
{
"name": "orderPayerMint",
"isMut": false,
"isSigner": false
}
],
"args": []
},
{
"name": "setVaultFees",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "vault",
"isMut": true,
"isSigner": false
}
],
"args": [
{
"name": "args",
"type": {
"defined": "SetVaultFeesArgs"
}
}
]
},
{
"name": "setVaultAuthorities",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "vault",
"isMut": true,
"isSigner": false
}
],
"args": [
{
"name": "args",
"type": {
"defined": "SetVaultAuthoritiesArgs"
}
}
]
},
{
"name": "setVaultPrecisionFactor",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "vault",
"isMut": true,
"isSigner": false
},
{
"name": "lpMintAddress",
"isMut": true,
"isSigner": false
}
],
"args": []
},
{
"name": "setVaultCompoundInterval",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "vault",
"isMut": true,
"isSigner": false
},
{
"name": "clock",
"isMut": false,
"isSigner": false
}
],
"args": [
{
"name": "args",
"type": {
"defined": "SetVaultCompoundIntervalArgs"
}
}
]
},
{
"name": "setVaultLastCompound",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "vault",
"isMut": true,
"isSigner": false
},
{
"name": "clock",
"isMut": false,
"isSigner": false
}
],
"args": []
},
{
"name": "setVaultRewards",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "vault",
"isMut": true,
"isSigner": false
},
{
"name": "clock",
"isMut": false,
"isSigner": false
}
],
"args": [
{
"name": "args",
"type": {
"defined": "SetVaultRewardsArgs"
}
}
]
},
{
"name": "updateMigratedVaults",
"accounts": [
{
"name": "management",
"isMut": false,
"isSigner": false
},
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "vault",
"isMut": true,
"isSigner": false
},
{
"name": "oldInfoAccount",
"isMut": false,
"isSigner": false
}
],
"args": []
},
{
"name": "resetVaultBalance",
"accounts": [
{
"name": "management",
"isMut": false,
"isSigner": false
},
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "vault",
"isMut": true,
"isSigner": false
}
],
"args": []
}
],
"state": {
"struct": {
"name": "Management",
"type": {
"kind": "struct",
"fields": [
{
"name": "authority",
"type": "publicKey"
},
{
"name": "whitelist",
"type": {
"vec": {
"defined": "WhitelistEntry"
}
}
}
]
}
},
"methods": [
{
"name": "new",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
}
],
"args": [
{
"name": "authority",
"type": "publicKey"
}
]
},
{
"name": "setManagementAuthority",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
}
],
"args": [
{
"name": "newAuthority",
"type": "publicKey"
}
]
}
]
},
"accounts": [
{
"name": "VaultMetadata",
"type": {
"kind": "struct",
"fields": [
{
"name": "ammId",
"type": "publicKey"
},
{
"name": "ammAuthority",
"type": "publicKey"
},
{
"name": "ammOpenOrders",
"type": "publicKey"
},
{
"name": "ammQuantitiesOrTargetOrders",
"type": "publicKey"
},
{
"name": "poolCoinTokenaccount",
"type": "publicKey"
},
{
"name": "poolPcTokenaccount",
"type": "publicKey"
},
{
"name": "serumProgramId",
"type": "publicKey"
},
{
"name": "serumMarket",
"type": "publicKey"
},
{
"name": "serumBids",
"type": "publicKey"
},
{
"name": "serumAsks",
"type": "publicKey"
},
{
"name": "serumEventQueue",
"type": "publicKey"
},
{
"name": "serumCoinVaultAccount",
"type": "publicKey"
},
{
"name": "serumPcVaultAccount",
"type": "publicKey"
},
{
"name": "serumVaultSigner",
"type": "publicKey"
},
{
"name": "lpMintAddress",
"type": "publicKey"
},
{
"name": "poolId",
"type": "publicKey"
},
{
"name": "poolAuthority",
"type": "publicKey"
},
{
"name": "poolLpTokenaccount",
"type": "publicKey"
},
{
"name": "poolRewardTokenaccount",
"type": "publicKey"
},
{
"name": "swapOrLiquidityProgramId",
"type": "publicKey"
},
{
"name": "rayPoolVersion",
"type": "u64"
},
{
"name": "slippage",
"type": "u64"
}
]
}
},
{
"name": "Vault",
"type": {
"kind": "struct",
"fields": [
{
"name": "authority",
"type": "publicKey"
},
{
"name": "tokenProgram",
"type": "publicKey"
},
{
"name": "pdaTokenAccount",
"type": "publicKey"
},
{
"name": "pda",
"type": "publicKey"
},
{
"name": "nonce",
"type": "u8"
},
{
"name": "infoNonce",
"type": "u8"
},
{
"name": "rewardANonce",
"type": "u8"
},
{
"name": "rewardBNonce",
"type": "u8"
},
{
"name": "swapToNonce",
"type": "u8"
},
{
"name": "totalVaultBalance",
"type": "u64"
},
{
"name": "infoAccount",
"type": "publicKey"
},
{
"name": "lpTokenAccount",
"type": "publicKey"
},
{
"name": "lpTokenMint",
"type": "publicKey"
},
{
"name": "rewardAAccount",
"type": "publicKey"
},
{
"name": "rewardBAccount",
"type": "publicKey"
},
{
"name": "swapToAccount",
"type": "publicKey"
},
{
"name": "totalVlpShares",
"type": "u64"
},
{
"name": "poolId",
"type": "publicKey"
},
{
"name": "poolAuthority",
"type": "publicKey"
},
{
"name": "poolLpTokenAccount",
"type": "publicKey"
},
{
"name": "poolRewardATokenAccount",
"type": "publicKey"
},
{
"name": "poolRewardBTokenAccount",
"type": "publicKey"
},
{
"name": "stakeProgramId",
"type": "publicKey"
},
{
"name": "dualReward",
"type": "bool"
},
{
"name": "metadataAccount",
"type": "publicKey"
},
{
"name": "openOrdersAccount",
"type": "publicKey"
},
{
"name": "controllerFee",
"type": "u64"
},
{
"name": "platformFee",
"type": "u64"
},
{
"name": "vaultFee",
"type": "u64"
},
{
"name": "entranceFee",
"type": "u64"
},
{
"name": "withdrawalFee",
"type": "u64"
},
{
"name": "feeRecipient",
"type": "publicKey"
},
{
"name": "feeAuthority",
"type": "publicKey"
},
{
"name": "compoundAuthority",
"type": "publicKey"
},
{
"name": "precisionFactor",
"type": "u64"
},
{
"name": "lastCompoundTime",
"type": "i64"
},
{
"name": "compoundInterval",
"type": "i64"
},
{
"name": "dualFeeRecipient",
"type": "publicKey"
},
{
"name": "tulipRewardPerSlot",
"type": "u64"
},
{
"name": "tulipRewardPerShare",
"type": "u128"
},
{
"name": "tulipRewardEndSlot",
"type": "u64"
},
{
"name": "lastInteractionSlot",
"type": "u64"
},
{
"name": "stakingStateRefreshed",
"type": "bool"
},
{
"name": "disabled",
"type": "bool"
},
{
"name": "migrated",
"type": "bool"
},
{
"name": "oldUserInfoAccount",
"type": "publicKey"
},
{
"name": "associatedInfoAccount",
"type": "publicKey"
},
{
"name": "versionFive",
"type": "bool"
},
{
"name": "depositQueue",
"type": "publicKey"
},
{
"name": "depositQueueNonce",
"type": "u8"
}
]
}
},
{
"name": "VaultBalanceAccount",
"type": {
"kind": "struct",
"fields": [
{
"name": "owner",
"type": "publicKey"
},
{
"name": "amount",
"type": "u64"
}
]
}
},
{
"name": "VaultBalanceMetadata",
"type": {
"kind": "struct",
"fields": [
{
"name": "lastDepositTime",
"type": "i64"
},
{
"name": "totalLpTokens",
"type": "u64"
}
]
}
},
{
"name": "VaultTulipRewardMetadata",
"type": {
"kind": "struct",
"fields": [
{
"name": "lastPendingReward",
"type": "u64"
},
{
"name": "rewardPerSharePaid",
"type": "u128"
},
{
"name": "buffer",
"type": {
"array": [
"publicKey",
5
]
}
}
]
}
}
],
"types": [
{
"name": "SetVaultRewardsArgs",
"type": {
"kind": "struct",
"fields": [
{
"name": "tulipRewardPerSlot",
"type": "u64"
},
{
"name": "tulipRewardEndSlot",
"type": "u64"
}
]
}
},
{
"name": "SetVaultCompoundIntervalArgs",
"type": {
"kind": "struct",
"fields": [
{
"name": "interval",
"type": "i64"
}
]
}
},
{
"name": "WhitelistEntry",
"type": {
"kind": "struct",
"fields": [
{
"name": "authority",
"type": "publicKey"
}
]
}
},
{
"name": "NewVaultArgs",
"type": {
"kind": "struct",
"fields": [
{
"name": "vaultAuthority",
"type": "publicKey"
},
{
"name": "nonce",
"type": "u8"
},
{
"name": "rewardNonce",
"type": "u8"
},
{
"name": "rewardBNonce",
"type": "u8"
},
{
"name": "infoNonce",
"type": "u8"
},
{
"name": "swapToNonce",
"type": "u8"
},
{
"name": "dualReward",
"type": "bool"
},
{
"name": "controllerFee",
"type": "u64"
},
{
"name": "platformFee",
"type": "u64"
},
{
"name": "vaultFee",
"type": "u64"
},
{
"name": "entranceFee",
"type": "u64"
},
{
"name": "withdrawalFee",
"type": "u64"
}
]
}
},
{
"name": "DepositVaultArgs",
"type": {
"kind": "struct",
"fields": [
{
"name": "nonce",
"type": "u8"
},
{
"name": "amount",
"type": "u64"
},
{
"name": "metaNonce",
"type": "u8"
}
]
}
},
{
"name": "HarvestMigrateTulipsArgs",
"type": {
"kind": "struct",
"fields": [
{
"name": "oldNonce",
"type": "u8"
},
{
"name": "oldMetaNonce",
"type": "u8"
},
{
"name": "oldRewardNonce",
"type": "u8"
},
{
"name": "nonce",
"type": "u8"
},
{
"name": "metaNonce",
"type": "u8"
},
{
"name": "rewardNonce",
"type": "u8"
}
]
}
},
{
"name": "HarvestTulipsArgs",
"type": {
"kind": "struct",
"fields": [
{
"name": "nonce",
"type": "u8"
},
{
"name": "metaNonce",
"type": "u8"
},
{
"name": "rewardNonce",
"type": "u8"
}
]
}
},
{
"name": "WithdrawVaultArgs",
"type": {
"kind": "struct",
"fields": [
{
"name": "amount",
"type": "u64"
},
{
"name": "metaNonce",
"type": "u8"
},
{
"name": "nonce",
"type": "u8"
}
]
}
},
{
"name": "SerumSwapArgs",
"type": {
"kind": "struct",
"fields": [
{
"name": "side",
"type": "u8"
},
{
"name": "orderType",
"type": "u8"
},
{
"name": "clientOrderId",
"type": "u64"
},
{
"name": "selfTradeBehavior",
"type": "u8"
},
{
"name": "slippage",
"type": "u64"
}
]
}
},
{
"name": "AddLiquidityArgs",
"type": {
"kind": "struct",
"fields": [
{
"name": "coinOpenLiquidity",
"type": "u64"
},
{
"name": "pcOpenLiquidity",
"type": "u64"
},
{
"name": "coinTakepnl",
"type": "u64"
},
{
"name": "pcTakepnl",
"type": "u64"
},
{
"name": "dualYield",
"type": "bool"
}
]
}
},
{
"name": "AddLiquidityIssueSharesArgs",
"type": {
"kind": "struct",
"fields": [
{
"name": "liquidityArgs",
"type": {
"defined": "AddLiquidityArgs"
}
},
{
"name": "nonce",
"type": "u8"
},
{
"name": "metaNonce",
"type": "u8"
},
{
"name": "coinDeposit",
"type": "u64"
},
{
"name": "pcDeposit",
"type": "u64"
}
]
}
},
{
"name": "SetVaultFeesArgs",
"type": {
"kind": "struct",
"fields": [
{
"name": "controllerFee",
"type": "u64"
},
{
"name": "platformFee",
"type": "u64"
},
{
"name": "vaultFee",
"type": "u64"
},
{
"name": "entranceFee",
"type": "u64"
},
{
"name": "withdrawalFee",
"type": "u64"
},
{
"name": "feeRecipient",
"type": "publicKey"
},
{
"name": "dualFeeRecipient",
"type": "publicKey"
}
]
}
},
{
"name": "SetVaultAuthoritiesArgs",
"type": {
"kind": "struct",
"fields": [
{
"name": "feeAuthority",
"type": "publicKey"
},
{
"name": "compoundAuthority",
"type": "publicKey"
},
{
"name": "vaultAuthority",
"type": "publicKey"
}
]
}
},
{
"name": "BeginMigrationArgs",
"type": {
"kind": "struct",
"fields": [
{
"name": "infoNonce",
"type": "u8"
},
{
"name": "debug",
"type": "bool"
}
]
}
},
{
"name": "EndMigrationArgs",
"type": {
"kind": "struct",
"fields": [
{
"name": "infoNonce",
"type": "u8"
},
{
"name": "infoAccount",
"type": "publicKey"
},
{
"name": "poolId",
"type": "publicKey"
},
{
"name": "poolAuthority",
"type": "publicKey"
},
{
"name": "poolLpTokenAccount",
"type": "publicKey"
},
{
"name": "poolRewardATokenAccount",
"type": "publicKey"
},
{
"name": "poolRewardBTokenAccount",
"type": "publicKey"
},
{
"name": "enableDualReward",
"type": "bool"
},
{
"name": "createDualRewardAccount",
"type": "bool"
},
{
"name": "dualFeeRecipient",
"type": "publicKey"
}
]
}
},
{
"name": "VaultUpdateArgs",
"type": {
"kind": "struct",
"fields": [
{
"name": "aNonce",
"type": "u8"
},
{
"name": "bNonce",
"type": "u8"
}
]
}
}
],
"errors": [
{
"code": 100,
"name": "Unauthorized",
"msg": "must be an authorized caller"
},
{
"code": 101,
"name": "InvalidNonce",
"msg": "nonce given produced invalid address"
},
{
"code": 102,
"name": "InvalidTokenProgram",
"msg": "given token program is invalid"
},
{
"code": 103,
"name": "VaultBalanceTooLow",
"msg": "vault total token balance is too low"
},
{
"code": 104,
"name": "UserBalanceTooLow",
"msg": "users balance for this vault is too low"
},
{
"code": 105,
"name": "InvalidTokenAccount",
"msg": "token account given is invalid"
},
{
"code": 106,
"name": "InvalidInfoAccount",
"msg": "token account given is invalid"
},
{
"code": 107,
"name": "InvalidPdaAccount",
"msg": "pda account given is invalid"
},
{
"code": 108,
"name": "InvalidRewardAccount",
"msg": "reward account given is invalid"
},
{
"code": 109,
"name": "InvalidPoolId",
"msg": "pool id given is invalid"
},
{
"code": 110,
"name": "InvalidPoolAuthority",
"msg": "pool authority given is invalid"
},
{
"code": 111,
"name": "InvalidStakeProgram",
"msg": "stake program is invalid"
},
{
"code": 112,
"name": "EmptyOrderBookState",
"msg": "failed to find asks or bids in orderbook"
},
{
"code": 113,
"name": "InvalidVaultMetadataAccount",
"msg": "invalid vault metadata account"
},
{
"code": 114,
"name": "InvalidSerumOpenOrdersAccount",
"msg": "invalid serum open orders account"
},
{
"code": 115,
"name": "InvalidSerumMarket",
"msg": "invalid serum market"
},
{
"code": 116,
"name": "InvalidSerumEventQueue",
"msg": "invalid serum event queue"
},
{
"code": 117,
"name": "InvalidSerumMarketBids",
"msg": "invalid serum market bids"
},
{
"code": 118,
"name": "InvalidSerumMarketAsks",
"msg": "invlaid serum market asks"
},
{
"code": 119,
"name": "InvalidSerumCoinVault",
"msg": "invalid serum coin (base) vault"
},
{
"code": 120,
"name": "InvalidSerumPCVault",
"msg": "invalid serum pc (quote) vault"
},
{
"code": 121,
"name": "InvalidCoinWallet",
"msg": "invalid coin (base) wallet"
},
{
"code": 122,
"name": "InvalidPCWallet",
"msg": "invalid pc (quote) wallet"
},
{
"code": 123,
"name": "InvalidAmmId",
"msg": "invalid amm id"
},
{
"code": 124,
"name": "InvalidSwapToAccount",
"msg": "invalid swap to account"
},
{
"code": 125,
"name": "InvalidSerumVaultSigner",
"msg": "invalid serum vault signer"
},
{
"code": 126,
"name": "InvalidSerumProgramId",
"msg": "invalid serum program id"
},
{
"code": 127,
"name": "InvalidPoolPcTokenAccount",
"msg": "invalid pool pc token account"
},
{
"code": 128,
"name": "InvalidPoolCoinTokenAccount",
"msg": "invalid coin token account"
},
{
"code": 129,
"name": "InvalidAmmQuantitiesOrTargetOrders",
"msg": "invalid amm quantities or target orders"
},
{
"code": 130,
"name": "InvalidAmmOpenOrders",
"msg": "invalid amm open orders"
},
{
"code": 131,
"name": "InvalidAmmAuthority",
"msg": "invalid amm authority"
},
{
"code": 132,
"name": "InvalidSwapProgramId",
"msg": "invalid swap program id"
},
{
"code": 133,
"name": "InvalidVaultLptokenAccount",
"msg": "invalid vault lp token account"
},
{
"code": 134,
"name": "InvalidLpMintAddress",
"msg": "invalid lp mint address"
},
{
"code": 135,
"name": "InvalidLiquidityProgramId",
"msg": "invalid liquidity program id"
},
{
"code": 136,
"name": "InvalidPoolType",
"msg": "invalid pool type"
},
{
"code": 137,
"name": "InvalidFeeRecipient",
"msg": "invalid fee recipient"
},
{
"code": 138,
"name": "InvalidAuthority",
"msg": "invalid authority given"
},
{
"code": 139,
"name": "PrecisionFactorNotSet",
"msg": "precison factor not set"
},
{
"code": 140,
"name": "PrecisionFactorAlreadySet",
"msg": "precison factor already set"
},
{
"code": 141,
"name": "AmountBelowMinimumLotSize",
"msg": "given token amount is below the minimum lot size"
},
{
"code": 142,
"name": "InsufficientFunds",
"msg": "account has too little balance for the specified operation"
},
{
"code": 143,
"name": "InvalidCompoundInterval",
"msg": "invalid compound interval"
},
{
"code": 144,
"name": "InvalidInteractionSlot",
"msg": "invalid interaction slot"
},
{
"code": 145,
"name": "InvalidClaimDepositAmount",
"msg": "invalid deposit amount for claim"
},
{
"code": 146,
"name": "InvalidUserBalanceAccount",
"msg": "invalid user balance account"
},
{
"code": 147,
"name": "InvalidTulipRewardMetadataAccount",
"msg": "invalid tulip reward metadata account"
},
{
"code": 148,
"name": "StakingStateNotRefreshed",
"msg": "staking state not refreshed"
},
{
"code": 149,
"name": "VaultDisabled",
"msg": "vault disabled"
},
{
"code": 150,
"name": "InvalidMigrationState",
"msg": "invalid migration state"
},
{
"code": 151,
"name": "InvalidAuxInfoAccount",
"msg": "invalid aux info account"
}
]
}
{
"version": "0.0.0",
"name": "farm",
"instructions": [
{
"name": "createLeveragedFarm",
"accounts": [
{
"name": "global",
"isMut": false,
"isSigner": false
},
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "leveragedFarm",
"isMut": true,
"isSigner": false
},
{
"name": "solfarmVaultProgram",
"isMut": false,
"isSigner": false
},
{
"name": "serumMarket",
"isMut": false,
"isSigner": false
},
{
"name": "rent",
"isMut": false,
"isSigner": false
},
{
"name": "systemProgram",
"isMut": false,
"isSigner": false
}
],
"args": [
{
"name": "serumMarket",
"type": "publicKey"
},
{
"name": "solfarmVaultProgram",
"type": "publicKey"
},
{
"name": "solfarmVaultAddress",
"type": "publicKey"
},
{
"name": "serumRequestQueue",
"type": "publicKey"
},
{
"name": "serumEventQueue",
"type": "publicKey"
},
{
"name": "serumMarketBids",
"type": "publicKey"
},
{
"name": "serumMarketAsks",
"type": "publicKey"
},
{
"name": "serumCoinVaultAccount",
"type": "publicKey"
},
{
"name": "serumPcVaultAccount",
"type": "publicKey"
},
{
"name": "serumFeeRecipient",
"type": "publicKey"
},
{
"name": "serumDexProgram",
"type": "publicKey"
},
{
"name": "raydiumLpMintAddress",
"type": "publicKey"
},
{
"name": "raydiumAmmId",
"type": "publicKey"
},
{
"name": "raydiumAmmAuthority",
"type": "publicKey"
},
{
"name": "raydiumAmmOpenOrders",
"type": "publicKey"
},
{
"name": "raydiumAmmQuantitiesOrTargetOrders",
"type": "publicKey"
},
{
"name": "raydiumLiquidityProgram",
"type": "publicKey"
},
{
"name": "raydiumCoinTokenAccount",
"type": "publicKey"
},
{
"name": "raydiumPcTokenAccount",
"type": "publicKey"
},
{
"name": "raydiumPoolTempTokenAccount",
"type": "publicKey"
},
{
"name": "raydiumPoolWithdrawQueue",
"type": "publicKey"
},
{
"name": "lendingMarket",
"type": "publicKey"
},
{
"name": "lendingProgram",
"type": "publicKey"
},
{
"name": "farm",
"type": "u64"
}
]
},
{
"name": "initializeLeveragedFarmOne",
"accounts": [
{
"name": "global",
"isMut": false,
"isSigner": false
},
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "leveragedFarm",
"isMut": true,
"isSigner": false
}
],
"args": [
{
"name": "baseMint",
"type": "publicKey"
},
{
"name": "quoteMint",
"type": "publicKey"
},
{
"name": "feeReceiver",
"type": "publicKey"
},
{
"name": "lpTokenPriceAccount",
"type": "publicKey"
},
{
"name": "coinTokenPriceAccount",
"type": "publicKey"
},
{
"name": "pcTokenPriceAccount",
"type": "publicKey"
},
{
"name": "coinReserveLiquidityFeeReceiver",
"type": "publicKey"
},
{
"name": "pcReserveLiquidityFeeReceiver",
"type": "publicKey"
},
{
"name": "lpDecimals",
"type": "u8"
},
{
"name": "baseDecimals",
"type": "u8"
},
{
"name": "quoteDecimals",
"type": "u8"
},
{
"name": "supportsFee",
"type": "bool"
}
]
},
{
"name": "initializeLeveragedFarmTwo",
"accounts": [
{
"name": "global",
"isMut": false,
"isSigner": false
},
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "leveragedFarm",
"isMut": true,
"isSigner": false
}
],
"args": [
{
"name": "baseReserve",
"type": "publicKey"
},
{
"name": "quoteReserve",
"type": "publicKey"
},
{
"name": "baseTokenAccount",
"type": "publicKey"
},
{
"name": "quoteTokenAccount",
"type": "publicKey"
},
{
"name": "serumOpenOrdersAccount",
"type": "publicKey"
},
{
"name": "buySlip",
"type": "u64"
},
{
"name": "sellSlip",
"type": "u64"
}
]
},
{
"name": "createUserFarm",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "userFarm",
"isMut": true,
"isSigner": false
},
{
"name": "userFarmObligation",
"isMut": true,
"isSigner": false
},
{
"name": "lendingMarket",
"isMut": true,
"isSigner": false
},
{
"name": "global",
"isMut": false,
"isSigner": false
},
{
"name": "leveragedFarm",
"isMut": false,
"isSigner": false
},
{
"name": "clock",
"isMut": false,
"isSigner": false
},
{
"name": "rent",
"isMut": false,
"isSigner": false
},
{
"name": "systemProgram",
"isMut": false,
"isSigner": false
},
{
"name": "lendingProgram",
"isMut": false,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
},
{
"name": "obligationVaultAddress",
"isMut": true,
"isSigner": false
}
],
"args": [
{
"name": "farmProgramId",
"type": "publicKey"
}
]
},
{
"name": "createUserFarmObligation",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "userFarm",
"isMut": true,
"isSigner": false
},
{
"name": "leveragedFarm",
"isMut": false,
"isSigner": false
},
{
"name": "userFarmObligation",
"isMut": true,
"isSigner": false
},
{
"name": "lendingMarket",
"isMut": true,
"isSigner": false
},
{
"name": "obligationVaultAddress",
"isMut": true,
"isSigner": false
},
{
"name": "clock",
"isMut": false,
"isSigner": false
},
{
"name": "rent",
"isMut": false,
"isSigner": false
},
{
"name": "lendingProgram",
"isMut": false,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
},
{
"name": "systemProgram",
"isMut": false,
"isSigner": false
}
],
"args": []
},
{
"name": "depositBorrowDual",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "userFarm",
"isMut": true,
"isSigner": false
},
{
"name": "leveragedFarm",
"isMut": false,
"isSigner": false
},
{
"name": "userFarmObligation",
"isMut": true,
"isSigner": false
},
{
"name": "coinSourceTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "coinDestinationTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "pcSourceTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "pcDestinationTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "coinDepositReserveAccount",
"isMut": true,
"isSigner": false
},
{
"name": "pcDepositReserveAccount",
"isMut": true,
"isSigner": false
},
{
"name": "coinReserveLiquidityOracle",
"isMut": false,
"isSigner": false
},
{
"name": "pcReserveLiquidityOracle",
"isMut": false,
"isSigner": false
},
{
"name": "lendingMarketAccount",
"isMut": false,
"isSigner": false
},
{
"name": "derivedLendingMarketAuthority",
"isMut": false,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
},
{
"name": "lendingProgram",
"isMut": false,
"isSigner": false
},
{
"name": "coinSourceReserveLiquidityTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "pcSourceReserveLiquidityTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "coinReserveLiquidityFeeReceiver",
"isMut": true,
"isSigner": false
},
{
"name": "pcReserveLiquidityFeeReceiver",
"isMut": true,
"isSigner": false
},
{
"name": "borrowAuthorizer",
"isMut": false,
"isSigner": false
},
{
"name": "lpPythPriceAccount",
"isMut": false,
"isSigner": false
},
{
"name": "vaultAccount",
"isMut": true,
"isSigner": false
},
{
"name": "rent",
"isMut": false,
"isSigner": false
}
],
"args": [
{
"name": "coinAmount",
"type": "u64"
},
{
"name": "pcAmount",
"type": "u64"
},
{
"name": "coinBorrowAmount",
"type": "u64"
},
{
"name": "pcBorrowAmount",
"type": "u64"
},
{
"name": "obligationIndex",
"type": "u8"
}
]
},
{
"name": "swapTokensRaydiumStats",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "leveragedFarm",
"isMut": true,
"isSigner": false
},
{
"name": "userFarm",
"isMut": true,
"isSigner": false
},
{
"name": "userFarmObligation",
"isMut": true,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
},
{
"name": "vaultSigner",
"isMut": false,
"isSigner": false
},
{
"name": "swapOrLiquidityProgramId",
"isMut": false,
"isSigner": false
},
{
"name": "ammId",
"isMut": true,
"isSigner": false
},
{
"name": "ammAuthority",
"isMut": true,
"isSigner": false
},
{
"name": "ammOpenOrders",
"isMut": true,
"isSigner": false
},
{
"name": "ammQuantitiesOrTargetOrders",
"isMut": true,
"isSigner": false
},
{
"name": "poolCoinTokenaccount",
"isMut": true,
"isSigner": false
},
{
"name": "poolPcTokenaccount",
"isMut": true,
"isSigner": false
},
{
"name": "serumProgramId",
"isMut": false,
"isSigner": false
},
{
"name": "serumMarket",
"isMut": true,
"isSigner": false
},
{
"name": "serumBids",
"isMut": true,
"isSigner": false
},
{
"name": "serumAsks",
"isMut": true,
"isSigner": false
},
{
"name": "serumEventQueue",
"isMut": true,
"isSigner": false
},
{
"name": "serumCoinVaultAccount",
"isMut": true,
"isSigner": false
},
{
"name": "serumPcVaultAccount",
"isMut": true,
"isSigner": false
},
{
"name": "serumVaultSigner",
"isMut": true,
"isSigner": false
},
{
"name": "coinWallet",
"isMut": true,
"isSigner": false
},
{
"name": "pcWallet",
"isMut": true,
"isSigner": false
}
],
"args": [
{
"name": "obligationIndex",
"type": "u8"
}
]
},
{
"name": "swapTokensOrcaStats",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "leveragedFarm",
"isMut": true,
"isSigner": false
},
{
"name": "userFarm",
"isMut": true,
"isSigner": false
},
{
"name": "userFarmObligation",
"isMut": true,
"isSigner": false
},
{
"name": "pcWallet",
"isMut": true,
"isSigner": false
},
{
"name": "market",
"accounts": [
{
"name": "market",
"isMut": true,
"isSigner": false
},
{
"name": "openOrders",
"isMut": true,
"isSigner": false
},
{
"name": "requestQueue",
"isMut": true,
"isSigner": false
},
{
"name": "eventQueue",
"isMut": true,
"isSigner": false
},
{
"name": "bids",
"isMut": true,
"isSigner": false
},
{
"name": "asks",
"isMut": true,
"isSigner": false
},
{
"name": "orderPayerTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "coinVault",
"isMut": true,
"isSigner": false
},
{
"name": "pcVault",
"isMut": true,
"isSigner": false
},
{
"name": "vaultSigner",
"isMut": false,
"isSigner": false
},
{
"name": "coinWallet",
"isMut": true,
"isSigner": false
}
]
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
},
{
"name": "rent",
"isMut": false,
"isSigner": false
},
{
"name": "dexProgram",
"isMut": false,
"isSigner": false
},
{
"name": "vaultSigner",
"isMut": false,
"isSigner": false
}
],
"args": [
{
"name": "obligationIndex",
"type": "u8"
}
]
},
{
"name": "addLiquidityStats",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "userFarm",
"isMut": true,
"isSigner": false
},
{
"name": "leveragedFarm",
"isMut": true,
"isSigner": false
},
{
"name": "liquidityProgramId",
"isMut": false,
"isSigner": false
},
{
"name": "ammId",
"isMut": true,
"isSigner": false
},
{
"name": "ammAuthority",
"isMut": true,
"isSigner": false
},
{
"name": "ammOpenOrders",
"isMut": true,
"isSigner": false
},
{
"name": "ammQuantitiesOrTargetOrders",
"isMut": true,
"isSigner": false
},
{
"name": "lpMintAddress",
"isMut": true,
"isSigner": false
},
{
"name": "poolCoinTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "poolPcTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "serumMarket",
"isMut": true,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
},
{
"name": "levFarmCoinTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "levFarmPcTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "userLpTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "pythPriceAccount",
"isMut": false,
"isSigner": false
},
{
"name": "lendingMarketAccount",
"isMut": false,
"isSigner": false
},
{
"name": "userFarmObligation",
"isMut": true,
"isSigner": false
},
{
"name": "derivedLendingMarketAuthority",
"isMut": false,
"isSigner": false
},
{
"name": "lendingProgram",
"isMut": false,
"isSigner": false
},
{
"name": "clock",
"isMut": false,
"isSigner": false
},
{
"name": "dexProgram",
"isMut": false,
"isSigner": false
}
],
"args": [
{
"name": "obligationIndex",
"type": "u8"
}
]
},
{
"name": "orcaAddLiquidityQueue",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "userFarm",
"isMut": true,
"isSigner": false
},
{
"name": "leveragedFarm",
"isMut": true,
"isSigner": false
},
{
"name": "vaultAccount",
"isMut": true,
"isSigner": false
},
{
"name": "vaultUserAccount",
"isMut": true,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
},
{
"name": "rent",
"isMut": false,
"isSigner": false
},
{
"name": "vaultPda",
"isMut": true,
"isSigner": false
},
{
"name": "systemProgram",
"isMut": false,
"isSigner": false
},
{
"name": "levFarmCoinTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "levFarmPcTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "poolCoinTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "poolPcTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "liquidityProgramId",
"isMut": false,
"isSigner": false
},
{
"name": "ammId",
"isMut": true,
"isSigner": false
},
{
"name": "ammAuthority",
"isMut": true,
"isSigner": false
},
{
"name": "vaultDepositQueue",
"isMut": true,
"isSigner": false
},
{
"name": "lpMintAddress",
"isMut": true,
"isSigner": false
},
{
"name": "lendingMarketAccount",
"isMut": true,
"isSigner": false
},
{
"name": "userFarmObligation",
"isMut": true,
"isSigner": false
},
{
"name": "derivedLendingMarketAuthority",
"isMut": true,
"isSigner": false
},
{
"name": "lendingProgram",
"isMut": false,
"isSigner": false
},
{
"name": "dexProgram",
"isMut": false,
"isSigner": false
},
{
"name": "solfarmVaultProgram",
"isMut": false,
"isSigner": false
},
{
"name": "obligationVaultAddress",
"isMut": true,
"isSigner": false
}
],
"args": [
{
"name": "args",
"type": {
"defined": "OrcaAddLiqQueueArgs"
}
}
]
},
{
"name": "depositOrcaVaultDd",
"accounts": [
{
"name": "authority",
"isMut": true,
"isSigner": true
},
{
"name": "vaultAccount",
"isMut": true,
"isSigner": false
},
{
"name": "vaultUserAccount",
"isMut": true,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
},
{
"name": "rent",
"isMut": false,
"isSigner": false
},
{
"name": "vaultPda",
"isMut": true,
"isSigner": false
},
{
"name": "systemProgram",
"isMut": false,
"isSigner": false
},
{
"name": "userFarmTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "userFarmDdTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "userRewardDdTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "globalBaseDdTokenVault",
"isMut": true,
"isSigner": false
},
{
"name": "farmDdTokenMint",
"isMut": true,
"isSigner": false
},
{
"name": "globalFarmDd",
"isMut": true,
"isSigner": false
},
{
"name": "userFarmDd",
"isMut": true,
"isSigner": false
},
{
"name": "globalRewardDdTokenVault",
"isMut": true,
"isSigner": false
},
{
"name": "convertAuthorityDd",
"isMut": false,
"isSigner": false
},
{
"name": "aquaFarmProgram",
"isMut": false,
"isSigner": false
},
{
"name": "solfarmVaultProgram",
"isMut": false,
"isSigner": false
},
{
"name": "obligationVaultAddress",
"isMut": true,
"isSigner": false
},
{
"name": "leveragedFarm",
"isMut": false,
"isSigner": false
},
{
"name": "leveragedUserFarm",
"isMut": true,
"isSigner": false
}
],
"args": [
{
"name": "depositArgs",
"type": {
"defined": "DepositOrcaVaultArgs"
}
},
{
"name": "obligationIndex",
"type": "u8"
}
]
},
{
"name": "depositOrcaVaultWithoutShares",
"accounts": [
{
"name": "authority",
"isMut": true,
"isSigner": true
},
{
"name": "vaultAccount",
"isMut": true,
"isSigner": false
},
{
"name": "vaultUserAccount",
"isMut": true,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
},
{
"name": "rent",
"isMut": false,
"isSigner": false
},
{
"name": "vaultPda",
"isMut": true,
"isSigner": false
},
{
"name": "systemProgram",
"isMut": false,
"isSigner": false
},
{
"name": "userFarmOwner",
"isMut": true,
"isSigner": false
},
{
"name": "userTransferAuthority",
"isMut": false,
"isSigner": false
},
{
"name": "userBaseTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "userFarmTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "userRewardTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "globalBaseTokenVault",
"isMut": true,
"isSigner": false
},
{
"name": "farmTokenMint",
"isMut": true,
"isSigner": false
},
{
"name": "globalFarm",
"isMut": true,
"isSigner": false
},
{
"name": "orcaUserFarm",
"isMut": true,
"isSigner": false
},
{
"name": "globalRewardTokenVault",
"isMut": true,
"isSigner": false
},
{
"name": "convertAuthority",
"isMut": false,
"isSigner": false
},
{
"name": "aquaFarmProgram",
"isMut": false,
"isSigner": false
},
{
"name": "fundingTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "leveragedFarm",
"isMut": false,
"isSigner": false
},
{
"name": "leveragedUserFarm",
"isMut": true,
"isSigner": false
},
{
"name": "clock",
"isMut": false,
"isSigner": false
},
{
"name": "solfarmVaultProgram",
"isMut": false,
"isSigner": false
},
{
"name": "obligationVaultAddress",
"isMut": true,
"isSigner": false
}
],
"args": [
{
"name": "depositArgs",
"type": {
"defined": "DepositOrcaVaultArgs"
}
},
{
"name": "obligationIndex",
"type": "u8"
}
]
},
{
"name": "depositOrcaVault",
"accounts": [
{
"name": "authority",
"isMut": true,
"isSigner": true
},
{
"name": "vaultAccount",
"isMut": true,
"isSigner": false
},
{
"name": "vaultUserAccount",
"isMut": true,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
},
{
"name": "rent",
"isMut": false,
"isSigner": false
},
{
"name": "vaultPda",
"isMut": true,
"isSigner": false
},
{
"name": "systemProgram",
"isMut": false,
"isSigner": false
},
{
"name": "userFarmOwner",
"isMut": true,
"isSigner": false
},
{
"name": "userTransferAuthority",
"isMut": false,
"isSigner": false
},
{
"name": "userBaseTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "userFarmTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "userRewardTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "globalBaseTokenVault",
"isMut": true,
"isSigner": false
},
{
"name": "farmTokenMint",
"isMut": true,
"isSigner": false
},
{
"name": "globalFarm",
"isMut": true,
"isSigner": false
},
{
"name": "orcaUserFarm",
"isMut": true,
"isSigner": false
},
{
"name": "globalRewardTokenVault",
"isMut": true,
"isSigner": false
},
{
"name": "convertAuthority",
"isMut": false,
"isSigner": false
},
{
"name": "aquaFarmProgram",
"isMut": false,
"isSigner": false
},
{
"name": "fundingTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "leveragedFarm",
"isMut": false,
"isSigner": false
},
{
"name": "leveragedUserFarm",
"isMut": true,
"isSigner": false
},
{
"name": "clock",
"isMut": false,
"isSigner": false
},
{
"name": "solfarmVaultProgram",
"isMut": false,
"isSigner": false
},
{
"name": "obligationVaultAddress",
"isMut": true,
"isSigner": false
}
],
"args": [
{
"name": "depositArgs",
"type": {
"defined": "DepositOrcaVaultArgs"
}
},
{
"name": "obligationIndex",
"type": "u8"
}
]
},
{
"name": "withdrawOrcaVaultDdClose",
"accounts": [
{
"name": "authority",
"isMut": true,
"isSigner": true
},
{
"name": "vaultAccount",
"isMut": true,
"isSigner": false
},
{
"name": "vaultUserAccount",
"isMut": true,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
},
{
"name": "rent",
"isMut": false,
"isSigner": false
},
{
"name": "vaultPda",
"isMut": true,
"isSigner": false
},
{
"name": "systemProgram",
"isMut": false,
"isSigner": false
},
{
"name": "userFarmTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "userFarmDdTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "userRewardDdTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "globalBaseDdTokenVault",
"isMut": true,
"isSigner": false
},
{
"name": "farmDdTokenMint",
"isMut": true,
"isSigner": false
},
{
"name": "globalFarmDd",
"isMut": true,
"isSigner": false
},
{
"name": "userFarmDd",
"isMut": true,
"isSigner": false
},
{
"name": "globalRewardDdTokenVault",
"isMut": true,
"isSigner": false
},
{
"name": "convertAuthorityDd",
"isMut": false,
"isSigner": false
},
{
"name": "aquaFarmProgram",
"isMut": false,
"isSigner": false
},
{
"name": "leveragedUserFarm",
"isMut": true,
"isSigner": false
},
{
"name": "leveragedFarm",
"isMut": true,
"isSigner": false
},
{
"name": "solfarmVaultProgram",
"isMut": false,
"isSigner": false
},
{
"name": "obligationVaultAddress",
"isMut": true,
"isSigner": false
}
],
"args": [
{
"name": "obligationIndex",
"type": "u8"
},
{
"name": "withdrawPercent",
"type": "u8"
},
{
"name": "closeMethod",
"type": "u8"
}
]
},
{
"name": "closePositionInfoAccount",
"accounts": [
{
"name": "authority",
"isMut": true,
"isSigner": true
},
{
"name": "positionInfoAccount",
"isMut": true,
"isSigner": false
}
],
"args": []
},
{
"name": "withdrawOrcaVault",
"accounts": [
{
"name": "authority",
"isMut": true,
"isSigner": true
},
{
"name": "vaultAccount",
"isMut": true,
"isSigner": false
},
{
"name": "vaultUserAccount",
"isMut": true,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
},
{
"name": "rent",
"isMut": false,
"isSigner": false
},
{
"name": "vaultPda",
"isMut": true,
"isSigner": false
},
{
"name": "systemProgram",
"isMut": false,
"isSigner": false
},
{
"name": "userFarmOwner",
"isMut": true,
"isSigner": false
},
{
"name": "userTransferAuthority",
"isMut": false,
"isSigner": false
},
{
"name": "userBaseTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "userFarmTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "userRewardTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "globalBaseTokenVault",
"isMut": true,
"isSigner": false
},
{
"name": "farmTokenMint",
"isMut": true,
"isSigner": false
},
{
"name": "globalFarm",
"isMut": true,
"isSigner": false
},
{
"name": "orcaUserFarm",
"isMut": true,
"isSigner": false
},
{
"name": "globalRewardTokenVault",
"isMut": true,
"isSigner": false
},
{
"name": "convertAuthority",
"isMut": false,
"isSigner": false
},
{
"name": "aquaFarmProgram",
"isMut": false,
"isSigner": false
},
{
"name": "receivingTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "clock",
"isMut": false,
"isSigner": false
},
{
"name": "leveragedUserFarm",
"isMut": true,
"isSigner": false
},
{
"name": "leveragedFarm",
"isMut": true,
"isSigner": false
},
{
"name": "solfarmVaultProgram",
"isMut": false,
"isSigner": false
},
{
"name": "obligationVaultAddress",
"isMut": true,
"isSigner": false
}
],
"args": [
{
"name": "obligationIndex",
"type": "u8"
},
{
"name": "withdrawPercent",
"type": "u8"
},
{
"name": "closeMethod",
"type": "u8"
}
]
},
{
"name": "withdrawOrcaVaultClose",
"accounts": [
{
"name": "authority",
"isMut": true,
"isSigner": true
},
{
"name": "vaultAccount",
"isMut": true,
"isSigner": false
},
{
"name": "vaultUserAccount",
"isMut": true,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
},
{
"name": "rent",
"isMut": false,
"isSigner": false
},
{
"name": "vaultPda",
"isMut": true,
"isSigner": false
},
{
"name": "systemProgram",
"isMut": false,
"isSigner": false
},
{
"name": "userFarmOwner",
"isMut": true,
"isSigner": false
},
{
"name": "userTransferAuthority",
"isMut": false,
"isSigner": false
},
{
"name": "userBaseTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "userFarmTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "userRewardTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "globalBaseTokenVault",
"isMut": true,
"isSigner": false
},
{
"name": "farmTokenMint",
"isMut": true,
"isSigner": false
},
{
"name": "globalFarm",
"isMut": true,
"isSigner": false
},
{
"name": "orcaUserFarm",
"isMut": true,
"isSigner": false
},
{
"name": "globalRewardTokenVault",
"isMut": true,
"isSigner": false
},
{
"name": "convertAuthority",
"isMut": false,
"isSigner": false
},
{
"name": "aquaFarmProgram",
"isMut": false,
"isSigner": false
},
{
"name": "receivingTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "clock",
"isMut": false,
"isSigner": false
},
{
"name": "leveragedUserFarm",
"isMut": true,
"isSigner": false
},
{
"name": "leveragedFarm",
"isMut": true,
"isSigner": false
},
{
"name": "solfarmVaultProgram",
"isMut": false,
"isSigner": false
},
{
"name": "obligationVaultAddress",
"isMut": true,
"isSigner": false
}
],
"args": [
{
"name": "obligationIndex",
"type": "u8"
},
{
"name": "withdrawPercent",
"type": "u8"
},
{
"name": "closeMethod",
"type": "u8"
}
]
},
{
"name": "withdrawOrcaVaultWithoutShares",
"accounts": [
{
"name": "authority",
"isMut": true,
"isSigner": true
},
{
"name": "vaultAccount",
"isMut": true,
"isSigner": false
},
{
"name": "vaultUserAccount",
"isMut": true,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
},
{
"name": "rent",
"isMut": false,
"isSigner": false
},
{
"name": "vaultPda",
"isMut": true,
"isSigner": false
},
{
"name": "systemProgram",
"isMut": false,
"isSigner": false
},
{
"name": "userFarmOwner",
"isMut": true,
"isSigner": false
},
{
"name": "userTransferAuthority",
"isMut": false,
"isSigner": false
},
{
"name": "userBaseTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "userFarmTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "userRewardTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "globalBaseTokenVault",
"isMut": true,
"isSigner": false
},
{
"name": "farmTokenMint",
"isMut": true,
"isSigner": false
},
{
"name": "globalFarm",
"isMut": true,
"isSigner": false
},
{
"name": "orcaUserFarm",
"isMut": true,
"isSigner": false
},
{
"name": "globalRewardTokenVault",
"isMut": true,
"isSigner": false
},
{
"name": "convertAuthority",
"isMut": false,
"isSigner": false
},
{
"name": "aquaFarmProgram",
"isMut": false,
"isSigner": false
},
{
"name": "receivingTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "clock",
"isMut": false,
"isSigner": false
},
{
"name": "leveragedUserFarm",
"isMut": true,
"isSigner": false
},
{
"name": "leveragedFarm",
"isMut": true,
"isSigner": false
},
{
"name": "solfarmVaultProgram",
"isMut": false,
"isSigner": false
},
{
"name": "obligationVaultAddress",
"isMut": true,
"isSigner": false
}
],
"args": [
{
"name": "obligationIndex",
"type": "u8"
}
]
},
{
"name": "depositVault",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "userFarm",
"isMut": true,
"isSigner": false
},
{
"name": "obligationVaultAddress",
"isMut": true,
"isSigner": false
},
{
"name": "leveragedFarm",
"isMut": true,
"isSigner": false
},
{
"name": "vaultProgram",
"isMut": false,
"isSigner": false
},
{
"name": "authorityTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "vaultPdaAccount",
"isMut": true,
"isSigner": false
},
{
"name": "vault",
"isMut": true,
"isSigner": false
},
{
"name": "lpTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "userBalanceAccount",
"isMut": true,
"isSigner": false
},
{
"name": "systemProgram",
"isMut": false,
"isSigner": false
},
{
"name": "stakeProgramId",
"isMut": false,
"isSigner": false
},
{
"name": "poolId",
"isMut": true,
"isSigner": false
},
{
"name": "poolAuthority",
"isMut": true,
"isSigner": false
},
{
"name": "userInfoAccount",
"isMut": true,
"isSigner": false
},
{
"name": "poolLpTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "userRewardATokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "poolRewardATokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "userRewardBTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "poolRewardBTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "clock",
"isMut": false,
"isSigner": false
},
{
"name": "rent",
"isMut": false,
"isSigner": false
},
{
"name": "tokenProgramId",
"isMut": false,
"isSigner": false
},
{
"name": "userBalanceMetadata",
"isMut": true,
"isSigner": false
}
],
"args": [
{
"name": "depositArgs",
"type": {
"defined": "DepositFarmArgs"
}
},
{
"name": "obligationIndex",
"type": "u8"
}
]
},
{
"name": "withdrawRaydiumVaultClose",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "userFarm",
"isMut": true,
"isSigner": false
},
{
"name": "obligationVaultAddress",
"isMut": true,
"isSigner": false
},
{
"name": "leveragedFarm",
"isMut": false,
"isSigner": false
},
{
"name": "authorityTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "vault",
"isMut": true,
"isSigner": false
},
{
"name": "vaultProgram",
"isMut": false,
"isSigner": false
},
{
"name": "userBalanceAccount",
"isMut": true,
"isSigner": false
},
{
"name": "userInfoAccount",
"isMut": true,
"isSigner": false
},
{
"name": "userLpTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "userRewardATokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "poolRewardATokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "userRewardBTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "poolRewardBTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "tokenProgramId",
"isMut": false,
"isSigner": false
},
{
"name": "clock",
"isMut": false,
"isSigner": false
},
{
"name": "vaultPdaAccount",
"isMut": true,
"isSigner": false
},
{
"name": "poolLpTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "poolAuthority",
"isMut": true,
"isSigner": false
},
{
"name": "poolId",
"isMut": true,
"isSigner": false
},
{
"name": "stakeProgramId",
"isMut": false,
"isSigner": false
},
{
"name": "userBalanceMeta",
"isMut": true,
"isSigner": false
}
],
"args": [
{
"name": "withdrawArgs",
"type": {
"defined": "WithdrawFarmArgs"
}
},
{
"name": "obligationIndex",
"type": "u8"
},
{
"name": "withdrawPercent",
"type": "u8"
},
{
"name": "closeMethod",
"type": "u8"
}
]
},
{
"name": "removeLiquidityNew",
"accounts": [
{
"name": "removeLiq",
"accounts": [
{
"name": "userFarm",
"isMut": true,
"isSigner": false
},
{
"name": "obligationVaultAddress",
"isMut": true,
"isSigner": false
},
{
"name": "leveragedFarm",
"isMut": false,
"isSigner": false
},
{
"name": "liquidityProgramId",
"isMut": false,
"isSigner": false
},
{
"name": "ammId",
"isMut": true,
"isSigner": false
},
{
"name": "ammAuthority",
"isMut": true,
"isSigner": false
},
{
"name": "ammOpenOrders",
"isMut": true,
"isSigner": false
},
{
"name": "ammQuantitiesOrTargetOrders",
"isMut": true,
"isSigner": false
},
{
"name": "lpMintAddress",
"isMut": true,
"isSigner": false
},
{
"name": "poolCoinTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "poolPcTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "poolWithdrawQueue",
"isMut": true,
"isSigner": false
},
{
"name": "poolTempLpTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "serumProgramId",
"isMut": false,
"isSigner": false
},
{
"name": "serumMarket",
"isMut": true,
"isSigner": false
},
{
"name": "serumCoinVaultAccount",
"isMut": true,
"isSigner": false
},
{
"name": "serumPcVaultAccount",
"isMut": true,
"isSigner": false
},
{
"name": "serumVaultSigner",
"isMut": true,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
},
{
"name": "levFarmCoinTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "levFarmPcTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "userLpTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "clock",
"isMut": false,
"isSigner": false
}
]
}
],
"args": [
{
"name": "obligationIndex",
"type": "u8"
},
{
"name": "obligationVaultNonce",
"type": "u8"
}
]
},
{
"name": "swapTokensSerum",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "leveragedFarm",
"isMut": true,
"isSigner": false
},
{
"name": "userFarm",
"isMut": true,
"isSigner": false
},
{
"name": "userFarmObligation",
"isMut": true,
"isSigner": false
},
{
"name": "pcWallet",
"isMut": true,
"isSigner": false
},
{
"name": "market",
"accounts": [
{
"name": "market",
"isMut": true,
"isSigner": false
},
{
"name": "openOrders",
"isMut": true,
"isSigner": false
},
{
"name": "requestQueue",
"isMut": true,
"isSigner": false
},
{
"name": "eventQueue",
"isMut": true,
"isSigner": false
},
{
"name": "bids",
"isMut": true,
"isSigner": false
},
{
"name": "asks",
"isMut": true,
"isSigner": false
},
{
"name": "orderPayerTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "coinVault",
"isMut": true,
"isSigner": false
},
{
"name": "pcVault",
"isMut": true,
"isSigner": false
},
{
"name": "vaultSigner",
"isMut": false,
"isSigner": false
},
{
"name": "coinWallet",
"isMut": true,
"isSigner": false
}
]
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
},
{
"name": "rent",
"isMut": false,
"isSigner": false
},
{
"name": "dexProgram",
"isMut": false,
"isSigner": false
},
{
"name": "vaultSigner",
"isMut": false,
"isSigner": false
}
],
"args": [
{
"name": "reserves",
"type": {
"vec": "publicKey"
}
},
{
"name": "obligationIndex",
"type": "u8"
}
]
},
{
"name": "swapTokensToRepayOrca",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "leveragedFarm",
"isMut": true,
"isSigner": false
},
{
"name": "userFarm",
"isMut": true,
"isSigner": false
},
{
"name": "userFarmObligation",
"isMut": true,
"isSigner": false
},
{
"name": "pcWallet",
"isMut": true,
"isSigner": false
},
{
"name": "market",
"accounts": [
{
"name": "market",
"isMut": true,
"isSigner": false
},
{
"name": "openOrders",
"isMut": true,
"isSigner": false
},
{
"name": "requestQueue",
"isMut": true,
"isSigner": false
},
{
"name": "eventQueue",
"isMut": true,
"isSigner": false
},
{
"name": "bids",
"isMut": true,
"isSigner": false
},
{
"name": "asks",
"isMut": true,
"isSigner": false
},
{
"name": "orderPayerTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "coinVault",
"isMut": true,
"isSigner": false
},
{
"name": "pcVault",
"isMut": true,
"isSigner": false
},
{
"name": "vaultSigner",
"isMut": false,
"isSigner": false
},
{
"name": "coinWallet",
"isMut": true,
"isSigner": false
}
]
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
},
{
"name": "rent",
"isMut": false,
"isSigner": false
},
{
"name": "dexProgram",
"isMut": false,
"isSigner": false
},
{
"name": "vaultSigner",
"isMut": false,
"isSigner": false
}
],
"args": [
{
"name": "reserves",
"type": {
"vec": "publicKey"
}
},
{
"name": "obligationIndex",
"type": "u8"
},
{
"name": "minCoinSwap",
"type": "u64"
},
{
"name": "minPcSwap",
"type": "u64"
}
]
},
{
"name": "swapToRepayOrca",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "leveragedFarm",
"isMut": true,
"isSigner": false
},
{
"name": "userFarm",
"isMut": true,
"isSigner": false
},
{
"name": "userFarmObligation",
"isMut": true,
"isSigner": false
},
{
"name": "pcWallet",
"isMut": true,
"isSigner": false
},
{
"name": "market",
"accounts": [
{
"name": "market",
"isMut": true,
"isSigner": false
},
{
"name": "openOrders",
"isMut": true,
"isSigner": false
},
{
"name": "requestQueue",
"isMut": true,
"isSigner": false
},
{
"name": "eventQueue",
"isMut": true,
"isSigner": false
},
{
"name": "bids",
"isMut": true,
"isSigner": false
},
{
"name": "asks",
"isMut": true,
"isSigner": false
},
{
"name": "orderPayerTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "coinVault",
"isMut": true,
"isSigner": false
},
{
"name": "pcVault",
"isMut": true,
"isSigner": false
},
{
"name": "vaultSigner",
"isMut": false,
"isSigner": false
},
{
"name": "coinWallet",
"isMut": true,
"isSigner": false
}
]
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
},
{
"name": "rent",
"isMut": false,
"isSigner": false
},
{
"name": "dexProgram",
"isMut": false,
"isSigner": false
},
{
"name": "vaultSigner",
"isMut": false,
"isSigner": false
}
],
"args": [
{
"name": "reserves",
"type": {
"vec": "publicKey"
}
},
{
"name": "obligationIndex",
"type": "u8"
}
]
},
{
"name": "repayObligationLiquidity",
"accounts": [
{
"name": "authority",
"isMut": true,
"isSigner": true
},
{
"name": "userFarm",
"isMut": true,
"isSigner": false
},
{
"name": "userFarmObligation",
"isMut": true,
"isSigner": false
},
{
"name": "leveragedFarm",
"isMut": false,
"isSigner": false
},
{
"name": "coinSourceTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "coinDestinationTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "pcSourceTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "pcDestinationTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "coinReserveAccount",
"isMut": true,
"isSigner": false
},
{
"name": "pcReserveAccount",
"isMut": true,
"isSigner": false
},
{
"name": "lendingMarketAccount",
"isMut": true,
"isSigner": false
},
{
"name": "derivedLendingMarketAuthority",
"isMut": true,
"isSigner": false
},
{
"name": "clock",
"isMut": false,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
},
{
"name": "lendingProgram",
"isMut": false,
"isSigner": false
},
{
"name": "lpPythPriceAccount",
"isMut": false,
"isSigner": false
},
{
"name": "coinPriceAccount",
"isMut": false,
"isSigner": false
},
{
"name": "pcPriceAccount",
"isMut": false,
"isSigner": false
},
{
"name": "vaultAccount",
"isMut": true,
"isSigner": false
},
{
"name": "userCoinTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "userPcTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "positionInfoAccount",
"isMut": true,
"isSigner": false
}
],
"args": [
{
"name": "reserves",
"type": {
"vec": "publicKey"
}
},
{
"name": "obligationIndex",
"type": "u8"
}
]
},
{
"name": "repayObligationLiquidityExternal",
"accounts": [
{
"name": "authority",
"isMut": true,
"isSigner": true
},
{
"name": "userFarm",
"isMut": true,
"isSigner": false
},
{
"name": "userFarmObligation",
"isMut": true,
"isSigner": false
},
{
"name": "leveragedFarm",
"isMut": false,
"isSigner": false
},
{
"name": "coinSourceTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "coinDestinationTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "pcSourceTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "pcDestinationTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "coinReserveAccount",
"isMut": true,
"isSigner": false
},
{
"name": "pcReserveAccount",
"isMut": true,
"isSigner": false
},
{
"name": "lendingMarketAccount",
"isMut": true,
"isSigner": false
},
{
"name": "derivedLendingMarketAuthority",
"isMut": true,
"isSigner": false
},
{
"name": "clock",
"isMut": false,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
},
{
"name": "lendingProgram",
"isMut": false,
"isSigner": false
},
{
"name": "lpPythPriceAccount",
"isMut": false,
"isSigner": false
},
{
"name": "coinPriceAccount",
"isMut": false,
"isSigner": false
},
{
"name": "pcPriceAccount",
"isMut": false,
"isSigner": false
},
{
"name": "vaultAccount",
"isMut": true,
"isSigner": false
},
{
"name": "userCoinTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "userPcTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "positionInfoAccount",
"isMut": true,
"isSigner": false
}
],
"args": [
{
"name": "reserves",
"type": {
"vec": "publicKey"
}
},
{
"name": "obligationIndex",
"type": "u8"
}
]
},
{
"name": "harvestTulips",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "userFarm",
"isMut": true,
"isSigner": false
},
{
"name": "obligationVaultAddress",
"isMut": true,
"isSigner": false
},
{
"name": "leveragedFarm",
"isMut": false,
"isSigner": false
},
{
"name": "vaultProgram",
"isMut": false,
"isSigner": false
},
{
"name": "vault",
"isMut": true,
"isSigner": false
},
{
"name": "vaultPdaAccount",
"isMut": true,
"isSigner": false
},
{
"name": "userInfoAccount",
"isMut": true,
"isSigner": false
},
{
"name": "userBalanceAccount",
"isMut": true,
"isSigner": false
},
{
"name": "userTulipRewardMetadata",
"isMut": true,
"isSigner": false
},
{
"name": "userTulipTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "vaultTulipTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "authorityTulipTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "tokenProgramId",
"isMut": false,
"isSigner": false
},
{
"name": "clock",
"isMut": false,
"isSigner": false
},
{
"name": "rent",
"isMut": false,
"isSigner": false
},
{
"name": "systemProgram",
"isMut": false,
"isSigner": false
}
],
"args": [
{
"name": "harvestArgs",
"type": {
"defined": "HarvestFarmTulipsArgs"
}
},
{
"name": "obligationIndex",
"type": "u8"
}
]
},
{
"name": "startUserObligationLiquidation",
"accounts": [
{
"name": "global",
"isMut": false,
"isSigner": false
},
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "userFarm",
"isMut": true,
"isSigner": false
},
{
"name": "userObligation",
"isMut": true,
"isSigner": false
},
{
"name": "userObligationLiquidation",
"isMut": true,
"isSigner": false
},
{
"name": "tempLiquidationLpTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "tempLiquidationBaseTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "tempLiquidationQuoteTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "levfarmBaseTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "levfarmQuoteTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "lendingProgram",
"isMut": false,
"isSigner": false
},
{
"name": "leveragedFarm",
"isMut": false,
"isSigner": false
},
{
"name": "clock",
"isMut": false,
"isSigner": false
},
{
"name": "rent",
"isMut": false,
"isSigner": false
},
{
"name": "systemProgram",
"isMut": false,
"isSigner": false
},
{
"name": "pythPriceAccount",
"isMut": false,
"isSigner": false
},
{
"name": "coinPriceAccount",
"isMut": false,
"isSigner": false
},
{
"name": "pcPriceAccount",
"isMut": false,
"isSigner": false
},
{
"name": "vaultAccount",
"isMut": true,
"isSigner": false
},
{
"name": "lendingMarketAccount",
"isMut": false,
"isSigner": false
},
{
"name": "derivedLendingMarketAuthority",
"isMut": false,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
}
],
"args": [
{
"name": "reserves",
"type": {
"vec": "publicKey"
}
},
{
"name": "obligationIndex",
"type": "u8"
},
{
"name": "temporaryAccountNonce",
"type": "u8"
}
]
},
{
"name": "startUserObligationLiquidationNew",
"accounts": [
{
"name": "global",
"isMut": false,
"isSigner": false
},
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "userFarm",
"isMut": true,
"isSigner": false
},
{
"name": "userObligation",
"isMut": true,
"isSigner": false
},
{
"name": "userObligationLiquidation",
"isMut": true,
"isSigner": false
},
{
"name": "tempLiquidationLpTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "tempLiquidationBaseTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "tempLiquidationQuoteTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "levfarmBaseTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "levfarmQuoteTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "lendingProgram",
"isMut": false,
"isSigner": false
},
{
"name": "leveragedFarm",
"isMut": false,
"isSigner": false
},
{
"name": "clock",
"isMut": false,
"isSigner": false
},
{
"name": "rent",
"isMut": false,
"isSigner": false
},
{
"name": "systemProgram",
"isMut": false,
"isSigner": false
},
{
"name": "pythPriceAccount",
"isMut": false,
"isSigner": false
},
{
"name": "coinPriceAccount",
"isMut": false,
"isSigner": false
},
{
"name": "pcPriceAccount",
"isMut": false,
"isSigner": false
},
{
"name": "vaultAccount",
"isMut": true,
"isSigner": false
},
{
"name": "lendingMarketAccount",
"isMut": false,
"isSigner": false
},
{
"name": "derivedLendingMarketAuthority",
"isMut": false,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
},
{
"name": "baseMint",
"isMut": false,
"isSigner": false
},
{
"name": "quoteMint",
"isMut": false,
"isSigner": false
},
{
"name": "lpMint",
"isMut": false,
"isSigner": false
}
],
"args": [
{
"name": "reserves",
"type": {
"vec": "publicKey"
}
},
{
"name": "obligationIndex",
"type": "u8"
},
{
"name": "temporaryAccountNonce",
"type": "u8"
},
{
"name": "baseTokenAccountNonce",
"type": "u8"
},
{
"name": "quoteTokenAccountNonce",
"type": "u8"
},
{
"name": "lpTokenAccountNonce",
"type": "u8"
}
]
},
{
"name": "startSsjUserLiquidationTest",
"accounts": [
{
"name": "global",
"isMut": false,
"isSigner": false
},
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "userFarm",
"isMut": true,
"isSigner": false
},
{
"name": "userObligation",
"isMut": true,
"isSigner": false
},
{
"name": "userObligationLiquidation",
"isMut": true,
"isSigner": false
},
{
"name": "tempLiquidationLpTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "tempLiquidationBaseTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "tempLiquidationQuoteTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "levfarmBaseTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "levfarmQuoteTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "lendingProgram",
"isMut": false,
"isSigner": false
},
{
"name": "leveragedFarm",
"isMut": false,
"isSigner": false
},
{
"name": "clock",
"isMut": false,
"isSigner": false
},
{
"name": "rent",
"isMut": false,
"isSigner": false
},
{
"name": "systemProgram",
"isMut": false,
"isSigner": false
},
{
"name": "pythPriceAccount",
"isMut": false,
"isSigner": false
},
{
"name": "coinPriceAccount",
"isMut": false,
"isSigner": false
},
{
"name": "pcPriceAccount",
"isMut": false,
"isSigner": false
},
{
"name": "vaultAccount",
"isMut": true,
"isSigner": false
},
{
"name": "lendingMarketAccount",
"isMut": false,
"isSigner": false
},
{
"name": "derivedLendingMarketAuthority",
"isMut": false,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
}
],
"args": [
{
"name": "args",
"type": {
"defined": "LiqArgs"
}
}
]
},
{
"name": "pullLpForLiquidationSplTokenSwap",
"accounts": [
{
"name": "userObligationLiquidation",
"isMut": false,
"isSigner": false
},
{
"name": "withdrawFarm",
"accounts": [
{
"name": "authority",
"isMut": true,
"isSigner": true
},
{
"name": "vaultAccount",
"isMut": true,
"isSigner": false
},
{
"name": "vaultUserAccount",
"isMut": true,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
},
{
"name": "rent",
"isMut": false,
"isSigner": false
},
{
"name": "vaultPda",
"isMut": true,
"isSigner": false
},
{
"name": "systemProgram",
"isMut": false,
"isSigner": false
},
{
"name": "userFarmOwner",
"isMut": true,
"isSigner": false
},
{
"name": "userTransferAuthority",
"isMut": false,
"isSigner": false
},
{
"name": "userBaseTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "userFarmTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "userRewardTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "globalBaseTokenVault",
"isMut": true,
"isSigner": false
},
{
"name": "farmTokenMint",
"isMut": true,
"isSigner": false
},
{
"name": "globalFarm",
"isMut": true,
"isSigner": false
},
{
"name": "orcaUserFarm",
"isMut": true,
"isSigner": false
},
{
"name": "globalRewardTokenVault",
"isMut": true,
"isSigner": false
},
{
"name": "convertAuthority",
"isMut": false,
"isSigner": false
},
{
"name": "aquaFarmProgram",
"isMut": false,
"isSigner": false
},
{
"name": "receivingTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "clock",
"isMut": false,
"isSigner": false
},
{
"name": "leveragedUserFarm",
"isMut": true,
"isSigner": false
},
{
"name": "leveragedFarm",
"isMut": true,
"isSigner": false
},
{
"name": "solfarmVaultProgram",
"isMut": false,
"isSigner": false
},
{
"name": "obligationVaultAddress",
"isMut": true,
"isSigner": false
}
]
}
],
"args": [
{
"name": "obligationIndex",
"type": "u8"
}
]
},
{
"name": "pullLpForLiquidationDoubleDip",
"accounts": [
{
"name": "userObligationLiquidation",
"isMut": false,
"isSigner": false
},
{
"name": "withdrawFarm",
"accounts": [
{
"name": "authority",
"isMut": true,
"isSigner": true
},
{
"name": "vaultAccount",
"isMut": true,
"isSigner": false
},
{
"name": "vaultUserAccount",
"isMut": true,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
},
{
"name": "rent",
"isMut": false,
"isSigner": false
},
{
"name": "vaultPda",
"isMut": true,
"isSigner": false
},
{
"name": "systemProgram",
"isMut": false,
"isSigner": false
},
{
"name": "userFarmTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "userFarmDdTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "userRewardDdTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "globalBaseDdTokenVault",
"isMut": true,
"isSigner": false
},
{
"name": "farmDdTokenMint",
"isMut": true,
"isSigner": false
},
{
"name": "globalFarmDd",
"isMut": true,
"isSigner": false
},
{
"name": "userFarmDd",
"isMut": true,
"isSigner": false
},
{
"name": "globalRewardDdTokenVault",
"isMut": true,
"isSigner": false
},
{
"name": "convertAuthorityDd",
"isMut": false,
"isSigner": false
},
{
"name": "aquaFarmProgram",
"isMut": false,
"isSigner": false
},
{
"name": "leveragedUserFarm",
"isMut": true,
"isSigner": false
},
{
"name": "leveragedFarm",
"isMut": true,
"isSigner": false
},
{
"name": "solfarmVaultProgram",
"isMut": false,
"isSigner": false
},
{
"name": "obligationVaultAddress",
"isMut": true,
"isSigner": false
}
]
}
],
"args": [
{
"name": "obligationIndex",
"type": "u8"
}
]
},
{
"name": "pullLpForLiquidationOrcaWithoutShares",
"accounts": [
{
"name": "userObligationLiquidation",
"isMut": false,
"isSigner": false
},
{
"name": "withdrawFarm",
"accounts": [
{
"name": "authority",
"isMut": true,
"isSigner": true
},
{
"name": "vaultAccount",
"isMut": true,
"isSigner": false
},
{
"name": "vaultUserAccount",
"isMut": true,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
},
{
"name": "rent",
"isMut": false,
"isSigner": false
},
{
"name": "vaultPda",
"isMut": true,
"isSigner": false
},
{
"name": "systemProgram",
"isMut": false,
"isSigner": false
},
{
"name": "userFarmOwner",
"isMut": true,
"isSigner": false
},
{
"name": "userTransferAuthority",
"isMut": false,
"isSigner": false
},
{
"name": "userBaseTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "userFarmTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "userRewardTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "globalBaseTokenVault",
"isMut": true,
"isSigner": false
},
{
"name": "farmTokenMint",
"isMut": true,
"isSigner": false
},
{
"name": "globalFarm",
"isMut": true,
"isSigner": false
},
{
"name": "orcaUserFarm",
"isMut": true,
"isSigner": false
},
{
"name": "globalRewardTokenVault",
"isMut": true,
"isSigner": false
},
{
"name": "convertAuthority",
"isMut": false,
"isSigner": false
},
{
"name": "aquaFarmProgram",
"isMut": false,
"isSigner": false
},
{
"name": "receivingTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "clock",
"isMut": false,
"isSigner": false
},
{
"name": "leveragedUserFarm",
"isMut": true,
"isSigner": false
},
{
"name": "leveragedFarm",
"isMut": true,
"isSigner": false
},
{
"name": "solfarmVaultProgram",
"isMut": false,
"isSigner": false
},
{
"name": "obligationVaultAddress",
"isMut": true,
"isSigner": false
}
]
}
],
"args": [
{
"name": "obligationIndex",
"type": "u8"
}
]
},
{
"name": "pullLpForLiquidation",
"accounts": [
{
"name": "global",
"isMut": false,
"isSigner": false
},
{
"name": "userObligationLiquidation",
"isMut": false,
"isSigner": false
},
{
"name": "withdrawFarm",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "userFarm",
"isMut": true,
"isSigner": false
},
{
"name": "obligationVaultAddress",
"isMut": true,
"isSigner": false
},
{
"name": "leveragedFarm",
"isMut": false,
"isSigner": false
},
{
"name": "authorityTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "vault",
"isMut": true,
"isSigner": false
},
{
"name": "vaultProgram",
"isMut": false,
"isSigner": false
},
{
"name": "userBalanceAccount",
"isMut": true,
"isSigner": false
},
{
"name": "userInfoAccount",
"isMut": true,
"isSigner": false
},
{
"name": "userLpTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "userRewardATokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "poolRewardATokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "userRewardBTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "poolRewardBTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "tokenProgramId",
"isMut": false,
"isSigner": false
},
{
"name": "clock",
"isMut": false,
"isSigner": false
},
{
"name": "vaultPdaAccount",
"isMut": true,
"isSigner": false
},
{
"name": "poolLpTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "poolAuthority",
"isMut": true,
"isSigner": false
},
{
"name": "poolId",
"isMut": true,
"isSigner": false
},
{
"name": "stakeProgramId",
"isMut": false,
"isSigner": false
},
{
"name": "userBalanceMeta",
"isMut": true,
"isSigner": false
}
]
}
],
"args": [
{
"name": "metaNonce",
"type": "u8"
},
{
"name": "nonce",
"type": "u8"
},
{
"name": "obligationIndex",
"type": "u8"
}
]
},
{
"name": "removeLiquidityForLiquidation",
"accounts": [
{
"name": "global",
"isMut": false,
"isSigner": false
},
{
"name": "userObligationLiquidation",
"isMut": false,
"isSigner": false
},
{
"name": "removeLiquidity",
"accounts": [
{
"name": "removeLiq",
"accounts": [
{
"name": "userFarm",
"isMut": true,
"isSigner": false
},
{
"name": "obligationVaultAddress",
"isMut": true,
"isSigner": false
},
{
"name": "leveragedFarm",
"isMut": false,
"isSigner": false
},
{
"name": "liquidityProgramId",
"isMut": false,
"isSigner": false
},
{
"name": "ammId",
"isMut": true,
"isSigner": false
},
{
"name": "ammAuthority",
"isMut": true,
"isSigner": false
},
{
"name": "ammOpenOrders",
"isMut": true,
"isSigner": false
},
{
"name": "ammQuantitiesOrTargetOrders",
"isMut": true,
"isSigner": false
},
{
"name": "lpMintAddress",
"isMut": true,
"isSigner": false
},
{
"name": "poolCoinTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "poolPcTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "poolWithdrawQueue",
"isMut": true,
"isSigner": false
},
{
"name": "poolTempLpTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "serumProgramId",
"isMut": false,
"isSigner": false
},
{
"name": "serumMarket",
"isMut": true,
"isSigner": false
},
{
"name": "serumCoinVaultAccount",
"isMut": true,
"isSigner": false
},
{
"name": "serumPcVaultAccount",
"isMut": true,
"isSigner": false
},
{
"name": "serumVaultSigner",
"isMut": true,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
},
{
"name": "levFarmCoinTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "levFarmPcTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "userLpTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "clock",
"isMut": false,
"isSigner": false
}
]
}
]
}
],
"args": [
{
"name": "obligationIndex",
"type": "u8"
}
]
},
{
"name": "removeLiquidityForLiquidationImproved",
"accounts": [
{
"name": "global",
"isMut": false,
"isSigner": false
},
{
"name": "userObligationLiquidation",
"isMut": false,
"isSigner": false
},
{
"name": "removeLiquidity",
"accounts": [
{
"name": "userFarm",
"isMut": true,
"isSigner": false
},
{
"name": "obligationVaultAddress",
"isMut": true,
"isSigner": false
},
{
"name": "leveragedFarm",
"isMut": false,
"isSigner": false
},
{
"name": "liquidityProgramId",
"isMut": false,
"isSigner": false
},
{
"name": "ammId",
"isMut": true,
"isSigner": false
},
{
"name": "ammAuthority",
"isMut": true,
"isSigner": false
},
{
"name": "ammOpenOrders",
"isMut": true,
"isSigner": false
},
{
"name": "ammQuantitiesOrTargetOrders",
"isMut": true,
"isSigner": false
},
{
"name": "lpMintAddress",
"isMut": true,
"isSigner": false
},
{
"name": "poolCoinTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "poolPcTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "poolWithdrawQueue",
"isMut": true,
"isSigner": false
},
{
"name": "poolTempLpTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "serumProgramId",
"isMut": false,
"isSigner": false
},
{
"name": "serumMarket",
"isMut": true,
"isSigner": false
},
{
"name": "serumCoinVaultAccount",
"isMut": true,
"isSigner": false
},
{
"name": "serumPcVaultAccount",
"isMut": true,
"isSigner": false
},
{
"name": "serumVaultSigner",
"isMut": true,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
},
{
"name": "levFarmCoinTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "levFarmPcTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "userLpTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "clock",
"isMut": false,
"isSigner": false
}
]
},
{
"name": "obligationLpTokenAccount",
"isMut": true,
"isSigner": false
}
],
"args": [
{
"name": "obligationIndex",
"type": "u8"
}
]
},
{
"name": "rayLiquidationSwap",
"accounts": [
{
"name": "raySwap",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "leveragedFarm",
"isMut": true,
"isSigner": false
},
{
"name": "userFarm",
"isMut": true,
"isSigner": false
},
{
"name": "userFarmObligation",
"isMut": true,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
},
{
"name": "vaultSigner",
"isMut": false,
"isSigner": false
},
{
"name": "swapOrLiquidityProgramId",
"isMut": false,
"isSigner": false
},
{
"name": "ammId",
"isMut": true,
"isSigner": false
},
{
"name": "ammAuthority",
"isMut": true,
"isSigner": false
},
{
"name": "ammOpenOrders",
"isMut": true,
"isSigner": false
},
{
"name": "ammQuantitiesOrTargetOrders",
"isMut": true,
"isSigner": false
},
{
"name": "poolCoinTokenaccount",
"isMut": true,
"isSigner": false
},
{
"name": "poolPcTokenaccount",
"isMut": true,
"isSigner": false
},
{
"name": "serumProgramId",
"isMut": false,
"isSigner": false
},
{
"name": "serumMarket",
"isMut": true,
"isSigner": false
},
{
"name": "serumBids",
"isMut": true,
"isSigner": false
},
{
"name": "serumAsks",
"isMut": true,
"isSigner": false
},
{
"name": "serumEventQueue",
"isMut": true,
"isSigner": false
},
{
"name": "serumCoinVaultAccount",
"isMut": true,
"isSigner": false
},
{
"name": "serumPcVaultAccount",
"isMut": true,
"isSigner": false
},
{
"name": "serumVaultSigner",
"isMut": true,
"isSigner": false
},
{
"name": "coinWallet",
"isMut": true,
"isSigner": false
},
{
"name": "pcWallet",
"isMut": true,
"isSigner": false
}
]
}
],
"args": [
{
"name": "obligationIndex",
"type": "u8"
}
]
},
{
"name": "splLiquidationSwapExperimental",
"accounts": [
{
"name": "serumSwap",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "leveragedFarm",
"isMut": true,
"isSigner": false
},
{
"name": "userFarm",
"isMut": true,
"isSigner": false
},
{
"name": "userFarmObligation",
"isMut": true,
"isSigner": false
},
{
"name": "pcWallet",
"isMut": true,
"isSigner": false
},
{
"name": "market",
"accounts": [
{
"name": "market",
"isMut": true,
"isSigner": false
},
{
"name": "openOrders",
"isMut": true,
"isSigner": false
},
{
"name": "requestQueue",
"isMut": true,
"isSigner": false
},
{
"name": "eventQueue",
"isMut": true,
"isSigner": false
},
{
"name": "bids",
"isMut": true,
"isSigner": false
},
{
"name": "asks",
"isMut": true,
"isSigner": false
},
{
"name": "orderPayerTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "coinVault",
"isMut": true,
"isSigner": false
},
{
"name": "pcVault",
"isMut": true,
"isSigner": false
},
{
"name": "vaultSigner",
"isMut": false,
"isSigner": false
},
{
"name": "coinWallet",
"isMut": true,
"isSigner": false
}
]
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
},
{
"name": "rent",
"isMut": false,
"isSigner": false
},
{
"name": "dexProgram",
"isMut": false,
"isSigner": false
},
{
"name": "vaultSigner",
"isMut": false,
"isSigner": false
}
]
}
],
"args": [
{
"name": "obligationIndex",
"type": "u8"
},
{
"name": "reserves",
"type": {
"vec": "publicKey"
}
}
]
},
{
"name": "setTemporaryLiquidationAccount",
"accounts": [
{
"name": "global",
"isMut": false,
"isSigner": false
},
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "userObligationLiquidation",
"isMut": true,
"isSigner": false
},
{
"name": "destinationLpTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "sourceLpTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
},
{
"name": "userFarmManager",
"isMut": true,
"isSigner": false
},
{
"name": "userFarmOwner",
"isMut": true,
"isSigner": false
}
],
"args": [
{
"name": "lpTokenAccount",
"type": "publicKey"
},
{
"name": "index",
"type": "u8"
},
{
"name": "farm",
"type": {
"defined": "Farms"
}
}
]
},
{
"name": "repayLiquidationDebt",
"accounts": [
{
"name": "global",
"isMut": false,
"isSigner": false
},
{
"name": "userObligationLiquidation",
"isMut": true,
"isSigner": false
},
{
"name": "obligationLiquidity",
"accounts": [
{
"name": "authority",
"isMut": true,
"isSigner": true
},
{
"name": "userFarm",
"isMut": true,
"isSigner": false
},
{
"name": "userFarmObligation",
"isMut": true,
"isSigner": false
},
{
"name": "leveragedFarm",
"isMut": false,
"isSigner": false
},
{
"name": "coinSourceTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "coinDestinationTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "pcSourceTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "pcDestinationTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "coinReserveAccount",
"isMut": true,
"isSigner": false
},
{
"name": "pcReserveAccount",
"isMut": true,
"isSigner": false
},
{
"name": "lendingMarketAccount",
"isMut": true,
"isSigner": false
},
{
"name": "derivedLendingMarketAuthority",
"isMut": true,
"isSigner": false
},
{
"name": "clock",
"isMut": false,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
},
{
"name": "lendingProgram",
"isMut": false,
"isSigner": false
},
{
"name": "lpPythPriceAccount",
"isMut": false,
"isSigner": false
},
{
"name": "coinPriceAccount",
"isMut": false,
"isSigner": false
},
{
"name": "pcPriceAccount",
"isMut": false,
"isSigner": false
},
{
"name": "vaultAccount",
"isMut": true,
"isSigner": false
},
{
"name": "userCoinTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "userPcTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "positionInfoAccount",
"isMut": true,
"isSigner": false
}
]
}
],
"args": [
{
"name": "reserves",
"type": {
"vec": "publicKey"
}
},
{
"name": "obligationIndex",
"type": "u8"
}
]
},
{
"name": "endObligationLiquidation",
"accounts": [
{
"name": "global",
"isMut": false,
"isSigner": false
},
{
"name": "userObligationLiquidation",
"isMut": true,
"isSigner": false
},
{
"name": "authority",
"isMut": true,
"isSigner": true
},
{
"name": "userFarm",
"isMut": true,
"isSigner": false
},
{
"name": "leveragedFarm",
"isMut": false,
"isSigner": false
},
{
"name": "lpTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "baseTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "quoteTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
},
{
"name": "liquidatorBaseAccount",
"isMut": true,
"isSigner": false
},
{
"name": "liquidatorQuoteAccount",
"isMut": true,
"isSigner": false
},
{
"name": "liquidatorLpAccount",
"isMut": true,
"isSigner": false
}
],
"args": [
{
"name": "obligationIndex",
"type": "u8"
}
]
},
{
"name": "endObligationLiquidationModified",
"accounts": [
{
"name": "global",
"isMut": false,
"isSigner": false
},
{
"name": "userObligationLiquidation",
"isMut": true,
"isSigner": false
},
{
"name": "authority",
"isMut": true,
"isSigner": true
},
{
"name": "userFarm",
"isMut": true,
"isSigner": false
},
{
"name": "leveragedFarm",
"isMut": false,
"isSigner": false
},
{
"name": "lpTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "baseTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "quoteTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
},
{
"name": "liquidatorBaseAccount",
"isMut": true,
"isSigner": false
},
{
"name": "liquidatorQuoteAccount",
"isMut": true,
"isSigner": false
},
{
"name": "liquidatorLpAccount",
"isMut": true,
"isSigner": false
}
],
"args": [
{
"name": "obligationIndex",
"type": "u8"
}
]
},
{
"name": "topUpPositionStats",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "userFarm",
"isMut": true,
"isSigner": false
},
{
"name": "leveragedFarm",
"isMut": false,
"isSigner": false
},
{
"name": "userFarmObligation",
"isMut": true,
"isSigner": false
},
{
"name": "coinSourceTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "coinDestinationTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "pcSourceTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "pcDestinationTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "coinDepositReserveAccount",
"isMut": true,
"isSigner": false
},
{
"name": "pcDepositReserveAccount",
"isMut": true,
"isSigner": false
},
{
"name": "coinReserveLiquidityOracle",
"isMut": false,
"isSigner": false
},
{
"name": "pcReserveLiquidityOracle",
"isMut": false,
"isSigner": false
},
{
"name": "lendingMarketAccount",
"isMut": false,
"isSigner": false
},
{
"name": "derivedLendingMarketAuthority",
"isMut": false,
"isSigner": false
},
{
"name": "clock",
"isMut": false,
"isSigner": false
},
{
"name": "lendingProgram",
"isMut": false,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
}
],
"args": [
{
"name": "coinAmount",
"type": "u64"
},
{
"name": "pcAmount",
"type": "u64"
},
{
"name": "obligationIndex",
"type": "u8"
}
]
},
{
"name": "topUpPositionBorrowStats",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "userFarm",
"isMut": true,
"isSigner": false
},
{
"name": "leveragedFarm",
"isMut": false,
"isSigner": false
},
{
"name": "userFarmObligation",
"isMut": true,
"isSigner": false
},
{
"name": "coinSourceTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "coinDestinationTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "pcSourceTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "pcDestinationTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "coinDepositReserveAccount",
"isMut": true,
"isSigner": false
},
{
"name": "pcDepositReserveAccount",
"isMut": true,
"isSigner": false
},
{
"name": "coinReserveLiquidityOracle",
"isMut": false,
"isSigner": false
},
{
"name": "pcReserveLiquidityOracle",
"isMut": false,
"isSigner": false
},
{
"name": "lendingMarketAccount",
"isMut": false,
"isSigner": false
},
{
"name": "derivedLendingMarketAuthority",
"isMut": false,
"isSigner": false
},
{
"name": "lendingProgram",
"isMut": false,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
},
{
"name": "borrowAuthorizer",
"isMut": false,
"isSigner": false
},
{
"name": "lpPythPriceAccount",
"isMut": false,
"isSigner": false
},
{
"name": "vaultAccount",
"isMut": true,
"isSigner": false
},
{
"name": "sourceReserveLiquidityTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "reserveLiquidityFeeReceiver",
"isMut": true,
"isSigner": false
}
],
"args": [
{
"name": "reserves",
"type": {
"vec": "publicKey"
}
},
{
"name": "coinAmount",
"type": "u64"
},
{
"name": "pcAmount",
"type": "u64"
},
{
"name": "borrowAmount",
"type": "u64"
},
{
"name": "obligationIndex",
"type": "u8"
},
{
"name": "borrowToken",
"type": "u8"
}
]
},
{
"name": "topUpPositionDualBorrowStats",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "userFarm",
"isMut": true,
"isSigner": false
},
{
"name": "leveragedFarm",
"isMut": false,
"isSigner": false
},
{
"name": "userFarmObligation",
"isMut": true,
"isSigner": false
},
{
"name": "coinSourceTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "coinDestinationTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "pcSourceTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "pcDestinationTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "coinDepositReserveAccount",
"isMut": true,
"isSigner": false
},
{
"name": "pcDepositReserveAccount",
"isMut": true,
"isSigner": false
},
{
"name": "coinReserveLiquidityOracle",
"isMut": false,
"isSigner": false
},
{
"name": "pcReserveLiquidityOracle",
"isMut": false,
"isSigner": false
},
{
"name": "lendingMarketAccount",
"isMut": false,
"isSigner": false
},
{
"name": "derivedLendingMarketAuthority",
"isMut": false,
"isSigner": false
},
{
"name": "lendingProgram",
"isMut": false,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
},
{
"name": "borrowAuthorizer",
"isMut": false,
"isSigner": false
},
{
"name": "lpPythPriceAccount",
"isMut": false,
"isSigner": false
},
{
"name": "vaultAccount",
"isMut": true,
"isSigner": false
},
{
"name": "coinSourceReserveLiquidityTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "pcSourceReserveLiquidityTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "coinReserveLiquidityFeeReceiver",
"isMut": true,
"isSigner": false
},
{
"name": "pcReserveLiquidityFeeReceiver",
"isMut": true,
"isSigner": false
}
],
"args": [
{
"name": "coinAmount",
"type": "u64"
},
{
"name": "pcAmount",
"type": "u64"
},
{
"name": "coinBorrowAmount",
"type": "u64"
},
{
"name": "pcBorrowAmount",
"type": "u64"
},
{
"name": "obligationIndex",
"type": "u8"
},
{
"name": "order",
"type": "u8"
}
]
},
{
"name": "forcePositionStateReset",
"accounts": [
{
"name": "userFarmAuthority",
"isMut": true,
"isSigner": false
},
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "global",
"isMut": false,
"isSigner": false
},
{
"name": "userFarm",
"isMut": true,
"isSigner": false
},
{
"name": "leveragedFarm",
"isMut": false,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
}
],
"args": [
{
"name": "farm",
"type": "u64"
},
{
"name": "newState",
"type": "u64"
},
{
"name": "obligationIndex",
"type": "u8"
}
]
},
{
"name": "forceSyncPositionTokenAmounts",
"accounts": [
{
"name": "userFarmAuthority",
"isMut": true,
"isSigner": false
},
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "global",
"isMut": false,
"isSigner": false
},
{
"name": "userFarm",
"isMut": true,
"isSigner": false
},
{
"name": "leveragedFarm",
"isMut": false,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
},
{
"name": "tempLiquidationBaseTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "tempLiquidationQuoteTokenAccount",
"isMut": true,
"isSigner": false
}
],
"args": [
{
"name": "farm",
"type": "u64"
},
{
"name": "obligationIndex",
"type": "u8"
}
]
},
{
"name": "moveTokensFromLevFarm",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "global",
"isMut": false,
"isSigner": false
},
{
"name": "leveragedFarm",
"isMut": false,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
},
{
"name": "levFarmTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "destinationTokenAccount",
"isMut": true,
"isSigner": false
}
],
"args": [
{
"name": "amount",
"type": "u64"
},
{
"name": "obligationIndex",
"type": "u8"
}
]
},
{
"name": "updateLeveragedFarmAccount",
"accounts": [
{
"name": "global",
"isMut": false,
"isSigner": false
},
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "leveragedFarm",
"isMut": true,
"isSigner": false
}
],
"args": [
{
"name": "fieldName",
"type": "string"
},
{
"name": "fieldValue",
"type": "string"
},
{
"name": "raydiumUpdate",
"type": {
"defined": "RaydiumLevFarmUpdate"
}
},
{
"name": "acceptDanger",
"type": "bool"
}
]
},
{
"name": "emergencyUserFarmLpTokenTransfer",
"accounts": [
{
"name": "global",
"isMut": false,
"isSigner": false
},
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "leveragedFarm",
"isMut": true,
"isSigner": false
},
{
"name": "userObligationLiquidation",
"isMut": false,
"isSigner": false
},
{
"name": "userFarm",
"isMut": false,
"isSigner": false
},
{
"name": "destinationTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "sourceTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
},
{
"name": "obligationVaultAddress",
"isMut": true,
"isSigner": false
},
{
"name": "serumMarket",
"isMut": false,
"isSigner": false
},
{
"name": "solfarmVaultProgram",
"isMut": false,
"isSigner": false
}
],
"args": []
},
{
"name": "emergencyLevFarmLpTokenTransfer",
"accounts": [
{
"name": "global",
"isMut": false,
"isSigner": false
},
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "leveragedFarm",
"isMut": true,
"isSigner": false
},
{
"name": "userObligationLiquidation",
"isMut": false,
"isSigner": false
},
{
"name": "userFarm",
"isMut": false,
"isSigner": false
},
{
"name": "destinationTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "sourceTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
},
{
"name": "obligationVaultAddress",
"isMut": true,
"isSigner": false
},
{
"name": "serumMarket",
"isMut": false,
"isSigner": false
},
{
"name": "solfarmVaultProgram",
"isMut": false,
"isSigner": false
}
],
"args": []
},
{
"name": "swapTokensToRepayRaydiumNew",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "leveragedFarm",
"isMut": true,
"isSigner": false
},
{
"name": "userFarm",
"isMut": true,
"isSigner": false
},
{
"name": "userFarmObligation",
"isMut": true,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
},
{
"name": "vaultSigner",
"isMut": false,
"isSigner": false
},
{
"name": "swapOrLiquidityProgramId",
"isMut": false,
"isSigner": false
},
{
"name": "ammId",
"isMut": true,
"isSigner": false
},
{
"name": "ammAuthority",
"isMut": true,
"isSigner": false
},
{
"name": "ammOpenOrders",
"isMut": true,
"isSigner": false
},
{
"name": "ammQuantitiesOrTargetOrders",
"isMut": true,
"isSigner": false
},
{
"name": "poolCoinTokenaccount",
"isMut": true,
"isSigner": false
},
{
"name": "poolPcTokenaccount",
"isMut": true,
"isSigner": false
},
{
"name": "serumProgramId",
"isMut": false,
"isSigner": false
},
{
"name": "serumMarket",
"isMut": true,
"isSigner": false
},
{
"name": "serumBids",
"isMut": true,
"isSigner": false
},
{
"name": "serumAsks",
"isMut": true,
"isSigner": false
},
{
"name": "serumEventQueue",
"isMut": true,
"isSigner": false
},
{
"name": "serumCoinVaultAccount",
"isMut": true,
"isSigner": false
},
{
"name": "serumPcVaultAccount",
"isMut": true,
"isSigner": false
},
{
"name": "serumVaultSigner",
"isMut": true,
"isSigner": false
},
{
"name": "coinWallet",
"isMut": true,
"isSigner": false
},
{
"name": "pcWallet",
"isMut": true,
"isSigner": false
}
],
"args": [
{
"name": "obligationIndex",
"type": "u8"
},
{
"name": "minCoinSwap",
"type": "u64"
},
{
"name": "minPcSwap",
"type": "u64"
}
]
},
{
"name": "swapTokensToRepayRaydium",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "leveragedFarm",
"isMut": true,
"isSigner": false
},
{
"name": "userFarm",
"isMut": true,
"isSigner": false
},
{
"name": "userFarmObligation",
"isMut": true,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
},
{
"name": "vaultSigner",
"isMut": false,
"isSigner": false
},
{
"name": "swapOrLiquidityProgramId",
"isMut": false,
"isSigner": false
},
{
"name": "ammId",
"isMut": true,
"isSigner": false
},
{
"name": "ammAuthority",
"isMut": true,
"isSigner": false
},
{
"name": "ammOpenOrders",
"isMut": true,
"isSigner": false
},
{
"name": "ammQuantitiesOrTargetOrders",
"isMut": true,
"isSigner": false
},
{
"name": "poolCoinTokenaccount",
"isMut": true,
"isSigner": false
},
{
"name": "poolPcTokenaccount",
"isMut": true,
"isSigner": false
},
{
"name": "serumProgramId",
"isMut": false,
"isSigner": false
},
{
"name": "serumMarket",
"isMut": true,
"isSigner": false
},
{
"name": "serumBids",
"isMut": true,
"isSigner": false
},
{
"name": "serumAsks",
"isMut": true,
"isSigner": false
},
{
"name": "serumEventQueue",
"isMut": true,
"isSigner": false
},
{
"name": "serumCoinVaultAccount",
"isMut": true,
"isSigner": false
},
{
"name": "serumPcVaultAccount",
"isMut": true,
"isSigner": false
},
{
"name": "serumVaultSigner",
"isMut": true,
"isSigner": false
},
{
"name": "coinWallet",
"isMut": true,
"isSigner": false
},
{
"name": "pcWallet",
"isMut": true,
"isSigner": false
}
],
"args": [
{
"name": "obligationIndex",
"type": "u8"
},
{
"name": "minCoinSwap",
"type": "u64"
},
{
"name": "minPcSwap",
"type": "u64"
}
]
},
{
"name": "swapToRepayRaydium",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "leveragedFarm",
"isMut": true,
"isSigner": false
},
{
"name": "userFarm",
"isMut": true,
"isSigner": false
},
{
"name": "userFarmObligation",
"isMut": true,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
},
{
"name": "vaultSigner",
"isMut": false,
"isSigner": false
},
{
"name": "swapOrLiquidityProgramId",
"isMut": false,
"isSigner": false
},
{
"name": "ammId",
"isMut": true,
"isSigner": false
},
{
"name": "ammAuthority",
"isMut": true,
"isSigner": false
},
{
"name": "ammOpenOrders",
"isMut": true,
"isSigner": false
},
{
"name": "ammQuantitiesOrTargetOrders",
"isMut": true,
"isSigner": false
},
{
"name": "poolCoinTokenaccount",
"isMut": true,
"isSigner": false
},
{
"name": "poolPcTokenaccount",
"isMut": true,
"isSigner": false
},
{
"name": "serumProgramId",
"isMut": false,
"isSigner": false
},
{
"name": "serumMarket",
"isMut": true,
"isSigner": false
},
{
"name": "serumBids",
"isMut": true,
"isSigner": false
},
{
"name": "serumAsks",
"isMut": true,
"isSigner": false
},
{
"name": "serumEventQueue",
"isMut": true,
"isSigner": false
},
{
"name": "serumCoinVaultAccount",
"isMut": true,
"isSigner": false
},
{
"name": "serumPcVaultAccount",
"isMut": true,
"isSigner": false
},
{
"name": "serumVaultSigner",
"isMut": true,
"isSigner": false
},
{
"name": "coinWallet",
"isMut": true,
"isSigner": false
},
{
"name": "pcWallet",
"isMut": true,
"isSigner": false
}
],
"args": [
{
"name": "obligationIndex",
"type": "u8"
}
]
},
{
"name": "directDebtRepayment",
"accounts": [
{
"name": "authority",
"isMut": true,
"isSigner": true
},
{
"name": "userFarm",
"isMut": true,
"isSigner": false
},
{
"name": "userFarmObligation",
"isMut": true,
"isSigner": false
},
{
"name": "leveragedFarm",
"isMut": false,
"isSigner": false
},
{
"name": "coinSourceTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "coinDestinationTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "pcSourceTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "pcDestinationTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "coinReserveAccount",
"isMut": true,
"isSigner": false
},
{
"name": "pcReserveAccount",
"isMut": true,
"isSigner": false
},
{
"name": "lendingMarketAccount",
"isMut": true,
"isSigner": false
},
{
"name": "derivedLendingMarketAuthority",
"isMut": true,
"isSigner": false
},
{
"name": "clock",
"isMut": false,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
},
{
"name": "lendingProgram",
"isMut": false,
"isSigner": false
},
{
"name": "lpPythPriceAccount",
"isMut": false,
"isSigner": false
},
{
"name": "coinPriceAccount",
"isMut": false,
"isSigner": false
},
{
"name": "pcPriceAccount",
"isMut": false,
"isSigner": false
},
{
"name": "vaultAccount",
"isMut": true,
"isSigner": false
},
{
"name": "positionInfoAccount",
"isMut": true,
"isSigner": false
}
],
"args": [
{
"name": "reserves",
"type": {
"vec": "publicKey"
}
},
{
"name": "obligationIndex",
"type": "u8"
},
{
"name": "coinRepayAmount",
"type": "u64"
},
{
"name": "pcRepayAmount",
"type": "u64"
}
]
}
],
"state": {
"struct": {
"name": "Global",
"type": {
"kind": "struct",
"fields": [
{
"name": "authority",
"type": "publicKey"
},
{
"name": "whitelisted",
"type": {
"array": [
"publicKey",
5
]
}
}
]
}
},
"methods": [
{
"name": "new",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
}
],
"args": []
},
{
"name": "addWhitelisted",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
}
],
"args": [
{
"name": "toAdd",
"type": "publicKey"
},
{
"name": "index",
"type": "u8"
}
]
},
{
"name": "setAuthority",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
}
],
"args": [
{
"name": "auth",
"type": "publicKey"
}
]
}
]
},
"accounts": [
{
"name": "LeveragedFarm",
"type": {
"kind": "struct",
"fields": [
{
"name": "global",
"type": "publicKey"
},
{
"name": "solfarmVaultProgram",
"type": "publicKey"
},
{
"name": "solfarmVaultAddress",
"type": "publicKey"
},
{
"name": "serumMarket",
"type": "publicKey"
},
{
"name": "serumRequestQueue",
"type": "publicKey"
},
{
"name": "serumEventQueue",
"type": "publicKey"
},
{
"name": "serumMarketBids",
"type": "publicKey"
},
{
"name": "serumMarketAsks",
"type": "publicKey"
},
{
"name": "serumCoinVaultAccount",
"type": "publicKey"
},
{
"name": "serumPcVaultAccount",
"type": "publicKey"
},
{
"name": "serumFeeRecipient",
"type": "publicKey"
},
{
"name": "serumDexProgram",
"type": "publicKey"
},
{
"name": "serumBaseReferralAccount",
"type": "publicKey"
},
{
"name": "serumQuoteReferralAccount",
"type": "publicKey"
},
{
"name": "serumOpenOrdersAccount",
"type": "publicKey"
},
{
"name": "raydiumLpMintAddress",
"type": "publicKey"
},
{
"name": "raydiumAmmId",
"type": "publicKey"
},
{
"name": "raydiumAmmAuthority",
"type": "publicKey"
},
{
"name": "raydiumAmmOpenOrders",
"type": "publicKey"
},
{
"name": "raydiumAmmQuantitiesOrTargetOrders",
"type": "publicKey"
},
{
"name": "raydiumLiquidityProgram",
"type": "publicKey"
},
{
"name": "raydiumCoinAccount",
"type": "publicKey"
},
{
"name": "raydiumPcAccount",
"type": "publicKey"
},
{
"name": "raydiumPoolTempTokenAccount",
"type": "publicKey"
},
{
"name": "raydiumPoolWithdrawQueue",
"type": "publicKey"
},
{
"name": "lendingMarket",
"type": "publicKey"
},
{
"name": "lendingProgram",
"type": "publicKey"
},
{
"name": "baseMint",
"type": "publicKey"
},
{
"name": "quoteMint",
"type": "publicKey"
},
{
"name": "baseReserve",
"type": "publicKey"
},
{
"name": "quoteReserve",
"type": "publicKey"
},
{
"name": "baseTokenAccount",
"type": "publicKey"
},
{
"name": "quoteTokenAccount",
"type": "publicKey"
},
{
"name": "lpDecimals",
"type": "u8"
},
{
"name": "baseDecimals",
"type": "u8"
},
{
"name": "quoteDecimals",
"type": "u8"
},
{
"name": "farmType",
"type": {
"defined": "Farms"
}
},
{
"name": "initialized",
"type": "bool"
},
{
"name": "supportsFee",
"type": "bool"
},
{
"name": "feeReceiver",
"type": "publicKey"
},
{
"name": "lpTokenPriceAccount",
"type": "publicKey"
},
{
"name": "coinPriceAccount",
"type": "publicKey"
},
{
"name": "pcPriceAccount",
"type": "publicKey"
},
{
"name": "coinReserveLiquidityFeeReceiver",
"type": "publicKey"
},
{
"name": "pcReserveLiquidityFeeReceiver",
"type": "publicKey"
},
{
"name": "borrowAuthorizer",
"type": "publicKey"
},
{
"name": "borrowAuthorizerNonce",
"type": "u8"
},
{
"name": "nonce",
"type": "u8"
},
{
"name": "buySlip",
"type": "u64"
},
{
"name": "sellSlip",
"type": "u64"
},
{
"name": "buffer",
"type": {
"array": [
"u8",
304
]
}
}
]
}
},
{
"name": "UserFarm",
"type": {
"kind": "struct",
"fields": [
{
"name": "authority",
"type": "publicKey"
},
{
"name": "leveragedFarm",
"type": "publicKey"
},
{
"name": "userFarmNumber",
"type": "u8"
},
{
"name": "numberOfObligations",
"type": "u8"
},
{
"name": "numberOfUserFarms",
"type": "u8"
},
{
"name": "nonce",
"type": "u8"
},
{
"name": "obligations",
"type": {
"array": [
{
"defined": "Obligation"
},
3
]
}
}
]
}
},
{
"name": "ObligationLiquidationAccount",
"type": {
"kind": "struct",
"fields": [
{
"name": "userFarm",
"type": "publicKey"
},
{
"name": "obligation",
"type": "publicKey"
},
{
"name": "obligationIndex",
"type": "u8"
},
{
"name": "lpTokenAccount",
"type": "publicKey"
},
{
"name": "baseTokenAccount",
"type": "publicKey"
},
{
"name": "quoteTokenAccount",
"type": "publicKey"
},
{
"name": "coinReturn",
"type": "u64"
},
{
"name": "pcReturn",
"type": "u64"
},
{
"name": "farmKey",
"type": {
"defined": "Farms"
}
},
{
"name": "leveragedFarmAccount",
"type": "publicKey"
},
{
"name": "doubleDipLpTokenAccount",
"type": "publicKey"
},
{
"name": "partialLiq",
"type": "bool"
},
{
"name": "buffer",
"type": {
"array": [
"u8",
94
]
}
}
]
}
},
{
"name": "PositionInfo",
"type": {
"kind": "struct",
"fields": [
{
"name": "nonce",
"type": "u8"
},
{
"name": "coinDeposit",
"type": "u64"
},
{
"name": "pcDeposit",
"type": "u64"
},
{
"name": "withdrawCoin",
"type": "u64"
},
{
"name": "withdrawPc",
"type": "u64"
},
{
"name": "openTime",
"type": "u32"
},
{
"name": "uselessField",
"type": "u16"
},
{
"name": "repayCoinPercent",
"type": "u16"
},
{
"name": "repayPcPercent",
"type": "u16"
},
{
"name": "bufferCoin",
"type": "u64"
},
{
"name": "bufferPc",
"type": "u64"
},
{
"name": "depositLp",
"type": "u64"
},
{
"name": "withdrawLp",
"type": "u64"
},
{
"name": "openCoinCost",
"type": "u64"
},
{
"name": "openPcCost",
"type": "u64"
},
{
"name": "withdrawCoinCost",
"type": "u64"
},
{
"name": "withdrawPcCost",
"type": "u64"
},
{
"name": "coinSwap",
"type": "i64"
},
{
"name": "pcSwap",
"type": "i64"
},
{
"name": "coinDepositLp",
"type": "u64"
},
{
"name": "pcDepositLp",
"type": "u64"
},
{
"name": "coinWithdrawLp",
"type": "u64"
},
{
"name": "pcWithdrawLp",
"type": "u64"
},
{
"name": "settleMethod",
"type": "u8"
},
{
"name": "withdrawPercent",
"type": "u32"
},
{
"name": "oldAccount",
"type": "bool"
},
{
"name": "closeMethod",
"type": "u8"
},
{
"name": "buffer",
"type": {
"array": [
"u8",
130
]
}
}
]
}
}
],
"types": [
{
"name": "Farms",
"type": {
"kind": "enum",
"variants": [
{
"name": "RayUsdcVault"
},
{
"name": "RaySolVault"
},
{
"name": "RayUsdtVault"
},
{
"name": "RaySrmVault"
},
{
"name": "MerUsdcVault"
},
{
"name": "MediaUsdcVault"
},
{
"name": "CopeUsdcVault"
},
{
"name": "RayEthVault"
},
{
"name": "StepUsdcVault"
},
{
"name": "RopeUsdcVault"
},
{
"name": "AlephUsdcVault"
},
{
"name": "TulipUsdcVault"
},
{
"name": "SnyUsdcVault"
},
{
"name": "BopRayVault"
},
{
"name": "SlrsUsdcVault"
},
{
"name": "SamoRayVault"
},
{
"name": "LikeUsdcVault"
},
{
"name": "OrcaUsdcVault"
},
{
"name": "OrcaSolVault"
},
{
"name": "AtlasUsdcVault"
},
{
"name": "AtlasRayVault"
},
{
"name": "PolisUsdcVault"
},
{
"name": "PolisRayVault"
},
{
"name": "EthUsdcOrcaVault"
},
{
"name": "SolUsdcOrcaVault"
},
{
"name": "SolUsdtOrcaVault"
},
{
"name": "EthSolOrcaVault"
},
{
"name": "AtlasUsdcOrcaVault"
},
{
"name": "PolisUsdcOrcaVault"
},
{
"name": "whEthUsdcOrcaVault"
},
{
"name": "whEthSolOrcaVault"
},
{
"name": "mSolUsdcRayVault"
},
{
"name": "mSolUsdtRayVault"
},
{
"name": "EthMSolRayVault"
},
{
"name": "BtcMSolRayVault"
},
{
"name": "mSolRayRayVault"
},
{
"name": "SamoRayRayVault"
},
{
"name": "SamoUsdcOrcaVault"
},
{
"name": "SrmUsdcRayVault"
},
{
"name": "whEthUsdcRayVault"
},
{
"name": "whEthSolRayVault"
},
{
"name": "weSushiUsdcRayVault"
},
{
"name": "weUniUsdcRayVault"
},
{
"name": "StarsUsdcRayVault"
},
{
"name": "weDydxUsdcRayVault"
},
{
"name": "GeneUsdcRayVault"
},
{
"name": "GeneRayRayVault"
},
{
"name": "DflUsdcRayVault"
},
{
"name": "CaveUsdcRayVault"
},
{
"name": "wbWBNBUsdcRayVault"
},
{
"name": "SolUsdcRayVault"
},
{
"name": "SolUsdtRayVault"
},
{
"name": "RealUsdcRayVault"
},
{
"name": "PrsmUsdcRayVault"
},
{
"name": "MbsUsdcRayVault"
},
{
"name": "ShdwUsdcOrcaVault"
},
{
"name": "ShdwSolOrcaVault"
},
{
"name": "BasisUsdcOrcVault"
},
{
"name": "stSolUsdcOrcaVault"
},
{
"name": "stSolUsdcRayVault"
},
{
"name": "stSolUsdtRayVault"
},
{
"name": "BtcstSolRayVault"
},
{
"name": "EthstSolRayVault"
},
{
"name": "stSolwUstOrcaVault"
},
{
"name": "GstUsdcOrcaVault"
},
{
"name": "ZbcUsdcRayVault"
},
{
"name": "wAlephUsdcRayVault"
},
{
"name": "SlclUsdcRayVault"
},
{
"name": "PrismUsdcRayVault"
},
{
"name": "SlcUsdcRayVault"
},
{
"name": "HbbUsdhRayVault"
},
{
"name": "UsdhUsdcRayVault"
},
{
"name": "sRlySolOrcaVault"
},
{
"name": "HawkUsdcRayVault"
},
{
"name": "GmtUsdcOrcaVault"
},
{
"name": "RaywhEthRayVault"
},
{
"name": "Unknown"
}
]
}
},
{
"name": "Position",
"type": {
"kind": "enum",
"variants": [
{
"name": "Opening"
},
{
"name": "Swapped"
},
{
"name": "AddedLiquidity"
},
{
"name": "Opened"
},
{
"name": "Withdrawing"
},
{
"name": "RemovedLiquidity"
},
{
"name": "SwappedForRepaying"
},
{
"name": "Repaid"
},
{
"name": "Withdrawn"
},
{
"name": "Closing"
},
{
"name": "ClosingAndExiting"
},
{
"name": "Closed"
},
{
"name": "ExitingAndLiquidated"
},
{
"name": "Liquidated"
},
{
"name": "TopUp"
},
{
"name": "Borrowed"
},
{
"name": "TopUpSwapped"
},
{
"name": "TopUpAddedLiquidity"
},
{
"name": "DepositedOrcaAquaFarm"
},
{
"name": "WithdrawnOrcaDoubleDip"
},
{
"name": "SwappedForLiquidation"
},
{
"name": "RepaidForLiquidation"
},
{
"name": "DDPulledForLiquidation"
},
{
"name": "LPPulledForLiquidation"
},
{
"name": "RemovedLiquidityForLiquidation"
}
]
}
},
{
"name": "Obligation",
"type": {
"kind": "struct",
"fields": [
{
"name": "obligationAccount",
"type": "publicKey"
},
{
"name": "coinAmount",
"type": "u64"
},
{
"name": "pcAmount",
"type": "u64"
},
{
"name": "depositedLpTokens",
"type": "u64"
},
{
"name": "positionState",
"type": {
"defined": "Position"
}
}
]
}
},
{
"name": "BorrowedAsset",
"type": {
"kind": "struct",
"fields": [
{
"name": "reserve",
"type": "publicKey"
},
{
"name": "amount",
"type": "u64"
}
]
}
},
{
"name": "DepositedAsset",
"type": {
"kind": "struct",
"fields": [
{
"name": "reserve",
"type": "publicKey"
},
{
"name": "amount",
"type": "u64"
},
{
"name": "returnAmount",
"type": "u64"
},
{
"name": "penaltyAmount",
"type": "u64"
}
]
}
},
{
"name": "AddLiquidityArgs",
"type": {
"kind": "struct",
"fields": [
{
"name": "coinTakepnl",
"type": "u64"
},
{
"name": "pcTakepnl",
"type": "u64"
}
]
}
},
{
"name": "Side",
"type": {
"kind": "enum",
"variants": [
{
"name": "Bid"
},
{
"name": "Ask"
}
]
}
},
{
"name": "DepositFarmArgs",
"type": {
"kind": "struct",
"fields": [
{
"name": "nonce",
"type": "u8"
},
{
"name": "metaNonce",
"type": "u8"
}
]
}
},
{
"name": "WithdrawFarmArgs",
"type": {
"kind": "struct",
"fields": [
{
"name": "metaNonce",
"type": "u8"
},
{
"name": "nonce",
"type": "u8"
}
]
}
},
{
"name": "HarvestFarmTulipsArgs",
"type": {
"kind": "struct",
"fields": [
{
"name": "nonce",
"type": "u8"
},
{
"name": "metaNonce",
"type": "u8"
},
{
"name": "rewardNonce",
"type": "u8"
}
]
}
},
{
"name": "RaydiumLevFarmUpdate",
"type": {
"kind": "struct",
"fields": [
{
"name": "raydiumLpMintAddress",
"type": "publicKey"
},
{
"name": "raydiumAmmId",
"type": "publicKey"
},
{
"name": "raydiumAmmAuthority",
"type": "publicKey"
},
{
"name": "raydiumAmmOpenOrders",
"type": "publicKey"
},
{
"name": "raydiumAmmQuantitiesOrTargetOrders",
"type": "publicKey"
},
{
"name": "raydiumLiquidityProgram",
"type": "publicKey"
},
{
"name": "raydiumCoinAccount",
"type": "publicKey"
},
{
"name": "raydiumPcAccount",
"type": "publicKey"
},
{
"name": "raydiumPoolTempTokenAccount",
"type": "publicKey"
},
{
"name": "raydiumPoolWithdrawQueue",
"type": "publicKey"
}
]
}
},
{
"name": "DepositOrcaVaultArgs",
"type": {
"kind": "struct",
"fields": [
{
"name": "accountNonce",
"type": "u8"
}
]
}
},
{
"name": "OrcaAddLiqQueueArgs",
"type": {
"kind": "struct",
"fields": [
{
"name": "accountNonce",
"type": "u8"
},
{
"name": "obligationIndex",
"type": "u8"
}
]
}
},
{
"name": "LiqArgs",
"type": {
"kind": "struct",
"fields": [
{
"name": "reserves",
"type": {
"vec": "publicKey"
}
},
{
"name": "obligationIndex",
"type": "u8"
},
{
"name": "temporaryAccountNonce",
"type": "u8"
}
]
}
}
],
"errors": [
{
"code": 100,
"name": "Unauthorized",
"msg": "unauthorized access"
},
{
"code": 101,
"name": "TooManyReserves",
"msg": "market has too many reserves"
},
{
"code": 102,
"name": "InvalidReserveCount",
"msg": "given reserves does not match remaining accounts length"
},
{
"code": 103,
"name": "NoReserveSpaceLeft",
"msg": "obligation has no reserve space available for action"
},
{
"code": 104,
"name": "UnknownReserve",
"msg": "unknown reserve given"
},
{
"code": 105,
"name": "InvalidReferralAccount",
"msg": "invalid referral account given"
},
{
"code": 106,
"name": "InvalidFarmProgram",
"msg": "invalid farm program given"
},
{
"code": 107,
"name": "InvalidDestinationCollateralTokenAccount",
"msg": "invalid destination collateral token account given"
},
{
"code": 108,
"name": "InvalidSourceCollateralTokenAccount",
"msg": "invalid source collateral token account given"
},
{
"code": 109,
"name": "InvalidLendingMarket",
"msg": "invalid lending market given"
},
{
"code": 110,
"name": "InvalidLendingProgram",
"msg": "invalid lending program given"
},
{
"code": 111,
"name": "InvalidUserFarmManager",
"msg": "user farm manager is invalid"
},
{
"code": 112,
"name": "InvalidLeveragedFarm",
"msg": "invalid leveraged farm given"
},
{
"code": 113,
"name": "InvalidObligationAccount",
"msg": "invalid obligation account given"
},
{
"code": 114,
"name": "InvalidSourceLiquidityTokenAccount",
"msg": "invalid source liquidity token account given"
},
{
"code": 115,
"name": "InvalidPCWallet",
"msg": "invalid pc wallet given"
},
{
"code": 116,
"name": "InvalidOrderPayer",
"msg": "invalid order payer account given"
},
{
"code": 117,
"name": "InvalidCoinWallet",
"msg": "invalid coin wallet given"
},
{
"code": 118,
"name": "InvalidSerumOpenOrders",
"msg": "invalid serum open orders account given"
},
{
"code": 119,
"name": "InvalidPCVault",
"msg": "invalid serum pc vault given"
},
{
"code": 120,
"name": "InvalidCoinVault",
"msg": "invalid serum coin vault given"
},
{
"code": 121,
"name": "InvalidAsks",
"msg": "invalid serum asks given"
},
{
"code": 122,
"name": "InvalidBids",
"msg": "invalid serum bids given"
},
{
"code": 123,
"name": "InvalidMarket",
"msg": "invalid serum market given"
},
{
"code": 124,
"name": "InvalidRequestQueue",
"msg": "invalid serum request queue given"
},
{
"code": 125,
"name": "InvalidEventQueue",
"msg": "invalid serum event queue given"
},
{
"code": 126,
"name": "InvalidOpenOrders",
"msg": "invalid serum open orders account"
},
{
"code": 127,
"name": "InvalidAmmId",
"msg": "invalid raydium amm id"
},
{
"code": 128,
"name": "InvalidAmmAuthority",
"msg": "invalid raydium amm authority"
},
{
"code": 129,
"name": "InvalidAmmOpenOrders",
"msg": "invalid raydium amm open orders"
},
{
"code": 130,
"name": "InvalidAmmQuantitiesOrTargetOrders",
"msg": "invalid raydium amm quantities or target ordres"
},
{
"code": 131,
"name": "InvalidLpMint",
"msg": "invalid lp token mint"
},
{
"code": 132,
"name": "InvalidFarmTokenAccount",
"msg": "invalid farm coin or farm pc token account"
},
{
"code": 133,
"name": "InvalidLpToken",
"msg": "invalid lp token account given"
},
{
"code": 134,
"name": "InvalidLiquidityProgram",
"msg": "invalid liquidity program given"
},
{
"code": 135,
"name": "InvalidPoolTokenAccount",
"msg": "invalid pool coin or pc token account"
},
{
"code": 136,
"name": "InvalidPoolWithdrawQueue",
"msg": "invalid pool withdraw queue given"
},
{
"code": 137,
"name": "InvalidSerumProgram",
"msg": "invalid serum dex program given"
},
{
"code": 138,
"name": "InvalidUserVaultAccount",
"msg": "invalid solfarm vault user balance or metadata account"
},
{
"code": 139,
"name": "AlreadyInitialized",
"msg": "leveraged farm is already initialized"
},
{
"code": 140,
"name": "Uninitialized",
"msg": "leveraged farm is uninitialized"
},
{
"code": 141,
"name": "InvalidBaseMint",
"msg": "invalid base token mint"
},
{
"code": 142,
"name": "InvalidQuoteMint",
"msg": "invalid quote mint"
},
{
"code": 143,
"name": "InvalidTokenOwner",
"msg": "invalid token owner"
},
{
"code": 144,
"name": "InvalidReferral",
"msg": "referral account is none or incorrect account"
},
{
"code": 145,
"name": "TooManyObligations",
"msg": "too many obligations already created, please use a different account"
},
{
"code": 146,
"name": "InvalidObligationIndex",
"msg": "obligation index is invalid"
},
{
"code": 147,
"name": "ObligationIsClosing",
"msg": "obligation account is closing, liquidation in process"
},
{
"code": 148,
"name": "ObligationIsOpen",
"msg": "obligation must be closing to be liquidated"
},
{
"code": 149,
"name": "InvalidTokenAccount",
"msg": "invalid token account given"
},
{
"code": 150,
"name": "ObligationIsLiquidated",
"msg": "the obligation account has been liquidated please close"
},
{
"code": 151,
"name": "ObligationIsNotLiquidated",
"msg": "obligation account must be liquidated to proceed"
},
{
"code": 152,
"name": "UnhealthyObligation",
"msg": "obligation is unhealthy"
},
{
"code": 153,
"name": "ObligationIsExiting",
"msg": "obligation is already exiting"
},
{
"code": 154,
"name": "InvalidPythPriceAccount",
"msg": "invalid pyth price account given"
},
{
"code": 155,
"name": "InvalidAccountOwner",
"msg": "Input account owner is not the program address"
},
{
"code": 156,
"name": "InvalidAccountInput",
"msg": "Invalid account input"
},
{
"code": 157,
"name": "ReserveStale",
"msg": "Reserve state needs to be refreshed"
},
{
"code": 158,
"name": "HealthyAccount",
"msg": "Trying to start liquidation on healthy account"
},
{
"code": 159,
"name": "InsufficientTokenAmount",
"msg": "zero base and quote tokens in obligation"
},
{
"code": 160,
"name": "DepositTooLowOrTooHigh",
"msg": "deposit is below the minimum required amount or above the limit"
},
{
"code": 161,
"name": "NotEnoughCollateral",
"msg": "not enough collateral to borrow this amount"
},
{
"code": 162,
"name": "InvalidOracleConfig",
"msg": "Input oracle config is invalid"
},
{
"code": 163,
"name": "InvalidPositionState",
"msg": "Invalid position state"
},
{
"code": 164,
"name": "InvalidFeeReceiver",
"msg": "Invalid fee receier"
},
{
"code": 165,
"name": "InvalidVaultAccount",
"msg": "Invalid vault account"
},
{
"code": 166,
"name": "InvalidProdBool",
"msg": "Flip prod bool"
},
{
"code": 167,
"name": "HighSpread",
"msg": "High Spread"
},
{
"code": 168,
"name": "HighSlippage",
"msg": "High Slippage"
},
{
"code": 169,
"name": "InvalidWithdrawAmount",
"msg": "Invalid Withdraw Amount"
},
{
"code": 170,
"name": "InvalidBorrowToken",
"msg": "Invalid Borrow Token"
}
]
}
{
"version": "0.1.0",
"name": "jupiter",
"instructions": [
{
"name": "mercurialExchange",
"accounts": [
{
"name": "swapProgram",
"isMut": false,
"isSigner": false
},
{
"name": "swapState",
"isMut": false,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
},
{
"name": "poolAuthority",
"isMut": false,
"isSigner": false
},
{
"name": "userTransferAuthority",
"isMut": false,
"isSigner": true
},
{
"name": "sourceTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "destinationTokenAccount",
"isMut": true,
"isSigner": false
}
],
"args": [
{
"name": "inAmount",
"type": {
"option": "u64"
}
},
{
"name": "minimumOutAmount",
"type": "u64"
},
{
"name": "platformFeeBps",
"type": "u8"
}
]
},
{
"name": "saberExchange",
"accounts": [
{
"name": "swapProgram",
"isMut": false,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
},
{
"name": "swap",
"isMut": false,
"isSigner": false
},
{
"name": "swapAuthority",
"isMut": false,
"isSigner": false
},
{
"name": "userAuthority",
"isMut": false,
"isSigner": false
},
{
"name": "clock",
"isMut": false,
"isSigner": false
},
{
"name": "inputUserAccount",
"isMut": true,
"isSigner": false
},
{
"name": "inputTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "outputUserAccount",
"isMut": true,
"isSigner": false
},
{
"name": "outputTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "feesTokenAccount",
"isMut": true,
"isSigner": false
}
],
"args": [
{
"name": "inAmount",
"type": {
"option": "u64"
}
},
{
"name": "minimumOutAmount",
"type": "u64"
},
{
"name": "platformFeeBps",
"type": "u8"
}
]
},
{
"name": "saberSwap",
"accounts": [
{
"name": "swapProgram",
"isMut": false,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
},
{
"name": "swap",
"isMut": false,
"isSigner": false
},
{
"name": "swapAuthority",
"isMut": false,
"isSigner": false
},
{
"name": "userAuthority",
"isMut": false,
"isSigner": false
},
{
"name": "inputUserAccount",
"isMut": true,
"isSigner": false
},
{
"name": "inputTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "outputUserAccount",
"isMut": true,
"isSigner": false
},
{
"name": "outputTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "feesTokenAccount",
"isMut": true,
"isSigner": false
}
],
"args": [
{
"name": "inAmount",
"type": {
"option": "u64"
}
},
{
"name": "minimumOutAmount",
"type": "u64"
},
{
"name": "platformFeeBps",
"type": "u8"
}
]
},
{
"name": "saberAddDecimalsDeposit",
"accounts": [
{
"name": "addDecimalsProgram",
"isMut": false,
"isSigner": false
},
{
"name": "wrapper",
"isMut": false,
"isSigner": false
},
{
"name": "wrapperMint",
"isMut": true,
"isSigner": false
},
{
"name": "wrapperUnderlyingTokens",
"isMut": true,
"isSigner": false
},
{
"name": "owner",
"isMut": false,
"isSigner": true
},
{
"name": "userUnderlyingTokens",
"isMut": true,
"isSigner": false
},
{
"name": "userWrappedTokens",
"isMut": true,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
}
],
"args": [
{
"name": "inAmount",
"type": {
"option": "u64"
}
},
{
"name": "minimumOutAmount",
"type": "u64"
},
{
"name": "platformFeeBps",
"type": "u8"
}
]
},
{
"name": "saberAddDecimalsWithdraw",
"accounts": [
{
"name": "addDecimalsProgram",
"isMut": false,
"isSigner": false
},
{
"name": "wrapper",
"isMut": false,
"isSigner": false
},
{
"name": "wrapperMint",
"isMut": true,
"isSigner": false
},
{
"name": "wrapperUnderlyingTokens",
"isMut": true,
"isSigner": false
},
{
"name": "owner",
"isMut": false,
"isSigner": true
},
{
"name": "userUnderlyingTokens",
"isMut": true,
"isSigner": false
},
{
"name": "userWrappedTokens",
"isMut": true,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
}
],
"args": [
{
"name": "inAmount",
"type": {
"option": "u64"
}
},
{
"name": "minimumOutAmount",
"type": "u64"
},
{
"name": "platformFeeBps",
"type": "u8"
}
]
},
{
"name": "senchaExchange",
"accounts": [
{
"name": "swapProgram",
"isMut": false,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
},
{
"name": "swap",
"isMut": true,
"isSigner": false
},
{
"name": "userAuthority",
"isMut": false,
"isSigner": false
},
{
"name": "inputUserAccount",
"isMut": true,
"isSigner": false
},
{
"name": "inputTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "inputFeesAccount",
"isMut": true,
"isSigner": false
},
{
"name": "outputUserAccount",
"isMut": true,
"isSigner": false
},
{
"name": "outputTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "outputFeesAccount",
"isMut": true,
"isSigner": false
}
],
"args": [
{
"name": "inAmount",
"type": {
"option": "u64"
}
},
{
"name": "minimumOutAmount",
"type": "u64"
},
{
"name": "platformFeeBps",
"type": "u8"
}
]
},
{
"name": "serumSwap",
"accounts": [
{
"name": "market",
"accounts": [
{
"name": "market",
"isMut": true,
"isSigner": false
},
{
"name": "openOrders",
"isMut": true,
"isSigner": false
},
{
"name": "requestQueue",
"isMut": true,
"isSigner": false
},
{
"name": "eventQueue",
"isMut": true,
"isSigner": false
},
{
"name": "bids",
"isMut": true,
"isSigner": false
},
{
"name": "asks",
"isMut": true,
"isSigner": false
},
{
"name": "coinVault",
"isMut": true,
"isSigner": false
},
{
"name": "pcVault",
"isMut": true,
"isSigner": false
},
{
"name": "vaultSigner",
"isMut": false,
"isSigner": false
}
]
},
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "orderPayerTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "coinWallet",
"isMut": true,
"isSigner": false
},
{
"name": "pcWallet",
"isMut": true,
"isSigner": false
},
{
"name": "dexProgram",
"isMut": false,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
},
{
"name": "rent",
"isMut": false,
"isSigner": false
}
],
"args": [
{
"name": "side",
"type": {
"defined": "Side"
}
},
{
"name": "inAmount",
"type": {
"option": "u64"
}
},
{
"name": "minimumOutAmount",
"type": "u64"
},
{
"name": "platformFeeBps",
"type": "u8"
}
]
},
{
"name": "tokenSwap",
"accounts": [
{
"name": "tokenSwapProgram",
"isMut": false,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
},
{
"name": "swap",
"isMut": false,
"isSigner": false
},
{
"name": "authority",
"isMut": false,
"isSigner": false
},
{
"name": "userTransferAuthority",
"isMut": false,
"isSigner": true
},
{
"name": "source",
"isMut": true,
"isSigner": false
},
{
"name": "swapSource",
"isMut": true,
"isSigner": false
},
{
"name": "swapDestination",
"isMut": true,
"isSigner": false
},
{
"name": "destination",
"isMut": true,
"isSigner": false
},
{
"name": "poolMint",
"isMut": true,
"isSigner": false
},
{
"name": "poolFee",
"isMut": true,
"isSigner": false
}
],
"args": [
{
"name": "inAmount",
"type": {
"option": "u64"
}
},
{
"name": "minimumOutAmount",
"type": "u64"
},
{
"name": "platformFeeBps",
"type": "u8"
}
]
},
{
"name": "stepTokenSwap",
"accounts": [
{
"name": "tokenSwapProgram",
"isMut": false,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
},
{
"name": "swap",
"isMut": false,
"isSigner": false
},
{
"name": "authority",
"isMut": false,
"isSigner": false
},
{
"name": "userTransferAuthority",
"isMut": false,
"isSigner": true
},
{
"name": "source",
"isMut": true,
"isSigner": false
},
{
"name": "swapSource",
"isMut": true,
"isSigner": false
},
{
"name": "swapDestination",
"isMut": true,
"isSigner": false
},
{
"name": "destination",
"isMut": true,
"isSigner": false
},
{
"name": "poolMint",
"isMut": true,
"isSigner": false
},
{
"name": "poolFee",
"isMut": true,
"isSigner": false
}
],
"args": [
{
"name": "inAmount",
"type": {
"option": "u64"
}
},
{
"name": "minimumOutAmount",
"type": "u64"
},
{
"name": "platformFeeBps",
"type": "u8"
}
]
},
{
"name": "cropperTokenSwap",
"accounts": [
{
"name": "tokenSwapProgram",
"isMut": false,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
},
{
"name": "swap",
"isMut": false,
"isSigner": false
},
{
"name": "swapState",
"isMut": false,
"isSigner": false
},
{
"name": "authority",
"isMut": false,
"isSigner": false
},
{
"name": "userTransferAuthority",
"isMut": false,
"isSigner": true
},
{
"name": "source",
"isMut": true,
"isSigner": false
},
{
"name": "swapSource",
"isMut": true,
"isSigner": false
},
{
"name": "swapDestination",
"isMut": true,
"isSigner": false
},
{
"name": "destination",
"isMut": true,
"isSigner": false
},
{
"name": "poolMint",
"isMut": true,
"isSigner": false
},
{
"name": "poolFee",
"isMut": true,
"isSigner": false
}
],
"args": [
{
"name": "inAmount",
"type": {
"option": "u64"
}
},
{
"name": "minimumOutAmount",
"type": "u64"
},
{
"name": "platformFeeBps",
"type": "u8"
}
]
},
{
"name": "raydiumSwap",
"accounts": [
{
"name": "swapProgram",
"isMut": false,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
},
{
"name": "ammId",
"isMut": true,
"isSigner": false
},
{
"name": "ammAuthority",
"isMut": false,
"isSigner": false
},
{
"name": "ammOpenOrders",
"isMut": true,
"isSigner": false
},
{
"name": "ammTargetOrders",
"isMut": true,
"isSigner": false
},
{
"name": "poolCoinTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "poolPcTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "serumProgramId",
"isMut": false,
"isSigner": false
},
{
"name": "serumMarket",
"isMut": true,
"isSigner": false
},
{
"name": "serumBids",
"isMut": true,
"isSigner": false
},
{
"name": "serumAsks",
"isMut": true,
"isSigner": false
},
{
"name": "serumEventQueue",
"isMut": true,
"isSigner": false
},
{
"name": "serumCoinVaultAccount",
"isMut": true,
"isSigner": false
},
{
"name": "serumPcVaultAccount",
"isMut": true,
"isSigner": false
},
{
"name": "serumVaultSigner",
"isMut": false,
"isSigner": false
},
{
"name": "userSourceTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "userDestinationTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "userSourceOwner",
"isMut": false,
"isSigner": true
}
],
"args": [
{
"name": "inAmount",
"type": {
"option": "u64"
}
},
{
"name": "minimumOutAmount",
"type": "u64"
},
{
"name": "platformFeeBps",
"type": "u8"
}
]
},
{
"name": "raydiumSwapV2",
"accounts": [
{
"name": "swapProgram",
"isMut": false,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
},
{
"name": "ammId",
"isMut": true,
"isSigner": false
},
{
"name": "ammAuthority",
"isMut": false,
"isSigner": false
},
{
"name": "ammOpenOrders",
"isMut": true,
"isSigner": false
},
{
"name": "poolCoinTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "poolPcTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "serumProgramId",
"isMut": false,
"isSigner": false
},
{
"name": "serumMarket",
"isMut": true,
"isSigner": false
},
{
"name": "serumBids",
"isMut": true,
"isSigner": false
},
{
"name": "serumAsks",
"isMut": true,
"isSigner": false
},
{
"name": "serumEventQueue",
"isMut": true,
"isSigner": false
},
{
"name": "serumCoinVaultAccount",
"isMut": true,
"isSigner": false
},
{
"name": "serumPcVaultAccount",
"isMut": true,
"isSigner": false
},
{
"name": "serumVaultSigner",
"isMut": false,
"isSigner": false
},
{
"name": "userSourceTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "userDestinationTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "userSourceOwner",
"isMut": false,
"isSigner": true
}
],
"args": [
{
"name": "inAmount",
"type": {
"option": "u64"
}
},
{
"name": "minimumOutAmount",
"type": "u64"
},
{
"name": "platformFeeBps",
"type": "u8"
}
]
},
{
"name": "aldrinSwap",
"accounts": [
{
"name": "swapProgram",
"isMut": false,
"isSigner": false
},
{
"name": "pool",
"isMut": false,
"isSigner": false
},
{
"name": "poolSigner",
"isMut": false,
"isSigner": false
},
{
"name": "poolMint",
"isMut": true,
"isSigner": false
},
{
"name": "baseTokenVault",
"isMut": true,
"isSigner": false
},
{
"name": "quoteTokenVault",
"isMut": true,
"isSigner": false
},
{
"name": "feePoolTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "walletAuthority",
"isMut": false,
"isSigner": true
},
{
"name": "userBaseTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "userQuoteTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
}
],
"args": [
{
"name": "inAmount",
"type": {
"option": "u64"
}
},
{
"name": "minimumOutAmount",
"type": "u64"
},
{
"name": "side",
"type": {
"defined": "Side"
}
},
{
"name": "platformFeeBps",
"type": "u8"
}
]
},
{
"name": "aldrinV2Swap",
"accounts": [
{
"name": "swapProgram",
"isMut": false,
"isSigner": false
},
{
"name": "pool",
"isMut": false,
"isSigner": false
},
{
"name": "poolSigner",
"isMut": false,
"isSigner": false
},
{
"name": "poolMint",
"isMut": true,
"isSigner": false
},
{
"name": "baseTokenVault",
"isMut": true,
"isSigner": false
},
{
"name": "quoteTokenVault",
"isMut": true,
"isSigner": false
},
{
"name": "feePoolTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "walletAuthority",
"isMut": false,
"isSigner": true
},
{
"name": "userBaseTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "userQuoteTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "curve",
"isMut": false,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
}
],
"args": [
{
"name": "inAmount",
"type": {
"option": "u64"
}
},
{
"name": "minimumOutAmount",
"type": "u64"
},
{
"name": "side",
"type": {
"defined": "Side"
}
},
{
"name": "platformFeeBps",
"type": "u8"
}
]
},
{
"name": "cremaTokenSwap",
"accounts": [
{
"name": "swapProgram",
"isMut": false,
"isSigner": false
},
{
"name": "pool",
"isMut": true,
"isSigner": false
},
{
"name": "poolSigner",
"isMut": false,
"isSigner": false
},
{
"name": "userSourceTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "userDestinationTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "poolSourceTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "poolDestinationTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "poolTicksAccount",
"isMut": true,
"isSigner": false
},
{
"name": "walletAuthority",
"isMut": false,
"isSigner": true
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
}
],
"args": [
{
"name": "inAmount",
"type": {
"option": "u64"
}
},
{
"name": "minimumOutAmount",
"type": "u64"
},
{
"name": "platformFeeBps",
"type": "u8"
}
]
},
{
"name": "lifinityTokenSwap",
"accounts": [
{
"name": "swapProgram",
"isMut": false,
"isSigner": false
},
{
"name": "authority",
"isMut": false,
"isSigner": false
},
{
"name": "amm",
"isMut": false,
"isSigner": false
},
{
"name": "userTransferAuthority",
"isMut": false,
"isSigner": true
},
{
"name": "sourceInfo",
"isMut": true,
"isSigner": false
},
{
"name": "destinationInfo",
"isMut": true,
"isSigner": false
},
{
"name": "swapSource",
"isMut": true,
"isSigner": false
},
{
"name": "swapDestination",
"isMut": true,
"isSigner": false
},
{
"name": "poolMint",
"isMut": true,
"isSigner": false
},
{
"name": "feeAccount",
"isMut": true,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
},
{
"name": "pythAccount",
"isMut": false,
"isSigner": false
},
{
"name": "pythPcAccount",
"isMut": false,
"isSigner": false
},
{
"name": "configAccount",
"isMut": true,
"isSigner": false
}
],
"args": [
{
"name": "inAmount",
"type": {
"option": "u64"
}
},
{
"name": "minimumOutAmount",
"type": "u64"
},
{
"name": "platformFeeBps",
"type": "u8"
}
]
},
{
"name": "cykuraSwap",
"accounts": [
{
"name": "swapProgram",
"isMut": false,
"isSigner": false
},
{
"name": "signer",
"isMut": false,
"isSigner": true
},
{
"name": "factoryState",
"isMut": false,
"isSigner": false
},
{
"name": "poolState",
"isMut": true,
"isSigner": false
},
{
"name": "inputTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "outputTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "inputVault",
"isMut": true,
"isSigner": false
},
{
"name": "outputVault",
"isMut": true,
"isSigner": false
},
{
"name": "lastObservationState",
"isMut": true,
"isSigner": false
},
{
"name": "coreProgram",
"isMut": false,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
}
],
"args": [
{
"name": "inAmount",
"type": {
"option": "u64"
}
},
{
"name": "minimumOutAmount",
"type": "u64"
},
{
"name": "platformFeeBps",
"type": "u8"
}
]
},
{
"name": "whirlpoolSwap",
"accounts": [
{
"name": "swapProgram",
"isMut": false,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
},
{
"name": "tokenAuthority",
"isMut": false,
"isSigner": true
},
{
"name": "whirlpool",
"isMut": true,
"isSigner": false
},
{
"name": "tokenOwnerAccountA",
"isMut": true,
"isSigner": false
},
{
"name": "tokenVaultA",
"isMut": true,
"isSigner": false
},
{
"name": "tokenOwnerAccountB",
"isMut": true,
"isSigner": false
},
{
"name": "tokenVaultB",
"isMut": true,
"isSigner": false
},
{
"name": "tickArray0",
"isMut": true,
"isSigner": false
},
{
"name": "tickArray1",
"isMut": true,
"isSigner": false
},
{
"name": "tickArray2",
"isMut": true,
"isSigner": false
},
{
"name": "oracle",
"isMut": false,
"isSigner": false
}
],
"args": [
{
"name": "inAmount",
"type": {
"option": "u64"
}
},
{
"name": "minimumOutAmount",
"type": "u64"
},
{
"name": "aToB",
"type": "bool"
},
{
"name": "platformFeeBps",
"type": "u8"
}
]
},
{
"name": "riskCheckAndFee",
"accounts": [
{
"name": "tokenLedger",
"isMut": true,
"isSigner": false
},
{
"name": "userDestinationTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "userTransferAuthority",
"isMut": false,
"isSigner": true
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
}
],
"args": [
{
"name": "minimumOutAmount",
"type": "u64"
},
{
"name": "platformFeeBps",
"type": "u8"
}
]
},
{
"name": "initializeTokenLedger",
"accounts": [
{
"name": "tokenLedger",
"isMut": true,
"isSigner": true
},
{
"name": "payer",
"isMut": true,
"isSigner": true
},
{
"name": "systemProgram",
"isMut": false,
"isSigner": false
}
],
"args": []
},
{
"name": "setTokenLedger",
"accounts": [
{
"name": "tokenLedger",
"isMut": true,
"isSigner": false
},
{
"name": "tokenAccount",
"isMut": false,
"isSigner": false
}
],
"args": []
},
{
"name": "createOpenOrders",
"accounts": [
{
"name": "openOrders",
"isMut": true,
"isSigner": false
},
{
"name": "payer",
"isMut": true,
"isSigner": true
},
{
"name": "dexProgram",
"isMut": false,
"isSigner": false
},
{
"name": "systemProgram",
"isMut": false,
"isSigner": false
},
{
"name": "rent",
"isMut": false,
"isSigner": false
},
{
"name": "market",
"isMut": false,
"isSigner": false
}
],
"args": []
}
],
"accounts": [
{
"name": "TokenLedger",
"type": {
"kind": "struct",
"fields": [
{
"name": "tokenAccount",
"type": "publicKey"
},
{
"name": "amount",
"type": "u64"
}
]
}
}
],
"types": [
{
"name": "Swap",
"type": {
"kind": "struct",
"fields": [
{
"name": "tokens",
"type": "u64"
},
{
"name": "minTokens",
"type": "u64"
},
{
"name": "side",
"type": {
"defined": "Side"
}
}
]
}
},
{
"name": "Swap",
"type": {
"kind": "struct",
"fields": [
{
"name": "tokens",
"type": "u64"
},
{
"name": "minTokens",
"type": "u64"
},
{
"name": "side",
"type": {
"defined": "Side"
}
}
]
}
},
{
"name": "Swap",
"type": {
"kind": "struct",
"fields": [
{
"name": "amountIn",
"type": "u64"
},
{
"name": "minimumAmountOut",
"type": "u64"
}
]
}
},
{
"name": "Swap",
"type": {
"kind": "struct",
"fields": [
{
"name": "amount",
"type": "u64"
},
{
"name": "otherAmountThreshold",
"type": "u64"
},
{
"name": "sqrtPriceLimit",
"type": "u128"
},
{
"name": "amountSpecifiedIsInput",
"type": "bool"
},
{
"name": "aToB",
"type": "bool"
}
]
}
},
{
"name": "SwapInstrution",
"type": {
"kind": "enum",
"variants": [
{
"name": "Swap",
"fields": [
{
"defined": "Swap"
}
]
}
]
}
},
{
"name": "Side",
"type": {
"kind": "enum",
"variants": [
{
"name": "Bid"
},
{
"name": "Ask"
}
]
}
},
{
"name": "Direction",
"type": {
"kind": "enum",
"variants": [
{
"name": "LeftToRight"
},
{
"name": "RightToLeft"
}
]
}
}
],
"errors": [
{
"code": 6000,
"name": "SlippageToleranceExceeded",
"msg": "Slippage tolerance exceeded"
},
{
"code": 6001,
"name": "InvalidTokenLedger",
"msg": "Invalid token ledger"
},
{
"code": 6002,
"name": "MissingTokenLedger",
"msg": "Missing token ledger"
},
{
"code": 6003,
"name": "MissingMercurialExchangeTokenAccount",
"msg": "Missing mercurial exchange token account"
},
{
"code": 6004,
"name": "LedgerTokenAccountDoesNotMatch",
"msg": "Ledger token account does not match"
},
{
"code": 6005,
"name": "MissingPlatformFeeAccount",
"msg": "Missing platform fee account"
},
{
"code": 6006,
"name": "InvalidCalculation",
"msg": "Invalid calculation"
}
]
}
#!/usr/bin/env python3
"""Adapted from https://github.com/kevinheavey/anchorpy"""
from hashlib import sha256
from typing import Dict, Any, Tuple, cast, TypeVar, Protocol, Mapping
from types import MappingProxyType
from solana import publickey
from construct import Int8ul as U8
from construct import Int32ul as U32
from borsh_construct import (
CStruct,
TupleStruct,
Vec,
Enum,
Bool,
I8,
U16,
I16,
I32,
F32,
U64,
I64,
F64,
U128,
I128,
Bytes,
String,
Option,
)
from construct import Sequence, Bytes
from construct import Construct, Adapter, Switch, Container, IfThenElse, Padding
def sighash(ix_name: str) -> bytes:
"""Not technically sighash, since we don't include the arguments.
(Because Rust doesn't allow function overloading.)
Args:
ix_name: The instruction name.
Returns:
The sighash bytes.
"""
formatted_str = f"global:{ix_name}"
return sha256(formatted_str.encode()).digest()[:8]
class COption(Adapter):
_discriminator_key = "discriminator"
_value_key = "value"
def __init__(self, subcon: Construct) -> None:
option_struct = CStruct(
self._discriminator_key / U8,
self._value_key
/ IfThenElse(
lambda this: this[self._discriminator_key] == 0,
Padding(subcon.sizeof()),
subcon,
),
)
super().__init__(option_struct) # type: ignore
def _decode(self, obj: Any, context, path) -> Any:
discriminator = obj[self._discriminator_key]
return None if discriminator == 0 else obj[self._value_key]
def _encode(self, obj, context, path) -> dict:
discriminator = 0 if obj is None else 1
return {self._discriminator_key: discriminator, self._value_key: obj}
def parse_ix_layout(idl: dict[str,Any]) -> Dict[str, Construct]:
ix_layout: Dict[str, Construct] = {}
for ix in idl['instructions']:
typedefs = idl['accounts'] + idl['types']
field_layouts = [
_field_layout(arg, typedefs)
for arg in ix['args']
]
ix_layout[ix['name']] = ix['name'] / CStruct(*field_layouts)
return ix_layout
FIELD_TYPE_MAP: Mapping[str, Construct] = MappingProxyType(
{
"bool": Bool,
"u8": U8,
"i8": I8,
"u16": U16,
"i16": I16,
"u32": U32,
"i32": I32,
"f32": F32,
"u64": U64,
"i64": I64,
"f64": F64,
"u128": U128,
"i128": I128,
"bytes": Bytes,
"string": String,
"publicKey": BorshPubkey,
},
)
_enums_cache: dict[tuple[str, str], Enum] = {}
def _handle_enum_variants(idl_enum: str, types: Any, name: str) -> Enum:
dict_key = (name, str(idl_enum))
try:
return _enums_cache[dict_key]
except KeyError:
result = _handle_enum_variants_no_cache(idl_enum, types, name)
_enums_cache[dict_key] = result
return result
def _handle_enum_variants_no_cache(idl_enum: dict[str, Any], types: dict[str, Any], name: str)) -> Enum:
variants = []
dclasses = {}
for variant in idl_enum['variants']:
variant_name = variant['name']
if variant['fields'] is None:
variants.append(variant_name)
else:
variant_fields = variant['fields']
if isinstance(variant_fields[0], _IdlField):
fields = []
named_fields = cast(_IdlEnumFieldsNamed, variant_fields)
for fld in named_fields:
fields.append(_field_layout(fld, types))
cstruct = CStruct(*fields)
datacls = _idl_enum_fields_named_to_dataclass_type(
named_fields,
variant_name,
)
dclasses[variant_name] = datacls
renamed = variant_name / cstruct
else:
fields = []
unnamed_fields = cast(_IdlEnumFieldsTuple, variant_fields)
for type_ in unnamed_fields:
fields.append(_type_layout(type_, types))
tuple_struct = TupleStruct(*fields)
renamed = variant_name / tuple_struct
variants.append(renamed) # type: ignore
enum_without_types = Enum(*variants, enum_name=name)
if dclasses:
for cname in enum_without_types.enum._sumtype_constructor_names:
try:
dclass = dclasses[cname]
except KeyError:
continue
dclass_fields = dc_fields(dclass)
constructr = getattr(enum_without_types.enum, cname)
for constructor_field in constructr._sumtype_attribs:
attrib = constructor_field[1] # type: ignore
fld_name = constructor_field[0] # type: ignore
dclass_field = [f for f in dclass_fields if f.name == fld_name][0]
attrib.type = dclass_field.type # type: ignore
return enum_without_types
def _typedef_layout_without_field_name(
typedef: _AccountDefOrTypeDef,
types: _AccountDefsOrTypeDefs,
) -> Construct:
typedef_type = typedef.type
name = typedef.name
if isinstance(typedef_type, _IdlTypeDefTyStruct):
field_layouts = [_field_layout(field, types) for field in typedef_type.fields]
cstruct = CStruct(*field_layouts)
datacls = _idl_typedef_ty_struct_to_dataclass_type(typedef_type, name)
return _DataclassStruct(cstruct, datacls=datacls)
elif isinstance(typedef_type, _IdlTypeDefTyEnum):
return _handle_enum_variants(typedef_type, types, name)
unknown_type = typedef_type.kind
raise ValueError(f"Unknown type {unknown_type}")
def _typedef_layout(
typedef: _AccountDefOrTypeDef,
types: list[_IdlTypeDef],
field_name: str,
) -> Construct:
"""Map an IDL typedef to a `Construct` object.
Args:
typedef: The IDL typedef object.
types: IDL type definitions.
field_name: The name of the field.
Raises:
ValueError: If an unknown type is passed.
Returns:
`Construct` object from `borsh-construct`.
""" # noqa: DAR402
return field_name / _typedef_layout_without_field_name(typedef, types)
def _type_layout(type_: _IdlType, types: _AccountDefsOrTypeDefs) -> Construct:
if isinstance(type_, str):
return FIELD_TYPE_MAP[type_]
field_type = cast(
_NonLiteralIdlTypes,
type_,
)
if isinstance(field_type, _IdlTypeVec):
return Vec(_type_layout(field_type.vec, types))
elif isinstance(field_type, _IdlTypeOption):
return Option(_type_layout(field_type.option, types))
elif isinstance(field_type, _IdlTypeCOption):
return COption(_type_layout(field_type.coption, types))
elif isinstance(field_type, _IdlTypeDefined):
defined = field_type.defined
if not types:
raise ValueError("User defined types not provided")
filtered = [t for t in types if t.name == defined]
if len(filtered) != 1:
raise ValueError(f"Type not found {defined}")
return _typedef_layout_without_field_name(filtered[0], types)
elif isinstance(field_type, _IdlTypeArray):
array_ty = field_type.array[0]
array_len = field_type.array[1]
inner_layout = _type_layout(array_ty, types)
return inner_layout[array_len]
raise ValueError(f"Type {field_type} not implemented yet")
def _field_layout(field: _IdlField, types: _AccountDefsOrTypeDefs) -> Construct:
"""Map IDL spec to `borsh-construct` types.
Args:
field: field object from the IDL.
types: IDL type definitions.
Raises:
ValueError: If the user-defined types are not provided.
ValueError: If the type is not found.
ValueError: If the type is not implemented yet.
Returns:
`Construct` object from `borsh-construct`.
""" # noqa: DAR402
field_name = field.name if field.name else ""
return field_name / _type_layout(field.type, types)
{
"version": "0.1.0",
"name": "vaults",
"instructions": [
{
"name": "initialize",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "management",
"isMut": true,
"isSigner": false
},
{
"name": "serumTradeAccount",
"isMut": true,
"isSigner": false
},
{
"name": "serumTradePda",
"isMut": false,
"isSigner": false
},
{
"name": "serumRebateAccount",
"isMut": false,
"isSigner": false
},
{
"name": "systemProgram",
"isMut": false,
"isSigner": false
}
],
"args": []
},
{
"name": "newVault",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "vault",
"isMut": true,
"isSigner": false
},
{
"name": "vaultPda",
"isMut": false,
"isSigner": false
},
{
"name": "management",
"isMut": false,
"isSigner": false
},
{
"name": "underlyingMint",
"isMut": true,
"isSigner": false
},
{
"name": "underlyingDepositQueue",
"isMut": false,
"isSigner": false
},
{
"name": "underlyingCompoundQueue",
"isMut": true,
"isSigner": false
},
{
"name": "underlyingWithdrawQueue",
"isMut": true,
"isSigner": false
},
{
"name": "sharesMint",
"isMut": true,
"isSigner": false
},
{
"name": "serumTradeAccount",
"isMut": true,
"isSigner": false
},
{
"name": "serumTradeOpenOrdersAccount",
"isMut": true,
"isSigner": false
},
{
"name": "serumTradePda",
"isMut": true,
"isSigner": false
},
{
"name": "serumTradeMarket",
"isMut": false,
"isSigner": false
},
{
"name": "serumDexProgram",
"isMut": false,
"isSigner": false
},
{
"name": "systemProgram",
"isMut": false,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
},
{
"name": "rent",
"isMut": false,
"isSigner": false
}
],
"args": [
{
"name": "args",
"type": {
"defined": "NewVaultArgs"
}
}
]
},
{
"name": "createSerumTradeFeeRecipient",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "management",
"isMut": false,
"isSigner": false
},
{
"name": "serumTradeAccount",
"isMut": false,
"isSigner": false
},
{
"name": "serumTradePda",
"isMut": true,
"isSigner": false
},
{
"name": "serumFeeRecipient",
"isMut": true,
"isSigner": false
},
{
"name": "feeTokenMint",
"isMut": true,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
},
{
"name": "rent",
"isMut": false,
"isSigner": false
},
{
"name": "systemProgram",
"isMut": false,
"isSigner": false
}
],
"args": []
},
{
"name": "createSerumTradeOpenOrders",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "management",
"isMut": false,
"isSigner": false
},
{
"name": "serumMarket",
"isMut": false,
"isSigner": false
},
{
"name": "serumTradeAccount",
"isMut": false,
"isSigner": false
},
{
"name": "serumTradePda",
"isMut": true,
"isSigner": false
},
{
"name": "serumTradeOpenOrdersAccount",
"isMut": true,
"isSigner": false
},
{
"name": "rent",
"isMut": false,
"isSigner": false
},
{
"name": "systemProgram",
"isMut": false,
"isSigner": false
},
{
"name": "serumDexProgram",
"isMut": false,
"isSigner": false
}
],
"args": []
},
{
"name": "modifyWhitelist",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "management",
"isMut": true,
"isSigner": false
},
{
"name": "whitelistAuthority",
"isMut": false,
"isSigner": false
}
],
"args": [
{
"name": "args",
"type": {
"defined": "ModifyWhiteListArgs"
}
}
]
},
{
"name": "registerDepositTrackingAccount",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "vault",
"isMut": false,
"isSigner": false
},
{
"name": "depositTrackingAccount",
"isMut": true,
"isSigner": false
},
{
"name": "depositTrackingQueueAccount",
"isMut": true,
"isSigner": false
},
{
"name": "depositTrackingHoldAccount",
"isMut": true,
"isSigner": false
},
{
"name": "sharesMint",
"isMut": true,
"isSigner": false
},
{
"name": "depositTrackingPda",
"isMut": true,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
},
{
"name": "rent",
"isMut": false,
"isSigner": false
},
{
"name": "systemProgram",
"isMut": false,
"isSigner": false
}
],
"args": [
{
"name": "farmType",
"type": {
"array": [
"u64",
2
]
}
}
]
},
{
"name": "issueShares",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "vault",
"isMut": true,
"isSigner": false
},
{
"name": "depositTracking",
"isMut": true,
"isSigner": false
},
{
"name": "depositTrackingPda",
"isMut": true,
"isSigner": false
},
{
"name": "vaultPda",
"isMut": false,
"isSigner": false
},
{
"name": "vaultUnderlyingAccount",
"isMut": true,
"isSigner": false
},
{
"name": "sharesMint",
"isMut": true,
"isSigner": false
},
{
"name": "receivingSharesAccount",
"isMut": true,
"isSigner": false
},
{
"name": "depositingUnderlyingAccount",
"isMut": true,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
}
],
"args": [
{
"name": "args",
"type": {
"defined": "SharesArgs"
}
}
]
},
{
"name": "permissionedIssueShares",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "vault",
"isMut": true,
"isSigner": false
},
{
"name": "management",
"isMut": false,
"isSigner": false
},
{
"name": "vaultPda",
"isMut": false,
"isSigner": false
},
{
"name": "vaultUnderlyingAccount",
"isMut": true,
"isSigner": false
},
{
"name": "sharesMint",
"isMut": true,
"isSigner": false
},
{
"name": "receivingSharesAccount",
"isMut": true,
"isSigner": false
},
{
"name": "depositingUnderlyingAccount",
"isMut": true,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
}
],
"args": [
{
"name": "args",
"type": {
"defined": "SharesArgs"
}
}
]
},
{
"name": "configureRaydiumVault",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "vault",
"isMut": true,
"isSigner": false
},
{
"name": "vaultPda",
"isMut": true,
"isSigner": false
},
{
"name": "management",
"isMut": false,
"isSigner": false
},
{
"name": "userStakeInfoAccount",
"isMut": true,
"isSigner": false
},
{
"name": "raydiumStakeProgram",
"isMut": false,
"isSigner": false
},
{
"name": "systemProgram",
"isMut": false,
"isSigner": false
},
{
"name": "poolId",
"isMut": true,
"isSigner": false
},
{
"name": "associatedStakeAccount",
"isMut": true,
"isSigner": false
},
{
"name": "rent",
"isMut": false,
"isSigner": false
}
],
"args": [
{
"name": "args",
"type": {
"defined": "ConfigureRaydiumVaultArgs"
}
}
]
},
{
"name": "configureLendingOptimizer",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "vault",
"isMut": true,
"isSigner": false
},
{
"name": "vaultPda",
"isMut": false,
"isSigner": false
},
{
"name": "management",
"isMut": false,
"isSigner": false
},
{
"name": "startingPlatformInformation",
"isMut": false,
"isSigner": false
}
],
"args": []
},
{
"name": "configureMultiDepositOptimizer",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "vault",
"isMut": true,
"isSigner": false
},
{
"name": "vaultPda",
"isMut": false,
"isSigner": false
},
{
"name": "stateTransitionAccount",
"isMut": true,
"isSigner": false
},
{
"name": "stateTransitionUnderlying",
"isMut": false,
"isSigner": false
},
{
"name": "management",
"isMut": false,
"isSigner": false
},
{
"name": "systemProgram",
"isMut": false,
"isSigner": false
}
],
"args": [
{
"name": "args",
"type": {
"defined": "ConfigureMultiDepositOptimizerArgs"
}
}
]
},
{
"name": "configureOrcaVault",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "vault",
"isMut": true,
"isSigner": false
},
{
"name": "vaultPda",
"isMut": true,
"isSigner": false
},
{
"name": "management",
"isMut": false,
"isSigner": false
},
{
"name": "userFarm",
"isMut": true,
"isSigner": false
},
{
"name": "globalFarm",
"isMut": false,
"isSigner": false
},
{
"name": "globalRewardTokenVault",
"isMut": false,
"isSigner": false
},
{
"name": "globalBaseTokenVault",
"isMut": false,
"isSigner": false
},
{
"name": "poolSwapAccount",
"isMut": false,
"isSigner": false
},
{
"name": "vaultFarmTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "vaultRewardTokenAccount",
"isMut": false,
"isSigner": false
},
{
"name": "vaultSwapTokenAccountA",
"isMut": false,
"isSigner": false
},
{
"name": "vaultSwapTokenAccountB",
"isMut": false,
"isSigner": false
},
{
"name": "poolSwapTokenA",
"isMut": false,
"isSigner": false
},
{
"name": "poolSwapTokenB",
"isMut": false,
"isSigner": false
},
{
"name": "farmTokenMint",
"isMut": true,
"isSigner": false
},
{
"name": "swapTokenMint",
"isMut": true,
"isSigner": false
},
{
"name": "rewardTokenMint",
"isMut": true,
"isSigner": false
},
{
"name": "tokenMintA",
"isMut": true,
"isSigner": false
},
{
"name": "tokenMintB",
"isMut": true,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
},
{
"name": "aquaFarmProgram",
"isMut": false,
"isSigner": false
},
{
"name": "systemProgram",
"isMut": false,
"isSigner": false
}
],
"args": [
{
"name": "args",
"type": {
"defined": "ConfigureArgs"
}
}
]
},
{
"name": "configureOrcaVaultDd",
"accounts": [
{
"name": "ddCompoundQueue",
"isMut": true,
"isSigner": false
},
{
"name": "ddWithdrawQueue",
"isMut": true,
"isSigner": false
},
{
"name": "ddCompoundQueueMint",
"isMut": true,
"isSigner": false
},
{
"name": "configData",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "vault",
"isMut": true,
"isSigner": false
},
{
"name": "vaultPda",
"isMut": true,
"isSigner": false
},
{
"name": "management",
"isMut": false,
"isSigner": false
},
{
"name": "userFarm",
"isMut": true,
"isSigner": false
},
{
"name": "globalFarm",
"isMut": false,
"isSigner": false
},
{
"name": "globalRewardTokenVault",
"isMut": false,
"isSigner": false
},
{
"name": "globalBaseTokenVault",
"isMut": false,
"isSigner": false
},
{
"name": "poolSwapAccount",
"isMut": false,
"isSigner": false
},
{
"name": "vaultFarmTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "vaultRewardTokenAccount",
"isMut": false,
"isSigner": false
},
{
"name": "vaultSwapTokenAccountA",
"isMut": false,
"isSigner": false
},
{
"name": "vaultSwapTokenAccountB",
"isMut": false,
"isSigner": false
},
{
"name": "poolSwapTokenA",
"isMut": false,
"isSigner": false
},
{
"name": "poolSwapTokenB",
"isMut": false,
"isSigner": false
},
{
"name": "farmTokenMint",
"isMut": true,
"isSigner": false
},
{
"name": "swapTokenMint",
"isMut": true,
"isSigner": false
},
{
"name": "rewardTokenMint",
"isMut": true,
"isSigner": false
},
{
"name": "tokenMintA",
"isMut": true,
"isSigner": false
},
{
"name": "tokenMintB",
"isMut": true,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
},
{
"name": "aquaFarmProgram",
"isMut": false,
"isSigner": false
},
{
"name": "systemProgram",
"isMut": false,
"isSigner": false
}
]
},
{
"name": "rent",
"isMut": false,
"isSigner": false
}
],
"args": [
{
"name": "args",
"type": {
"defined": "ConfigureArgs"
}
}
]
},
{
"name": "lendingOptimizerAddPlatform",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "vault",
"isMut": true,
"isSigner": false
},
{
"name": "vaultPda",
"isMut": false,
"isSigner": false
},
{
"name": "management",
"isMut": false,
"isSigner": false
},
{
"name": "clock",
"isMut": false,
"isSigner": false
},
{
"name": "rent",
"isMut": false,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
},
{
"name": "platformInformation",
"isMut": true,
"isSigner": false
},
{
"name": "platformConfigData",
"isMut": true,
"isSigner": false
},
{
"name": "systemProgram",
"isMut": false,
"isSigner": false
}
],
"args": [
{
"name": "args",
"type": {
"defined": "AddLendingPlatformArgs"
}
}
]
},
{
"name": "sweepRaydiumVault",
"accounts": [
{
"name": "vault",
"isMut": true,
"isSigner": false
},
{
"name": "vaultPda",
"isMut": true,
"isSigner": false
},
{
"name": "vaultStakeInfoAccount",
"isMut": true,
"isSigner": false
},
{
"name": "poolId",
"isMut": true,
"isSigner": false
},
{
"name": "poolAuthority",
"isMut": true,
"isSigner": false
},
{
"name": "underlyingDepositQueue",
"isMut": true,
"isSigner": false
},
{
"name": "underlyingCompoundQueue",
"isMut": true,
"isSigner": false
},
{
"name": "poolLpTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "vaultRewardATokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "poolRewardATokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "vaultRewardBTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "poolRewardBTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "clock",
"isMut": false,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
},
{
"name": "raydiumStakeProgram",
"isMut": false,
"isSigner": false
},
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "management",
"isMut": false,
"isSigner": false
},
{
"name": "sharesMint",
"isMut": false,
"isSigner": false
}
],
"args": [
{
"name": "harvest",
"type": "bool"
}
]
},
{
"name": "sweepLendingOptimizerVault",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "vault",
"isMut": true,
"isSigner": false
},
{
"name": "vaultPda",
"isMut": false,
"isSigner": false
},
{
"name": "platformInformation",
"isMut": false,
"isSigner": false
},
{
"name": "platformConfigData",
"isMut": false,
"isSigner": false
},
{
"name": "lendingProgram",
"isMut": false,
"isSigner": false
},
{
"name": "underlyingDepositQueue",
"isMut": true,
"isSigner": false
},
{
"name": "underlyingDestination",
"isMut": true,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
},
{
"name": "clock",
"isMut": false,
"isSigner": false
},
{
"name": "management",
"isMut": false,
"isSigner": false
},
{
"name": "sharesMint",
"isMut": false,
"isSigner": false
}
],
"args": []
},
{
"name": "withdrawDepositTracking",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "clock",
"isMut": false,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
},
{
"name": "depositTrackingAccount",
"isMut": true,
"isSigner": false
},
{
"name": "depositTrackingPda",
"isMut": true,
"isSigner": false
},
{
"name": "depositTrackingHoldAccount",
"isMut": true,
"isSigner": false
},
{
"name": "receivingSharesAccount",
"isMut": true,
"isSigner": false
},
{
"name": "sharesMint",
"isMut": false,
"isSigner": false
}
],
"args": [
{
"name": "amount",
"type": "u64"
},
{
"name": "farmType",
"type": {
"array": [
"u64",
2
]
}
}
]
},
{
"name": "withdrawRaydiumVault",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "vault",
"isMut": true,
"isSigner": false
},
{
"name": "vaultPda",
"isMut": true,
"isSigner": false
},
{
"name": "vaultStakeInfoAccount",
"isMut": true,
"isSigner": false
},
{
"name": "poolId",
"isMut": true,
"isSigner": false
},
{
"name": "poolAuthority",
"isMut": true,
"isSigner": false
},
{
"name": "underlyingWithdrawQueue",
"isMut": true,
"isSigner": false
},
{
"name": "poolLpTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "vaultRewardATokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "poolRewardATokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "vaultRewardBTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "poolRewardBTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "burningSharesTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "receivingUnderlyingTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "sharesMint",
"isMut": true,
"isSigner": false
},
{
"name": "clock",
"isMut": false,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
},
{
"name": "raydiumStakeProgram",
"isMut": false,
"isSigner": false
}
],
"args": [
{
"name": "amount",
"type": "u64"
}
]
},
{
"name": "withdrawLendingOptimizerVault",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "vault",
"isMut": true,
"isSigner": false
},
{
"name": "vaultPda",
"isMut": false,
"isSigner": false
},
{
"name": "platformInformation",
"isMut": false,
"isSigner": false
},
{
"name": "platformConfigData",
"isMut": false,
"isSigner": false
},
{
"name": "lendingProgram",
"isMut": false,
"isSigner": false
},
{
"name": "burningSharesTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "receivingUnderlyingTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "underlyingWithdrawQueue",
"isMut": true,
"isSigner": false
},
{
"name": "sharesMint",
"isMut": true,
"isSigner": false
},
{
"name": "clock",
"isMut": false,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
}
],
"args": [
{
"name": "amount",
"type": "u64"
}
]
},
{
"name": "withdrawMultiDepositOptimizerVault",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "multiDeposit",
"isMut": true,
"isSigner": false
},
{
"name": "multiDepositPda",
"isMut": false,
"isSigner": false
},
{
"name": "withdrawVault",
"isMut": true,
"isSigner": false
},
{
"name": "withdrawVaultPda",
"isMut": false,
"isSigner": false
},
{
"name": "platformInformation",
"isMut": false,
"isSigner": false
},
{
"name": "platformConfigData",
"isMut": false,
"isSigner": false
},
{
"name": "lendingProgram",
"isMut": false,
"isSigner": false
},
{
"name": "multiBurningSharesTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "withdrawBurningSharesTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "receivingUnderlyingTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "multiUnderlyingWithdrawQueue",
"isMut": true,
"isSigner": false
},
{
"name": "multiSharesMint",
"isMut": true,
"isSigner": false
},
{
"name": "withdrawSharesMint",
"isMut": true,
"isSigner": false
},
{
"name": "clock",
"isMut": false,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
},
{
"name": "withdrawVaultUnderlyingDepositQueue",
"isMut": false,
"isSigner": false
}
],
"args": [
{
"name": "amount",
"type": "u64"
}
]
},
{
"name": "newSerumSwap",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "management",
"isMut": false,
"isSigner": false
},
{
"name": "vaultAccount",
"isMut": true,
"isSigner": false
},
{
"name": "vaultPda",
"isMut": false,
"isSigner": false
},
{
"name": "pcMint",
"isMut": false,
"isSigner": false
},
{
"name": "coinMint",
"isMut": false,
"isSigner": false
},
{
"name": "pcWallet",
"isMut": true,
"isSigner": false
},
{
"name": "market",
"accounts": [
{
"name": "market",
"isMut": true,
"isSigner": false
},
{
"name": "openOrders",
"isMut": true,
"isSigner": false
},
{
"name": "requestQueue",
"isMut": true,
"isSigner": false
},
{
"name": "eventQueue",
"isMut": true,
"isSigner": false
},
{
"name": "bids",
"isMut": true,
"isSigner": false
},
{
"name": "asks",
"isMut": true,
"isSigner": false
},
{
"name": "orderPayerTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "coinVault",
"isMut": true,
"isSigner": false
},
{
"name": "pcVault",
"isMut": true,
"isSigner": false
},
{
"name": "vaultSigner",
"isMut": false,
"isSigner": false
},
{
"name": "coinWallet",
"isMut": true,
"isSigner": false
}
]
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
},
{
"name": "rent",
"isMut": false,
"isSigner": false
},
{
"name": "dexProgram",
"isMut": false,
"isSigner": false
},
{
"name": "serumTradeAccount",
"isMut": false,
"isSigner": false
},
{
"name": "serumTradePda",
"isMut": false,
"isSigner": false
},
{
"name": "serumFeeRecipient",
"isMut": true,
"isSigner": false
},
{
"name": "serumFeeDiscount",
"isMut": true,
"isSigner": false
},
{
"name": "sourceTokenAccount",
"isMut": true,
"isSigner": false
}
],
"args": [
{
"name": "args",
"type": {
"defined": "NewSerumSwapArgs"
}
}
]
},
{
"name": "newRaydiumSwap",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "management",
"isMut": false,
"isSigner": false
},
{
"name": "vault",
"isMut": true,
"isSigner": false
},
{
"name": "vaultPda",
"isMut": true,
"isSigner": false
},
{
"name": "swapOrLiquidityProgram",
"isMut": false,
"isSigner": false
},
{
"name": "ammId",
"isMut": true,
"isSigner": false
},
{
"name": "ammAuthority",
"isMut": true,
"isSigner": false
},
{
"name": "ammOpenOrders",
"isMut": true,
"isSigner": false
},
{
"name": "ammQuantitiesOrTargetOrders",
"isMut": true,
"isSigner": false
},
{
"name": "poolCoinTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "poolPcTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "serumDexProgram",
"isMut": false,
"isSigner": false
},
{
"name": "serumMarket",
"isMut": true,
"isSigner": false
},
{
"name": "serumBids",
"isMut": true,
"isSigner": false
},
{
"name": "serumAsks",
"isMut": true,
"isSigner": false
},
{
"name": "serumEventQueue",
"isMut": true,
"isSigner": false
},
{
"name": "serumVaultSigner",
"isMut": true,
"isSigner": false
},
{
"name": "serumCoinVault",
"isMut": true,
"isSigner": false
},
{
"name": "serumPcVault",
"isMut": true,
"isSigner": false
},
{
"name": "vaultCoinTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "vaultPcTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
}
],
"args": [
{
"name": "args",
"type": {
"defined": "NewRaydiumSwapArgs"
}
}
]
},
{
"name": "closeVault",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "management",
"isMut": false,
"isSigner": false
},
{
"name": "vault",
"isMut": true,
"isSigner": false
}
],
"args": [
{
"name": "farmType",
"type": {
"array": [
"u64",
2
]
}
}
]
},
{
"name": "closeDepositTracking",
"accounts": [
{
"name": "authority",
"isMut": true,
"isSigner": true
},
{
"name": "vault",
"isMut": false,
"isSigner": false
},
{
"name": "depositTrackingAccount",
"isMut": true,
"isSigner": false
},
{
"name": "depositTrackingHold",
"isMut": true,
"isSigner": false
},
{
"name": "depositTrackingQueue",
"isMut": true,
"isSigner": false
},
{
"name": "authorityShares",
"isMut": true,
"isSigner": false
},
{
"name": "depositTrackingPda",
"isMut": true,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
},
{
"name": "management",
"isMut": false,
"isSigner": false
}
],
"args": []
},
{
"name": "addRaydiumLiquidity",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "liquidityProgramId",
"isMut": false,
"isSigner": false
},
{
"name": "ammId",
"isMut": true,
"isSigner": false
},
{
"name": "ammAuthority",
"isMut": true,
"isSigner": false
},
{
"name": "ammOpenOrders",
"isMut": true,
"isSigner": false
},
{
"name": "ammQuantitiesOrTargetOrders",
"isMut": true,
"isSigner": false
},
{
"name": "lpMintAddress",
"isMut": true,
"isSigner": false
},
{
"name": "poolCoinTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "poolPcTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "serumMarket",
"isMut": true,
"isSigner": false
},
{
"name": "vaultCoinTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "vaultPcTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "vaultUnderlyingAccount",
"isMut": true,
"isSigner": false
},
{
"name": "vaultPda",
"isMut": true,
"isSigner": false
},
{
"name": "vault",
"isMut": true,
"isSigner": false
},
{
"name": "tokenProgramId",
"isMut": false,
"isSigner": false
},
{
"name": "management",
"isMut": false,
"isSigner": false
}
],
"args": []
},
{
"name": "updateRaydiumVault",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "vault",
"isMut": true,
"isSigner": false
},
{
"name": "management",
"isMut": false,
"isSigner": false
}
],
"args": [
{
"name": "args",
"type": {
"defined": "ConfigureRaydiumVaultArgs"
}
}
]
},
{
"name": "updateLendingOptimizerVaultPlatformSettings",
"accounts": [
{
"name": "update",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "vault",
"isMut": true,
"isSigner": false
},
{
"name": "vaultPda",
"isMut": false,
"isSigner": false
},
{
"name": "management",
"isMut": false,
"isSigner": false
}
]
},
{
"name": "platformInformation",
"isMut": true,
"isSigner": false
},
{
"name": "platformConfigData",
"isMut": true,
"isSigner": false
}
],
"args": [
{
"name": "args",
"type": {
"defined": "UpdateArgs"
}
}
]
},
{
"name": "rebalanceLendingOptimizerVault",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "vault",
"isMut": true,
"isSigner": false
},
{
"name": "vaultPda",
"isMut": false,
"isSigner": false
},
{
"name": "management",
"isMut": false,
"isSigner": false
},
{
"name": "sourcePlatformInformation",
"isMut": false,
"isSigner": false
},
{
"name": "destinationPlatformInformation",
"isMut": false,
"isSigner": false
},
{
"name": "sourceLendingProgram",
"isMut": false,
"isSigner": false
},
{
"name": "destinationLendingProgram",
"isMut": false,
"isSigner": false
},
{
"name": "underlyingDepositQueue",
"isMut": true,
"isSigner": false
},
{
"name": "underlyingDestination",
"isMut": true,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
},
{
"name": "clock",
"isMut": false,
"isSigner": false
},
{
"name": "sharesMint",
"isMut": false,
"isSigner": false
}
],
"args": []
},
{
"name": "rebalanceMultiDepositOptimizerVault",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "vault",
"isMut": true,
"isSigner": false
},
{
"name": "vaultPda",
"isMut": false,
"isSigner": false
},
{
"name": "stateTransition",
"isMut": true,
"isSigner": false
},
{
"name": "management",
"isMut": false,
"isSigner": false
},
{
"name": "multiVaultSharesMint",
"isMut": true,
"isSigner": false
}
],
"args": [
{
"name": "calldata",
"type": "bytes"
}
]
},
{
"name": "forceRebalanceMultiDepositOptimizerVault",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "vault",
"isMut": true,
"isSigner": false
},
{
"name": "vaultPda",
"isMut": false,
"isSigner": false
},
{
"name": "stateTransition",
"isMut": true,
"isSigner": false
},
{
"name": "management",
"isMut": false,
"isSigner": false
},
{
"name": "multiVaultSharesMint",
"isMut": true,
"isSigner": false
}
],
"args": [
{
"name": "calldata",
"type": "bytes"
}
]
},
{
"name": "resetStateTransitionAccount",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "vault",
"isMut": true,
"isSigner": false
},
{
"name": "vaultPda",
"isMut": false,
"isSigner": false
},
{
"name": "stateTransition",
"isMut": true,
"isSigner": false
},
{
"name": "management",
"isMut": false,
"isSigner": false
},
{
"name": "multiVaultSharesMint",
"isMut": true,
"isSigner": false
}
],
"args": [
{
"name": "resetPausable",
"type": "bool"
}
]
},
{
"name": "startMultiDepositOptimizerRebalance",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "vault",
"isMut": true,
"isSigner": false
},
{
"name": "vaultPda",
"isMut": false,
"isSigner": false
},
{
"name": "stateTransition",
"isMut": true,
"isSigner": false
},
{
"name": "management",
"isMut": false,
"isSigner": false
},
{
"name": "multiVaultSharesMint",
"isMut": true,
"isSigner": false
}
],
"args": [
{
"name": "args",
"type": {
"defined": "StartMultiDepositRebalanceArgs"
}
}
]
},
{
"name": "removeVaultMultiDepositOptimizerRebalance",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "vault",
"isMut": true,
"isSigner": false
},
{
"name": "vaultPda",
"isMut": false,
"isSigner": false
},
{
"name": "stateTransition",
"isMut": true,
"isSigner": false
},
{
"name": "management",
"isMut": false,
"isSigner": false
},
{
"name": "multiVaultSharesMint",
"isMut": true,
"isSigner": false
}
],
"args": []
},
{
"name": "supplyVaultMultiDepositOptimizerRebalance",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "vault",
"isMut": true,
"isSigner": false
},
{
"name": "vaultPda",
"isMut": false,
"isSigner": false
},
{
"name": "stateTransition",
"isMut": true,
"isSigner": false
},
{
"name": "management",
"isMut": false,
"isSigner": false
},
{
"name": "multiVaultSharesMint",
"isMut": true,
"isSigner": false
}
],
"args": []
},
{
"name": "rebaseLendingOptimizerVault",
"accounts": [
{
"name": "vault",
"isMut": true,
"isSigner": false
},
{
"name": "vaultPda",
"isMut": false,
"isSigner": false
},
{
"name": "platformInformation",
"isMut": false,
"isSigner": false
},
{
"name": "platformConfigData",
"isMut": false,
"isSigner": false
},
{
"name": "lendingProgram",
"isMut": false,
"isSigner": false
},
{
"name": "clock",
"isMut": false,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
},
{
"name": "underlyingDepositQueue",
"isMut": false,
"isSigner": false
},
{
"name": "feeReceiver",
"isMut": true,
"isSigner": false
},
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "management",
"isMut": false,
"isSigner": false
},
{
"name": "sharesMint",
"isMut": false,
"isSigner": false
}
],
"args": []
},
{
"name": "forceRebaseLendingOptimizerVault",
"accounts": [
{
"name": "vault",
"isMut": true,
"isSigner": false
},
{
"name": "vaultPda",
"isMut": false,
"isSigner": false
},
{
"name": "platformInformation",
"isMut": false,
"isSigner": false
},
{
"name": "platformConfigData",
"isMut": false,
"isSigner": false
},
{
"name": "lendingProgram",
"isMut": false,
"isSigner": false
},
{
"name": "clock",
"isMut": false,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
},
{
"name": "underlyingDepositQueue",
"isMut": false,
"isSigner": false
},
{
"name": "feeReceiver",
"isMut": true,
"isSigner": false
},
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "management",
"isMut": false,
"isSigner": false
},
{
"name": "sharesMint",
"isMut": false,
"isSigner": false
}
],
"args": []
},
{
"name": "rebaseMultiDepositOptimizerVault",
"accounts": [
{
"name": "vault",
"isMut": true,
"isSigner": false
},
{
"name": "vaultPda",
"isMut": false,
"isSigner": false
},
{
"name": "underlyingDepositQueue",
"isMut": false,
"isSigner": false
},
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "management",
"isMut": false,
"isSigner": false
},
{
"name": "sharesMint",
"isMut": false,
"isSigner": false
}
],
"args": []
},
{
"name": "forceRebaseMultiDepositOptimizerVault",
"accounts": [
{
"name": "vault",
"isMut": true,
"isSigner": false
},
{
"name": "vaultPda",
"isMut": false,
"isSigner": false
},
{
"name": "underlyingDepositQueue",
"isMut": false,
"isSigner": false
},
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "management",
"isMut": false,
"isSigner": false
},
{
"name": "sharesMint",
"isMut": false,
"isSigner": false
}
],
"args": []
},
{
"name": "sweepMultiDepositOptimizer",
"accounts": [
{
"name": "multiDepositOptimizer",
"isMut": true,
"isSigner": false
},
{
"name": "multiOptimizerPda",
"isMut": false,
"isSigner": false
},
{
"name": "standaloneVault",
"isMut": true,
"isSigner": false
},
{
"name": "standalonePda",
"isMut": false,
"isSigner": false
},
{
"name": "underlyingDepositQueue",
"isMut": true,
"isSigner": false
},
{
"name": "underlyingDestination",
"isMut": true,
"isSigner": false
},
{
"name": "standaloneSharesMint",
"isMut": true,
"isSigner": false
},
{
"name": "multiOptimizerSharesAccount",
"isMut": true,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
},
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "management",
"isMut": false,
"isSigner": false
}
],
"args": []
},
{
"name": "changeMultiDepositOptimizerTarget",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "management",
"isMut": false,
"isSigner": false
},
{
"name": "multiDepositOptimizer",
"isMut": true,
"isSigner": false
},
{
"name": "newTarget",
"isMut": true,
"isSigner": false
}
],
"args": []
},
{
"name": "updateLendingOptimizerVault",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "vault",
"isMut": true,
"isSigner": false
},
{
"name": "vaultPda",
"isMut": false,
"isSigner": false
},
{
"name": "management",
"isMut": false,
"isSigner": false
}
],
"args": [
{
"name": "args",
"type": {
"defined": "UpdateArgs"
}
}
]
},
{
"name": "updateMultiDepositOptimizerVault",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "vault",
"isMut": true,
"isSigner": false
},
{
"name": "vaultPda",
"isMut": false,
"isSigner": false
},
{
"name": "management",
"isMut": false,
"isSigner": false
}
],
"args": [
{
"name": "args",
"type": {
"defined": "UpdateArgs"
}
}
]
},
{
"name": "orcaAddLiqIssueShares",
"accounts": [
{
"name": "issueShares",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "vault",
"isMut": true,
"isSigner": false
},
{
"name": "depositTracking",
"isMut": true,
"isSigner": false
},
{
"name": "depositTrackingPda",
"isMut": true,
"isSigner": false
},
{
"name": "vaultPda",
"isMut": false,
"isSigner": false
},
{
"name": "vaultUnderlyingAccount",
"isMut": true,
"isSigner": false
},
{
"name": "sharesMint",
"isMut": true,
"isSigner": false
},
{
"name": "receivingSharesAccount",
"isMut": true,
"isSigner": false
},
{
"name": "depositingUnderlyingAccount",
"isMut": true,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
}
]
},
{
"name": "aquaFarmProgram",
"isMut": false,
"isSigner": false
},
{
"name": "addLiq",
"accounts": [
{
"name": "fundingTokenAccountA",
"isMut": true,
"isSigner": false
},
{
"name": "fundingTokenAccountB",
"isMut": true,
"isSigner": false
},
{
"name": "poolTokenA",
"isMut": true,
"isSigner": false
},
{
"name": "poolTokenB",
"isMut": true,
"isSigner": false
},
{
"name": "swapProgram",
"isMut": false,
"isSigner": false
},
{
"name": "swapAccount",
"isMut": true,
"isSigner": false
},
{
"name": "swapAuthority",
"isMut": false,
"isSigner": false
},
{
"name": "swapPoolTokenMint",
"isMut": true,
"isSigner": false
}
]
}
],
"args": [
{
"name": "args",
"type": {
"defined": "OrcaAddLiqIssueSharesArgs"
}
}
]
},
{
"name": "sweepOrcaVault",
"accounts": [
{
"name": "vault",
"isMut": true,
"isSigner": false
},
{
"name": "vaultPda",
"isMut": true,
"isSigner": false
},
{
"name": "underlyingDepositQueue",
"isMut": true,
"isSigner": false
},
{
"name": "underlyingCompoundQueue",
"isMut": true,
"isSigner": false
},
{
"name": "vaultFarmTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "vaultRewardTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "globalBaseTokenVault",
"isMut": true,
"isSigner": false
},
{
"name": "globalRewardTokenVault",
"isMut": true,
"isSigner": false
},
{
"name": "farmTokenMint",
"isMut": true,
"isSigner": false
},
{
"name": "globalFarm",
"isMut": true,
"isSigner": false
},
{
"name": "userFarm",
"isMut": true,
"isSigner": false
},
{
"name": "convertAuthority",
"isMut": false,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
},
{
"name": "aquafarmProgram",
"isMut": false,
"isSigner": false
},
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "management",
"isMut": false,
"isSigner": false
},
{
"name": "sharesMint",
"isMut": false,
"isSigner": false
}
],
"args": [
{
"name": "harvest",
"type": "bool"
},
{
"name": "doubleDip",
"type": "bool"
}
]
},
{
"name": "sweepOrcaVaultDd",
"accounts": [
{
"name": "configData",
"accounts": [
{
"name": "vault",
"isMut": true,
"isSigner": false
},
{
"name": "vaultPda",
"isMut": true,
"isSigner": false
},
{
"name": "underlyingDepositQueue",
"isMut": true,
"isSigner": false
},
{
"name": "underlyingCompoundQueue",
"isMut": true,
"isSigner": false
},
{
"name": "vaultFarmTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "vaultRewardTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "globalBaseTokenVault",
"isMut": true,
"isSigner": false
},
{
"name": "globalRewardTokenVault",
"isMut": true,
"isSigner": false
},
{
"name": "farmTokenMint",
"isMut": true,
"isSigner": false
},
{
"name": "globalFarm",
"isMut": true,
"isSigner": false
},
{
"name": "userFarm",
"isMut": true,
"isSigner": false
},
{
"name": "convertAuthority",
"isMut": false,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
},
{
"name": "aquafarmProgram",
"isMut": false,
"isSigner": false
},
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "management",
"isMut": false,
"isSigner": false
},
{
"name": "sharesMint",
"isMut": false,
"isSigner": false
}
]
}
],
"args": [
{
"name": "harvest",
"type": "bool"
}
]
},
{
"name": "withdrawOrcaVault",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "vault",
"isMut": true,
"isSigner": false
},
{
"name": "vaultPda",
"isMut": true,
"isSigner": false
},
{
"name": "burningSharesTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "receivingUnderlyingTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "vaultFarmTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "vaultRewardTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "vaultSwapTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "globalRewardTokenVault",
"isMut": true,
"isSigner": false
},
{
"name": "globalBaseTokenVault",
"isMut": true,
"isSigner": false
},
{
"name": "poolTokenA",
"isMut": true,
"isSigner": false
},
{
"name": "poolTokenB",
"isMut": true,
"isSigner": false
},
{
"name": "globalFarm",
"isMut": true,
"isSigner": false
},
{
"name": "userFarm",
"isMut": true,
"isSigner": false
},
{
"name": "convertAuthority",
"isMut": false,
"isSigner": false
},
{
"name": "swapAccount",
"isMut": true,
"isSigner": false
},
{
"name": "swapAuthority",
"isMut": false,
"isSigner": false
},
{
"name": "swapPoolTokenMint",
"isMut": true,
"isSigner": false
},
{
"name": "farmTokenMint",
"isMut": true,
"isSigner": false
},
{
"name": "sharesMint",
"isMut": true,
"isSigner": false
},
{
"name": "swapPoolFee",
"isMut": true,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
},
{
"name": "swapProgram",
"isMut": false,
"isSigner": false
},
{
"name": "aquafarmProgram",
"isMut": false,
"isSigner": false
}
],
"args": [
{
"name": "args",
"type": {
"defined": "WithdrawOrcaVaultArgs"
}
}
]
},
{
"name": "withdrawOrcaVaultDdStageOne",
"accounts": [
{
"name": "configData",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "vault",
"isMut": true,
"isSigner": false
},
{
"name": "vaultPda",
"isMut": true,
"isSigner": false
},
{
"name": "burningSharesTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "receivingUnderlyingTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "vaultFarmTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "vaultRewardTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "vaultSwapTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "globalRewardTokenVault",
"isMut": true,
"isSigner": false
},
{
"name": "globalBaseTokenVault",
"isMut": true,
"isSigner": false
},
{
"name": "poolTokenA",
"isMut": true,
"isSigner": false
},
{
"name": "poolTokenB",
"isMut": true,
"isSigner": false
},
{
"name": "globalFarm",
"isMut": true,
"isSigner": false
},
{
"name": "userFarm",
"isMut": true,
"isSigner": false
},
{
"name": "convertAuthority",
"isMut": false,
"isSigner": false
},
{
"name": "swapAccount",
"isMut": true,
"isSigner": false
},
{
"name": "swapAuthority",
"isMut": false,
"isSigner": false
},
{
"name": "swapPoolTokenMint",
"isMut": true,
"isSigner": false
},
{
"name": "farmTokenMint",
"isMut": true,
"isSigner": false
},
{
"name": "sharesMint",
"isMut": true,
"isSigner": false
},
{
"name": "swapPoolFee",
"isMut": true,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
},
{
"name": "swapProgram",
"isMut": false,
"isSigner": false
},
{
"name": "aquafarmProgram",
"isMut": false,
"isSigner": false
}
]
}
],
"args": [
{
"name": "args",
"type": {
"defined": "WithdrawOrcaVaultArgs"
}
}
]
},
{
"name": "withdrawOrcaVaultDdStageTwo",
"accounts": [
{
"name": "configData",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "vault",
"isMut": true,
"isSigner": false
},
{
"name": "vaultPda",
"isMut": true,
"isSigner": false
},
{
"name": "burningSharesTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "receivingUnderlyingTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "vaultFarmTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "vaultRewardTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "vaultSwapTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "globalRewardTokenVault",
"isMut": true,
"isSigner": false
},
{
"name": "globalBaseTokenVault",
"isMut": true,
"isSigner": false
},
{
"name": "poolTokenA",
"isMut": true,
"isSigner": false
},
{
"name": "poolTokenB",
"isMut": true,
"isSigner": false
},
{
"name": "globalFarm",
"isMut": true,
"isSigner": false
},
{
"name": "userFarm",
"isMut": true,
"isSigner": false
},
{
"name": "convertAuthority",
"isMut": false,
"isSigner": false
},
{
"name": "swapAccount",
"isMut": true,
"isSigner": false
},
{
"name": "swapAuthority",
"isMut": false,
"isSigner": false
},
{
"name": "swapPoolTokenMint",
"isMut": true,
"isSigner": false
},
{
"name": "farmTokenMint",
"isMut": true,
"isSigner": false
},
{
"name": "sharesMint",
"isMut": true,
"isSigner": false
},
{
"name": "swapPoolFee",
"isMut": true,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
},
{
"name": "swapProgram",
"isMut": false,
"isSigner": false
},
{
"name": "aquafarmProgram",
"isMut": false,
"isSigner": false
}
]
},
{
"name": "ephemeralTrackingAccount",
"isMut": true,
"isSigner": false
}
],
"args": []
},
{
"name": "withdrawOrcaVaultRemoveLiq",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "vault",
"isMut": true,
"isSigner": false
},
{
"name": "vaultPda",
"isMut": false,
"isSigner": false
},
{
"name": "burningUnderlyingAccount",
"isMut": true,
"isSigner": false
},
{
"name": "removeLiq",
"accounts": [
{
"name": "fundingTokenAccountA",
"isMut": true,
"isSigner": false
},
{
"name": "fundingTokenAccountB",
"isMut": true,
"isSigner": false
},
{
"name": "poolTokenA",
"isMut": true,
"isSigner": false
},
{
"name": "poolTokenB",
"isMut": true,
"isSigner": false
},
{
"name": "swapProgram",
"isMut": false,
"isSigner": false
},
{
"name": "swapAccount",
"isMut": true,
"isSigner": false
},
{
"name": "swapAuthority",
"isMut": false,
"isSigner": false
},
{
"name": "swapPoolTokenMint",
"isMut": true,
"isSigner": false
}
]
},
{
"name": "swapFeeAccount",
"isMut": true,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
},
{
"name": "ephemeralTrackingAccount",
"isMut": true,
"isSigner": false
},
{
"name": "sharesMint",
"isMut": false,
"isSigner": false
}
],
"args": [
{
"name": "doubleDip",
"type": "bool"
}
]
},
{
"name": "newOrcaSwap",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "management",
"isMut": false,
"isSigner": false
},
{
"name": "vault",
"isMut": true,
"isSigner": false
},
{
"name": "vaultPda",
"isMut": true,
"isSigner": false
},
{
"name": "swapAccount",
"isMut": true,
"isSigner": false
},
{
"name": "swapAuthority",
"isMut": false,
"isSigner": false
},
{
"name": "sourceTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "destinationTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "swapSourceTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "swapDestinationTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "poolTokenMint",
"isMut": true,
"isSigner": false
},
{
"name": "poolFeeAccount",
"isMut": true,
"isSigner": false
},
{
"name": "swapProgram",
"isMut": false,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
}
],
"args": [
{
"name": "args",
"type": {
"defined": "OrcaSwapArgs"
}
}
]
},
{
"name": "addOrcaLiquidity",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "management",
"isMut": false,
"isSigner": false
},
{
"name": "vault",
"isMut": true,
"isSigner": false
},
{
"name": "vaultPda",
"isMut": true,
"isSigner": false
},
{
"name": "underlyingCompoundQueue",
"isMut": true,
"isSigner": false
},
{
"name": "addLiq",
"accounts": [
{
"name": "fundingTokenAccountA",
"isMut": true,
"isSigner": false
},
{
"name": "fundingTokenAccountB",
"isMut": true,
"isSigner": false
},
{
"name": "poolTokenA",
"isMut": true,
"isSigner": false
},
{
"name": "poolTokenB",
"isMut": true,
"isSigner": false
},
{
"name": "swapProgram",
"isMut": false,
"isSigner": false
},
{
"name": "swapAccount",
"isMut": true,
"isSigner": false
},
{
"name": "swapAuthority",
"isMut": false,
"isSigner": false
},
{
"name": "swapPoolTokenMint",
"isMut": true,
"isSigner": false
}
]
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
}
],
"args": [
{
"name": "doubleDip",
"type": "bool"
}
]
},
{
"name": "addOrcaLiquidityAndConvertDd",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "management",
"isMut": false,
"isSigner": false
},
{
"name": "vault",
"isMut": true,
"isSigner": false
},
{
"name": "vaultPda",
"isMut": true,
"isSigner": false
},
{
"name": "addLiq",
"accounts": [
{
"name": "fundingTokenAccountA",
"isMut": true,
"isSigner": false
},
{
"name": "fundingTokenAccountB",
"isMut": true,
"isSigner": false
},
{
"name": "poolTokenA",
"isMut": true,
"isSigner": false
},
{
"name": "poolTokenB",
"isMut": true,
"isSigner": false
},
{
"name": "swapProgram",
"isMut": false,
"isSigner": false
},
{
"name": "swapAccount",
"isMut": true,
"isSigner": false
},
{
"name": "swapAuthority",
"isMut": false,
"isSigner": false
},
{
"name": "swapPoolTokenMint",
"isMut": true,
"isSigner": false
}
]
},
{
"name": "underlyingCompoundQueue",
"isMut": true,
"isSigner": false
},
{
"name": "ddCompoundQueue",
"isMut": true,
"isSigner": false
},
{
"name": "vaultFarmTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "vaultRewardTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "globalBaseTokenVault",
"isMut": true,
"isSigner": false
},
{
"name": "globalRewardTokenVault",
"isMut": true,
"isSigner": false
},
{
"name": "farmTokenMint",
"isMut": true,
"isSigner": false
},
{
"name": "globalFarm",
"isMut": true,
"isSigner": false
},
{
"name": "userFarm",
"isMut": true,
"isSigner": false
},
{
"name": "convertAuthority",
"isMut": false,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
},
{
"name": "aquafarmProgram",
"isMut": false,
"isSigner": false
},
{
"name": "sharesMint",
"isMut": false,
"isSigner": false
}
],
"args": []
},
{
"name": "updateOrcaDdCompoundQueueStageOne",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "management",
"isMut": false,
"isSigner": false
},
{
"name": "vault",
"isMut": true,
"isSigner": false
},
{
"name": "vaultPda",
"isMut": false,
"isSigner": false
},
{
"name": "ddCompoundQueue",
"isMut": true,
"isSigner": false
},
{
"name": "farmTokenMint",
"isMut": true,
"isSigner": false
},
{
"name": "yourReceivingFarmToken",
"isMut": true,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
},
{
"name": "rent",
"isMut": false,
"isSigner": false
},
{
"name": "systemProgram",
"isMut": false,
"isSigner": false
}
],
"args": []
},
{
"name": "updateOrcaDdCompoundQueueStageTwo",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "management",
"isMut": false,
"isSigner": false
},
{
"name": "vault",
"isMut": true,
"isSigner": false
},
{
"name": "vaultPda",
"isMut": false,
"isSigner": false
},
{
"name": "ddCompoundQueue",
"isMut": true,
"isSigner": false
},
{
"name": "farmTokenMint",
"isMut": true,
"isSigner": false
},
{
"name": "yourReceivingFarmToken",
"isMut": true,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
},
{
"name": "rent",
"isMut": false,
"isSigner": false
},
{
"name": "systemProgram",
"isMut": false,
"isSigner": false
}
],
"args": [
{
"name": "updateOnly",
"type": "bool"
}
]
},
{
"name": "letMeSpeakToYourManager",
"accounts": [
{
"name": "authority",
"isMut": true,
"isSigner": true
},
{
"name": "management",
"isMut": true,
"isSigner": false
},
{
"name": "serumTrade",
"isMut": true,
"isSigner": false
},
{
"name": "systemProgram",
"isMut": false,
"isSigner": false
}
],
"args": []
},
{
"name": "updateDepositCap",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "management",
"isMut": false,
"isSigner": false
},
{
"name": "vault",
"isMut": true,
"isSigner": false
}
],
"args": [
{
"name": "args",
"type": {
"defined": "UpdateDepositCapArgs"
}
}
]
},
{
"name": "updateVaultFees",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "management",
"isMut": false,
"isSigner": false
},
{
"name": "vault",
"isMut": true,
"isSigner": false
}
],
"args": [
{
"name": "args",
"type": {
"defined": "UpdateVaultFeesArgs"
}
}
]
},
{
"name": "createAssociatedLedgerAccount",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "vault",
"isMut": true,
"isSigner": false
},
{
"name": "vaultPda",
"isMut": true,
"isSigner": false
},
{
"name": "management",
"isMut": false,
"isSigner": false
},
{
"name": "userStakeInfoAccount",
"isMut": true,
"isSigner": false
},
{
"name": "raydiumStakeProgram",
"isMut": false,
"isSigner": false
},
{
"name": "systemProgram",
"isMut": false,
"isSigner": false
},
{
"name": "poolId",
"isMut": true,
"isSigner": false
},
{
"name": "associatedStakeAccount",
"isMut": true,
"isSigner": false
},
{
"name": "rent",
"isMut": false,
"isSigner": false
}
],
"args": []
},
{
"name": "emitVersionInfo",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": false
}
],
"args": []
},
{
"name": "manageVaultPausable",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "management",
"isMut": false,
"isSigner": false
},
{
"name": "vault",
"isMut": true,
"isSigner": false
}
],
"args": [
{
"name": "args",
"type": {
"defined": "ManageVaultPausableArgs"
}
}
]
},
{
"name": "multiDepositOptimizerAddStandalone",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "vault",
"isMut": true,
"isSigner": false
},
{
"name": "vaultPda",
"isMut": false,
"isSigner": false
},
{
"name": "stateTransitionAccount",
"isMut": true,
"isSigner": false
},
{
"name": "stateTransitionUnderlying",
"isMut": false,
"isSigner": false
},
{
"name": "management",
"isMut": false,
"isSigner": false
},
{
"name": "systemProgram",
"isMut": false,
"isSigner": false
}
],
"args": [
{
"name": "args",
"type": {
"defined": "ConfigureMultiDepositOptimizerArgs"
}
},
{
"name": "update",
"type": "u8"
}
]
},
{
"name": "collectSerumTradeFees",
"accounts": [
{
"name": "vaultFees",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "management",
"isMut": false,
"isSigner": false
},
{
"name": "vault",
"isMut": true,
"isSigner": false
},
{
"name": "vaultPda",
"isMut": true,
"isSigner": false
},
{
"name": "feeRecipient",
"isMut": true,
"isSigner": false
},
{
"name": "underlyingWithdrawQueue",
"isMut": true,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
}
]
},
{
"name": "serumTrade",
"isMut": false,
"isSigner": false
},
{
"name": "serumTradePda",
"isMut": false,
"isSigner": false
},
{
"name": "serumTradeFeeAccount",
"isMut": true,
"isSigner": false
}
],
"args": [
{
"name": "farmKey",
"type": {
"array": [
"u64",
2
]
}
}
]
},
{
"name": "overrideVaultValues",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "management",
"isMut": false,
"isSigner": false
},
{
"name": "vault",
"isMut": true,
"isSigner": false
}
],
"args": [
{
"name": "farmKey",
"type": {
"array": [
"u64",
2
]
}
},
{
"name": "field",
"type": "string"
},
{
"name": "value",
"type": "string"
}
]
},
{
"name": "updateOrcaSwapMarkets",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "vault",
"isMut": true,
"isSigner": false
},
{
"name": "vaultPda",
"isMut": true,
"isSigner": false
},
{
"name": "management",
"isMut": false,
"isSigner": false
},
{
"name": "userFarm",
"isMut": true,
"isSigner": false
},
{
"name": "globalFarm",
"isMut": false,
"isSigner": false
},
{
"name": "globalRewardTokenVault",
"isMut": false,
"isSigner": false
},
{
"name": "globalBaseTokenVault",
"isMut": false,
"isSigner": false
},
{
"name": "poolSwapAccount",
"isMut": false,
"isSigner": false
},
{
"name": "vaultFarmTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "vaultRewardTokenAccount",
"isMut": false,
"isSigner": false
},
{
"name": "vaultSwapTokenAccountA",
"isMut": false,
"isSigner": false
},
{
"name": "vaultSwapTokenAccountB",
"isMut": false,
"isSigner": false
},
{
"name": "poolSwapTokenA",
"isMut": false,
"isSigner": false
},
{
"name": "poolSwapTokenB",
"isMut": false,
"isSigner": false
},
{
"name": "farmTokenMint",
"isMut": true,
"isSigner": false
},
{
"name": "swapTokenMint",
"isMut": true,
"isSigner": false
},
{
"name": "rewardTokenMint",
"isMut": true,
"isSigner": false
},
{
"name": "tokenMintA",
"isMut": true,
"isSigner": false
},
{
"name": "tokenMintB",
"isMut": true,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
},
{
"name": "aquaFarmProgram",
"isMut": false,
"isSigner": false
},
{
"name": "systemProgram",
"isMut": false,
"isSigner": false
}
],
"args": [
{
"name": "args",
"type": {
"defined": "ConfigureArgs"
}
}
]
},
{
"name": "updateOrcaDdSwapMarkets",
"accounts": [
{
"name": "ddCompoundQueue",
"isMut": true,
"isSigner": false
},
{
"name": "ddWithdrawQueue",
"isMut": true,
"isSigner": false
},
{
"name": "ddCompoundQueueMint",
"isMut": true,
"isSigner": false
},
{
"name": "configData",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "vault",
"isMut": true,
"isSigner": false
},
{
"name": "vaultPda",
"isMut": true,
"isSigner": false
},
{
"name": "management",
"isMut": false,
"isSigner": false
},
{
"name": "userFarm",
"isMut": true,
"isSigner": false
},
{
"name": "globalFarm",
"isMut": false,
"isSigner": false
},
{
"name": "globalRewardTokenVault",
"isMut": false,
"isSigner": false
},
{
"name": "globalBaseTokenVault",
"isMut": false,
"isSigner": false
},
{
"name": "poolSwapAccount",
"isMut": false,
"isSigner": false
},
{
"name": "vaultFarmTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "vaultRewardTokenAccount",
"isMut": false,
"isSigner": false
},
{
"name": "vaultSwapTokenAccountA",
"isMut": false,
"isSigner": false
},
{
"name": "vaultSwapTokenAccountB",
"isMut": false,
"isSigner": false
},
{
"name": "poolSwapTokenA",
"isMut": false,
"isSigner": false
},
{
"name": "poolSwapTokenB",
"isMut": false,
"isSigner": false
},
{
"name": "farmTokenMint",
"isMut": true,
"isSigner": false
},
{
"name": "swapTokenMint",
"isMut": true,
"isSigner": false
},
{
"name": "rewardTokenMint",
"isMut": true,
"isSigner": false
},
{
"name": "tokenMintA",
"isMut": true,
"isSigner": false
},
{
"name": "tokenMintB",
"isMut": true,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
},
{
"name": "aquaFarmProgram",
"isMut": false,
"isSigner": false
},
{
"name": "systemProgram",
"isMut": false,
"isSigner": false
}
]
},
{
"name": "rent",
"isMut": false,
"isSigner": false
}
],
"args": [
{
"name": "args",
"type": {
"defined": "ConfigureArgs"
}
}
]
},
{
"name": "configureQuarryVault",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "management",
"isMut": false,
"isSigner": false
},
{
"name": "vault",
"isMut": true,
"isSigner": false
},
{
"name": "vaultPda",
"isMut": true,
"isSigner": false
},
{
"name": "vaultRewardTokenAccount",
"isMut": false,
"isSigner": false
},
{
"name": "rewardTokenMint",
"isMut": false,
"isSigner": false
},
{
"name": "miner",
"isMut": true,
"isSigner": false
},
{
"name": "minerTokenAccount",
"isMut": false,
"isSigner": false
},
{
"name": "minerTokenMint",
"isMut": false,
"isSigner": false
},
{
"name": "mintWrapper",
"isMut": false,
"isSigner": false
},
{
"name": "minter",
"isMut": false,
"isSigner": false
},
{
"name": "quarry",
"isMut": true,
"isSigner": false
},
{
"name": "rewarder",
"isMut": false,
"isSigner": false
},
{
"name": "mineProgram",
"isMut": false,
"isSigner": false
},
{
"name": "systemProgram",
"isMut": false,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
}
],
"args": [
{
"name": "args",
"type": {
"defined": "ConfigureQuarryArgs"
}
}
]
},
{
"name": "sweepQuarryVault",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "management",
"isMut": false,
"isSigner": false
},
{
"name": "vault",
"isMut": true,
"isSigner": false
},
{
"name": "vaultPda",
"isMut": true,
"isSigner": false
},
{
"name": "underlyingDepositQueue",
"isMut": true,
"isSigner": false
},
{
"name": "underlyingCompoundQueue",
"isMut": true,
"isSigner": false
},
{
"name": "miner",
"isMut": true,
"isSigner": false
},
{
"name": "minerVault",
"isMut": true,
"isSigner": false
},
{
"name": "quarry",
"isMut": true,
"isSigner": false
},
{
"name": "rewarder",
"isMut": false,
"isSigner": false
},
{
"name": "quarryMineProgram",
"isMut": false,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
},
{
"name": "sharesMint",
"isMut": false,
"isSigner": false
}
],
"args": [
{
"name": "compound",
"type": "bool"
}
]
},
{
"name": "harvestQuarryVault",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "management",
"isMut": false,
"isSigner": false
},
{
"name": "vault",
"isMut": true,
"isSigner": false
},
{
"name": "vaultPda",
"isMut": true,
"isSigner": false
},
{
"name": "miner",
"isMut": true,
"isSigner": false
},
{
"name": "minerVault",
"isMut": true,
"isSigner": false
},
{
"name": "quarry",
"isMut": true,
"isSigner": false
},
{
"name": "mintWrapper",
"isMut": true,
"isSigner": false
},
{
"name": "minter",
"isMut": true,
"isSigner": false
},
{
"name": "rewardsTokenMint",
"isMut": true,
"isSigner": false
},
{
"name": "claimFeeTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "rewarder",
"isMut": false,
"isSigner": false
},
{
"name": "mintWrapperProgram",
"isMut": false,
"isSigner": false
},
{
"name": "quarryMineProgram",
"isMut": false,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
}
],
"args": []
},
{
"name": "redeemSaberIouMint",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "management",
"isMut": false,
"isSigner": false
},
{
"name": "vault",
"isMut": true,
"isSigner": false
},
{
"name": "vaultPda",
"isMut": true,
"isSigner": false
},
{
"name": "vaultIouTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "vaultRedemptionTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "iouTokenMint",
"isMut": true,
"isSigner": false
},
{
"name": "redemptionMint",
"isMut": true,
"isSigner": false
},
{
"name": "redemptionVault",
"isMut": true,
"isSigner": false
},
{
"name": "redeemer",
"isMut": false,
"isSigner": false
},
{
"name": "mintProxyState",
"isMut": false,
"isSigner": false
},
{
"name": "proxyMintAuthority",
"isMut": false,
"isSigner": false
},
{
"name": "minterInfo",
"isMut": true,
"isSigner": false
},
{
"name": "feeCollectorTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
},
{
"name": "mintProxyProgram",
"isMut": false,
"isSigner": false
},
{
"name": "redemptionProgram",
"isMut": false,
"isSigner": false
}
],
"args": []
},
{
"name": "saberAddLiquidity",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "management",
"isMut": false,
"isSigner": false
},
{
"name": "vault",
"isMut": true,
"isSigner": false
},
{
"name": "vaultPda",
"isMut": true,
"isSigner": false
},
{
"name": "vaultTokenAAccount",
"isMut": true,
"isSigner": false
},
{
"name": "vaultTokenBAccount",
"isMut": true,
"isSigner": false
},
{
"name": "vaultPoolTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "swapAccount",
"isMut": true,
"isSigner": false
},
{
"name": "swapAuthority",
"isMut": false,
"isSigner": false
},
{
"name": "swapTokenAAccount",
"isMut": true,
"isSigner": false
},
{
"name": "swapTokenBAccount",
"isMut": true,
"isSigner": false
},
{
"name": "poolTokenMint",
"isMut": true,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
},
{
"name": "stableSwapProgram",
"isMut": false,
"isSigner": false
},
{
"name": "clock",
"isMut": false,
"isSigner": false
}
],
"args": []
},
{
"name": "initializeQuarrySaberConfigDataAccount",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "management",
"isMut": false,
"isSigner": false
},
{
"name": "vault",
"isMut": true,
"isSigner": false
},
{
"name": "vaultPda",
"isMut": true,
"isSigner": false
},
{
"name": "configDataAccount",
"isMut": true,
"isSigner": false
},
{
"name": "systemProgram",
"isMut": false,
"isSigner": false
}
],
"args": [
{
"name": "args",
"type": {
"defined": "InitializeSaberConfigurationData"
}
}
]
},
{
"name": "saberDecimalWrapAsset",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "management",
"isMut": false,
"isSigner": false
},
{
"name": "vault",
"isMut": true,
"isSigner": false
},
{
"name": "configDataAccount",
"isMut": false,
"isSigner": false
},
{
"name": "vaultPda",
"isMut": false,
"isSigner": false
},
{
"name": "wrapper",
"isMut": false,
"isSigner": false
},
{
"name": "wrapperMint",
"isMut": true,
"isSigner": false
},
{
"name": "wrapperUnderlyingTokens",
"isMut": true,
"isSigner": false
},
{
"name": "vaultUnwrappedTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "vaultWrappedTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
},
{
"name": "decimalWrapProgram",
"isMut": false,
"isSigner": false
}
],
"args": [
{
"name": "wrappingA",
"type": "u8"
}
]
},
{
"name": "initializeSunnyVaultStageOne",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "management",
"isMut": false,
"isSigner": false
},
{
"name": "vault",
"isMut": true,
"isSigner": false
},
{
"name": "vaultPda",
"isMut": true,
"isSigner": false
},
{
"name": "tvaultSunnyVaultAccount",
"isMut": true,
"isSigner": false
},
{
"name": "miner",
"isMut": true,
"isSigner": false
},
{
"name": "minerVault",
"isMut": true,
"isSigner": false
},
{
"name": "quarry",
"isMut": true,
"isSigner": false
},
{
"name": "sunnyMiner",
"isMut": true,
"isSigner": false
},
{
"name": "sunnyMinerTokenAccount",
"isMut": false,
"isSigner": false
},
{
"name": "sunnyPool",
"isMut": false,
"isSigner": false
},
{
"name": "sunnyQuarry",
"isMut": true,
"isSigner": false
},
{
"name": "sunnyRewarder",
"isMut": false,
"isSigner": false
},
{
"name": "sunnyRewardTokenMint",
"isMut": false,
"isSigner": false
},
{
"name": "tvaultSunnyRewardTokenAccount",
"isMut": false,
"isSigner": false
},
{
"name": "sunnyInternalTokenMint",
"isMut": false,
"isSigner": false
},
{
"name": "tvaultSunnyInternalTokenAccount",
"isMut": false,
"isSigner": false
},
{
"name": "underlyingTokenMint",
"isMut": false,
"isSigner": false
},
{
"name": "quarryRewardTokenMint",
"isMut": false,
"isSigner": false
},
{
"name": "quarryMintWrapper",
"isMut": false,
"isSigner": false
},
{
"name": "quarryMinter",
"isMut": false,
"isSigner": false
},
{
"name": "quarryRewarder",
"isMut": false,
"isSigner": false
},
{
"name": "sunnyQuarryProgram",
"isMut": false,
"isSigner": false
},
{
"name": "mineProgram",
"isMut": false,
"isSigner": false
},
{
"name": "systemProgram",
"isMut": false,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
}
],
"args": []
},
{
"name": "initializeSunnyVaultStageTwo",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "management",
"isMut": false,
"isSigner": false
},
{
"name": "vault",
"isMut": true,
"isSigner": false
},
{
"name": "vaultPda",
"isMut": true,
"isSigner": false
},
{
"name": "tvaultSunnyVaultAccount",
"isMut": true,
"isSigner": false
},
{
"name": "configDataAccount",
"isMut": true,
"isSigner": false
},
{
"name": "miner",
"isMut": true,
"isSigner": false
},
{
"name": "minerVault",
"isMut": true,
"isSigner": false
},
{
"name": "quarry",
"isMut": true,
"isSigner": false
},
{
"name": "sunnyMiner",
"isMut": false,
"isSigner": false
},
{
"name": "sunnyMinerTokenAccount",
"isMut": false,
"isSigner": false
},
{
"name": "sunnyPool",
"isMut": false,
"isSigner": false
},
{
"name": "sunnyQuarry",
"isMut": false,
"isSigner": false
},
{
"name": "sunnyRewarder",
"isMut": false,
"isSigner": false
},
{
"name": "sunnyInternalTokenMint",
"isMut": false,
"isSigner": false
},
{
"name": "tvaultSunnyInternalTokenAccount",
"isMut": false,
"isSigner": false
},
{
"name": "tvaultSunnyRewardTokenAccount",
"isMut": false,
"isSigner": false
},
{
"name": "underlyingTokenMint",
"isMut": false,
"isSigner": false
},
{
"name": "quarryRewardTokenMint",
"isMut": false,
"isSigner": false
},
{
"name": "quarryMintWrapper",
"isMut": false,
"isSigner": false
},
{
"name": "quarryMinter",
"isMut": false,
"isSigner": false
},
{
"name": "quarryRewarder",
"isMut": false,
"isSigner": false
},
{
"name": "sunnyRewardTokenMint",
"isMut": false,
"isSigner": false
},
{
"name": "sunnyQuarryProgram",
"isMut": false,
"isSigner": false
},
{
"name": "mineProgram",
"isMut": false,
"isSigner": false
},
{
"name": "systemProgram",
"isMut": false,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
}
],
"args": [
{
"name": "args",
"type": {
"defined": "InitializeSaberConfigurationData"
}
}
]
},
{
"name": "sweepSunnyVault",
"accounts": [
{
"name": "sweepData",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "management",
"isMut": false,
"isSigner": false
},
{
"name": "vault",
"isMut": true,
"isSigner": false
},
{
"name": "vaultPda",
"isMut": true,
"isSigner": false
},
{
"name": "underlyingDepositQueue",
"isMut": true,
"isSigner": false
},
{
"name": "underlyingCompoundQueue",
"isMut": true,
"isSigner": false
},
{
"name": "miner",
"isMut": true,
"isSigner": false
},
{
"name": "minerVault",
"isMut": true,
"isSigner": false
},
{
"name": "quarry",
"isMut": true,
"isSigner": false
},
{
"name": "rewarder",
"isMut": false,
"isSigner": false
},
{
"name": "quarryMineProgram",
"isMut": false,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
},
{
"name": "sharesMint",
"isMut": false,
"isSigner": false
}
]
},
{
"name": "configData",
"isMut": false,
"isSigner": false
},
{
"name": "tvaultVendorTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "sunnyQuarry",
"isMut": true,
"isSigner": false
},
{
"name": "sunnyPool",
"isMut": true,
"isSigner": false
},
{
"name": "sunnyTvault",
"isMut": true,
"isSigner": false
},
{
"name": "sunnyInternalMint",
"isMut": true,
"isSigner": false
},
{
"name": "tvaultSunnyInternalTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "sunnyRewarder",
"isMut": false,
"isSigner": false
},
{
"name": "sunnyMiner",
"isMut": true,
"isSigner": false
},
{
"name": "sunnyMinerTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "sunnyQuarryProgram",
"isMut": false,
"isSigner": false
},
{
"name": "clock",
"isMut": false,
"isSigner": false
}
],
"args": [
{
"name": "compound",
"type": "bool"
}
]
},
{
"name": "harvestSunnyVault",
"accounts": [
{
"name": "harvestData",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "management",
"isMut": false,
"isSigner": false
},
{
"name": "vault",
"isMut": true,
"isSigner": false
},
{
"name": "vaultPda",
"isMut": true,
"isSigner": false
},
{
"name": "miner",
"isMut": true,
"isSigner": false
},
{
"name": "minerVault",
"isMut": true,
"isSigner": false
},
{
"name": "quarry",
"isMut": true,
"isSigner": false
},
{
"name": "mintWrapper",
"isMut": true,
"isSigner": false
},
{
"name": "minter",
"isMut": true,
"isSigner": false
},
{
"name": "rewardsTokenMint",
"isMut": true,
"isSigner": false
},
{
"name": "claimFeeTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "rewarder",
"isMut": false,
"isSigner": false
},
{
"name": "mintWrapperProgram",
"isMut": false,
"isSigner": false
},
{
"name": "quarryMineProgram",
"isMut": false,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
}
]
},
{
"name": "configData",
"isMut": false,
"isSigner": false
},
{
"name": "tvaultSaberRewardTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "tvaultSunnyRewardTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "tvaultVendorTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "tvaultSunnyInternalTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "sunnyRewardTokenMint",
"isMut": true,
"isSigner": false
},
{
"name": "sunnyPool",
"isMut": true,
"isSigner": false
},
{
"name": "sunnyTvault",
"isMut": true,
"isSigner": false
},
{
"name": "sunnyQuarryProgram",
"isMut": false,
"isSigner": false
},
{
"name": "sunnyMintWrapper",
"isMut": true,
"isSigner": false
},
{
"name": "sunnyMinter",
"isMut": true,
"isSigner": false
},
{
"name": "sunnyClaimFeeTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "sunnyRewarder",
"isMut": false,
"isSigner": false
},
{
"name": "sunnyQuarry",
"isMut": true,
"isSigner": false
},
{
"name": "sunnyMiner",
"isMut": true,
"isSigner": false
},
{
"name": "sunnyMinerVault",
"isMut": true,
"isSigner": false
},
{
"name": "clock",
"isMut": false,
"isSigner": false
}
],
"args": [
{
"name": "harvestQuarry",
"type": "bool"
}
]
},
{
"name": "withdrawSunnyVaultRewards",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "management",
"isMut": false,
"isSigner": false
},
{
"name": "vault",
"isMut": true,
"isSigner": false
},
{
"name": "vaultPda",
"isMut": true,
"isSigner": false
},
{
"name": "configData",
"isMut": false,
"isSigner": false
},
{
"name": "sunnyPool",
"isMut": false,
"isSigner": false
},
{
"name": "sunnyTvault",
"isMut": true,
"isSigner": false
},
{
"name": "tvaultSaberRewardTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "tvaultSunnyRewardTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "vaultSaberRewardTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "vaultSunnyRewardTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "saberClaimFeeTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "sunnyClaimFeeTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
},
{
"name": "sunnyQuarryProgram",
"isMut": false,
"isSigner": false
}
],
"args": []
},
{
"name": "redeemSunnyVaultRewards",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "management",
"isMut": false,
"isSigner": false
},
{
"name": "vault",
"isMut": true,
"isSigner": false
},
{
"name": "vaultPda",
"isMut": true,
"isSigner": false
},
{
"name": "saberRewardTokenMint",
"isMut": true,
"isSigner": false
},
{
"name": "sunnyRewardTokenMint",
"isMut": true,
"isSigner": false
},
{
"name": "vaultSaberRewardTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "vaultSunnyRewardTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "vaultSaberTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "vaultSunnyTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "saberTokenMint",
"isMut": true,
"isSigner": false
},
{
"name": "sunnyTokenMint",
"isMut": true,
"isSigner": false
},
{
"name": "saberRedemptionVault",
"isMut": true,
"isSigner": false
},
{
"name": "sunnyRedemptionVault",
"isMut": true,
"isSigner": false
},
{
"name": "saberRedeemer",
"isMut": false,
"isSigner": false
},
{
"name": "sunnyRedeemer",
"isMut": false,
"isSigner": false
},
{
"name": "saberMinterInfo",
"isMut": true,
"isSigner": false
},
{
"name": "sunnyMinterInfo",
"isMut": true,
"isSigner": false
},
{
"name": "sunnyMintWrapper",
"isMut": false,
"isSigner": false
},
{
"name": "saberMintProxyState",
"isMut": false,
"isSigner": false
},
{
"name": "saberProxyMintAuthority",
"isMut": false,
"isSigner": false
},
{
"name": "feeCollectorSaberTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "feeCollectorSunnyTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "sunnyMinterProgram",
"isMut": false,
"isSigner": false
},
{
"name": "saberMintProxyProgram",
"isMut": false,
"isSigner": false
},
{
"name": "sunnyRedemptionProgram",
"isMut": false,
"isSigner": false
},
{
"name": "saberRedemptionProgram",
"isMut": false,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
}
],
"args": []
},
{
"name": "withdrawSunnyVault",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "vault",
"isMut": true,
"isSigner": false
},
{
"name": "vaultPda",
"isMut": true,
"isSigner": false
},
{
"name": "configData",
"isMut": false,
"isSigner": false
},
{
"name": "sunnyInternalMint",
"isMut": true,
"isSigner": false
},
{
"name": "sunnyTvaultVendorTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "sunnyTvaultInternalTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "sunnyPool",
"isMut": true,
"isSigner": false
},
{
"name": "sunnyTvault",
"isMut": true,
"isSigner": false
},
{
"name": "sunnyQuarry",
"isMut": true,
"isSigner": false
},
{
"name": "sunnyMiner",
"isMut": true,
"isSigner": false
},
{
"name": "sunnyMinerVault",
"isMut": true,
"isSigner": false
},
{
"name": "sunnyRewarder",
"isMut": false,
"isSigner": false
},
{
"name": "rewarder",
"isMut": false,
"isSigner": false
},
{
"name": "quarry",
"isMut": true,
"isSigner": false
},
{
"name": "miner",
"isMut": true,
"isSigner": false
},
{
"name": "minerVault",
"isMut": true,
"isSigner": false
},
{
"name": "sharesMint",
"isMut": true,
"isSigner": false
},
{
"name": "burningSharesTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "vaultWithdrawQueue",
"isMut": true,
"isSigner": false
},
{
"name": "receivingUnderlyingTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "feeDestination",
"isMut": true,
"isSigner": false
},
{
"name": "mineProgram",
"isMut": false,
"isSigner": false
},
{
"name": "sunnyQuarryProgram",
"isMut": false,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
},
{
"name": "clock",
"isMut": false,
"isSigner": false
}
],
"args": [
{
"name": "amount",
"type": "u64"
}
]
},
{
"name": "withdrawQuarryVault",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "vault",
"isMut": true,
"isSigner": false
},
{
"name": "vaultPda",
"isMut": true,
"isSigner": false
},
{
"name": "rewarder",
"isMut": false,
"isSigner": false
},
{
"name": "quarry",
"isMut": true,
"isSigner": false
},
{
"name": "miner",
"isMut": true,
"isSigner": false
},
{
"name": "minerVault",
"isMut": true,
"isSigner": false
},
{
"name": "sharesMint",
"isMut": true,
"isSigner": false
},
{
"name": "burningSharesTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "vaultWithdrawQueue",
"isMut": true,
"isSigner": false
},
{
"name": "receivingUnderlyingTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "feeDestination",
"isMut": true,
"isSigner": false
},
{
"name": "mineProgram",
"isMut": false,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
},
{
"name": "clock",
"isMut": false,
"isSigner": false
}
],
"args": [
{
"name": "amount",
"type": "u64"
}
]
},
{
"name": "configureAtrixVault",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "management",
"isMut": false,
"isSigner": false
},
{
"name": "vault",
"isMut": true,
"isSigner": false
},
{
"name": "vaultPda",
"isMut": true,
"isSigner": false
},
{
"name": "vaultAtrixStakerAccount",
"isMut": true,
"isSigner": false
},
{
"name": "vaultAtrixHarvesterAccount",
"isMut": true,
"isSigner": false
},
{
"name": "cropAccount",
"isMut": false,
"isSigner": false
},
{
"name": "farmAccount",
"isMut": false,
"isSigner": false
},
{
"name": "systemProgram",
"isMut": false,
"isSigner": false
},
{
"name": "rent",
"isMut": false,
"isSigner": false
},
{
"name": "atrixFarmProgram",
"isMut": false,
"isSigner": false
}
],
"args": [
{
"name": "dualCrop",
"type": "u8"
}
]
},
{
"name": "sweepAtrixVault",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "management",
"isMut": false,
"isSigner": false
},
{
"name": "vault",
"isMut": true,
"isSigner": false
},
{
"name": "vaultPda",
"isMut": true,
"isSigner": false
},
{
"name": "vaultStakerAccount",
"isMut": true,
"isSigner": false
},
{
"name": "farmAccount",
"isMut": false,
"isSigner": false
},
{
"name": "farmStakeTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "cropAccount",
"isMut": true,
"isSigner": false
},
{
"name": "cropRewardTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "vaultHarvesterAccount",
"isMut": true,
"isSigner": false
},
{
"name": "vaultRewardTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "underlyingDepositQueue",
"isMut": true,
"isSigner": false
},
{
"name": "underlyingCompoundQueue",
"isMut": true,
"isSigner": false
},
{
"name": "sharesMint",
"isMut": false,
"isSigner": false
},
{
"name": "atrixFarmProgram",
"isMut": false,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
},
{
"name": "clock",
"isMut": false,
"isSigner": false
}
],
"args": [
{
"name": "compound",
"type": "u8"
}
]
},
{
"name": "withdrawAtrixVault",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "vault",
"isMut": true,
"isSigner": false
},
{
"name": "vaultPda",
"isMut": true,
"isSigner": false
},
{
"name": "vaultStakerAccount",
"isMut": true,
"isSigner": false
},
{
"name": "farmAccount",
"isMut": false,
"isSigner": false
},
{
"name": "farmStakeTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "cropAccount",
"isMut": true,
"isSigner": false
},
{
"name": "cropRewardTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "vaultHarvesterAccount",
"isMut": true,
"isSigner": false
},
{
"name": "vaultRewardTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "underlyingWithdrawQueue",
"isMut": true,
"isSigner": false
},
{
"name": "burningSharesTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "sharesMint",
"isMut": true,
"isSigner": false
},
{
"name": "receivingUnderlyingTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "atrixFarmProgram",
"isMut": false,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
},
{
"name": "clock",
"isMut": false,
"isSigner": false
}
],
"args": [
{
"name": "amount",
"type": "u64"
}
]
},
{
"name": "harvestAtrixVault",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "management",
"isMut": false,
"isSigner": false
},
{
"name": "vault",
"isMut": true,
"isSigner": false
},
{
"name": "vaultPda",
"isMut": true,
"isSigner": false
},
{
"name": "vaultStakerAccount",
"isMut": true,
"isSigner": false
},
{
"name": "farmAccount",
"isMut": false,
"isSigner": false
},
{
"name": "farmStakeTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "cropAccount",
"isMut": true,
"isSigner": false
},
{
"name": "cropRewardTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "vaultHarvesterAccount",
"isMut": true,
"isSigner": false
},
{
"name": "vaultRewardTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "underlyingCompoundQueue",
"isMut": true,
"isSigner": false
},
{
"name": "feeCollectorTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "sharesMint",
"isMut": false,
"isSigner": false
},
{
"name": "atrixFarmProgram",
"isMut": false,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
},
{
"name": "clock",
"isMut": false,
"isSigner": false
}
],
"args": []
},
{
"name": "addAtrixLiquidity",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "management",
"isMut": false,
"isSigner": false
},
{
"name": "vault",
"isMut": true,
"isSigner": false
},
{
"name": "vaultPda",
"isMut": true,
"isSigner": false
},
{
"name": "protocolAccount",
"isMut": true,
"isSigner": false
},
{
"name": "poolAccount",
"isMut": true,
"isSigner": false
},
{
"name": "poolCoinTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "poolPcTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "poolLpTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "poolLpTokenMint",
"isMut": true,
"isSigner": false
},
{
"name": "vaultCoinTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "vaultPcTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "underlyingCompoundQueue",
"isMut": true,
"isSigner": false
},
{
"name": "serumMarket",
"isMut": true,
"isSigner": false
},
{
"name": "atrixOpenOrders",
"isMut": true,
"isSigner": false
},
{
"name": "serumRequestQueue",
"isMut": true,
"isSigner": false
},
{
"name": "serumEventQueue",
"isMut": true,
"isSigner": false
},
{
"name": "serumMarketBids",
"isMut": true,
"isSigner": false
},
{
"name": "serumMarketAsks",
"isMut": true,
"isSigner": false
},
{
"name": "serumCoinVault",
"isMut": true,
"isSigner": false
},
{
"name": "serumPcVault",
"isMut": true,
"isSigner": false
},
{
"name": "serumVaultSigner",
"isMut": false,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
},
{
"name": "atrixPoolProgram",
"isMut": false,
"isSigner": false
},
{
"name": "serumDexProgram",
"isMut": false,
"isSigner": false
},
{
"name": "rent",
"isMut": false,
"isSigner": false
},
{
"name": "systemProgram",
"isMut": false,
"isSigner": false
}
],
"args": [
{
"name": "action",
"type": "u64"
}
]
},
{
"name": "initializeStrategyAccount",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "management",
"isMut": true,
"isSigner": false
},
{
"name": "strategyAccount",
"isMut": true,
"isSigner": false
},
{
"name": "systemProgram",
"isMut": false,
"isSigner": false
}
],
"args": [
{
"name": "strategyType",
"type": "u64"
}
]
},
{
"name": "registerStrategyAccount",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "management",
"isMut": false,
"isSigner": false
},
{
"name": "strategyAccount",
"isMut": true,
"isSigner": false
}
],
"args": [
{
"name": "strategyType",
"type": "u64"
},
{
"name": "data",
"type": "bytes"
}
]
},
{
"name": "executeStrategy",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "management",
"isMut": false,
"isSigner": false
},
{
"name": "strategyAccount",
"isMut": true,
"isSigner": false
}
],
"args": [
{
"name": "args",
"type": {
"defined": "StrategyExecutionArgs"
}
},
{
"name": "data",
"type": "bytes"
}
]
},
{
"name": "registerStrategyBalanceAccount",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "management",
"isMut": false,
"isSigner": false
},
{
"name": "strategyAccount",
"isMut": true,
"isSigner": false
},
{
"name": "strategyBalanceAccount",
"isMut": true,
"isSigner": false
},
{
"name": "strategyBalanceTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "vault",
"isMut": false,
"isSigner": false
},
{
"name": "vaultPda",
"isMut": true,
"isSigner": false
},
{
"name": "underlyingTokenMint",
"isMut": false,
"isSigner": false
},
{
"name": "systemProgram",
"isMut": false,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
},
{
"name": "ataProgram",
"isMut": false,
"isSigner": false
},
{
"name": "rent",
"isMut": false,
"isSigner": false
}
],
"args": [
{
"name": "strategyType",
"type": "u64"
},
{
"name": "farmType",
"type": {
"array": [
"u64",
2
]
}
}
]
},
{
"name": "vaultDepositStrategyAccount",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "management",
"isMut": false,
"isSigner": false
},
{
"name": "vaultStrategyBalanceAccount",
"isMut": true,
"isSigner": false
},
{
"name": "vault",
"isMut": true,
"isSigner": false
},
{
"name": "vaultPda",
"isMut": false,
"isSigner": false
},
{
"name": "strategyAccount",
"isMut": true,
"isSigner": false
},
{
"name": "vaultStrategyBalanceTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "strategyTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
}
],
"args": [
{
"name": "strategyType",
"type": "u64"
},
{
"name": "farmType",
"type": {
"array": [
"u64",
2
]
}
},
{
"name": "amount",
"type": "u64"
}
]
},
{
"name": "vaultWithdrawStrategyAccount",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "management",
"isMut": false,
"isSigner": false
},
{
"name": "vaultStrategyBalanceAccount",
"isMut": true,
"isSigner": false
},
{
"name": "vault",
"isMut": true,
"isSigner": false
},
{
"name": "vaultPda",
"isMut": false,
"isSigner": false
},
{
"name": "strategyAccount",
"isMut": true,
"isSigner": false
},
{
"name": "strategyPda",
"isMut": false,
"isSigner": false
},
{
"name": "vaultStrategyBalanceTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "strategyTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "underlyingDepositQueue",
"isMut": true,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
}
],
"args": [
{
"name": "strategyType",
"type": "u64"
},
{
"name": "farmType",
"type": {
"array": [
"u64",
2
]
}
},
{
"name": "amount",
"type": "u64"
}
]
},
{
"name": "withdrawMultiDepositOptimizerVaultToStrategy",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "multiDeposit",
"isMut": true,
"isSigner": false
},
{
"name": "multiDepositPda",
"isMut": false,
"isSigner": false
},
{
"name": "withdrawVault",
"isMut": true,
"isSigner": false
},
{
"name": "withdrawVaultPda",
"isMut": false,
"isSigner": false
},
{
"name": "platformInformation",
"isMut": false,
"isSigner": false
},
{
"name": "platformConfigData",
"isMut": false,
"isSigner": false
},
{
"name": "lendingProgram",
"isMut": false,
"isSigner": false
},
{
"name": "withdrawBurningSharesTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "strategyBalanceTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "multiUnderlyingWithdrawQueue",
"isMut": true,
"isSigner": false
},
{
"name": "multiSharesMint",
"isMut": true,
"isSigner": false
},
{
"name": "withdrawSharesMint",
"isMut": true,
"isSigner": false
},
{
"name": "clock",
"isMut": false,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
},
{
"name": "withdrawVaultUnderlyingDepositQueue",
"isMut": false,
"isSigner": false
},
{
"name": "management",
"isMut": false,
"isSigner": false
}
],
"args": [
{
"name": "amount",
"type": "u64"
}
]
},
{
"name": "adjustSerumTradeSlippage",
"accounts": [
{
"name": "authority",
"isMut": false,
"isSigner": true
},
{
"name": "management",
"isMut": false,
"isSigner": false
},
{
"name": "serumTradeAccount",
"isMut": true,
"isSigner": false
}
],
"args": [
{
"name": "slippage",
"type": "u64"
}
]
}
],
"accounts": [
{
"name": "SerumTradeAccount",
"type": {
"kind": "struct",
"fields": [
{
"name": "serumRebateAccount",
"type": "publicKey"
},
{
"name": "pda",
"type": "publicKey"
},
{
"name": "pdaNonce",
"type": "u8"
},
{
"name": "slippage",
"type": "u64"
},
{
"name": "buffer",
"type": {
"array": [
"u8",
919
]
}
}
]
}
},
{
"name": "BorrowLend",
"type": {
"kind": "struct",
"fields": [
{
"name": "accountAddress",
"type": "publicKey"
},
{
"name": "pdaAddress",
"type": "publicKey"
},
{
"name": "totalDepositedBalance",
"type": "u64"
},
{
"name": "totalIssuedShares",
"type": "u64"
},
{
"name": "totalDepositedBalanceInUse",
"type": "u64"
},
{
"name": "currentIteration",
"type": "u64"
},
{
"name": "maxIterations",
"type": "u64"
},
{
"name": "configAccountIndex",
"type": "u64"
},
{
"name": "amountBorrowed",
"type": "u64"
},
{
"name": "pnlGains",
"type": "u64"
},
{
"name": "pnlLosses",
"type": "u64"
},
{
"name": "balanceAfterLastExecution",
"type": "u64"
},
{
"name": "balanceBeforeLastExecution",
"type": "u64"
},
{
"name": "addressCounter",
"type": "u64"
},
{
"name": "pdaNonce",
"type": "u8"
},
{
"name": "sourcePlatform",
"type": "u8"
},
{
"name": "destinationPlatform",
"type": "u8"
},
{
"name": "enabled",
"type": "bool"
},
{
"name": "pendingWithdraws",
"type": "bool"
},
{
"name": "buffer",
"type": {
"array": [
"u8",
512
]
}
}
]
}
},
{
"name": "StrategyBalanceAccount",
"type": {
"kind": "struct",
"fields": [
{
"name": "totalDepositedBalance",
"type": "u64"
},
{
"name": "totalIssuedShares",
"type": "u64"
},
{
"name": "strategyAccount",
"type": "publicKey"
},
{
"name": "authority",
"type": "publicKey"
},
{
"name": "pnlGains",
"type": "u64"
},
{
"name": "pnlLosses",
"type": "u64"
},
{
"name": "buffer",
"type": {
"array": [
"u8",
32
]
}
}
]
}
},
{
"name": "AtrixVaultV1",
"type": {
"kind": "struct",
"fields": [
{
"name": "base",
"type": {
"defined": "VaultBaseV1"
}
},
{
"name": "atrixFarmAccount",
"type": "publicKey"
},
{
"name": "vaultStakerAccount",
"type": "publicKey"
},
{
"name": "vaultHarvesterAccount",
"type": "publicKey"
},
{
"name": "dualCrop",
"type": "u8"
},
{
"name": "buffer",
"type": {
"array": [
"u8",
519
]
}
}
]
}
},
{
"name": "LendingOptimizerV1",
"type": {
"kind": "struct",
"fields": [
{
"name": "base",
"type": {
"defined": "VaultBaseV1"
}
},
{
"name": "currentFarmProgram",
"type": "publicKey"
},
{
"name": "currentPlatformInformation",
"type": "publicKey"
},
{
"name": "currentPlatformCount",
"type": "u64"
},
{
"name": "lastRebaseSlot",
"type": "u64"
},
{
"name": "buffer",
"type": {
"array": [
"u8",
1000
]
}
}
]
}
},
{
"name": "LendingPlatformV1",
"type": {
"kind": "struct",
"fields": [
{
"name": "vault",
"type": "publicKey"
},
{
"name": "programAddress",
"type": "publicKey"
},
{
"name": "programType",
"type": {
"defined": "ProgramType"
}
},
{
"name": "configDataAddress",
"type": "publicKey"
},
{
"name": "index",
"type": "u64"
},
{
"name": "nonce",
"type": "u8"
},
{
"name": "buffer",
"type": {
"array": [
"u8",
256
]
}
}
]
}
},
{
"name": "SplLendingConfig",
"type": {
"kind": "struct",
"fields": [
{
"name": "collateralMint",
"type": "publicKey"
},
{
"name": "reserveAccount",
"type": "publicKey"
},
{
"name": "reserveLiquidityAccount",
"type": "publicKey"
},
{
"name": "lendingMarketAccount",
"type": "publicKey"
},
{
"name": "derivedLendingMarketAuthority",
"type": "publicKey"
},
{
"name": "collateralTokenAccount",
"type": "publicKey"
},
{
"name": "oracleKeys",
"type": {
"array": [
"publicKey",
3
]
}
},
{
"name": "oraclePrograms",
"type": {
"array": [
"publicKey",
3
]
}
},
{
"name": "informationAccount",
"type": "publicKey"
},
{
"name": "nonce",
"type": "u8"
},
{
"name": "obligationAccount",
"type": "publicKey"
},
{
"name": "buffer",
"type": {
"array": [
"u8",
224
]
}
}
]
}
},
{
"name": "MangoV3Config",
"type": {
"kind": "struct",
"fields": [
{
"name": "mangoGroupAccount",
"type": "publicKey"
},
{
"name": "mangoAccount",
"type": "publicKey"
},
{
"name": "mangoCache",
"type": "publicKey"
},
{
"name": "mangoRootBank",
"type": "publicKey"
},
{
"name": "mangoNodeBank",
"type": "publicKey"
},
{
"name": "mangoGroupTokenAccount",
"type": "publicKey"
},
{
"name": "informationAccount",
"type": "publicKey"
},
{
"name": "nonce",
"type": "u8"
},
{
"name": "buffer",
"type": {
"array": [
"u8",
256
]
}
}
]
}
},
{
"name": "MultiDepositOptimizerV1",
"type": {
"kind": "struct",
"fields": [
{
"name": "base",
"type": {
"defined": "VaultBaseV1"
}
},
{
"name": "lastRebaseSlot",
"type": "u64"
},
{
"name": "standaloneVaults",
"type": {
"array": [
{
"defined": "StandaloneVaultCacheV1"
},
6
]
}
},
{
"name": "targetVault",
"type": "publicKey"
},
{
"name": "stateTransitionAccount",
"type": "publicKey"
},
{
"name": "minimumRebalanceAmount",
"type": "u64"
},
{
"name": "balanceAvailableForStrategy",
"type": "u64"
},
{
"name": "balanceInUsedByStrategy",
"type": "u64"
},
{
"name": "buffer",
"type": {
"array": [
"u8",
256
]
}
}
]
}
},
{
"name": "RebalanceStateTransitionV1",
"type": {
"kind": "struct",
"fields": [
{
"name": "optimizerVault",
"type": "publicKey"
},
{
"name": "vaultRemovalAmountA",
"type": "u64"
},
{
"name": "vaultSupplyAmountB",
"type": "u64"
},
{
"name": "unusedTwo",
"type": "u64"
},
{
"name": "unusedThree",
"type": "u64"
},
{
"name": "vaultAddressA",
"type": "publicKey"
},
{
"name": "vaultAddressB",
"type": "publicKey"
},
{
"name": "vaultAProgramType",
"type": {
"defined": "ProgramType"
}
},
{
"name": "vaultBProgramType",
"type": {
"defined": "ProgramType"
}
},
{
"name": "state",
"type": {
"defined": "RebalanceStates"
}
},
{
"name": "lastCompletionTs",
"type": "i64"
},
{
"name": "buffer",
"type": {
"array": [
"u8",
256
]
}
}
]
}
},
{
"name": "OrcaVaultV1",
"type": {
"kind": "struct",
"fields": [
{
"name": "base",
"type": {
"defined": "VaultBaseV1"
}
},
{
"name": "farmData",
"type": {
"defined": "OrcaVaultDataV1"
}
},
{
"name": "buffer",
"type": {
"array": [
"u8",
135
]
}
}
]
}
},
{
"name": "OrcaDoubleDipVaultV1",
"type": {
"kind": "struct",
"fields": [
{
"name": "base",
"type": {
"defined": "VaultBaseV1"
}
},
{
"name": "farmData",
"type": {
"defined": "OrcaVaultDataV1"
}
},
{
"name": "ddFarmData",
"type": {
"defined": "OrcaVaultDataV1"
}
},
{
"name": "ddCompoundQueue",
"type": "publicKey"
},
{
"name": "ddCompoundQueueNonce",
"type": "u8"
},
{
"name": "ddConfigured",
"type": "u8"
},
{
"name": "ddWithdrawQueue",
"type": "publicKey"
},
{
"name": "ddWithdrawQueueNonce",
"type": "u8"
},
{
"name": "buffer",
"type": {
"array": [
"u8",
35
]
}
}
]
}
},
{
"name": "QuarryVaultV1",
"type": {
"kind": "struct",
"fields": [
{
"name": "base",
"type": {
"defined": "VaultBaseV1"
}
},
{
"name": "miner",
"type": "publicKey"
},
{
"name": "minerTokenAccount",
"type": "publicKey"
},
{
"name": "mintWrapper",
"type": "publicKey"
},
{
"name": "minter",
"type": "publicKey"
},
{
"name": "quarry",
"type": "publicKey"
},
{
"name": "rewarder",
"type": "publicKey"
},
{
"name": "rewardTokenMint",
"type": "publicKey"
},
{
"name": "rewardTokenAccount",
"type": "publicKey"
},
{
"name": "swapMarkets",
"type": {
"array": [
"publicKey",
3
]
}
},
{
"name": "variant",
"type": {
"defined": "QuarryVariant"
}
},
{
"name": "configData",
"type": "publicKey"
},
{
"name": "configDataInitialized",
"type": "u8"
},
{
"name": "extraDataAccount",
"type": "publicKey"
},
{
"name": "buffer",
"type": {
"array": [
"u8",
263
]
}
}
]
}
},
{
"name": "SaberConfigurationDataV1",
"type": {
"kind": "struct",
"fields": [
{
"name": "vault",
"type": "publicKey"
},
{
"name": "isDecimalWrappedA",
"type": "u8"
},
{
"name": "isDecimalWrappedB",
"type": "u8"
},
{
"name": "wrapperMintA",
"type": "publicKey"
},
{
"name": "wrapperAccountA",
"type": "publicKey"
},
{
"name": "wrapperAccountB",
"type": "publicKey"
},
{
"name": "wrapperMintB",
"type": "publicKey"
},
{
"name": "extraDataAccount",
"type": "publicKey"
},
{
"name": "buffer",
"type": {
"array": [
"u8",
256
]
}
}
]
}
},
{
"name": "SunnyConfigurationDataV1",
"type": {
"kind": "struct",
"fields": [
{
"name": "vault",
"type": "publicKey"
},
{
"name": "isDecimalWrappedA",
"type": "u8"
},
{
"name": "isDecimalWrappedB",
"type": "u8"
},
{
"name": "wrapperMintA",
"type": "publicKey"
},
{
"name": "wrapperAccountA",
"type": "publicKey"
},
{
"name": "wrapperAccountB",
"type": "publicKey"
},
{
"name": "wrapperMintB",
"type": "publicKey"
},
{
"name": "sunnyPool",
"type": "publicKey"
},
{
"name": "sunnyTvault",
"type": "publicKey"
},
{
"name": "sunnyMiner",
"type": "publicKey"
},
{
"name": "sunnyMinerTokenAccount",
"type": "publicKey"
},
{
"name": "sunnyRewarder",
"type": "publicKey"
},
{
"name": "extraDataAccount",
"type": "publicKey"
},
{
"name": "buffer",
"type": {
"array": [
"u8",
128
]
}
}
]
}
},
{
"name": "RaydiumVaultV1",
"type": {
"kind": "struct",
"fields": [
{
"name": "base",
"type": {
"defined": "VaultBaseV1"
}
},
{
"name": "raydiumLpMintAddress",
"type": "publicKey"
},
{
"name": "raydiumAmmId",
"type": "publicKey"
},
{
"name": "raydiumAmmAuthority",
"type": "publicKey"
},
{
"name": "raydiumAmmOpenOrders",
"type": "publicKey"
},
{
"name": "raydiumAmmQuantitiesOrTargetOrders",
"type": "publicKey"
},
{
"name": "raydiumStakeProgram",
"type": "publicKey"
},
{
"name": "raydiumLiquidityProgram",
"type": "publicKey"
},
{
"name": "raydiumCoinTokenAccount",
"type": "publicKey"
},
{
"name": "raydiumPcTokenAccount",
"type": "publicKey"
},
{
"name": "raydiumPoolTempTokenAccount",
"type": "publicKey"
},
{
"name": "raydiumPoolLpTokenAccount",
"type": "publicKey"
},
{
"name": "raydiumPoolWithdrawQueue",
"type": "publicKey"
},
{
"name": "raydiumPoolId",
"type": "publicKey"
},
{
"name": "raydiumPoolAuthority",
"type": "publicKey"
},
{
"name": "raydiumPoolRewardATokenAccount",
"type": "publicKey"
},
{
"name": "raydiumPoolRewardBTokenAccount",
"type": "publicKey"
},
{
"name": "dualRewards",
"type": "u8"
},
{
"name": "vaultRewardATokenAccount",
"type": "publicKey"
},
{
"name": "vaultRewardBTokenAccount",
"type": "publicKey"
},
{
"name": "vaultStakeInfoAccount",
"type": "publicKey"
},
{
"name": "associatedStakeInfoAddress",
"type": "publicKey"
},
{
"name": "coinMint",
"type": "publicKey"
},
{
"name": "pcMint",
"type": "publicKey"
},
{
"name": "serumMarket",
"type": "publicKey"
},
{
"name": "buffer",
"type": {
"array": [
"u8",
407
]
}
}
]
}
},
{
"name": "Management",
"type": {
"kind": "struct",
"fields": [
{
"name": "authority",
"type": "publicKey"
},
{
"name": "whitelistedEntries",
"type": {
"array": [
{
"defined": "WhitelistEntry"
},
10
]
}
},
{
"name": "strategyCounterOne",
"type": "u8"
},
{
"name": "specialDepositorSetOne",
"type": {
"array": [
"publicKey",
3
]
}
},
{
"name": "buffer",
"type": {
"array": [
"u8",
698
]
}
}
]
}
},
{
"name": "DepositTrackingV1",
"type": {
"kind": "struct",
"fields": [
{
"name": "owner",
"type": "publicKey"
},
{
"name": "vault",
"type": "publicKey"
},
{
"name": "pdaNonce",
"type": "u8"
},
{
"name": "queueNonce",
"type": "u8"
},
{
"name": "alignment",
"type": {
"array": [
"u8",
6
]
}
},
{
"name": "shares",
"type": "u64"
},
{
"name": "depositedBalance",
"type": "u64"
},
{
"name": "lastDepositTime",
"type": "i64"
},
{
"name": "pendingWithdrawAmount",
"type": "u64"
},
{
"name": "totalDepositedUnderlying",
"type": "u64"
},
{
"name": "totalWithdrawnUnderlying",
"type": "u64"
},
{
"name": "lastPendingReward",
"type": "u64"
},
{
"name": "rewardPerSharePaid",
"type": "u128"
},
{
"name": "extraDataAccount",
"type": "publicKey"
},
{
"name": "buffer",
"type": {
"array": [
"u8",
256
]
}
}
]
}
},
{
"name": "EphemeralTrackingV1",
"type": {
"kind": "struct",
"fields": [
{
"name": "authority",
"type": "publicKey"
},
{
"name": "availableForWithdraw",
"type": "u64"
},
{
"name": "liqToRemove",
"type": "u64"
},
{
"name": "configured",
"type": "u8"
},
{
"name": "canWithdraw",
"type": "u8"
},
{
"name": "metadataOne",
"type": {
"array": [
"u8",
64
]
}
},
{
"name": "metadataTwo",
"type": {
"array": [
"u8",
64
]
}
},
{
"name": "buffer",
"type": {
"array": [
"u8",
254
]
}
}
]
}
}
],
"types": [
{
"name": "InitSerumTradeAccountArgs",
"type": {
"kind": "struct",
"fields": [
{
"name": "serumRebateAccount",
"type": "publicKey"
},
{
"name": "pda",
"type": "publicKey"
},
{
"name": "pdaNonce",
"type": "u8"
},
{
"name": "slippage",
"type": "u64"
}
]
}
},
{
"name": "ConfigureAtrixVaultArgs",
"type": {
"kind": "struct",
"fields": [
{
"name": "atrixFarmAccount",
"type": "publicKey"
},
{
"name": "vaultStakerAccount",
"type": "publicKey"
},
{
"name": "vaultHarvesterAccount",
"type": "publicKey"
},
{
"name": "dualCrop",
"type": "u8"
}
]
}
},
{
"name": "StandaloneVaultCacheV1",
"type": {
"kind": "struct",
"fields": [
{
"name": "vaultAddress",
"type": "publicKey"
},
{
"name": "depositedBalance",
"type": "u64"
},
{
"name": "programType",
"type": {
"defined": "ProgramType"
}
},
{
"name": "programAddress",
"type": "publicKey"
},
{
"name": "sharesMint",
"type": "publicKey"
},
{
"name": "sharesAccount",
"type": "publicKey"
},
{
"name": "alignment",
"type": {
"array": [
"u8",
7
]
}
},
{
"name": "buffer",
"type": {
"array": [
"u64",
6
]
}
}
]
}
},
{
"name": "OrcaVaultDataV1",
"type": {
"kind": "struct",
"fields": [
{
"name": "userFarmAddr",
"type": "publicKey"
},
{
"name": "userFarmNonce",
"type": "u8"
},
{
"name": "vaultSwapTokenA",
"type": "publicKey"
},
{
"name": "vaultSwapTokenB",
"type": "publicKey"
},
{
"name": "poolSwapTokenA",
"type": "publicKey"
},
{
"name": "poolSwapTokenB",
"type": "publicKey"
},
{
"name": "poolSwapAccount",
"type": "publicKey"
},
{
"name": "vaultRewardTokenAccount",
"type": "publicKey"
},
{
"name": "vaultFarmTokenAccount",
"type": "publicKey"
},
{
"name": "vaultSwapTokenAccount",
"type": "publicKey"
},
{
"name": "globalBaseTokenVault",
"type": "publicKey"
},
{
"name": "globalRewardTokenVault",
"type": "publicKey"
},
{
"name": "globalFarm",
"type": "publicKey"
},
{
"name": "farmTokenMint",
"type": "publicKey"
},
{
"name": "rewardTokenMint",
"type": "publicKey"
},
{
"name": "swapPoolMint",
"type": "publicKey"
},
{
"name": "tokenAMint",
"type": "publicKey"
},
{
"name": "tokenBMint",
"type": "publicKey"
},
{
"name": "swapMarkets",
"type": {
"array": [
"publicKey",
3
]
}
},
{
"name": "buffer",
"type": {
"array": [
"u8",
32
]
}
}
]
}
},
{
"name": "ConfigureOrcaVaultArgs",
"type": {
"kind": "struct",
"fields": [
{
"name": "userFarmAddr",
"type": "publicKey"
},
{
"name": "userFarmNonce",
"type": "u8"
},
{
"name": "vaultSwapTokenA",
"type": "publicKey"
},
{
"name": "vaultSwapTokenB",
"type": "publicKey"
},
{
"name": "poolSwapTokenA",
"type": "publicKey"
},
{
"name": "poolSwapTokenB",
"type": "publicKey"
},
{
"name": "poolSwapAccount",
"type": "publicKey"
},
{
"name": "vaultRewardTokenAccount",
"type": "publicKey"
},
{
"name": "vaultFarmTokenAccount",
"type": "publicKey"
},
{
"name": "vaultSwapTokenAccount",
"type": "publicKey"
},
{
"name": "globalFarm",
"type": "publicKey"
},
{
"name": "globalBaseTokenVault",
"type": "publicKey"
},
{
"name": "globalRewardTokenVault",
"type": "publicKey"
},
{
"name": "farmTokenMint",
"type": "publicKey"
},
{
"name": "rewardTokenMint",
"type": "publicKey"
},
{
"name": "swapPoolMint",
"type": "publicKey"
},
{
"name": "tokenAMint",
"type": "publicKey"
},
{
"name": "tokenBMint",
"type": "publicKey"
},
{
"name": "swapMarkets",
"type": {
"array": [
"publicKey",
3
]
}
}
]
}
},
{
"name": "ConfigureQuarryVaultArgs",
"type": {
"kind": "struct",
"fields": [
{
"name": "miner",
"type": "publicKey"
},
{
"name": "minerTokenAccount",
"type": "publicKey"
},
{
"name": "quarry",
"type": "publicKey"
},
{
"name": "rewarder",
"type": "publicKey"
},
{
"name": "rewardTokenMint",
"type": "publicKey"
},
{
"name": "mintWrapper",
"type": "publicKey"
},
{
"name": "minter",
"type": "publicKey"
},
{
"name": "variant",
"type": {
"defined": "QuarryVariant"
}
},
{
"name": "requiresConfigDataAccount",
"type": "bool"
},
{
"name": "swapMarkets",
"type": {
"array": [
"publicKey",
3
]
}
}
]
}
},
{
"name": "ConfigureSunnyVaultArgs",
"type": {
"kind": "struct",
"fields": [
{
"name": "sunnyTvault",
"type": "publicKey"
},
{
"name": "sunnyPool",
"type": "publicKey"
},
{
"name": "sunnyRewardTokenMint",
"type": "publicKey"
},
{
"name": "tvaultSunnyRewardTokenAccount",
"type": "publicKey"
},
{
"name": "sunnyInternalTokenMint",
"type": "publicKey"
},
{
"name": "tvaultSunnyInternalTokenAccount",
"type": "publicKey"
},
{
"name": "sunnyRewarder",
"type": "publicKey"
},
{
"name": "sunnyQuarry",
"type": "publicKey"
},
{
"name": "sunnyMiner",
"type": "publicKey"
},
{
"name": "sunnyMinerTokenAccount",
"type": "publicKey"
},
{
"name": "isDecimalWrappedA",
"type": "u8"
},
{
"name": "isDecimalWrappedB",
"type": "u8"
},
{
"name": "wrapperMintA",
"type": "publicKey"
},
{
"name": "wrapperAccountA",
"type": "publicKey"
},
{
"name": "wrapperAccountB",
"type": "publicKey"
},
{
"name": "wrapperMintB",
"type": "publicKey"
}
]
}
},
{
"name": "InitializeSaberConfigurationData",
"type": {
"kind": "struct",
"fields": [
{
"name": "isDecimalWrappedA",
"type": "u8"
},
{
"name": "isDecimalWrappedB",
"type": "u8"
},
{
"name": "wrapperMintA",
"type": "publicKey"
},
{
"name": "wrapperAccountA",
"type": "publicKey"
},
{
"name": "wrapperAccountB",
"type": "publicKey"
},
{
"name": "wrapperMintB",
"type": "publicKey"
}
]
}
},
{
"name": "ConfigureRaydiumVaultArgs",
"type": {
"kind": "struct",
"fields": [
{
"name": "raydiumPoolId",
"type": "publicKey"
},
{
"name": "raydiumPoolAuthority",
"type": "publicKey"
},
{
"name": "raydiumLpMintAddress",
"type": "publicKey"
},
{
"name": "raydiumAmmId",
"type": "publicKey"
},
{
"name": "raydiumAmmAuthority",
"type": "publicKey"
},
{
"name": "raydiumAmmOpenOrders",
"type": "publicKey"
},
{
"name": "raydiumAmmQuantitiesOrTargetOrders",
"type": "publicKey"
},
{
"name": "raydiumLiquidityProgram",
"type": "publicKey"
},
{
"name": "raydiumStakeProgram",
"type": "publicKey"
},
{
"name": "raydiumCoinTokenAccount",
"type": "publicKey"
},
{
"name": "raydiumPcTokenAccount",
"type": "publicKey"
},
{
"name": "raydiumPoolTempTokenAccount",
"type": "publicKey"
},
{
"name": "raydiumPoolWithdrawQueue",
"type": "publicKey"
},
{
"name": "raydiumPoolRewardATokenAccount",
"type": "publicKey"
},
{
"name": "raydiumPoolRewardBTokenAccount",
"type": "publicKey"
},
{
"name": "raydiumPoolLpTokenAccount",
"type": "publicKey"
},
{
"name": "vaultStakeInfoAccount",
"type": "publicKey"
},
{
"name": "dualRewards",
"type": "bool"
},
{
"name": "vaultRewardATokenAccount",
"type": "publicKey"
},
{
"name": "vaultRewardBTokenAccount",
"type": "publicKey"
},
{
"name": "coinTokenMint",
"type": "publicKey"
},
{
"name": "pcTokenMint",
"type": "publicKey"
},
{
"name": "serumMarket",
"type": "publicKey"
}
]
}
},
{
"name": "WhitelistEntry",
"type": {
"kind": "struct",
"fields": [
{
"name": "authority",
"type": "publicKey"
},
{
"name": "roles",
"type": {
"array": [
{
"defined": "Roles"
},
3
]
}
}
]
}
},
{
"name": "FeesV1",
"type": {
"kind": "struct",
"fields": [
{
"name": "feeMultiplier",
"type": "u64"
},
{
"name": "controllerFee",
"type": "u64"
},
{
"name": "platformFee",
"type": "u64"
},
{
"name": "withdrawFee",
"type": "u64"
},
{
"name": "depositFee",
"type": "u64"
},
{
"name": "feeWallet",
"type": "publicKey"
},
{
"name": "totalCollectedA",
"type": "u64"
},
{
"name": "totalCollectedB",
"type": "u64"
},
{
"name": "buffer",
"type": {
"array": [
"u64",
6
]
}
}
]
}
},
{
"name": "RealizedYield",
"type": {
"kind": "struct",
"fields": [
{
"name": "gainPerSecond",
"type": "u128"
},
{
"name": "apr",
"type": "u128"
},
{
"name": "buffer",
"type": {
"array": [
"u64",
4
]
}
}
]
}
},
{
"name": "VaultBaseV1",
"type": {
"kind": "struct",
"fields": [
{
"name": "nonce",
"type": "u8"
},
{
"name": "tag",
"type": {
"array": [
"u8",
32
]
}
},
{
"name": "pda",
"type": "publicKey"
},
{
"name": "pdaNonce",
"type": "u8"
},
{
"name": "pdaAlignment",
"type": {
"array": [
"u8",
6
]
}
},
{
"name": "totalDepositedBalance",
"type": "u64"
},
{
"name": "totalShares",
"type": "u64"
},
{
"name": "underlyingMint",
"type": "publicKey"
},
{
"name": "underlyingWithdrawQueue",
"type": "publicKey"
},
{
"name": "underlyingDepositQueue",
"type": "publicKey"
},
{
"name": "underlyingCompoundQueue",
"type": "publicKey"
},
{
"name": "sharesMint",
"type": "publicKey"
},
{
"name": "withdrawsPaused",
"type": "u8"
},
{
"name": "depositsPaused",
"type": "u8"
},
{
"name": "compoundPaused",
"type": "u8"
},
{
"name": "supportsCompound",
"type": "u8"
},
{
"name": "rebasePaused",
"type": "u8"
},
{
"name": "rebalancePaused",
"type": "u8"
},
{
"name": "stateAlignment",
"type": {
"array": [
"u8",
2
]
}
},
{
"name": "precisionFactor",
"type": "u64"
},
{
"name": "lastCompoundTime",
"type": "i64"
},
{
"name": "compoundInterval",
"type": "i64"
},
{
"name": "slippageTolerance",
"type": "u8"
},
{
"name": "slipAlignment",
"type": {
"array": [
"u8",
7
]
}
},
{
"name": "fees",
"type": {
"defined": "FeesV1"
}
},
{
"name": "farm",
"type": {
"array": [
"u64",
2
]
}
},
{
"name": "configured",
"type": "u8"
},
{
"name": "configuredAlignment",
"type": {
"array": [
"u8",
7
]
}
},
{
"name": "pendingFees",
"type": "u64"
},
{
"name": "totalDepositedBalanceCap",
"type": "u64"
},
{
"name": "realizedYield",
"type": {
"defined": "RealizedYield"
}
},
{
"name": "buffer",
"type": {
"array": [
"u64",
4
]
}
}
]
}
},
{
"name": "InitFeeArgsV1",
"type": {
"kind": "struct",
"fields": [
{
"name": "feeMultiplier",
"type": "u64"
},
{
"name": "controllerFee",
"type": "u64"
},
{
"name": "platformFee",
"type": "u64"
},
{
"name": "withdrawFee",
"type": "u64"
},
{
"name": "depositFee",
"type": "u64"
},
{
"name": "feeWallet",
"type": "publicKey"
}
]
}
},
{
"name": "ModifyWhiteListArgs",
"type": {
"kind": "struct",
"fields": [
{
"name": "role",
"type": "u8"
},
{
"name": "action",
"type": "u8"
},
{
"name": "modifySpecialDepositorSet",
"type": "bool"
}
]
}
},
{
"name": "MultiDepositRebalanceWorkloopArgs",
"type": {
"kind": "struct",
"fields": [
{
"name": "calldata",
"type": "bytes"
}
]
}
},
{
"name": "AddLendingPlatformArgs",
"type": {
"kind": "struct",
"fields": [
{
"name": "programType",
"type": "u64"
},
{
"name": "oracleKeys",
"type": {
"vec": "publicKey"
}
},
{
"name": "oraclePrograms",
"type": {
"vec": "publicKey"
}
}
]
}
},
{
"name": "ConfigureMultiDepositOptimizerArgs",
"type": {
"kind": "struct",
"fields": [
{
"name": "vaults",
"type": {
"vec": {
"defined": "StandaloneVaultArgs"
}
}
},
{
"name": "startingTargetVault",
"type": "publicKey"
}
]
}
},
{
"name": "StandaloneVaultArgs",
"type": {
"kind": "struct",
"fields": [
{
"name": "vaultAddress",
"type": "publicKey"
},
{
"name": "programType",
"type": "u64"
},
{
"name": "programAddress",
"type": "publicKey"
},
{
"name": "sharesMint",
"type": "publicKey"
}
]
}
},
{
"name": "StartMultiDepositRebalanceArgs",
"type": {
"kind": "struct",
"fields": [
{
"name": "removeAmount",
"type": "u64"
}
]
}
},
{
"name": "OrcaAddLiqIssueSharesArgs",
"type": {
"kind": "struct",
"fields": [
{
"name": "tokenAmountA",
"type": "u64"
},
{
"name": "tokenAmountB",
"type": "u64"
},
{
"name": "farmType",
"type": {
"array": [
"u64",
2
]
}
}
]
}
},
{
"name": "WithdrawOrcaVaultArgs",
"type": {
"kind": "struct",
"fields": [
{
"name": "doubleDip",
"type": "bool"
},
{
"name": "amount",
"type": "u64"
}
]
}
},
{
"name": "UpdateDepositCapArgs",
"type": {
"kind": "struct",
"fields": [
{
"name": "farmType",
"type": {
"array": [
"u64",
2
]
}
},
{
"name": "newCap",
"type": "u64"
}
]
}
},
{
"name": "UpdateVaultFeesArgs",
"type": {
"kind": "struct",
"fields": [
{
"name": "farmType",
"type": {
"array": [
"u64",
2
]
}
},
{
"name": "feeMultiplier",
"type": "u64"
},
{
"name": "controllerFee",
"type": "u64"
},
{
"name": "platformFee",
"type": "u64"
},
{
"name": "withdrawFee",
"type": "u64"
},
{
"name": "depositFee",
"type": "u64"
}
]
}
},
{
"name": "OrcaSwapArgs",
"type": {
"kind": "struct",
"fields": [
{
"name": "transferInAmount",
"type": "u64"
},
{
"name": "transferIn",
"type": "bool"
},
{
"name": "fullAmount",
"type": "bool"
},
{
"name": "checkSwapSkip",
"type": "bool"
},
{
"name": "doubleDip",
"type": "bool"
},
{
"name": "quarry",
"type": "bool"
},
{
"name": "bypassSafetyChecks",
"type": "bool"
}
]
}
},
{
"name": "NewSerumSwapArgs",
"type": {
"kind": "struct",
"fields": [
{
"name": "farmType",
"type": {
"array": [
"u64",
2
]
}
},
{
"name": "amount",
"type": "u64"
},
{
"name": "side",
"type": "u64"
},
{
"name": "checkSerumSwapSkip",
"type": "bool"
},
{
"name": "fullAmount",
"type": "bool"
}
]
}
},
{
"name": "NewVaultArgs",
"type": {
"kind": "struct",
"fields": [
{
"name": "farmType",
"type": {
"array": [
"u64",
2
]
}
},
{
"name": "compoundInterval",
"type": "i64"
},
{
"name": "tag",
"type": {
"array": [
"u8",
32
]
}
},
{
"name": "feeArgs",
"type": {
"defined": "InitFeeArgsV1"
}
}
]
}
},
{
"name": "ManageVaultPausableArgs",
"type": {
"kind": "struct",
"fields": [
{
"name": "pause",
"type": "bool"
},
{
"name": "action",
"type": "u8"
},
{
"name": "farmType",
"type": {
"array": [
"u64",
2
]
}
}
]
}
},
{
"name": "NewRaydiumSwapArgs",
"type": {
"kind": "struct",
"fields": [
{
"name": "farmType",
"type": {
"array": [
"u64",
2
]
}
},
{
"name": "aToB",
"type": "bool"
},
{
"name": "checkSwapSkip",
"type": "bool"
},
{
"name": "fullAmount",
"type": "bool"
}
]
}
},
{
"name": "ConfigureArgs",
"type": {
"kind": "struct",
"fields": [
{
"name": "farmType",
"type": {
"array": [
"u64",
2
]
}
},
{
"name": "swapMarkets",
"type": {
"vec": "publicKey"
}
}
]
}
},
{
"name": "ConfigureQuarryArgs",
"type": {
"kind": "struct",
"fields": [
{
"name": "common",
"type": {
"defined": "ConfigureArgs"
}
},
{
"name": "variant",
"type": "u64"
},
{
"name": "requiresConfigDataAccount",
"type": "bool"
}
]
}
},
{
"name": "UpdateArgs",
"type": {
"kind": "struct",
"fields": [
{
"name": "field",
"type": "string"
},
{
"name": "values",
"type": {
"vec": "string"
}
}
]
}
},
{
"name": "SharesArgs",
"type": {
"kind": "struct",
"fields": [
{
"name": "farmType",
"type": {
"array": [
"u64",
2
]
}
},
{
"name": "amount",
"type": "u64"
}
]
}
},
{
"name": "StrategyExecutionArgs",
"type": {
"kind": "struct",
"fields": [
{
"name": "strategyType",
"type": "u64"
},
{
"name": "finalize",
"type": "u8"
}
]
}
},
{
"name": "Atrix",
"type": {
"kind": "enum",
"variants": [
{
"name": "SOLUSDC"
},
{
"name": "GMTUSDC"
},
{
"name": "mSOLUSDC"
},
{
"name": "BTCUSDC"
},
{
"name": "USDrUSDC"
},
{
"name": "PLACEHOLDER_E"
},
{
"name": "PLACEHOLDER_F"
},
{
"name": "PLACEHOLDER_G"
},
{
"name": "PLACEHOLDER_H"
},
{
"name": "PLACEHOLDER_I"
},
{
"name": "PLACEHOLDER_J"
},
{
"name": "PLACEHOLDER_K"
},
{
"name": "PLACEHOLDER_L"
},
{
"name": "PLACEHOLDER_M"
},
{
"name": "PLACEHOLDER_N"
},
{
"name": "PLACEHOLDER_O"
},
{
"name": "PLACEHOLDER_P"
},
{
"name": "PLACEHOLDER_Q"
},
{
"name": "PLACEHOLDER_R"
},
{
"name": "PLACEHOLDER_S"
},
{
"name": "PLACEHOLDER_T"
},
{
"name": "PLACEHOLDER_U"
},
{
"name": "PLACEHOLDER_V"
},
{
"name": "PLACEHOLDER_W"
},
{
"name": "PLACEHOLDER_X"
},
{
"name": "PLACEHOLDER_Y"
},
{
"name": "PLACEHOLDER_Z"
},
{
"name": "UNKNOWN"
}
]
}
},
{
"name": "Lending",
"type": {
"kind": "enum",
"variants": [
{
"name": "TULIP"
},
{
"name": "SOLEND"
},
{
"name": "MANGO"
},
{
"name": "PORT"
},
{
"name": "LARIX"
},
{
"name": "PARROT"
},
{
"name": "USDC"
},
{
"name": "MULTI_DEPOSIT"
},
{
"name": "RAY"
},
{
"name": "USDT"
},
{
"name": "SOL"
},
{
"name": "PLACEHOLDER_E"
},
{
"name": "PLACEHOLDER_F"
},
{
"name": "PLACEHOLDER_G"
},
{
"name": "PLACEHOLDER_H"
},
{
"name": "PLACEHOLDER_I"
},
{
"name": "PLACEHOLDER_J"
},
{
"name": "PLACEHOLDER_K"
},
{
"name": "PLACEHOLDER_L"
},
{
"name": "PLACEHOLDER_M"
},
{
"name": "PLACEHOLDER_N"
},
{
"name": "PLACEHOLDER_O"
},
{
"name": "PLACEHOLDER_P"
},
{
"name": "PLACEHOLDER_Q"
},
{
"name": "PLACEHOLDER_R"
},
{
"name": "PLACEHOLDER_S"
},
{
"name": "PLACEHOLDER_T"
},
{
"name": "PLACEHOLDER_U"
},
{
"name": "PLACEHOLDER_V"
},
{
"name": "PLACEHOLDER_W"
},
{
"name": "PLACEHOLDER_X"
},
{
"name": "PLACEHOLDER_Y"
},
{
"name": "PLACEHOLDER_Z"
},
{
"name": "UNKNOWN"
}
]
}
},
{
"name": "Orca",
"type": {
"kind": "enum",
"variants": [
{
"name": "ATLASUSDC"
},
{
"name": "POLISUSDC"
},
{
"name": "ORCASOL"
},
{
"name": "USDTUSDC"
},
{
"name": "ORCAUSDC"
},
{
"name": "BASISUSDC"
},
{
"name": "SAMOUSDC"
},
{
"name": "SHDWUSDC"
},
{
"name": "SHDWSOL"
},
{
"name": "stSOLUSDC"
},
{
"name": "wUSTUSDC"
},
{
"name": "CMFIUSDC"
},
{
"name": "stSOLwUST"
},
{
"name": "sRLYSOL"
},
{
"name": "PLACEHOLDER_D"
},
{
"name": "PLACEHOLDER_E"
},
{
"name": "PLACEHOLDER_F"
},
{
"name": "PLACEHOLDER_G"
},
{
"name": "PLACEHOLDER_H"
},
{
"name": "PLACEHOLDER_I"
},
{
"name": "PLACEHOLDER_J"
},
{
"name": "PLACEHOLDER_K"
},
{
"name": "PLACEHOLDER_L"
},
{
"name": "PLACEHOLDER_M"
},
{
"name": "PLACEHOLDER_N"
},
{
"name": "PLACEHOLDER_O"
},
{
"name": "PLACEHOLDER_P"
},
{
"name": "PLACEHOLDER_Q"
},
{
"name": "PLACEHOLDER_R"
},
{
"name": "PLACEHOLDER_S"
},
{
"name": "PLACEHOLDER_T"
},
{
"name": "PLACEHOLDER_U"
},
{
"name": "PLACEHOLDER_V"
},
{
"name": "PLACEHOLDER_W"
},
{
"name": "PLACEHOLDER_X"
},
{
"name": "PLACEHOLDER_Y"
},
{
"name": "PLACEHOLDER_Z"
},
{
"name": "UNKNOWN"
}
]
}
},
{
"name": "Quarry",
"type": {
"kind": "enum",
"variants": [
{
"name": "VANILLA"
},
{
"name": "SABER"
},
{
"name": "SUNNY"
},
{
"name": "UNKNOWN"
}
]
}
},
{
"name": "Raydium",
"type": {
"kind": "enum",
"variants": [
{
"name": "ALEPHUSDC"
},
{
"name": "BOPRAY"
},
{
"name": "COPEUSDC"
},
{
"name": "LIKEUSDC"
},
{
"name": "PSYUSDC"
},
{
"name": "MERUSDC"
},
{
"name": "stSOLUSDC"
},
{
"name": "RAY"
},
{
"name": "RAYUSDT"
},
{
"name": "RAYUSDC"
},
{
"name": "RAYSRM"
},
{
"name": "RAYSOL"
},
{
"name": "RAYETH"
},
{
"name": "ROPEUSDC"
},
{
"name": "SAMORAY"
},
{
"name": "SNYUSDC"
},
{
"name": "stSOLUSDT"
},
{
"name": "TULIPUSDC"
},
{
"name": "ATLASRAY"
},
{
"name": "POLISRAY"
},
{
"name": "RAYwhETH"
},
{
"name": "PLACEHOLDER_B"
},
{
"name": "PLACEHOLDER_C"
},
{
"name": "PLACEHOLDER_D"
},
{
"name": "PLACEHOLDER_E"
},
{
"name": "PLACEHOLDER_F"
},
{
"name": "PLACEHOLDER_G"
},
{
"name": "PLACEHOLDER_H"
},
{
"name": "PLACEHOLDER_I"
},
{
"name": "PLACEHOLDER_J"
},
{
"name": "PLACEHOLDER_K"
},
{
"name": "PLACEHOLDER_L"
},
{
"name": "PLACEHOLDER_M"
},
{
"name": "PLACEHOLDER_N"
},
{
"name": "PLACEHOLDER_O"
},
{
"name": "PLACEHOLDER_P"
},
{
"name": "PLACEHOLDER_Q"
},
{
"name": "PLACEHOLDER_R"
},
{
"name": "PLACEHOLDER_S"
},
{
"name": "PLACEHOLDER_T"
},
{
"name": "PLACEHOLDER_U"
},
{
"name": "PLACEHOLDER_V"
},
{
"name": "PLACEHOLDER_W"
},
{
"name": "PLACEHOLDER_X"
},
{
"name": "PLACEHOLDER_Y"
},
{
"name": "PLACEHOLDER_Z"
},
{
"name": "UNKNOWN"
}
]
}
},
{
"name": "Unknown",
"type": {
"kind": "enum",
"variants": [
{
"name": "Uknown"
}
]
}
},
{
"name": "Farm",
"type": {
"kind": "enum",
"variants": [
{
"name": "Raydium",
"fields": [
{
"name": "name",
"type": {
"defined": "Raydium"
}
}
]
},
{
"name": "Lending",
"fields": [
{
"name": "name",
"type": {
"defined": "Lending"
}
}
]
},
{
"name": "Orca",
"fields": [
{
"name": "name",
"type": {
"defined": "Orca"
}
}
]
},
{
"name": "Quarry",
"fields": [
{
"name": "name",
"type": {
"defined": "Quarry"
}
}
]
},
{
"name": "Atrix",
"fields": [
{
"name": "name",
"type": {
"defined": "Atrix"
}
}
]
},
{
"name": "Unknown",
"fields": [
{
"name": "name",
"type": {
"defined": "Unknown"
}
}
]
}
]
}
},
{
"name": "SlippageMethod",
"type": {
"kind": "enum",
"variants": [
{
"name": "Ignore"
},
{
"name": "Percentage",
"fields": [
{
"name": "perc",
"type": "u64"
},
{
"name": "coin_amount_pre",
"type": "u64"
},
{
"name": "pc_amount_pre",
"type": "u64"
}
]
}
]
}
},
{
"name": "SettleMethod",
"type": {
"kind": "enum",
"variants": [
{
"name": "Exact"
},
{
"name": "Multiplier",
"fields": [
{
"name": "modif",
"type": "i64"
}
]
}
]
}
},
{
"name": "StrategyType",
"type": {
"kind": "enum",
"variants": [
{
"name": "BorrowLend"
}
]
}
},
{
"name": "ProgramType",
"type": {
"kind": "enum",
"variants": [
{
"name": "SplUnmodified"
},
{
"name": "SplModifiedSolend"
},
{
"name": "MangoV3"
},
{
"name": "Unknown"
}
]
}
},
{
"name": "RebalanceStates",
"type": {
"kind": "enum",
"variants": [
{
"name": "Inactive"
},
{
"name": "Started"
},
{
"name": "VaultARemoved"
},
{
"name": "VaultABRebalanced"
}
]
}
},
{
"name": "QuarryVariant",
"type": {
"kind": "enum",
"variants": [
{
"name": "Vanilla"
},
{
"name": "Saber"
},
{
"name": "Sunny"
},
{
"name": "UNKNOWN"
}
]
}
},
{
"name": "Roles",
"type": {
"kind": "enum",
"variants": [
{
"name": "COMPOUNDER"
},
{
"name": "FEE"
},
{
"name": "ADMIN"
},
{
"name": "VAULT"
},
{
"name": "SWAP"
},
{
"name": "SWEEP"
},
{
"name": "UNKNOWN"
}
]
}
},
{
"name": "AtrixAddLiquidityAction",
"type": {
"kind": "enum",
"variants": [
{
"name": "Ix1"
},
{
"name": "Deposit"
},
{
"name": "PlaceIx1"
},
{
"name": "PlaceIx2"
},
{
"name": "All"
},
{
"name": "UNKNOWN"
}
]
}
},
{
"name": "Side",
"type": {
"kind": "enum",
"variants": [
{
"name": "Bid"
},
{
"name": "Ask"
}
]
}
},
{
"name": "ModifyWhiteListAction",
"type": {
"kind": "enum",
"variants": [
{
"name": "Add"
},
{
"name": "Remove"
},
{
"name": "Revoke"
},
{
"name": "Unknown"
}
]
}
}
],
"errors": [
{
"code": 6000,
"name": "Unauthorized",
"msg": "unauthorized account"
},
{
"code": 6001,
"name": "InsufficientWhitelistSpace",
"msg": "insufficient whitelist space"
}
]
}
{
"version": "0.1.0",
"name": "whirlpool",
"instructions": [
{
"name": "initializeConfig",
"accounts": [
{
"name": "config",
"isMut": true,
"isSigner": true
},
{
"name": "funder",
"isMut": true,
"isSigner": true
},
{
"name": "systemProgram",
"isMut": false,
"isSigner": false
}
],
"args": [
{
"name": "feeAuthority",
"type": "publicKey"
},
{
"name": "collectProtocolFeesAuthority",
"type": "publicKey"
},
{
"name": "rewardEmissionsSuperAuthority",
"type": "publicKey"
},
{
"name": "defaultProtocolFeeRate",
"type": "u16"
}
]
},
{
"name": "initializePool",
"accounts": [
{
"name": "whirlpoolsConfig",
"isMut": false,
"isSigner": false
},
{
"name": "tokenMintA",
"isMut": false,
"isSigner": false
},
{
"name": "tokenMintB",
"isMut": false,
"isSigner": false
},
{
"name": "funder",
"isMut": true,
"isSigner": true
},
{
"name": "whirlpool",
"isMut": true,
"isSigner": false
},
{
"name": "tokenVaultA",
"isMut": true,
"isSigner": true
},
{
"name": "tokenVaultB",
"isMut": true,
"isSigner": true
},
{
"name": "feeTier",
"isMut": false,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
},
{
"name": "systemProgram",
"isMut": false,
"isSigner": false
},
{
"name": "rent",
"isMut": false,
"isSigner": false
}
],
"args": [
{
"name": "bumps",
"type": {
"defined": "WhirlpoolBumps"
}
},
{
"name": "tickSpacing",
"type": "u16"
},
{
"name": "initialSqrtPrice",
"type": "u128"
}
]
},
{
"name": "initializeTickArray",
"accounts": [
{
"name": "whirlpool",
"isMut": false,
"isSigner": false
},
{
"name": "funder",
"isMut": true,
"isSigner": true
},
{
"name": "tickArray",
"isMut": true,
"isSigner": false
},
{
"name": "systemProgram",
"isMut": false,
"isSigner": false
}
],
"args": [
{
"name": "startTickIndex",
"type": "i32"
}
]
},
{
"name": "initializeFeeTier",
"accounts": [
{
"name": "config",
"isMut": false,
"isSigner": false
},
{
"name": "feeTier",
"isMut": true,
"isSigner": false
},
{
"name": "funder",
"isMut": true,
"isSigner": true
},
{
"name": "feeAuthority",
"isMut": false,
"isSigner": true
},
{
"name": "systemProgram",
"isMut": false,
"isSigner": false
}
],
"args": [
{
"name": "tickSpacing",
"type": "u16"
},
{
"name": "defaultFeeRate",
"type": "u16"
}
]
},
{
"name": "initializeReward",
"accounts": [
{
"name": "rewardAuthority",
"isMut": false,
"isSigner": true
},
{
"name": "funder",
"isMut": true,
"isSigner": true
},
{
"name": "whirlpool",
"isMut": true,
"isSigner": false
},
{
"name": "rewardMint",
"isMut": false,
"isSigner": false
},
{
"name": "rewardVault",
"isMut": true,
"isSigner": true
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
},
{
"name": "systemProgram",
"isMut": false,
"isSigner": false
},
{
"name": "rent",
"isMut": false,
"isSigner": false
}
],
"args": [
{
"name": "rewardIndex",
"type": "u8"
}
]
},
{
"name": "setRewardEmissions",
"accounts": [
{
"name": "whirlpool",
"isMut": true,
"isSigner": false
},
{
"name": "rewardAuthority",
"isMut": false,
"isSigner": true
},
{
"name": "rewardVault",
"isMut": false,
"isSigner": false
}
],
"args": [
{
"name": "rewardIndex",
"type": "u8"
},
{
"name": "emissionsPerSecondX64",
"type": "u128"
}
]
},
{
"name": "openPosition",
"accounts": [
{
"name": "funder",
"isMut": true,
"isSigner": true
},
{
"name": "owner",
"isMut": false,
"isSigner": false
},
{
"name": "position",
"isMut": true,
"isSigner": false
},
{
"name": "positionMint",
"isMut": true,
"isSigner": true
},
{
"name": "positionTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "whirlpool",
"isMut": false,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
},
{
"name": "systemProgram",
"isMut": false,
"isSigner": false
},
{
"name": "rent",
"isMut": false,
"isSigner": false
},
{
"name": "associatedTokenProgram",
"isMut": false,
"isSigner": false
}
],
"args": [
{
"name": "bumps",
"type": {
"defined": "OpenPositionBumps"
}
},
{
"name": "tickLowerIndex",
"type": "i32"
},
{
"name": "tickUpperIndex",
"type": "i32"
}
]
},
{
"name": "openPositionWithMetadata",
"accounts": [
{
"name": "funder",
"isMut": true,
"isSigner": true
},
{
"name": "owner",
"isMut": false,
"isSigner": false
},
{
"name": "position",
"isMut": true,
"isSigner": false
},
{
"name": "positionMint",
"isMut": true,
"isSigner": true
},
{
"name": "positionMetadataAccount",
"isMut": true,
"isSigner": false
},
{
"name": "positionTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "whirlpool",
"isMut": false,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
},
{
"name": "systemProgram",
"isMut": false,
"isSigner": false
},
{
"name": "rent",
"isMut": false,
"isSigner": false
},
{
"name": "associatedTokenProgram",
"isMut": false,
"isSigner": false
},
{
"name": "metadataProgram",
"isMut": false,
"isSigner": false
},
{
"name": "metadataUpdateAuth",
"isMut": false,
"isSigner": false
}
],
"args": [
{
"name": "bumps",
"type": {
"defined": "OpenPositionWithMetadataBumps"
}
},
{
"name": "tickLowerIndex",
"type": "i32"
},
{
"name": "tickUpperIndex",
"type": "i32"
}
]
},
{
"name": "increaseLiquidity",
"accounts": [
{
"name": "whirlpool",
"isMut": true,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
},
{
"name": "positionAuthority",
"isMut": false,
"isSigner": true
},
{
"name": "position",
"isMut": true,
"isSigner": false
},
{
"name": "positionTokenAccount",
"isMut": false,
"isSigner": false
},
{
"name": "tokenOwnerAccountA",
"isMut": true,
"isSigner": false
},
{
"name": "tokenOwnerAccountB",
"isMut": true,
"isSigner": false
},
{
"name": "tokenVaultA",
"isMut": true,
"isSigner": false
},
{
"name": "tokenVaultB",
"isMut": true,
"isSigner": false
},
{
"name": "tickArrayLower",
"isMut": true,
"isSigner": false
},
{
"name": "tickArrayUpper",
"isMut": true,
"isSigner": false
}
],
"args": [
{
"name": "liquidityAmount",
"type": "u128"
},
{
"name": "tokenMaxA",
"type": "u64"
},
{
"name": "tokenMaxB",
"type": "u64"
}
]
},
{
"name": "decreaseLiquidity",
"accounts": [
{
"name": "whirlpool",
"isMut": true,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
},
{
"name": "positionAuthority",
"isMut": false,
"isSigner": true
},
{
"name": "position",
"isMut": true,
"isSigner": false
},
{
"name": "positionTokenAccount",
"isMut": false,
"isSigner": false
},
{
"name": "tokenOwnerAccountA",
"isMut": true,
"isSigner": false
},
{
"name": "tokenOwnerAccountB",
"isMut": true,
"isSigner": false
},
{
"name": "tokenVaultA",
"isMut": true,
"isSigner": false
},
{
"name": "tokenVaultB",
"isMut": true,
"isSigner": false
},
{
"name": "tickArrayLower",
"isMut": true,
"isSigner": false
},
{
"name": "tickArrayUpper",
"isMut": true,
"isSigner": false
}
],
"args": [
{
"name": "liquidityAmount",
"type": "u128"
},
{
"name": "tokenMinA",
"type": "u64"
},
{
"name": "tokenMinB",
"type": "u64"
}
]
},
{
"name": "updateFeesAndRewards",
"accounts": [
{
"name": "whirlpool",
"isMut": true,
"isSigner": false
},
{
"name": "position",
"isMut": true,
"isSigner": false
},
{
"name": "tickArrayLower",
"isMut": false,
"isSigner": false
},
{
"name": "tickArrayUpper",
"isMut": false,
"isSigner": false
}
],
"args": []
},
{
"name": "collectFees",
"accounts": [
{
"name": "whirlpool",
"isMut": false,
"isSigner": false
},
{
"name": "positionAuthority",
"isMut": false,
"isSigner": true
},
{
"name": "position",
"isMut": true,
"isSigner": false
},
{
"name": "positionTokenAccount",
"isMut": false,
"isSigner": false
},
{
"name": "tokenOwnerAccountA",
"isMut": true,
"isSigner": false
},
{
"name": "tokenVaultA",
"isMut": true,
"isSigner": false
},
{
"name": "tokenOwnerAccountB",
"isMut": true,
"isSigner": false
},
{
"name": "tokenVaultB",
"isMut": true,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
}
],
"args": []
},
{
"name": "collectReward",
"accounts": [
{
"name": "whirlpool",
"isMut": false,
"isSigner": false
},
{
"name": "positionAuthority",
"isMut": false,
"isSigner": true
},
{
"name": "position",
"isMut": true,
"isSigner": false
},
{
"name": "positionTokenAccount",
"isMut": false,
"isSigner": false
},
{
"name": "rewardOwnerAccount",
"isMut": true,
"isSigner": false
},
{
"name": "rewardVault",
"isMut": true,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
}
],
"args": [
{
"name": "rewardIndex",
"type": "u8"
}
]
},
{
"name": "collectProtocolFees",
"accounts": [
{
"name": "whirlpoolsConfig",
"isMut": false,
"isSigner": false
},
{
"name": "whirlpool",
"isMut": true,
"isSigner": false
},
{
"name": "collectProtocolFeesAuthority",
"isMut": false,
"isSigner": true
},
{
"name": "tokenVaultA",
"isMut": true,
"isSigner": false
},
{
"name": "tokenVaultB",
"isMut": true,
"isSigner": false
},
{
"name": "tokenDestinationA",
"isMut": true,
"isSigner": false
},
{
"name": "tokenDestinationB",
"isMut": true,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
}
],
"args": []
},
{
"name": "swap",
"accounts": [
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
},
{
"name": "tokenAuthority",
"isMut": false,
"isSigner": true
},
{
"name": "whirlpool",
"isMut": true,
"isSigner": false
},
{
"name": "tokenOwnerAccountA",
"isMut": true,
"isSigner": false
},
{
"name": "tokenVaultA",
"isMut": true,
"isSigner": false
},
{
"name": "tokenOwnerAccountB",
"isMut": true,
"isSigner": false
},
{
"name": "tokenVaultB",
"isMut": true,
"isSigner": false
},
{
"name": "tickArray0",
"isMut": true,
"isSigner": false
},
{
"name": "tickArray1",
"isMut": true,
"isSigner": false
},
{
"name": "tickArray2",
"isMut": true,
"isSigner": false
},
{
"name": "oracle",
"isMut": false,
"isSigner": false
}
],
"args": [
{
"name": "amount",
"type": "u64"
},
{
"name": "otherAmountThreshold",
"type": "u64"
},
{
"name": "sqrtPriceLimit",
"type": "u128"
},
{
"name": "amountSpecifiedIsInput",
"type": "bool"
},
{
"name": "aToB",
"type": "bool"
}
]
},
{
"name": "closePosition",
"accounts": [
{
"name": "positionAuthority",
"isMut": false,
"isSigner": true
},
{
"name": "receiver",
"isMut": true,
"isSigner": false
},
{
"name": "position",
"isMut": true,
"isSigner": false
},
{
"name": "positionMint",
"isMut": true,
"isSigner": false
},
{
"name": "positionTokenAccount",
"isMut": true,
"isSigner": false
},
{
"name": "tokenProgram",
"isMut": false,
"isSigner": false
}
],
"args": []
},
{
"name": "setDefaultFeeRate",
"accounts": [
{
"name": "whirlpoolsConfig",
"isMut": false,
"isSigner": false
},
{
"name": "feeTier",
"isMut": true,
"isSigner": false
},
{
"name": "feeAuthority",
"isMut": false,
"isSigner": true
}
],
"args": [
{
"name": "defaultFeeRate",
"type": "u16"
}
]
},
{
"name": "setDefaultProtocolFeeRate",
"accounts": [
{
"name": "whirlpoolsConfig",
"isMut": true,
"isSigner": false
},
{
"name": "feeAuthority",
"isMut": false,
"isSigner": true
}
],
"args": [
{
"name": "defaultProtocolFeeRate",
"type": "u16"
}
]
},
{
"name": "setFeeRate",
"accounts": [
{
"name": "whirlpoolsConfig",
"isMut": false,
"isSigner": false
},
{
"name": "whirlpool",
"isMut": true,
"isSigner": false
},
{
"name": "feeAuthority",
"isMut": false,
"isSigner": true
}
],
"args": [
{
"name": "feeRate",
"type": "u16"
}
]
},
{
"name": "setProtocolFeeRate",
"accounts": [
{
"name": "whirlpoolsConfig",
"isMut": false,
"isSigner": false
},
{
"name": "whirlpool",
"isMut": true,
"isSigner": false
},
{
"name": "feeAuthority",
"isMut": false,
"isSigner": true
}
],
"args": [
{
"name": "protocolFeeRate",
"type": "u16"
}
]
},
{
"name": "setFeeAuthority",
"accounts": [
{
"name": "whirlpoolsConfig",
"isMut": true,
"isSigner": false
},
{
"name": "feeAuthority",
"isMut": false,
"isSigner": true
},
{
"name": "newFeeAuthority",
"isMut": false,
"isSigner": false
}
],
"args": []
},
{
"name": "setCollectProtocolFeesAuthority",
"accounts": [
{
"name": "whirlpoolsConfig",
"isMut": true,
"isSigner": false
},
{
"name": "collectProtocolFeesAuthority",
"isMut": false,
"isSigner": true
},
{
"name": "newCollectProtocolFeesAuthority",
"isMut": false,
"isSigner": false
}
],
"args": []
},
{
"name": "setRewardAuthority",
"accounts": [
{
"name": "whirlpool",
"isMut": true,
"isSigner": false
},
{
"name": "rewardAuthority",
"isMut": false,
"isSigner": true
},
{
"name": "newRewardAuthority",
"isMut": false,
"isSigner": false
}
],
"args": [
{
"name": "rewardIndex",
"type": "u8"
}
]
},
{
"name": "setRewardAuthorityBySuperAuthority",
"accounts": [
{
"name": "whirlpoolsConfig",
"isMut": false,
"isSigner": false
},
{
"name": "whirlpool",
"isMut": true,
"isSigner": false
},
{
"name": "rewardEmissionsSuperAuthority",
"isMut": false,
"isSigner": true
},
{
"name": "newRewardAuthority",
"isMut": false,
"isSigner": false
}
],
"args": [
{
"name": "rewardIndex",
"type": "u8"
}
]
},
{
"name": "setRewardEmissionsSuperAuthority",
"accounts": [
{
"name": "whirlpoolsConfig",
"isMut": true,
"isSigner": false
},
{
"name": "rewardEmissionsSuperAuthority",
"isMut": false,
"isSigner": true
},
{
"name": "newRewardEmissionsSuperAuthority",
"isMut": false,
"isSigner": false
}
],
"args": []
}
],
"accounts": [
{
"name": "WhirlpoolsConfig",
"type": {
"kind": "struct",
"fields": [
{
"name": "feeAuthority",
"type": "publicKey"
},
{
"name": "collectProtocolFeesAuthority",
"type": "publicKey"
},
{
"name": "rewardEmissionsSuperAuthority",
"type": "publicKey"
},
{
"name": "defaultProtocolFeeRate",
"type": "u16"
}
]
}
},
{
"name": "FeeTier",
"type": {
"kind": "struct",
"fields": [
{
"name": "whirlpoolsConfig",
"type": "publicKey"
},
{
"name": "tickSpacing",
"type": "u16"
},
{
"name": "defaultFeeRate",
"type": "u16"
}
]
}
},
{
"name": "Position",
"type": {
"kind": "struct",
"fields": [
{
"name": "whirlpool",
"type": "publicKey"
},
{
"name": "positionMint",
"type": "publicKey"
},
{
"name": "liquidity",
"type": "u128"
},
{
"name": "tickLowerIndex",
"type": "i32"
},
{
"name": "tickUpperIndex",
"type": "i32"
},
{
"name": "feeGrowthCheckpointA",
"type": "u128"
},
{
"name": "feeOwedA",
"type": "u64"
},
{
"name": "feeGrowthCheckpointB",
"type": "u128"
},
{
"name": "feeOwedB",
"type": "u64"
},
{
"name": "rewardInfos",
"type": {
"array": [
{
"defined": "PositionRewardInfo"
},
3
]
}
}
]
}
},
{
"name": "TickArray",
"type": {
"kind": "struct",
"fields": [
{
"name": "startTickIndex",
"type": "i32"
},
{
"name": "ticks",
"type": {
"array": [
{
"defined": "Tick"
},
88
]
}
},
{
"name": "whirlpool",
"type": "publicKey"
}
]
}
},
{
"name": "Whirlpool",
"type": {
"kind": "struct",
"fields": [
{
"name": "whirlpoolsConfig",
"type": "publicKey"
},
{
"name": "whirlpoolBump",
"type": {
"array": [
"u8",
1
]
}
},
{
"name": "tickSpacing",
"type": "u16"
},
{
"name": "tickSpacingSeed",
"type": {
"array": [
"u8",
2
]
}
},
{
"name": "feeRate",
"type": "u16"
},
{
"name": "protocolFeeRate",
"type": "u16"
},
{
"name": "liquidity",
"type": "u128"
},
{
"name": "sqrtPrice",
"type": "u128"
},
{
"name": "tickCurrentIndex",
"type": "i32"
},
{
"name": "protocolFeeOwedA",
"type": "u64"
},
{
"name": "protocolFeeOwedB",
"type": "u64"
},
{
"name": "tokenMintA",
"type": "publicKey"
},
{
"name": "tokenVaultA",
"type": "publicKey"
},
{
"name": "feeGrowthGlobalA",
"type": "u128"
},
{
"name": "tokenMintB",
"type": "publicKey"
},
{
"name": "tokenVaultB",
"type": "publicKey"
},
{
"name": "feeGrowthGlobalB",
"type": "u128"
},
{
"name": "rewardLastUpdatedTimestamp",
"type": "u64"
},
{
"name": "rewardInfos",
"type": {
"array": [
{
"defined": "WhirlpoolRewardInfo"
},
3
]
}
}
]
}
}
],
"types": [
{
"name": "OpenPositionBumps",
"type": {
"kind": "struct",
"fields": [
{
"name": "positionBump",
"type": "u8"
}
]
}
},
{
"name": "OpenPositionWithMetadataBumps",
"type": {
"kind": "struct",
"fields": [
{
"name": "positionBump",
"type": "u8"
},
{
"name": "metadataBump",
"type": "u8"
}
]
}
},
{
"name": "PositionRewardInfo",
"type": {
"kind": "struct",
"fields": [
{
"name": "growthInsideCheckpoint",
"type": "u128"
},
{
"name": "amountOwed",
"type": "u64"
}
]
}
},
{
"name": "Tick",
"type": {
"kind": "struct",
"fields": [
{
"name": "initialized",
"type": "bool"
},
{
"name": "liquidityNet",
"type": "i128"
},
{
"name": "liquidityGross",
"type": "u128"
},
{
"name": "feeGrowthOutsideA",
"type": "u128"
},
{
"name": "feeGrowthOutsideB",
"type": "u128"
},
{
"name": "rewardGrowthsOutside",
"type": {
"array": [
"u128",
3
]
}
}
]
}
},
{
"name": "WhirlpoolRewardInfo",
"type": {
"kind": "struct",
"fields": [
{
"name": "mint",
"type": "publicKey"
},
{
"name": "vault",
"type": "publicKey"
},
{
"name": "authority",
"type": "publicKey"
},
{
"name": "emissionsPerSecondX64",
"type": "u128"
},
{
"name": "growthGlobalX64",
"type": "u128"
}
]
}
},
{
"name": "WhirlpoolBumps",
"type": {
"kind": "struct",
"fields": [
{
"name": "whirlpoolBump",
"type": "u8"
}
]
}
},
{
"name": "CurrIndex",
"type": {
"kind": "enum",
"variants": [
{
"name": "Below"
},
{
"name": "Inside"
},
{
"name": "Above"
}
]
}
},
{
"name": "TickLabel",
"type": {
"kind": "enum",
"variants": [
{
"name": "Upper"
},
{
"name": "Lower"
}
]
}
},
{
"name": "Direction",
"type": {
"kind": "enum",
"variants": [
{
"name": "Left"
},
{
"name": "Right"
}
]
}
}
],
"errors": [
{
"code": 6000,
"name": "InvalidEnum",
"msg": "Enum value could not be converted"
},
{
"code": 6001,
"name": "InvalidStartTick",
"msg": "Invalid start tick index provided."
},
{
"code": 6002,
"name": "TickArrayExistInPool",
"msg": "Tick-array already exists in this whirlpool"
},
{
"code": 6003,
"name": "TickArrayIndexOutofBounds",
"msg": "Attempt to search for a tick-array failed"
},
{
"code": 6004,
"name": "InvalidTickSpacing",
"msg": "Tick-spacing is not supported"
},
{
"code": 6005,
"name": "ClosePositionNotEmpty",
"msg": "Position is not empty It cannot be closed"
},
{
"code": 6006,
"name": "DivideByZero",
"msg": "Unable to divide by zero"
},
{
"code": 6007,
"name": "NumberCastError",
"msg": "Unable to cast number into BigInt"
},
{
"code": 6008,
"name": "NumberDownCastError",
"msg": "Unable to down cast number"
},
{
"code": 6009,
"name": "TickNotFound",
"msg": "Tick not found within tick array"
},
{
"code": 6010,
"name": "InvalidTickIndex",
"msg": "Provided tick index is either out of bounds or uninitializable"
},
{
"code": 6011,
"name": "SqrtPriceOutOfBounds",
"msg": "Provided sqrt price out of bounds"
},
{
"code": 6012,
"name": "LiquidityZero",
"msg": "Liquidity amount must be greater than zero"
},
{
"code": 6013,
"name": "LiquidityTooHigh",
"msg": "Liquidity amount must be less than i64::MAX"
},
{
"code": 6014,
"name": "LiquidityOverflow",
"msg": "Liquidity overflow"
},
{
"code": 6015,
"name": "LiquidityUnderflow",
"msg": "Liquidity underflow"
},
{
"code": 6016,
"name": "LiquidityNetError",
"msg": "Tick liquidity net underflowed or overflowed"
},
{
"code": 6017,
"name": "TokenMaxExceeded",
"msg": "Exceeded token max"
},
{
"code": 6018,
"name": "TokenMinSubceeded",
"msg": "Did not meet token min"
},
{
"code": 6019,
"name": "MissingOrInvalidDelegate",
"msg": "Position token account has a missing or invalid delegate"
},
{
"code": 6020,
"name": "InvalidPositionTokenAmount",
"msg": "Position token amount must be 1"
},
{
"code": 6021,
"name": "InvalidTimestampConversion",
"msg": "Timestamp should be convertible from i64 to u64"
},
{
"code": 6022,
"name": "InvalidTimestamp",
"msg": "Timestamp should be greater than the last updated timestamp"
},
{
"code": 6023,
"name": "InvalidTickArraySequence",
"msg": "Invalid tick array sequence provided for instruction."
},
{
"code": 6024,
"name": "InvalidTokenMintOrder",
"msg": "Token Mint in wrong order"
},
{
"code": 6025,
"name": "RewardNotInitialized",
"msg": "Reward not initialized"
},
{
"code": 6026,
"name": "InvalidRewardIndex",
"msg": "Invalid reward index"
},
{
"code": 6027,
"name": "RewardVaultAmountInsufficient",
"msg": "Reward vault requires amount to support emissions for at least one day"
},
{
"code": 6028,
"name": "FeeRateMaxExceeded",
"msg": "Exceeded max fee rate"
},
{
"code": 6029,
"name": "ProtocolFeeRateMaxExceeded",
"msg": "Exceeded max protocol fee rate"
},
{
"code": 6030,
"name": "MultiplicationShiftRightOverflow",
"msg": "Multiplication with shift right overflow"
},
{
"code": 6031,
"name": "MulDivOverflow",
"msg": "Muldiv overflow"
},
{
"code": 6032,
"name": "MulDivInvalidInput",
"msg": "Invalid div_u256 input"
},
{
"code": 6033,
"name": "MultiplicationOverflow",
"msg": "Multiplication overflow"
},
{
"code": 6034,
"name": "InvalidSqrtPriceLimitDirection",
"msg": "Provided SqrtPriceLimit not in the same direction as the swap."
},
{
"code": 6035,
"name": "ZeroTradableAmount",
"msg": "There are no tradable amount to swap."
},
{
"code": 6036,
"name": "AmountOutBelowMinimum",
"msg": "Amount out below minimum threshold"
},
{
"code": 6037,
"name": "AmountInAboveMaximum",
"msg": "Amount in above maximum threshold"
},
{
"code": 6038,
"name": "TickArraySequenceInvalidIndex",
"msg": "Invalid index for tick array sequence"
},
{
"code": 6039,
"name": "AmountCalcOverflow",
"msg": "Amount calculated overflows"
},
{
"code": 6040,
"name": "AmountRemainingOverflow",
"msg": "Amount remaining overflows"
}
]
}
#!/usr/bin/env python3
import fileinput
import re
import os
import pandas as pd
import solana.rpc.api
import time
RE_SOL_ADDRESS = re.compile(r'[123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{32,44}')
OWNER_TO_TYPE = {
'NativeLoader1111111111111111111111111111111': 'builtin',
'Stake11111111111111111111111111111111111111': 'stake',
}
def input_y_n(prompt):
answer = input(prompt + " [y/n] ")
return answer.strip().lower() == 'y'
def main():
sol = solana.rpc.api.Client("https://api.mainnet-beta.solana.com")
accounts = pd.read_csv("accounts.csv")
known_keys = set(accounts["pubkey"])
new = {
'pubkey': [],
'type': [],
'description': [],
'own': [],
}
try:
for line in fileinput.input():
for match in RE_SOL_ADDRESS.finditer(line):
sol_address = match.group(0)
if sol_address in known_keys:
continue
print(sol_address, line.strip())
sol_acc = sol.get_account_info(sol_address)['result']
typ = None
if sol_acc['value'] is not None:
time.sleep(0.3)
continue
print(dict(sol_acc['value'], data="..."))
typ = OWNER_TO_TYPE.get(sol_acc['value']['owner'])
if sol_acc['value']['executable']:
typ = 'program'
desc = input("description? ").strip()
if not desc:
continue
if typ is None:
typ = input("type? ").strip()
own = typ not in {"builtin"} and input_y_n("own?")
new['pubkey'].append(sol_address)
new['type'].append(typ)
new['description'].append(desc)
new['own'].append(own)
finally:
new['own'] = pd.Series(new['own'], dtype=bool)
accounts = pd.concat([accounts, pd.DataFrame(new)])
os.rename("accounts.csv", ".accounts.csv.bak")
accounts.to_csv("accounts.csv", index=False)
if __name__ == '__main__':
main()
#!/usr/bin/env python3
import solana.publickey
import constants
import struct
import json
import os
from anchorpy_idl import Idl, InstructionCoder
def parse_spl_token(account_keys, accounts, data):
tag = data[0]
if tag == 0 or tag == 20:
decimals = data[1]
mint_authority = solana.publickey.PublicKey(data[2:34])
freeze_authority = solana.publickey.PublicKey(data[35:67]) if data[34] != 0 else None
return {
'instruction': 'InitializeMint',
'decimals': decimals,
'mint_authority': mint_authority,
'freeze_authority': freeze_authority,
'mint': account_keys[accounts[0]],
}
if tag == 1 or tag == 16 or tag == 18:
return {
'instruction': 'InitializeAccount',
'account': account_keys[accounts[0]],
'mint': account_keys[accounts[1]],
'owner': account_keys[accounts[2]] if tag == 1 else solana.publickey.PublicKey(data[1:]),
}
if tag == 2 or tag == 19:
first_signer_index = 2 if tag == 2 else 1
return {
'instruction': 'InitializeMultisig',
'multisig': account_keys[accounts[0]],
'm': data[1],
'signers': [account_keys[i] for i in accounts[first_signer_index:]]
}
if tag == 7 or tag == 14:
amount = struct.unpack("<Q", data[1:9])[0]
return {
'instruction': 'MintTo',
'amount': amount,
'mint': account_keys[accounts[0]],
'account': account_keys[accounts[1]],
'authority': account_keys[accounts[2]],
'decimals': None if tag == 7 else data[9],
}
if tag == 8 or tag == 15:
amount = struct.unpack("<Q", data[1:9])[0]
return {
'instruction': 'Burn',
'amount': amount,
'account': account_keys[accounts[0]],
'mint': account_keys[accounts[1]],
'authority': account_keys[accounts[2]],
'decimals': None if tag == 8 else data[9],
}
if tag == 3 or tag == 12:
amount = struct.unpack("<Q", data[1:9])[0]
mint_offset = 1 if tag != 3 else 0
return {
'instruction': 'Transfer',
'amount': amount,
'source': account_keys[accounts[0]],
'mint': account_keys[accounts[1]] if tag != 3 else None,
'destination': account_keys[accounts[mint_offset + 1]],
'authority': account_keys[accounts[mint_offset + 2]],
'decimals': None if tag == 3 else data[9],
}
if tag == 4 or tag == 13:
amount = struct.unpack("<Q", data[1:9])[0]
mint_offset = 1 if tag != 4 else 0
return {
'instruction': 'Approve',
'amount': amount,
'source': account_keys[accounts[0]],
'mint': account_keys[accounts[1]] if tag != 4 else None,
'delegate': account_keys[accounts[mint_offset + 1]],
'authority': account_keys[accounts[mint_offset + 2]],
'decimals': None if tag == 4 else data[9],
}
if tag == 5:
return {
'instruction': 'Revoke',
'source': account_keys[accounts[0]],
'authority': account_keys[accounts[1]],
}
if tag == 6:
authority_type = ['MintTokens', 'FreezeAccount', 'AccountOwner', 'CloseAccount'][data[1]]
new_authority = solana.publickey.PublicKey(data[3:35]) if data[2] != 0 else None
return {
'instruction': 'SetAuthority',
'authority_type': authority_type,
'new_authority': new_authority,
'account': account_keys[accounts[0]],
'authority': account_keys[accounts[1]],
}
if tag == 9:
return {
'instruction': 'CloseAccount',
'account': account_keys[accounts[0]],
'destination': account_keys[accounts[1]],
'authority': account_keys[accounts[2]],
}
if tag == 10:
return {
'instruction': 'FreezeAccount',
'account': account_keys[accounts[0]],
'mint': account_keys[accounts[1]],
'authority': account_keys[accounts[2]],
}
if tag == 11:
return {
'instruction': 'ThawAccount',
'account': account_keys[accounts[0]],
'mint': account_keys[accounts[1]],
'authority': account_keys[accounts[2]],
}
if tag == 17:
return {
'instruction': 'SyncNative',
'account': account_keys[accounts[0]],
}
if tag == 21:
return {
'instruction': 'GetAccountDataSize',
'mint': account_keys[accounts[0]],
}
if tag == 23:
amount = struct.unpack("<Q", data[1:9])[0]
return {
'instruction': 'AmountToUiAmount',
'mint': account_keys[accounts[0]],
'amount': amount,
}
if tag == 24:
ui_amount = data[1:].decode()
return {
'instruction': 'UiAmountToAmount',
'mint': account_keys[accounts[0]],
'ui_amount': ui_amount,
}
def parse_stake(account_keys, accounts, data):
tag = struct.unpack("<I", data[0:4])[0]
def parse_authorized(data):
return {
'staker': solana.publickey.PublicKey(data[:32]),
'withdrawer': solana.publickey.PublicKey(data[32:64])
}
def parse_lockup(data, custodian=None):
timestamp = struct.unpack("<q", data[:8])[0]
epoch = struct.unpack("<Q", data[8:16])[0]
custodian = solana.publickey.PublicKey(data[16:48]) if custodian is None and len(data) == 48 else custodian
if custodian and str(custodian) == constants.SYSTEM_PROGRAM_ID:
custodian = None
return {
'unix_timestamp': timestamp if timestamp != 0 else None,
'epoch': epoch if epoch != 0 else None,
'custodian': custodian,
}
def parse_lockup_args(data, custodian=None):
timestamp = None
epoch = None
if data[0]:
timestamp = struct.unpack("<q", data[1:9])[0]
data = data[9:]
else:
data = data[1:]
if data[0]:
epoch = struct.unpack("<Q", data[1:9])[0]
data = data[9:]
else:
data = data[1:]
if data and data[0] and not custodian:
custodian = solana.publickey.PublicKey(data[1:])
return {
'unix_timestamp': timestamp,
'epoch': epoch,
'custodian': custodian,
}
if tag == 0:
return {
'instruction': 'Initialize',
'account': account_keys[accounts[0]],
'authorized': parse_authorized(data[4:68]),
'lockup': parse_lockup(data[68:])
}
if tag == 9:
return {
'instruction': 'Initialize',
'account': account_keys[accounts[0]],
'authorized': {
'staker': account_keys[accounts[3]],
'withdrawer': account_keys[accounts[3]],
},
'lockup': {
'unix_timestamp': None,
'epoch': None,
'custodian': None,
}
}
if tag == 1 :
new_authority = solana.publickey.PublicKey(data[4:36])
kind = ['Staker', 'Withdrawer'][struct.unpack('<I', data[36:40])[0]]
return {
'instruction': 'Authorize',
'kind': kind,
'new_authority': new_authority,
'account': account_keys[accounts[0]],
'authority': account_keys[accounts[2]],
'custodian': account_keys[accounts[3]] if len(accounts) == 4 else None,
}
if tag == 10:
kind = ['Staker', 'Withdrawer'][struct.unpack('<I', data[4:8])[0]]
return {
'instruction': 'Authorize',
'kind': kind,
'account': account_keys[accounts[0]],
'authority': account_keys[accounts[2]],
'new_authority': account_keys[accounts[3]],
'custodian': account_keys[accounts[4]] if len(accounts) == 5 else None,
}
if tag == 2:
return {
'instruction': 'DelegateStake',
'account': account_keys[accounts[0]],
'vote': account_keys[accounts[1]],
'authority': account_keys[accounts[5]],
}
if tag == 3:
amount = struct.unpack("<Q", data[4:12])[0]
return {
'instruction': 'Split',
'amount': amount,
'source': account_keys[accounts[0]],
'destination': account_keys[accounts[1]],
'authority': account_keys[accounts[2]],
}
if tag == 4:
amount = struct.unpack("<Q", data[4:12])[0]
return {
'instruction': 'Withdraw',
'amount': amount,
'account': account_keys[accounts[0]],
'destination': account_keys[accounts[1]],
'authority': account_keys[accounts[4]],
'custodian': account_keys[accounts[5]] if len(accounts) == 6 else None,
}
if tag == 5:
return {
'instruction': 'Deactivate',
'account': account_keys[accounts[0]],
'authority': account_keys[accounts[2]],
}
if tag == 6:
return {
'instruction': 'SetLockup',
'account': account_keys[accounts[0]],
'signer': account_keys[accounts[1]],
'lockup': parse_lockup_args(data[4:]),
}
if tag == 12:
return {
'instruction': 'SetLockup',
'account': account_keys[accounts[0]],
'signer': account_keys[accounts[1]],
'lockup': parse_lockup_args(data[4:], custodian=account_keys[accounts[2]] if len(accounts) == 3 else None),
}
if tag == 7:
return {
'instruction': 'Merge',
'destination': account_keys[accounts[0]],
'source': account_keys[accounts[1]],
'authority': account_keys[accounts[4]],
}
if tag == 8:
return {
'instruction': 'AuthorizeWithSeed',
}
if tag == 11:
return {
'instruction': 'AuthorizeWithSeed',
}
if tag == 13:
return {
'instruction': 'GetMinimumDelegation',
}
if tag == 14:
return {
'instruction': 'DeactivateDelinquent',
'account': account_keys[accounts[0]],
'vote': account_keys[accounts[2]],
}
def parse_system(account_keys, accounts, data):
tag = struct.unpack("<I", data[0:4])[0]
if tag == 0:
amount = struct.unpack("<Q", data[4:12])[0]
space = struct.unpack("<Q", data[12:20])[0]
owner = solana.publickey.PublicKey(data[20:])
return {
'instruction': 'CreateAccount',
'amount': amount,
'space': space,
'owner': owner,
'source': account_keys[accounts[0]],
'destination': account_keys[accounts[1]],
}
if tag == 1:
owner = solana.publickey.PublicKey(data[4:])
return {
'instruction': 'Assign',
'owner': owner,
'account': account_keys[accounts[0]],
}
if tag == 2:
amount = struct.unpack("<Q", data[4:12])[0]
return {
'instruction': 'Transfer',
'amount': amount,
'source': account_keys[accounts[0]],
'destination': account_keys[accounts[1]],
}
if tag == 3:
return {
'instruction': 'CreateAccountWithSeed',
}
if tag == 4:
return {
'instruction': 'AdvanceNonceAccount',
'account': account_keys[accounts[0]],
'authority': account_keys[accounts[2]],
}
if tag == 5:
amount = struct.unpack("<Q", data[4:12])[0]
return {
'instruction': 'WithdrawNonceAccount',
'amount': amount,
'account': account_keys[accounts[0]],
'destination': account_keys[accounts[1]],
'authority': account_keys[accounts[4]],
}
if tag == 6:
authority = solana.publickey.PublicKey(data[4:])
return {
'instruction': 'InitializeNonceAccount',
'account': account_keys[accounts[0]],
'authority': authority,
}
if tag == 7:
new_authority = solana.publickey.PublicKey(data[4:])
return {
'instruction': 'AuthorizeNonceAccount',
'account': account_keys[accounts[0]],
'authority': account_keys[accounts[1]],
'new_authority': new_authority,
}
if tag == 8:
space = struct.unpack("<Q", data[4:12])[0]
return {
'instruction': 'Allocate',
'space': space,
'account': account_keys[accounts[0]],
}
if tag == 9:
return {
'instruction': 'AllocateWithSeed',
'account': account_keys[accounts[0]],
}
if tag == 10:
return {
'instruction': 'AssignWithSeed',
'account': account_keys[accounts[0]],
}
if tag == 11:
return {
'instruction': 'TransferWithSeed',
'source': account_keys[accounts[0]],
'destination': account_keys[accounts[2]],
}
if tag == 12:
return {
'instruction': 'UpgradeNonceAccount',
'account': account_keys[accounts[0]],
}
def parse_vote(account_keys, accounts, data):
tag = struct.unpack("<I", data[0:4])[0]
if tag == 3:
amount = struct.unpack("<Q", data[4:12])[0]
return {
'instruction': 'Withdraw',
'amount': amount,
'account': account_keys[accounts[0]],
'destination': account_keys[accounts[1]],
'authority': account_keys[accounts[2]],
}
raise NotImplementedError()
def parse_spl_ata(account_keys, accounts, data):
tag = 0 if not data else struct.unpack("<I", data[0:4])[0]
if tag == 0 or tag == 1:
return {
'instruction': 'Create',
'source': account_keys[accounts[0]],
'account': account_keys[accounts[1]],
'wallet': account_keys[accounts[2]],
'mint': account_keys[accounts[3]],
'idempotent': tag == 1
}
if tag == 2:
return {
'instruction': 'RecoverNested',
'nested_account': account_keys[accounts[0]],
'nested_mint': account_keys[accounts[1]],
'wallet_ata': account_keys[accounts[2]],
'owner_ata': account_keys[accounts[3]],
'owner_mint': account_keys[accounts[4]],
'wallet': account_keys[accounts[5]],
}
raise RuntimeError('unparsable ATA instruction')
def parse_loader(account_keys, accounts, data):
tag = struct.unpack("<I", data[0:4])[0]
if tag == 0:
offset = struct.unpack("<I", data[4:8])[0]
return {
'instruction': 'Write',
'account': account_keys[accounts[0]],
'offset': offset,
}
if tag == 1:
return {
'instruction': 'Finalize',
'account': account_keys[accounts[0]],
}
raise RuntimeError('unparsable loader instruction')
def parse_upgradeable_loader(account_keys, accounts, data):
tag = struct.unpack("<I", data[0:4])[0]
if tag == 0:
return {
'instruction': 'InitializeBuffer',
'account': account_keys[accounts[0]],
'authority': account_keys[accounts[1]],
}
if tag == 1:
offset = struct.unpack("<I", data[4:8])[0]
return {
'instruction': 'Write',
'account': account_keys[accounts[0]],
'authority': account_keys[accounts[1]],
'offset': offset,
}
if tag == 2:
max_data_len = struct.unpack("<Q", data[4:12])[0]
return {
'instruction': 'DeployWithMaxDataLen',
'payer': account_keys[accounts[0]],
'programdata': account_keys[accounts[1]],
'program': account_keys[accounts[2]],
'buffer': account_keys[accounts[3]],
'authority': account_keys[accounts[7]],
'max_data_len': max_data_len,
}
if tag == 3:
return {
'instruction': 'Upgrade',
'programdata': account_keys[accounts[0]],
'program': account_keys[accounts[1]],
'buffer': account_keys[accounts[2]],
'spill': account_keys[accounts[3]],
'authority': account_keys[accounts[6]],
}
if tag == 4:
return {
'instruction': 'SetAuthority',
'account': account_keys[accounts[0]],
'authority': account_keys[accounts[1]],
'new_authority': account_keys[accounts[2]] if len(accounts) == 3 else None,
}
if tag == 5:
return {
'instruction': 'Close',
'account': account_keys[accounts[0]],
'destination': account_keys[accounts[1]],
'authority': account_keys[accounts[2]],
'program': account_keys[accounts[3]] if len(accounts) == 4 else None,
}
raise RuntimeError('unparsable upgradeable loader instruction')
class AnchorIxParser():
def __init__(self, idl_path):
with open(idl_path) as f:
self.idl = Idl.from_json(json.load(f))
self.coder = InstructionCoder(self.idl)
self.ix_by_name = {}
for ix in self.idl.instructions:
if ix.name in self.ix_by_name:
raise RuntimeError('instruction defined more than once in idl: ' + ix.name)
self.ix_by_name[ix.name] = ix
def __call__(self, account_keys, accounts, data) -> dict:
parsed = self.coder.parse(data)
out = dict(parsed['data'])
if '_io' in out:
out.pop('_io')
out['instruction'] = parsed['name']
ix = self.ix_by_name[parsed['name']]
for acc, acc_idx in zip(ix.accounts, accounts):
out[acc.name] = account_keys[acc_idx]
return out
parse_jup = AnchorIxParser(os.path.dirname(__file__) + '/idl-jup.json')
#!/usr/bin/env python3
import io
import json
import re
import time
import pandas as pd
import ratelimit
import requests
from tqdm import tqdm
import solana.publickey
def slot_to_epoch(slot):
return slot // 432000
def first_epoch_slot(epoch):
return epoch * 432000
class SolRpc:
def __init__(self, url, calls=3, period=1):
self.url = url
rater = ratelimit.limits(calls=calls, period=period)
self._request_ratelimited = ratelimit.sleep_and_retry(rater(self._request))
def _request(self, method, *args):
req = {
"jsonrpc": "2.0",
"id": "1",
"method": method,
"params": list(args),
}
res = requests.post(self.url, json=req).json()
if "error" in res:
raise RuntimeError(
"Solana RPC request failed with response "
+ repr(res)
+ ". Request: "
+ repr(req)
)
return res["result"]
def __call__(self, *args, **kwargs):
return self._request_ratelimited(*args, **kwargs)
def rewards(self, pubkeys, epoch=None):
opts = {"epoch": epoch} if epoch is not None else {}
return self("getInflationReward", pubkeys, opts)
def blockTime(self, block):
return self("getBlockTime", block)
def epochInfo(self):
return self("getEpochInfo")
def epochTime(self, epoch):
first_block = self('getBlocksWithLimit', first_epoch_slot(epoch), 1)[0]
return get_block_time(self, first_block)
SCHEMA = {
"pubkey": str,
"epoch": int,
"timestamp": "datetime64[ns, UTC]",
"effective_slot": 'Int64',
"amount": int,
"post_balance": 'Int64',
"commission": 'Int64',
}
BLOCK_TIME_CACHE = {}
def get_block_time(rpc: SolRpc, slot):
if slot not in BLOCK_TIME_CACHE:
BLOCK_TIME_CACHE[slot] = rpc.blockTime(slot)
return BLOCK_TIME_CACHE[slot]
def fetch_rewards_for_epoch(rpc, fname, rewards: pd.DataFrame, epoch, all_pubkeys):
known_pks = set(rewards.loc[epoch].index) if epoch in set(rewards['epoch']) else set()
pubkeys = list(set(all_pubkeys) - known_pks)
if pubkeys:
result = rpc.rewards(pubkeys, epoch=epoch)
new_records = []
for pk, reward in zip(pubkeys, result):
new_records.append(
{
"pubkey": pk,
"epoch": epoch,
"timestamp": pd.to_datetime(get_block_time(rpc, reward["effectiveSlot"]), unit='s', utc=True)
if reward
else None,
"effective_slot": reward["effectiveSlot"] if reward else None,
"amount": reward["amount"] if reward else 0,
"post_balance": reward["postBalance"] if reward else None,
"commission": reward["commission"] if reward else None,
}
)
rewards = pd.concat(
[rewards, pd.DataFrame(new_records).astype(SCHEMA).set_index(["epoch", "pubkey"], drop=False)] # type: ignore
)
rewards.sort_index(inplace=True)
rewards.to_csv(fname, index=False)
epoch_time = rewards.loc[epoch].timestamp.min()
pks_with_timestamp = set(rewards.loc[epoch].timestamp.dropna().index)
if pd.isna(epoch_time) and all_pubkeys:
epoch_time = pd.to_datetime(rpc.epochTime(epoch + 1), unit='s', utc=True)
if epoch_time is None:
epoch_time = pd.to_datetime(0, unit='s', utc=True)
if set(all_pubkeys) - pks_with_timestamp:
records = pd.Series({ (epoch, pk): epoch_time for pk in all_pubkeys })
rewards = rewards.assign(timestamp=rewards.timestamp.fillna(records))
rewards.to_csv(fname, index=False)
return rewards
def load_rewards(filename) -> pd.DataFrame:
rewards: pd.DataFrame
try:
cols = dict(SCHEMA)
cols.pop('timestamp')
rewards = pd.read_csv(filename, parse_dates=['timestamp'], dtype=cols).astype(SCHEMA) # type: ignore
except FileNotFoundError:
rewards = pd.read_csv(io.StringIO(""), names=list(SCHEMA), dtype=SCHEMA) # type: ignore
rewards.set_index(["epoch", "pubkey"], inplace=True, drop=False)
rewards.sort_index(inplace=True)
# populate block time cache
for _, record in rewards[~rewards["effective_slot"].isna()].iterrows():
BLOCK_TIME_CACHE[record["effective_slot"]] = record["timestamp"]
return rewards
def fetch_staking_rewards(rpc, all_pubkeys, filename):
rewards = load_rewards(filename)
cur_epoch = rpc.epochInfo()["epoch"]
new_records = []
last_checkpoint = time.time()
for epoch in tqdm(range(cur_epoch), desc="Fetching inflation rewards"):
pubkeys = [pk for pk in all_pubkeys if (pk, epoch) not in rewards.index]
if not pubkeys:
continue
result = rpc.rewards(pubkeys, epoch=epoch)
for pk, reward in zip(pubkeys, result):
new_records.append(
{
"pubkey": pk,
"epoch": epoch,
"timestamp": pd.to_datetime(get_block_time(rpc, reward["effectiveSlot"]), unit='s', utc=True)
if reward
else None,
"effective_slot": reward["effectiveSlot"] if reward else None,
"amount": reward["amount"] if reward else 0,
"post_balance": reward["postBalance"] if reward else None,
"commission": reward["commission"] if reward else None,
}
)
if time.time() - last_checkpoint > 2 or epoch == cur_epoch - 1:
last_checkpoint = time.time()
rewards = pd.concat(
[rewards, pd.DataFrame(new_records).astype(SCHEMA).set_index(["pubkey", "epoch"], drop=False)]
)
rewards.sort_index(inplace=True)
rewards.to_csv(filename, index=False)
new_records = []
rewards.to_csv(filename)
return rewards
def read_solana_tokens():
tokenlists = []
for path in ["solana.tokenlist.archived.json", "solana.tokenlist.json", "solana.tokenlist.custom.json"]:
with open(path, 'rb') as f:
tokenlists.append(json.load(f))
# chainId 101 is solana mainnet-beta
tokens = {
token['address']: token
for tokenlist in tokenlists
for token in tokenlist['tokens']
if token['chainId'] == 101
}
return tokens
def format_amount(amt, decimals, decimal_sep='.'):
sign, amt = ('', amt) if amt >= 0 else ('-', -amt)
one = 10**decimals
frac = amt % one
frac_whole = format(int(frac), f'0{decimals}')
frac_frac = format(frac - int(frac_whole), '.4f')[2:].rstrip('0')
whole = amt // one
return f"{sign}{whole}{decimal_sep}{frac_whole}{frac_frac}"
RE_SIMPLE_COMMODITY = re.compile(r"^[A-Za-z]*$")
def amount_to_string(tokens, amt, currency, raw=False):
if amt is None:
return ""
if currency == "EUR" or currency == "USD":
return f"{amt} {currency}"
decimal_sep = ',' if raw else '.'
if currency == "SOL":
return f"{format_amount(amt, 9, decimal_sep)} SOL"
if isinstance(currency, solana.publickey.PublicKey):
currency = str(currency)
try:
token = tokens[currency]
except KeyError:
raise RuntimeError(
f"unknown token: {currency}, please add to solana.tokenlist.custom.json"
)
symbol = token["symbol"] if not raw else currency
if not RE_SIMPLE_COMMODITY.match(symbol):
symbol = f'"{symbol}"'
return f'{format_amount(amt, token["decimals"], decimal_sep)} {symbol}'
#!/usr/bin/env python3
"""Generate ledger transactions from solana transactions.
Usage:
process-txs.py [options]
Options:
-h, --help Show this screen.
-y YEAR, --year YEAR Limit output to transactions executed in the given year
-t TZ, --timezone TZ Timezone for output dates [default: Europe/Berlin]
--signers CSV CSV with list of public keys which can sign and the owner of them [default: signers.csv]
--initial-assets CSV CSV file containing asset state of user accounts at the start of the processing interval
--final-assets CSV Save final asset state at the end of the processing interval to CSV file
--track-events CSV Save account tracking events to CSV file
--manual-ledger LEDGER Ledger file containing entries mapped manually [default: manual.ledger]
--manual-aliases CSV CSV file with pubkey,name mapping solana publickeys to ledger account names [default: manual-aliases.csv]
--no-map-tokens Do not map tokens to their symbols, emit raw amounts and mint addresses instead
"""
import base64
import dataclasses
import string
import json
import re
import sqlite3
import sys
import traceback
from collections import defaultdict
from dataclasses import dataclass
from datetime import datetime, timezone
from typing import Any
import based58
import pandas as pd
from dateutil.tz import gettz
from docopt import docopt
import constants
import ix_parser
import solana.message
import solana.publickey
import solana.transaction
from lib import (SolRpc, amount_to_string, fetch_rewards_for_epoch,
first_epoch_slot, format_amount, load_rewards,
read_solana_tokens, slot_to_epoch)
@dataclass(frozen=True, order=True)
class TxId:
slot: int
index: int
@dataclass
class TransactionRecord:
signature: str
tx: solana.transaction.Transaction
meta: dict
timestamp: datetime
txid: TxId
def token_changes(self):
pre_token_by_account = {
amt["accountIndex"]: amt for amt in self.meta["preTokenBalances"]
}
post_token_by_account = {
amt["accountIndex"]: amt for amt in self.meta["postTokenBalances"]
}
token_deltas = []
for ix in set(pre_token_by_account) | set(post_token_by_account):
pre = pre_token_by_account.get(ix, {})
post = post_token_by_account.get(ix, {})
if pre.get("mint", None) == post.get("mint", None):
delta = int(post["uiTokenAmount"]["amount"]) - int(
pre["uiTokenAmount"]["amount"]
)
token_deltas += [(ix, pre.get("mint"), delta)]
continue
if pre.get("uiTokenAmount", {}).get("amount", "0") != "0":
token_deltas += [
(ix, pre.get("mint"), -int(pre["uiTokenAmount"]["amount"]))
]
if post.get("uiTokenAmount", {}).get("amount", "0") != "0":
token_deltas += [
(ix, post.get("mint"), int(post["uiTokenAmount"]["amount"]))
]
msg = self.tx.compile_message()
out = []
for idx, mint, delta in token_deltas:
if not delta:
continue
out += [(msg.account_keys[idx], idx, mint, delta)]
return out
def sol_changes(self):
native_sol_deltas = [
post - pre
for pre, post in zip(self.meta["preBalances"], self.meta["postBalances"])
]
msg = self.tx.compile_message()
return list(zip(msg.account_keys, native_sol_deltas))
def toplevel_instructions(self):
msg = self.tx.compile_message()
inner_by_idx = {
inner["index"]: len(inner["instructions"])
for inner in self.meta["innerInstructions"]
}
linear_idx = 0
for idx, ix in enumerate(msg.instructions):
inner = inner_by_idx.pop(idx, 0)
yield {
"program_id_index": ix.program_id_index,
"accounts": ix.accounts,
"data": ix.data,
"inner": False,
"num_inner": inner,
"linear_idx": linear_idx,
"next_linear_idx": linear_idx + 1 + inner,
}
linear_idx += 1 + inner
def all_instructions(self):
inner_by_idx = {
inner["index"]: inner["instructions"]
for inner in self.meta["innerInstructions"]
}
msg = self.tx.compile_message()
for idx, ix in enumerate(msg.instructions):
yield {
"program_id_index": ix.program_id_index,
"accounts": ix.accounts,
"data": ix.data,
"inner": False,
"toplevel_idx": idx,
}
for inner in inner_by_idx.pop(idx, []):
yield {
"program_id_index": inner["programIdIndex"],
"accounts": bytes(inner["accounts"]),
"data": based58.b58decode(inner["data"].encode()),
"inner": True,
"toplevel_idx": idx,
}
def successful(self):
return 'Ok' in self.meta['status']
@dataclass
class TokenBalance:
mint: str
owner: str | None
amount: int | None
@staticmethod
def deserialize(data):
return TokenBalance(**json.loads(data))
def serialize(self):
return json.dumps(dataclasses.asdict(self))
@dataclass
class StakeAccount:
owner: str
validator: str | None = None
delegated_amount: int | None = None
activation_epoch: int | None = None
deactivation_epoch: int | None = None
lockup_authority: str | None = None
lockup_timestamp: int | None = None
lockup_epoch: int | None = None
@staticmethod
def deserialize(data):
return StakeAccount(**json.loads(data))
def serialize(self):
return json.dumps(dataclasses.asdict(self))
def is_lockup_active(self, slot, timestamp):
active_epoch = self.lockup_epoch is not None and slot < first_epoch_slot(slot)
active_timestamp = self.lockup_timestamp is not None and timestamp < self.lockup_timestamp
return active_epoch or active_timestamp
def is_delegated(self, epoch):
if self.deactivation_epoch is not None and epoch > self.deactivation_epoch:
return False
return self.activation_epoch is not None and epoch > self.activation_epoch
@dataclass
class PublicAccount:
asset_delta: dict[str, int] = dataclasses.field(default_factory=dict)
@staticmethod
def deserialize(data):
return PublicAccount(**json.loads(data))
def serialize(self):
return json.dumps(dataclasses.asdict(self))
TRACKED_ACCOUNT_STATE_TYPE = {
'token': TokenBalance,
'stake': StakeAccount,
'public': PublicAccount,
}
@dataclass
class TrackedAccount:
pubkey: str
kind: str
native_balance: int | None = None
state: Any = None
external: bool = False
def to_dict(self):
return {
'pubkey': self.pubkey,
'kind': self.kind,
'external': self.external,
'native_balance': self.native_balance,
'state': self.state.serialize() if self.state else '',
}
def copy(self):
args = self.to_dict()
args['state'] = '' if not args['state'] else TRACKED_ACCOUNT_STATE_TYPE[args['kind']].deserialize(args['state'])
return TrackedAccount(**args)
ASSETS_SCHEMA = {
'pubkey': str,
'kind': str,
'external': bool,
'native_balance': 'Int64',
'state': str,
}
@dataclass
class TrackEvent:
txid: TxId
event: str
data: dict[str, Any]
def to_dict(self):
return dict(
{
'tx_slot': self.txid.slot,
'tx_index': self.txid.index,
'event': self.event,
},
**self.data
)
class AccountTracker:
signers: dict[str, str]
assets: dict[str, TrackedAccount]
events: list[TrackEvent]
last_txid: TxId
have_error: bool
def __init__(self, signers):
self.signers = signers
self.assets = { pk: TrackedAccount(pk, 'signer') for pk, owner in self.signers.items() if owner == 'me' }
self.events = []
self.last_txid = TxId(-1, 0)
self.have_error = False
def save_assets(self, filename):
records = [
acc.to_dict() for acc in self.assets.values()
]
pd.DataFrame(records).astype(ASSETS_SCHEMA).to_csv(filename, index=False)
def load_assets(self, filename):
df: pd.DataFrame = pd.read_csv(filename, dtype=ASSETS_SCHEMA) # type: ignore
for _, record in df.iterrows():
tracked = TrackedAccount(
pubkey=record.pubkey,
kind=record.kind,
native_balance=int(record.native_balance) if not pd.isna(record.native_balance) else None,
state=TRACKED_ACCOUNT_STATE_TYPE[record.kind].deserialize(record.state) if not pd.isna(record.state) else None,
external=record.external,
)
if tracked.kind == 'signer' and tracked.pubkey not in self.signers:
raise RuntimeError(f'asset {tracked} claims to be a signer, but public key is not in list of known signers')
existing = self.assets.get(tracked.pubkey, None)
if existing is not None and existing.kind != 'signer':
raise RuntimeError(f'conflicting initial assets: {existing} vs {tracked}')
self.assets[tracked.pubkey] = tracked
def is_own_signer(self, pk):
return self.signers.get(str(pk), '') == 'me'
def is_own_asset(self, pk):
asset = self.assets.get(pk)
return self.is_own_signer(pk) or (asset and not asset.external)
def get_stake_pubkeys(self):
return [acc.pubkey for acc in self.assets.values() if acc.kind == 'stake' and not acc.external]
def get_public_account(self):
self.assets.setdefault('public', TrackedAccount('public', kind='public', state=PublicAccount(), external=True))
return self.assets['public']
def tx_preprocess(self, details: 'TransactionRecordDetails'):
assert self.last_txid is None or details.record.txid >= self.last_txid
self.last_txid = details.record.txid
if self.signers.get(str(details.record.tx.fee_payer), '') == 'public':
public = self.get_public_account()
public.state.asset_delta.setdefault('SOL', 0)
public.state.asset_delta['SOL'] -= min(details.record.meta['fee'], public.state.asset_delta['SOL'])
for idx, pubkey in enumerate(details.msg.account_keys):
pubkey = str(pubkey)
tracked = self.assets.get(pubkey, None)
if tracked is None: continue
if tracked.native_balance is None:
tracked.native_balance = details.native_balances[0][idx]
if tracked.native_balance != details.native_balances[0][idx] and not tracked.external:
mismatch = { 'attr': 'native_balance', 'chain': details.native_balances[0][idx], 'tracked': tracked.native_balance }
self.have_error = True
self.events += [TrackEvent(details.record.txid, 'state-mismatch', dict(mismatch, **tracked.to_dict()))]
if tracked.kind == 'token':
pre = details.token_balances[0][idx]
if tracked.state is None and pre is not None:
tracked.state = dataclasses.replace(pre)
if pre is None and tracked.state is not None:
pre = dataclasses.replace(tracked.state)
if pre is None and tracked.state is None: continue
assert pre is not None and tracked.state is not None
if tracked.state.owner is None and pre.owner is not None:
tracked.state.owner = pre.owner
if pre.owner is None and tracked.state.owner is not None:
pre.owner = tracked.state.owner
if tracked.state.amount is None and pre.amount is not None:
tracked.state.amount = pre.amount
if pre.owner != tracked.state.owner and not tracked.external:
mismatch = { 'attr': 'owner', 'chain': pre.owner, 'tracked': tracked.state.owner }
self.have_error = True
self.events += [TrackEvent(details.record.txid, 'state-mismatch', dict(mismatch, **tracked.to_dict()))]
if pre.mint != tracked.state.mint and not tracked.external:
mismatch = { 'attr': 'mint', 'chain': pre.mint, 'tracked': tracked.state.mint }
self.have_error = True
self.events += [TrackEvent(details.record.txid, 'state-mismatch', dict(mismatch, **tracked.to_dict()))]
if pre.amount != tracked.state.amount and not tracked.external:
mismatch = { 'attr': 'amount', 'chain': pre.amount, 'tracked': tracked.state.amount }
self.events += [TrackEvent(details.record.txid, 'state-mismatch', dict(mismatch, **tracked.to_dict()))]
if not tracked.external:
details.token_balances[0][idx] = pre
def tx_postprocess(self, details: 'TransactionRecordDetails'):
for idx, pubkey in enumerate(details.msg.account_keys):
pubkey = str(pubkey)
token = details.token_balances[-1][idx]
tracked = self.assets.get(pubkey, None)
if tracked is not None and token is not None and tracked.kind == 'token' and tracked.state.mint != token.mint:
self.untrack(details.record.txid, tracked)
if (tracked is None or tracked.kind == 'signer') and token is not None and token.owner is not None and self.is_own_signer(token.owner):
tracked = TrackedAccount(pubkey=pubkey, kind='token', native_balance=details.native_balances[-1][idx], state=token)
self.track(details.record.txid, tracked)
if token.amount is None:
data = dict({ 'attr': 'token-balance' }, **tracked.to_dict())
self.have_error = True
self.events += [TrackEvent(details.record.txid, 'state-missing', data)]
if tracked is None: continue
tracked.native_balance = details.native_balances[-1][idx]
if tracked.kind == 'token':
if token is None:
assert tracked.native_balance == 0
tracked.state = token
tracked.external = not token or not self.is_own_signer(token.owner)
if tracked.kind != 'signer' and tracked.native_balance == 0:
assert token is None
self.untrack(details.record.txid, tracked)
def process_reward(self, reward):
txid = TxId(reward['effective_slot'], -1)
assert self.last_txid is None or txid >= self.last_txid
self.last_txid = txid
tracked = self.assets.get(reward['pubkey'], None)
if tracked is None: return
chain_balance = reward['post_balance'] - reward['amount']
if tracked.native_balance is None or tracked.external:
tracked.native_balance = chain_balance
if tracked.native_balance != chain_balance:
mismatch = { 'attr': 'native_balance', 'chain': chain_balance, 'tracked': tracked.native_balance }
self.events += [TrackEvent(txid, 'state-mismatch', dict(mismatch, **tracked.to_dict()))]
self.have_error = True
if tracked.kind =='stake' and tracked.state.delegated_amount is not None:
tracked.state.delegated_amount += reward['amount']
tracked.native_balance = reward['post_balance']
def track(self, txid: TxId, tracked: TrackedAccount):
self.events += [TrackEvent(txid, 'track-start', tracked.to_dict())]
existing = self.assets.get(tracked.pubkey, None)
if existing is not None and existing.kind != 'signer' and not existing.external:
mismatch = { 'attr': 'is-empty', 'chain': True, 'tracked': False }
self.have_error = True
self.events += [TrackEvent(txid, 'state-mismatch', dict(mismatch, **tracked.to_dict()))]
self.assets[tracked.pubkey] = tracked
def untrack(self, txid: TxId, tracked: TrackedAccount):
if tracked.pubkey not in self.assets:
return
self.events += [TrackEvent(txid, 'track-stop', tracked.to_dict())]
if self.is_own_signer(tracked.pubkey):
tracked.kind = 'signer'
tracked.state = None
else:
self.assets.pop(tracked.pubkey)
class TransactionRecordDetails:
record: TransactionRecord
msg: solana.message.Message
all_instructions: list[dict[str, Any]]
native_balances: list[list[int | None]]
token_balances: list[list[TokenBalance | None]]
token_balance_is_delta: list[bool]
def __init__(self, tracker: AccountTracker, record: TransactionRecord):
self.record = record
num_accounts = len(record.tx.compile_message().account_keys)
self.all_instructions = list(record.all_instructions())
self.msg = record.tx.compile_message()
self.native_balances = [ [None] * num_accounts for _ in self.all_instructions ]
self.token_balances = [ [None] * num_accounts for _ in self.all_instructions ]
self.token_balance_is_delta = [False] * num_accounts
self.native_balances[0] = list(record.meta['preBalances'])
for balance in record.meta['preTokenBalances']:
amount = int(balance['uiTokenAmount']['amount'])
idx = balance['accountIndex']
balance = TokenBalance(mint=balance['mint'], owner=balance.get('owner', None), amount=amount)
if str(self.msg.account_keys[idx]) == '2hLHK6YTkwC5oUKn1mbmv5SwdcJVWQNyyutH1k1AuPp4':
balance.owner = '6ZRCB7AAqGre6c72PRz3MHLC73VMYvJ8bi9KHf1HFpNk'
self.token_balances[0][idx] = balance
self.native_balances.append(list(record.meta['postBalances']))
self.token_balances.append([None] * num_accounts)
for balance in record.meta['postTokenBalances']:
amount = int(balance['uiTokenAmount']['amount'])
idx = balance['accountIndex']
balance = TokenBalance(mint=balance['mint'], owner=balance.get('owner', None), amount=amount)
self.token_balances[-1][idx] = balance
tracker.tx_preprocess(self)
self.native_balances[0][0] -= record.meta['fee']
while True:
while True:
changed = False
for i in range(len(self.all_instructions)):
changed = self.propagate(i) or changed
if not changed: break
changed = False
for i in reversed(range(len(self.all_instructions))):
changed = self.propagate(i) or changed
if not changed: break
changed = False
for idx, balance in enumerate(self.token_balances[0]):
if balance is None: continue
if balance.amount is None:
self.token_balance_is_delta[i] = True
balance.amount = 0
changed = True
if not changed: break
def token_changes(self):
if self.record.meta['postTokenBalances'] or self.record.meta['preTokenBalances']:
return self.record.token_changes()
out = []
for idx, (pre, post) in enumerate(zip(self.token_balances[0], self.token_balances[-1])):
if pre == None and post == None: continue
if pre is not None and post is not None and pre.mint == post.mint:
assert post.amount != None, 'token post amount should be known'
assert pre.amount != None, 'token pre amount should be known'
out += [(self.msg.account_keys[idx], idx, pre.mint, post.amount - pre.amount)]
continue
if pre is not None:
assert pre.amount != None, 'token pre amount should be known'
out += [(self.msg.account_keys[idx], idx, pre.mint, -pre.amount)]
if post is not None:
assert post.amount != None, 'token post amount should be known'
out += [(self.msg.account_keys[idx], idx, post.mint, post.amount)]
return out
def token_burns_and_mints(self):
account_keys = list(range(len(self.native_balances[0])))
for idx, ix in enumerate(self.all_instructions):
invoked_prog = str(self.msg.account_keys[ix["program_id_index"]])
if invoked_prog != constants.SPL_TOKEN_ID: continue
parsed = ix_parser.parse_spl_token(account_keys, ix['accounts'], ix['data'])
if parsed['instruction'] not in { 'InitializeAccount', 'CloseAccount', 'SyncNative', 'MintTo', 'Burn' }: continue
if parsed['instruction'] == 'Burn':
pre = self.token_balances[idx][parsed['account']]
owner = pre and pre.owner
yield (str(self.msg.account_keys[parsed['mint']]), str(self.msg.account_keys[parsed['account']]), owner, -parsed['amount'])
continue
if parsed['instruction'] == 'MintTo':
post = self.token_balances[idx + 1][parsed['account']]
owner = post and post.owner
yield (str(self.msg.account_keys[parsed['mint']]), str(self.msg.account_keys[parsed['account']]), owner, parsed['amount'])
continue
pre = self.token_balances[idx][parsed['account']]
post = self.token_balances[idx + 1][parsed['account']]
mint = (pre and pre.mint) or (post and post.mint) or ('mint' in parsed and str(self.msg.account_keys[parsed['mint']]))
if mint != constants.WSOL_MINT_ID: continue
if parsed['instruction'] == 'SyncNative':
if pre is None or post is None or pre.amount is None or post.amount is None:
yield (mint, str(self.msg.account_keys[parsed['account']]), None, None)
else:
yield (mint, str(self.msg.account_keys[parsed['account']]), post.owner, post.amount - pre.amount)
continue
if parsed['instruction'] == 'InitializeAccount':
if post is None or post.amount is None:
yield (mint, str(self.msg.account_keys[parsed['account']]), None, None)
else:
yield (mint, str(self.msg.account_keys[parsed['account']]), post.owner, post.amount)
continue
if parsed['instruction'] == 'CloseAccount':
if pre is None or pre.amount is None:
yield (mint, str(self.msg.account_keys[parsed['account']]), None, None)
else:
yield (mint, str(self.msg.account_keys[parsed['account']]), pre.owner, -pre.amount)
continue
def propagate(self, ix_idx):
changed = False
ix = self.all_instructions[ix_idx]
invoked_prog = str(self.msg.account_keys[ix["program_id_index"]])
def handle_token_initialize_account(parsed):
acc_idx = parsed['account']
pre_native = self.native_balances[ix_idx][acc_idx]
assert self.token_balances[ix_idx][acc_idx] is None, 'only uninitialized accounts can be created'
assert pre_native is None or pre_native >= constants.TOKEN_RENT_EXEMPT_AMOUNT, 'must be rent-exempt'
mint = parsed['mint']
mint = str(self.msg.account_keys[mint] if isinstance(mint, int) else mint)
owner = parsed['owner']
owner = str(self.msg.account_keys[owner] if isinstance(owner, int) else owner)
balance = TokenBalance(mint=mint, owner=owner, amount=None)
if balance.mint == constants.WSOL_MINT_ID:
lamports = self.native_balances[ix_idx][acc_idx]
balance.amount = lamports - constants.TOKEN_RENT_EXEMPT_AMOUNT if lamports is not None else None
else:
balance.amount = 0
changed = self.token_balances[ix_idx + 1][acc_idx] != balance
self.token_balances[ix_idx + 1][acc_idx] = balance
changed_native = any(list(handle_native_delta(i) for i in ix['accounts']))
changed_token = any(list(handle_token_delta(i) for i in ix['accounts'] if i != acc_idx))
return changed or changed_native or changed_token
def handle_token_close_account(parsed):
acc_idx = parsed['account']
changed = False
post = self.token_balances[ix_idx + 1][acc_idx]
assert post is None, 'closed account must be uninit afterwards'
pre = self.token_balances[ix_idx][acc_idx]
if pre is None: return False
pre_native = self.native_balances[ix_idx][acc_idx]
post_native = self.native_balances[ix_idx + 1][acc_idx]
if pre.mint != constants.WSOL_MINT_ID:
if pre.amount is None:
pre.amount = 0
changed = True
assert pre.amount == 0, 'non-native token account must have zero balance for closing'
if pre_native is None:
pre_native = constants.TOKEN_RENT_EXEMPT_AMOUNT
changed = True
assert pre_native == constants.TOKEN_RENT_EXEMPT_AMOUNT, 'non-native token account must have rent-exempt balance'
if post_native is None:
post_native = 0
changed = True
assert post_native == 0, 'token account must have zero balance after closing'
for i in ix['accounts']:
if i == acc_idx: continue
if i == parsed['destination']:
if pre_native is not None and post_native is not None:
changed = handle_native_delta(i, pre_native - post_native) or changed
else:
changed = handle_native_delta(i) or changed
changed = handle_token_delta(i) or changed
return changed
def handle_token_sync_native(parsed):
changed = False
acc_idx = parsed['account']
pre = self.token_balances[ix_idx][acc_idx]
post = self.token_balances[ix_idx + 1][acc_idx]
pre_native = self.native_balances[ix_idx][acc_idx]
post_native = self.native_balances[ix_idx + 1][acc_idx]
if pre is None:
pre = TokenBalance(mint=constants.WSOL_MINT_ID, owner=None, amount=None)
changed = True
if post is None:
post = TokenBalance(mint=constants.WSOL_MINT_ID, owner=None, amount=None)
changed = True
assert post.mint == pre.mint, 'mint cannot change'
if pre.owner is None and post.owner is not None:
pre.owner = post.owner
changed = True
if post.owner is None and pre.owner is not None:
post.owner = pre.owner
changed = True
assert pre.owner == post.owner, 'owner cannot change'
if post_native is None and pre_native is not None:
post_native = pre_native
changed = True
if pre_native is None and post_native is not None:
pre_native = post_native
changed = True
assert pre_native == post_native, 'native balances must match'
if post.amount is None and post_native is not None:
post.amount = post_native - constants.TOKEN_RENT_EXEMPT_AMOUNT
changed = True
if post_native is None and post.amount is not None:
post_native = post.amount + constants.TOKEN_RENT_EXEMPT_AMOUNT
changed = True
if post_native is not None and post.amount is not None:
assert post_native - constants.TOKEN_RENT_EXEMPT_AMOUNT == post.amount, 'balance must be sync'
for i in ix['accounts']:
if i == acc_idx: continue
changed = handle_native_delta(i, 0) or changed
changed = handle_token_delta(i, 0) or changed
self.token_balances[ix_idx][acc_idx] = pre
self.token_balances[ix_idx + 1][acc_idx] = post
self.native_balances[ix_idx][acc_idx] = pre_native
self.native_balances[ix_idx + 1][acc_idx] = post_native
return changed
def handle_token_mint_or_burn(parsed):
factor = -1 if parsed['instruction'] == 'Burn' else 1
deltas = defaultdict(int)
deltas[parsed['account']] = factor * parsed['amount']
changed = any(list(handle_native_delta(i) for i in ix['accounts']))
return any(list(handle_token_delta(i, deltas[i]) for i in ix['accounts'])) or changed
def handle_token_transfer(parsed):
src_idx = parsed['source']
dst_idx = parsed['destination']
deltas = defaultdict(int)
deltas[src_idx] += -parsed['amount']
deltas[dst_idx] += parsed['amount']
native_deltas = defaultdict(int)
all_accs = (
self.token_balances[i][acc_idx]
for i in (ix_idx, ix_idx + 1)
for acc_idx in (src_idx, dst_idx)
)
mint = next((acc.mint for acc in all_accs if acc is not None), None)
if mint == constants.WSOL_MINT_ID:
native_deltas[src_idx] = -parsed['amount']
native_deltas[dst_idx] = parsed['amount']
if mint is not None:
for i in (ix_idx, ix_idx + 1):
for acc_idx in (src_idx, dst_idx):
acc = self.token_balances[i][acc_idx]
if acc is not None: continue
self.token_balances[i][acc_idx] = TokenBalance(mint=mint, owner=None, amount=None)
changed = True
ignored_accs = {src_idx, dst_idx} if mint is None else set()
changed = any(list(handle_native_delta(i, native_deltas[i]) for i in ix['accounts'] if i not in ignored_accs))
changed = any(list(handle_token_delta(i, deltas[i]) for i in ix['accounts'])) or changed
return changed
def handle_token_approve_or_revoke(parsed):
src_idx = parsed['source']
authority = parsed['authority']
authority = str(self.msg.account_keys[authority] if isinstance(authority, int) else authority)
changed = any(list(handle_native_delta(i) for i in ix['accounts']))
changed = any(list(handle_token_delta(i) for i in ix['accounts'])) or changed
for i in (ix_idx, ix_idx + 1):
acc = self.token_balances[i][src_idx]
if acc is not None and acc.owner is None:
acc.owner = authority
changed = True
assert acc is None or acc.owner == authority, 'authority must sign for approve/revoke'
self.token_balances[i][src_idx] = acc
return changed
def handle_token_set_authority(parsed):
if parsed['authority_type'] != 'AccountOwner':
return any(handle_token_delta(i) for i in ix['accounts'])
changed = False
acc_idx = parsed['account']
new_authority = parsed['new_authority']
if isinstance(new_authority, int):
new_authority = self.msg.account_keys[new_authority]
new_authority = str(new_authority)
authority = parsed['authority']
authority = str(self.msg.account_keys[authority] if isinstance(authority, int) else authority)
pre = self.token_balances[ix_idx][acc_idx]
post = self.token_balances[ix_idx + 1][acc_idx]
any_acc = pre or post
if not any_acc: return False
if pre is None:
pre = dataclasses.replace(post, owner=authority)
changed = True
if post is None:
post = dataclasses.replace(pre, owner=new_authority)
changed = True
assert pre is not None and post is not None, 'either pre or post must exist at this point'
if pre.amount is None:
pre.amount = post.amount
changed = True
if post.amount is None:
post.amount = pre.amount
changed = True
if pre.owner is None:
pre.owner = authority
changed = True
if post.owner is None:
post.owner = new_authority
changed = True
assert pre.mint == post.mint, 'mint cannot change'
assert pre.amount == post.amount, 'amount cannot change'
assert pre.owner == authority, 'authority must be previous owner'
assert post.owner == new_authority, 'new_authority must be new owner'
self.token_balances[ix_idx][acc_idx] = pre
self.token_balances[ix_idx + 1][acc_idx] = post
changed = any(list(handle_native_delta(i) for i in ix['accounts'])) or changed
return any(list(handle_token_delta(i) for i in ix['accounts'] if i != acc_idx)) or changed
def handle_token_delta(acc_idx, delta=0):
changed = False
pre = self.token_balances[ix_idx][acc_idx]
post = self.token_balances[ix_idx + 1][acc_idx]
any_acc = pre or post
if not any_acc: return False
if pre is None:
pre = dataclasses.replace(post, amount=None)
changed = True
if post is None:
post = dataclasses.replace(pre, amount=None)
changed = True
assert pre is not None and post is not None
if pre.amount is None and post.amount is not None:
pre.amount = post.amount - delta
changed = True
if post.amount is None and pre.amount is not None:
post.amount = pre.amount + delta
changed = True
if pre.owner is None and post.owner is not None:
pre.owner = post.owner
changed = True
if post.owner is None and pre.owner is not None:
post.owner = pre.owner
changed = True
assert pre.mint == post.mint, 'mint cannot change'
assert pre.owner == post.owner, 'owner cannot change'
if pre.amount is not None and post.amount is not None:
assert pre.amount + delta == post.amount, 'amount must match'
else:
assert pre.amount is None and post.amount is None
self.token_balances[ix_idx][acc_idx] = pre
self.token_balances[ix_idx + 1][acc_idx] = post
return changed
def handle_native_delta(acc_idx, delta=0):
changed = False
pre = self.native_balances[ix_idx][acc_idx]
post = self.native_balances[ix_idx + 1][acc_idx]
if pre is None and post is None: return False
if pre is None:
assert post is not None
pre = post - delta
changed = True
if post is None:
assert pre is not None
post = pre + delta
changed = True
assert pre + delta == post, 'amount must match'
self.native_balances[ix_idx][acc_idx] = pre
self.native_balances[ix_idx + 1][acc_idx] = post
return changed
def handle_system_create_account(parsed):
changed = False
dest_pre = self.native_balances[ix_idx][parsed['destination']]
if dest_pre is None:
dest_pre = 0
changed = True
assert dest_pre == 0, 'create account destination must have zero balance'
self.native_balances[ix_idx][parsed['destination']] = dest_pre
native_deltas = defaultdict(int)
native_deltas[parsed['source']] = -parsed['amount']
native_deltas[parsed['destination']] = parsed['amount']
native_changed = any(list(handle_native_delta(i, native_deltas[i]) for i in ix['accounts']))
return changed or native_changed
def handle_system_transfer(parsed):
native_deltas = defaultdict(int)
native_deltas[parsed['source']] = -parsed['amount']
native_deltas[parsed['destination']] = parsed['amount']
return any(list(handle_native_delta(i, native_deltas[i]) for i in ix['accounts']))
def handle_system_withdraw_nonce_account(parsed):
native_deltas = defaultdict(int)
native_deltas[parsed['account']] = -parsed['amount']
native_deltas[parsed['destination']] = parsed['amount']
return any(list(handle_native_delta(i, native_deltas[i]) for i in ix['accounts']))
def handle_not_implemented(*args, **_kwargs):
raise NotImplemented
token_handlers = {
'MintTo': handle_token_mint_or_burn,
'Burn': handle_token_mint_or_burn,
'InitializeAccount': handle_token_initialize_account,
'CloseAccount': handle_token_close_account,
'Transfer': handle_token_transfer,
'SetAuthority': handle_token_set_authority,
'SyncNative': handle_token_sync_native,
'Approve': handle_token_approve_or_revoke,
'Revoke': handle_token_approve_or_revoke,
}
system_handlers = {
'CreateAccount': handle_system_create_account,
'Transfer': handle_system_transfer,
'CreateAccountWithSeed': handle_not_implemented,
'TransferWithSeed': handle_not_implemented,
'WithdrawNonceAccount': handle_system_withdraw_nonce_account,
}
# propagate balances of readonly accounts and accounts not used by current instruction
used_accs = set(ix['accounts'])
for acc_idx in range(len(self.native_balances[ix_idx])):
is_used = acc_idx in used_accs
is_writable = self.msg.is_account_writable(acc_idx)
known_nonmut_progs = { constants.SPL_ATA_ID }
if is_used and is_writable and invoked_prog not in known_nonmut_progs: continue
changed = handle_native_delta(acc_idx, 0) or changed
changed = handle_token_delta(acc_idx, 0) or changed
# propagate token balances of accounts if invoked program is not the token program
account_keys = list(range(len(self.native_balances[ix_idx])))
if invoked_prog != constants.SPL_TOKEN_ID:
for acc_idx in ix['accounts']:
changed = handle_token_delta(acc_idx, 0) or changed
else:
parsed = ix_parser.parse_spl_token(account_keys, ix['accounts'], ix['data'])
handler = token_handlers.get(parsed['instruction'], None)
if handler is not None:
changed = handler(parsed) or changed
else:
for acc_idx in ix['accounts']:
changed = handle_token_delta(acc_idx, 0) or changed
changed = handle_native_delta(acc_idx, 0) or changed
if invoked_prog == constants.SYSTEM_PROGRAM_ID:
parsed = ix_parser.parse_system(account_keys, ix['accounts'], ix['data'])
handler = system_handlers.get(parsed['instruction'], None)
if handler is not None:
changed = handler(parsed) or changed
else:
for acc_idx in ix['accounts']:
changed = handle_token_delta(acc_idx, 0) or changed
changed = handle_native_delta(acc_idx, 0) or changed
return changed
RE_LEDGER_POSTING = re.compile(r'^[ \t]+(?P<account>"(?:[^"\\]|\\.)*"|(?:[ \t]?[^ \t]+)*)(?:[ \t]{2,}(?P<amount_and_trailer>.*))?$')
RE_AMOUNT_TOKEN = re.compile(r'^[ \t]*("(?:[^"\\]|\\.)*"|-|\+|[^ \t-.,0-9;=@"]+|;|=|@|[,.]*[0-9][0-9,.]*(?:[eE][+-]?[0-9]*)?|[eE][+-]?[0-9]*)')
RE_AMOUNT_VALUE = re.compile(r'^(?P<value>[,.]*[0-9][0-9,.]*)?(?:[eE](?P<exponent>[+-]?[0-9]*))?$')
RE_AMOUNT_CURRENCY = re.compile(r'^"((?:[^"\\]|\\.)*)"|([^ \t-.,0-9;=@"]+)$')
@dataclass
class LedgerPosting:
account: str
amount: int | float
currency: str
trailer: str
@staticmethod
def from_line(line):
if not line or line[0] not in " \t":
raise ValueError('posting line must be indented, but is not: ' + line)
match = RE_LEDGER_POSTING.match(line)
if not match:
raise ValueError('invalid ledger posting: ' + line)
account = match.group('account')
rest = match.group('amount_and_trailer')
amount_abs = float('nan')
sign = None
trailer = ''
currency = ''
while rest:
token_match = RE_AMOUNT_TOKEN.match(rest)
if not token_match:
raise ValueError(f'invalid posting at {rest}: {line}')
rest = rest[token_match.end():]
token = token_match.group(1)
if token in '@=;':
trailer = token + rest
break
if token in {'+', '-'}:
if sign:
raise ValueError(f'invalid amount, duplicate sign: {line}')
sign = token
continue
value_match = RE_AMOUNT_VALUE.match(token)
if value_match:
value = value_match.group('value')
if ',,' in value:
raise ValueError(f'invalid amount, duplicate digit separator: {line}')
value = value.replace(',','')
if '.' in value:
amount_abs = float(value)
elif value:
amount_abs = int(value)
else:
amount_abs = 0
e = value_match.group('exponent')
if e:
amount_abs = amount_abs * pow(10, int(e))
continue
currency_match = RE_AMOUNT_CURRENCY.match(token)
if currency_match:
currency = currency_match.group(1)
if currency is None:
currency = currency_match.group(2)
continue
raise AssertionError(f'token should be handled: {repr(token)}')
if sign is not None and pd.isna(amount_abs):
raise ValueError(f'invalid amount, sign without value in posting: {line}')
if currency and pd.isna(amount_abs):
raise ValueError(f'invalid amount, currency without value in posting: {line}')
amount = -amount_abs if sign == '-' else amount_abs
return LedgerPosting(account, amount, currency, trailer)
LEDGER_ENTRY_HEADER = re.compile(r'^(?P<date>[0-9/\-.]+)[ \t](?P<description>.*)$')
LEDGER_ENTRY_COMMENT = re.compile(r'^[ \t]*[;*#](.*)$')
LEDGER_TAG = re.compile(r'(?P<name>[^ ,\n]+):(?P<value>[^,\n]*)')
@dataclass
class LedgerEntry:
date_str: str
description: str
comment: str = ''
postings: list[LedgerPosting] = dataclasses.field(default_factory=list)
tags: set = dataclasses.field(default_factory=set)
@staticmethod
def new_for_timestamp(tz, timestamp, description):
date_str = timestamp.astimezone(tz).strftime("%Y-%m-%d")
return LedgerEntry(date_str, description, comment=f'timestamp:{timestamp}\n')
@staticmethod
def from_lines(ls):
if not ls: raise ValueError('empty ledger entry, need at least one line')
header_match = LEDGER_ENTRY_HEADER.match(ls[0])
if not header_match:
raise ValueError(f'first line of ledger entry is not a valid header: {ls[0]}')
ls = ls[1:]
comment = ''
while ls:
m = LEDGER_ENTRY_COMMENT.match(ls[0])
if not m: break
comment += m.group(1) + '\n'
ls = ls[1:]
tags = set()
for tag in LEDGER_TAG.finditer(comment):
name = tag.group('name')
value = tag.group('value')
if value:
tags.add(name + ':' + value)
else:
tags.add(name)
postings = [LedgerPosting.from_line(l) for l in ls]
date = header_match.group('date')
desc = header_match.group('description')
return LedgerEntry(date, desc, comment, postings, tags)
def add_posting(self, account, amount, currency, trailer=''):
self.postings.append(LedgerPosting(account, amount, currency, trailer))
def balance_for(self, currency):
return sum(posting.amount for posting in self.postings if posting.currency == currency)
def merge_postings(self):
total_delta: dict[tuple[str,str], int|float] = defaultdict(int)
for posting in self.postings:
if posting.trailer.strip(): continue
total_delta[(posting.account, posting.currency)] += posting.amount
new_postings = []
for posting in self.postings:
if posting.trailer.strip():
new_postings += [posting]
continue
delta = total_delta.pop((posting.account, posting.currency), 0)
if not delta: continue
new_postings += [LedgerPosting(posting.account, delta, posting.currency, "")]
self.postings = new_postings
def print(self, tokens, raw):
print(f'{self.date_str} {self.description}')
for line in self.comment.strip().split('\n'):
if line.strip():
print(f' ; {line.strip()}')
tag_comment = ''
for tag in self.tags:
tag = tag + ':' if ':' not in tag else tag
if tag in self.comment: continue
tag_comment += tag + ','
if tag_comment:
print(f' ; {tag_comment}')
for posting in self.postings:
if not posting.amount: continue
trailer = '' if not posting.trailer.strip() else ' ' + posting.trailer.strip()
if pd.isna(posting.amount):
if trailer:
trailer = ' ' + trailer
print(f' {posting.account}{trailer}')
else:
amount = amount_to_string(tokens, posting.amount, posting.currency, raw)
print(f' {posting.account} {amount}{trailer}')
def parse_ledger_file(f):
line = next(f, None)
while line is not None:
line = line.rstrip('\n')
if not line.strip() or LEDGER_ENTRY_COMMENT.match(line):
line = next(f, None)
continue
entry_lines = [line]
while True:
line = next(f, None)
if not line or not line.strip(): break
line = line.rstrip('\n')
if line[0] not in ' \t': break
entry_lines += [line]
yield LedgerEntry.from_lines(entry_lines)
def account_pubkey(account_keys, pk_or_idx):
if pk_or_idx is None: return None
if isinstance(pk_or_idx, int):
return str(account_keys[pk_or_idx])
return str(pk_or_idx)
class Processor:
def __init__(self, tz, rpc: SolRpc, account_tracker: AccountTracker, rewards: pd.DataFrame, begin: int, end: int|float, manual_entries: dict[str, LedgerEntry], no_map_tokens: bool):
epoch_info = rpc.epochInfo()
self.tokens = read_solana_tokens()
self.transfer_mapping = pd.read_csv('transfer-mapping.csv', dtype=str, keep_default_na=False).set_index('pubkey').to_dict('index')
self.tz = tz
self.rpc = rpc
self.account_tracker = account_tracker
self.last_epoch = epoch_info['epoch']
self.last_slot = epoch_info['absoluteSlot']
self.rewards = rewards
self.begin = begin
self.end = end
self.next_reward_epoch = 0
self.remaining_epoch_rewards = []
self.manual_entries = manual_entries
self.no_map_tokens = no_map_tokens
self.aliases = {}
self.current_slot = -1
self.current_timestamp = -1
self.ix_processed = set()
def entry_for_tx_generic(self, details: TransactionRecordDetails) -> LedgerEntry:
record = details.record
account_keys = details.msg.account_keys
fee_payer = account_keys[0]
entry = LedgerEntry.new_for_timestamp(self.tz, details.record.timestamp, f'{fee_payer} | unknown')
entry.comment += f'signature:{details.record.signature}\nhttps://solscan.io/tx/{details.record.signature}\n'
entry.comment += f'fee_payer:{details.record.tx.fee_payer}\n'
for signer in details.msg.account_keys[:details.msg.header.num_required_signatures]:
entry.comment += f'signer:{signer}\n'
for acc, delta in record.sol_changes():
entry.add_posting(f'raw:solana:{acc}', delta, 'SOL')
for acc, _, mint, delta in details.token_changes():
if not delta:
continue
entry.add_posting(f'raw:solana:{acc}', delta, mint)
if str(mint) == constants.WSOL_MINT_ID:
entry.add_posting(f'raw:solana:{acc}', -delta, 'SOL')
unknown_mint_or_burn_amount = set()
for mint, acc, owner, amount in details.token_burns_and_mints():
if amount is None:
unknown_mint_or_burn_amount.add(mint)
continue
if mint == constants.WSOL_MINT_ID:
acc = 'equity:conversion:solana:wsol' if self.account_tracker.is_own_signer(owner) else 'external:solana:conversion:wsol'
entry.add_posting(acc, -amount, mint)
entry.add_posting(acc, amount, 'SOL')
continue
entry.add_posting(f'equity:solana:mint:{mint}', -amount, mint)
is_scam = any('scam' in self.tokens.get(posting.currency, {}).get('tags', []) for posting in entry.postings)
is_scam = is_scam or any('scam' in self.tokens.get(str(key), {}).get('tags', []) for key in account_keys)
if not self.account_tracker.is_own_signer(fee_payer):
entry.tags.add('external')
if is_scam:
entry.tags.add('scam')
if record.successful():
wsol_balance = entry.balance_for(constants.WSOL_MINT_ID)
if wsol_balance != 0:
print(f'warning: corrected wSOL balance for {details.record.signature}', file=sys.stderr)
assert constants.WSOL_MINT_ID in unknown_mint_or_burn_amount
entry.add_posting(f'equity:solana:mint:{constants.WSOL_MINT_ID}', -wsol_balance, constants.WSOL_MINT_ID)
for mint in unknown_mint_or_burn_amount:
if mint == constants.WSOL_MINT_ID: continue
raise RuntimeError(f'mint or burn amount for mint {mint} should be known, as it is not a wsol mint')
else:
# a failed transaction does not modify anything except fees
entry.postings = [ posting for posting in entry.postings if posting.currency == 'SOL' ]
entry.tags.add('failed')
if self.account_tracker.signers.get(str(account_keys[0]), '') in { 'me', 'public' }:
entry.add_posting(f"expenses:solana:fees:network:{account_keys[0]}", record.meta['fee'], 'SOL')
else:
entry.add_posting(f"external:solana:fees", record.meta['fee'], 'SOL')
entry.add_posting(f"external:solana:{account_keys[0]}", -record.meta['fee'], 'SOL')
entry.add_posting(f"raw:solana:{account_keys[0]}", record.meta['fee'], 'SOL')
balance = entry.balance_for('SOL')
if balance != 0:
rent_one_epoch_zero_size = 2439
assert balance < 0 and (
(-balance) % rent_one_epoch_zero_size == 0
or -balance in record.meta["preBalances"]
)
entry.add_posting(f'expenses:solana:fees:rent', -balance, 'SOL')
entry.merge_postings()
return entry
def entry_for_inflation_reward(self, reward) -> LedgerEntry:
self.account_tracker.process_reward(reward)
desc = f"{reward['pubkey']} | staking rewards for epoch {reward['epoch']}"
entry = LedgerEntry.new_for_timestamp(self.tz, reward['timestamp'].to_pydatetime(), desc)
entry.tags.add('kind:stake-reward')
acc = self.stake_pubkey_delegated_name(reward['pubkey'], reward['epoch'])
rent = 0 if ':delegated:' not in acc else constants.STAKE_RENT_EXEMPT_AMOUNT
assertion = f"= {format_amount(reward['post_balance'] - rent, 9, ',' if self.no_map_tokens else '.')} SOL"
tracked = self.account_tracker.assets.get(reward['pubkey'])
if ':delegated:' in acc and tracked and tracked.state.deactivation_epoch == reward['epoch']:
assertion = f'= 0 SOL'
entry.add_posting(f"{acc}", reward['amount'], 'SOL', assertion)
if tracked and tracked.external:
entry.add_posting(f'external:solana:inflation', -reward['amount'], 'SOL')
else:
assert tracked.state.validator is not None
entry.add_posting(f'income:misc:staking:solana:{tracked.state.validator}', -reward["amount"], "SOL"),
return entry
def process_vote_withdraws(self, details: TransactionRecordDetails, entry: LedgerEntry):
account_keys = details.record.tx.compile_message().account_keys
if constants.VOTE_PROGRAM_ID not in { str(x) for x in account_keys }:
return
for idx, ix in enumerate(details.record.toplevel_instructions()):
prog = str(account_keys[ix['program_id_index']])
if prog != constants.VOTE_PROGRAM_ID: continue
parsed = ix_parser.parse_vote(account_keys, ix['accounts'], ix['data'])
if parsed['instruction'] == 'Withdraw':
self.ix_processed.add(idx)
yield parsed
def process_stake(self, details: TransactionRecordDetails, entry: LedgerEntry):
record = details.record
account_keys = record.tx.compile_message().account_keys
if constants.STAKE_PROGRAM_ID not in { str(x) for x in account_keys }:
return
for idx, ix in enumerate(record.all_instructions()):
prog = str(account_keys[ix['program_id_index']])
if prog != constants.STAKE_PROGRAM_ID: continue
parsed = ix_parser.parse_stake(range(len(account_keys)), ix['accounts'], ix['data'])
if parsed['instruction'] == 'Initialize':
withdrawer = account_pubkey(account_keys, parsed['authorized']['withdrawer'])
external = not self.account_tracker.is_own_signer(withdrawer)
pk = str(account_keys[parsed['account']])
lockup = parsed['lockup']
state = StakeAccount(withdrawer, lockup_authority=str(lockup['custodian']), lockup_timestamp=lockup['unix_timestamp'], lockup_epoch=lockup['epoch'])
tracked = TrackedAccount(pk, 'stake', record.meta['postBalances'][parsed['account']], state, external=external)
payers = {}
if not ix['inner']:
self.ix_processed.add(ix['toplevel_idx'])
# find create account instruction for initialize, if in same tx
for create_idx, create_ix in enumerate(record.toplevel_instructions()):
if create_idx >= ix['toplevel_idx']: break
if parsed['account'] not in create_ix['accounts']: continue
if str(account_keys[create_ix['program_id_index']]) != constants.SYSTEM_PROGRAM_ID: continue
system = ix_parser.parse_system(range(len(account_keys)), create_ix['accounts'], create_ix['data'])
acc = system.get('account', system.get('destination', None))
if acc == parsed['account'] and system['instruction'] in {'CreateAccount', 'Transfer', 'Assign', 'Allocate'}:
self.ix_processed.add(create_idx)
if 'source' in system:
payers[str(account_keys[system['source']])] = system['amount']
yield 'new', pk, payers
if state.lockup_authority or not tracked.external:
self.account_tracker.track(details.record.txid, tracked)
if parsed['instruction'] == 'Authorize' and parsed['kind'] == 'Staker':
if not ix['inner']:
self.ix_processed.add(ix['toplevel_idx'])
if parsed['instruction'] == 'Authorize' and parsed['kind'] == 'Withdrawer':
pk = str(account_keys[parsed['account']])
tracked = self.account_tracker.assets.get(pk)
new_authority = account_pubkey(account_keys, parsed['new_authority'])
external = not self.account_tracker.is_own_signer(new_authority)
if not ix['inner']:
self.ix_processed.add(ix['toplevel_idx'])
if not tracked:
if external: continue
if parsed['custodian'] is not None:
data = {
'pubkey': pk,
'kind': 'stake',
'external': False,
}
self.account_tracker.events += [TrackEvent(details.record.txid, 'state-missing', data)]
self.account_tracker.have_error = True
state = StakeAccount(new_authority)
tracked = TrackedAccount(pk, 'stake', record.meta['postBalances'][parsed['account']], state, external=False)
self.account_tracker.track(details.record.txid, tracked)
yield 'new', pk, {}
else:
assert tracked.kind == 'stake'
before = tracked.copy()
tracked.external = external
tracked.state.owner = new_authority
yield 'changed', before
if tracked.state.lockup_authority is None and tracked.external:
self.account_tracker.untrack(details.record.txid, tracked)
else:
self.account_tracker.events += [TrackEvent(details.record.txid, 'track-change', tracked.to_dict())]
if parsed['instruction'] == 'Split':
src = str(account_keys[parsed['source']])
dest = str(account_keys[parsed['destination']])
if not ix['inner']:
self.ix_processed.add(ix['toplevel_idx'])
# find create account instruction for initialize, if in same tx
for create_idx, create_ix in enumerate(record.toplevel_instructions()):
if create_idx >= ix['toplevel_idx']: break
if parsed['destination'] not in create_ix['accounts']: continue
if str(account_keys[create_ix['program_id_index']]) != constants.SYSTEM_PROGRAM_ID: continue
system = ix_parser.parse_system(range(len(account_keys)), create_ix['accounts'], create_ix['data'])
acc = system.get('account', system.get('destination', None))
if acc == parsed['destination'] and system['instruction'] in {'CreateAccount', 'Transfer', 'Assign', 'Allocate'}:
self.ix_processed.add(create_idx)
tracked_src = self.account_tracker.assets.get(src)
authority = str(account_keys[parsed['authority']])
if tracked_src is None:
state = StakeAccount(authority)
tracked_src = TrackedAccount(src, 'stake', external=not self.account_tracker.is_own_signer(state.owner), state=state)
if not tracked_src.external:
data = {
'pubkey': src,
'kind': 'stake',
'external': False,
}
self.account_tracker.events += [TrackEvent(details.record.txid, 'state-missing', data)]
self.account_tracker.have_error = True
assert tracked_src.kind == 'stake'
state = StakeAccount.deserialize(tracked_src.state.serialize())
tracked_dst = TrackedAccount(dest, 'stake', record.meta['postBalances'][parsed['destination']], state, external=tracked_src.external)
if not tracked_dst.external:
self.account_tracker.track(details.record.txid, tracked_dst)
yield 'split', tracked_src.copy(), tracked_dst.copy()
if not tracked_src.external:
if tracked_src.state.is_delegated(slot_to_epoch(self.current_slot)):
pre_balance = details.native_balances[idx][parsed['destination']] or 0
split_staked = parsed['amount'] - pre_balance
stake_delta_src = min(parsed['amount'], tracked_src.state.delegated_amount)
tracked_src.state.delegated_amount -= stake_delta_src
tracked_dst.state.delegated_amount = split_staked
if parsed['instruction'] == 'Merge':
src = str(account_keys[parsed['source']])
dst = str(account_keys[parsed['destination']])
tracked_src = self.account_tracker.assets.get(src)
tracked_dst = self.account_tracker.assets.get(dst)
if not ix['inner']:
self.ix_processed.add(ix['toplevel_idx'])
if tracked_src is None and tracked_dst is not None and not tracked_dst.external:
data = {
'pubkey': src,
'kind': 'stake',
'external': False,
}
self.account_tracker.events += [TrackEvent(details.record.txid, 'state-missing', data)]
self.account_tracker.have_error = True
if tracked_dst is None and tracked_src is not None and not tracked_src.external:
data = {
'pubkey': dst,
'kind': 'stake',
'external': False,
}
self.account_tracker.events += [TrackEvent(details.record.txid, 'state-missing', data)]
self.account_tracker.have_error = True
if tracked_src is None or tracked_dst is None or not record.successful(): continue
yield 'merge', tracked_src.copy(), tracked_dst.copy()
assert tracked_src.external == tracked_dst.external
if tracked_src.external or not record.successful(): continue
if tracked_dst.state.is_delegated(slot_to_epoch(self.current_slot)):
tracked_dst.state.delegated_amount += tracked_src.state.delegated_amount
if parsed['instruction'] == 'SetLockup':
if not ix['inner']:
self.ix_processed.add(ix['toplevel_idx'])
pk = str(account_keys[parsed['account']])
tracked = self.account_tracker.assets.get(pk)
custodian_or_withdrawer = account_pubkey(account_keys, parsed['signer'])
if not tracked or not record.successful():
continue
assert tracked.kind == 'stake'
if tracked.state.owner != custodian_or_withdrawer and not tracked.state.lockup_authority:
tracked.state.lockup_authority = custodian_or_withdrawer
new_authority = account_pubkey(account_keys, parsed['lockup']['custodian'])
if new_authority:
tracked.state.lockup_authority = new_authority
if parsed['lockup']['unix_timestamp'] is not None:
tracked.state.lockup_timestamp = parsed['lockup']['unix_timestamp']
if parsed['lockup']['epoch'] is not None:
tracked.state.lockup_epoch = parsed['lockup']['epoch']
self.account_tracker.events += [TrackEvent(details.record.txid, 'track-change', tracked.to_dict())]
if parsed['instruction'] == 'DelegateStake':
if not ix['inner']:
self.ix_processed.add(ix['toplevel_idx'])
pk = str(account_keys[parsed['account']])
vote = account_pubkey(account_keys, parsed['vote'])
tracked = self.account_tracker.assets.get(pk)
if not tracked or (tracked.external and tracked.kind != 'stake') or not record.successful():
continue
assert tracked.kind == 'stake'
if tracked.state.validator == vote and tracked.state.activation_epoch == slot_to_epoch(self.current_slot): continue
yield 'delegate', tracked.copy()
tracked.state.validator = vote
tracked.state.deactivation_epoch = None
tracked.state.activation_epoch = slot_to_epoch(self.current_slot)
tracked.state.delegated_amount = tracked.native_balance - constants.STAKE_RENT_EXEMPT_AMOUNT
self.account_tracker.events += [TrackEvent(details.record.txid, 'track-change', tracked.to_dict())]
if parsed['instruction'] == 'Deactivate':
if not ix['inner']:
self.ix_processed.add(ix['toplevel_idx'])
pk = str(account_keys[parsed['account']])
tracked = self.account_tracker.assets.get(pk)
if not tracked or (tracked.external and tracked.kind != 'stake') or not record.successful():
continue
assert tracked.kind == 'stake'
if tracked.state.deactivation_epoch == slot_to_epoch(self.current_slot): continue
yield 'deactivate', tracked.copy()
tracked.state.deactivation_epoch = slot_to_epoch(self.current_slot)
self.account_tracker.events += [TrackEvent(details.record.txid, 'track-change', tracked.to_dict())]
if parsed['instruction'] == 'Withdraw':
if not ix['inner']:
self.ix_processed.add(ix['toplevel_idx'])
if record.successful():
yield 'withdraw', str(account_keys[parsed['account']]), str(account_keys[parsed['destination']])
def process_system_transfers(self, details: TransactionRecordDetails):
record = details.record
account_keys = record.tx.compile_message().account_keys
for idx, ix in enumerate(record.toplevel_instructions()):
prog = str(account_keys[ix['program_id_index']])
if prog == constants.SYSTEM_PROGRAM_ID:
parsed = ix_parser.parse_system(account_keys, ix['accounts'], ix['data'])
if parsed['instruction'] == 'Transfer' and idx not in self.ix_processed:
yield parsed
self.ix_processed.add(idx)
if parsed['instruction'] == 'AdvanceNonceAccount' and idx not in self.ix_processed:
self.ix_processed.add(idx)
def process_token_transfers(self, details: TransactionRecordDetails):
record = details.record
account_keys = record.tx.compile_message().account_keys
toplevel = record.toplevel_instructions()
for idx, ix in enumerate(toplevel):
prog = str(account_keys[ix['program_id_index']])
if prog != constants.SPL_TOKEN_ID: continue
parsed = ix_parser.parse_spl_token(account_keys, ix['accounts'], ix['data'])
if parsed['instruction'] == 'Transfer' and idx not in self.ix_processed:
yield parsed
self.ix_processed.add(idx)
if parsed['instruction'] == 'Authorize' and idx not in self.ix_processed:
yield parsed
self.ix_processed.add(idx)
def process_ata_transfers(self, details: TransactionRecordDetails):
record = details.record
account_keys = record.tx.compile_message().account_keys
toplevel = record.toplevel_instructions()
for idx, ix in enumerate(toplevel):
prog = str(account_keys[ix['program_id_index']])
if prog != constants.SPL_ATA_ID: continue
parsed = ix_parser.parse_spl_ata(account_keys, ix['accounts'], ix['data'])
if parsed['instruction'] == 'Create':
self.ix_processed.add(idx)
yield str(parsed['account']), str(parsed['source'])
def handle_stake_activation(self, epoch):
epoch_timestamp = pd.NaT
for acc in self.account_tracker.assets.values():
if acc.kind != 'stake' or acc.external: continue
if acc.state.deactivation_epoch == epoch and acc.state.activation_epoch == epoch:
continue
if acc.state.deactivation_epoch == epoch:
epoch_rewards = self.rewards.loc[epoch, acc.pubkey].iloc[0]
epoch_timestamp = epoch_rewards.timestamp
assert not pd.isna(epoch_timestamp)
entry = LedgerEntry.new_for_timestamp(self.tz, epoch_timestamp.to_pydatetime(), f'{acc.pubkey} | unstaked from {acc.state.validator}')
entry.comment=f'stake:{acc.pubkey}, validator:{acc.state.validator}, timestamp:{epoch_timestamp}, epoch:{epoch+1}'
# include last epoch rewards in unstake, so that income reporting shows from which stake the rewards came
amount = epoch_rewards.amount + acc.state.delegated_amount
entry.add_posting(self.stake_pubkey_delegated_name(acc.pubkey, epoch), -amount, 'SOL')
entry.add_posting(self.stake_pubkey_delegated_name(acc.pubkey, epoch + 1), amount, 'SOL')
yield entry
continue
if acc.state.activation_epoch == epoch:
epoch_timestamp = self.rewards.loc[epoch].timestamp.min() if pd.isna(epoch_timestamp) else epoch_timestamp
assert not pd.isna(epoch_timestamp)
entry = LedgerEntry.new_for_timestamp(self.tz, epoch_timestamp.to_pydatetime(), f'{acc.pubkey} | staked to {acc.state.validator}')
entry.comment=f'stake:{acc.pubkey}, validator:{acc.state.validator}, timestamp:{epoch_timestamp}, epoch:{epoch+1}'
entry.add_posting(self.stake_pubkey_delegated_name(acc.pubkey, epoch), -acc.state.delegated_amount, 'SOL')
entry.add_posting(self.stake_pubkey_delegated_name(acc.pubkey, epoch + 1), acc.state.delegated_amount, 'SOL')
yield entry
continue
def process_finished_epoch(self, epoch):
stakes = self.account_tracker.get_stake_pubkeys()
self.rewards = fetch_rewards_for_epoch(self.rpc, 'rewards.csv', self.rewards, epoch, stakes)
yield from self.handle_stake_activation(epoch)
epoch_rewards = self.rewards.loc[epoch].sort_values('effective_slot')
self.remaining_epoch_rewards += [reward for _, reward in epoch_rewards[~epoch_rewards['effective_slot'].isna()].iterrows()]
def process_rewards_until_slot(self, end_slot):
to_epoch = slot_to_epoch(end_slot)
if self.next_reward_epoch <= to_epoch:
for finished_epoch in range(max(0, self.next_reward_epoch - 1), to_epoch):
yield from self.process_finished_epoch(finished_epoch)
self.next_reward_epoch = to_epoch + 1
while self.remaining_epoch_rewards and self.remaining_epoch_rewards[0]['effective_slot'] <= end_slot:
reward = self.remaining_epoch_rewards.pop(0)
if reward['timestamp'].timestamp() < self.begin: continue
if reward['timestamp'].timestamp() >= self.end: break
self.current_slot = reward['effective_slot']
self.current_timestamp = reward['timestamp'].timestamp()
tracked = self.account_tracker.assets.get(reward['pubkey'])
if tracked is None or tracked.external: continue
entry = self.entry_for_inflation_reward(reward)
yield entry
def stake_pubkey_delegated_name(self, pk, epoch):
tracked = self.account_tracker.assets.get(pk, None)
return self.stake_account_delegated_name(tracked, epoch, pk=pk)
def stake_account_delegated_name(self, tracked, epoch, pk=None):
if pk is None:
pk = tracked.pubkey
if tracked is None or tracked.kind != 'stake' or tracked.external:
return f'raw:solana:{pk}'
if tracked.state.is_delegated(epoch):
return f'assets:solana:stake:{pk}:delegated:{tracked.state.validator}'
return f'assets:solana:stake:{pk}'
def handle_stake_op(self, details, entry: LedgerEntry, stake):
if not stake: return
if not any(self.account_tracker.is_own_signer(str(details.msg.account_keys[i])) for i in range(details.msg.header.num_required_signatures)):
return
action0 = stake[0]
if action0[0] == 'withdraw' and len(stake) == 1:
_, acc, _dest = action0
entry.description = f'{acc} | withdraw from stake account'
entry.tags.add('kind:stake-op')
return True
if action0[0] == 'delegate' and len(stake) == 1:
_, tracked = action0
tracked = self.account_tracker.assets.get(tracked.pubkey)
assert tracked is not None
entry.description = f'{tracked.pubkey} | initiate stake to {tracked.state.validator}'
entry.tags.add('kind:stake-op')
return True
if action0[0] == 'deactivate' and len(stake) == 1:
_, tracked = action0
entry.description = f'{tracked.pubkey} | initiate unstake from {tracked.state.validator}'
entry.tags.add('kind:stake-op')
return True
if action0[0] == 'new' and len(stake) == 1:
entry.description = f'{action0[1]} | initialize stake account'
entry.tags.add('kind:stake-op')
return True
if action0[0] == 'merge' and len(stake) == 1:
_, src, dst = action0
if src.external == dst.external:
entry.description = f'{dst.pubkey} | merge stake {src.pubkey}'
entry.tags.add('kind:stake-op')
return True
if action0[0] == 'split' and len(stake) == 1:
_, src, dst = action0
if src.external == dst.external:
entry.description = f'{src.pubkey} | split stake to {dst.pubkey}'
entry.tags.add('kind:stake-op')
return True
if action0[0] == 'changed' and len(stake) == 1:
before = action0[1]
after = self.account_tracker.assets.get(before.pubkey)
if before and after and before.external == after.external:
entry.description = f'{before.pubkey} | update stake account authority'
entry.tags.add('kind:stake-op')
return True
def handle_transfer_op(self, details, entry: LedgerEntry, system, token, stake, atas):
system_src = set(str(parsed['source']) for parsed in system)
system_dst = set(str(parsed['destination']) for parsed in system)
self_funded_atas = {}
for pk, payer in atas:
if not self.account_tracker.is_own_signer(payer):
system_src.add(payer)
else:
self_funded_atas[pk] = payer
token_src = defaultdict(set)
token_dst = defaultdict(set)
signer = None
if len(details.record.tx.signatures) == 1:
signer = str(details.record.tx.fee_payer)
for idx, (pre, post) in enumerate(zip(details.token_balances[0], details.token_balances[-1])):
if pre and post and pre.mint == post.mint and pre.owner == post.owner:
if pre.amount == post.amount: continue
if pre.amount < post.amount:
if not post.owner: return
token_dst[pre.owner].add(str(details.msg.account_keys[idx]))
else:
owner = pre.owner or signer
if not owner: return
token_src[owner].add(str(details.msg.account_keys[idx]))
continue
if pre:
owner = pre.owner or signer
if not owner: return
token_src[owner].add(str(details.msg.account_keys[idx]))
if post:
if not post.owner: return
token_dst[post.owner].add(str(details.msg.account_keys[idx]))
stake_src = defaultdict(set)
stake_dst = defaultdict(set)
stake_transfers = []
for op in stake:
if op[0] in { 'delegate', 'deactivate' }: return
if op[0] == 'new':
system_src = system_src | set(op[2])
tracked = self.account_tracker.assets.get(op[1])
if tracked and tracked.kind == 'stake':
if not tracked.state.owner: return
stake_dst[tracked.state.owner].add(tracked.pubkey)
if op[0] == 'changed':
before = op[1]
after = self.account_tracker.assets.get(before.pubkey)
if after is None:
if before.owner is None: return
stake_src[before.state.owner].add(before.pubkey)
continue
if before.state.owner != after.state.owner:
stake_src[before.state.owner].add(before.pubkey)
stake_dst[after.state.owner].add(before.pubkey)
stake_transfers += [(before, after)]
continue
if before.native_balance < after.native_balance:
stake_dst[before.state.owner].add(before.pubkey)
if before.native_balance > after.native_balance:
stake_src[before.state.owner].add(before.pubkey)
if op[0] == 'split':
_, src, dst = op
dst = self.account_tracker.assets.get(dst.pubkey)
if dst is None:
stake_src[src.state.owner].add(src.pubkey)
continue
if src.state.owner != dst.state.owner:
stake_src[src.state.owner].add(src.pubkey)
stake_dst[dst.state.owner].add(dst.pubkey)
srcs = system_src | set(token_src) | set(stake_src)
dsts = system_dst | set(token_dst) | set(stake_dst)
src_is_own = all(self.account_tracker.is_own_asset(s) for s in srcs)
dst_is_own = all(self.account_tracker.is_own_asset(d) for d in dsts)
src_is_public = all(self.account_tracker.signers.get(s, '') == 'public' for s in srcs)
dst_is_public = all(self.account_tracker.signers.get(d, '') == 'public' for d in dsts)
# if str(details.record.signature) == 'tSP38dp5s7qsJUzZDw5idFZdWV3ZBcjALFZmBj1PMgv78HJQwHfbcyXYeK92hAxnrFLLFREPhKEtFLwWxQrtmKP':
# import IPython
# IPython.embed()
if dst_is_own and src_is_own:
entry.description = 'transfer between own wallets'
entry.tags.add('kind:transfer')
return True
if src_is_own and dst_is_public:
entry.description = 'transfer to public wallet'
entry.tags.add('kind:transfer')
entry.tags.add('transfer:public')
all_dst_accs = system_dst | set(
acc
for d in [token_dst, stake_dst]
for accs in d.values()
for acc in accs
)
for posting in list(entry.postings):
if not posting.amount: continue
pk = posting.account.split(':')[-1]
if pk not in all_dst_accs or posting.account != f'raw:solana:{pk}': continue
assert posting.amount > 0, 'transfer destination posting must have positive amount'
tracked = self.account_tracker.get_public_account()
tracked.state.asset_delta.setdefault(posting.currency, 0)
tracked.state.asset_delta[posting.currency] += posting.amount
for before, after in stake_transfers:
assert before.owner in stake_src
assert after.owner in stake_dst
idx = [str(k) for k in details.msg.account_keys].index(before.pubkey)
# only need to handle this if no posting was generated
if details.record.meta['preBalances'][idx] != details.record.meta['postBalances'][idx]:
continue
amount = details.record.meta['preBalances'][idx]
tracked = self.account_tracker.get_public_account()
tracked.state.asset_delta.setdefault('SOL', 0)
tracked.state.asset_delta['SOL'] += amount
return True
if src_is_public and dst_is_own and srcs:
src = next(iter(srcs))
entry.description = 'transfer from public wallet'
entry.tags.add('kind:transfer')
entry.tags.add('transfer:public')
mapping = self.transfer_mapping.get(src, {}) if len(srcs) == 1 else {}
all_src_accs = system_src | set(
acc
for d in [token_src, stake_src]
for accs in d.values()
for acc in accs
)
for posting in list(entry.postings):
if not posting.amount: continue
pk = posting.account.split(':')[-1]
if pk not in all_src_accs or posting.account != f'raw:solana:{pk}': continue
assert posting.amount < 0, 'transfer source posting must have positive amount'
tracked = self.account_tracker.get_public_account()
tracked.state.asset_delta.setdefault(posting.currency, 0)
tracked.state.asset_delta[posting.currency] -= -posting.amount
if pk == str(details.record.tx.fee_payer) and posting.currency == 'SOL':
tracked.state.asset_delta[posting.currency] += details.record.meta['fee']
excess = tracked.state.asset_delta[posting.currency]
if excess < 0:
tracked.state.asset_delta[posting.currency] = 0
if len(srcs) != 1: return
if not mapping.get('source'):
entry.tags.add(f'transfer-source:{src}')
print(f'warning: missing transfer source mapping for {src} for {excess} {posting.currency}', file=sys.stderr)
return
entry.add_posting(mapping['source'], excess, posting.currency)
for before, after in stake_transfers:
assert before.owner in srcs
idx = [str(k) for k in details.msg.account_keys].index(before.pubkey)
# only need to handle this if no posting was generated
if details.record.meta['preBalances'][idx] != details.record.meta['postBalances'][idx]: continue
amount = details.record.meta['preBalances'][idx]
tracked = self.account_tracker.get_public_account()
tracked.state.asset_detla.setdefault('SOL', 0)
tracked.state.asset_delta['SOL'] -= -amount
excess = tracked.state.asset_delta['SOL']
if excess < 0:
tracked.state.asset_delta['SOL'] = 0
if len(srcs) != 1: return
if not mapping.get('source'):
entry.tags.add(f'transfer-source:{src}')
print(f'warning: missing transfer source mapping for {src}', file=sys.stderr)
return
entry.add_posting(mapping['source'], -amount, 'SOL')
return True
src_external = not any(self.account_tracker.is_own_asset(s) for s in srcs)
dst_external = not any(self.account_tracker.is_own_asset(d) for d in dsts)
if src_external and dst_external:
entry.description = 'transfer between external wallets'
entry.tags.add('kind:transfer')
entry.tags.add('transfer:external')
all_asset_accs = system_src | system_dst | set(
acc
for d in [token_src, stake_src, token_dst, stake_src, stake_dst]
for accs in d.values()
for acc in accs
)
for posting in list(entry.postings):
if not posting.amount: continue
pk = posting.account.split(':')[-1]
if pk not in all_asset_accs or posting.account != f'raw:solana:{pk}': continue
entry.add_posting(f'raw:solana:{pk}', -posting.amount, posting.currency)
entry.add_posting(f'external:solana:{pk}', posting.amount, posting.currency)
return True
if len(srcs) == 1 and dst_is_own:
src = next(iter(srcs))
mapping = self.transfer_mapping.get(src, {})
if not mapping.get('source'):
entry.tags.add(f'transfer-source:{src}')
print(f'warning: missing transfer source mapping for {src}', file=sys.stderr)
return
entry.description = mapping['source_description']
entry.tags.add('kind:transfer')
entry.tags.add('transfer:incoming')
to_rewrite = system_src | stake_src[src] | token_src[src]
for posting in list(entry.postings):
if not posting.amount: continue
pk = posting.account.split(':')[-1]
if pk not in to_rewrite or posting.account != f'raw:solana:{pk}': continue
assert posting.amount < 0, 'transfer source posting should have negative amount'
entry.add_posting(f'raw:solana:{pk}', -posting.amount, posting.currency)
entry.add_posting(f'{mapping["source"]}', posting.amount, posting.currency)
for before, after in stake_transfers:
assert before.owner == src
idx = [str(k) for k in details.msg.account_keys].index(before.pubkey)
# only need to handle this if no posting was generated
if details.record.meta['preBalances'][idx] != details.record.meta['postBalances'][idx]: continue
amount = details.record.meta['preBalances'][idx]
entry.add_posting('raw:solana:' + before.pubkey, amount, 'SOL')
entry.add_posting(mapping['source'], -amount, 'SOL')
return True
if len(dsts) == 1 and src_is_own:
dst = next(iter(dsts))
mapping = self.transfer_mapping.get(dst, {})
if not mapping.get('destination'):
entry.tags.add(f'transfer-destination:{dst}')
print(f'warning: missing transfer destination mapping for {dst}', file=sys.stderr)
return
entry.description = mapping['destination_description']
entry.tags.add('kind:transfer')
entry.tags.add('transfer:outgoing')
to_rewrite = system_dst | stake_dst[dst] | token_dst[dst]
for posting in list(entry.postings):
if not posting.amount: continue
pk = posting.account.split(':')[-1]
if pk not in to_rewrite or posting.account != f'raw:solana:{pk}': continue
if pk in self_funded_atas and posting.currency == 'SOL': continue
assert posting.amount > 0, 'transfer destination posting should have positive amount'
entry.add_posting(f'raw:solana:{pk}', -posting.amount, posting.currency)
entry.add_posting(f'{mapping["destination"]}', posting.amount, posting.currency)
for pk, payer in self_funded_atas.items():
entry.add_posting(f'raw:solana:{pk}', -constants.TOKEN_RENT_EXEMPT_AMOUNT, 'SOL')
entry.add_posting(f'expenses:donations:solana-ata-rent', constants.TOKEN_RENT_EXEMPT_AMOUNT, 'SOL')
for before, after in stake_transfers:
assert not before.external
idx = [str(k) for k in details.msg.account_keys].index(before.pubkey)
# only need to handle this if no posting was generated
if details.record.meta['preBalances'][idx] != details.record.meta['postBalances'][idx]: continue
amount = details.record.meta['preBalances'][idx]
entry.add_posting(f'raw:solana:{before.pubkey}', -amount, 'SOL')
entry.add_posting(mapping['destination'], amount, 'SOL')
return True
def handle_vote_withdraw_op(self, details: TransactionRecordDetails, entry: LedgerEntry, withdraws):
handled = True
total_amount_for_dest = defaultdict(int)
for withdraw in withdraws:
src = str(withdraw['account'])
dst = str(withdraw['destination'])
entry.tags.add('kind:stake-reward')
total_amount_for_dest[dst] += withdraw['amount']
if not self.account_tracker.is_own_asset(withdraw['destination']):
entry.add_posting(f'raw:solana:{dst}', -withdraw['amount'], 'SOL')
entry.add_posting(f'external:solana:{dst}', withdraw['amount'], 'SOL')
entry.add_posting(f'raw:solana:{src}', withdraw['amount'], 'SOL')
entry.add_posting(f'external:solana:inflation', -withdraw['amount'], 'SOL')
continue
mapping = self.transfer_mapping.get(src, {})
if not mapping.get('source'):
print(f'warning: missing transfer source mapping for {src}', file=sys.stderr)
handled = False
continue
entry.add_posting(f'raw:solana:{src}', withdraw['amount'], 'SOL')
entry.add_posting(f'income:misc:staking:solana:{src}', -withdraw['amount'], 'SOL')
for asset in self.account_tracker.assets.values():
if asset.kind != 'stake' or asset.state is None: continue
if asset.state.validator is None or asset.state.validator != src: continue
entry.tags.add(f'stake:{asset.pubkey}')
for dst, amount in total_amount_for_dest.items():
idx = [str(acc) for acc in details.msg.account_keys].index(dst)
delta = details.native_balances[-1][idx] - details.native_balances[0][idx]
if delta != amount:
rent_one_epoch_zero_size = 2439
diff = delta - amount
assert diff < 0
assert (
details.native_balances[0][idx] == -diff or
(-diff) % rent_one_epoch_zero_size == 0
)
if not self.account_tracker.is_own_asset(dst):
entry.add_posting(f'expenses:solana:fees:rent', diff, 'SOL')
entry.add_posting(f'external:solana:fees:rent', -diff, 'SOL')
entry.add_posting(f'raw:solana:{dst}', -diff, 'SOL')
entry.add_posting(f'external:solana:{dst}', diff, 'SOL')
if handled:
entry.description = f'collect staking rewards'
return handled
def process_token_ops(self, details: TransactionRecordDetails):
for idx, ix in enumerate(details.record.toplevel_instructions()):
prog = str(details.msg.account_keys[ix['program_id_index']])
if prog == constants.SPL_ATA_ID:
parsed = ix_parser.parse_spl_ata(details.msg.account_keys, ix['accounts'], ix['data'])
if parsed['instruction'] == 'Create':
self.ix_processed.add(idx)
yield 'InitializeAccount'
continue
if prog == constants.SPL_TOKEN_ID:
parsed = ix_parser.parse_spl_token(details.msg.account_keys, ix['accounts'], ix['data'])
if parsed['instruction'] == 'InitializeAccount':
if not self.account_tracker.is_own_signer(str(parsed['owner'])): continue
self.ix_processed.add(idx)
yield 'InitializeAccount'
if parsed['instruction'] == 'CloseAccount':
if not self.account_tracker.is_own_signer(str(parsed['authority'])): continue
self.ix_processed.add(idx)
yield 'CloseAccount'
if parsed['instruction'] == 'SyncNative':
self.ix_processed.add(idx)
if parsed['instruction'] == 'Transfer':
source_idx = [str(k) for k in details.msg.account_keys].index(str(parsed['source']))
dest_idx = [str(k) for k in details.msg.account_keys].index(str(parsed['source']))
source = details.token_balances[ix['linear_idx']][source_idx]
dest = details.token_balances[ix['linear_idx']][dest_idx]
if source is None or dest is None or source.owner is None or dest.owner is None: continue
if not self.account_tracker.is_own_signer(source.owner): continue
if not self.account_tracker.is_own_signer(dest.owner): continue
self.ix_processed.add(idx)
yield 'Transfer'
continue
if prog == constants.SYSTEM_PROGRAM_ID:
parsed = ix_parser.parse_system(details.msg.account_keys, ix['accounts'], ix['data'])
if parsed['instruction'] == 'CreateAccount':
if not self.account_tracker.is_own_signer(str(parsed['source'])): continue
if str(parsed['owner']) != constants.SPL_TOKEN_ID: continue
self.ix_processed.add(idx)
if parsed['amount'] != constants.TOKEN_RENT_EXEMPT_AMOUNT:
yield 'Transfer'
else:
yield 'InitializeAccount'
if parsed['instruction'] == 'Transfer':
if not self.account_tracker.is_own_signer(str(parsed['source'])): continue
self.ix_processed.add(idx)
yield 'Transfer'
def process_loader_ops(self, details: TransactionRecordDetails, entry: LedgerEntry):
for idx, ix in enumerate(details.record.toplevel_instructions()):
prog = str(details.msg.account_keys[ix['program_id_index']])
if prog == constants.BPF_LOADER_ID:
if not self.account_tracker.is_own_signer(str(details.record.tx.fee_payer)): continue
self.ix_processed.add(idx)
parsed = ix_parser.parse_loader(details.msg.account_keys, ix['accounts'], ix['data'])
yield {
'Finalize': 'deploy',
'Write': 'write',
}[parsed['instruction']]
if prog == constants.BPF_UPGRADEABLE_LOADER_ID:
if not self.account_tracker.is_own_signer(str(details.record.tx.fee_payer)): continue
self.ix_processed.add(idx)
parsed = ix_parser.parse_upgradeable_loader(range(len(details.msg.account_keys)), ix['accounts'], ix['data'])
if 'authority' in parsed and not self.account_tracker.is_own_signer(account_pubkey(details.msg.account_keys, parsed['authority'])):
continue
if parsed['instruction'] == 'DeployWithMaxDataLen':
prog_pk = account_pubkey(details.msg.account_keys, parsed['program'])
amount = details.native_balances[-1][parsed['program']]
assert amount is not None
entry.add_posting(f'expenses:solana:fees:rent-exempt', amount, 'SOL')
entry.add_posting(f'raw:solana:{prog_pk}', -amount, 'SOL')
progdata_pk = account_pubkey(details.msg.account_keys, parsed['programdata'])
amount = details.native_balances[-1][parsed['programdata']]
assert amount is not None
entry.add_posting(f'assets:solana:program-buffers:rent', amount, 'SOL')
entry.add_posting(f'raw:solana:{progdata_pk}', -amount, 'SOL')
buffer_pk = account_pubkey(details.msg.account_keys, parsed['buffer'])
amount = details.native_balances[0][parsed['buffer']]
assert amount is not None
entry.add_posting(f'assets:solana:program-buffers:rent', -amount, 'SOL')
entry.add_posting(f'raw:solana:{buffer_pk}', amount, 'SOL')
if parsed['instruction'] == 'InitializeBuffer':
account_pk = account_pubkey(details.msg.account_keys, parsed['account'])
amount = details.native_balances[-1][parsed['account']]
assert amount is not None
entry.add_posting(f'assets:solana:program-buffers:rent', amount, 'SOL')
entry.add_posting(f'raw:solana:{account_pk}', -amount, 'SOL')
if parsed['instruction'] == 'Close':
account_pk = account_pubkey(details.msg.account_keys, parsed['account'])
amount = details.native_balances[0][parsed['account']]
assert amount is not None
entry.add_posting(f'assets:solana:program-buffers:rent', -amount, 'SOL')
entry.add_posting(f'raw:solana:{account_pk}', amount, 'SOL')
yield {
'Write': 'write',
'DeployWithMaxDataLen': 'deploy',
'InitializeBuffer': 'initialize',
'Upgrade': 'upgrade',
'SetAuthority': 'set-authority',
'Close': 'close-program' if parsed.get('program') is not None else 'close-buffer',
}[parsed['instruction']]
if prog == constants.SYSTEM_PROGRAM_ID:
parsed = ix_parser.parse_system(details.msg.account_keys, ix['accounts'], ix['data'])
if parsed['instruction'] == 'CreateAccount':
if not self.account_tracker.is_own_signer(str(parsed['source'])): continue
if str(parsed['owner']) not in { constants.BPF_LOADER_ID, constants.BPF_UPGRADEABLE_LOADER_ID }:
continue
if str(parsed['owner']) == constants.BPF_LOADER_ID:
entry.add_posting(f'raw:solana:{parsed["destination"]}', -parsed['amount'], 'SOL')
if self.account_tracker.is_own_signer(str(parsed['source'])):
entry.add_posting(f'expenses:solana:fees:rent-exempt', parsed['amount'], 'SOL')
else:
entry.add_posting(f'external:solana:fees:rent-exempt', parsed['amount'], 'SOL')
self.ix_processed.add(idx)
yield 'initialize'
def alias(self, pk, new, raw=False):
if pk in self.aliases: return
self.aliases[pk] = new
if raw:
print(f"alias raw:solana:{pk} = {new}")
print(f"alias equity:solana:mint:{pk} = {new}")
print(f"alias external:solana:{pk} = {new}")
def process_swaps(self, details: TransactionRecordDetails, entry: LedgerEntry):
if not ({ constants.JUP_ID, constants.RAYDIUM_V4_ID } & { str(x) for x in details.msg.account_keys }):
return
for idx, ix in enumerate(details.record.toplevel_instructions()):
prog = str(details.msg.account_keys[ix['program_id_index']])
if prog == constants.JUP_ID:
parsed = ix_parser.parse_jup(range(len(details.msg.account_keys)), ix['accounts'], ix['data'])
if parsed['instruction'] == 'set_token_ledger':
self.ix_processed.add(idx)
continue
swap_params = {
'token_swap': {
'name': 'orca',
'authority': 'user_transfer_authority',
'source': 'source',
'destination': 'destination',
'pool_id': 'swap',
'pool_accounts': ['swap_source', 'swap_destination'],
'pool_fee': 'pool_fee',
},
'raydium_swap_v2': {
'name': 'raydium',
'authority': 'user_source_owner',
'source': 'user_source_token_account',
'destination': 'user_destination_token_account',
'pool_id': 'amm_id',
'pool_accounts': ['pool_coin_token_account', 'pool_pc_token_account'],
},
'saber_exchange': {
'name': 'saber',
'authority': 'user_authority',
'source': 'input_user_account',
'destination': 'output_user_account',
'pool_id': 'swap',
'pool_accounts': ['input_token_account', 'output_token_account'],
'pool_fee': 'fees_token_account',
},
'lifinity_token_swap': {
'name': 'lifinity',
'authority': 'user_transfer_authority',
'source': 'source_info',
'destination': 'destination_info',
'pool_id': 'amm',
'pool_accounts': ['swap_source', 'swap_destination'],
'pool_fee': 'fee_account',
},
'crema_token_swap': {
'name': 'crema',
'authority': 'wallet_authority',
'source': 'user_source_token_account',
'destination': 'user_destination_token_account',
'pool_id': 'pool',
'pool_accounts': ['pool_source_token_account', 'pool_destination_token_account'],
}
}
if parsed['instruction'] in swap_params:
params = swap_params[parsed['instruction']]
user_authority = account_pubkey(details.msg.account_keys, parsed[params['authority']])
if not self.account_tracker.is_own_signer(user_authority): continue
source_before = details.token_balances[ix['linear_idx']][parsed[params['source']]]
source_after = details.token_balances[ix['next_linear_idx']][parsed[params['source']]]
assert source_before and source_after and source_before.amount is not None and source_after.amount is not None
amount_in = source_before.amount - source_after.amount
destination_before = details.token_balances[ix['linear_idx']][parsed[params['destination']]]
destination_after = details.token_balances[ix['next_linear_idx']][parsed[params['destination']]]
assert destination_before and destination_after and destination_before.amount is not None and destination_after.amount is not None
amount_out = destination_after.amount - destination_before.amount
pool_accounts = [parsed[k] for k in params['pool_accounts']]
amm_pk = account_pubkey(details.msg.account_keys, parsed[params['pool_id']])
for pool_acc in pool_accounts:
bal = details.token_balances[ix['linear_idx']][pool_acc]
assert bal is not None
pk = account_pubkey(details.msg.account_keys, pool_acc)
if bal.mint == source_before.mint:
entry.add_posting(f'raw:solana:{pk}', -amount_in, bal.mint)
entry.add_posting(f'equity:conversion:solana:{params["name"]}:{amm_pk}', amount_in, bal.mint)
else:
assert bal.mint == destination_before.mint
entry.add_posting(f'raw:solana:{pk}', amount_out, bal.mint)
entry.add_posting(f'equity:conversion:solana:{params["name"]}:{amm_pk}', -amount_out, bal.mint)
if 'pool_fee' in params:
fee_before = details.token_balances[ix['linear_idx']][parsed[params['pool_fee']]]
fee_after = details.token_balances[ix['next_linear_idx']][parsed[params['pool_fee']]]
pool_fee = account_pubkey(details.msg.account_keys, parsed[params['pool_fee']])
assert fee_before and fee_after and fee_before.amount is not None and fee_after.amount is not None
fee = fee_after.amount - fee_before.amount
entry.add_posting(f'raw:solana:{pool_fee}', -fee, fee_before.mint)
entry.add_posting(f'external:solana:fees:{params["name"]}:{amm_pk}', fee, fee_before.mint)
self.ix_processed.add(idx)
yield params['name'], source_before.mint, destination_before.mint
continue
if prog == constants.RAYDIUM_V4_ID and ix['data'][0] in {9, 11}: # swap base in/out
accounts = ix['accounts']
user_authority = account_pubkey(details.msg.account_keys, accounts[17])
if not self.account_tracker.is_own_signer(user_authority): continue
source_before = details.token_balances[ix['linear_idx']][accounts[15]]
source_after = details.token_balances[ix['next_linear_idx']][accounts[15]]
assert source_before and source_after and source_before.amount is not None and source_after.amount is not None
amount_in = source_before.amount - source_after.amount
destination_before = details.token_balances[ix['linear_idx']][accounts[16]]
destination_after = details.token_balances[ix['next_linear_idx']][accounts[16]]
assert destination_before and destination_after and destination_before.amount is not None and destination_after.amount is not None
amount_out = destination_after.amount - destination_before.amount
pool_accounts = [accounts[i] for i in [5, 6]]
amm_pk = account_pubkey(details.msg.account_keys, ix['accounts'][1])
for pool_acc in pool_accounts:
bal = details.token_balances[ix['linear_idx']][pool_acc]
assert bal is not None
pk = account_pubkey(details.msg.account_keys, pool_acc)
if bal.mint == source_before.mint:
entry.add_posting(f'raw:solana:{pk}', -amount_in, bal.mint)
entry.add_posting(f'equity:conversion:solana:raydium:{amm_pk}', amount_in, bal.mint)
else:
assert bal.mint == destination_before.mint
entry.add_posting(f'raw:solana:{pk}', amount_out, bal.mint)
entry.add_posting(f'equity:conversion:solana:raydium:{amm_pk}', -amount_out, bal.mint)
self.ix_processed.add(idx)
yield 'raydium', source_before.mint, destination_before.mint
def __call__(self, record: TransactionRecord):
entries = list(self.process_rewards_until_slot(record.txid.slot))
self.current_slot = record.txid.slot
self.current_timestamp = record.timestamp.timestamp()
self.ix_processed = set()
all_toplevel_ixs = set(range(len(list(record.toplevel_instructions()))))
details = TransactionRecordDetails(self.account_tracker, record)
entry = self.entry_for_tx_generic(details)
assets_before = {}
for acc in details.msg.account_keys:
asset = self.account_tracker.assets.get(str(acc), None)
if asset is None: continue
assets_before[str(acc)] = asset.copy()
if record.signature in self.manual_entries:
manual_entry = self.manual_entries.pop(record.signature)
manual_entry.postings = entry.postings + manual_entry.postings
manual_entry.tags |= entry.tags
entries += [manual_entry]
else:
for _ in range(1):
# process "transfers" and staking operations
stake = list(self.process_stake(details, entry))
if self.ix_processed == all_toplevel_ixs and self.handle_stake_op(details, entry, stake): break
system = list(self.process_system_transfers(details))
token = list(self.process_token_transfers(details))
ata = list(self.process_ata_transfers(details))
for idx, ix in enumerate(record.toplevel_instructions()):
prog = str(details.msg.account_keys[ix['program_id_index']])
if prog in { constants.SCAM_NOOP_PROGRAM_ID }:
self.ix_processed.add(idx)
if self.ix_processed == all_toplevel_ixs and self.handle_transfer_op(details, entry, system, token, stake, ata): break
self.ix_processed = set()
loader_ops = set(self.process_loader_ops(details, entry))
if loader_ops == {'initialize', 'deploy'}:
loader_ops = {'deploy'}
if self.ix_processed == all_toplevel_ixs and len(loader_ops) == 1:
op = next(iter(loader_ops))
entry.description = f'program deployment operation: {op}'
entry.tags.add('kind:loader-op')
entry.tags.add(f'loader:{op}')
break
self.ix_processed = set()
vote_withdraws = list(self.process_vote_withdraws(details, entry))
if self.ix_processed == all_toplevel_ixs and self.handle_vote_withdraw_op(details, entry, vote_withdraws):
break
self.ix_processed = set()
token_ops = set(self.process_token_ops(details))
if self.ix_processed == all_toplevel_ixs and token_ops and self.account_tracker.is_own_signer(record.tx.fee_payer):
entry.description = ''
for op in sorted(token_ops):
if entry.description:
entry.description += ', '
entry.description += {
'InitializeAccount': 'initialize new account',
'CloseAccount': 'close own account',
'Transfer': 'transfer between own wallets',
}[op]
tag = {
'InitializeAccount': 'initialize',
'CloseAccount': 'close',
'Transfer': 'transfer',
}[op]
entry.tags.add(f'token-op:{tag}')
entry.description = f'{record.tx.fee_payer} | token operations: {entry.description}'
entry.tags.add('kind:token-op')
break
jup = list(self.process_swaps(details, entry))
if self.ix_processed == all_toplevel_ixs:
entry.tags.add('kind:swap')
entry.description = f'{record.tx.fee_payer} | swap:'
for swap, mint_from, mint_to in jup:
entry.tags.add(f'swap:{swap}')
symbol_from = self.tokens[mint_from]['symbol']
symbol_to = self.tokens[mint_to]['symbol']
entry.description += f' {symbol_from} -> {symbol_to} ({swap}),'
entry.description = entry.description.rstrip(',')
entries += [entry]
self.account_tracker.tx_postprocess(details)
# generate offsetting posting for changed assets
epoch = slot_to_epoch(self.current_slot)
for acc in details.msg.account_keys:
before = assets_before.get(str(acc), None)
after = self.account_tracker.assets.get(str(acc), None)
if (before is None or before.external) and (after is None or after.external): continue
if before == after: continue
if before and before.kind == 'stake':
if before.state.is_delegated(epoch):
entries[-1].add_posting(self.stake_account_delegated_name(before, epoch), -before.state.delegated_amount, 'SOL')
entries[-1].add_posting(f'assets:solana:stake:{before.pubkey}', before.state.delegated_amount - before.native_balance, 'SOL')
entries[-1].add_posting(f'raw:solana:{before.pubkey}', before.native_balance, 'SOL')
else:
entries[-1].add_posting(f'assets:solana:stake:{before.pubkey}', -before.native_balance, 'SOL')
entries[-1].add_posting(f'raw:solana:{before.pubkey}', before.native_balance, 'SOL')
if after and after.kind == 'stake':
if after.state.is_delegated(epoch):
entries[-1].add_posting(self.stake_account_delegated_name(after, epoch), after.state.delegated_amount, 'SOL')
entries[-1].add_posting(f'assets:solana:stake:{after.pubkey}', -after.state.delegated_amount + after.native_balance, 'SOL')
entries[-1].add_posting(f'raw:solana:{after.pubkey}', -after.native_balance, 'SOL')
else:
if after.external:
entries[-1].add_posting(f'raw:solana:{after.pubkey}', after.native_balance, 'SOL')
else:
entries[-1].add_posting(f'assets:solana:stake:{after.pubkey}', after.native_balance, 'SOL')
entries[-1].add_posting(f'raw:solana:{after.pubkey}', -after.native_balance, 'SOL')
if before and before.kind == 'token' and not before.external:
native_wsol = 0 if before.state.mint != constants.WSOL_MINT_ID else before.state.amount
native_balance = before.native_balance - native_wsol
entries[-1].add_posting(f'assets:solana:wallet:{before.state.owner}:{before.pubkey}', -before.state.amount, before.state.mint)
entries[-1].add_posting(f'assets:solana:wallet:{before.state.owner}:{before.pubkey}', -native_balance, 'SOL')
entries[-1].add_posting(f'raw:solana:{before.pubkey}', before.state.amount, before.state.mint)
entries[-1].add_posting(f'raw:solana:{before.pubkey}', native_balance, 'SOL')
if after and after.kind == 'token' and not after.external:
native_wsol = 0 if after.state.mint != constants.WSOL_MINT_ID else after.state.amount
native_balance = after.native_balance - native_wsol
entries[-1].add_posting(f'assets:solana:wallet:{after.state.owner}:{after.pubkey}', after.state.amount, after.state.mint)
entries[-1].add_posting(f'assets:solana:wallet:{after.state.owner}:{after.pubkey}', native_balance, 'SOL')
entries[-1].add_posting(f'raw:solana:{after.pubkey}', -after.state.amount, after.state.mint)
entries[-1].add_posting(f'raw:solana:{after.pubkey}', -native_balance, 'SOL')
for idx, entry in enumerate(entries):
entry.merge_postings()
is_record_entry = idx == len(entries) - 1
for posting in list(entry.postings):
if not posting.account.startswith('raw:solana:'): continue
suffix = posting.account[len('raw:solana:'):]
parts = suffix.split(':', 1)
pk = parts[0]
suffix = '' if len(parts) < 2 or not parts[1] else ':' + parts[1]
is_own_asset = self.account_tracker.is_own_asset(pk)
is_public_asset = self.account_tracker.signers.get(pk, '') == 'public'
if self.account_tracker.is_own_signer(pk):
posting.account = f'assets:solana:wallet:{pk}{suffix}'
continue
if is_public_asset:
posting.account = f'assets:solana:public:{pk}{suffix}'
continue
# if asset is not None and asset.kind == 'token' and not asset.external:
# assert asset.state.owner is not None
# posting.account = f'assets:solana:wallet:{asset.state.owner}:{pk}{suffix}'
entry.print(self.tokens, self.no_map_tokens)
print("")
def finalize(self):
self.process_rewards_until_slot(self.last_slot)
def main():
assert __doc__ is not None
args = docopt(__doc__)
db = sqlite3.connect("tx.db")
tz = gettz(args['--timezone'])
rpc = SolRpc("https://api.mainnet-beta.solana.com")
rewards = load_rewards('rewards.csv')
select_condition = '1'
begin = 0
end = float('inf')
if args['--year'] is not None:
begin = int(datetime(year=int(args['--year'], 10), month=1, day=1, tzinfo=tz).timestamp())
end = datetime(year=int(args['--year'], 10) + 1, month=1, day=1, tzinfo=tz).timestamp()
select_condition = f'timestamp >= {begin} AND timestamp < {end}'
signers: pd.DataFrame = pd.read_csv(args['--signers'], index_col='pubkey') # type: ignore
account_tracker = AccountTracker(signers['owner'].to_dict())
if args['--initial-assets'] is not None:
account_tracker.load_assets(args['--initial-assets'])
manual_entries = {}
with open(args['--manual-ledger']) as f:
for entry in parse_ledger_file(f):
signature = None
for tag in entry.tags:
if not tag.startswith('signature:'): continue
tag_sig = tag[len('signature:'):]
if signature is not None:
raise RuntimeError(f'duplicate signature tag for entry: {entry}')
signature = tag_sig
if signature is None:
raise RuntimeError(f'manual entry without TX signature: {entry}')
if signature in manual_entries:
raise RuntimeError(f'more than one manual entry for signature {signature}')
manual_entries[signature] = entry
processor = Processor(tz, rpc, account_tracker, rewards, begin, end, manual_entries, bool(args['--no-map-tokens']))
have_error = False
if processor.no_map_tokens:
print('decimal-mark ,')
else:
print('decimal-mark .')
if args['--manual-aliases']:
aliases = pd.read_csv(args['--manual-aliases'], dtype={'pubkey': str, 'name': str, 'raw': bool}, keep_default_na=False)
for _, alias in aliases.iterrows():
processor.alias(alias.pubkey, alias['name'], alias.raw)
for sig, timestamp, slot, index, data_str in db.execute(
f"select * from transactions where {select_condition} order by timestamp, slot, \"index\" asc"
):
data = json.loads(data_str)
tx = solana.transaction.Transaction.deserialize(
base64.b64decode(data["transaction"][0])
)
timestamp = datetime.fromtimestamp(timestamp, tz=timezone.utc)
record = TransactionRecord(
signature=sig,
tx=tx,
meta=data["meta"],
timestamp=timestamp,
txid=TxId(slot, index),
)
try:
processor(record)
except Exception as e:
have_error = True
print("", file=sys.stderr)
print(f"error processing {sig}", file=sys.stderr)
traceback.print_exception(e)
processor.finalize()
if args['--track-events']:
pd.DataFrame([event.to_dict() for event in account_tracker.events]).to_csv(args['--track-events'], index=False)
if args['--final-assets']:
account_tracker.save_assets(args['--final-assets'])
if have_error or account_tracker.have_error:
sys.exit(1)
if __name__ == "__main__":
main()
This file has been truncated, but you can view the full file.
{
"name": "Solana Token List",
"logoURI": "https://cdn.jsdelivr.net/gh/trustwallet/assets@master/blockchains/solana/info/logo.png",
"keywords": [
"solana",
"spl"
],
"tags": {
"stablecoin": {
"name": "stablecoin",
"description": "Tokens that are fixed to an external asset, e.g. the US dollar"
},
"ethereum": {
"name": "ethereum",
"description": "Asset bridged from ethereum"
},
"lp-token": {
"name": "lp-token",
"description": "Asset representing liquidity provider token"
},
"wrapped-sollet": {
"name": "wrapped-sollet",
"description": "Asset wrapped using sollet bridge"
},
"wrapped": {
"name": "wrapped",
"description": "Asset wrapped using wormhole bridge"
},
"leveraged": {
"name": "leveraged",
"description": "Leveraged asset"
},
"bull": {
"name": "bull",
"description": "Leveraged Bull asset"
},
"bear": {
"name": "bear",
"description": "Leveraged Bear asset"
},
"nft": {
"name": "nft",
"description": "Non-fungible token"
},
"security-token": {
"name": "security-token",
"description": "Tokens that are used to gain access to an electronically restricted resource"
},
"utility-token": {
"name": "utility-token",
"description": "Tokens that are designed to be spent within a certain blockchain ecosystem e.g. most of the SPL-Tokens"
},
"tokenized-stock": {
"name": "tokenized-stock",
"description": "Tokenized stocks are tokenized derivatives that represent traditional securities, particularly shares in publicly firms traded on regulated exchanges"
}
},
"timestamp": "2021-03-03T19:57:21+0000",
"tokens": [
{
"chainId": 101,
"address": "3SghkPdBSrpF9bzdAy5LwR4nGgFbqNcC6ZSq8vtZdj91",
"symbol": "EV1",
"name": "EveryOne Coin",
"decimals": 9,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/3SghkPdBSrpF9bzdAy5LwR4nGgFbqNcC6ZSq8vtZdj91/logo.png",
"tags": [
"currency"
],
"extensions": {
"facebook": "https://facebook.com/everyonecoin",
"twitter": "https://twitter.com/everyonecoin",
"website": "https://everyonecoin.com/"
}
},
{
"chainId": 101,
"address": "NGK3iHqqQkyRZUj4uhJDQqEyKKcZ7mdawWpqwMffM3s",
"symbol": "YAKU",
"name": "Yaku",
"decimals": 0,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/EK58dp4mxsKwwuySWQW826i3fwcvUK69jPph22VUcd2H/logo.png",
"tags": [
"utility-token"
]
},
{
"chainId": 101,
"address": "CbNYA9n3927uXUukee2Hf4tm3xxkffJPPZvGazc2EAH1",
"symbol": "agEUR",
"name": "agEUR (Portal)",
"decimals": 8,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/CbNYA9n3927uXUukee2Hf4tm3xxkffJPPZvGazc2EAH1/logo.png",
"tags": [
"ethereum",
"wrapped",
"wormhole"
],
"extensions": {
"address": "0x1a7e4e63778B4f12a199C062f3eFdD288afCBce8",
"assetContract": "https://etherscan.io/address/0x1a7e4e63778B4f12a199C062f3eFdD288afCBce8",
"bridgeContract": "https://etherscan.io/address/0x3ee18B2214AFF97000D974cf647E7C347E8fa585",
"coingeckoId": "ageur",
"description": "Angle is the first decentralized, capital efficient and over-collateralized stablecoin protocol",
"discord": "https://discord.gg/z3kCpTaKMh",
"twitter": "https://twitter.com/AngleProtocol",
"website": "https://www.angle.money"
}
},
{
"chainId": 101,
"address": "31GpPxe1SW8pn7GXimM73paD8PZyCsmVSGTLkwUAJvZ8",
"symbol": "ANGLE",
"name": "ANGLE (Portal)",
"decimals": 8,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/31GpPxe1SW8pn7GXimM73paD8PZyCsmVSGTLkwUAJvZ8/logo.svg",
"tags": [
"ethereum",
"wrapped",
"wormhole"
],
"extensions": {
"address": "0x31429d1856ad1377a8a0079410b297e1a9e214c2",
"assetContract": "https://etherscan.io/address/0x31429d1856ad1377a8a0079410b297e1a9e214c2",
"bridgeContract": "https://etherscan.io/address/0x3ee18B2214AFF97000D974cf647E7C347E8fa585",
"coingeckoId": "angle-protocol",
"description": "Angle is the first decentralized, capital efficient and over-collateralized stablecoin protocol",
"discord": "https://discord.gg/z3kCpTaKMh",
"twitter": "https://twitter.com/AngleProtocol",
"website": "https://www.angle.money"
}
},
{
"chainId": 101,
"address": "G6nZYEvhwFxxnp1KZr1v9igXtipuB5zL6oDGNMRZqF3q",
"symbol": "BAD",
"name": "EA Bad",
"decimals": 9,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/G6nZYEvhwFxxnp1KZr1v9igXtipuB5zL6oDGNMRZqF3q/EABadlogo.PNG",
"tags": [
"utility-token",
"community-token",
"meme-token"
],
"extensions": {
"twitter": "https://twitter.com/EABadtoken"
}
},
{
"chainId": 101,
"address": "Fm9rHUTF5v3hwMLbStjZXqNBBoZyGriQaFM6sTFz3K8A",
"symbol": "MBS",
"name": "MonkeyBucks",
"decimals": 6,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/Fm9rHUTF5v3hwMLbStjZXqNBBoZyGriQaFM6sTFz3K8A/logo.png",
"tags": [
"utility-token",
"game-token",
"game-currency",
"GameFi",
"Gaming"
],
"extensions": {
"coingeckoId": "monkeyball",
"description": "MonkeyLeague is the next-gen esports metaverse empowering players to create, play, compete, and earn.",
"discord": "https://discord.gg/monkeyleague",
"facebook": "https://www.facebook.com/TheMonkeyLeague",
"instagram": "https://www.instagram.com/themonkeyleague/",
"medium": "https://medium.com/@MonkeyLeague",
"reddit": "https://www.reddit.com/r/MonkeyBallGame",
"telegram": "https://t.me/MonkeyLeague_Official",
"twitter": "https://twitter.com/TheMonkeyLeague",
"website": "https://www.monkeyleague.io/"
}
},
{
"chainId": 101,
"address": "FCuoMii64H5Ee4eVWBjP18WTFS8iLUJmGi16Qti1xFQ2",
"symbol": "EDB",
"name": "Emerald Block",
"decimals": 9,
"logoURI": "https://raw.githubusercontent.com/SBPToken/token-list/main/assets/mainnet/FCuoMii64H5Ee4eVWBjP18WTFS8iLUJmGi16Qti1xFQ2/logo.png",
"tags": [
"utility-token"
],
"extensions": {
"discord": "https://discord.gg/kzPBdWtbrK",
"instagram": "https://instagram.com/solblockpunks",
"twitter": "https://twitter.com/solblockpunks",
"website": "https://solblockpunks.com"
}
},
{
"chainId": 101,
"address": "HfYFjMKNZygfMC8LsQ8LtpPsPxEJoXJx4M6tqi75Hajo",
"symbol": "CWAR",
"name": "Cryowar Token",
"decimals": 9,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/HfYFjMKNZygfMC8LsQ8LtpPsPxEJoXJx4M6tqi75Hajo/logo.png",
"tags": [
"utility-token"
],
"extensions": {
"discord": "https://discord.com/invite/cryowar",
"telegram": "https://t.me/cryowar",
"twitter": "https://twitter.com/CryowarDevs",
"website": "https://cryowar.com"
}
},
{
"chainId": 101,
"address": "BqRtfrNpvRAW3KW319hvhPoTu76wKU2LTdXJyG9CyDze",
"symbol": "ECHO",
"name": "EchoDao",
"decimals": 9,
"logoURI": "https://i.imgur.com/HnnxQND.png",
"tags": [
"utility-token",
"DAO-fork"
],
"extensions": {
"discord": "https://discord.com/invite/NtvVPs4WnY",
"serumV3Usdc": "8bjQ8XvzrDxKxHhTccpLkqGLbBrCAAPuv6KHrgN95nDW",
"twitter": "https://twitter.com/echodao_sol",
"website": "https://echodao.xyz"
}
},
{
"chainId": 101,
"address": "HCXXtXPasqcF4BVsrPQPfHMQPUofoCbDbjsTUANFSHDR",
"symbol": "MONKE",
"name": "MONKE TOKEN",
"decimals": 9,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/HCXXtXPasqcF4BVsrPQPfHMQPUofoCbDbjsTUANFSHDR/logo.png",
"tags": [
"community-token",
"meme-token"
],
"extensions": {
"website": "https://monketoken.xyz/"
}
},
{
"chainId": 101,
"address": "7gfwZiMD3B6hJWxejr4E3PdsfyVndfuGuk97LfDhJNNh",
"symbol": "DIBU",
"name": "DickButt",
"decimals": 9,
"logoURI": "https://cdn.jsdelivr.net/gh/xRoBBeRT/DickButtLogo/DickButt.png",
"tags": [
"community-token",
"meme-token"
],
"extensions": {
"discord": "https://discord.com/invite/solanadickbutt",
"twitter": "https://twitter.com/SolanaDickButt",
"website": "https://solanadickbutt.com"
}
},
{
"chainId": 101,
"address": "6JdcMdhqgCtcP4U9tieRqmKLhPLxRMLC67QfmdXAJBvZ",
"symbol": "KITTY",
"name": "KITTY SOLANA",
"decimals": 6,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/6JdcMdhqgCtcP4U9tieRqmKLhPLxRMLC67QfmdXAJBvZ/logo.png",
"tags": [
"meme-token"
],
"extensions": {
"coingeckoId": "kitty-solana",
"coinmarketcap": "https://coinmarketcap.com/currencies/kitty-solana/",
"discord": "https://discord.gg/XaRfbtsscz",
"serumV3Usdc": "8bjQ8XvzrDxKxHhTccpLkqGLbBrCAAPuv6KHrgN95nDW",
"twitter": "https://twitter.com/kitty_solana",
"website": "https://kittysolana.com/"
}
},
{
"chainId": 101,
"address": "HDiA4quoMibAGeJQzvxajp3Z9cvnkNng99oVrnuNj6px",
"symbol": "KSAMO",
"name": "KING SAMO",
"decimals": 6,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/HDiA4quoMibAGeJQzvxajp3Z9cvnkNng99oVrnuNj6px/logo.png",
"tags": [
"meme-token"
],
"extensions": {
"discord": "https://discord.com/invite/R8QhkNHn",
"telegram": "https://t.me/TokenKingSamo",
"twitter": "https://twitter.com/kingsamocoin",
"website": "https://kingsamo.com"
}
},
{
"chainId": 101,
"address": "73YQDsoPB3t5n5GqX53tKrwJK1n6HCZ935MEbo2gEYU5",
"symbol": "KAJAME",
"name": "Kajame",
"decimals": 4,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/73YQDsoPB3t5n5GqX53tKrwJK1n6HCZ935MEbo2gEYU5/logo.png",
"tags": [
"meme-token",
"social-token",
"community-token"
],
"extensions": {
"blog": "https://blog.me-idea.in.th",
"website": "https://kajame.xyz"
}
},
{
"chainId": 101,
"address": "DJKX1cX2SPPaTdYBeuriUeQUUEpi2UGBGGPQthNMrgaa",
"symbol": "MONKE",
"name": "MONKE TOKEN",
"decimals": 9,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/DJKX1cX2SPPaTdYBeuriUeQUUEpi2UGBGGPQthNMrgaa/logo.png",
"tags": [
"community-token",
"meme-token"
],
"extensions": {
"website": "https://monketoken.xyz/"
}
},
{
"chainId": 101,
"address": "6TgvYd7eApfcZ7K5Mur7MaUQ2xT7THB4cLHWuMkQdU5Z",
"symbol": "OTR",
"name": "Otter Finance",
"decimals": 9,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/6TgvYd7eApfcZ7K5Mur7MaUQ2xT7THB4cLHWuMkQdU5Z.png",
"tags": [
"meme-token"
],
"extensions": {
"discord": "https://discord.gg/chfgc9wxnw",
"serumV3Usdc": "4k4WXdmrWjCG71E4pxMs6SQRRB5cypGNYatKb2iMnqN4",
"twitter": "https://twitter.com/otter_finance",
"website": "http://www.otterfinance.site"
}
},
{
"chainId": 101,
"address": "382HfaEjcUNhwoGbYmL58DVX8GUvjrXiTPchCWKjchWA",
"symbol": "SPLN",
"name": "SHEEPLANA",
"decimals": 6,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/382HfaEjcUNhwoGbYmL58DVX8GUvjrXiTPchCWKjchWA.png",
"tags": [
"meme-token"
],
"extensions": {
"discord": "https://discord.gg/zV9dyHfxGb",
"twitter": "https://twitter.com/sheeplana_coin",
"website": "https://www.sheeplana.online/"
}
},
{
"chainId": 101,
"address": "EH49ziLeKhJtzUzdys5238pSKpvrgJvmi3EStrZ9QaY7",
"symbol": "RAC",
"name": "Rainc",
"decimals": 4,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/EH49ziLeKhJtzUzdys5238pSKpvrgJvmi3EStrZ9QaY7/logo.png",
"tags": [
"meme-token"
],
"extensions": {
"discord": "https://discord.io/rainc",
"serumV3Usdc": "21eq7jsx59jPFo2gt4npreKu1voURzcjyPniBdgupuQC",
"twitter": "https://twitter.com/raincproject",
"website": "https://www.raincsol.com/"
}
},
{
"chainId": 101,
"address": "2mDJPcvv7vigZo9ZPxhHLpKQSixCkbohVY35eX6NkN6m",
"symbol": "TBK",
"name": "TokenBook",
"decimals": 9,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/2mDJPcvv7vigZo9ZPxhHLpKQSixCkbohVY35eX6NkN6m/logo.png",
"tags": [
"meme-token"
],
"extensions": {
"serumV3Usdc": "DoL5SXaax9LwQM9JfqFBymiUfSxH9A9cwPugPuHvNTDM",
"twitter": "https://twitter.com/TokenBook_tbk"
}
},
{
"chainId": 101,
"address": "DcvJP16Cw5oqTbtHmpJ4JGXaqBvV5m6eMZj5rGsFLpwU",
"symbol": "BOOGI",
"name": "BABY OOGI",
"decimals": 4,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/DcvJP16Cw5oqTbtHmpJ4JGXaqBvV5m6eMZj5rGsFLpwU/logo.png",
"tags": [
"community-token",
"meme-token"
],
"extensions": {
"twitter": "https://twitter.com/babyoogi_",
"website": "https://babyoogi.xyz/"
}
},
{
"chainId": 101,
"address": "48iGP5MUTZ8DCfDvZ9dpgKySP2iekQ3zPKZM8AhDjEmw",
"symbol": "VIRAL",
"name": "Viraverse",
"decimals": 6,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/48iGP5MUTZ8DCfDvZ9dpgKySP2iekQ3zPKZM8AhDjEmw/logo.png",
"tags": [
"stake-pool-token",
"utility-token",
"security-token",
"community-token",
"viraverse"
],
"extensions": {
"discord": "https://discord.gg/EwVdMYvEgV",
"telegram": "https://t.me/viraverseio",
"twitter": "https://twitter.com/viraverseio",
"website": "https://viraverse.io"
}
},
{
"chainId": 101,
"address": "2WnVfjtW9QttRwqxn3RPnHBFHMR3cyA5Ca3zug41Q9Xb",
"symbol": "HNI",
"name": "Golden Techie Hannibal Token",
"decimals": 0,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/2WnVfjtW9QttRwqxn3RPnHBFHMR3cyA5Ca3zug41Q9Xb/logo.png",
"tags": [
"social-token"
],
"extensions": {
"website": "https://crpanadasoft.com"
}
},
{
"chainId": 101,
"address": "CgbJxXyaHeU8VsquBpySuFXA94b6LWXxioZ28wRr8fs9",
"symbol": "VINU",
"name": "Viral Inu",
"decimals": 6,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/CgbJxXyaHeU8VsquBpySuFXA94b6LWXxioZ28wRr8fs9/logo.png",
"tags": [
"stake-pool-token",
"utility-token",
"meme-token",
"community-token"
],
"extensions": {
"discord": "https://discord.gg/zpJ7zADRZ5",
"telegram": "https://t.me/viralinu",
"twitter": "https://twitter.com/ViralInu",
"website": "https://viralinu.com"
}
},
{
"chainId": 101,
"address": "6bLp99VoqKU1C3Qp6VTNvSoCoc78jMGxPkGSSopq8wHB",
"symbol": "Paws",
"name": "Solana Paws",
"decimals": 2,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/6bLp99VoqKU1C3Qp6VTNvSoCoc78jMGxPkGSSopq8wHB/logo.png",
"tags": [
"meme-token",
"community",
"doge",
"Paws"
],
"extensions": {
"discord": "https://discord.gg/sVP35wfPhX",
"twitter": "https://twitter.com/Sol_Paws",
"website": "https://www.solanapaws.com"
}
},
{
"chainId": 101,
"address": "GGupQCMnyEmHKcqFu72qCTm6yEYpVyhouY9dSAMEXLsC",
"symbol": "DOGEC",
"name": "Dogecoin Cash",
"decimals": 9,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/GGupQCMnyEmHKcqFu72qCTm6yEYpVyhouY9dSAMEXLsC/logo.png",
"tags": [
"community-token",
"meme-token",
"doge",
"dogecoin"
],
"extensions": {
"twitter": "https://twitter.com/dogec_cash",
"website": "https://www.dogecoincash.info"
}
},
{
"chainId": 101,
"address": "2d9LcdAQCnxPHSca6frjQzYKapNzB7caSuLKpeWBctvT",
"symbol": "Taboo",
"name": "TABOO TOKEN",
"decimals": 9,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/2d9LcdAQCnxPHSca6frjQzYKapNzB7caSuLKpeWBctvT/logo.png",
"tags": [
"community-token",
"Taboo-token",
"Taboo",
"Videos"
]
},
{
"chainId": 101,
"address": "CrhUSH7FDwB37BYvPsVnVbsGVeE81biBzfkD4A4fyJMv",
"symbol": "Vikings",
"name": "Viking Legend",
"decimals": 9,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/CrhUSH7FDwB37BYvPsVnVbsGVeE81biBzfkD4A4fyJMv/logo.png",
"tags": [
"community-token",
"viking-token",
"floki",
"nfts"
]
},
{
"chainId": 101,
"address": "3BYQt5MtdUSDkGwPa7F5pxFNx6csyUK2zAqNgoAsQ96h",
"symbol": "VIKINGxFLOKI",
"name": "VIKINGxFLOKI",
"decimals": 9,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/3BYQt5MtdUSDkGwPa7F5pxFNx6csyUK2zAqNgoAsQ96h/logo.png",
"tags": [
"community-token",
"viking-token",
"viking-floki",
"nfts"
]
},
{
"chainId": 101,
"address": "zWxLppNEHinqYbQffzp2T5yNXUzyQUsHZ39nxjTqk6F",
"symbol": "METAS",
"name": "Meta Syndrome",
"decimals": 9,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/zWxLppNEHinqYbQffzp2T5yNXUzyQUsHZ39nxjTqk6F/logo.png",
"tags": [
"community-token",
"meta-token",
"meta-mark",
"nfts"
]
},
{
"chainId": 101,
"address": "8sMa1Jfcpt2eSkKDtcd6rurX27gqxkrEvXn5jHt3suGB",
"symbol": "DGMOON",
"name": "DogeMoonxSOL",
"decimals": 9,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/8sMa1Jfcpt2eSkKDtcd6rurX27gqxkrEvXn5jHt3suGB/logo.png",
"tags": [
"community-token",
"doge-token",
"doge",
"nfts"
]
},
{
"chainId": 101,
"address": "8g9kLFgtHF4kMVjGbpnPNUU8QbxMHpLZTKhAJyvwr9on",
"symbol": "MCAT",
"name": "Meta Cat",
"decimals": 9,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/8g9kLFgtHF4kMVjGbpnPNUU8QbxMHpLZTKhAJyvwr9on/logo.png",
"tags": [
"community-token",
"cat-token",
"cat",
"nfts",
"meta",
"Facebook"
]
},
{
"chainId": 101,
"address": "H5TA9LexsmmvLM49zdEkbaPCcHJed8TTFtRqny81tEaK",
"symbol": "xVideos",
"name": "xVideo Token",
"decimals": 9,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/H5TA9LexsmmvLM49zdEkbaPCcHJed8TTFtRqny81tEaK/logo.png",
"tags": [
"community-token",
"platform",
"videos",
"payment"
]
},
{
"chainId": 101,
"address": "roCKojKezC7HhPxph5qb4UBasvmZJWgegCF57PvaV2f",
"symbol": "ROCK",
"name": "RockDeFi",
"decimals": 6,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/roCKojKezC7HhPxph5qb4UBasvmZJWgegCF57PvaV2f/logo.png",
"tags": [
"stablecoin",
"asset"
],
"extensions": {
"website": "https://rockdefi.app/"
}
},
{
"chainId": 101,
"address": "FeGm2DB4EWHm2LS8ABnRatzARDRYFyUPkLsSJkJwBuSu",
"symbol": "FKM",
"name": "FLOKIMUSK (Portal)",
"decimals": 8,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/FeGm2DB4EWHm2LS8ABnRatzARDRYFyUPkLsSJkJwBuSu/logo.png",
"tags": [
"wrapped",
"wormhole"
],
"extensions": {
"address": "0xc999f49bb48179d5df09402a4a7a4034bc039f81",
"assetContract": "https://bscscan.com/address/0xc999f49bb48179d5df09402a4a7a4034bc039f81",
"bridgeContract": "https://bscscan.com/address/0xB6F6D86a8f9879A9c87f643768d9efc38c1Da6E7",
"twitter": "https://twitter.com/flokimuskmeme",
"website": "https://flokimuskweb.com"
}
},
{
"chainId": 101,
"address": "usdrQqxAGgWsBRzzcckAi9ZAzHp19rFCNn87p4Q8Eir",
"symbol": "USDR",
"name": "RockDeFi Stablecoin",
"decimals": 6,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/usdrQqxAGgWsBRzzcckAi9ZAzHp19rFCNn87p4Q8Eir/logo.png",
"tags": [
"stablecoin",
"asset"
],
"extensions": {
"website": "https://rockdefi.app/"
}
},
{
"chainId": 101,
"address": "9cU8yLEAidMNVGEq6QHPe2ktN7SV2qqvLABth8YiSwYx",
"symbol": "PARM",
"name": "Parm Coin",
"decimals": 6,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/9cU8yLEAidMNVGEq6QHPe2ktN7SV2qqvLABth8YiSwYx/logo.png",
"tags": [
"community-token",
"meme-token"
],
"extensions": {
"twitter": "https://twitter.com/theeggplantNFT",
"website": "https://www.eggplantparty.com"
}
},
{
"chainId": 101,
"address": "A9Nc6Yo9YGKsaeAb2nsQFSQpLcdotGqjEJmEQFzZeeqX",
"symbol": "GM",
"name": "Good Morning Coin",
"decimals": 9,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/A9Nc6Yo9YGKsaeAb2nsQFSQpLcdotGqjEJmEQFzZeeqX/logo.png",
"tags": [
"meme-token",
"community-token"
],
"extensions": {
"website": "https://goodmorning.money"
}
},
{
"chainId": 101,
"address": "AMp8Jo18ZjK2tuQGfjKAkkWnVP4NWX5sav4NJH6pXF2D",
"symbol": "ASTRA",
"name": "AstraPad",
"decimals": 9,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/AMp8Jo18ZjK2tuQGfjKAkkWnVP4NWX5sav4NJH6pXF2D/logo.png",
"tags": [
"Launchpad",
"NFT"
],
"extensions": {
"coingeckoId": "astrapad",
"telegram": "https://t.me/AstraPadANN",
"twitter": "https://twitter.com/astrapadio",
"website": "https://astrapad.io/"
}
},
{
"chainId": 101,
"address": "45u9AsJtN2KkYpH6GCXtwuoDF7HwgMjTQ84xfH6SJYQy",
"symbol": "PUT",
"name": "Pedals Up Token",
"decimals": 10,
"logoURI": "https://cdn.jsdelivr.net/gh/devdutt6/PedalsUpToken/Pedals/pedals.png",
"tags": [
"personal",
"development"
],
"extensions": {
"website": "https://pedalsup.com/"
}
},
{
"chainId": 101,
"address": "2kzNeq9Yc6rghrgSfat3cvBkmK9JiePaLv7B4r1YKGDX",
"symbol": "FUTT",
"name": "Futtbucks",
"decimals": 9,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/2kzNeq9Yc6rghrgSfat3cvBkmK9JiePaLv7B4r1YKGDX/logo.png",
"tags": [
"community-token",
"currency"
],
"extensions": {
"instagram": "https://www.instagram.com/futt.bucks/",
"website": "https://futtbucks.com/"
}
},
{
"chainId": 101,
"address": "DE3Tv7eWpXGanVQC9RW1P9RG6AHWtC8VgYS9hRRVcF93",
"symbol": "FUTT",
"name": "Futtbucks",
"decimals": 9,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/2kzNeq9Yc6rghrgSfat3cvBkmK9JiePaLv7B4r1YKGDX/logo.png",
"tags": [
"community-token",
"currency"
],
"extensions": {
"instagram": "https://www.instagram.com/futt.bucks/",
"website": "https://futtbucks.com/"
}
},
{
"chainId": 101,
"address": "6SKogZxCWY9jKsKPMT3ChJUhQxAEeB6NjVidXQK6TEdW",
"symbol": "GDoge",
"name": "Golden Doge Solana",
"decimals": 1,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/6SKogZxCWY9jKsKPMT3ChJUhQxAEeB6NjVidXQK6TEdW/Logo.png",
"tags": [
"community-token",
"meme-token",
"doge",
"dogecoin"
],
"extensions": {
"twitter": "https://twitter.com/GoldSolDoge",
"website": "https://http://www.goldsoldoge.com/"
}
},
{
"chainId": 101,
"address": "FaiPGacTM7YBmacumbg4ZnDx7sKtGcG3LkcVoqfddEA7",
"symbol": "BULL",
"name": "theBULL Coin",
"decimals": 0,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/FaiPGacTM7YBmacumbg4ZnDx7sKtGcG3LkcVoqfddEA7/logo.png",
"tags": [
"community-token",
"meme-token",
"NFT"
],
"extensions": {
"discord": "https://discord.com/invite/B6sd88UVmD",
"twitter": "https://twitter.com/theBULL_NFT"
}
},
{
"chainId": 101,
"address": "2XSuy8RSESbtYRBbVHxGWuoikn3B6iXKVKzN4i3owTCf",
"symbol": "BSAMO",
"name": "BUFF SAMO",
"decimals": 9,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/2XSuy8RSESbtYRBbVHxGWuoikn3B6iXKVKzN4i3owTCf/logo.png",
"tags": [
"community-token"
],
"extensions": {
"coingeckoId": "buff-samo",
"coinmarketcap": "https://coinmarketcap.com/currencies/buff-samo/",
"discord": "https://discord.link/BuffSamo",
"twitter": "https://twitter.com/buffsamo",
"website": "http://buffsamo.tech/"
}
},
{
"chainId": 101,
"address": "DNmxHPgeVLSofyAriirHybKoNx1baM2ufiHKs1W7YyPc",
"symbol": "RPN",
"name": "RoyalPangolins",
"decimals": 9,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/DNmxHPgeVLSofyAriirHybKoNx1baM2ufiHKs1W7YyPc/logo.png",
"extensions": {
"discord": "https://discord.gg/XvjxsRzK",
"twitter": "https://twitter.com/RoyalPangolins",
"website": "https://royalpangolins.io/"
}
},
{
"chainId": 101,
"address": "FdnEZ71hjabwo6Eo6XHGyK4QrE1tVQtBoTGMmgWYAuDn",
"symbol": "GDoge",
"name": "Gold Doge Solana",
"decimals": 6,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/FdnEZ71hjabwo6Eo6XHGyK4QrE1tVQtBoTGMmgWYAuDn/logo.png",
"tags": [
"community-token",
"meme-token",
"doge",
"dogecoin"
],
"extensions": {
"twitter": "https://twitter.com/GoldSolDoge",
"website": "https://http://www.goldsoldoge.com/"
}
},
{
"chainId": 101,
"address": "4eG64sB6SpvXve4WoRAN956UFKoETLP4JDyMU51TMdep",
"symbol": "WZWT",
"name": "WIZ WIT Token",
"decimals": 9,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/4eG64sB6SpvXve4WoRAN956UFKoETLP4JDyMU51TMdep/logo.png",
"tags": [
"meme-token"
],
"extensions": {
"description": "The world's 1st cheesesteak-based currency, brought to you by the City of Brotherly Love (Philly!!!).",
"discord": "https://discord.gg/ptYZPtxZf4",
"twitter": "https://twitter.com/phillytoken",
"website": "https://phillytoken.com"
}
},
{
"chainId": 101,
"address": "Bjgh4YsLdicr8WArz9ftdSmpWNcQjsZ9KV3w9fkjiLG",
"symbol": "SOLRC",
"name": "SolRaca",
"decimals": 8,
"logoURI": "https://raw.githubusercontent.com/Solraca/token-list/main/assets/mainnet/Bjgh4YsLdicr8WArz9ftdSmpWNcQjsZ9KV3w9fkjiLG/solraca.png",
"tags": [
"meme-token"
],
"extensions": {
"telegram": "https://t.me/solracaofficial"
}
},
{
"chainId": 101,
"address": "45HfvXJHY9msY2i4EmUpume1mSMLUvdaWsJRbctAobQM",
"symbol": "INU",
"name": "Monster Inu",
"decimals": 0,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/45HfvXJHY9msY2i4EmUpume1mSMLUvdaWsJRbctAobQM/logo.png",
"tags": [
"meme-token",
"metaverse"
],
"extensions": {
"twitter": "https://twitter.com/inumonster",
"website": "https://inu.monster"
}
},
{
"chainId": 101,
"address": "FEYFyLCFLcBNfSuaf2eXNvyY5Jpii7zg9X48Br5vyenG",
"symbol": "SUSDT",
"name": "Stether",
"decimals": 2,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/FEYFyLCFLcBNfSuaf2eXNvyY5Jpii7zg9X48Br5vyenG/logo.png",
"tags": [
"stablecoin"
],
"extensions": {
"website": "https://stether.io/"
}
},
{
"chainId": 102,
"address": "8ZY7EkwN7LxifYvvrQDbpjqxkrjHUFMwWgq8fupNNvub",
"symbol": "BIAD",
"name": "daib test token",
"decimals": 6,
"logoURI": "https://s3.us-west-2.amazonaws.com/secure.notion-static.com/02242929-14bc-4204-ac71-56d855a07078/512_daia.png?X-Amz-Algorithm=AWS4-HMAC-SHA256\u0026X-Amz-Credential=AKIAT73L2G45O3KS52Y5%2F20211104%2Fus-west-2%2Fs3%2Faws4_request\u0026X-Amz-Date=20211104T051518Z\u0026X-Amz-Expires=86400\u0026X-Amz-Signature=df1424dcb1be408faa45ef6af1f7769edf977da365822e00c34a2150167bfe58\u0026X-Amz-SignedHeaders=host\u0026response-content-disposition=filename%20%3D%22512_daia.png%22",
"extensions": {
"website": "https://daios.io/"
}
},
{
"chainId": 101,
"address": "4JEaBv49a4KdSrMduKZS3PcBCcPmPEmaY3uP7kXv6cj6",
"symbol": "$ASS",
"name": "Ass Coin",
"decimals": 9,
"logoURI": "https://raw.githubusercontent.com/daddydonke/gem-farm-ui/main/public/images/icon.png",
"tags": [
"MEMES-TOKEN",
"NFTS",
"DEX"
],
"extensions": {
"twitter": "https://twitter.com/solanadonkeBs",
"website": "https://solanadonkey.business"
}
},
{
"chainId": 101,
"address": "X71v8NH6dbLwPsn4TR1Tx38K4uWgGZ78mC599XSPJox",
"symbol": "SNS",
"name": "NSPACE Supporter",
"decimals": 9,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/X71v8NH6dbLwPsn4TR1Tx38K4uWgGZ78mC599XSPJox/logo.png",
"tags": [
"utility-token"
],
"extensions": {
"discord": "https://discord.gg/NJjqzzXNKb",
"twitter": "https://twitter.com/mynftspace_art",
"website": "http://mynftspace.art/"
}
},
{
"chainId": 101,
"address": "NpgsBSfavf5hmUeGQAbMz5pHDtXhn9ZFNRQypTr8Tfv",
"symbol": "NSPACE",
"name": "My NFT Space",
"decimals": 9,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/NpgsBSfavf5hmUeGQAbMz5pHDtXhn9ZFNRQypTr8Tfv/logo.png",
"tags": [
"utility-token"
],
"extensions": {
"discord": "https://discord.gg/NJjqzzXNKb",
"twitter": "https://twitter.com/mynftspace_art",
"website": "http://mynftspace.art/"
}
},
{
"chainId": 101,
"address": "67Z7Pr4pX5iMczBox2bCgeU7Dy6SJRm2kZaMJoptstse",
"symbol": "KOMO",
"name": "Komondor",
"decimals": 9,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/67Z7Pr4pX5iMczBox2bCgeU7Dy6SJRm2kZaMJoptstse/logo.svg",
"tags": [
"community-token"
],
"extensions": {
"description": "KOMO is a community token, Dex, and Dapps on Solana.",
"discord": "https://discord.gg/yMVPDuZKeq",
"facebook": "https://web.facebook.com/komondor.so",
"github": "https://github.com/komondorok",
"instagram": "https://instagram.com/komondor.so",
"medium": "https://komondorok.medium.com/",
"telegram": "https://t.me/komondor_ann",
"twitter": "https://twitter.com/komondor_so",
"website": "https://komondor.so/"
}
},
{
"chainId": 101,
"address": "p31qJ7LDLNRC57rU5GsXxFGBsnXheFXSsEn3avPoKDc",
"symbol": "ART",
"name": "Artchive-Coin",
"decimals": 8,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/p31qJ7LDLNRC57rU5GsXxFGBsnXheFXSsEn3avPoKDc/logo.png",
"tags": [
"utility-token",
"community-token",
"governance-token"
],
"extensions": {
"instagram": "https://www.instagram.com/artchive.nft/",
"website": "https://artchivecoins.com/"
}
},
{
"chainId": 101,
"address": "BiDB55p4G3n1fGhwKFpxsokBMqgctL4qnZpDH1bVQxMD",
"symbol": "DIO",
"name": "Decimated",
"decimals": 9,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/BiDB55p4G3n1fGhwKFpxsokBMqgctL4qnZpDH1bVQxMD/logo.png",
"tags": [
"decimated",
"DIO",
"videogame",
"utility-token",
"virtual-currency"
],
"extensions": {
"twitter": "https://twitter.com/decimated_game",
"website": "https://www.decimated.net"
}
},
{
"chainId": 101,
"address": "7QTcx3LuVfPSZxVzFJcTmbpQCL35jkfoNSzx4qouX495",
"symbol": "AKELA",
"name": "AKELA",
"decimals": 9,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/7QTcx3LuVfPSZxVzFJcTmbpQCL35jkfoNSzx4qouX495/logo.svg",
"tags": [
"Akela",
"Meme"
],
"extensions": {
"discord": "https://discord.gg/vBHgckmR",
"medium": "https://medium.com/@akelasolana",
"twitter": "https://twitter.com/AkelaTOKEN",
"website": "https://akelatoken.com"
}
},
{
"chainId": 101,
"address": "3EkHyexJLGCvSxzn5umbtd9N69GoT4p5pfdLTFqCNP9Y",
"symbol": "HIPPO",
"name": "Hippo Coin",
"decimals": 9,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/3EkHyexJLGCvSxzn5umbtd9N69GoT4p5pfdLTFqCNP9Y/logo.png",
"tags": [
"meme-token",
"community-token"
],
"extensions": {
"coingeckoId": "hippo-coin",
"discord": "https://discord.gg/sk3xN3sA8D",
"serumV3Usdc": "HnLKrfMN64ccSbYCj4DxjgPYveSkFujYrnMr4cvPfL8",
"twitter": "https://twitter.com/HipposCoin",
"website": "https://hippofamilynft.com/"
}
},
{
"chainId": 101,
"address": "BLT1noyNr3GttckEVrtcfC6oyK6yV1DpPgSyXbncMwef",
"symbol": "BLT",
"name": "Blocto Token",
"decimals": 8,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/BLT1noyNr3GttckEVrtcfC6oyK6yV1DpPgSyXbncMwef/logo.png",
"tags": [
"utility-token"
],
"extensions": {
"telegram": "https://t.me/blocto",
"twitter": "https://twitter.com/BloctoApp",
"website": "https://blocto.portto.com/"
}
},
{
"chainId": 101,
"address": "FoqP7aTaibT5npFKYKQQdyonL99vkW8YALNPwWepdvf5",
"symbol": "BIP",
"name": "BIP",
"decimals": 9,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/FoqP7aTaibT5npFKYKQQdyonL99vkW8YALNPwWepdvf5/logo.png",
"tags": [
"NFT",
"utility-token"
],
"extensions": {
"discord": "https://discord.gg/solanadbs",
"serumV3Usdc": "9tr5uMYHgtJ5yG4SeqHA6kJUdzXrK6QCNGYgewQevuuS",
"twitter": "https://twitter.com/solanadbs",
"website": "https://www.thestarship.finance/"
}
},
{
"chainId": 101,
"address": "2R78szN1fZeQvSmeiUPe7Db7BFTPee5EVE2FduQx8Wtw",
"symbol": "USDMD",
"name": "MONDOCOIN",
"decimals": 9,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/2R78szN1fZeQvSmeiUPe7Db7BFTPee5EVE2FduQx8Wtw/logo.png",
"extensions": {
"twitter": "https://twitter.com/mondocoin_usdmd",
"website": "https://mondocoin.org/"
}
},
{
"chainId": 101,
"address": "BYLotMdQmq579hhP9xDcuCJky9kmMrbp77eoktmm7a5Y",
"symbol": "CKG",
"name": "CryptoKnight's Gold",
"decimals": 6,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/BYLotMdQmq579hhP9xDcuCJky9kmMrbp77eoktmm7a5Y/logo.png",
"tags": [
"NFT",
"utility-token"
],
"extensions": {
"discord": "https://discord.gg/SYpnu7pTPS",
"twitter": "https://twitter.com/CryptoKnightSOL",
"website": "https://www.cryptoknights.me/"
}
},
{
"chainId": 101,
"address": "F9tytWqLUAPXQTy6dejGtSgvJQZWYC71naD5bCi6caGX",
"symbol": "INUGAMI",
"name": "INUGAMI Coin",
"decimals": 6,
"logoURI": "https://raw.githubusercontent.com/INVESTOR888/content/main/F9tytWqLUAPXQTy6dejGtSgvJQZWYC71naD5bCi6caGX.png",
"tags": [
"meme-token"
],
"extensions": {
"twitter": "https://twitter.com/inugamicoin",
"website": "https://inugamicoin.com"
}
},
{
"chainId": 101,
"address": "B7RDhZ2iqE4FEwK5nfcZ9r2xhVL6rQJCo1dcjDXnF688",
"symbol": "LAT",
"name": "Latte",
"decimals": 8,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/B7RDhZ2iqE4FEwK5nfcZ9r2xhVL6rQJCo1dcjDXnF688/logo.png",
"extensions": {
"twitter": "https://twitter.com/lattenft",
"website": "https://www.lattetoken.com"
}
},
{
"chainId": 101,
"address": "7Q2afV64in6N6SeZsAAB81TJzwDoD6zpqmHkzi9Dcavn",
"symbol": "JSOL",
"name": "JPOOL Solana Token",
"decimals": 9,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/7Q2afV64in6N6SeZsAAB81TJzwDoD6zpqmHkzi9Dcavn/logo.svg",
"tags": [
"stake-pool-token",
"utility-token"
],
"extensions": {
"discord": "https://discord.gg/qR4BA9QXVR",
"telegram": "https://t.me/jpoolsolana",
"twitter": "https://twitter.com/JPoolSolana",
"website": "https://jpool.one/"
}
},
{
"chainId": 101,
"address": "7JYZmXjHenJxgLUtBxgYsFfoABmWQFA1fW3tHQKUBThV",
"symbol": "WEED",
"name": "Solana Weed",
"decimals": 6,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/7JYZmXjHenJxgLUtBxgYsFfoABmWQFA1fW3tHQKUBThV/logo.png",
"tags": [
"social-token",
"utility-token"
],
"extensions": {
"discord": "https://discord.gg/3cshJ2gVz6",
"telegram": "https://t.me/Solanaweed",
"twitter": "https://twitter.com/SolanaWeed",
"website": "https://solanaweed.com/"
}
},
{
"chainId": 101,
"address": "GaAzf7jwEKTouDXJExH9TKfvX3Ae7fLaGwNuEajq7KsE",
"symbol": "BARK",
"name": "Bark o Finance",
"decimals": 1,
"logoURI": "https://i.imgur.com/X90vi6d.png",
"tags": [
"meme-token",
"utility-token"
],
"extensions": {
"twitter": "https://twitter.com/Bark_Solana"
}
},
{
"chainId": 101,
"address": "5jFnsfx36DyGk8uVGrbXnVUMTsBkPXGpx6e69BiGFzko",
"symbol": "INU",
"name": "Solana INU",
"decimals": 9,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/5jFnsfx36DyGk8uVGrbXnVUMTsBkPXGpx6e69BiGFzko/logo.png",
"tags": [
"Meme-token"
],
"extensions": {
"coingeckoId": "solana-inu",
"discord": "https://discord.gg/solanainu",
"serumV3Usdc": "G3Bss3a2tif6eHNzWCh14g5k2H4rwBAmE42tbckUWG5T",
"twitter": "https://twitter.com/solanainu",
"website": "http://solanainu.org"
}
},
{
"chainId": 101,
"address": "GJsBLZPMConURkFkewZskmJLFjnYVSENZtHjqV7GnohC",
"symbol": "EMON",
"name": "DORAEMON TOKEN FANS",
"decimals": 9,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/GJsBLZPMConURkFkewZskmJLFjnYVSENZtHjqV7GnohC/logo.png",
"tags": [
"MEMES-TOKEN",
"NFTs",
"DEX"
],
"extensions": {
"telegram": "https://t.me/emontoken",
"twitter": "https://twitter.com/emontoken",
"website": "https://doraemon.org"
}
},
{
"chainId": 101,
"address": "7mNihWEjzWv9yCZc8capE4mS8v5Xvp5YH2yQhtZrQV5B",
"symbol": "SBreakpoint",
"name": "Solana Breakpoint",
"decimals": 9,
"logoURI": "https://raw.githubusercontent.com/tribeland/token-list/main/assets/mainnet/7mNihWEjzWv9yCZc8capE4mS8v5Xvp5YH2yQhtZrQV5B/logo.png",
"tags": [
"meme-token"
],
"extensions": {
"discord": "https://discord.gg/8jSUfzjjDG"
}
},
{
"chainId": 101,
"address": "6Km8PRUQxPmNX6EhmAuu3sFEnCP6uT2Yt42zPFR6VNnD",
"symbol": "RUG",
"name": "RugCoin",
"decimals": 8,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/6Km8PRUQxPmNX6EhmAuu3sFEnCP6uT2Yt42zPFR6VNnD/logo.png",
"tags": [
"community-token",
"meme-token",
"rug"
],
"extensions": {
"website": "https://rugcoin.rip"
}
},
{
"chainId": 101,
"address": "JTTez7NDqtU4ZqZJmLLXt6K9f75izfTApQqmvMCn4jU",
"symbol": "JTT",
"name": "Japan Travel Token",
"decimals": 0,
"logoURI": "http://www.japantravel.me/jtticon.png",
"tags": [
"utility-token"
],
"extensions": {
"website": "https://www.japantravel.me"
}
},
{
"chainId": 101,
"address": "7K1ad6gYMDbRssecDkGdGpaRueSezZpgD28uYsyaEA8f",
"symbol": "SLNACK",
"name": "SolNack",
"decimals": 9,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/7K1ad6gYMDbRssecDkGdGpaRueSezZpgD28uYsyaEA8f/logo.png",
"tags": [
"social-token",
"utility-token"
],
"extensions": {
"twitter": "https://twitter.com/Solnack_NFT",
"website": "https://www.solnack.io/"
}
},
{
"chainId": 101,
"address": "8hK6Vq53gwwYmvM2HuEeycGFn6ZDfynccHSuNJhWrTyd",
"symbol": "1Coin",
"name": "1Coin",
"decimals": 10,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/8hK6Vq53gwwYmvM2HuEeycGFn6ZDfynccHSuNJhWrTyd/logo.png",
"tags": [
"social-token",
"utility-token",
"social-token"
],
"extensions": {
"github": "https://github.com/1coin1",
"twitter": "https://twitter.com/1coincx",
"website": "https://1coin.cx"
}
},
{
"chainId": 101,
"address": "3SaUThdYFoUX2FYUi9ZPf2TKTu3UYKhNHhXb2Y6najRg",
"symbol": "HIT",
"name": "Hello Token",
"decimals": 9,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/3SaUThdYFoUX2FYUi9ZPf2TKTu3UYKhNHhXb2Y6najRg/logo.png",
"tags": [
"utility-token"
],
"extensions": {
"facebook": "https://www.facebook.com/Hello-Entertainment-103715111864185",
"website": "https://app.gethello.net"
}
},
{
"chainId": 101,
"address": "9ae76zqD3cgzR9gvf5Thc2NN3ACF7rqqnrLqxNzgcre6",
"symbol": "WIPE",
"name": "WipeMyAss",
"decimals": 9,
"logoURI": "https://cdn.jsdelivr.net/gh/rxrxrxrx/WipeMyAss/wipemyass.jpg",
"tags": [
"community-token",
"meme-token",
"doge",
"dogecoin",
"solcum",
"monkey",
"woof",
"soldoge",
"samo",
"smb"
],
"extensions": {
"coingeckoId": "wipemyass",
"serumV3Usdc": "3kuUc5eTZyi7qajuFfDMMUUkqreEkUKtxQbVCjdriKVz",
"twitter": "https://twitter.com/WipeMyAssNFT",
"website": "https://wipemyass.io/"
}
},
{
"chainId": 101,
"address": "FTkj421DxbS1wajE74J34BJ5a1o9ccA97PkK6mYq9hNQ",
"symbol": "MINECRAFT",
"name": "Synex Coin",
"decimals": 9,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/FTkj421DxbS1wajE74J34BJ5a1o9ccA97PkK6mYq9hNQ/logo.png",
"tags": [
"utility-token",
"community-token"
],
"extensions": {
"discord": "https://discord.gg/N3BE44234A",
"telegram": "https://t.me/synexcoin",
"website": "https://synexcoin.dev"
}
},
{
"chainId": 101,
"address": "EkDf4Nt89x4Usnxkj4sGHX7sWxkmmpiBzA4qdDkgEN6b",
"symbol": "SOB",
"name": "SolaLambo",
"decimals": 9,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/EkDf4Nt89x4Usnxkj4sGHX7sWxkmmpiBzA4qdDkgEN6b/logo.png",
"tags": [
"community-token"
],
"extensions": {
"discord": "https://discord.gg/sy2xymyc7J",
"twitter": "https://twitter.com/SolaLambo",
"website": "https://sob.finance/"
}
},
{
"chainId": 101,
"address": "Hj4sTP4L4rvR9WBR6KyK99sxPptBQQczNWe4y15mxhRD",
"symbol": "SNJ",
"name": "Sola Ninja",
"decimals": 9,
"logoURI": "https://raw.githubusercontent.com/SolaToken/token-list/ninja/assets/mainnet/Hj4sTP4L4rvR9WBR6KyK99sxPptBQQczNWe4y15mxhRD/logo.png",
"tags": [
"community-token"
],
"extensions": {
"serumV3Usdc": "FyVdsZs15c38b6vBjiYYfq9fPrcrZJjvMgjHtEB2T9Sa",
"telegram": "https://t.me/solatokennet",
"twitter": "https://twitter.com/EcoSolana",
"website": "https://solatoken.net/"
}
},
{
"chainId": 101,
"address": "9YdABeMBMjh5Pu8yPkJ9GETGWUT8KUK3B2RYBpjKNPsU",
"symbol": "GTA",
"name": "GTA LIVE",
"decimals": 8,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/9YdABeMBMjh5Pu8yPkJ9GETGWUT8KUK3B2RYBpjKNPsU/logo.svg",
"tags": [
"game-fi",
"utility-token",
"meta-verse"
],
"extensions": {
"discord": "https://discord.gta.live",
"medium": "https://gtanft.medium.com/",
"reddit": "https://reddit.com/user/gtanft",
"telegram": "https://t.me/gtanft",
"twitter": "https://twitter.com/gtanft",
"website": "https://gta.live"
}
},
{
"chainId": 101,
"address": "GqWbZDQaeJsiscgtGpDrJsNCxxeuHqJCGKs4oWBY1aYQ",
"symbol": "GTA",
"name": "GTA LIVE",
"decimals": 4,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/GqWbZDQaeJsiscgtGpDrJsNCxxeuHqJCGKs4oWBY1aYQ/logo.png",
"tags": [
"GameFi",
"DeFi",
"MetaVerse",
"stablecoin"
],
"extensions": {
"discord": "https://discord.gta.live",
"telegram": "https://t.me/gta_fiverp",
"website": "https://gta.live"
}
},
{
"chainId": 101,
"address": "6H87YFkp5LHyN3KzDXa5r3QYce7WTcwYJi9SqwH3TXkQ",
"symbol": "AINU",
"name": "Akamaru Inu",
"decimals": 1,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/6H87YFkp5LHyN3KzDXa5r3QYce7WTcwYJi9SqwH3TXkQ/logo.png",
"tags": [
"meme-token",
"community-token"
],
"extensions": {
"twitter": "https://twitter.com/akamaruinusol",
"website": "https://akamaruinusol.com/"
}
},
{
"chainId": 101,
"address": "BZopZtZHqUY7ApiYTLjztQSgBoAsqQsJU3kFqHW27qEK",
"symbol": "NICK",
"name": "Nick Token",
"decimals": 9,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/BZopZtZHqUY7ApiYTLjztQSgBoAsqQsJU3kFqHW27qEK/logo.png",
"tags": [
"utility-token"
],
"extensions": {
"twitter": "https://twitter.com/nickchua5"
}
},
{
"chainId": 101,
"address": "6Vg88xUHUPU9MfddHpu2cgx6CdodReiU8eGLPJgyhyVZ",
"symbol": "WLB",
"name": "WHALEBE",
"decimals": 9,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/6Vg88xUHUPU9MfddHpu2cgx6CdodReiU8eGLPJgyhyVZ/logo.png",
"tags": [
"token-games",
"nft-token"
],
"extensions": {
"twitter": "https://twitter.com/Whalebe_",
"website": "https://whalebe.art/"
}
},
{
"chainId": 101,
"address": "9SLCSSkEYL9YbKtAvw39xNzMEV4a7oLisGXhSJt73UCu",
"symbol": "KEVIN",
"name": "Kevin Token",
"decimals": 3,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/9SLCSSkEYL9YbKtAvw39xNzMEV4a7oLisGXhSJt73UCu/logo.png",
"tags": [
"utility-token"
],
"extensions": {
"twitter": "https://twitter.com/kevarifin"
}
},
{
"chainId": 101,
"address": "AeTzmX6QcL6tWKMRTKVW9ee8fPmCieKzgfmiU7ZaY4gu",
"symbol": "SHIHT",
"name": "Shih Tzu",
"decimals": 9,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/AeTzmX6QcL6tWKMRTKVW9ee8fPmCieKzgfmiU7ZaY4gu/logo.png",
"tags": [
"meme-token",
"community-token"
],
"extensions": {
"twitter": "https://twitter.com/ShihTzuSolana",
"website": "https://shihtcoin.io"
}
},
{
"chainId": 101,
"address": "AATiVPgFBTJejUJrmkwnwH8UTr69CtfodGVCwMvrCa2U",
"symbol": "SOLM",
"name": "Solmanians",
"decimals": 8,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/AATiVPgFBTJejUJrmkwnwH8UTr69CtfodGVCwMvrCa2U/logo.png",
"tags": [
"meme-token",
"nft-token",
"game-token"
],
"extensions": {
"twitter": "https://twitter.com/solmanians",
"website": "https://solmanians.com"
}
},
{
"chainId": 101,
"address": "ALMmmmbt5KNrPPUBFE4dAKUKSPWTop5s3kUGCdF69gmw",
"symbol": "ALM",
"name": "Almond",
"decimals": 6,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/ALMmmmbt5KNrPPUBFE4dAKUKSPWTop5s3kUGCdF69gmw/logo.png",
"extensions": {
"coingeckoId": "almond",
"coinmarketcap": "https://coinmarketcap.com/currencies/almond/",
"discord": "https://discord.gg/MBWsChEdFw",
"serumV3Usdc": "DNxn3qM61GZddidjrzc95398SCWhm5BUyt8Y8SdKYr8W",
"twitter": "https://twitter.com/almond_so",
"website": "https://almond.so/"
}
},
{
"chainId": 101,
"address": "BSA5MfNRWc1CTJE1FD5ZErkNNLLWf9pqDyS3rCEYV1Re",
"symbol": "UWT",
"name": "Solana Underworld Token",
"decimals": 0,
"logoURI": "https://solsnatchers.com/images/head2.png",
"tags": [
"utility-token"
],
"extensions": {
"twitter": "https://twitter.com/SolSnatchersNFT",
"website": "https://solsnatchers.com/"
}
},
{
"chainId": 101,
"address": "DGeHh4eoxGau3iH7PfdTJdRhZu4FWNgDFF1Czd3tNemT",
"symbol": "UMURPHY",
"name": "Uncle Murphy Coin",
"decimals": 9,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/DGeHh4eoxGau3iH7PfdTJdRhZu4FWNgDFF1Czd3tNemT/logo.png",
"tags": [
"meme-token"
],
"extensions": {
"telegram": "https://t.me/joinchat/1x2i0txLEOY2Yjgy",
"twitter": "https://twitter.com/Driver29973042",
"website": "https://unclemurphycoin.org/"
}
},
{
"chainId": 101,
"address": "ALKiRVrfLgzeAV2mCT7cJHKg3ZoPvsCRSV7VCRWnE8zQ",
"symbol": "NEKI",
"name": "Maneki-neko",
"decimals": 9,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/ALKiRVrfLgzeAV2mCT7cJHKg3ZoPvsCRSV7VCRWnE8zQ/logo.png",
"tags": [
"utility-token",
"meme-token",
"neki"
],
"extensions": {
"coingeckoId": "maneki-neko",
"twitter": "https://twitter.com/ManekiNekoLabs"
}
},
{
"chainId": 101,
"address": "D6yPmaM6SueQN4mteEQMiVFMbk6BSAShJAhuqyzVJ3fq",
"symbol": "YARN",
"name": "Yarn Coin",
"decimals": 9,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/D6yPmaM6SueQN4mteEQMiVFMbk6BSAShJAhuqyzVJ3fq/logo.png",
"tags": [
"utility-token",
"payment-token"
],
"extensions": {
"twitter": "https://twitter.com/yarncoin",
"website": "https://yarncoin.io"
}
},
{
"chainId": 101,
"address": "4BzxVoBQzwKoqm1dQc78r42Yby3EzAeZmMiYFdCjeu5Z",
"symbol": "SWOLE",
"name": "Swole Doge",
"decimals": 9,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/4BzxVoBQzwKoqm1dQc78r42Yby3EzAeZmMiYFdCjeu5Z/logo.png",
"extensions": {
"coingeckoId": "swole-doge",
"discord": "https://discord.gg/HfdHnhQkpB",
"serumV3Usdc": "3SGeuz8EXsyFo4HHWXQsoo8r4r5RdZkt7TuuTZiVbKc8",
"twitter": "https://twitter.com/swoledoge",
"website": "https://swoledogecoin.org"
}
},
{
"chainId": 101,
"address": "C3Rjiq8o2yiRWsmdSUSN276u5ah3UTqyWbZudLMG41pt",
"symbol": "PITXX",
"name": "Pi Token v2",
"decimals": 9,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/C3Rjiq8o2yiRWsmdSUSN276u5ah3UTqyWbZudLMG41pt/logo.png",
"extensions": {
"website": "https://tokeninfo.yolasite.com/"
}
},
{
"chainId": 101,
"address": "CC1gRBjsu8c7sf79wVd2Ub46X1UntPd81T7tmw7sTVYp",
"symbol": "BNN",
"name": "Banana",
"decimals": 9,
"logoURI": "https://cdn.jsdelivr.net/gh/tradeape/First_token_image/bnn.png"
},
{
"chainId": 101,
"address": "6oaVWSKRi4Pm1qVLf3fQFWFWygFhgswAL7Z466WE3cE8",
"symbol": "IMUA",
"name": "IMUA",
"decimals": 9,
"logoURI": "https://github.com/riversnout/imua/blob/main/rh.png",
"extensions": {
"website": "https://remnanthighway.org"
}
},
{
"chainId": 101,
"address": "9Sbzj4DnRW8qFnfvJWwXxQMRkWKAwHLs9NgDuBFjkVgW",
"symbol": "PITDT",
"name": "Picasso Token Div Test",
"decimals": 9,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/9Sbzj4DnRW8qFnfvJWwXxQMRkWKAwHLs9NgDuBFjkVgW/logo.png"
},
{
"chainId": 101,
"address": "CN7qFa5iYkHz99PTctvT4xXUHnxwjQ5MHxCuTJtPN5uS",
"symbol": "BOKU",
"name": "Boryoku Dragonz",
"decimals": 9,
"logoURI": "https://boryoku-dragonz-public.s3.us-east-2.amazonaws.com/BokuBrew.png",
"extensions": {
"coingeckoId": "boryoku-dragonz",
"coinmarketcap": "https://coinmarketcap.com/currencies/boku/",
"serumV3Usdc": "Dvm8jjdAy8uyXn9WXjS2p1mcPeFTuYS6yW2eUL9SJE8p",
"twitter": "https://twitter.com/BoryokuDragonz",
"website": "https://boryokudragonz.io"
}
},
{
"chainId": 101,
"address": "H7Qc9APCWWGDVxGD5fJHmLTmdEgT9GFatAKFNg6sHh8A",
"symbol": "OOGI",
"name": "OOGI",
"decimals": 9,
"logoURI": "https://oogi.com/icon.png",
"extensions": {
"coingeckoId": "oogi",
"discord": "https://discord.gg/oogi",
"serumV3Usdc": "ANUCohkG9gamUn6ofZEbnzGkjtyMexDhnjCwbLDmQ8Ub",
"telegram": "https://t.me/oogicoin",
"twitter": "https://twitter.com/oogicoin",
"website": "https://oogi.com/"
}
},
{
"chainId": 101,
"address": "GCxgQbbvJc4UyqGCsUAUa38npzZX27EMxZwckLuWeEkt",
"symbol": "NUTS",
"name": "NUTS",
"decimals": 9,
"logoURI": "https://user-images.githubusercontent.com/93886730/140664862-6dd80bff-be30-4c68-a978-fcb205011d61.png",
"extensions": {
"discord": "https://discord.gg/SSANFT",
"twitter": "https://twitter.com/SSA_NFT",
"website": "https://ssa.gg"
}
},
{
"chainId": 101,
"address": "EFYKDdppK1FjixaxExpVhoTd8gtAmncbhQYruzWyG6Cx",
"symbol": "SPKL",
"name": "Spookeletons Token",
"decimals": 9,
"logoURI": "https://www.spookeletons.com/assets/spookeletons_token.png",
"extensions": {
"serumV3Usdc": "8nTQLcukiGQEQ1zguvmtLx95VJmZm5WxRsdBneaTGVmN",
"website": "https://www.spookeletons.com"
}
},
{
"chainId": 101,
"address": "31tCNEE6LiL9yW4Bu153Dq4vi2GuorXxCA9pW9aA6ecU",
"symbol": "SPKL",
"name": "Spookeletons Token",
"decimals": 9,
"logoURI": "https://www.spookeletons.com/assets/spookeletons_tokenv2.png",
"extensions": {
"serumV3Usdc": "6b51zj1C78Tn7R3nd9j4GvyShbMNxxufbU3mqPmbDRcz",
"website": "https://www.spookeletons.com"
}
},
{
"chainId": 101,
"address": "q4bpaRKw3fJB1AJBeeBaKv3TjYzWsmntLgnSB275YUb",
"symbol": "TRTLS",
"name": "Turtles Token",
"decimals": 9,
"logoURI": "https://www.turtles.com/turtles.png",
"extensions": {
"coingeckoId": "turtles-token",
"serumV3Usdc": "2dKHkfJGKNxmtwdLcsqXFGcb8Xppw5RP6YVWEWjSfAHm",
"website": "https://www.turtles.com/"
}
},
{
"chainId": 101,
"address": "FRtCrYT6oHEM7tdcfJJkDRMhqRWb9EjnobJSA2T95Put",
"symbol": "MMaps",
"name": "Map Metrics",
"decimals": 4,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/FRtCrYT6oHEM7tdcfJJkDRMhqRWb9EjnobJSA2T95Put/logo.png",
"tags": [
"utility-token",
"Community",
"NFT"
],
"extensions": {
"website": "https://mapmetrics.org/"
}
},
{
"chainId": 101,
"address": "EFqYVEitSUpUTj2d9LSqun4eZ4BzouFuTPqQzU4hNtsS",
"symbol": "MMaps",
"name": "MapMetrics",
"decimals": 6,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/EFqYVEitSUpUTj2d9LSqun4eZ4BzouFuTPqQzU4hNtsS/logo.png",
"tags": [
"utility-token",
"Community",
"NFT"
],
"extensions": {
"website": "https://mapmetrics.org/"
}
},
{
"chainId": 101,
"address": "3CaBxqxWsP5oqS84Pkja4wLxyZYsHzMivQbnfwFJQeL1",
"symbol": "SOLFI",
"name": "SOLFI",
"decimals": 9,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/3CaBxqxWsP5oqS84Pkja4wLxyZYsHzMivQbnfwFJQeL1/logo.png",
"extensions": {
"twitter": "https://twitter.com/solfina_io",
"website": "https://solfina.io/"
}
},
{
"chainId": 101,
"address": "DdUm3gHS5nnB3XKnxEufnazb5ERa9vHjK6S3DgZi7QR5",
"symbol": "BTSL",
"name": "Bitsol Finance",
"decimals": 9,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/DdUm3gHS5nnB3XKnxEufnazb5ERa9vHjK6S3DgZi7QR5/logo.png",
"tags": [
"DEX"
],
"extensions": {
"telegram": "https://t.me/bitsolfinance",
"twitter": "https://twitter.com/bitsol_finance",
"website": "https://bitsol.finance"
}
},
{
"chainId": 101,
"address": "8f9s1sUmzUbVZMoMh6bufMueYH1u4BJSM57RCEvuVmFp",
"symbol": "TRUE",
"name": "TrueSight",
"decimals": 9,
"logoURI": "https://i.ibb.co/pKTWrwP/true.jpg",
"tags": [
"utility-token",
"capital-token"
]
},
{
"chainId": 101,
"address": "2Dzzc14S1D7cEFGJyMZMACuoQRHVUYFhVE74C5o8Fwau",
"symbol": "BAB",
"name": "Banana Bucks",
"decimals": 0,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/2Dzzc14S1D7cEFGJyMZMACuoQRHVUYFhVE74C5o8Fwau/logo.svg",
"tags": [
"utility-token"
],
"extensions": {
"website": "http://bananabucks.io/"
}
},
{
"chainId": 101,
"address": "GdRNeX9mbzCt4AnfiUFLbYZmxRuW7pGHfjbbAM59ZybR",
"symbol": "SLFT",
"name": "SOLife",
"decimals": 9,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/GdRNeX9mbzCt4AnfiUFLbYZmxRuW7pGHfjbbAM59ZybR/logo.png",
"tags": [
"utility-token",
"social-token"
],
"extensions": {
"twitter": "https://twitter.com/SOLifeNFT",
"website": "https://solife.town"
}
},
{
"chainId": 101,
"address": "AASdD9rAefJ4PP7iM89MYUsQEyCQwvBofhceZUGDh5HZ",
"symbol": "SLX",
"name": "Solex Finance",
"decimals": 9,
"logoURI": "https://raw.githubusercontent.com/solexfin/token-list/main/assets/mainnet/AASdD9rAefJ4PP7iM89MYUsQEyCQwvBofhceZUGDh5HZ/logo.png",
"tags": [
"Exchange",
"DApp"
],
"extensions": {
"coingeckoId": "solex-finance",
"serumV3Usdc": "7xy4r55rLu2QYeSGwTGDCBKEYERDX98f6kQLn9Zre6S3",
"twitter": "https://twitter.com/SolexFinance",
"website": "https://solex.finance/"
}
},
{
"chainId": 101,
"address": "HppJbUYU4a9i3dXo1x1SS5ieaKEz4cAPWMg4eNQzabzg",
"symbol": "BLOCKING",
"name": "Blocking",
"decimals": 8,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/HppJbUYU4a9i3dXo1x1SS5ieaKEz4cAPWMg4eNQzabzg/logo.png",
"tags": [
"NFT",
"Blocking"
],
"extensions": {
"website": "http://blocking.adchunha.com/"
}
},
{
"chainId": 101,
"address": "4HjScxnKaowf2SJzEKUCaHLJUe4qUBX15jCop6FQ4Ht1",
"symbol": "Z",
"name": "Zeus",
"decimals": 5,
"logoURI": "https://www.pnglib.com/wp-content/uploads/2021/02/letter-z_60235255a2bf7.png",
"tags": [
"Exchange",
"DApp"
]
},
{
"chainId": 101,
"address": "Aojru8bfwZK6sgrx6exNazxASFZUjPpRY59byMrs6izt",
"symbol": "OINK",
"name": "OINK",
"decimals": 10,
"logoURI": "https://raw.githubusercontent.com/dungnc/luckypigsNFT/main/SYMBOL.jpeg",
"tags": [
"meme",
"social-token",
"oink"
],
"extensions": {
"twitter": "https://twitter.com/GiftedLabs",
"website": "http://luckypignfts.com"
}
},
{
"chainId": 101,
"address": "5sM9xxcBTM9rWza6nEgq2cShA87JjTBx1Cu82LjgmaEg",
"symbol": "BMBO",
"name": "Bamboo",
"decimals": 7,
"logoURI": "https://raw.githubusercontent.com/rishkumaria/bamboo/main/bamboo.png",
"extensions": {
"coingeckoId": "bamboo-coin"
}
},
{
"chainId": 101,
"address": "5F3beSzHFv1m3T2Sqp7dNQPYrZeetLZ8JYe6QPW6cqKA",
"symbol": "ZEUS",
"name": "ZEUS",
"decimals": 8,
"logoURI": "https://previews.123rf.com/images/arbuzu/arbuzu1501/arbuzu150100014/35131140-letter-z-logo-icon-design-template-elements.jpg",
"tags": [
"NFT",
"ZEUS"
],
"extensions": {
"website": "http://test.com/"
}
},
{
"chainId": 101,
"address": "C8QMoDwQADoW4MVkDZx7HgnebeugnNXWztrqpcCT2mFj",
"symbol": "SHARK",
"name": "Rogue Shark 129",
"decimals": 0,
"logoURI": "https://raw.githubusercontent.com/L0px1n/token-list/main/assets/mainnet/shark.jpeg",
"tags": [
"NFT",
"stablecoin"
]
},
{
"chainId": 101,
"address": "4oyPeSSUwfxExjBU76fTfAFHHrZ3HVwCHWqAUdpeFg6h",
"symbol": "SHARK",
"name": "Rogue Shark 129",
"decimals": 0,
"logoURI": "https://raw.githubusercontent.com/L0px1n/token-list/main/assets/mainnet/shark.jpeg"
},
{
"chainId": 101,
"address": "9CuowWiTMFBeC5ntjdAeMv3W72vzwveCC9ATTjnjXjNx",
"symbol": "KRCH",
"name": "KrechetovNFT",
"decimals": 0,
"logoURI": "https://upload.wikimedia.org/wikipedia/commons/thumb/b/b2/Toyota_GT86_%E2%80%93_Frontansicht%2C_17._September_2012%2C_D%C3%BCsseldorf.jpg/1200px-Toyota_GT86_%E2%80%93_Frontansicht%2C_17._September_2012%2C_D%C3%BCsseldorf.jpg",
"tags": [
"NFT",
"stablecoin"
]
},
{
"chainId": 101,
"address": "EZF2sPJRe26e8iyXaCrmEefrGVBkqqNGv9UPGG9EnTQz",
"symbol": "FUM",
"name": "FUMoney",
"decimals": 9,
"logoURI": "https://raw.githubusercontent.com/FUMoney801/token-list/main/assets/mainnet/EZF2sPJRe26e8iyXaCrmEefrGVBkqqNGv9UPGG9EnTQz/logo.png",
"tags": [
"social-token",
"utility-token"
],
"extensions": {
"twitter": "https://twitter.com/FUMindset",
"website": "https://FUMoney.io/"
}
},
{
"chainId": 101,
"address": "9XtRZwKzDXEJ61A7qCqbPz8jXMYHGT3LwxqrEzB6fqxv",
"symbol": "SOLUM",
"name": "Solum",
"decimals": 9,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/9XtRZwKzDXEJ61A7qCqbPz8jXMYHGT3LwxqrEzB6fqxv/logo.png",
"extensions": {
"coingeckoId": "solum",
"telegram": "https://t.me/solumfinance",
"twitter": "https://twitter.com/solumDefi",
"website": "https://solum.finance/"
}
},
{
"chainId": 101,
"address": "31HcuZjFHCV8VcydRjXz9NFnte4RVRRuR5n9rECfy79W",
"symbol": "BOOZ",
"name": "boozcoin",
"decimals": 9,
"logoURI": "https://raw.githubusercontent.com/jatoshi/token-list/main/BoozCoin%20Logo%202021-07-21.png",
"extensions": {
"telegram": "https://t.me/boozcoin",
"twitter": "https://twitter.com/boozcoin",
"website": "https://boozcoin.com/"
}
},
{
"chainId": 101,
"address": "7Y2FprWHsBYCFkTpWiQ123BMPgWWquraaZHy6oFofcvs",
"symbol": "JDBEAR",
"name": "JareBear",
"decimals": 0,
"logoURI": "https://raw.githubusercontent.com/dyor-market/token-list/main/assets/mainnet/7Y2FprWHsBYCFkTpWiQ123BMPgWWquraaZHy6oFofcvs/logo.png",
"tags": [
"leveraged",
"bear",
"nft"
],
"extensions": {
"website": "https://stacc.art/"
}
},
{
"chainId": 101,
"address": "D3gRmoveMFa8e3ziw5XCwCByHKiSk76T4fi62GXNYXHi",
"symbol": "JDBULL",
"name": "JareBool",
"decimals": 0,
"logoURI": "https://raw.githubusercontent.com/dyor-market/token-list/main/assets/mainnet/D3gRmoveMFa8e3ziw5XCwCByHKiSk76T4fi62GXNYXHi/logo.png",
"tags": [
"leveraged",
"bull",
"nft"
],
"extensions": {
"website": "https://stacc.art/"
}
},
{
"chainId": 101,
"address": "8z55xQupEQcjAQTJy3BwZJX24pmtCJDo8MEe9Ub7a3Yv",
"symbol": "SHAK",
"name": "Shakudo",
"decimals": 9,
"logoURI": "https://raw.githubusercontent.com/dyor-market/token-list/main/assets/mainnet/8z55xQupEQcjAQTJy3BwZJX24pmtCJDo8MEe9Ub7a3Yv/logo.svg",
"extensions": {
"website": "https://shakudo.io/"
}
},
{
"chainId": 101,
"address": "7ypyxaQoHcJwoo9wXsc3tqL6PN4UQuEoyyfg5xjDX1Dj",
"symbol": "MMY",
"name": "Mummy",
"decimals": 9,
"logoURI": "https://raw.githubusercontent.com/dyor-market/token-list/main/assets/mainnet/7ypyxaQoHcJwoo9wXsc3tqL6PN4UQuEoyyfg5xjDX1Dj/logo.png",
"extensions": {
"website": "https://mummy.io/"
}
},
{
"chainId": 101,
"address": "HavbxBPK1uY9kMNqKPkWDEQXWw6FYERrLxeMtWiXnwko",
"symbol": "SXP",
"name": "Stacc eXPerience Points",
"decimals": 9,
"logoURI": "https://raw.githubusercontent.com/dyor-market/token-list/main/assets/mainnet/HavbxBPK1uY9kMNqKPkWDEQXWw6FYERrLxeMtWiXnwko/logo.svg",
"extensions": {
"discord": "https://discord.gg/WUTFtgDhXd",
"twitter": "https://twitter.com/STACCart",
"website": "https://stacc.art/"
}
},
{
"chainId": 101,
"address": "2A5esErqMaJXhrs1i6CtjbVxTbgsY9JbDedVsuVMQ6aY",
"symbol": "SJP",
"name": "Stacc Job Points",
"decimals": 9,
"logoURI": "https://raw.githubusercontent.com/dyor-market/token-list/main/assets/mainnet/2A5esErqMaJXhrs1i6CtjbVxTbgsY9JbDedVsuVMQ6aY/logo.svg",
"extensions": {
"discord": "https://discord.gg/WUTFtgDhXd",
"twitter": "https://twitter.com/STACCart",
"website": "https://stacc.art/"
}
},
{
"chainId": 101,
"address": "84vmWvKxebcnZL5JPnqkzPFVBaL4y5uGCRRJW2a9P4SL",
"symbol": "cvs",
"name": "coinvs",
"decimals": 9,
"logoURI": "https://raw.githubusercontent.com/CoinVs/brand-assets/master/logo/logo.png",
"tags": [
"coinversus",
"cvs",
"entertainment",
"gaming",
"NFT",
"utility-token"
],
"extensions": {
"discord": "https://discord.gg/F84VmCtByV",
"facebook": "https://www.facebook.com/coinversusofficial",
"github": "https://github.com/CoinVs",
"instagram": "https://www.instagram.com/coinversus/",
"reddit": "https://www.reddit.com/r/coinversus/",
"telegram": "https://t.me/coinvs",
"twitter": "https://twitter.com/CoinVersus",
"website": "https://coinversus.com/"
}
},
{
"chainId": 101,
"address": "9KYMTqKY7f2cJKW2wYfNRpLb9zbB1tTyEbaTuzy4Gwwc",
"symbol": "SGP",
"name": "Stacc Gold Points",
"decimals": 9,
"logoURI": "https://raw.githubusercontent.com/dyor-market/token-list/main/assets/mainnet/9KYMTqKY7f2cJKW2wYfNRpLb9zbB1tTyEbaTuzy4Gwwc/logo.svg",
"extensions": {
"discord": "https://discord.gg/WUTFtgDhXd",
"twitter": "https://twitter.com/STACCart",
"website": "https://stacc.art/"
}
},
{
"chainId": 101,
"address": "2uRFEWRBQLEKpLmF8mohFZGDcFQmrkQEEZmHQvMUBvY7",
"symbol": "SLB",
"name": "Solberg",
"decimals": 9,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/2uRFEWRBQLEKpLmF8mohFZGDcFQmrkQEEZmHQvMUBvY7/logo.svg",
"extensions": {
"coingeckoId": "solberg",
"discord": "https://discord.gg/2w7J25Xgce",
"instagram": "https://www.instagram.com/solbergtoken/",
"serumV3Usdc": "4MUhHF5K9simSLXuaUKMaU8nMHSCRPzPMe7UtJRXi4HZ",
"serumV3Usdt": "46jD4hpmvUAbhKaoAjdzFkY82VW1j9SMTEYFGcTor8Ww",
"telegram": "https://t.me/solbergofficial",
"twitter": "https://twitter.com/SolbergToken",
"website": "https://www.solbergtoken.com/"
}
},
{
"chainId": 101,
"address": "HDLRMKW1FDz2q5Zg778CZx26UgrtnqpUDkNNJHhmVUFr",
"symbol": "MILLI",
"name": "MILLIONSY",
"decimals": 9,
"logoURI": "https://raw.githubusercontent.com/millionsy/token-list/main/assets/mainnet/HDLRMKW1FDz2q5Zg778CZx26UgrtnqpUDkNNJHhmVUFr/logo.png",
"extensions": {
"telegram": "https://t.me/MILLIONSYofficialchat",
"twitter": "https://twitter.com/MILLIONSYio",
"website": "https://www.millionsy.io/"
}
},
{
"chainId": 101,
"address": "7ic3cSqD6iiwsqxDyBbcs2qYfMcKY2HndLDrjhMKZ4cQ",
"symbol": "$SOLY",
"name": "Solana Yield",
"decimals": 8,
"logoURI": "https://github.com/saimaliabrish/Solana-yield-logo/blob/main/IMG_20210923_195019_436.png",
"extensions": {
"twitter": "https://twitter.com/AbrishSaim"
}
},
{
"chainId": 101,
"address": "Dw3E5NJGyAZ5QmeB165cGf2gfc9ktyFu55wMyh3MaJov",
"symbol": "TKC",
"name": "Tugscom Coin",
"decimals": 9,
"logoURI": "https://tugscom.mn/tkc.png",
"tags": [
"TKC",
"Tugscom"
],
"extensions": {
"website": "https://tugscom.mn/"
}
},
{
"chainId": 101,
"address": "99pifp4v4qQNk3irTHpmAEEzgKfs3ahLE7iFKEqfyxPj",
"symbol": "ZI",
"name": "ZI (The Z Institute Token)",
"decimals": 6,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/99pifp4v4qQNk3irTHpmAEEzgKfs3ahLE7iFKEqfyxPj/logo.png",
"tags": [
"utility-token"
],
"extensions": {
"twitter": "https://twitter.com/the_z_institute",
"website": "https://zinstitute.net/"
}
},
{
"chainId": 101,
"address": "FYfQ9uaRaYvRiaEGUmct45F9WKam3BYXArTrotnTNFXF",
"symbol": "SOLA",
"name": "Sola Token",
"decimals": 9,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/FYfQ9uaRaYvRiaEGUmct45F9WKam3BYXArTrotnTNFXF/logo.png",
"tags": [
"community-token"
],
"extensions": {
"coingeckoId": "sola-token",
"serumV3Usdc": "4RZ27tjRnSwrtRqsJxDEgsERnDKFs7yx6Ra3HsJvkboy",
"telegram": "https://t.me/solatokennet",
"twitter": "https://twitter.com/EcoSolana",
"website": "https://solatoken.net/"
}
},
{
"chainId": 101,
"address": "So11111111111111111111111111111111111111112",
"symbol": "SOL",
"name": "Wrapped SOL",
"decimals": 9,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/So11111111111111111111111111111111111111112/logo.png",
"extensions": {
"coingeckoId": "solana",
"serumV3Usdc": "9wFFyRfZBsuAha4YcuxcXLKwMxJR43S7fPfQLusDBzvT",
"serumV3Usdt": "HWHvQhFmJB3NUcu1aihKmrKegfVxBEHzwVX6yZCKEsi1",
"website": "https://solana.com/"
}
},
{
"chainId": 101,
"address": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
"symbol": "USDC",
"name": "USD Coin",
"decimals": 6,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v/logo.png",
"tags": [
"stablecoin"
],
"extensions": {
"coingeckoId": "usd-coin",
"serumV3Usdt": "77quYg4MGneUdjgXCunt9GgM1usmrxKY31twEy3WHwcS",
"website": "https://www.centre.io/"
}
},
{
"chainId": 101,
"address": "SrZXMTPhY8TEJMXQEhHKbFdVY2oNSGR5YqMMGK6Zm7L",
"symbol": "BDNT",
"name": "Battle Drone Native Token",
"decimals": 9,
"logoURI": "https://battledronesnft.com/BDNT.png",
"tags": [
"utility-token",
"BDNT"
],
"extensions": {
"discord": "https://discord.gg/jRz63Dsa3p",
"twitter": "https://twitter.com/BattleDronesNFT",
"website": "https://battledronesnft.com/"
}
},
{
"chainId": 101,
"address": "2inRoG4DuMRRzZxAt913CCdNZCu2eGsDD9kZTrsj2DAZ",
"symbol": "TSLA",
"name": "Tesla Inc",
"decimals": 8,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/2inRoG4DuMRRzZxAt913CCdNZCu2eGsDD9kZTrsj2DAZ/logo.svg",
"tags": [
"tokenized-stock"
],
"extensions": {
"website": "https://www.digitalassets.ag/UnderlyingDetails?TSLA"
}
},
{
"chainId": 101,
"address": "8bpRdBGPt354VfABL5xugP3pmYZ2tQjzRcqjg2kmwfbF",
"symbol": "AAPL",
"name": "Apple Inc",
"decimals": 8,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/8bpRdBGPt354VfABL5xugP3pmYZ2tQjzRcqjg2kmwfbF/logo.svg",
"tags": [
"tokenized-stock"
],
"extensions": {
"website": "https://www.digitalassets.ag/UnderlyingDetails?AAPL"
}
},
{
"chainId": 103,
"address": "DGGETjRbXeNyq2bpA7FLmWwqjFLtS8p5aYjzUwtAHtZd",
"symbol": "Aiko",
"name": "Aiko",
"decimals": 0,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/7YBn43cTvko7mfZ9YV1iyAUfHNuMp6aAy4rX7wehXcbU/logo.png",
"tags": [
"utility-token"
],
"extensions": {
"discord": "https://discord.com/invite/Y72V9wn3Yw",
"medium": "https://aikonft.medium.com/",
"reddit": "https://www.reddit.com/r/AikoNFT/",
"twitter": "https://twitter.com/aikonft",
"website": "https://aiko.io/"
}
},
{
"chainId": 101,
"address": "7J2cEFFhMCsdUBWssnYfUG5z6zYJYCUaTNPTxH3k9aVY",
"symbol": "AIKO",
"name": "Aiko",
"decimals": 9,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/7J2cEFFhMCsdUBWssnYfUG5z6zYJYCUaTNPTxH3k9aVY/logo.png",
"tags": [
"utility-token"
],
"extensions": {
"discord": "https://discord.com/invite/Y72V9wn3Yw",
"reddit": "https://www.reddit.com/r/AikoNFT/",
"twitter": "https://twitter.com/aikonft",
"website": "https://aiko.io/"
}
},
{
"chainId": 101,
"address": "3vhcrQfEn8ashuBfE82F3MtEDFcBCEFfFw1ZgM3xj1s8",
"symbol": "MSFT",
"name": "Microsoft Corporation",
"decimals": 8,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/3vhcrQfEn8ashuBfE82F3MtEDFcBCEFfFw1ZgM3xj1s8/logo.svg",
"tags": [
"tokenized-stock"
],
"extensions": {
"website": "https://www.digitalassets.ag/UnderlyingDetails?MSFT"
}
},
{
"chainId": 101,
"address": "HNXTQPd5FkGX7USMufrxkvUQkTGmNFxVYCnAhuR941mm",
"symbol": "DOWIT",
"name": "DOWIT",
"decimals": 9,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/HNXTQPd5FkGX7USMufrxkvUQkTGmNFxVYCnAhuR941mm/logo.png",
"extensions": {
"website": "https://dowit-coin.com"
}
},
{
"chainId": 101,
"address": "4R8DBzZEzjBQzPJe4qqaxXM97am7unGM1ZYfviS6oSFe",
"symbol": "ANU",
"name": "ANUBEAST",
"decimals": 9,
"logoURI": "https://raw.githubusercontent.com/ANUBEAST/ANUBEAST/master/assets/logo.png",
"tags": [
"stake"
],
"extensions": {
"website": "https://github.com/ANUBEAST"
}
},
{
"chainId": 101,
"address": "ASwYCbLedk85mRdPnkzrUXbbYbwe26m71af9rzrhC2Qz",
"symbol": "MSTR",
"name": "MicroStrategy Incorporated",
"decimals": 8,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/ASwYCbLedk85mRdPnkzrUXbbYbwe26m71af9rzrhC2Qz/logo.svg",
"tags": [
"tokenized-stock"
],
"extensions": {
"website": "https://www.digitalassets.ag/UnderlyingDetails?MSTR"
}
},
{
"chainId": 101,
"address": "J25jdsEgTnAwB4nVq3dEQhwekbXCnVTGzFpVMPScXRgK",
"symbol": "COIN",
"name": "Coinbase Global Inc",
"decimals": 8,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/J25jdsEgTnAwB4nVq3dEQhwekbXCnVTGzFpVMPScXRgK/logo.svg",
"tags": [
"tokenized-stock"
],
"extensions": {
"website": "https://www.digitalassets.ag/UnderlyingDetails?COIN"
}
},
{
"chainId": 101,
"address": "G2Cg4XoXdEJT5sfrSy9N6YCC3uuVV3AoTQSvMeSqT8ZV",
"symbol": "ABC",
"name": "AmerisourceBergen Corp",
"decimals": 8,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/G2Cg4XoXdEJT5sfrSy9N6YCC3uuVV3AoTQSvMeSqT8ZV/logo.svg",
"tags": [
"tokenized-stock"
],
"extensions": {
"website": "https://www.digitalassets.ag/UnderlyingDetails?ABC"
}
},
{
"chainId": 101,
"address": "FqqVanFZosh4M4zqxzWUmEnky6nVANjghiSLaGqUAYGi",
"symbol": "ABNB",
"name": "Airbnb",
"decimals": 8,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/FqqVanFZosh4M4zqxzWUmEnky6nVANjghiSLaGqUAYGi/logo.svg",
"tags": [
"tokenized-stock"
],
"extensions": {
"website": "https://www.digitalassets.ag/UnderlyingDetails?ABNB"
}
},
{
"chainId": 101,
"address": "FgcUo7Ymua8r5xxsn9puizkLGN5w4i3nnBmasXvkcWfJ",
"symbol": "ACB",
"name": "Aurora Cannabis Inc",
"decimals": 8,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/FgcUo7Ymua8r5xxsn9puizkLGN5w4i3nnBmasXvkcWfJ/logo.svg",
"tags": [
"tokenized-stock"
],
"extensions": {
"website": "https://www.digitalassets.ag/UnderlyingDetails?ACB"
}
},
{
"chainId": 101,
"address": "FenmUGWjsW5AohtHRbgLoPUZyWSK36Cd5a31XJWjnRur",
"symbol": "AMC",
"name": "AMC Entertainment Holdings",
"decimals": 8,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/FenmUGWjsW5AohtHRbgLoPUZyWSK36Cd5a31XJWjnRur/logo.svg",
"tags": [
"tokenized-stock"
],
"extensions": {
"website": "https://www.digitalassets.ag/UnderlyingDetails?AMC"
}
},
{
"chainId": 101,
"address": "7grgNP3tAJh7DRELmotHzC5Efth4e4SoBvgmFYTX9jPB",
"symbol": "AMD",
"name": "Advanced Micro Devices",
"decimals": 8,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/7grgNP3tAJh7DRELmotHzC5Efth4e4SoBvgmFYTX9jPB/logo.svg",
"tags": [
"tokenized-stock"
],
"extensions": {
"website": "https://www.digitalassets.ag/UnderlyingDetails?AMD"
}
},
{
"chainId": 101,
"address": "3bjpzTTK49eP8m1bYxw6HYAFGtzyWjvEyGYcFS4gbRAx",
"symbol": "AMZN",
"name": "Amazon",
"decimals": 8,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/3bjpzTTK49eP8m1bYxw6HYAFGtzyWjvEyGYcFS4gbRAx/logo.svg",
"tags": [
"tokenized-stock"
],
"extensions": {
"website": "https://www.digitalassets.ag/UnderlyingDetails?AMZN"
}
},
{
"chainId": 101,
"address": "4cr7NH1BD2PMV38JQp58UaHUxzqhxeSiF7b6q1GCS7Ae",
"symbol": "APHA",
"name": "Aphria Inc",
"decimals": 8,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/4cr7NH1BD2PMV38JQp58UaHUxzqhxeSiF7b6q1GCS7Ae/logo.svg",
"tags": [
"tokenized-stock"
],
"extensions": {
"website": "https://www.digitalassets.ag/UnderlyingDetails?APHA"
}
},
{
"chainId": 101,
"address": "GPoBx2hycDs3t4Q8DeBme9RHb9nQpzH3a36iUoojHe16",
"symbol": "ARKK",
"name": "ARK Innovation ETF",
"decimals": 8,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/GPoBx2hycDs3t4Q8DeBme9RHb9nQpzH3a36iUoojHe16/logo.png",
"tags": [
"tokenized-stock"
],
"extensions": {
"website": "https://www.digitalassets.ag/UnderlyingDetails?ARKK"
}
},
{
"chainId": 101,
"address": "GgDDCnzZGQRUDy8jWqSqDDcPwAVg2YsKZfLPaTYBWdWt",
"symbol": "BABA",
"name": "Alibaba",
"decimals": 8,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/GgDDCnzZGQRUDy8jWqSqDDcPwAVg2YsKZfLPaTYBWdWt/logo.svg",
"tags": [
"tokenized-stock"
],
"extensions": {
"website": "https://www.digitalassets.ag/UnderlyingDetails?BABA"
}
},
{
"chainId": 101,
"address": "6jSgnmu8yg7kaZRWp5MtQqNrWTUDk7KWXhZhJPmsQ65y",
"symbol": "BB",
"name": "BlackBerry",
"decimals": 8,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/6jSgnmu8yg7kaZRWp5MtQqNrWTUDk7KWXhZhJPmsQ65y/logo.svg",
"tags": [
"tokenized-stock"
],
"extensions": {
"website": "https://www.digitalassets.ag/UnderlyingDetails?BB"
}
},
{
"chainId": 101,
"address": "5HHv6HAyBtaihyHEapCJvjE6iRbGLRmm3F5EZjz6EzHV",
"symbol": "wID_v1",
"name": "Everest ID (Wormhole v1)",
"decimals": 8,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/5HHv6HAyBtaihyHEapCJvjE6iRbGLRmm3F5EZjz6EzHV/logo.png",
"tags": [
"wrapped",
"wormhole"
],
"extensions": {
"address": "0xEBd9D99A3982d547C5Bb4DB7E3b1F9F14b67Eb83",
"assetContract": "https://etherscan.io/address/0xEBd9D99A3982d547C5Bb4DB7E3b1F9F14b67Eb83",
"bridgeContract": "https://etherscan.io/address/0xf92cD566Ea4864356C5491c177A430C222d7e678",
"coingeckoId": "everid",
"twitter": "https://twitter.com/EverestDotOrg",
"website": "https://everest.org"
}
},
{
"chainId": 101,
"address": "9Vovr1bqDbMQ8DyaizdC7n1YVvSia8r3PQ1RcPFqpQAs",
"symbol": "BILI",
"name": "Bilibili Inc",
"decimals": 8,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/9Vovr1bqDbMQ8DyaizdC7n1YVvSia8r3PQ1RcPFqpQAs/logo.svg",
"tags": [
"tokenized-stock"
],
"extensions": {
"website": "https://www.digitalassets.ag/UnderlyingDetails?BILI"
}
},
{
"chainId": 101,
"address": "j35qY1SbQ3k7b2WAR5cNETDKzDESxGnYbArsLNRUzg2",
"symbol": "BITW",
"name": "Bitwise 10 Crypto Index Fund",
"decimals": 8,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/j35qY1SbQ3k7b2WAR5cNETDKzDESxGnYbArsLNRUzg2/logo.png",
"tags": [
"tokenized-stock"
],
"extensions": {
"website": "https://www.digitalassets.ag/UnderlyingDetails?BITW"
}
},
{
"chainId": 101,
"address": "AykRYHVEERRoKGzfg2AMTqEFGmCGk9LNnGv2k5FgjKVB",
"symbol": "BNTX",
"name": "BioNTech",
"decimals": 8,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/AykRYHVEERRoKGzfg2AMTqEFGmCGk9LNnGv2k5FgjKVB/logo.png",
"tags": [
"tokenized-stock"
],
"extensions": {
"website": "https://www.digitalassets.ag/UnderlyingDetails?BNTX"
}
},
{
"chainId": 101,
"address": "Dj76V3vdFGGE8444NWFACR5qmtJrrSop5RCBAGbC88nr",
"symbol": "BRKA",
"name": "Berkshire Hathaway Inc",
"decimals": 8,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/Dj76V3vdFGGE8444NWFACR5qmtJrrSop5RCBAGbC88nr/logo.png",
"tags": [
"tokenized-stock"
],
"extensions": {
"website": "https://www.digitalassets.ag/UnderlyingDetails?BRKA"
}
},
{
"chainId": 101,
"address": "8TUg3Kpa4pNfaMvgyFdvwyiPBSnyTx7kK5EDfb42N6VK",
"symbol": "BYND",
"name": "Beyond Meat Inc",
"decimals": 8,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/8TUg3Kpa4pNfaMvgyFdvwyiPBSnyTx7kK5EDfb42N6VK/logo.svg",
"tags": [
"tokenized-stock"
],
"extensions": {
"website": "https://www.digitalassets.ag/UnderlyingDetails?BYND"
}
},
{
"chainId": 101,
"address": "8FyEsMuDWAMMusMqVEstt2sDkMvcUKsTy1gF6oMfWZcG",
"symbol": "CGC",
"name": "Canopy Growth Corp",
"decimals": 8,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/8FyEsMuDWAMMusMqVEstt2sDkMvcUKsTy1gF6oMfWZcG/logo.svg",
"tags": [
"tokenized-stock"
],
"extensions": {
"website": "https://www.digitalassets.ag/UnderlyingDetails?CGC"
}
},
{
"chainId": 101,
"address": "DUFVbhWf7FsUo3ouMnFbDjv4YYaRE1Sz9jvAmDsNTt1m",
"symbol": "CRON",
"name": "Chronos Group Inc",
"decimals": 8,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/DUFVbhWf7FsUo3ouMnFbDjv4YYaRE1Sz9jvAmDsNTt1m/logo.svg",
"tags": [
"tokenized-stock"
],
"extensions": {
"website": "https://www.digitalassets.ag/UnderlyingDetails?CRON"
}
},
{
"chainId": 101,
"address": "J9GVpBChXZ8EK7JuPsLSDV17BF9KLJweBQet3L6ZWvTC",
"symbol": "EEM",
"name": "iShares MSCI Emerging Markets ETF",
"decimals": 8,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/J9GVpBChXZ8EK7JuPsLSDV17BF9KLJweBQet3L6ZWvTC/logo.svg",
"tags": [
"tokenized-stock"
],
"extensions": {
"website": "https://www.digitalassets.ag/UnderlyingDetails?EEM"
}
},
{
"chainId": 101,
"address": "6Xj2NzAW437UUomaxFiVyJQPGvvup6YLeXFQpp4kqNaD",
"symbol": "EFA",
"name": "iShares MSCI EAFE ETF",
"decimals": 8,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/6Xj2NzAW437UUomaxFiVyJQPGvvup6YLeXFQpp4kqNaD/logo.svg",
"tags": [
"tokenized-stock"
],
"extensions": {
"website": "https://www.digitalassets.ag/UnderlyingDetails?EFA"
}
},
{
"chainId": 101,
"address": "5YMFoVuoQzdivpm6W97UGKkHxq6aEhipuNkA8imPDoa1",
"symbol": "ETHE",
"name": "Grayscale Ethereum Trust",
"decimals": 8,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/5YMFoVuoQzdivpm6W97UGKkHxq6aEhipuNkA8imPDoa1/logo.png",
"tags": [
"tokenized-stock"
],
"extensions": {
"website": "https://www.digitalassets.ag/UnderlyingDetails?ETHE"
}
},
{
"chainId": 101,
"address": "C9vMZBz1UCmYSCmMcZFw6N9AsYhXDAWnuhxd8ygCA1Ah",
"symbol": "EWA",
"name": "iShares MSCI Australia ETF",
"decimals": 8,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/C9vMZBz1UCmYSCmMcZFw6N9AsYhXDAWnuhxd8ygCA1Ah/logo.svg",
"tags": [
"tokenized-stock"
],
"extensions": {
"website": "https://www.digitalassets.ag/UnderlyingDetails?EWA"
}
},
{
"chainId": 101,
"address": "AcXn3WXPARC7r5JwrkPHSUmBGWyWx1vRydNHXXvgc8V6",
"symbol": "EWJ",
"name": "iShares MSCI Japan ETF",
"decimals": 8,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/AcXn3WXPARC7r5JwrkPHSUmBGWyWx1vRydNHXXvgc8V6/logo.svg",
"tags": [
"tokenized-stock"
],
"extensions": {
"website": "https://www.digitalassets.ag/UnderlyingDetails?EWJ"
}
},
{
"chainId": 101,
"address": "8ihxfcxBZ7dZyfnpXJiGrgEZfrKWbZUk6LjfosLrQfR",
"symbol": "EWY",
"name": "iShares MSCI South Korea ETF",
"decimals": 8,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/8ihxfcxBZ7dZyfnpXJiGrgEZfrKWbZUk6LjfosLrQfR/logo.svg",
"tags": [
"tokenized-stock"
],
"extensions": {
"website": "https://www.digitalassets.ag/UnderlyingDetails?EWY"
}
},
{
"chainId": 101,
"address": "N5ykto2MU7CNcLX7sgWFe3M2Vpy7wq8gDt2sVNDe6aH",
"symbol": "EWZ",
"name": "iShares MSCI Brazil ETF",
"decimals": 8,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/N5ykto2MU7CNcLX7sgWFe3M2Vpy7wq8gDt2sVNDe6aH/logo.svg",
"tags": [
"tokenized-stock"
],
"extensions": {
"website": "https://www.digitalassets.ag/UnderlyingDetails?EWZ"
}
},
{
"chainId": 101,
"address": "3K9pfJzKiAm9upcyDWk5NBVdjxVtqXN8sVfQ4aR6qwb2",
"symbol": "FB",
"name": "Facebook",
"decimals": 8,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/3K9pfJzKiAm9upcyDWk5NBVdjxVtqXN8sVfQ4aR6qwb2/logo.svg",
"tags": [
"tokenized-stock"
],
"extensions": {
"website": "https://www.digitalassets.ag/UnderlyingDetails?FB"
}
},
{
"chainId": 101,
"address": "Ege7FzfrrBSusVQrRUuTiFVCSc8u2R9fRWh4qLjdNYfz",
"symbol": "FXI",
"name": "iShares China Large-Cap ETF",
"decimals": 8,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/Ege7FzfrrBSusVQrRUuTiFVCSc8u2R9fRWh4qLjdNYfz/logo.svg",
"tags": [
"tokenized-stock"
],
"extensions": {
"website": "https://www.digitalassets.ag/UnderlyingDetails?FXI"
}
},
{
"chainId": 101,
"address": "FiV4TtDtnjaf8m8vw2a7uc9hRoFvvu9Ft7GzxiMujn3t",
"symbol": "GBTC",
"name": "Grayscale Bitcoin Trust",
"decimals": 8,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/FiV4TtDtnjaf8m8vw2a7uc9hRoFvvu9Ft7GzxiMujn3t/logo.png",
"tags": [
"tokenized-stock"
],
"extensions": {
"website": "https://www.digitalassets.ag/UnderlyingDetails?GBTC"
}
},
{
"chainId": 101,
"address": "7FYk6a91TiFWigBvCf8KbuEMyyfpqET5QHFkRtiD2XxF",
"symbol": "GDX",
"name": "VanEck Vectors Gold Miners Etf",
"decimals": 8,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/7FYk6a91TiFWigBvCf8KbuEMyyfpqET5QHFkRtiD2XxF/logo.svg",
"tags": [
"tokenized-stock"
],
"extensions": {
"website": "https://www.digitalassets.ag/UnderlyingDetails?GDX"
}
},
{
"chainId": 101,
"address": "EGhhk4sHgY1SBYsgkfgyGNhAKBXqn6QyKNx7W13evx9D",
"symbol": "GDXJ",
"name": "VanEck Vectors Junior Gold Miners Etf",
"decimals": 8,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/EGhhk4sHgY1SBYsgkfgyGNhAKBXqn6QyKNx7W13evx9D/logo.svg",
"tags": [
"tokenized-stock"
],
"extensions": {
"website": "https://www.digitalassets.ag/UnderlyingDetails?GDXJ"
}
},
{
"chainId": 101,
"address": "9HyU5EEyPvkxeuekNUwsHzmMCJoiw8FZBGWaNih2oux1",
"symbol": "GLD",
"name": "SPDR Gold Shares",
"decimals": 8,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/9HyU5EEyPvkxeuekNUwsHzmMCJoiw8FZBGWaNih2oux1/logo.png",
"tags": [
"tokenized-stock"
],
"extensions": {
"website": "https://www.digitalassets.ag/UnderlyingDetails?GLD"
}
},
{
"chainId": 101,
"address": "EYLa7susWhzqDNKYe7qLhFHb3Y9kdNwThc6QSnc4TLWN",
"symbol": "GLXY",
"name": "Galaxy Digital Holdings",
"decimals": 8,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/EYLa7susWhzqDNKYe7qLhFHb3Y9kdNwThc6QSnc4TLWN/logo.png",
"tags": [
"tokenized-stock"
],
"extensions": {
"website": "https://www.digitalassets.ag/UnderlyingDetails?GLXY"
}
},
{
"chainId": 101,
"address": "Ac2wmyujRxiGtb5msS7fKzGycaCF7K8NbVs5ortE6MFo",
"symbol": "GME",
"name": "GameStop",
"decimals": 8,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/Ac2wmyujRxiGtb5msS7fKzGycaCF7K8NbVs5ortE6MFo/logo.svg",
"tags": [
"tokenized-stock"
],
"extensions": {
"website": "https://www.digitalassets.ag/UnderlyingDetails?GME"
}
},
{
"chainId": 101,
"address": "7uzWUPC6XsWkgFAuDjpZgPVH9p3WqeKTvTJqLM1RXX6w",
"symbol": "GOOGL",
"name": "Google",
"decimals": 8,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/7uzWUPC6XsWkgFAuDjpZgPVH9p3WqeKTvTJqLM1RXX6w/logo.svg",
"tags": [
"tokenized-stock"
],
"extensions": {
"website": "https://www.digitalassets.ag/UnderlyingDetails?GOOGL"
}
},
{
"chainId": 101,
"address": "XJUMvw7KRLoLCYVD727jV9fjNUSDVcZaQUK6XpY6kGm",
"symbol": "IF",
"name": "Impossible Finance",
"decimals": 9,
"logoURI": "https://gateway.pinata.cloud/ipfs/QmcfMbNuvDV6ho3fueNPFTtgSruaUBmSdqP5D5ZduipN6S/logo.png",
"tags": [
"ethereum"
],
"extensions": {
"coingeckoId": "impossible-finance",
"website": "https://impossible.finance"
}
},
{
"chainId": 101,
"address": "CnLLrX9A8RhKpq8Z3CKko7sQMqN2AXj8AfFyxxoBBEFf",
"symbol": "CH",
"name": "COIN HUNTER",
"decimals": 8,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/CnLLrX9A8RhKpq8Z3CKko7sQMqN2AXj8AfFyxxoBBEFf/logo.png",
"extensions": {
"website": "https://bit.ly/Coin-Hunter"
}
},
{
"chainId": 101,
"address": "CB3obConLVWpo8RtTANzBSURmJnAVgy5xznvQfWXDfpR",
"symbol": "PURITY",
"name": "PURITY",
"decimals": 9,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/CB3obConLVWpo8RtTANzBSURmJnAVgy5xznvQfWXDfpR/logo.png",
"extensions": {
"website": "https://github.com/teampurity"
}
},
{
"chainId": 101,
"address": "GkDg1ZfoFkroLAwLqtJNXhxCDg8gmKxHAGxSUZagYFfE",
"symbol": "SOL100",
"name": "SOL100",
"decimals": 9,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/GkDg1ZfoFkroLAwLqtJNXhxCDg8gmKxHAGxSUZagYFfE/logo.png",
"extensions": {
"website": "https://github.com/teampurity"
}
},
{
"chainId": 101,
"address": "5E2742iZRZgZF94bfz39NgV9wjppe24YrQJVu6niLPMA",
"symbol": "GPA",
"name": "GALAXY PANDA",
"decimals": 8,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/5E2742iZRZgZF94bfz39NgV9wjppe24YrQJVu6niLPMA/logo.png",
"extensions": {
"website": "http://galaxypanda.space"
}
},
{
"chainId": 101,
"address": "4oyFkXQhvvDFa8cvShR4zwhYJ1RfhRzQjVAx1wemmjs6",
"symbol": "GRU",
"name": "GURU",
"decimals": 9,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/4oyFkXQhvvDFa8cvShR4zwhYJ1RfhRzQjVAx1wemmjs6/logo.png",
"extensions": {
"website": "https://solanaguru.web.app"
}
},
{
"chainId": 101,
"address": "8MpuLZGs52qdj4aGkgxrjjBbDQQd2dsKtbRpCpMb4g8o",
"symbol": "TST",
"name": "CHTST",
"decimals": 9,
"logoURI": ""
},
{
"chainId": 101,
"address": "4796pBun8ihiecy4unZuLWoSVRmK8sf7yQMbwkkvZDH3",
"symbol": "BLOK",
"name": "BLOCITIES",
"decimals": 9,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/4796pBun8ihiecy4unZuLWoSVRmK8sf7yQMbwkkvZDH3/logo.png",
"extensions": {
"website": "https://blocities.finance"
}
},
{
"chainId": 101,
"address": "C4kmKzQ8o6NAP8pToERJF6C7V4PjCVE3o2oSrp24f5GP",
"symbol": "CERCr",
"name": "Elemento6",
"decimals": 9,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/C4kmKzQ8o6NAP8pToERJF6C7V4PjCVE3o2oSrp24f5GP/logo.png",
"extensions": {
"website": "https://respectfuldevelopmentpanama.com"
}
},
{
"chainId": 101,
"address": "6CuCUCYovcLxwaKuxWm8uTquVKGWaAydcFEU3NrtvxGZ",
"symbol": "INTC",
"name": "Intel Corp",
"decimals": 8,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/6CuCUCYovcLxwaKuxWm8uTquVKGWaAydcFEU3NrtvxGZ/logo.svg",
"tags": [
"tokenized-stock"
],
"extensions": {
"website": "https://www.digitalassets.ag/UnderlyingDetails?INTC"
}
},
{
"chainId": 101,
"address": "iVNcrNE9BRZBC9Aqf753iZiZfbszeAVUoikgT9yvr2a",
"symbol": "IVN",
"name": "Investin Protocol",
"decimals": 6,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/iVNcrNE9BRZBC9Aqf753iZiZfbszeAVUoikgT9yvr2a/logo.png",
"tags": [
"defi",
"fund-management"
],
"extensions": {
"coingeckoId": "investin",
"discord": "https://discord.com/invite/Yf54h9B",
"medium": "https://medium.com/investin-pro",
"serumV3Usdc": "AdmfUBJ64BTsjaZdtu1iQHAtxJ4Ge7Zw5bNMsrLGdZu7",
"telegram": "https://t.me/Investin_pro1",
"twitter": "https://twitter.com/Investin_pro",
"website": "https://www.investin.pro/"
}
},
{
"chainId": 101,
"address": "BTk1SU7EM3sv7u8iaeUjJahm5oeXhEFeC3GJ3KqjTkGL",
"symbol": "RDP",
"name": "Road Protocol",
"decimals": 9,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/BTk1SU7EM3sv7u8iaeUjJahm5oeXhEFeC3GJ3KqjTkGL/logo.svg",
"extensions": {
"telegram": "https://t.me/roadprotocol",
"twitter": "https://twitter.com/roadprotocol",
"website": "https://roadprotocol.com"
}
},
{
"chainId": 101,
"address": "7kWEmnn8sCDnB3gDyeNss8Jo8tgj7i3yHyKrYjbXV6Jd",
"symbol": "WENA",
"name": "WENATURE",
"decimals": 9,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/7kWEmnn8sCDnB3gDyeNss8Jo8tgj7i3yHyKrYjbXV6Jd/logo.png",
"extensions": {
"twitter": "https://twitter.com/wenacurrency",
"website": "https://wena.finance"
}
},
{
"chainId": 101,
"address": "6H26K637YNAjZycRosvBR3ENKFGMsbr4xmoV7ca83GWf",
"symbol": "JUST",
"name": "Just Group PLC",
"decimals": 8,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/6H26K637YNAjZycRosvBR3ENKFGMsbr4xmoV7ca83GWf/logo.png",
"tags": [
"tokenized-stock"
],
"extensions": {
"website": "https://www.digitalassets.ag/UnderlyingDetails?JUST"
}
},
{
"chainId": 101,
"address": "FFRtWiE8FT7HMf673r9cmpabHVQfa2QEf4rSRwNo4JM3",
"symbol": "MRNA",
"name": "Moderna",
"decimals": 8,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/FFRtWiE8FT7HMf673r9cmpabHVQfa2QEf4rSRwNo4JM3/logo.svg",
"tags": [
"tokenized-stock"
],
"extensions": {
"website": "https://www.digitalassets.ag/UnderlyingDetails?MRNA"
}
},
{
"chainId": 101,
"address": "Hfbh3GU8AdYCw4stirFy2RPGtwQbbzToG2DgFozAymUb",
"symbol": "NFLX",
"name": "Netflix",
"decimals": 8,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/Hfbh3GU8AdYCw4stirFy2RPGtwQbbzToG2DgFozAymUb/logo.svg",
"tags": [
"tokenized-stock"
],
"extensions": {
"website": "https://www.digitalassets.ag/UnderlyingDetails?NFLX"
}
},
{
"chainId": 101,
"address": "56Zwe8Crm4pXvmByCxmGDjYrLPxkenTrckdRM7WG3zQv",
"symbol": "NIO",
"name": "Nio",
"decimals": 8,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/56Zwe8Crm4pXvmByCxmGDjYrLPxkenTrckdRM7WG3zQv/logo.svg",
"tags": [
"tokenized-stock"
],
"extensions": {
"website": "https://www.digitalassets.ag/UnderlyingDetails?NIO"
}
},
{
"chainId": 101,
"address": "HP9WMRDV3KdUfJ7CNn5Wf8JzLczwxdnQYTHDAa9yCSnq",
"symbol": "NOK",
"name": "Nokia",
"decimals": 8,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/HP9WMRDV3KdUfJ7CNn5Wf8JzLczwxdnQYTHDAa9yCSnq/logo.svg",
"tags": [
"tokenized-stock"
],
"extensions": {
"website": "https://www.digitalassets.ag/UnderlyingDetails?NOK"
}
},
{
"chainId": 101,
"address": "GpM58T33eTrGEdHmeFnSVksJjJT6JVdTvim59ipTgTNh",
"symbol": "NVDA",
"name": "NVIDIA",
"decimals": 8,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/GpM58T33eTrGEdHmeFnSVksJjJT6JVdTvim59ipTgTNh/logo.svg",
"tags": [
"tokenized-stock"
],
"extensions": {
"website": "https://www.digitalassets.ag/UnderlyingDetails?NVDA"
}
},
{
"chainId": 101,
"address": "CRCop5kHBDLTYJyG7z3u6yiVQi4FQHbyHdtb18Qh2Ta9",
"symbol": "PENN",
"name": "Penn National Gaming",
"decimals": 8,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/CRCop5kHBDLTYJyG7z3u6yiVQi4FQHbyHdtb18Qh2Ta9/logo.svg",
"tags": [
"tokenized-stock"
],
"extensions": {
"website": "https://www.digitalassets.ag/UnderlyingDetails?PENN"
}
},
{
"chainId": 101,
"address": "97v2oXMQ2MMAkgUnoQk3rNhrZCRThorYhvz1poAe9stk",
"symbol": "PFE",
"name": "Pfizer",
"decimals": 8,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/97v2oXMQ2MMAkgUnoQk3rNhrZCRThorYhvz1poAe9stk/logo.svg",
"tags": [
"tokenized-stock"
],
"extensions": {
"website": "https://www.digitalassets.ag/UnderlyingDetails?PFE"
}
},
{
"chainId": 101,
"address": "AwutBmwmhehaMh18CxqFPPN311uCB1M2awp68A2bG41v",
"symbol": "PYPL",
"name": "PayPal",
"decimals": 8,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/AwutBmwmhehaMh18CxqFPPN311uCB1M2awp68A2bG41v/logo.svg",
"tags": [
"tokenized-stock"
],
"extensions": {
"website": "https://www.digitalassets.ag/UnderlyingDetails?PYPL"
}
},
{
"chainId": 101,
"address": "8Sa7BjogSJnkHyhtRTKNDDTDtASnWMcAsD4ySVNSFu27",
"symbol": "SLV",
"name": "iShares Silver Trust",
"decimals": 8,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/8Sa7BjogSJnkHyhtRTKNDDTDtASnWMcAsD4ySVNSFu27/logo.svg",
"tags": [
"tokenized-stock"
],
"extensions": {
"website": "https://www.digitalassets.ag/UnderlyingDetails?SLV"
}
},
{
"chainId": 101,
"address": "CS4tNS523VCLiTsGnYEAd6GqfrZNLtA14C98DC6gE47g",
"symbol": "SPY",
"name": "SPDR S\u0026P 500 ETF",
"decimals": 8,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/CS4tNS523VCLiTsGnYEAd6GqfrZNLtA14C98DC6gE47g/logo.svg",
"tags": [
"tokenized-stock"
],
"extensions": {
"website": "https://www.digitalassets.ag/UnderlyingDetails?SPY"
}
},
{
"chainId": 101,
"address": "BLyrWJuDyYnDaUMxqBMqkDYAeajnyode1ARh7TxtakEh",
"symbol": "SQ",
"name": "Square",
"decimals": 8,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/BLyrWJuDyYnDaUMxqBMqkDYAeajnyode1ARh7TxtakEh/logo.svg",
"tags": [
"tokenized-stock"
],
"extensions": {
"website": "https://www.digitalassets.ag/UnderlyingDetails?SQ"
}
},
{
"chainId": 101,
"address": "HSDepE3xvbyRDx4M11LX7Hf9qgHSopfTXxAoeatCcwWF",
"symbol": "SUN",
"name": "Sunoco LP",
"decimals": 8,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/HSDepE3xvbyRDx4M11LX7Hf9qgHSopfTXxAoeatCcwWF/logo.svg",
"tags": [
"tokenized-stock"
],
"extensions": {
"website": "https://www.digitalassets.ag/UnderlyingDetails?SUN"
}
},
{
"chainId": 101,
"address": "LZufgu7ekMcWBUypPMBYia2ipnFzpxpZgRBFLhYswgR",
"symbol": "TLRY",
"name": "Tilray Inc",
"decimals": 8,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/LZufgu7ekMcWBUypPMBYia2ipnFzpxpZgRBFLhYswgR/logo.svg",
"tags": [
"tokenized-stock"
],
"extensions": {
"website": "https://www.digitalassets.ag/UnderlyingDetails?TLRY"
}
},
{
"chainId": 101,
"address": "2iCUKaCQpGvnaBimLprKWT8bNGF92e6LxWq4gjsteWfx",
"symbol": "TSM",
"name": "Taiwan Semiconductor Mfg",
"decimals": 8,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/2iCUKaCQpGvnaBimLprKWT8bNGF92e6LxWq4gjsteWfx/logo.svg",
"tags": [
"tokenized-stock"
],
"extensions": {
"website": "https://www.digitalassets.ag/UnderlyingDetails?TSM"
}
},
{
"chainId": 101,
"address": "H8Z1JgxqUpyHrerDVbXQ2HdjKuSTAWEZSeLTo4smWdF2",
"symbol": "CPT",
"name": "CryptoPotes Token",
"decimals": 9,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/H8Z1JgxqUpyHrerDVbXQ2HdjKuSTAWEZSeLTo4smWdF2/logo.svg",
"tags": [
"social-token",
"community-token"
],
"extensions": {
"telegram": "https://t.me/+EWjQtq9l3GBjYzc0"
}
},
{
"chainId": 101,
"address": "BZMg4HyyHVUJkwh2yuv6duu4iQUaXRxT6sK1dT7FcaZf",
"symbol": "TUR",
"name": "iShares MSCI Turkey ETF",
"decimals": 8,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/BZMg4HyyHVUJkwh2yuv6duu4iQUaXRxT6sK1dT7FcaZf/logo.svg",
"tags": [
"tokenized-stock"
],
"extensions": {
"website": "https://www.digitalassets.ag/UnderlyingDetails?TUR"
}
},
{
"chainId": 101,
"address": "C2tNm8bMU5tz6KdXjHY5zewsN1Wv1TEbxK9XGTCgUZMJ",
"symbol": "TWTR",
"name": "Twitter",
"decimals": 8,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/C2tNm8bMU5tz6KdXjHY5zewsN1Wv1TEbxK9XGTCgUZMJ/logo.svg",
"tags": [
"tokenized-stock"
],
"extensions": {
"website": "https://www.digitalassets.ag/UnderlyingDetails?TWTR"
}
},
{
"chainId": 101,
"address": "4kmVbBDCzYam3S4e9XqKQkLCEz16gu3dTTo65KbhShuv",
"symbol": "UBER",
"name": "Uber",
"decimals": 8,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/4kmVbBDCzYam3S4e9XqKQkLCEz16gu3dTTo65KbhShuv/logo.svg",
"tags": [
"tokenized-stock"
],
"extensions": {
"website": "https://www.digitalassets.ag/UnderlyingDetails?UBER"
}
},
{
"chainId": 101,
"address": "J645gMdx9zSMM2VySLBrtv6Zv1HyEjPqQXVGRAPYqzvK",
"symbol": "USO",
"name": "United States Oil Fund",
"decimals": 8,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/J645gMdx9zSMM2VySLBrtv6Zv1HyEjPqQXVGRAPYqzvK/logo.svg",
"tags": [
"tokenized-stock"
],
"extensions": {
"website": "https://www.digitalassets.ag/UnderlyingDetails?USO"
}
},
{
"chainId": 101,
"address": "3LjkoC9FYEqRKNpy7xz3nxfnGVAt1SNS98rYwF2adQWB",
"symbol": "VXX",
"name": "iPath B S\u0026P 500 VIX S/T Futs ETN",
"decimals": 8,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/3LjkoC9FYEqRKNpy7xz3nxfnGVAt1SNS98rYwF2adQWB/logo.png",
"tags": [
"tokenized-stock"
],
"extensions": {
"website": "https://www.digitalassets.ag/UnderlyingDetails?VXX"
}
},
{
"chainId": 101,
"address": "BcALTCjD4HJJxBDUXi3nHUgqsJmXAQdBbQrcmtLtqZaf",
"symbol": "ZM",
"name": "Zoom",
"decimals": 8,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/BcALTCjD4HJJxBDUXi3nHUgqsJmXAQdBbQrcmtLtqZaf/logo.svg",
"tags": [
"tokenized-stock"
],
"extensions": {
"website": "https://www.digitalassets.ag/UnderlyingDetails?ZM"
}
},
{
"chainId": 101,
"address": "9n4nbM75f5Ui33ZbPYXn59EwSgE8CGsHtAeTH5YFeJ9E",
"symbol": "BTC",
"name": "Wrapped Bitcoin (Sollet)",
"decimals": 6,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/9n4nbM75f5Ui33ZbPYXn59EwSgE8CGsHtAeTH5YFeJ9E/logo.png",
"tags": [
"wrapped-sollet",
"ethereum"
],
"extensions": {
"bridgeContract": "https://etherscan.io/address/0xeae57ce9cc1984f202e15e038b964bb8bdf7229a",
"coingeckoId": "bitcoin",
"serumV3Usdc": "A8YFbxQYFVqKZaoYJLLUVcQiWP7G2MeEgW5wsAQgMvFw",
"serumV3Usdt": "C1EuT9VokAKLiW7i2ASnZUvxDoKuKkCpDDeNxAptuNe4"
}
},
{
"chainId": 101,
"address": "2FPyTwcZLUg1MDrwsyoP4D6s1tM7hAkHYRjkNb5w6Pxk",
"symbol": "soETH",
"name": "Wrapped Ethereum (Sollet)",
"decimals": 6,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/2FPyTwcZLUg1MDrwsyoP4D6s1tM7hAkHYRjkNb5w6Pxk/logo.png",
"tags": [
"wrapped-sollet",
"ethereum"
],
"extensions": {
"bridgeContract": "https://etherscan.io/address/0xeae57ce9cc1984f202e15e038b964bb8bdf7229a",
"coingeckoId": "ethereum",
"serumV3Usdc": "4tSvZvnbyzHXLMTiFonMyxZoHmFqau1XArcRCVHLZ5gX",
"serumV3Usdt": "7dLVkUfBVfCGkFhSXDCq1ukM9usathSgS716t643iFGF"
}
},
{
"chainId": 101,
"address": "3JSf5tPeuscJGtaCp5giEiDhv51gQ4v3zWg8DGgyLfAB",
"symbol": "soYFI",
"name": "Wrapped YFI (Sollet)",
"decimals": 6,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/3JSf5tPeuscJGtaCp5giEiDhv51gQ4v3zWg8DGgyLfAB/logo.png",
"tags": [
"wrapped-sollet",
"ethereum"
],
"extensions": {
"bridgeContract": "https://etherscan.io/address/0xeae57ce9cc1984f202e15e038b964bb8bdf7229a",
"coingeckoId": "yearn-finance",
"serumV3Usdc": "7qcCo8jqepnjjvB5swP4Afsr3keVBs6gNpBTNubd1Kr2",
"serumV3Usdt": "3Xg9Q4VtZhD4bVYJbTfgGWFV5zjE3U7ztSHa938zizte"
}
},
{
"chainId": 101,
"address": "CWE8jPTUYhdCTZYWPTe1o5DFqfdjzWKc9WKz6rSjQUdG",
"symbol": "soLINK",
"name": "Wrapped Chainlink (Sollet)",
"decimals": 6,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/CWE8jPTUYhdCTZYWPTe1o5DFqfdjzWKc9WKz6rSjQUdG/logo.png",
"tags": [
"wrapped-sollet",
"ethereum"
],
"extensions": {
"bridgeContract": "https://etherscan.io/address/0xeae57ce9cc1984f202e15e038b964bb8bdf7229a",
"coingeckoId": "chainlink",
"serumV3Usdc": "3hwH1txjJVS8qv588tWrjHfRxdqNjBykM1kMcit484up",
"serumV3Usdt": "3yEZ9ZpXSQapmKjLAGKZEzUNA1rcupJtsDp5mPBWmGZR"
}
},
{
"chainId": 101,
"address": "Ga2AXHpfAF6mv2ekZwcsJFqu7wB4NV331qNH7fW9Nst8",
"symbol": "XRP",
"name": "Wrapped XRP (Sollet)",
"decimals": 6,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/Ga2AXHpfAF6mv2ekZwcsJFqu7wB4NV331qNH7fW9Nst8/logo.png",
"tags": [
"wrapped-sollet",
"ethereum"
],
"extensions": {
"bridgeContract": "https://etherscan.io/address/0xeae57ce9cc1984f202e15e038b964bb8bdf7229a",
"coingeckoId": "ripple"
}
},
{
"chainId": 101,
"address": "BQcdHdAQW1hczDbBi9hiegXAR7A98Q9jx3X3iBBBDiq4",
"symbol": "soUSDT",
"name": "Wrapped USDT (Sollet)",
"decimals": 6,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/BQcdHdAQW1hczDbBi9hiegXAR7A98Q9jx3X3iBBBDiq4/logo.png",
"tags": [
"stablecoin",
"wrapped-sollet",
"ethereum"
],
"extensions": {
"bridgeContract": "https://etherscan.io/address/0xeae57ce9cc1984f202e15e038b964bb8bdf7229a",
"coingeckoId": "tether"
}
},
{
"chainId": 101,
"address": "AR1Mtgh7zAtxuxGd2XPovXPVjcSdY3i4rQYisNadjfKy",
"symbol": "soSUSHI",
"name": "Wrapped SUSHI (Sollet)",
"decimals": 6,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/AR1Mtgh7zAtxuxGd2XPovXPVjcSdY3i4rQYisNadjfKy/logo.png",
"tags": [
"wrapped-sollet",
"ethereum"
],
"extensions": {
"bridgeContract": "https://etherscan.io/address/0xeae57ce9cc1984f202e15e038b964bb8bdf7229a",
"coingeckoId": "sushi",
"serumV3Usdc": "A1Q9iJDVVS8Wsswr9ajeZugmj64bQVCYLZQLra2TMBMo",
"serumV3Usdt": "6DgQRTpJTnAYBSShngAVZZDq7j9ogRN1GfSQ3cq9tubW",
"waterfallbot": "https://bit.ly/SUSHIwaterfall",
"website": "https://www.sushi.com"
}
},
{
"chainId": 101,
"address": "CsZ5LZkDS7h9TDKjrbL7VAwQZ9nsRu8vJLhRYfmGaN8K",
"symbol": "soALEPH",
"name": "Wrapped ALEPH (Sollet)",
"decimals": 6,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/CsZ5LZkDS7h9TDKjrbL7VAwQZ9nsRu8vJLhRYfmGaN8K/logo.png",
"tags": [
"wrapped-sollet",
"ethereum"
],
"extensions": {
"bridgeContract": "https://etherscan.io/address/0xeae57ce9cc1984f202e15e038b964bb8bdf7229a",
"coingeckoId": "aleph",
"serumV3Usdc": "GcoKtAmTy5QyuijXSmJKBtFdt99e6Buza18Js7j9AJ6e",
"serumV3Usdt": "Gyp1UGRgbrb6z8t7fpssxEKQgEmcJ4pVnWW3ds2p6ZPY"
}
},
{
"chainId": 101,
"address": "SF3oTvfWzEP3DTwGSvUXRrGTvr75pdZNnBLAH9bzMuX",
"symbol": "soSXP",
"name": "Wrapped SXP (Sollet)",
"decimals": 6,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/SF3oTvfWzEP3DTwGSvUXRrGTvr75pdZNnBLAH9bzMuX/logo.png",
"tags": [
"wrapped-sollet",
"ethereum"
],
"extensions": {
"bridgeContract": "https://etherscan.io/address/0xeae57ce9cc1984f202e15e038b964bb8bdf7229a",
"coingeckoId": "swipe",
"serumV3Usdc": "4LUro5jaPaTurXK737QAxgJywdhABnFAMQkXX4ZyqqaZ",
"serumV3Usdt": "8afKwzHR3wJE7W7Y5hvQkngXh6iTepSZuutRMMy96MjR"
}
},
{
"chainId": 101,
"address": "BtZQfWqDGbk9Wf2rXEiWyQBdBY1etnUUn6zEphvVS7yN",
"symbol": "soHGET",
"name": "Wrapped Hedget (Sollet)",
"decimals": 6,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/BtZQfWqDGbk9Wf2rXEiWyQBdBY1etnUUn6zEphvVS7yN/logo.svg",
"tags": [
"wrapped-sollet",
"ethereum"
],
"extensions": {
"bridgeContract": "https://etherscan.io/address/0xeae57ce9cc1984f202e15e038b964bb8bdf7229a",
"coingeckoId": "hedget",
"serumV3Usdc": "88vztw7RTN6yJQchVvxrs6oXUDryvpv9iJaFa1EEmg87",
"serumV3Usdt": "ErQXxiNfJgd4fqQ58PuEw5xY35TZG84tHT6FXf5s4UxY",
"website": "https://www.hedget.com/"
}
},
{
"chainId": 101,
"address": "5Fu5UUgbjpUvdBveb3a1JTNirL8rXtiYeSMWvKjtUNQv",
"symbol": "soCREAM",
"name": "Wrapped Cream Finance (Sollet)",
"decimals": 6,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/5Fu5UUgbjpUvdBveb3a1JTNirL8rXtiYeSMWvKjtUNQv/logo.png",
"tags": [
"wrapped-sollet",
"ethereum"
],
"extensions": {
"bridgeContract": "https://etherscan.io/address/0xeae57ce9cc1984f202e15e038b964bb8bdf7229a",
"coingeckoId": "cream-2",
"serumV3Usdc": "7nZP6feE94eAz9jmfakNJWPwEKaeezuKKC5D1vrnqyo2",
"serumV3Usdt": "4ztJEvQyryoYagj2uieep3dyPwG2pyEwb2dKXTwmXe82"
}
},
{
"chainId": 101,
"address": "873KLxCbz7s9Kc4ZzgYRtNmhfkQrhfyWGZJBmyCbC3ei",
"symbol": "soUBXT",
"name": "Wrapped Upbots (Sollet)",
"decimals": 6,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/873KLxCbz7s9Kc4ZzgYRtNmhfkQrhfyWGZJBmyCbC3ei/logo.png",
"tags": [
"wrapped-sollet",
"ethereum"
],
"extensions": {
"coingeckoId": "upbots",
"serumV3Usdc": "2wr3Ab29KNwGhtzr5HaPCyfU1qGJzTUAN4amCLZWaD1H",
"serumV3Usdt": "F1T7b6pnR8Pge3qmfNUfW6ZipRDiGpMww6TKTrRU4NiL",
"website": "https://upbots.com/"
}
},
{
"chainId": 101,
"address": "HqB7uswoVg4suaQiDP3wjxob1G5WdZ144zhdStwMCq7e",
"symbol": "soHNT",
"name": "Wrapped Helium (Sollet)",
"decimals": 6,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/HqB7uswoVg4suaQiDP3wjxob1G5WdZ144zhdStwMCq7e/logo.png",
"tags": [
"wrapped-sollet",
"ethereum"
],
"extensions": {
"bridgeContract": "https://etherscan.io/address/0xeae57ce9cc1984f202e15e038b964bb8bdf7229a",
"coingeckoId": "helium",
"serumV3Usdc": "CnUV42ZykoKUnMDdyefv5kP6nDSJf7jFd7WXAecC6LYr",
"serumV3Usdt": "8FpuMGLtMZ7Wt9ZvyTGuTVwTwwzLYfS5NZWcHxbP1Wuh"
}
},
{
"chainId": 101,
"address": "9S4t2NEAiJVMvPdRYKVrfJpBafPBLtvbvyS3DecojQHw",
"symbol": "soFRONT",
"name": "Wrapped FRONT (Sollet)",
"decimals": 6,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/9S4t2NEAiJVMvPdRYKVrfJpBafPBLtvbvyS3DecojQHw/logo.png",
"tags": [
"wrapped-sollet",
"ethereum"
],
"extensions": {
"bridgeContract": "https://etherscan.io/address/0xeae57ce9cc1984f202e15e038b964bb8bdf7229a",
"coingeckoId": "frontier-token",
"serumV3Usdc": "9Zx1CvxSVdroKMMWf2z8RwrnrLiQZ9VkQ7Ex3syQqdSH",
"serumV3Usdt": "CGC4UgWwqA9PET6Tfx6o6dLv94EK2coVkPtxgNHuBtxj"
}
},
{
"chainId": 101,
"address": "6WNVCuxCGJzNjmMZoKyhZJwvJ5tYpsLyAtagzYASqBoF",
"symbol": "soAKRO",
"name": "Wrapped AKRO (Sollet)",
"decimals": 6,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/6WNVCuxCGJzNjmMZoKyhZJwvJ5tYpsLyAtagzYASqBoF/logo.png",
"tags": [
"wrapped-sollet",
"ethereum"
],
"extensions": {
"bridgeContract": "https://etherscan.io/address/0xeae57ce9cc1984f202e15e038b964bb8bdf7229a",
"coingeckoId": "akropolis",
"serumV3Usdc": "5CZXTTgVZKSzgSA3AFMN5a2f3hmwmmJ6hU8BHTEJ3PX8",
"serumV3Usdt": "HLvRdctRB48F9yLnu9E24LUTRt89D48Z35yi1HcxayDf"
}
},
{
"chainId": 101,
"address": "DJafV9qemGp7mLMEn5wrfqaFwxsbLgUsGVS16zKRk9kc",
"symbol": "soHXRO",
"name": "Wrapped HXRO (Sollet)",
"decimals": 6,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/DJafV9qemGp7mLMEn5wrfqaFwxsbLgUsGVS16zKRk9kc/logo.png",
"tags": [
"wrapped-sollet",
"ethereum"
],
"extensions": {
"bridgeContract": "https://etherscan.io/address/0xeae57ce9cc1984f202e15e038b964bb8bdf7229a",
"coingeckoId": "hxro",
"serumV3Usdc": "6Pn1cSiRos3qhBf54uBP9ZQg8x3JTardm1dL3n4p29tA",
"serumV3Usdt": "4absuMsgemvdjfkgdLQq1zKEjw3dHBoCWkzKoctndyqd"
}
},
{
"chainId": 101,
"address": "DEhAasscXF4kEGxFgJ3bq4PpVGp5wyUxMRvn6TzGVHaw",
"symbol": "soUNI",
"name": "Wrapped UNI (Sollet)",
"decimals": 6,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/DEhAasscXF4kEGxFgJ3bq4PpVGp5wyUxMRvn6TzGVHaw/logo.png",
"tags": [
"wrapped-sollet",
"ethereum"
],
"extensions": {
"bridgeContract": "https://etherscan.io/address/0xeae57ce9cc1984f202e15e038b964bb8bdf7229a",
"coingeckoId": "uniswap",
"serumV3Usdc": "6JYHjaQBx6AtKSSsizDMwozAEDEZ5KBsSUzH7kRjGJon",
"serumV3Usdt": "2SSnWNrc83otLpfRo792P6P3PESZpdr8cu2r8zCE6bMD"
}
},
{
"chainId": 101,
"address": "SRMuApVNdxXokk5GT7XD5cUUgXMBCoAz2LHeuAoKWRt",
"symbol": "SRM",
"name": "Serum",
"decimals": 6,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/SRMuApVNdxXokk5GT7XD5cUUgXMBCoAz2LHeuAoKWRt/logo.png",
"extensions": {
"coingeckoId": "serum",
"serumV3Usdc": "ByRys5tuUWDgL73G8JBAEfkdFf8JWBzPBDHsBVQ5vbQA",
"serumV3Usdt": "AtNnsY1AyRERWJ8xCskfz38YdvruWVJQUVXgScC1iPb",
"waterfallbot": "https://bit.ly/SRMwaterfall",
"website": "https://projectserum.com/"
}
},
{
"chainId": 101,
"address": "AGFEad2et2ZJif9jaGpdMixQqvW5i81aBdvKe7PHNfz3",
"symbol": "soFTT",
"name": "Wrapped FTT (Sollet)",
"decimals": 6,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/AGFEad2et2ZJif9jaGpdMixQqvW5i81aBdvKe7PHNfz3/logo.png",
"tags": [
"wrapped-sollet",
"ethereum"
],
"extensions": {
"assetContract": "https://etherscan.io/address/0x50d1c9771902476076ecfc8b2a83ad6b9355a4c9",
"bridgeContract": "https://etherscan.io/address/0xeae57ce9cc1984f202e15e038b964bb8bdf7229a",
"coingeckoId": "ftx-token",
"serumV3Usdc": "2Pbh1CvRVku1TgewMfycemghf6sU9EyuFDcNXqvRmSxc",
"serumV3Usdt": "Hr3wzG8mZXNHV7TuL6YqtgfVUesCqMxGYCEyP3otywZE",
"waterfallbot": "https://bit.ly/FTTwaterfall"
}
},
{
"chainId": 101,
"address": "MSRMcoVyrFxnSgo5uXwone5SKcGhT1KEJMFEkMEWf9L",
"symbol": "MSRM",
"name": "MegaSerum",
"decimals": 0,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/MSRMcoVyrFxnSgo5uXwone5SKcGhT1KEJMFEkMEWf9L/logo.png",
"extensions": {
"coingeckoId": "megaserum",
"serumV3Usdc": "4VKLSYdvrQ5ngQrt1d2VS8o4ewvb2MMUZLiejbnGPV33",
"serumV3Usdt": "5nLJ22h1DUfeCfwbFxPYK8zbfbri7nA9bXoDcR8AcJjs",
"website": "https://projectserum.com/"
}
},
{
"chainId": 101,
"address": "BXXkv6z8ykpG1yuvUDPgh732wzVHB69RnB9YgSYh3itW",
"symbol": "soUSDC",
"name": "Wrapped USDC (Sollet)",
"decimals": 6,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/BXXkv6z8ykpG1yuvUDPgh732wzVHB69RnB9YgSYh3itW/logo.png",
"tags": [
"stablecoin",
"wrapped-sollet",
"ethereum"
],
"extensions": {
"coingeckoId": "usd-coin"
}
},
{
"chainId": 101,
"address": "GXMvfY2jpQctDqZ9RoU3oWPhufKiCcFEfchvYumtX7jd",
"symbol": "soTOMO",
"name": "Wrapped TOMO (Sollet)",
"decimals": 6,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/GXMvfY2jpQctDqZ9RoU3oWPhufKiCcFEfchvYumtX7jd/logo.png",
"tags": [
"wrapped-sollet",
"ethereum"
],
"extensions": {
"bridgeContract": "https://etherscan.io/address/0xeae57ce9cc1984f202e15e038b964bb8bdf7229a",
"coingeckoId": "tomochain",
"serumV3Usdc": "8BdpjpSD5n3nk8DQLqPUyTZvVqFu6kcff5bzUX5dqDpy",
"serumV3Usdt": "GnKPri4thaGipzTbp8hhSGSrHgG4F8MFiZVrbRn16iG2",
"waterfallbot": "https://t.me/TOMOwaterfall"
}
},
{
"chainId": 101,
"address": "EcqExpGNFBve2i1cMJUTR4bPXj4ZoqmDD2rTkeCcaTFX",
"symbol": "soKARMA",
"name": "Wrapped KARMA (Sollet)",
"decimals": 4,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/EcqExpGNFBve2i1cMJUTR4bPXj4ZoqmDD2rTkeCcaTFX/logo.png",
"tags": [
"wrapped-sollet",
"ethereum"
],
"extensions": {
"bridgeContract": "https://etherscan.io/address/0xeae57ce9cc1984f202e15e038b964bb8bdf7229a",
"coingeckoId": "karma-dao"
}
},
{
"chainId": 101,
"address": "EqWCKXfs3x47uVosDpTRgFniThL9Y8iCztJaapxbEaVX",
"symbol": "soLUA",
"name": "Wrapped LUA (Sollet)",
"decimals": 6,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/EqWCKXfs3x47uVosDpTRgFniThL9Y8iCztJaapxbEaVX/logo.png",
"tags": [
"wrapped-sollet",
"ethereum"
],
"extensions": {
"bridgeContract": "https://etherscan.io/address/0xeae57ce9cc1984f202e15e038b964bb8bdf7229a",
"coingeckoId": "lua-token",
"serumV3Usdc": "4xyWjQ74Eifq17vbue5Ut9xfFNfuVB116tZLEpiZuAn8",
"serumV3Usdt": "35tV8UsHH8FnSAi3YFRrgCu4K9tb883wKnAXpnihot5r",
"waterfallbot": "https://t.me/LUAwaterfall"
}
},
{
"chainId": 101,
"address": "GeDS162t9yGJuLEHPWXXGrb1zwkzinCgRwnT8vHYjKza",
"symbol": "soMATH",
"name": "Wrapped MATH (Sollet)",
"decimals": 6,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/GeDS162t9yGJuLEHPWXXGrb1zwkzinCgRwnT8vHYjKza/logo.png",
"tags": [
"wrapped-sollet",
"ethereum"
],
"extensions": {
"bridgeContract": "https://etherscan.io/address/0xeae57ce9cc1984f202e15e038b964bb8bdf7229a",
"coingeckoId": "math",
"serumV3Usdc": "J7cPYBrXVy8Qeki2crZkZavcojf2sMRyQU7nx438Mf8t",
"serumV3Usdt": "2WghiBkDL2yRhHdvm8CpprrkmfguuQGJTCDfPSudKBAZ"
}
},
{
"chainId": 101,
"address": "GUohe4DJUA5FKPWo3joiPgsB7yzer7LpDmt1Vhzy3Zht",
"symbol": "soKEEP",
"name": "Wrapped KEEP (Sollet)",
"decimals": 6,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/GUohe4DJUA5FKPWo3joiPgsB7yzer7LpDmt1Vhzy3Zht/logo.png",
"tags": [
"wrapped-sollet",
"ethereum"
],
"extensions": {
"bridgeContract": "https://etherscan.io/address/0xeae57ce9cc1984f202e15e038b964bb8bdf7229a",
"coingeckoId": "keep-network",
"serumV3Usdc": "3rgacody9SvM88QR83GHaNdEEx4Fe2V2ed5GJp2oeKDr",
"serumV3Usdt": "HEGnaVL5i48ubPBqWAhodnZo8VsSLzEM3Gfc451DnFj9"
}
},
{
"chainId": 101,
"address": "9F9fNTT6qwjsu4X4yWYKZpsbw5qT7o6yR2i57JF2jagy",
"symbol": "soSWAG",
"name": "Wrapped SWAG (Sollet)",
"decimals": 6,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/9F9fNTT6qwjsu4X4yWYKZpsbw5qT7o6yR2i57JF2jagy/logo.png",
"tags": [
"wrapped-sollet",
"ethereum"
],
"extensions": {
"bridgeContract": "https://etherscan.io/address/0xeae57ce9cc1984f202e15e038b964bb8bdf7229a",
"coingeckoId": "swag-finance",
"serumV3Usdt": "J2XSt77XWim5HwtUM8RUwQvmRXNZsbMKpp5GTKpHafvf"
}
},
{
"chainId": 101,
"address": "DgHK9mfhMtUwwv54GChRrU54T2Em5cuszq2uMuen1ZVE",
"symbol": "soCEL",
"name": "Wrapped Celsius (Sollet)",
"decimals": 4,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/DgHK9mfhMtUwwv54GChRrU54T2Em5cuszq2uMuen1ZVE/logo.png",
"tags": [
"wrapped-sollet",
"ethereum"
],
"extensions": {
"bridgeContract": "https://etherscan.io/address/0xeae57ce9cc1984f202e15e038b964bb8bdf7229a",
"coingeckoId": "celsius-degree-token",
"serumV3Usdt": "cgani53cMZgYfRMgSrNekJTMaLmccRfspsfTbXWRg7u"
}
},
{
"chainId": 101,
"address": "7ncCLJpP3MNww17LW8bRvx8odQQnubNtfNZBL5BgAEHW",
"symbol": "soRSR",
"name": "Wrapped Reserve Rights (Sollet)",
"decimals": 6,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/7ncCLJpP3MNww17LW8bRvx8odQQnubNtfNZBL5BgAEHW/logo.png",
"tags": [
"wrapped-sollet",
"ethereum"
],
"extensions": {
"bridgeContract": "https://etherscan.io/address/0xeae57ce9cc1984f202e15e038b964bb8bdf7229a",
"coingeckoId": "reserve-rights-token",
"serumV3Usdt": "FcPet5fz9NLdbXwVM6kw2WTHzRAD7mT78UjwTpawd7hJ"
}
},
{
"chainId": 101,
"address": "ChvvzHyRqCHnLVwMNz8amvQwgVLD8AELV7RgcFAxEhAf",
"symbol": "DRIFT",
"name": "DriftCoin",
"decimals": 6,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/ChvvzHyRqCHnLVwMNz8amvQwgVLD8AELV7RgcFAxEhAf/logo.png",
"tags": [
"social-token",
"utility-token"
],
"extensions": {
"discord": "https://discord.gg/stKm5E9SuF",
"telegram": "https://t.me/driftcoinorg",
"twitter": "https://twitter.com/driftcoinorg",
"website": "https://driftcoin.org"
}
},
{
"chainId": 101,
"address": "GPF8ZZP6y1BkGAPLvmQCzkvVHvMUBko5e1pZzh8DD87Y",
"symbol": "BECH",
"name": "PrimeBech",
"decimals": 9,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/GPF8ZZP6y1BkGAPLvmQCzkvVHvMUBko5e1pZzh8DD87Y/logo.png",
"tags": [
"community-token"
],
"extensions": {
"twitter": "https://twitter.com/doesitxz",
"website": "https://www.primebech.app"
}
},
{
"chainId": 101,
"address": "3yN3xNcXxbhkZYC6MXak1f7Ff29BZdGyc4GUQ1jbyt27",
"symbol": "FRO",
"name": "Fro",
"decimals": 9,
"logoURI": "https://www.frolicx0.de/public/assets/pngs/logo.png",
"extensions": {
"website": "https://www.frolic.live/"
}
},
{
"chainId": 101,
"address": "5wihEYGca7X4gSe97C5mVcqNsfxBzhdTwpv72HKs25US",
"symbol": "so1INCH",
"name": "Wrapped 1INCH (Sollet)",
"decimals": 6,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/5wihEYGca7X4gSe97C5mVcqNsfxBzhdTwpv72HKs25US/logo.png",
"tags": [
"wrapped-sollet",
"ethereum"
],
"extensions": {
"bridgeContract": "https://etherscan.io/address/0xeae57ce9cc1984f202e15e038b964bb8bdf7229a",
"coingeckoId": "1inch"
}
},
{
"chainId": 101,
"address": "38i2NQxjp5rt5B3KogqrxmBxgrAwaB3W1f1GmiKqh9MS",
"symbol": "soGRT",
"name": "Wrapped GRT (Sollet)",
"decimals": 6,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/38i2NQxjp5rt5B3KogqrxmBxgrAwaB3W1f1GmiKqh9MS/logo.png",
"tags": [
"wrapped-sollet",
"ethereum"
],
"extensions": {
"bridgeContract": "https://etherscan.io/address/0xeae57ce9cc1984f202e15e038b964bb8bdf7229a",
"coingeckoId": "the-graph"
}
},
{
"chainId": 101,
"address": "Avz2fmevhhu87WYtWQCFj9UjKRjF9Z9QWwN2ih9yF95G",
"symbol": "soCOMP",
"name": "Wrapped Compound (Sollet)",
"decimals": 6,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/Avz2fmevhhu87WYtWQCFj9UjKRjF9Z9QWwN2ih9yF95G/logo.png",
"tags": [
"wrapped-sollet",
"ethereum"
],
"extensions": {
"bridgeContract": "https://etherscan.io/address/0xeae57ce9cc1984f202e15e038b964bb8bdf7229a",
"coingeckoId": "compound-coin"
}
},
{
"chainId": 101,
"address": "9wRD14AhdZ3qV8et3eBQVsrb3UoBZDUbJGyFckpTg8sj",
"symbol": "soPAXG",
"name": "Wrapped Paxos Gold (Sollet)",
"decimals": 6,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/9wRD14AhdZ3qV8et3eBQVsrb3UoBZDUbJGyFckpTg8sj/logo.png",
"tags": [
"wrapped-sollet",
"ethereum"
],
"extensions": {
"bridgeContract": "https://etherscan.io/address/0xeae57ce9cc1984f202e15e038b964bb8bdf7229a",
"coingeckoId": "pax-gold"
}
},
{
"chainId": 101,
"address": "AByXcTZwJHMtrKrvVsh9eFNB1pJaLDjCUR2ayvxBAAM2",
"symbol": "soSTRONG",
"name": "Wrapped Strong (Sollet)",
"decimals": 6,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/AByXcTZwJHMtrKrvVsh9eFNB1pJaLDjCUR2ayvxBAAM2/logo.png",
"tags": [
"wrapped-sollet",
"ethereum"
],
"extensions": {
"bridgeContract": "https://etherscan.io/address/0xeae57ce9cc1984f202e15e038b964bb8bdf7229a",
"coingeckoId": "strong"
}
},
{
"chainId": 101,
"address": "EchesyfXePKdLtoiZSL8pBe8Myagyy8ZRqsACNCFGnvp",
"symbol": "FIDA",
"name": "Bonfida",
"decimals": 6,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/EchesyfXePKdLtoiZSL8pBe8Myagyy8ZRqsACNCFGnvp/logo.svg",
"extensions": {
"coingeckoId": "bonfida",
"serumV3Usdc": "E14BKBhDWD4EuTkWj1ooZezesGxMW8LPCps4W5PuzZJo",
"serumV3Usdt": "EbV7pPpEvheLizuYX3gUCvWM8iySbSRAhu2mQ5Vz2Mxf",
"waterfallbot": "https://bit.ly/FIDAwaterfall",
"website": "https://bonfida.com/"
}
},
{
"chainId": 101,
"address": "kinXdEcpDQeHPEuQnqmUgtYykqKGVFq6CeVX5iAHJq6",
"symbol": "KIN",
"name": "KIN",
"decimals": 5,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/kinXdEcpDQeHPEuQnqmUgtYykqKGVFq6CeVX5iAHJq6/logo.png",
"extensions": {
"coingeckoId": "kin",
"serumV3Usdc": "Bn6NPyr6UzrFAwC4WmvPvDr2Vm8XSUnFykM2aQroedgn",
"serumV3Usdt": "4nCFQr8sahhhL4XJ7kngGFBmpkmyf3xLzemuMhn6mWTm",
"waterfallbot": "https://bit.ly/KINwaterfall"
}
},
{
"chainId": 101,
"address": "MAPS41MDahZ9QdKXhVa4dWB9RuyfV4XqhyAZ8XcYepb",
"symbol": "MAPS",
"name": "MAPS",
"decimals": 6,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/MAPS41MDahZ9QdKXhVa4dWB9RuyfV4XqhyAZ8XcYepb/logo.svg",
"extensions": {
"coingeckoId": "maps",
"serumV3Usdc": "3A8XQRWXC7BjLpgLDDBhQJLT5yPCzS16cGYRKHkKxvYo",
"serumV3Usdt": "7cknqHAuGpfVXPtFoJpFvUjJ8wkmyEfbFusmwMfNy3FE",
"website": "https://maps.me/"
}
},
{
"chainId": 101,
"address": "z3dn17yLaGMKffVogeFHQ9zWVcXgqgf3PQnDsNs2g6M",
"symbol": "OXY",
"name": "Oxygen Protocol",
"decimals": 6,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/z3dn17yLaGMKffVogeFHQ9zWVcXgqgf3PQnDsNs2g6M/logo.svg",
"extensions": {
"coingeckoId": "oxygen",
"serumV3Usdc": "GZ3WBFsqntmERPwumFEYgrX2B7J7G11MzNZAy7Hje27X",
"serumV3Usdt": "GKLev6UHeX1KSDCyo2bzyG6wqhByEzDBkmYTxEdmYJgB",
"waterfallbot": "https://bit.ly/OXYwaterfall",
"website": "https://www.oxygen.org/"
}
},
{
"chainId": 101,
"address": "FtgGSFADXBtroxq8VCausXRr2of47QBf5AS1NtZCu4GD",
"symbol": "BRZ",
"name": "BRZ",
"decimals": 4,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/FtgGSFADXBtroxq8VCausXRr2of47QBf5AS1NtZCu4GD/logo.png",
"extensions": {
"coingeckoId": "brz",
"website": "https://brztoken.io/"
}
},
{
"chainId": 101,
"address": "Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB",
"symbol": "USDT",
"name": "USDT",
"decimals": 6,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB/logo.svg",
"tags": [
"stablecoin"
],
"extensions": {
"coingeckoId": "tether",
"serumV3Usdc": "77quYg4MGneUdjgXCunt9GgM1usmrxKY31twEy3WHwcS",
"website": "https://tether.to/"
}
},
{
"chainId": 101,
"address": "2oDxYGgTBmST4rc3yn1YtcSEck7ReDZ8wHWLqZAuNWXH",
"symbol": "wxMARK_v1",
"name": "Standard (Wormhole v1)",
"decimals": 9,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/2oDxYGgTBmST4rc3yn1YtcSEck7ReDZ8wHWLqZAuNWXH/logo.png",
"tags": [
"wrapped",
"wormhole"
],
"extensions": {
"address": "0x36b679bd64ed73dbfd88909cdcb892cb66bd4cbb",
"assetContract": "https://etherscan.io/address/0x36b679bd64ed73dbfd88909cdcb892cb66bd4cbb",
"bridgeContract": "https://etherscan.io/address/0xf92cD566Ea4864356C5491c177A430C222d7e678",
"coingeckoId": "xmark",
"website": "https://benchmarkprotocol.finance/"
}
},
{
"chainId": 101,
"address": "4k3Dyjzvzp8eMZWUXbBCjEvwSkkk59S5iCNLY3QrkX6R",
"symbol": "RAY",
"name": "Raydium",
"decimals": 6,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/4k3Dyjzvzp8eMZWUXbBCjEvwSkkk59S5iCNLY3QrkX6R/logo.png",
"extensions": {
"coingeckoId": "raydium",
"serumV3Usdc": "2xiv8A5xrJ7RnGdxXB42uFEkYHJjszEhaJyKKt4WaLep",
"serumV3Usdt": "teE55QrL4a4QSfydR9dnHF97jgCfptpuigbb53Lo95g",
"waterfallbot": "https://bit.ly/RAYwaterfall",
"website": "https://raydium.io/"
}
},
{
"chainId": 101,
"address": "CzPDyvotTcxNqtPne32yUiEVQ6jk42HZi1Y3hUu7qf7f",
"symbol": "RAY-WUSDT",
"name": "Raydium Legacy LP Token V2 (RAY-WUSDT)",
"decimals": 6,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/CzPDyvotTcxNqtPne32yUiEVQ6jk42HZi1Y3hUu7qf7f/logo.png",
"tags": [
"lp-token"
],
"extensions": {
"website": "https://raydium.io/"
}
},
{
"chainId": 101,
"address": "134Cct3CSdRCbYgq5SkwmHgfwjJ7EM5cG9PzqffWqECx",
"symbol": "RAY-SOL",
"name": "Raydium Legacy LP Token V2 (RAY-SOL)",
"decimals": 6,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/134Cct3CSdRCbYgq5SkwmHgfwjJ7EM5cG9PzqffWqECx/logo.png",
"tags": [
"lp-token"
],
"extensions": {
"website": "https://raydium.io/"
}
},
{
"chainId": 101,
"address": "EVDmwajM5U73PD34bYPugwiA4Eqqbrej4mLXXv15Z5qR",
"symbol": "LINK-WUSDT",
"name": "Raydium Legacy LP Token V2 (LINK-WUSDT)",
"decimals": 6,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/EVDmwajM5U73PD34bYPugwiA4Eqqbrej4mLXXv15Z5qR/logo.png",
"tags": [
"lp-token"
],
"extensions": {
"website": "https://raydium.io/"
}
},
{
"chainId": 101,
"address": "KY4XvwHy7JPzbWYAbk23jQvEb4qWJ8aCqYWREmk1Q7K",
"symbol": "ETH-WUSDT",
"name": "Raydium Legacy LP Token V2 (ETH-WUSDT)",
"decimals": 6,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/KY4XvwHy7JPzbWYAbk23jQvEb4qWJ8aCqYWREmk1Q7K/logo.png",
"tags": [
"lp-token"
],
"extensions": {
"website": "https://raydium.io/"
}
},
{
"chainId": 101,
"address": "FgmBnsF5Qrnv8X9bomQfEtQTQjNNiBCWRKGpzPnE5BDg",
"symbol": "RAY-USDC",
"name": "Raydium Legacy LP Token V2 (RAY-USDC)",
"decimals": 6,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/FgmBnsF5Qrnv8X9bomQfEtQTQjNNiBCWRKGpzPnE5BDg/logo.png",
"tags": [
"lp-token"
],
"extensions": {
"website": "https://raydium.io/"
}
},
{
"chainId": 101,
"address": "5QXBMXuCL7zfAk39jEVVEvcrz1AvBGgT9wAhLLHLyyUJ",
"symbol": "RAY-SRM",
"name": "Raydium Legacy LP Token V2 (RAY-SRM)",
"decimals": 6,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/5QXBMXuCL7zfAk39jEVVEvcrz1AvBGgT9wAhLLHLyyUJ/logo.png",
"tags": [
"lp-token"
],
"extensions": {
"website": "https://raydium.io/"
}
},
{
"chainId": 101,
"address": "FdhKXYjCou2jQfgKWcNY7jb8F2DPLU1teTTTRfLBD2v1",
"symbol": "RAY-WUSDT",
"name": "Raydium Legacy LP Token V3 (RAY-WUSDT)",
"decimals": 6,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/FdhKXYjCou2jQfgKWcNY7jb8F2DPLU1teTTTRfLBD2v1/logo.png",
"tags": [
"lp-token"
],
"extensions": {
"website": "https://raydium.io/"
}
},
{
"chainId": 101,
"address": "BZFGfXMrjG2sS7QT2eiCDEevPFnkYYF7kzJpWfYxPbcx",
"symbol": "RAY-USDC",
"name": "Raydium Legacy LP Token V3 (RAY-USDC)",
"decimals": 6,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/BZFGfXMrjG2sS7QT2eiCDEevPFnkYYF7kzJpWfYxPbcx/logo.png",
"tags": [
"lp-token"
],
"extensions": {
"website": "https://raydium.io/"
}
},
{
"chainId": 101,
"address": "DSX5E21RE9FB9hM8Nh8xcXQfPK6SzRaJiywemHBSsfup",
"symbol": "RAY-SRM",
"name": "Raydium Legacy LP Token V3 (RAY-SRM)",
"decimals": 6,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/DSX5E21RE9FB9hM8Nh8xcXQfPK6SzRaJiywemHBSsfup/logo.png",
"tags": [
"lp-token"
],
"extensions": {
"website": "https://raydium.io/"
}
},
{
"chainId": 101,
"address": "F5PPQHGcznZ2FxD9JaxJMXaf7XkaFFJ6zzTBcW8osQjw",
"symbol": "RAY-SOL",
"name": "Raydium Legacy LP Token V3 (RAY-SOL)",
"decimals": 6,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/F5PPQHGcznZ2FxD9JaxJMXaf7XkaFFJ6zzTBcW8osQjw/logo.png",
"tags": [
"lp-token"
],
"extensions": {
"website": "https://raydium.io/"
}
},
{
"chainId": 101,
"address": "8Q6MKy5Yxb9vG1mWzppMtMb2nrhNuCRNUkJTeiE3fuwD",
"symbol": "RAY-ETH",
"name": "Raydium Legacy LP Token V3 (RAY-ETH)",
"decimals": 6,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/8Q6MKy5Yxb9vG1mWzppMtMb2nrhNuCRNUkJTeiE3fuwD/logo.png",
"tags": [
"lp-token"
],
"extensions": {
"website": "https://raydium.io/"
}
},
{
"chainId": 101,
"address": "DsBuznXRTmzvEdb36Dx3aVLVo1XmH7r1PRZUFugLPTFv",
"symbol": "FIDA-RAY",
"name": "Raydium LP Token V4 (FIDA-RAY)",
"decimals": 6,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/DsBuznXRTmzvEdb36Dx3aVLVo1XmH7r1PRZUFugLPTFv/logo.png",
"tags": [
"lp-token"
],
"extensions": {
"website": "https://raydium.io/"
}
},
{
"chainId": 101,
"address": "FwaX9W7iThTZH5MFeasxdLpxTVxRcM7ZHieTCnYog8Yb",
"symbol": "OXY-RAY",
"name": "Raydium LP Token V4 (OXY-RAY)",
"decimals": 6,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/FwaX9W7iThTZH5MFeasxdLpxTVxRcM7ZHieTCnYog8Yb/logo.png",
"tags": [
"lp-token"
],
"extensions": {
"website": "https://raydium.io/"
}
},
{
"chainId": 101,
"address": "CcKK8srfVdTSsFGV3VLBb2YDbzF4T4NM2C3UEjC39RLP",
"symbol": "MAPS-RAY",
"name": "Raydium LP Token V4 (MAPS-RAY)",
"decimals": 6,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/CcKK8srfVdTSsFGV3VLBb2YDbzF4T4NM2C3UEjC39RLP/logo.png",
"tags": [
"lp-token"
],
"extensions": {
"website": "https://raydium.io/"
}
},
{
"chainId": 101,
"address": "CHT8sft3h3gpLYbCcZ9o27mT5s3Z6VifBVbUiDvprHPW",
"symbol": "KIN-RAY",
"name": "Raydium LP Token V4 (KIN-RAY)",
"decimals": 6,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/CHT8sft3h3gpLYbCcZ9o27mT5s3Z6VifBVbUiDvprHPW/logo.png",
"tags": [
"lp-token"
],
"extensions": {
"website": "https://raydium.io/"
}
},
{
"chainId": 101,
"address": "C3sT1R3nsw4AVdepvLTLKr5Gvszr7jufyBWUCvy4TUvT",
"symbol": "RAY-USDT",
"name": "Raydium LP Token V4 (RAY-USDT)",
"decimals": 6,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/C3sT1R3nsw4AVdepvLTLKr5Gvszr7jufyBWUCvy4TUvT/logo.png",
"tags": [
"lp-token"
],
"extensions": {
"website": "https://raydium.io/"
}
},
{
"chainId": 101,
"address": "8HoQnePLqPj4M7PUDzfw8e3Ymdwgc7NLGnaTUapubyvu",
"symbol": "SOL-USDC",
"name": "Raydium LP Token V4 (SOL-USDC)",
"decimals": 9,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/8HoQnePLqPj4M7PUDzfw8e3Ymdwgc7NLGnaTUapubyvu/logo.png",
"tags": [
"lp-token"
],
"extensions": {
"website": "https://raydium.io/"
}
},
{
"chainId": 101,
"address": "865j7iMmRRycSYUXzJ33ZcvLiX9JHvaLidasCyUyKaRE",
"symbol": "YFI-USDC",
"name": "Raydium LP Token V4 (YFI-USDC)",
"decimals": 6,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/865j7iMmRRycSYUXzJ33ZcvLiX9JHvaLidasCyUyKaRE/logo.png",
"tags": [
"lp-token"
],
"extensions": {
"website": "https://raydium.io/"
}
},
{
"chainId": 101,
"address": "9XnZd82j34KxNLgQfz29jGbYdxsYznTWRpvZE3SRE7JG",
"symbol": "SRM-USDC",
"name": "Raydium LP Token V4 (SRM-USDC)",
"decimals": 6,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/9XnZd82j34KxNLgQfz29jGbYdxsYznTWRpvZE3SRE7JG/logo.png",
"tags": [
"lp-token"
],
"extensions": {
"website": "https://raydium.io/"
}
},
{
"chainId": 101,
"address": "75dCoKfUHLUuZ4qEh46ovsxfgWhB4icc3SintzWRedT9",
"symbol": "FTT-USDC",
"name": "Raydium LP Token V4 (FTT-USDC)",
"decimals": 6,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/75dCoKfUHLUuZ4qEh46ovsxfgWhB4icc3SintzWRedT9/logo.png",
"tags": [
"lp-token"
],
"extensions": {
"website": "https://raydium.io/"
}
},
{
"chainId": 101,
"address": "2hMdRdVWZqetQsaHG8kQjdZinEMBz75vsoWTCob1ijXu",
"symbol": "BTC-USDC",
"name": "Raydium LP Token V4 (BTC-USDC)",
"decimals": 6,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/2hMdRdVWZqetQsaHG8kQjdZinEMBz75vsoWTCob1ijXu/logo.png",
"tags": [
"lp-token"
],
"extensions": {
"website": "https://raydium.io/"
}
},
{
"chainId": 101,
"address": "2QVjeR9d2PbSf8em8NE8zWd8RYHjFtucDUdDgdbDD2h2",
"symbol": "SUSHI-USDC",
"name": "Raydium LP Token V4 (SUSHI-USDC)",
"decimals": 6,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/2QVjeR9d2PbSf8em8NE8zWd8RYHjFtucDUdDgdbDD2h2/logo.png",
"tags": [
"lp-token"
],
"extensions": {
"website": "https://raydium.io/"
}
},
{
"chainId": 101,
"address": "CHyUpQFeW456zcr5XEh4RZiibH8Dzocs6Wbgz9aWpXnQ",
"symbol": "TOMO-USDC",
"name": "Raydium LP Token V4 (TOMO-USDC)",
"decimals": 6,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/CHyUpQFeW456zcr5XEh4RZiibH8Dzocs6Wbgz9aWpXnQ/logo.png",
"tags": [
"lp-token"
],
"extensions": {
"website": "https://raydium.io/"
}
},
{
"chainId": 101,
"address": "BqjoYjqKrXtfBKXeaWeAT5sYCy7wsAYf3XjgDWsHSBRs",
"symbol": "LINK-USDC",
"name": "Raydium LP Token V4 (LINK-USDC)",
"decimals": 6,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/BqjoYjqKrXtfBKXeaWeAT5sYCy7wsAYf3XjgDWsHSBRs/logo.png",
"tags": [
"lp-token"
],
"extensions": {
"website": "https://raydium.io/"
}
},
{
"chainId": 101,
"address": "13PoKid6cZop4sj2GfoBeujnGfthUbTERdE5tpLCDLEY",
"symbol": "ETH-USDC",
"name": "Raydium LP Token V4 (ETH-USDC)",
"decimals": 6,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/13PoKid6cZop4sj2GfoBeujnGfthUbTERdE5tpLCDLEY/logo.png",
"tags": [
"lp-token"
],
"extensions": {
"website": "https://raydium.io/"
}
},
{
"chainId": 101,
"address": "2Vyyeuyd15Gp8aH6uKE72c4hxc8TVSLibxDP9vzspQWG",
"symbol": "COPE-USDC",
"name": "Raydium LP Token V4 (COPE-USDC)",
"decimals": 0,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/2Vyyeuyd15Gp8aH6uKE72c4hxc8TVSLibxDP9vzspQWG/logo.png",
"tags": [
"lp-token"
],
"extensions": {
"website": "https://raydium.io/"
}
},
{
"chainId": 101,
"address": "Epm4KfTj4DMrvqn6Bwg2Tr2N8vhQuNbuK8bESFp4k33K",
"symbol": "SOL-USDT",
"name": "Raydium LP Token V4 (SOL-USDT)",
"decimals": 9,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/Epm4KfTj4DMrvqn6Bwg2Tr2N8vhQuNbuK8bESFp4k33K/logo.png",
"tags": [
"lp-token"
],
"extensions": {
"website": "https://raydium.io/"
}
},
{
"chainId": 101,
"address": "FA1i7fej1pAbQbnY8NbyYUsTrWcasTyipKreDgy1Mgku",
"symbol": "YFI-USDT",
"name": "Raydium LP Token V4 (YFI-USDT)",
"decimals": 6,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/FA1i7fej1pAbQbnY8NbyYUsTrWcasTyipKreDgy1Mgku/logo.png",
"tags": [
"lp-token"
],
"extensions": {
"website": "https://raydium.io/"
}
},
{
"chainId": 101,
"address": "HYSAu42BFejBS77jZAZdNAWa3iVcbSRJSzp3wtqCbWwv",
"symbol": "SRM-USDT",
"name": "Raydium LP Token V4 (SRM-USDT)",
"decimals": 6,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/HYSAu42BFejBS77jZAZdNAWa3iVcbSRJSzp3wtqCbWwv/logo.png",
"tags": [
"lp-token"
],
"extensions": {
"website": "https://raydium.io/"
}
},
{
"chainId": 101,
"address": "2cTCiUnect5Lap2sk19xLby7aajNDYseFhC9Pigou11z",
"symbol": "FTT-USDT",
"name": "Raydium LP Token V4 (FTT-USDT)",
"decimals": 6,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/2cTCiUnect5Lap2sk19xLby7aajNDYseFhC9Pigou11z/logo.png",
"tags": [
"lp-token"
],
"extensions": {
"website": "https://raydium.io/"
}
},
{
"chainId": 101,
"address": "DgGuvR9GSHimopo3Gc7gfkbKamLKrdyzWkq5yqA6LqYS",
"symbol": "BTC-USDT",
"name": "Raydium LP Token V4 (BTC-USDT)",
"decimals": 6,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/DgGuvR9GSHimopo3Gc7gfkbKamLKrdyzWkq5yqA6LqYS/logo.png",
"tags": [
"lp-token"
],
"extensions": {
"website": "https://raydium.io/"
}
},
{
"chainId": 101,
"address": "Ba26poEYDy6P2o95AJUsewXgZ8DM9BCsmnU9hmC9i4Ki",
"symbol": "SUSHI-USDT",
"name": "Raydium LP Token V4 (SUSHI-USDT)",
"decimals": 6,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/Ba26poEYDy6P2o95AJUsewXgZ8DM9BCsmnU9hmC9i4Ki/logo.png",
"tags": [
"lp-token"
],
"extensions": {
"website": "https://raydium.io/"
}
},
{
"chainId": 101,
"address": "D3iGro1vn6PWJXo9QAPj3dfta6dKkHHnmiiym2EfsAmi",
"symbol": "TOMO-USDT",
"name": "Raydium LP Token V4 (TOMO-USDT)",
"decimals": 6,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/D3iGro1vn6PWJXo9QAPj3dfta6dKkHHnmiiym2EfsAmi/logo.png",
"tags": [
"lp-token"
],
"extensions": {
"website": "https://raydium.io/"
}
},
{
"chainId": 101,
"address": "Dr12Sgt9gkY8WU5tRkgZf1TkVWJbvjYuPAhR3aDCwiiX",
"symbol": "LINK-USDT",
"name": "Raydium LP Token V4 (LINK-USDT)",
"decimals": 6,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/Dr12Sgt9gkY8WU5tRkgZf1TkVWJbvjYuPAhR3aDCwiiX/logo.png",
"tags": [
"lp-token"
],
"extensions": {
"website": "https://raydium.io/"
}
},
{
"chainId": 101,
"address": "nPrB78ETY8661fUgohpuVusNCZnedYCgghzRJzxWnVb",
"symbol": "ETH-USDT",
"name": "Raydium LP Token V4 (ETH-USDT)",
"decimals": 6,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/nPrB78ETY8661fUgohpuVusNCZnedYCgghzRJzxWnVb/logo.png",
"tags": [
"lp-token"
],
"extensions": {
"website": "https://raydium.io/"
}
},
{
"chainId": 101,
"address": "EGJht91R7dKpCj8wzALkjmNdUUUcQgodqWCYweyKcRcV",
"symbol": "YFI-SRM",
"name": "Raydium LP Token V4 (YFI-SRM)",
"decimals": 6,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/EGJht91R7dKpCj8wzALkjmNdUUUcQgodqWCYweyKcRcV/logo.png",
"tags": [
"lp-token"
],
"extensions": {
"website": "https://raydium.io/"
}
},
{
"chainId": 101,
"address": "AsDuPg9MgPtt3jfoyctUCUgsvwqAN6RZPftqoeiPDefM",
"symbol": "FTT-SRM",
"name": "Raydium LP Token V4 (FTT-SRM)",
"decimals": 6,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/AsDuPg9MgPtt3jfoyctUCUgsvwqAN6RZPftqoeiPDefM/logo.png",
"tags": [
"lp-token"
],
"extensions": {
"website": "https://raydium.io/"
}
},
{
"chainId": 101,
"address": "AGHQxXb3GSzeiLTcLtXMS2D5GGDZxsB2fZYZxSB5weqB",
"symbol": "BTC-SRM",
"name": "Raydium LP Token V4 (BTC-SRM)",
"decimals": 6,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/AGHQxXb3GSzeiLTcLtXMS2D5GGDZxsB2fZYZxSB5weqB/logo.png",
"tags": [
"lp-token"
],
"extensions": {
"website": "https://raydium.io/"
}
},
{
"chainId": 101,
"address": "3HYhUnUdV67j1vn8fu7ExuVGy5dJozHEyWvqEstDbWwE",
"symbol": "SUSHI-SRM",
"name": "Raydium LP Token V4 (SUSHI-SRM)",
"decimals": 6,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/3HYhUnUdV67j1vn8fu7ExuVGy5dJozHEyWvqEstDbWwE/logo.png",
"tags": [
"lp-token"
],
"extensions": {
"website": "https://raydium.io/"
}
},
{
"chainId": 101,
"address": "GgH9RnKrQpaMQeqmdbMvs5oo1A24hERQ9wuY2pSkeG7x",
"symbol": "TOMO-SRM",
"name": "Raydium LP Token V4 (TOMO-SRM)",
"decimals": 6,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/GgH9RnKrQpaMQeqmdbMvs5oo1A24hERQ9wuY2pSkeG7x/logo.png",
"tags": [
"lp-token"
],
"extensions": {
"website": "https://raydium.io/"
}
},
{
"chainId": 101,
"address": "GXN6yJv12o18skTmJXaeFXZVY1iqR18CHsmCT8VVCmDD",
"symbol": "LINK-SRM",
"name": "Raydium LP Token V4 (LINK-SRM)",
"decimals": 6,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/GXN6yJv12o18skTmJXaeFXZVY1iqR18CHsmCT8VVCmDD/logo.png",
"tags": [
"lp-token"
],
"extensions": {
"website": "https://raydium.io/"
}
},
{
"chainId": 101,
"address": "9VoY3VERETuc2FoadMSYYizF26mJinY514ZpEzkHMtwG",
"symbol": "ETH-SRM",
"name": "Raydium LP Token V4 (ETH-SRM)",
"decimals": 6,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/9VoY3VERETuc2FoadMSYYizF26mJinY514ZpEzkHMtwG/logo.png",
"tags": [
"lp-token"
],
"extensions": {
"website": "https://raydium.io/"
}
},
{
"chainId": 101,
"address": "AKJHspCwDhABucCxNLXUSfEzb7Ny62RqFtC9uNjJi4fq",
"symbol": "SRM-SOL",
"name": "Raydium LP Token V4 (SRM-SOL)",
"decimals": 6,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/AKJHspCwDhABucCxNLXUSfEzb7Ny62RqFtC9uNjJi4fq/logo.png",
"tags": [
"lp-token"
],
"extensions": {
"website": "https://raydium.io/"
}
},
{
"chainId": 101,
"address": "2doeZGLJyACtaG9DCUyqMLtswesfje1hjNA11hMdj6YU",
"symbol": "TULIP-USDC",
"name": "Raydium LP Token V4 (TULIP-USDC)",
"decimals": 6,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/2doeZGLJyACtaG9DCUyqMLtswesfje1hjNA11hMdj6YU/logo.svg",
"tags": [
"lp-token"
],
"extensions": {
"website": "https://raydium.io/"
}
},
{
"chainId": 101,
"address": "AcstFzGGawvvdVhYV9bftr7fmBHbePUjhv53YK1W3dZo",
"symbol": "LSD",
"name": "LSD",
"decimals": 9,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/AcstFzGGawvvdVhYV9bftr7fmBHbePUjhv53YK1W3dZo/logo.svg",
"tags": [
"nft"
],
"extensions": {
"website": "https://solible.com/"
}
},
{
"chainId": 101,
"address": "91fSFQsPzMLat9DHwLdQacW3i3EGnWds5tA5mt7yLiT9",
"symbol": "Unlimited Energy",
"name": "Unlimited Energy",
"decimals": 9,
"logoURI": "",
"tags": [
"nft"
],
"extensions": {
"website": "https://solible.com/"
}
},
{
"chainId": 101,
"address": "29PEpZeuqWf9tS2gwCjpeXNdXLkaZSMR2s1ibkvGsfnP",
"symbol": "Need for Speed",
"name": "Need for Speed",
"decimals": 9,
"logoURI": "",
"tags": [
"nft"
],
"extensions": {
"website": "https://solible.com/"
}
},
{
"chainId": 101,
"address": "HsY8PNar8VExU335ZRYzg89fX7qa4upYu6vPMPFyCDdK",
"symbol": "ADOR OPENS",
"name": "ADOR OPENS",
"decimals": 0,
"logoURI": "",
"tags": [
"nft"
],
"extensions": {
"website": "https://solible.com/"
}
},
{
"chainId": 101,
"address": "EDP8TpLJ77M3KiDgFkZW4v4mhmKJHZi9gehYXenfFZuL",
"symbol": "CMS - Rare",
"name": "CMS - Rare",
"decimals": 0,
"logoURI": "",
"tags": [
"nft"
],
"extensions": {
"website": "https://solible.com/"
}
},
{
"chainId": 101,
"address": "BrUKFwAABkExb1xzYU4NkRWzjBihVQdZ3PBz4m5S8if3",
"symbol": "Tesla",
"name": "Tesla",
"decimals": 0,
"logoURI": "",
"tags": [
"nft"
],
"extensions": {
"website": "https://solible.com/"
}
},
{
"chainId": 101,
"address": "9CmQwpvVXRyixjiE3LrbSyyopPZohNDN1RZiTk8rnXsQ",
"symbol": "DeceFi",
"name": "DeceFi",
"decimals": 0,
"logoURI": "",
"tags": [
"nft"
],
"extensions": {
"website": "https://solible.com/"
}
},
{
"chainId": 101,
"address": "F6ST1wWkx2PeH45sKmRxo1boyuzzWCfpnvyKL4BGeLxF",
"symbol": "Power User",
"name": "Power User",
"decimals": 0,
"logoURI": "",
"tags": [
"nft"
],
"extensions": {
"website": "https://solible.com/"
}
},
{
"chainId": 101,
"address": "dZytJ7iPDcCu9mKe3srL7bpUeaR3zzkcVqbtqsmxtXZ",
"symbol": "VIP Member",
"name": "VIP Member",
"decimals": 0,
"logoURI": "",
"tags": [
"nft"
],
"extensions": {
"website": "https://solible.com/"
}
},
{
"chainId": 101,
"address": "8T4vXgwZUWwsbCDiptHFHjdfexvLG9UP8oy1psJWEQdS",
"symbol": "Uni Christmas",
"name": "Uni Christmas",
"decimals": 0,
"logoURI": "",
"tags": [
"nft"
],
"extensions": {
"website": "https://solible.com/"
}
},
{
"chainId": 101,
"address": "EjFGGJSyp9UDS8aqafET5LX49nsG326MeNezYzpiwgpQ",
"symbol": "BNB",
"name": "BNB",
"decimals": 0,
"logoURI": "",
"tags": [
"nft"
],
"extensions": {
"website": "https://solible.com/"
}
},
{
"chainId": 101,
"address": "FkmkTr4en8CXkfo9jAwEMov6PVNLpYMzWr3Udqf9so8Z",
"symbol": "Seldom",
"name": "Seldom",
"decimals": 9,
"logoURI": "",
"tags": [
"nft"
],
"extensions": {
"website": "https://solible.com/"
}
},
{
"chainId": 101,
"address": "2gn1PJdMAU92SU5inLSp4Xp16ZC5iLF6ScEi7UBvp8ZD",
"symbol": "Satoshi Closeup",
"name": "Satoshi Closeup",
"decimals": 9,
"logoURI": "",
"tags": [
"nft"
],
"extensions": {
"website": "https://solible.com/"
}
},
{
"chainId": 101,
"address": "7mhZHtPL4GFkquQR4Y6h34Q8hNkQvGc1FaNtyE43NvUR",
"symbol": "Satoshi GB",
"name": "Satoshi GB",
"decimals": 9,
"logoURI": "",
"tags": [
"nft"
],
"extensions": {
"website": "https://solible.com/"
}
},
{
"chainId": 101,
"address": "8RoKfLx5RCscbtVh8kYb81TF7ngFJ38RPomXtUREKsT2",
"symbol": "Satoshi OG",
"name": "Satoshi OG",
"decimals": 9,
"logoURI": "",
"tags": [
"nft"
],
"extensions": {
"website": "https://solible.com/"
}
},
{
"chainId": 101,
"address": "9rw5hyDngBQ3yDsCRHqgzGHERpU2zaLh1BXBUjree48J",
"symbol": "Satoshi BTC",
"name": "Satoshi BTC",
"decimals": 9,
"logoURI": "",
"tags": [
"nft"
],
"extensions": {
"website": "https://solible.com/"
}
},
{
"chainId": 101,
"address": "AiD7J6D5Hny5DJB1MrYBc2ePQqy2Yh4NoxWwYfR7PzxH",
"symbol": "Satoshi GB",
"name": "Satoshi GB",
"decimals": 9,
"logoURI": "",
"tags": [
"nft"
],
"extensions": {
"website": "https://solible.com/"
}
},
{
"chainId": 101,
"address": "4qzEcYvT6TuJME2EMZ5vjaLvQja6R4hKjarA73WQUwt6",
"symbol": "APESZN_HOODIE",
"name": "APESZN_HOODIE",
"decimals": 0,
"logoURI": "",
"tags": [
"nft"
],
"extensions": {
"website": "https://solible.com/"
}
},
{
"chainId": 101,
"address": "APhyVWtzjdTVYhyta9ngSiCDk2pLi8eEZKsHGSbsmwv6",
"symbol": "APESZN_TEE_SHIRT",
"name": "APESZN_TEE_SHIRT",
"decimals": 0,
"logoURI": "",
"tags": [
"nft"
],
"extensions": {
"website": "https://solible.com/"
}
},
{
"chainId": 101,
"address": "bxiA13fpU1utDmYuUvxvyMT8odew5FEm96MRv7ij3eb",
"symbol": "Satoshi",
"name": "Satoshi",
"decimals": 9,
"logoURI": "",
"tags": [
"nft"
],
"extensions": {
"website": "https://solible.com/"
}
},
{
"chainId": 101,
"address": "GoC24kpj6TkvjzspXrjSJC2CVb5zMWhLyRcHJh9yKjRF",
"symbol": "Satoshi Closeup",
"name": "Satoshi Closeup",
"decimals": 9,
"logoURI": "",
"tags": [
"nft"
],
"extensions": {
"website": "https://solible.com/"
}
},
{
"chainId": 101,
"address": "oCUduD44ETuZ65bpWdPzPDSnAdreg1sJrugfwyFZVHV",
"symbol": "Satoshi BTC",
"name": "Satoshi BTC",
"decimals": 9,
"logoURI": "",
"tags": [
"nft"
],
"extensions": {
"website": "https://solible.com/"
}
},
{
"chainId": 101,
"address": "9Vvre2DxBB9onibwYDHeMsY1cj6BDKtEDccBPWRN215E",
"symbol": "Satoshi Nakamoto",
"name": "Satoshi Nakamoto",
"decimals": 9,
"logoURI": "",
"tags": [
"nft"
],
"extensions": {
"website": "https://solible.com/"
}
},
{
"chainId": 101,
"address": "7RpFk44cMTAUt9CcjEMWnZMypE9bYQsjBiSNLn5qBvhP",
"symbol": "Charles Hoskinson",
"name": "Charles Hoskinson",
"decimals": 9,
"logoURI": "",
"tags": [
"nft"
],
"extensions": {
"website": "https://solible.com/"
}
},
{
"chainId": 101,
"address": "GyRkPAxpd9XrMHcBF6fYHVRSZQvQBwAGKAGQeBPSKzMq",
"symbol": "SBF",
"name": "SBF",
"decimals": 0,
"logoURI": "",
"tags": [
"nft"
],
"extensions": {
"website": "https://solible.com/"
}
},
{
"chainId": 101,
"address": "AgdBQN2Sy2abiZ2KToWeUsQ9PHdCv95wt6kVWRf5zDkx",
"symbol": "Bitcoin Tram",
"name": "Bitcoin Tram",
"decimals": 0,
"logoURI": "",
"tags": [
"nft"
],
"extensions": {
"website": "https://solible.com/"
}
},
{
"chainId": 101,
"address": "7TRzvCqXN8KSXggbSyeEG2Z9YBBhEFmbtmv6FLbd4mmd",
"symbol": "SRM tee-shirt",
"name": "SRM tee-shirt",
"decimals": 0,
"logoURI": "",
"tags": [
"nft"
],
"extensions": {
"website": "https://solible.com/"
}
},
{
"chainId": 101,
"address": "gksYzxitEf2HyE7Bb81vvHXNH5f3wa43jvXf4TcUZwb",
"symbol": "PERK",
"name": "PERK",
"decimals": 6,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/gksYzxitEf2HyE7Bb81vvHXNH5f3wa43jvXf4TcUZwb/logo.png",
"extensions": {
"twitter": "https://twitter.com/PerkExchange",
"website": "https://perk.exchange/"
}
},
{
"chainId": 101,
"address": "BDxWSxkMLW1nJ3VggamUKkEKrtCaVqzFxoDApM8HdBks",
"symbol": "BTSG",
"name": "BitSong",
"decimals": 6,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/BDxWSxkMLW1nJ3VggamUKkEKrtCaVqzFxoDApM8HdBks/logo.png",
"extensions": {
"coingeckoId": "bitsong",
"website": "https://bitsong.io/"
}
},
{
"chainId": 101,
"address": "5ddiFxh3J2tcZHfn8uhGRYqu16P3FUvBfh8WoZPUHKW5",
"symbol": "EOSBEAR",
"name": "EOSBEAR",
"decimals": 6,
"logoURI": "",
"tags": [
"leveraged",
"bear"
],
"extensions": {
"coingeckoId": "3x-short-eos-token",
"serumV3Usdc": "2BQrJP599QVKRyHhyJ6oRrTPNUmPBgXxiBo2duvYdacy"
}
},
{
"chainId": 101,
"address": "qxxF6S62hmZF5bo46mS7C2qbBa87qRossAM78VzsDqi",
"symbol": "EOSBULL",
"name": "EOSBULL",
"decimals": 6,
"logoURI": "",
"tags": [
"leveraged",
"bull"
],
"extensions": {
"coingeckoId": "3x-long-eos-token"
}
},
{
"chainId": 101,
"address": "2CDLbxeuqkLTLY3em6FFQgfBQV5LRnEsJJgcFCvWKNcS",
"symbol": "BNBBEAR",
"name": "BNBBEAR",
"decimals": 6,
"logoURI": "",
"tags": [
"leveraged",
"bear"
],
"extensions": {
"coingeckoId": "3x-short-bnb-token"
}
},
{
"chainId": 101,
"address": "AfjHjdLibuXyvmz7PyTSc5KEcGBh43Kcu8Sr2tyDaJyt",
"symbol": "BNBBULL",
"name": "BNBBULL",
"decimals": 6,
"logoURI": "",
"tags": [
"leveraged",
"bull"
],
"extensions": {
"coingeckoId": "3x-long-bnb-token"
}
},
{
"chainId": 101,
"address": "8kA1WJKoLTxtACNPkvW6UNufsrpxUY57tXZ9KmG9123t",
"symbol": "BSVBULL",
"name": "BSVBULL",
"decimals": 6,
"logoURI": "",
"tags": [
"leveraged",
"bull"
],
"extensions": {
"coingeckoId": "3x-long-bitcoin-sv-token"
}
},
{
"chainId": 101,
"address": "2FGW8BVMu1EHsz2ZS9rZummDaq6o2DVrZZPw4KaAvDWh",
"symbol": "BSVBEAR",
"name": "BSVBEAR",
"decimals": 6,
"logoURI": "",
"tags": [
"leveraged",
"bear"
],
"extensions": {
"coingeckoId": "3x-short-bitcoin-sv-token"
}
},
{
"chainId": 101,
"address": "8L9XGTMzcqS9p61zsR35t7qipwAXMYkD6disWoDFZiFT",
"symbol": "LTCBEAR",
"name": "LTCBEAR",
"decimals": 6,
"logoURI": "",
"tags": [
"leveraged",
"bear"
],
"extensions": {
"coingeckoId": "3x-short-litecoin-token"
}
},
{
"chainId": 101,
"address": "863ZRjf1J8AaVuCqypAdm5ktVyGYDiBTvD1MNHKrwyjp",
"symbol": "LTCBULL",
"name": "LTCBULL",
"decimals": 6,
"logoURI": "",
"tags": [
"leveraged",
"bull"
],
"extensions": {
"coingeckoId": "3x-long-litecoin-token"
}
},
{
"chainId": 101,
"address": "GkSPaHdY2raetuYzsJYacHtrAtQUfWt64bpd1VzxJgSD",
"symbol": "BULL",
"name": "BULL",
"decimals": 6,
"logoURI": "",
"tags": [
"leveraged",
"bull"
],
"extensions": {
"coingeckoId": "3x-long-bitcoin-token"
}
},
{
"chainId": 101,
"address": "45vwTZSDFBiqCMRdtK4xiLCHEov8LJRW8GwnofG8HYyH",
"symbol": "BEAR",
"name": "BEAR",
"decimals": 6,
"logoURI": "",
"tags": [
"leveraged",
"bear"
],
"extensions": {
"coingeckoId": "3x-short-bitcoin-token"
}
},
{
"chainId": 101,
"address": "2VTAVf1YCwamD3ALMdYHRMV5vPUCXdnatJH5f1khbmx6",
"symbol": "BCHBEAR",
"name": "BCHBEAR",
"decimals": 6,
"logoURI": "",
"tags": [
"leveraged",
"bear"
],
"extensions": {
"coingeckoId": "3x-short-bitcoin-cash-token"
}
},
{
"chainId": 101,
"address": "22xoSp66BDt4x4Q5xqxjaSnirdEyharoBziSFChkLFLy",
"symbol": "BCHBULL",
"name": "BCHBULL",
"decimals": 6,
"logoURI": "",
"tags": [
"leveraged",
"bull"
],
"extensions": {
"coingeckoId": "3x-long-bitcoin-cash-token"
}
},
{
"chainId": 101,
"address": "CwChm6p9Q3yFrjzVeiLTTbsoJkooscof5SJYZc2CrNqG",
"symbol": "ETHBULL",
"name": "ETHBULL",
"decimals": 6,
"logoURI": "",
"tags": [
"leveraged",
"bull"
],
"extensions": {
"coingeckoId": "3x-long-ethereum-token",
"serumV3Usdt": "FuhKVt5YYCv7vXnADXtb7vqzYn82PJoap86q5wm8LX8Q"
}
},
{
"chainId": 101,
"address": "Bvv9xLodFrvDFSno9Ud8SEh5zVtBDQQjnBty2SgMcJ2s",
"symbol": "ETHBEAR",
"name": "ETHBEAR",
"decimals": 6,
"logoURI": "",
"tags": [
"leveraged",
"bear"
],
"extensions": {
"coingeckoId": "3x-short-ethereum-token"
}
},
{
"chainId": 101,
"address": "HRhaNssoyv5tKFRcbPg69ULEbcD8DPv99GdXLcdkgc1A",
"symbol": "ALTBULL",
"name": "ALTBULL",
"decimals": 6,
"logoURI": "",
"tags": [
"leveraged",
"bull"
],
"extensions": {
"coingeckoId": "3x-long-altcoin-index-token"
}
},
{
"chainId": 101,
"address": "9Mu1KmjBKTUWgpDoeTJ5oD7XFQmEiZxzspEd3TZGkavx",
"symbol": "ALTBEAR",
"name": "ALTBEAR",
"decimals": 6,
"logoURI": "",
"tags": [
"leveraged",
"bear"
],
"extensions": {
"coingeckoId": "3x-short-altcoin-index-token"
}
},
{
"chainId": 101,
"address": "AYL1adismZ1U9pTuN33ahG4aYc5XTZQL4vKFx9ofsGWD",
"symbol": "BULLSHIT",
"name": "BULLSHIT",
"decimals": 6,
"logoURI": "",
"tags": [
"leveraged",
"bull"
],
"extensions": {
"coingeckoId": "3x-long-shitcoin-index-token"
}
},
{
"chainId": 101,
"address": "5jqymuoXXVcUuJKrf1MWiHSqHyg2osMaJGVy69NsJWyP",
"symbol": "BEARSHIT",
"name": "BEARSHIT",
"decimals": 6,
"logoURI": "",
"tags": [
"leveraged",
"bear"
],
"extensions": {
"coingeckoId": "3x-short-shitcoin-index-token"
}
},
{
"chainId": 101,
"address": "EL1aDTnLKjf4SaGpqtxJPyK94imSBr8fWDbcXjXQrsmj",
"symbol": "MIDBULL",
"name": "MIDBULL",
"decimals": 6,
"logoURI": "",
"tags": [
"leveraged",
"bull"
],
"extensions": {
"coingeckoId": "3x-long-midcap-index-token",
"serumV3Usdc": "8BBtLkoaEyavREriwGUudzAcihTH9SJLAPBbgb7QZe9y"
}
},
{
"chainId": 101,
"address": "2EPvVjHusU3ozoucmdhhnqv3HQtBsQmjTnSa87K91HkC",
"symbol": "MIDBEAR",
"name": "MIDBEAR",
"decimals": 6,
"logoURI": "",
"tags": [
"leveraged",
"bear"
],
"extensions": {
"coingeckoId": "3x-short-midcap-index-token"
}
},
{
"chainId": 101,
"address": "8TCfJTyeqNBZqyDMY4VwDY7kdCCY7pcbJJ58CnKHkMu2",
"symbol": "LINKBEAR",
"name": "LINKBEAR",
"decimals": 6,
"logoURI": "",
"tags": [
"leveraged",
"bear"
],
"extensions": {
"coingeckoId": "3x-short-chainlink-token"
}
},
{
"chainId": 101,
"address": "EsUoZMbACNMppdqdmuLCFLet8VXxt2h47N9jHCKwyaPz",
"symbol": "LINKBULL",
"name": "LINKBULL",
"decimals": 6,
"logoURI": "",
"tags": [
"leveraged",
"bull"
],
"extensions": {
"coingeckoId": "3x-long-chainlink-token"
}
},
{
"chainId": 101,
"address": "262cQHT3soHwzuo2oVSy5kAfHcFZ1Jjn8C1GRLcQNKA3",
"symbol": "XRPBULL",
"name": "XRPBULL",
"decimals": 6,
"logoURI": "",
"tags": [
"leveraged",
"bull"
],
"extensions": {
"coingeckoId": "3x-long-xrp-token"
}
},
{
"chainId": 101,
"address": "5AX3ZyDN1rpamEzHpLfsJ5t6TyNECKSwPRfnzVHVuRFj",
"symbol": "YUMZ",
"name": "Food tasting Social Token",
"decimals": 9,
"logoURI": "https://cdn.jsdelivr.net/gh/yu-ming-chen/yumzToken/logo.JPG",
"tags": [
"social-token",
"yumz"
]
},
{
"chainId": 101,
"address": "8sxtSswmQ7Lcd2GjK6am37Z61wJZjA2SzE7Luf7yaKBB",
"symbol": "XRPBEAR",
"name": "XRPBEAR",
"decimals": 6,
"logoURI": "",
"tags": [
"leveraged",
"bear"
],
"extensions": {
"coingeckoId": "3x-short-xrp-token"
}
},
{
"chainId": 101,
"address": "91z91RukFM16hyEUCXuwMQwp2BW3vanNG5Jh5yj6auiJ",
"symbol": "BVOL",
"name": "BVOL",
"decimals": 6,
"logoURI": "",
"extensions": {
"coingeckoId": "1x-long-btc-implied-volatility-token"
}
},
{
"chainId": 101,
"address": "5TY71D29Cyuk9UrsSxLXw2quJBpS7xDDFuFu2K9W7Wf9",
"symbol": "IBVOL",
"name": "IBlive",
"decimals": 6,
"logoURI": "",
"extensions": {
"coingeckoId": "1x-short-btc-implied-volatility"
}
},
{
"chainId": 101,
"address": "dK83wTVypEpa1pqiBbHY3MNuUnT3ADUZM4wk9VZXZEc",
"symbol": "soAAVE",
"name": "Wrapped Aave (Sollet)",
"decimals": 6,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/dK83wTVypEpa1pqiBbHY3MNuUnT3ADUZM4wk9VZXZEc/logo.png",
"extensions": {
"coingeckoId": "aave",
"serumV3Usdt": "6bxuB5N3bt3qW8UnPNLgMMzDq5sEH8pFmYJYGgzvE11V"
}
},
{
"chainId": 101,
"address": "A6aY2ceogBz1VaXBxm1j2eJuNZMRqrWUAnKecrMH85zj",
"symbol": "LQID",
"name": "LQID",
"decimals": 6,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/A6aY2ceogBz1VaXBxm1j2eJuNZMRqrWUAnKecrMH85zj/logo.svg"
},
{
"chainId": 101,
"address": "7CnFGR9mZWyAtWxPcVuTewpyC3A3MDW4nLsu5NY6PDbd",
"symbol": "SECO",
"name": "SECO",
"decimals": 6,
"logoURI": "",
"extensions": {
"coingeckoId": "serum-ecosystem-token"
}
},
{
"chainId": 101,
"address": "3GECTP7H4Tww3w8jEPJCJtXUtXxiZty31S9szs84CcwQ",
"symbol": "HOLY",
"name": "HOLY",
"decimals": 6,
"logoURI": "",
"extensions": {
"coingeckoId": "holy-trinity"
}
},
{
"chainId": 101,
"address": "6ry4WBDvAwAnrYJVv6MCog4J8zx6S3cPgSqnTsDZ73AR",
"symbol": "TRYB",
"name": "TRYB",
"decimals": 6,
"logoURI": "",
"extensions": {
"coingeckoId": "bilira",
"serumV3Usdt": "AADohBGxvf7bvixs2HKC3dG2RuU3xpZDwaTzYFJThM8U"
}
},
{
"chainId": 101,
"address": "ASboaJPFtJeCS5eG4gL3Lg95xrTz2UZSLE9sdJtY93kE",
"symbol": "DOGEBULL",
"name": "DOGEBULL",
"decimals": 6,
"logoURI": "",
"tags": [
"leveraged",
"bull"
],
"extensions": {
"coingeckoId": "3x-long-dogecoin-token"
}
},
{
"chainId": 101,
"address": "Gnhy3boBT4MA8TTjGip5ND2uNsceh1Wgeaw1rYJo51ZY",
"symbol": "MAPSPOOL",
"name": "Bonfida Maps Pool",
"decimals": 6,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/Gnhy3boBT4MA8TTjGip5ND2uNsceh1Wgeaw1rYJo51ZY/logo.svg",
"extensions": {
"website": "https://bonfida.com/"
}
},
{
"chainId": 101,
"address": "9iDWyYZ5VHBCxxmWZogoY3Z6FSbKsX4WFe37c728krdT",
"symbol": "OXYPOOL",
"name": "Bonfida Oxy Pool",
"decimals": 6,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/9iDWyYZ5VHBCxxmWZogoY3Z6FSbKsX4WFe37c728krdT/logo.svg",
"extensions": {
"website": "https://bonfida.com/"
}
},
{
"chainId": 101,
"address": "D68NB5JkzvyNCZAvi6EGtEcGvSoRNPanU9heYTAUFFRa",
"symbol": "PERP",
"name": "PERP",
"decimals": 6,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/D68NB5JkzvyNCZAvi6EGtEcGvSoRNPanU9heYTAUFFRa/logo.png",
"extensions": {
"coingeckoId": "perpetual-protocol"
}
},
{
"chainId": 101,
"address": "4fiysjiegD8yoqHX75YXBvhBzmaUEQhyuAVRX8fGL3F1",
"symbol": "RAYPOOL",
"name": "Bonfida Ray Pool",
"decimals": 6,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/93a1L7xaEV7vZGzNXCcb9ztZedbpKgUiTHYxmFKJwKvc/logo.png",
"extensions": {
"website": "https://bonfida.com/"
}
},
{
"chainId": 101,
"address": "FeGn77dhg1KXRRFeSwwMiykZnZPw5JXW6naf2aQgZDQf",
"symbol": "wWETH_v1",
"name": "Wrapped Ether (Wormhole v1)",
"decimals": 9,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/FeGn77dhg1KXRRFeSwwMiykZnZPw5JXW6naf2aQgZDQf/logo.png",
"tags": [
"wrapped",
"wormhole"
],
"extensions": {
"address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",
"assetContract": "https://etherscan.io/address/0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",
"bridgeContract": "https://etherscan.io/address/0xf92cD566Ea4864356C5491c177A430C222d7e678",
"coingeckoId": "ethereum"
}
},
{
"chainId": 101,
"address": "FeLoyXk8ac2AYVmDhAWEKNWWT63Z9TczeidYbpDvxF3T",
"symbol": "wCAPS_v1",
"name": "Wrapped Capsule Coin (Wormhole v1)",
"decimals": 8,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/FeLoyXk8ac2AYVmDhAWEKNWWT63Z9TczeidYbpDvxF3T/logo.svg",
"tags": [
"wrapped",
"wormhole"
],
"extensions": {
"address": "0x03be5c903c727ee2c8c4e9bc0acc860cca4715e2",
"assetContract": "https://etherscan.io/address/0x03be5c903c727ee2c8c4e9bc0acc860cca4715e2",
"bridgeContract": "https://etherscan.io/address/0xf92cD566Ea4864356C5491c177A430C222d7e678",
"coingeckoId": "coin-capsule",
"website": "https://www.ternoa.com/en"
}
},
{
"chainId": 101,
"address": "GbBWwtYTMPis4VHb8MrBbdibPhn28TSrLB53KvUmb7Gi",
"symbol": "wFTT_v1",
"name": "FTT (Wormhole v1)",
"decimals": 9,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/GbBWwtYTMPis4VHb8MrBbdibPhn28TSrLB53KvUmb7Gi/logo.png",
"tags": [
"wrapped",
"wormhole"
],
"extensions": {
"address": "0x50d1c9771902476076ecfc8b2a83ad6b9355a4c9",
"assetContract": "https://etherscan.io/address/0x50d1c9771902476076ecfc8b2a83ad6b9355a4c9",
"bridgeContract": "https://etherscan.io/address/0xf92cD566Ea4864356C5491c177A430C222d7e678",
"coingeckoId": "ftx-token"
}
},
{
"chainId": 101,
"address": "AbLwQCyU9S8ycJgu8wn6woRCHSYJmjMpJFcAHQ6vjq2P",
"symbol": "wTUSD_v1",
"name": "TrueUSD (Wormhole v1)",
"decimals": 9,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/AbLwQCyU9S8ycJgu8wn6woRCHSYJmjMpJFcAHQ6vjq2P/logo.png",
"tags": [
"wrapped",
"wormhole"
],
"extensions": {
"address": "0x0000000000085d4780B73119b644AE5ecd22b376",
"assetContract": "https://etherscan.io/address/0x0000000000085d4780B73119b644AE5ecd22b376",
"bridgeContract": "https://etherscan.io/address/0xf92cD566Ea4864356C5491c177A430C222d7e678",
"coingeckoId": "true-usd"
}
},
{
"chainId": 101,
"address": "3JfuyCg5891hCX1ZTbvt3pkiaww3XwgyqQH6E9eHtqKD",
"symbol": "wLON_v1",
"name": "Tokenlon (Wormhole v1)",
"decimals": 9,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/3JfuyCg5891hCX1ZTbvt3pkiaww3XwgyqQH6E9eHtqKD/logo.png",
"tags": [
"wrapped",
"wormhole"
],
"extensions": {
"address": "0x0000000000095413afC295d19EDeb1Ad7B71c952",
"assetContract": "https://etherscan.io/address/0x0000000000095413afC295d19EDeb1Ad7B71c952",
"bridgeContract": "https://etherscan.io/address/0xf92cD566Ea4864356C5491c177A430C222d7e678",
"coingeckoId": "tokenlon"
}
},
{
"chainId": 101,
"address": "6k7mrqiAqEWnABVN8FhfuNUrmrnaMh44nNWydNXctbpV",
"symbol": "wALBT_v1",
"name": "AllianceBlock Token (Wormhole v1)",
"decimals": 9,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/6k7mrqiAqEWnABVN8FhfuNUrmrnaMh44nNWydNXctbpV/logo.png",
"tags": [
"wrapped",
"wormhole"
],
"extensions": {
"address": "0x00a8b738E453fFd858a7edf03bcCfe20412f0Eb0",
"assetContract": "https://etherscan.io/address/0x00a8b738E453fFd858a7edf03bcCfe20412f0Eb0",
"bridgeContract": "https://etherscan.io/address/0xf92cD566Ea4864356C5491c177A430C222d7e678",
"coingeckoId": "allianceblock"
}
},
{
"chainId": 101,
"address": "4b166BQEQunjg8oNTDcLeWU3nidQnVTL1Vni8ANU7Mvt",
"symbol": "wSKL_v1",
"name": "SKALE (Wormhole v1)",
"decimals": 9,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/4b166BQEQunjg8oNTDcLeWU3nidQnVTL1Vni8ANU7Mvt/logo.png",
"tags": [
"wrapped",
"wormhole"
],
"extensions": {
"address": "0x00c83aeCC790e8a4453e5dD3B0B4b3680501a7A7",
"assetContract": "https://etherscan.io/address/0x00c83aeCC790e8a4453e5dD3B0B4b3680501a7A7",
"bridgeContract": "https://etherscan.io/address/0xf92cD566Ea4864356C5491c177A430C222d7e678",
"coingeckoId": "skale"
}
},
{
"chainId": 101,
"address": "CcHhpEx9VcWx7UBJC8DJaR5h3wNdexsQtB1nEfekjSHn",
"symbol": "wUFT_v1",
"name": "UniLend Finance Token (Wormhole v1)",
"decimals": 9,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/CcHhpEx9VcWx7UBJC8DJaR5h3wNdexsQtB1nEfekjSHn/logo.png",
"tags": [
"wrapped",
"wormhole"
],
"extensions": {
"address": "0x0202Be363B8a4820f3F4DE7FaF5224fF05943AB1",
"assetContract": "https://etherscan.io/address/0x0202Be363B8a4820f3F4DE7FaF5224fF05943AB1",
"bridgeContract": "https://etherscan.io/address/0xf92cD566Ea4864356C5491c177A430C222d7e678",
"coingeckoId": "unlend-finance"
}
},
{
"chainId": 101,
"address": "VPjCJkR1uZGT9k9q7PsLArS5sEQtWgij8eZC8tysCy7",
"symbol": "wORN_v1",
"name": "Orion Protocol (Wormhole v1)",
"decimals": 8,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/VPjCJkR1uZGT9k9q7PsLArS5sEQtWgij8eZC8tysCy7/logo.png",
"tags": [
"wrapped",
"wormhole"
],
"extensions": {
"address": "0x0258F474786DdFd37ABCE6df6BBb1Dd5dfC4434a",
"assetContract": "https://etherscan.io/address/0x0258F474786DdFd37ABCE6df6BBb1Dd5dfC4434a",
"bridgeContract": "https://etherscan.io/address/0xf92cD566Ea4864356C5491c177A430C222d7e678",
"coingeckoId": "orion-protocol"
}
},
{
"chainId": 101,
"address": "CxzHZtzrm6bAz6iFCAGgCYCd3iQb5guUD7oQXKxdgk5c",
"symbol": "wSRK_v1",
"name": "SparkPoint (Wormhole v1)",
"decimals": 9,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/CxzHZtzrm6bAz6iFCAGgCYCd3iQb5guUD7oQXKxdgk5c/logo.png",
"tags": [
"wrapped",
"wormhole"
],
"extensions": {
"address": "0x0488401c3F535193Fa8Df029d9fFe615A06E74E6",
"assetContract": "https://etherscan.io/address/0x0488401c3F535193Fa8Df029d9fFe615A06E74E6",
"bridgeContract": "https://etherscan.io/address/0xf92cD566Ea4864356C5491c177A430C222d7e678",
"coingeckoId": "sparkpoint"
}
},
{
"chainId": 101,
"address": "FqMZWvmii4NNzhLBKGzkvGj3e3XTxNVDNSKDJnt9fVQV",
"symbol": "wUMA_v1",
"name": "UMA Voting Token v1 (Wormhole v1)",
"decimals": 9,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/FqMZWvmii4NNzhLBKGzkvGj3e3XTxNVDNSKDJnt9fVQV/logo.png",
"tags": [
"wrapped",
"wormhole"
],
"extensions": {
"address": "0x04Fa0d235C4abf4BcF4787aF4CF447DE572eF828",
"assetContract": "https://etherscan.io/address/0x04Fa0d235C4abf4BcF4787aF4CF447DE572eF828",
"bridgeContract": "https://etherscan.io/address/0xf92cD566Ea4864356C5491c177A430C222d7e678",
"coingeckoId": "uma"
}
},
{
"chainId": 101,
"address": "6GGNzF99kCG1ozQbP7M7EYW9zPbQGPMwTCCi2Dqx3qhU",
"symbol": "wSkey_v1",
"name": "SmartKey (Wormhole v1)",
"decimals": 8,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/6GGNzF99kCG1ozQbP7M7EYW9zPbQGPMwTCCi2Dqx3qhU/logo.png",
"tags": [
"wrapped",
"wormhole"
],
"extensions": {
"address": "0x06A01a4d579479Dd5D884EBf61A31727A3d8D442",
"assetContract": "https://etherscan.io/address/0x06A01a4d579479Dd5D884EBf61A31727A3d8D442",
"bridgeContract": "https://etherscan.io/address/0xf92cD566Ea4864356C5491c177A430C222d7e678",
"coingeckoId": "smartkey"
}
},
{
"chainId": 101,
"address": "Gc9rR2dUHfuYCJ8rU1Ye9fr8JoZZt9ZrfmXitQRLsxRW",
"symbol": "wMIR_v1",
"name": "Wrapped MIR Token (Wormhole v1)",
"decimals": 9,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/Gc9rR2dUHfuYCJ8rU1Ye9fr8JoZZt9ZrfmXitQRLsxRW/logo.png",
"tags": [
"wrapped",
"wormhole"
],
"extensions": {
"address": "0x09a3EcAFa817268f77BE1283176B946C4ff2E608",
"assetContract": "https://etherscan.io/address/0x09a3EcAFa817268f77BE1283176B946C4ff2E608",
"bridgeContract": "https://etherscan.io/address/0xf92cD566Ea4864356C5491c177A430C222d7e678",
"coingeckoId": "mirror-protocol"
}
},
{
"chainId": 101,
"address": "B8xDqdrHpYLNHQKQ4ARDKurxhkhn2gfZa8WRosCEzXnF",
"symbol": "wGRO_v1",
"name": "Growth (Wormhole v1)",
"decimals": 9,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/B8xDqdrHpYLNHQKQ4ARDKurxhkhn2gfZa8WRosCEzXnF/logo.png",
"tags": [
"wrapped",
"wormhole"
],
"extensions": {
"address": "0x09e64c2B61a5f1690Ee6fbeD9baf5D6990F8dFd0",
"assetContract": "https://etherscan.io/address/0x09e64c2B61a5f1690Ee6fbeD9baf5D6990F8dFd0",
"bridgeContract": "https://etherscan.io/address/0xf92cD566Ea4864356C5491c177A430C222d7e678",
"coingeckoId": "growth-defi"
}
},
{
"chainId": 101,
"address": "GE1X8ef7fcsJ93THx4CvV7BQsdEyEAyk61s2L5YfSXiL",
"symbol": "wSTAKE_v1",
"name": "xDai (Wormhole v1)",
"decimals": 9,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/GE1X8ef7fcsJ93THx4CvV7BQsdEyEAyk61s2L5YfSXiL/logo.png",
"tags": [
"wrapped",
"wormhole"
],
"extensions": {
"address": "0x0Ae055097C6d159879521C384F1D2123D1f195e6",
"assetContract": "https://etherscan.io/address/0x0Ae055097C6d159879521C384F1D2123D1f195e6",
"bridgeContract": "https://etherscan.io/address/0xf92cD566Ea4864356C5491c177A430C222d7e678",
"coingeckoId": "xdai-stake"
}
},
{
"chainId": 101,
"address": "7TK6QeyTsnTT6KsnK2tHHfh62mbjNuFWoyUc8vo3CmmU",
"symbol": "wYFI_v1",
"name": "yearn.finance (Wormhole v1)",
"decimals": 9,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/7TK6QeyTsnTT6KsnK2tHHfh62mbjNuFWoyUc8vo3CmmU/logo.png",
"tags": [
"wrapped",
"wormhole"
],
"extensions": {
"address": "0x0bc529c00C6401aEF6D220BE8C6Ea1667F6Ad93e",
"assetContract": "https://etherscan.io/address/0x0bc529c00C6401aEF6D220BE8C6Ea1667F6Ad93e",
"bridgeContract": "https://etherscan.io/address/0xf92cD566Ea4864356C5491c177A430C222d7e678",
"coingeckoId": "yearn-finance"
}
},
{
"chainId": 101,
"address": "CTtKth9uW7froBA6xCd2MP7BXjGFESdT1SyxUmbHovSw",
"symbol": "wBAT_v1",
"name": "Basic Attention Token (Wormhole v1)",
"decimals": 9,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/CTtKth9uW7froBA6xCd2MP7BXjGFESdT1SyxUmbHovSw/logo.png",
"tags": [
"wrapped",
"wormhole-v1"
],
"extensions": {
"address": "0x0D8775F648430679A709E98d2b0Cb6250d2887EF",
"assetContract": "https://etherscan.io/address/0x0D8775F648430679A709E98d2b0Cb6250d2887EF",
"bridgeContract": "https://etherscan.io/address/0xf92cD566Ea4864356C5491c177A430C222d7e678",
"coingeckoId": "basic-attention-token"
}
},
{
"chainId": 101,
"address": "EPeUFDgHRxs9xxEPVaL6kfGQvCon7jmAWKVUHuux1Tpz",
"symbol": "BAT",
"name": "Basic Attention Token (Portal)",
"decimals": 8,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/EPeUFDgHRxs9xxEPVaL6kfGQvCon7jmAWKVUHuux1Tpz/logo.png",
"tags": [
"wrapped",
"wormhole"
],
"extensions": {
"address": "0x0D8775F648430679A709E98d2b0Cb6250d2887EF",
"assetContract": "https://etherscan.io/address/0x0D8775F648430679A709E98d2b0Cb6250d2887EF",
"bridgeContract": "https://etherscan.io/address/0x3ee18B2214AFF97000D974cf647E7C347E8fa585",
"coingeckoId": "basic-attention-token"
}
},
{
"chainId": 101,
"address": "DrL2D4qCRCeNkQz3AJikLjBc3cS6fqqcQ3W7T9vbshCu",
"symbol": "wMANA_v1",
"name": "Decentraland MANA (Wormhole v1)",
"decimals": 9,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/DrL2D4qCRCeNkQz3AJikLjBc3cS6fqqcQ3W7T9vbshCu/logo.png",
"tags": [
"wrapped",
"wormhole"
],
"extensions": {
"address": "0x0F5D2fB29fb7d3CFeE444a200298f468908cC942",
"assetContract": "https://etherscan.io/address/0x0F5D2fB29fb7d3CFeE444a200298f468908cC942",
"bridgeContract": "https://etherscan.io/address/0xf92cD566Ea4864356C5491c177A430C222d7e678",
"coingeckoId": "decentraland"
}
},
{
"chainId": 101,
"address": "3cJKTW69FQDDCud7AhKHXZg126b3t73a2qVcVBS1BWjL",
"symbol": "wXIO_v1",
"name": "XIO Network (Wormhole v1)",
"decimals": 9,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/3cJKTW69FQDDCud7AhKHXZg126b3t73a2qVcVBS1BWjL/logo.png",
"tags": [
"wrapped",
"wormhole"
],
"extensions": {
"address": "0x0f7F961648aE6Db43C75663aC7E5414Eb79b5704",
"assetContract": "https://etherscan.io/address/0x0f7F961648aE6Db43C75663aC7E5414Eb79b5704",
"bridgeContract": "https://etherscan.io/address/0xf92cD566Ea4864356C5491c177A430C222d7e678",
"coingeckoId": "xio"
}
},
{
"chainId": 101,
"address": "CQivbzuRQLvZbqefKc5gLzhSzZzAaySAdMmTG7pFn41w",
"symbol": "wLAYER_v1",
"name": "Unilayer (Wormhole v1)",
"decimals": 9,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/CQivbzuRQLvZbqefKc5gLzhSzZzAaySAdMmTG7pFn41w/logo.png",
"tags": [
"wrapped",
"wormhole"
],
"extensions": {
"address": "0x0fF6ffcFDa92c53F615a4A75D982f399C989366b",
"assetContract": "https://etherscan.io/address/0x0fF6ffcFDa92c53F615a4A75D982f399C989366b",
"bridgeContract": "https://etherscan.io/address/0xf92cD566Ea4864356C5491c177A430C222d7e678",
"coingeckoId": "unilayer"
}
},
{
"chainId": 101,
"address": "8F3kZd9XEpFgNZ4fZnEAC5CJZLewnkNE8QCjdvorGWuW",
"symbol": "w1INCH_v1",
"name": "1INCH Token (Wormhole v1)",
"decimals": 9,
"logoURI": "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/8F3kZd9XEpFgNZ4fZnEAC5CJZLewnkNE8QCjdvorGWuW/logo.png",
"tags": [
"wrapped",
"wormhole"
],
"extensions": {
"address": "0x111111111117dC0aa78b770fA6A738034120C302",
"assetContract": "https://etherscan.io/address/0x111111111117dC0aa78b770fA6A738034120C302",
"bridgeContract": "https://etherscan.io/address/0xf92cD566Ea4864
View raw

(Sorry about that, but we can’t show files that are this big right now.)

View raw

(Sorry about that, but we can’t show files that are this big right now.)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment