diff --git a/apps/extension/src/Approvals/Approvals.tsx b/apps/extension/src/Approvals/Approvals.tsx index 76a1f24e65..fe20581ee1 100644 --- a/apps/extension/src/Approvals/Approvals.tsx +++ b/apps/extension/src/Approvals/Approvals.tsx @@ -15,6 +15,7 @@ import { ApproveTransfer, ConfirmTransfer } from "./ApproveTransfer"; import { ApproveConnection } from "./ApproveConnection"; import { TopLevelRoute } from "Approvals/types"; import { ConfirmLedgerTransfer } from "./ApproveTransfer/ConfirmLedgerTransfer"; +import { ApproveBond, ConfirmBond, ConfirmLedgerBond } from "./ApproveBond"; export enum Status { Completed, @@ -50,6 +51,20 @@ export const Approvals: React.FC = () => { path={TopLevelRoute.ConfirmLedgerTransfer} element={} /> + + } + /> + } + /> + } + /> InternalHandler = (service) => { return async (_, { msgId }) => { - return await service.rejectTransfer(msgId); + return await service.rejectTx(msgId); }; }; diff --git a/apps/extension/src/background/approvals/service.ts b/apps/extension/src/background/approvals/service.ts index cf29bb348f..e016bca6ce 100644 --- a/apps/extension/src/background/approvals/service.ts +++ b/apps/extension/src/background/approvals/service.ts @@ -41,14 +41,7 @@ export class ApprovalsService { "approvals.html" )}#/approve-transfer?type=${type}&id=${id}&source=${source}&target=${target}&token=${token}&amount=${amount}`; - browser.windows.create({ - url, - width: 415, - height: 510, - type: "popup", - }); - - return; + this._launchApprovalWindow(url); } // Deserialize bond details and prompt user @@ -65,22 +58,16 @@ export class ApprovalsService { ); const { source, token, amount: amountBN } = txDetails; const amount = new BigNumber(amountBN.toString()); + const url = `${browser.runtime.getURL( "approvals.html" )}#/approve-bond?type=${type}&id=${id}&source=${source}&token=${token}&amount=${amount}`; - browser.windows.create({ - url, - width: 415, - height: 510, - type: "popup", - }); - - return; + this._launchApprovalWindow(url); } // Remove pending transaction from storage - async rejectTransfer(msgId: string): Promise { + async rejectTx(msgId: string): Promise { await this._clearPendingTx(msgId); } @@ -126,4 +113,13 @@ export class ApprovalsService { private async _clearPendingTx(msgId: string): Promise { return await this.txStore.set(msgId, null); } + + private _launchApprovalWindow = (url: string): void => { + browser.windows.create({ + url, + width: 415, + height: 510, + type: "popup", + }); + }; } diff --git a/apps/extension/src/provider/Anoma.ts b/apps/extension/src/provider/Anoma.ts index d6e555e43e..90f207190c 100644 --- a/apps/extension/src/provider/Anoma.ts +++ b/apps/extension/src/provider/Anoma.ts @@ -88,7 +88,11 @@ export class Anoma implements IAnoma { ); } - public async submitBond(txMsg: string, type?: AccountType): Promise { + public async submitBond(props: { + txMsg: string; + type?: AccountType; + }): Promise { + const { txMsg, type } = props; return await this.requester?.sendMessage( Ports.Background, new ApproveBondMsg(txMsg, type) diff --git a/apps/extension/src/provider/InjectedAnoma.ts b/apps/extension/src/provider/InjectedAnoma.ts index 9bdf8ca883..f2297f17e5 100644 --- a/apps/extension/src/provider/InjectedAnoma.ts +++ b/apps/extension/src/provider/InjectedAnoma.ts @@ -50,8 +50,18 @@ export class InjectedAnoma implements IAnoma { return new Signer(chainId, this); } - public async submitBond(txMsg: string): Promise { - return await InjectedProxy.requestMethod("submitBond", txMsg); + public async submitBond(props: { + txMsg: string; + type: AccountType; + }): Promise { + const { txMsg, type } = props; + return await InjectedProxy.requestMethod< + { txMsg: string; type: AccountType }, + void + >("submitBond", { + txMsg, + type, + }); } public async submitUnbond(txMsg: string): Promise { diff --git a/apps/extension/src/provider/Signer.ts b/apps/extension/src/provider/Signer.ts index 99239519ae..6b0bca4efc 100644 --- a/apps/extension/src/provider/Signer.ts +++ b/apps/extension/src/provider/Signer.ts @@ -43,13 +43,16 @@ export class Signer implements ISigner { /** * Submit bond transaction */ - public async submitBond(args: SubmitBondProps): Promise { + public async submitBond( + args: SubmitBondProps, + type: AccountType + ): Promise { const msgValue = new SubmitBondMsgValue(args); const msg = new Message(); const encoded = msg.encode(SubmitBondMsgSchema, msgValue); - return await this._anoma.submitBond(toBase64(encoded)); + return await this._anoma.submitBond({ txMsg: toBase64(encoded), type }); } /** diff --git a/apps/namada-interface/src/App/Staking/NewBondingPosition/NewBondingPosition.tsx b/apps/namada-interface/src/App/Staking/NewBondingPosition/NewBondingPosition.tsx index 5f28de4a2a..a600d3d0ce 100644 --- a/apps/namada-interface/src/App/Staking/NewBondingPosition/NewBondingPosition.tsx +++ b/apps/namada-interface/src/App/Staking/NewBondingPosition/NewBondingPosition.tsx @@ -68,8 +68,11 @@ export const NewBondingPosition = (props: Props): JSX.Element => { const currentBondingPosition = currentBondingPositions.find( (pos) => pos.owner === currentAccount?.details.address ); - const stakedAmount: BigNumber = new BigNumber(currentBondingPosition?.stakedAmount || "0"); - const currentNAMBalance: BigNumber = currentAccount.balance["NAM"] || new BigNumber(0); + const stakedAmount: BigNumber = new BigNumber( + currentBondingPosition?.stakedAmount || "0" + ); + const currentNAMBalance: BigNumber = + currentAccount.balance["NAM"] || new BigNumber(0); const handleAddressChange = ( e: React.ChangeEvent @@ -167,6 +170,7 @@ export const NewBondingPosition = (props: Props): JSX.Element => { owner: currentAddress, validatorId: currentBondingPositions[0].validatorId, }; + console.log({ changeInStakingPosition }); confirmBonding(changeInStakingPosition); }} disabled={isEntryIncorrectOrEmpty} diff --git a/apps/namada-interface/src/slices/StakingAndGovernance/actions.ts b/apps/namada-interface/src/slices/StakingAndGovernance/actions.ts index 5e0a83e68e..afb1307ad3 100644 --- a/apps/namada-interface/src/slices/StakingAndGovernance/actions.ts +++ b/apps/namada-interface/src/slices/StakingAndGovernance/actions.ts @@ -44,9 +44,9 @@ const toMyValidators = ( index == -1 ? (arr: MyValidators[]) => arr : (arr: MyValidators[], idx: number) => [ - ...arr.slice(0, idx), - ...arr.slice(idx + 1), - ]; + ...arr.slice(0, idx), + ...arr.slice(idx + 1), + ]; const stakedAmount = new BigNumber(stake) .plus(new BigNumber(v?.stakedAmount || 0)) @@ -159,20 +159,28 @@ export const postNewBonding = createAsyncThunk< { state: RootState } >(POST_NEW_STAKING, async (change, thunkApi) => { const { chainId } = thunkApi.getState().settings; + const { derived } = thunkApi.getState().accounts; const integration = getIntegration(chainId); const signer = integration.signer() as Signer; - await signer.submitBond({ - source: change.owner, - validator: change.validatorId, - amount: new BigNumber(change.amount), - nativeToken: Tokens.NAM.address || "", - tx: { - token: Tokens.NAM.address || "", - feeAmount: new BigNumber(0), - gasLimit: new BigNumber(0), - chainId, + const { owner, validatorId, amount } = change; + const account = derived[chainId][owner]; + const type = account.details.type; + + await signer.submitBond( + { + source: owner, + validator: validatorId, + amount: new BigNumber(amount), + nativeToken: Tokens.NAM.address || "", + tx: { + token: Tokens.NAM.address || "", + feeAmount: new BigNumber(0), + gasLimit: new BigNumber(0), + chainId, + }, }, - }); + type + ); }); // we post an unstake transaction diff --git a/packages/shared/src/index.ts b/packages/shared/src/index.ts index af68f75bf1..9e1f4f0eba 100644 --- a/packages/shared/src/index.ts +++ b/packages/shared/src/index.ts @@ -8,7 +8,7 @@ type TimeoutOpts = { error?: string; }; -const DEFAULT_TIMEOUT = 5000; +const DEFAULT_TIMEOUT = 60000; const DEFAULT_OPTS: TimeoutOpts = { timeout: DEFAULT_TIMEOUT, @@ -23,19 +23,19 @@ const promiseWithTimeout = fn: (...args: U) => Promise, opts?: TimeoutOpts ) => - (...args: U): Promise => { - const { timeout, error } = { ...DEFAULT_OPTS, ...opts }; + (...args: U): Promise => { + const { timeout, error } = { ...DEFAULT_OPTS, ...opts }; - return new Promise(async (resolve, reject) => { - const t = setTimeout(() => { - reject(error); - }, timeout); + return new Promise(async (resolve, reject) => { + const t = setTimeout(() => { + reject(error); + }, timeout); - const res = await fn(...args); - clearTimeout(t); - resolve(res); - }); - }; + const res = await fn(...args); + clearTimeout(t); + resolve(res); + }); + }; export class Query extends RustQuery { query_balance = promiseWithTimeout(super.query_balance.bind(this), { diff --git a/packages/types/src/anoma.ts b/packages/types/src/anoma.ts index cbe134d8dd..773db7edb8 100644 --- a/packages/types/src/anoma.ts +++ b/packages/types/src/anoma.ts @@ -11,7 +11,7 @@ export interface Anoma { suggestChain(chainConfig: Chain): Promise; chain: (chainId: string) => Promise; chains: () => Promise; - submitBond: (txMsg: string) => Promise; + submitBond: (props: { txMsg: string; type: AccountType }) => Promise; submitUnbond: (txMsg: string) => Promise; submitTransfer: (props: { txMsg: string; diff --git a/packages/types/src/signer.ts b/packages/types/src/signer.ts index c0cfa51494..059e49bcc0 100644 --- a/packages/types/src/signer.ts +++ b/packages/types/src/signer.ts @@ -9,7 +9,7 @@ import { export interface Signer { accounts: () => Promise; - submitBond(args: SubmitBondProps): Promise; + submitBond(args: SubmitBondProps, type: AccountType): Promise; submitUnbond(args: SubmitUnbondProps): Promise; submitTransfer(args: TransferProps, type: AccountType): Promise; submitIbcTransfer(args: IbcTransferProps): Promise;