Entites
Here you can find all entities defined in the SDK.
BaseCurrency
BaseCurrency is an abstract class covers any fungible token including native coin, standard token and other chain-native currencies.
export abstract class BaseCurrency {
/**
* Returns whether the currency is native to the chain and must be wrapped (e.g. EVMNativCoin)
*/
public abstract readonly isNative: boolean;
/**
* Returns whether the currency is a token that is usable in Butter without wrapping
*/
public abstract readonly isToken: boolean;
/**
* The chain ID on which this currency resides
*/
public readonly chainId: string;
/**
* The decimals used in representing currency amounts
*/
public readonly decimals: number;
/**
* The address of the token, 'ZERO_ADDRESS' when token is native token
*/
public readonly address: string;
/**
* The symbol of the currency, i.e. a short textual non-unique identifier
*/
public readonly symbol?: string;
/**
* The name of the currency, i.e. a descriptive textual non-unique identifier
*/
public readonly name?: string;
/**
* logo of the token, for display only
*/
public readonly logo?: string;
/**
* Constructs an instance of the base class `BaseCurrency`.
* @param chainId the chain ID on which this currency resides
* @param decimals decimals of the currency
* @param address address of the currency
* @param symbol symbol of the currency
* @param name of the currency
* @param logo of the currency
*/
protected constructor(
chainId: string,
decimals: number,
address: string,
symbol?: string,
name?: string,
logo?: string
) {
invariant(
decimals >= 0 && decimals < 255 && Number.isInteger(decimals),
'DECIMALS'
);
this.address = address;
this.chainId = chainId;
this.decimals = decimals;
this.symbol = symbol;
this.name = name;
this.logo = logo;
}
/**
* Returns whether this currency is functionally equivalent to the other currency
* @param other the other currency
*/
public abstract equals(other: Currency): boolean;
/**
* Return the wrapped version of this currency that can be used with the butter contracts. Currencies must
* implement this to be used in butter
*/
public abstract get wrapped(): Token;
}
NativeCurrency
NativeCurrency represents the native currency of the chain on which it resides
export abstract class NativeCurrency extends BaseCurrency {
public readonly isNative: true = true;
public readonly isToken: false = false;
}
Here is an implementation of EVMNativeCoin
/**
* EVMNativCoin is the main usage of a 'native' currency, i.e. for Ethereum mainnet and all testnets
*/
export class EVMNativeCoin extends NativeCurrency {
public constructor(
chainId: string,
decimal: number,
symbol?: string,
name?: string,
logo?: string
) {
super(chainId, decimal, ZERO_ADDRESS, symbol, name, logo);
}
public get wrapped(): Token {
const weth9 = WCOIN(this.chainId);
invariant(!!weth9, 'WRAPPED');
return weth9;
}
public equals(other: Currency): boolean {
return other.isNative && other.chainId === this.chainId;
}
}
Token
Token represents a token with a unique address and some metadata
export class Token extends BaseCurrency {
public readonly isNative: false = false;
public readonly isToken: true = true;
/**
* The contract address on the chain on which this token lives
*/
public override readonly address: string;
public constructor(
chainId: string,
address: string,
decimals: number,
symbol?: string,
name?: string,
logo?: string
) {
super(chainId, decimals, address, symbol, name, logo);
this.address = validateAndParseAddressByChainId(address, chainId);
}
/**
* Returns true if the two tokens are equivalent, i.e. have the same chainId and address.
* @param other other token to compare
*/
public equals(other: Currency): boolean {
return (
other.isToken &&
this.chainId === other.chainId &&
this.address === other.address
);
}
/**
* Return this token, which does not need to be wrapped
*/
public get wrapped(): Token {
return this;
}
}
Chain
Represents a blockchain with some metadata
export class Chain {
/** chain id, we use string because some non-evm chain might have larger chainId that we defiend*/
public readonly chainId: string;
/** name of the chain */
public readonly chainName: string;
/** chain rpc uri */
public readonly rpc?: string;
/** chain scan url */
public readonly scanUrl?: string;
/** chain logo */
public readonly chainLogo?: string;
/** chain symbol **/
public readonly symbol?: string;
constructor(
chainId: string,
chainName: string,
rpc?: string,
scanUrl?: string,
chainLogo?: string,
symbol?: string
) {
this.chainId = chainId;
this.chainName = chainName;
if (rpc) {
this.rpc = rpc;
}
if (scanUrl) {
this.scanUrl = scanUrl;
}
if (chainLogo) {
this.chainLogo = chainLogo;
}
if (symbol) {
this.symbol = symbol;
}
}
}