From 84114edce716e9673596b392cae080eb84133605 Mon Sep 17 00:00:00 2001 From: nhpd Date: Wed, 28 Aug 2024 17:49:16 +0400 Subject: [PATCH 1/7] add addSchedule/removeSchedule proposals --- src/proposal.ts | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/src/proposal.ts b/src/proposal.ts index 53d3b1b..c122598 100644 --- a/src/proposal.ts +++ b/src/proposal.ts @@ -1,5 +1,6 @@ import { Coin } from '@cosmjs/proto-signing'; import { ADMIN_MODULE_ADDRESS } from './constants'; +import { MsgExecuteContract } from '@neutron-org/cosmjs-types/neutron/cron/schedule'; export type ParamChangeProposalInfo = { title: string; @@ -727,3 +728,46 @@ export const updateDynamicFeesParamsProposal = ( }, }, }); + +export interface AddSchedule { + name: string; + period: number; + msgs: MsgExecuteContract[]; + execution_stage: number; +} + +export interface RemoveSchedule { + name: string; +} + +export const addCronScheduleProposal = (params: AddSchedule): any => ({ + custom: { + submit_admin_proposal: { + admin_proposal: { + proposal_execute_message: { + message: JSON.stringify({ + '@type': '/neutron.cron.MsgAddSchedule', + authority: ADMIN_MODULE_ADDRESS, + ...params, + }), + }, + }, + }, + }, +}); + +export const removeCronScheduleProposal = (params: RemoveSchedule): any => ({ + custom: { + submit_admin_proposal: { + admin_proposal: { + proposal_execute_message: { + message: JSON.stringify({ + '@type': '/neutron.cron.MsgRemoveSchedule', + authority: ADMIN_MODULE_ADDRESS, + ...params, + }), + }, + }, + }, + }, +}); From 12aa26cea388716b083b7c0ff4133f3c88452c5c Mon Sep 17 00:00:00 2001 From: nhpd Date: Tue, 3 Sep 2024 17:28:03 +0400 Subject: [PATCH 2/7] remove wasmbinding messages for cron and replace with stargate ones --- src/dao.ts | 23 ++++++++++++----------- src/proposal.ts | 30 ++++-------------------------- 2 files changed, 16 insertions(+), 37 deletions(-) diff --git a/src/dao.ts b/src/dao.ts index c8e8651..6ed72cb 100644 --- a/src/dao.ts +++ b/src/dao.ts @@ -6,7 +6,8 @@ import { VotingPowerAtHeightResponse, } from './types'; import { - addSchedule, + addCronScheduleProposal, + AddSchedule, chainManagerWrapper, clearAdminProposal, clientUpdateProposal, @@ -24,7 +25,8 @@ import { ParamsTransferInfo, pinCodesCustomAuthorityProposal, pinCodesProposal, - removeSchedule, + removeCronScheduleProposal, + RemoveSchedule, SendProposalInfo, unpinCodesProposal, updateAdminProposal, @@ -1651,13 +1653,11 @@ export class DaoMember { title: string, description: string, amount: string, - name: string, - period: number, - msgs: any[], + info: AddSchedule, ): Promise { const message = chainManagerWrapper( chainManagerAddress, - addSchedule(name, period, msgs), + addCronScheduleProposal(info), ); return await this.submitSingleChoiceProposal( title, @@ -1675,8 +1675,7 @@ export class DaoMember { title: string, description: string, amount: string, - name: string, - customModule = 'single', + info: RemoveSchedule, wrapForChainManager = true, ): Promise { // This ugly piece of code is required because we are not going @@ -1688,16 +1687,18 @@ export class DaoMember { // TODO(pr0n00gler). let message: any; if (wrapForChainManager) { - message = chainManagerWrapper(chainManagerAddress, removeSchedule(name)); + message = chainManagerWrapper( + chainManagerAddress, + removeCronScheduleProposal(info), + ); } else { - message = removeSchedule(name); + message = removeCronScheduleProposal(info); } return await this.submitSingleChoiceProposal( title, description, [message], amount, - customModule, ); } diff --git a/src/proposal.ts b/src/proposal.ts index c122598..d3f0f0c 100644 --- a/src/proposal.ts +++ b/src/proposal.ts @@ -670,28 +670,6 @@ export const sendProposal = (info: SendProposalInfo): any => ({ }, }); -export const addSchedule = ( - name: string, - period: number, - msgs: string[], -): any => ({ - custom: { - add_schedule: { - name, - period, - msgs, - }, - }, -}); - -export const removeSchedule = (name: string): any => ({ - custom: { - remove_schedule: { - name, - }, - }, -}); - export const chainManagerWrapper = ( chainManagerAddress: string, proposal: any, @@ -740,7 +718,7 @@ export interface RemoveSchedule { name: string; } -export const addCronScheduleProposal = (params: AddSchedule): any => ({ +export const addCronScheduleProposal = (info: AddSchedule): any => ({ custom: { submit_admin_proposal: { admin_proposal: { @@ -748,7 +726,7 @@ export const addCronScheduleProposal = (params: AddSchedule): any => ({ message: JSON.stringify({ '@type': '/neutron.cron.MsgAddSchedule', authority: ADMIN_MODULE_ADDRESS, - ...params, + ...info, }), }, }, @@ -756,7 +734,7 @@ export const addCronScheduleProposal = (params: AddSchedule): any => ({ }, }); -export const removeCronScheduleProposal = (params: RemoveSchedule): any => ({ +export const removeCronScheduleProposal = (info: RemoveSchedule): any => ({ custom: { submit_admin_proposal: { admin_proposal: { @@ -764,7 +742,7 @@ export const removeCronScheduleProposal = (params: RemoveSchedule): any => ({ message: JSON.stringify({ '@type': '/neutron.cron.MsgRemoveSchedule', authority: ADMIN_MODULE_ADDRESS, - ...params, + ...info, }), }, }, From 6cfeed3ddcb409ed72a0cdbb73b3cbf723081188 Mon Sep 17 00:00:00 2001 From: nhpd Date: Wed, 4 Sep 2024 03:36:32 +0400 Subject: [PATCH 3/7] fix --- src/dao.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/dao.ts b/src/dao.ts index 1319e3f..e1b918d 100644 --- a/src/dao.ts +++ b/src/dao.ts @@ -1712,6 +1712,7 @@ export class DaoMember { description: string, amount: string, info: RemoveSchedule, + customModule = 'single', wrapForChainManager = true, ): Promise { // This ugly piece of code is required because we are not going @@ -1735,6 +1736,7 @@ export class DaoMember { description, [message], amount, + customModule, ); } From 48d71d026e4e8632eb3ff7e1492cb27853193d01 Mon Sep 17 00:00:00 2001 From: Aleksandr Pismenskiy Date: Wed, 4 Sep 2024 11:50:12 +0300 Subject: [PATCH 4/7] add execution_stage to submitAddSchedule && replace cosmjs-types with neutronjs --- package.json | 4 ++-- src/dao.ts | 42 ++++++++++++++++++++++-------------------- src/proposal.ts | 14 +++++++------- yarn.lock | 8 ++++---- 4 files changed, 35 insertions(+), 33 deletions(-) diff --git a/package.json b/package.json index d14b962..fadf46b 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,7 @@ "@cosmjs/cosmwasm-stargate": "^0.32.4", "@cosmjs/proto-signing": "^0.32.4", "@cosmjs/stargate": "0.32.4", - "@neutron-org/cosmjs-types": "0.9.2-rc1", + "@neutron-org/neutronjs": "4.2.0", "axios": "1.6.0", "bip39": "^3.1.0", "long": "^5.2.1", @@ -58,4 +58,4 @@ "engines": { "node": ">=20.0" } -} +} \ No newline at end of file diff --git a/src/dao.ts b/src/dao.ts index c8e8651..0ca8c17 100644 --- a/src/dao.ts +++ b/src/dao.ts @@ -6,7 +6,7 @@ import { VotingPowerAtHeightResponse, } from './types'; import { - addSchedule, + addCronScheduleProposal, chainManagerWrapper, clearAdminProposal, clientUpdateProposal, @@ -24,7 +24,7 @@ import { ParamsTransferInfo, pinCodesCustomAuthorityProposal, pinCodesProposal, - removeSchedule, + removeCronScheduleProposal, SendProposalInfo, unpinCodesProposal, updateAdminProposal, @@ -36,8 +36,9 @@ import { ExecuteResult, SigningCosmWasmClient, } from '@cosmjs/cosmwasm-stargate'; -import { ClientState } from '@neutron-org/cosmjs-types/ibc/lightclients/tendermint/v1/tendermint'; -import { QueryClientImpl as AdminQueryClient } from '@neutron-org/cosmjs-types/cosmos/adminmodule/adminmodule/query'; +import { ClientState } from '@neutron-org/neutronjs/ibc/lightclients/tendermint/v1/tendermint'; +import { MsgExecuteContract } from '@neutron-org/neutronjs/neutron/cron/schedule'; +import { QueryClientImpl as AdminQueryClient } from '@neutron-org/neutronjs/cosmos/adminmodule/adminmodule/query.rpc.Query'; import { ADMIN_MODULE_ADDRESS } from './constants'; import { DynamicFeesParams, FeeMarketParams } from './proposal'; import { getWithAttempts } from './wait'; @@ -128,7 +129,7 @@ export const getProposalModules = async ( address: timelockAddr, }; // eslint-disable-next-line no-empty - } catch (e) {} + } catch (e) { } proposalsStructure[moduleType] = { address: proposalModule.address, @@ -206,7 +207,7 @@ export const getSubDaoContracts = async ( }; export class Dao { - constructor(private client: CosmWasmClient, public contracts: DaoContracts) {} + constructor(private client: CosmWasmClient, public contracts: DaoContracts) { } async checkPassedProposal(proposalId: number) { await getWithAttempts( @@ -290,12 +291,12 @@ export class Dao { voting_power_at_height: typeof height === 'undefined' ? { - address: addr, - } + address: addr, + } : { - address: addr, - height: height, - }, + address: addr, + height: height, + }, }); } @@ -377,7 +378,7 @@ export class DaoMember { private client: SigningCosmWasmClient, public user: string, private denom: string, - ) {} + ) { } /** * voteYes vote 'yes' for given proposal. @@ -525,7 +526,7 @@ export class DaoMember { if (proposalId < 0) { throw new Error( 'failed to get proposal ID from the proposal creation tx attributes: ' + - JSON.stringify(proposalTx.events), + JSON.stringify(proposalTx.events), ); } return proposalId; @@ -745,7 +746,7 @@ export class DaoMember { if (proposalId < 0) { throw new Error( 'failed to get proposal ID from the proposal creation tx attributes: ' + - JSON.stringify(proposalTx.events), + JSON.stringify(proposalTx.events), ); } return proposalId; @@ -1027,7 +1028,7 @@ export class DaoMember { if (proposalId < 0) { throw new Error( 'failed to get proposal ID from the proposal creation tx attributes: ' + - JSON.stringify(proposalTx.events), + JSON.stringify(proposalTx.events), ); } return proposalId1; @@ -1653,11 +1654,12 @@ export class DaoMember { amount: string, name: string, period: number, - msgs: any[], + msgs: MsgExecuteContract[], + execution_stage: number, ): Promise { const message = chainManagerWrapper( chainManagerAddress, - addSchedule(name, period, msgs), + addCronScheduleProposal({ name, period, msgs, execution_stage }), ); return await this.submitSingleChoiceProposal( title, @@ -1688,9 +1690,9 @@ export class DaoMember { // TODO(pr0n00gler). let message: any; if (wrapForChainManager) { - message = chainManagerWrapper(chainManagerAddress, removeSchedule(name)); + message = chainManagerWrapper(chainManagerAddress, removeCronScheduleProposal({ name })); } else { - message = removeSchedule(name); + message = removeCronScheduleProposal({ name }); } return await this.submitSingleChoiceProposal( title, @@ -1816,7 +1818,7 @@ export const getNeutronDAOCore = async ( rpcClient: ProtobufRpcClient, ): Promise => { const queryClient = new AdminQueryClient(rpcClient); - const admins = await queryClient.Admins(); + const admins = await queryClient.admins(); const chainManager = admins.admins[0]; const strategies = await client.queryContractSmart(chainManager, { strategies: {}, diff --git a/src/proposal.ts b/src/proposal.ts index c122598..537596c 100644 --- a/src/proposal.ts +++ b/src/proposal.ts @@ -1,6 +1,6 @@ import { Coin } from '@cosmjs/proto-signing'; import { ADMIN_MODULE_ADDRESS } from './constants'; -import { MsgExecuteContract } from '@neutron-org/cosmjs-types/neutron/cron/schedule'; +import { MsgExecuteContract } from '@neutron-org/neutronjs/neutron/cron/schedule'; export type ParamChangeProposalInfo = { title: string; @@ -147,12 +147,12 @@ export type MultiChoiceProposal = { readonly choices: CheckedMultipleChoiceOption[]; // Proposal status (Open, rejected, executed, execution failed, closed, passed) readonly status: - | 'open' - | 'rejected' - | 'passed' - | 'executed' - | 'closed' - | 'execution_failed'; + | 'open' + | 'rejected' + | 'passed' + | 'executed' + | 'closed' + | 'execution_failed'; // Voting settings (threshold, quorum, etc.) readonly voting_strategy: VotingStrategy; // The total power when the proposal started (used to calculate percentages) diff --git a/yarn.lock b/yarn.lock index 47ee825..b87e543 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1184,10 +1184,10 @@ "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" -"@neutron-org/cosmjs-types@0.9.2-rc1": - version "0.9.2-rc1" - resolved "https://registry.yarnpkg.com/@neutron-org/cosmjs-types/-/cosmjs-types-0.9.2-rc1.tgz#ca1fc1dc9566858dbd765e8f82c8a70097bcc84b" - integrity sha512-ju2AqJ14yO4+JF8RwY4ZVy7f2HVjhdf66SfhS6y4ucBZm997/E/yYVMnpWmUncVg8ARooISOKaOYNagqz0am6Q== +"@neutron-org/neutronjs@4.2.0": + version "4.2.0" + resolved "https://registry.yarnpkg.com/@neutron-org/neutronjs/-/neutronjs-4.2.0.tgz#7d98d4bc1568f22c015736d6fbe768ddfba14798" + integrity sha512-l3ILkT8H6bO522RoNb37NMQkqlp8qvKNm7v6QlzORtClqbM7VbRv2/INgy8wn8USV5AmcnCdl9M4KfvvGw5k9w== "@noble/curves@1.4.2", "@noble/curves@~1.4.0": version "1.4.2" From 90419a2508b4a62e646c9449c983a4640643ad83 Mon Sep 17 00:00:00 2001 From: Aleksandr Pismenskiy Date: Wed, 4 Sep 2024 12:51:27 +0300 Subject: [PATCH 5/7] change type of execution_stage --- src/proposal.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/proposal.ts b/src/proposal.ts index 1e223b6..9e79b0b 100644 --- a/src/proposal.ts +++ b/src/proposal.ts @@ -731,7 +731,7 @@ export interface AddSchedule { name: string; period: number; msgs: MsgExecuteContract[]; - execution_stage: number; + execution_stage: string; } export interface RemoveSchedule { From 2c5a0a0cb55f49e932114f9a32403ace02126ced Mon Sep 17 00:00:00 2001 From: pr0n00gler Date: Fri, 6 Sep 2024 16:35:04 +0300 Subject: [PATCH 6/7] bring bindings back --- src/dao.ts | 16 +++++++++++++--- src/proposal.ts | 22 ++++++++++++++++++++++ 2 files changed, 35 insertions(+), 3 deletions(-) diff --git a/src/dao.ts b/src/dao.ts index e1b918d..ce5d742 100644 --- a/src/dao.ts +++ b/src/dao.ts @@ -7,6 +7,7 @@ import { } from './types'; import { addCronScheduleProposal, + addScheduleBindings, AddSchedule, chainManagerWrapper, clearAdminProposal, @@ -27,6 +28,7 @@ import { pinCodesCustomAuthorityProposal, pinCodesProposal, removeCronScheduleProposal, + removeScheduleBindings, RemoveSchedule, SendProposalInfo, unpinCodesProposal, @@ -1690,10 +1692,13 @@ export class DaoMember { description: string, amount: string, info: AddSchedule, + bindings = false, ): Promise { const message = chainManagerWrapper( chainManagerAddress, - addCronScheduleProposal(info), + bindings + ? addScheduleBindings(info.name, info.period, info.msgs) + : addCronScheduleProposal(info), ); return await this.submitSingleChoiceProposal( title, @@ -1714,6 +1719,7 @@ export class DaoMember { info: RemoveSchedule, customModule = 'single', wrapForChainManager = true, + bindings = false, ): Promise { // This ugly piece of code is required because we are not going // to remove the security address functionality from the cron module @@ -1726,10 +1732,14 @@ export class DaoMember { if (wrapForChainManager) { message = chainManagerWrapper( chainManagerAddress, - removeCronScheduleProposal(info), + bindings + ? removeScheduleBindings(info.name) + : removeCronScheduleProposal(info), ); } else { - message = removeCronScheduleProposal(info); + message = bindings + ? removeScheduleBindings(info.name) + : removeCronScheduleProposal(info); } return await this.submitSingleChoiceProposal( title, diff --git a/src/proposal.ts b/src/proposal.ts index 2526d9a..680b410 100644 --- a/src/proposal.ts +++ b/src/proposal.ts @@ -690,6 +690,28 @@ export const sendProposal = (info: SendProposalInfo): any => ({ }, }); +export const addScheduleBindings = ( + name: string, + period: number, + msgs: MsgExecuteContract[], +): any => ({ + custom: { + add_schedule: { + name, + period, + msgs, + }, + }, +}); + +export const removeScheduleBindings = (name: string): any => ({ + custom: { + remove_schedule: { + name, + }, + }, +}); + export const chainManagerWrapper = ( chainManagerAddress: string, proposal: any, From df604d8c6475c8640f4ee2ded9b1905574226a3a Mon Sep 17 00:00:00 2001 From: pr0n00gler Date: Mon, 9 Sep 2024 13:34:55 +0300 Subject: [PATCH 7/7] update neutronjs --- package.json | 2 +- yarn.lock | 36 +++++------------------------------- 2 files changed, 6 insertions(+), 32 deletions(-) diff --git a/package.json b/package.json index fadf46b..01f75fe 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,7 @@ "@cosmjs/cosmwasm-stargate": "^0.32.4", "@cosmjs/proto-signing": "^0.32.4", "@cosmjs/stargate": "0.32.4", - "@neutron-org/neutronjs": "4.2.0", + "@neutron-org/neutronjs": "https://github.com/neutron-org/neutronjs.git#7f45328320b53b4fa2b572bc25bb96bf80260181", "axios": "1.6.0", "bip39": "^3.1.0", "long": "^5.2.1", diff --git a/yarn.lock b/yarn.lock index 0bbc6ab..a2f724f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1184,10 +1184,9 @@ "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" -"@neutron-org/neutronjs@4.2.0": +"@neutron-org/neutronjs@https://github.com/neutron-org/neutronjs.git#7f45328320b53b4fa2b572bc25bb96bf80260181": version "4.2.0" - resolved "https://registry.yarnpkg.com/@neutron-org/neutronjs/-/neutronjs-4.2.0.tgz#7d98d4bc1568f22c015736d6fbe768ddfba14798" - integrity sha512-l3ILkT8H6bO522RoNb37NMQkqlp8qvKNm7v6QlzORtClqbM7VbRv2/INgy8wn8USV5AmcnCdl9M4KfvvGw5k9w== + resolved "https://github.com/neutron-org/neutronjs.git#7f45328320b53b4fa2b572bc25bb96bf80260181" "@noble/curves@1.4.2", "@noble/curves@~1.4.0": version "1.4.2" @@ -3176,16 +3175,7 @@ string-argv@^0.3.1: resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.2.tgz#2b6d0ef24b656274d957d54e0a4bbf6153dc02b6" integrity sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q== -"string-width-cjs@npm:string-width@^4.2.0": - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string-width@^4.1.0, string-width@^4.2.0: +"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0, string-width@^4.2.0: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -3203,14 +3193,7 @@ string-width@^5.0.0, string-width@^5.0.1, string-width@^5.1.2: emoji-regex "^9.2.2" strip-ansi "^7.0.1" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1": - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-ansi@^6.0.0, strip-ansi@^6.0.1: +"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -3446,7 +3429,7 @@ word-wrap@^1.2.5: resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== @@ -3464,15 +3447,6 @@ wrap-ansi@^6.2.0: string-width "^4.1.0" strip-ansi "^6.0.0" -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - wrap-ansi@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214"