From d0d1ca00e9ff9cd27f7ce79bcddada2e35243e12 Mon Sep 17 00:00:00 2001 From: Sakshi Joshi Date: Thu, 20 Feb 2025 20:43:22 +0530 Subject: [PATCH] adding unstaking builder tao sdk --- modules/abstract-substrate/src/lib/iface.ts | 12 +++- modules/abstract-substrate/src/lib/index.ts | 3 +- .../abstract-substrate/src/lib/txnSchema.ts | 6 ++ modules/sdk-coin-tao/src/lib/index.ts | 2 - .../sdk-coin-tao/src/lib/unstakeBuilder.ts | 72 +++++++++---------- 5 files changed, 53 insertions(+), 42 deletions(-) diff --git a/modules/abstract-substrate/src/lib/iface.ts b/modules/abstract-substrate/src/lib/iface.ts index 98ebc9a472..2dfa0ac48e 100644 --- a/modules/abstract-substrate/src/lib/iface.ts +++ b/modules/abstract-substrate/src/lib/iface.ts @@ -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'; @@ -30,6 +32,8 @@ export enum MethodNames { * @see https://polkadot.js.org/docs/substrate/extrinsics/#transferkeepalivedest-multiaddress-value-compactu128 */ TransferKeepAlive = 'transferKeepAlive', + + RemoveStake = 'removeStake', } /** @@ -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; } diff --git a/modules/abstract-substrate/src/lib/index.ts b/modules/abstract-substrate/src/lib/index.ts index 52ee545888..7f352a01b5 100644 --- a/modules/abstract-substrate/src/lib/index.ts +++ b/modules/abstract-substrate/src/lib/index.ts @@ -1,6 +1,7 @@ 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'; @@ -8,4 +9,4 @@ 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 }; diff --git a/modules/abstract-substrate/src/lib/txnSchema.ts b/modules/abstract-substrate/src/lib/txnSchema.ts index 2635e3cb15..ed4e820147 100644 --- a/modules/abstract-substrate/src/lib/txnSchema.ts +++ b/modules/abstract-substrate/src/lib/txnSchema.ts @@ -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(), +}); diff --git a/modules/sdk-coin-tao/src/lib/index.ts b/modules/sdk-coin-tao/src/lib/index.ts index 07338e00cf..649604269c 100644 --- a/modules/sdk-coin-tao/src/lib/index.ts +++ b/modules/sdk-coin-tao/src/lib/index.ts @@ -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'; diff --git a/modules/sdk-coin-tao/src/lib/unstakeBuilder.ts b/modules/sdk-coin-tao/src/lib/unstakeBuilder.ts index a5215609ed..819d033ca7 100644 --- a/modules/sdk-coin-tao/src/lib/unstakeBuilder.ts +++ b/modules/sdk-coin-tao/src/lib/unstakeBuilder.ts @@ -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; @@ -15,6 +12,7 @@ export class UnstakeBuilder extends TransactionBuilder { constructor(_coinConfig: Readonly) { super(_coinConfig); } + /** * Take the origin account as a stash and lock up value of its balance. * Controller will be the account that controls it. @@ -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: {