@wasserstoff/tribes-sdk
Version:
SDK for integrating with Tribes by Astrix platform on any EVM compatible chain
289 lines (288 loc) • 10.9 kB
JavaScript
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.TokenModule = void 0;
const ethers_1 = require("ethers");
const BaseModule_1 = require("../core/BaseModule");
const core_1 = require("../types/core");
// Import ABIs
const AstrixToken_json_1 = __importDefault(require("../../abis/AstrixToken.json"));
const TokenDispenser_json_1 = __importDefault(require("../../abis/TokenDispenser.json"));
/**
* Module for managing Astrix tokens and the token dispenser
*/
class TokenModule extends BaseModule_1.BaseModule {
/**
* Get the Astrix token contract
* @param useSigner Whether to use the signer
*/
getAstrixTokenContract(useSigner = false) {
return this. // eslint-disable-next-line @typescript-eslint/no-explicit-any
getContract(this.config.contracts.astrixToken, AstrixToken_json_1.default, useSigner);
}
/**
* Get the token dispenser contract
* @param useSigner Whether to use the signer
*/
getTokenDispenserContract(useSigner = false) {
return this. // eslint-disable-next-line @typescript-eslint/no-explicit-any
getContract(this.config.contracts.tokenDispenser, TokenDispenser_json_1.default, useSigner);
}
/**
* Deposit Astrix tokens to the token dispenser
* @param params Deposit parameters
*/
async deposit(params) {
try {
const signer = this.requireSigner();
const _signerAddress = await signer.getAddress();
// First, approve the token transfer
const astrixToken = this.getAstrixTokenContract(true);
const approvalTx = await astrixToken.approve(this.config.contracts.tokenDispenser, params.amount);
await approvalTx.wait();
this.log(`Approved token transfer: ${params.amount.toString()} wei`);
// Now deposit the tokens
const tokenDispenser = this.getTokenDispenserContract(true);
const tx = await tokenDispenser.deposit(params.amount);
const receipt = await tx.wait();
this.log(`Deposited tokens`, {
amount: params.amount.toString(),
txHash: receipt.hash
});
return receipt.hash;
}
catch (error) {
return this.handleError(error, 'Failed to deposit tokens', core_1.ErrorType.CONTRACT_ERROR);
}
}
/**
* Withdraw Astrix tokens from the token dispenser
* @param params Withdrawal parameters
*/
async withdraw(params) {
try {
const tokenDispenser = this.getTokenDispenserContract(true);
const tx = await tokenDispenser.withdraw(params.amount);
const receipt = await tx.wait();
this.log(`Withdrew tokens`, {
amount: params.amount.toString(),
txHash: receipt.hash
});
return receipt.hash;
}
catch (error) {
return this.handleError(error, 'Failed to withdraw tokens', core_1.ErrorType.CONTRACT_ERROR);
}
}
/**
* Update the organization admin
* @param params Update parameters
*/
async updateOrganizationAdmin(params) {
try {
const tokenDispenser = this.getTokenDispenserContract(true);
const tx = await tokenDispenser.updateOrganizationAdmin(params.newAdmin);
const receipt = await tx.wait();
this.log(`Updated organization admin`, {
newAdmin: params.newAdmin,
txHash: receipt.hash
});
return receipt.hash;
}
catch (error) {
return this.handleError(error, 'Failed to update organization admin', core_1.ErrorType.CONTRACT_ERROR);
}
}
/**
* Spend tokens with a signature
* @param params Spend parameters
*/
async spendWithSignature(params) {
try {
// Requires SPENDER_ROLE
const tokenDispenser = this.getTokenDispenserContract(true);
const tx = await tokenDispenser.spendWithSignature(params.organization, params.recipient, params.amount, params.reason, params.signature);
const receipt = await tx.wait();
this.log(`Spent tokens with signature`, {
organization: params.organization,
recipient: params.recipient,
amount: params.amount.toString(),
reason: params.reason,
txHash: receipt.hash
});
return receipt.hash;
}
catch (error) {
return this.handleError(error, 'Failed to spend tokens with signature', core_1.ErrorType.CONTRACT_ERROR);
}
}
/**
* Platform spend tokens
* @param params Spend parameters
*/
async platformSpend(params) {
try {
// Requires PLATFORM_ROLE
const tokenDispenser = this.getTokenDispenserContract(true);
const tx = await tokenDispenser.platformSpend(params.organization, params.recipient, params.amount, params.reason);
const receipt = await tx.wait();
this.log(`Platform spent tokens`, {
organization: params.organization,
recipient: params.recipient,
amount: params.amount.toString(),
reason: params.reason,
txHash: receipt.hash
});
return receipt.hash;
}
catch (error) {
return this.handleError(error, 'Failed to spend tokens as platform', core_1.ErrorType.CONTRACT_ERROR);
}
}
/**
* Grant the spender role to an address
* @param spender Address to grant the role to
*/
async grantSpenderRole(spender) {
try {
// Requires DEFAULT_ADMIN_ROLE
const tokenDispenser = this.getTokenDispenserContract(true);
const tx = await tokenDispenser.grantSpenderRole(spender);
const receipt = await tx.wait();
this.log(`Granted spender role`, {
spender,
txHash: receipt.hash
});
return receipt.hash;
}
catch (error) {
return this.handleError(error, 'Failed to grant spender role', core_1.ErrorType.CONTRACT_ERROR);
}
}
/**
* Revoke the spender role from an address
* @param spender Address to revoke the role from
*/
async revokeSpenderRole(spender) {
try {
// Requires DEFAULT_ADMIN_ROLE
const tokenDispenser = this.getTokenDispenserContract(true);
const tx = await tokenDispenser.revokeSpenderRole(spender);
const receipt = await tx.wait();
this.log(`Revoked spender role`, {
spender,
txHash: receipt.hash
});
return receipt.hash;
}
catch (error) {
return this.handleError(error, 'Failed to revoke spender role', core_1.ErrorType.CONTRACT_ERROR);
}
}
/**
* Get an organization's token balance
* @param organization Organization address
*/
async getBalance(organization) {
try {
const tokenDispenser = this.getTokenDispenserContract();
const balance = await tokenDispenser.getBalance(organization);
return {
balance,
formattedBalance: ethers_1.ethers.formatEther(balance)
};
}
catch (error) {
return this.handleError(error, 'Failed to get organization balance', core_1.ErrorType.CONTRACT_ERROR);
}
}
/**
* Get the organization admin
* @param organization Organization address
*/
async getOrganizationAdmin(organization) {
try {
const tokenDispenser = this.getTokenDispenserContract();
return await tokenDispenser.organizationAdmins(organization);
}
catch (error) {
return this.handleError(error, 'Failed to get organization admin', core_1.ErrorType.CONTRACT_ERROR);
}
}
/**
* Get information about the Astrix token
*/
async getTokenInfo() {
try {
const astrixToken = this.getAstrixTokenContract();
const [name, symbol, totalSupply, maxSupply, remainingSupply, percentMinted] = await Promise.all([
astrixToken.name(),
astrixToken.symbol(),
astrixToken.totalSupply(),
astrixToken.MAX_SUPPLY(),
astrixToken.remainingSupply(),
astrixToken.percentMinted()
]);
return {
name,
symbol,
totalSupply,
formattedTotalSupply: ethers_1.ethers.formatEther(totalSupply),
maxSupply,
formattedMaxSupply: ethers_1.ethers.formatEther(maxSupply),
remainingSupply,
formattedRemainingSupply: ethers_1.ethers.formatEther(remainingSupply),
percentMinted: Number(percentMinted)
};
}
catch (error) {
return this.handleError(error, 'Failed to get token information', core_1.ErrorType.CONTRACT_ERROR);
}
}
/**
* Check if an account has the minter role
* @param account Account to check
*/
async isMinter(account) {
try {
const astrixToken = this.getAstrixTokenContract();
return await astrixToken.isMinter(account);
}
catch (error) {
return this.handleError(error, 'Failed to check if account is a minter', core_1.ErrorType.CONTRACT_ERROR);
}
}
/**
* Check if an account has the burner role
* @param account Account to check
*/
async isBurner(account) {
try {
const astrixToken = this.getAstrixTokenContract();
return await astrixToken.isBurner(account);
}
catch (error) {
return this.handleError(error, 'Failed to check if account is a burner', core_1.ErrorType.CONTRACT_ERROR);
}
}
/**
* Get the token balance of an account
* @param account Account to check
*/
async getTokenBalance(account) {
try {
const astrixToken = this.getAstrixTokenContract();
const balance = await astrixToken.balanceOf(account);
return {
balance,
formattedBalance: ethers_1.ethers.formatEther(balance)
};
}
catch (error) {
return this.handleError(error, 'Failed to get token balance', core_1.ErrorType.CONTRACT_ERROR);
}
}
}
exports.TokenModule = TokenModule;