UNPKG

@wasserstoff/tribes-sdk

Version:

SDK for integrating with Tribes by Astrix platform on any EVM compatible chain

289 lines (288 loc) 10.9 kB
"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;