Skip to content

Commit

Permalink
adding unstaking builder tao sdk
Browse files Browse the repository at this point in the history
  • Loading branch information
joshisakshi committed Feb 20, 2025
1 parent a3a58d2 commit d0d1ca0
Show file tree
Hide file tree
Showing 5 changed files with 53 additions and 42 deletions.
12 changes: 10 additions & 2 deletions modules/abstract-substrate/src/lib/iface.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ import {
TransactionExplanation as BaseTransactionExplanation,
TransactionType,
} from '@bitgo/sdk-core';
import { Args } from '@substrate/txwrapper-core/lib/types/method';

import { BaseTxInfo, DecodedUnsignedTx, TypeRegistry } from '@substrate/txwrapper-core/lib/types';

export { HexString } from '@polkadot/util/types';
Expand Down Expand Up @@ -30,6 +32,8 @@ export enum MethodNames {
* @see https://polkadot.js.org/docs/substrate/extrinsics/#transferkeepalivedest-multiaddress-value-compactu128
*/
TransferKeepAlive = 'transferKeepAlive',

RemoveStake = 'removeStake',
}

/**
Expand Down Expand Up @@ -70,12 +74,16 @@ export interface TransferAllArgs {
dest: { id: string };
keepAlive: boolean;
}

export interface UnstakeArgs extends Args {
amount_staked: string;
hotkey: string;
netuid: string;
}
/**
* Decoded TxMethod from a transaction hex
*/
export interface TxMethod {
args: TransferArgs | TransferAllArgs;
args: TransferArgs | TransferAllArgs | UnstakeArgs;
name: MethodNames;
pallet: string;
}
Expand Down
3 changes: 2 additions & 1 deletion modules/abstract-substrate/src/lib/index.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
import * as Constants from './constants';
import * as Errors from './errors';
import * as Interface from './iface';
import * as Schema from './txnSchema';
export { Utils, default as utils } from './utils';

export { KeyPair } from './keyPair';
export { SingletonRegistry } from './singletonRegistry';
export { Transaction } from './transaction';
export { TransactionBuilder } from './transactionBuilder';
export { TransferBuilder } from './transferBuilder';
export { Constants, Errors, Interface };
export { Constants, Errors, Interface, Schema };
6 changes: 6 additions & 0 deletions modules/abstract-substrate/src/lib/txnSchema.ts
Original file line number Diff line number Diff line change
Expand Up @@ -39,3 +39,9 @@ export const TransferTransactionSchema = joi.object({
export const TransferAllTransactionSchema = joi.object({
to: addressSchema.required(),
});

export const UnstakeTransactionSchema = joi.object({
amount: joi.string().required(),
hotkey: joi.string().required(),
netuid: joi.string().required(),
});
2 changes: 0 additions & 2 deletions modules/sdk-coin-tao/src/lib/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,5 +11,3 @@ export {
export { TransactionBuilderFactory } from './transactionBuilderFactory';
export { TransferBuilder } from './transferBuilder';
export { Utils, default as utils } from './utils';
export { StakingBuilder } from './stakingBuilder';
export { UnstakeBuilder } from './unstakeBuilder';
72 changes: 35 additions & 37 deletions modules/sdk-coin-tao/src/lib/unstakeBuilder.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,7 @@ import { BaseCoin as CoinConfig } from '@bitgo/statics';
import { defineMethod, UnsignedTransaction, DecodedSignedTx, DecodedSigningPayload } from '@substrate/txwrapper-core';
import BigNumber from 'bignumber.js';
import { InvalidTransactionError, TransactionType } from '@bitgo/sdk-core';
// import { Transaction, TransferBuilder as SubstrateTransferBuilder } from '@bitgo/abstract-substrate';
import { TransactionBuilder, Transaction } from '@bitgo/abstract-substrate';
import { UnstakeTransactionSchema } from './txnSchema';
import { UnstakeArgs, CreateBaseTxInfo, MethodNames } from './iface';
import { Transaction, TransactionBuilder, Interface, Schema } from '@bitgo/abstract-substrate';

export class UnstakeBuilder extends TransactionBuilder {
protected _amount: string;
Expand All @@ -15,6 +12,7 @@ export class UnstakeBuilder extends TransactionBuilder {
constructor(_coinConfig: Readonly<CoinConfig>) {
super(_coinConfig);
}

/**
* Take the origin account as a stash and lock up value of its balance.
* Controller will be the account that controls it.
Expand Down Expand Up @@ -72,58 +70,58 @@ export class UnstakeBuilder extends TransactionBuilder {
}

/** @inheritdoc */
validateDecodedTransaction(decodedTxn: DecodedSigningPayload | DecodedSignedTx): void {
if (decodedTxn.method?.name === MethodNames.RemoveStake) {
const txMethod = decodedTxn.method.args as unknown as UnstakeArgs;
const value = txMethod.value;
const validationResult = UnstakeTransactionSchema.validate({ value });
if (validationResult.error) {
throw new InvalidTransactionError(`Unstake Transaction validation failed: ${validationResult.error.message}`);
}
protected fromImplementation(rawTransaction: string): Transaction {
const tx = super.fromImplementation(rawTransaction);
if (this._method?.name === Interface.MethodNames.RemoveStake) {
const txMethod = this._method.args as Interface.UnstakeArgs;
this.amount(txMethod.amount_staked);
this.hotkey(txMethod.hotkey);
this.netuid(txMethod.netuid);
} else {
throw new InvalidTransactionError(`Invalid Transaction Type: ${this._method?.name}. Expected addStake`);
}
return tx;
}

// /** @inheritdoc */
// protected fromImplementation(rawTransaction: string): Transaction {
// const tx = super.fromImplementation(rawTransaction);
// if (this._method?.name === MethodNames.RemoveStake) {
// const txMethod = this._method.args as unknown as UnstakeArgs;
// this.amount(txMethod.amount_staked);
// this.hotkey(txMethod.hotkey);
// this.netuid(txMethod.netuid);
// } else {
// throw new InvalidTransactionError(`Invalid Transaction Type: ${this._method?.name}. Expected unbond`);
// }
// return tx;
// }

/** @inheritdoc */
validateTransaction(_: Transaction): void {
super.validateTransaction(_);
this.validateFields(this._amount, this._hotkey, this._netuid);
}

private validateFields(value: string, hotkey: string, netuid: string): void {
const validationResult = UnstakeTransactionSchema.validate({
value,
private validateFields(amount: string, hotkey: string, netuid: string): void {
const validationResult = Schema.UnstakeTransactionSchema.validate({
amount,
hotkey,
netuid,
});

if (validationResult.error) {
throw new InvalidTransactionError(
`Stake Builder Transaction validation failed: ${validationResult.error.message}`
`UnStake Builder Transaction validation failed: ${validationResult.error.message}`
);
}
}

/** @inheritdoc */
validateDecodedTransaction(decodedTxn: DecodedSigningPayload | DecodedSignedTx, rawTransaction: string): void {
if (decodedTxn.method?.name === Interface.MethodNames.RemoveStake) {
const txMethod = decodedTxn.method.args as unknown as Interface.UnstakeArgs;
const amountStaked = `${txMethod.amount_staked}`;
const hotkey = txMethod.hotkey;
const netuid = txMethod.netuid;
const validationResult = Schema.UnstakeTransactionSchema.validate({ amountStaked, hotkey, netuid });
if (validationResult.error) {
throw new InvalidTransactionError(`Transfer Transaction validation failed: ${validationResult.error.message}`);
}
}
}
/**
* Construct a transaction to stake
*
* @param args - Arguments specific to this method.
* @param info - Information required to construct the transaction.
*/
private removeStake(args: UnstakeArgs, info: CreateBaseTxInfo): UnsignedTransaction {
// * Construct a transaction to stake
// *
// * @param args - Arguments specific to this method.
// * @param info - Information required to construct the transaction.
// */
private removeStake(args: Interface.UnstakeArgs, info: Interface.CreateBaseTxInfo): UnsignedTransaction {
return defineMethod(
{
method: {
Expand Down

0 comments on commit d0d1ca0

Please sign in to comment.