errors.rs 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602
  1. use srml_support::decl_error;
  2. use membership::members;
  3. decl_error! {
  4. /// Discussion module predefined errors
  5. pub enum Error {
  6. /// Provided stake balance cannot be zero.
  7. StakeBalanceCannotBeZero,
  8. /// Cannot get the worker stake profile.
  9. NoWorkerStakeProfile,
  10. /// Current lead is not set.
  11. CurrentLeadNotSet,
  12. /// There is leader already, cannot hire another one.
  13. CannotHireLeaderWhenLeaderExists,
  14. /// Cannot fill opening with multiple applications.
  15. CannotHireMultipleLeaders,
  16. /// Not a lead account.
  17. IsNotLeadAccount,
  18. /// Opening text too short.
  19. OpeningTextTooShort,
  20. /// Opening text too long.
  21. OpeningTextTooLong,
  22. /// Opening does not exist.
  23. OpeningDoesNotExist,
  24. /// Insufficient balance to apply.
  25. InsufficientBalanceToApply,
  26. /// Unsigned origin.
  27. MembershipUnsignedOrigin,
  28. /// Member id is invalid.
  29. MembershipInvalidMemberId,
  30. /// Signer does not match controller account.
  31. ApplyOnWorkerOpeningSignerNotControllerAccount,
  32. /// Origin must be controller or root account of member.
  33. OriginIsNeitherMemberControllerOrRoot,
  34. /// Member already has an active application on the opening.
  35. MemberHasActiveApplicationOnOpening,
  36. /// Worker application text too long.
  37. WorkerApplicationTextTooLong,
  38. /// Worker application text too short.
  39. WorkerApplicationTextTooShort,
  40. /// Insufficient balance to cover stake.
  41. InsufficientBalanceToCoverStake,
  42. /// Origin is not applicant.
  43. OriginIsNotApplicant,
  44. /// Worker application does not exist.
  45. WorkerApplicationDoesNotExist,
  46. /// Successful worker application does not exist.
  47. SuccessfulWorkerApplicationDoesNotExist,
  48. /// Reward policy has invalid next payment block number.
  49. FillOpeningInvalidNextPaymentBlock,
  50. /// Working group mint does not exist.
  51. FillOpeningMintDoesNotExist,
  52. ///Relationship must exist.
  53. RelationshipMustExist,
  54. /// Worker exit rationale text is too long.
  55. WorkerExitRationaleTextTooLong,
  56. /// Worker exit rationale text is too short.
  57. WorkerExitRationaleTextTooShort,
  58. /// Signer is not worker role account.
  59. SignerIsNotWorkerRoleAccount,
  60. /// Worker has no recurring reward.
  61. WorkerHasNoReward,
  62. /// Worker does not exist.
  63. WorkerDoesNotExist,
  64. /// Opening does not exist.
  65. AcceptWorkerApplicationsOpeningDoesNotExist,
  66. /// Opening Is Not in Waiting to begin.
  67. AcceptWorkerApplicationsOpeningIsNotWaitingToBegin,
  68. /// Opening does not exist.
  69. BeginWorkerApplicantReviewOpeningDoesNotExist,
  70. /// Opening Is Not in Waiting.
  71. BeginWorkerApplicantReviewOpeningOpeningIsNotWaitingToBegin,
  72. /// OpeningDoesNotExist.
  73. FullWorkerOpeningOpeningDoesNotExist,
  74. /// Opening not in review period stage.
  75. FullWorkerOpeningOpeningNotInReviewPeriodStage,
  76. /// Application stake unstaking period for successful applicants too short.
  77. FullWorkerOpeningUnsuccessfulApplicationStakeUnstakingPeriodTooShort,
  78. /// Application stake unstaking period for failed applicants too short.
  79. FullWorkerOpeningSuccessfulApplicationStakeUnstakingPeriodTooShort,
  80. /// Role stake unstaking period for successful applicants too short.
  81. FullWorkerOpeningSuccessfulRoleStakeUnstakingPeriodTooShort,
  82. /// Role stake unstaking period for failed applicants too short.
  83. FullWorkerOpeningUnsuccessfulRoleStakeUnstakingPeriodTooShort,
  84. /// Application stake unstaking period for successful applicants redundant.
  85. FullWorkerOpeningSuccessfulApplicationStakeUnstakingPeriodRedundant,
  86. /// Application stake unstaking period for failed applicants redundant.
  87. FullWorkerOpeningUnsuccessfulApplicationStakeUnstakingPeriodRedundant,
  88. /// Role stake unstaking period for successful applicants redundant.
  89. FullWorkerOpeningSuccessfulRoleStakeUnstakingPeriodRedundant,
  90. /// Role stake unstaking period for failed applicants redundant.
  91. FullWorkerOpeningUnsuccessfulRoleStakeUnstakingPeriodRedundant,
  92. /// Application does not exist.
  93. FullWorkerOpeningApplicationDoesNotExist,
  94. /// Application not in active stage.
  95. FullWorkerOpeningApplicationNotActive,
  96. /// Applications not for opening.
  97. FillWorkerOpeningApplicationForWrongOpening,
  98. /// Application does not exist.
  99. WithdrawWorkerApplicationApplicationDoesNotExist,
  100. /// Application is not active.
  101. WithdrawWorkerApplicationApplicationNotActive,
  102. /// Opening not accepting applications.
  103. WithdrawWorkerApplicationOpeningNotAcceptingApplications,
  104. /// UnstakingPeriodTooShort .... // <== SHOULD REALLY BE TWO SEPARATE, ONE FOR EACH STAKING PURPOSE
  105. WithdrawWorkerApplicationUnstakingPeriodTooShort,
  106. /// Redundant unstaking period provided
  107. WithdrawWorkerApplicationRedundantUnstakingPeriod,
  108. /// Opening does not activate in the future.
  109. AddWorkerOpeningActivatesInThePast,
  110. /// Role stake amount less than minimum currency balance.
  111. AddWorkerOpeningRoleStakeLessThanMinimum,
  112. /// Application stake amount less than minimum currency balance.
  113. AddWorkerOpeningAppliicationStakeLessThanMinimum,
  114. /// Opening does not exist.
  115. AddWorkerOpeningOpeningDoesNotExist,
  116. // <== SHOULD REALLY BE TWO SEPARATE, ONE FOR EACH STAKING PURPOSE
  117. /// Stake provided when redundant.
  118. AddWorkerOpeningStakeProvidedWhenRedundant,
  119. // <== SHOULD REALLY BE TWO SEPARATE, ONE FOR EACH STAKING PURPOSE
  120. /// Stake missing when required.
  121. AddWorkerOpeningStakeMissingWhenRequired,
  122. // <== SHOULD REALLY BE TWO SEPARATE, ONE FOR EACH STAKING PURPOSE
  123. /// Stake amount too low.
  124. AddWorkerOpeningStakeAmountTooLow,
  125. /// Opening is not in accepting applications stage.
  126. AddWorkerOpeningOpeningNotInAcceptingApplicationStage,
  127. /// New application was crowded out.
  128. AddWorkerOpeningNewApplicationWasCrowdedOut,
  129. /// Application rationing has zero max active applicants.
  130. AddWorkerOpeningZeroMaxApplicantCount,
  131. /// Next payment is not in the future.
  132. RecurringRewardsNextPaymentNotInFuture,
  133. /// Recipient not found.
  134. RecurringRewardsRecipientNotFound,
  135. /// Recipient reward source not found.
  136. RecurringRewardsRewardSourceNotFound,
  137. /// Reward relationship not found.
  138. RecurringRewardsRewardRelationshipNotFound,
  139. /// Stake not found.
  140. StakingErrorStakeNotFound,
  141. /// Unstaking period should be greater than zero.
  142. StakingErrorUnstakingPeriodShouldBeGreaterThanZero,
  143. /// Already unstaking.
  144. StakingErrorAlreadyUnstaking,
  145. /// Not staked.
  146. StakingErrorNotStaked,
  147. /// Cannot unstake while slashes ongoing.
  148. StakingErrorCannotUnstakeWhileSlashesOngoing,
  149. /// Insufficient balance in source account.
  150. StakingErrorInsufficientBalanceInSourceAccount,
  151. /// Cannot change stake by zero.
  152. StakingErrorCannotChangeStakeByZero,
  153. /// Cannot increase stake while unstaking.
  154. StakingErrorCannotIncreaseStakeWhileUnstaking,
  155. /// Cannot decrease stake while slashes ongoing.
  156. StakingErrorCannotDecreaseWhileSlashesOngoing,
  157. /// Insufficient stake to decrease.
  158. StakingErrorInsufficientStake,
  159. /// Slash amount should be greater than zero.
  160. StakingErrorSlashAmountShouldBeGreaterThanZero,
  161. /// Cannot find mint in the minting module.
  162. CannotFindMint,
  163. /// Require root origin in extrinsics.
  164. RequireRootOrigin,
  165. /// Require signed origin in extrinsics.
  166. RequireSignedOrigin,
  167. /// Working group size limit exceeded.
  168. MaxActiveWorkerNumberExceeded,
  169. }
  170. }
  171. impl From<system::Error> for Error {
  172. fn from(error: system::Error) -> Self {
  173. match error {
  174. system::Error::Other(msg) => Error::Other(msg),
  175. system::Error::RequireRootOrigin => Error::RequireRootOrigin,
  176. system::Error::RequireSignedOrigin => Error::RequireSignedOrigin,
  177. _ => Error::Other(error.into()),
  178. }
  179. }
  180. }
  181. /// Error wrapper for external module error conversions.
  182. pub struct WrappedError<E> {
  183. /// Generic error.
  184. pub error: E,
  185. }
  186. /// Helps with conversion of other modules errors.
  187. #[macro_export]
  188. macro_rules! ensure_on_wrapped_error {
  189. ($call:expr) => {{
  190. { $call }.map_err(|err| crate::WrappedError { error: err })
  191. }};
  192. }
  193. impl rstd::convert::From<WrappedError<hiring::BeginAcceptingApplicationsError>> for Error {
  194. fn from(wrapper: WrappedError<hiring::BeginAcceptingApplicationsError>) -> Self {
  195. match wrapper.error {
  196. hiring::BeginAcceptingApplicationsError::OpeningDoesNotExist => {
  197. Error::AcceptWorkerApplicationsOpeningDoesNotExist
  198. }
  199. hiring::BeginAcceptingApplicationsError::OpeningIsNotInWaitingToBeginStage => {
  200. Error::AcceptWorkerApplicationsOpeningIsNotWaitingToBegin
  201. }
  202. }
  203. }
  204. }
  205. impl rstd::convert::From<WrappedError<hiring::AddOpeningError>> for Error {
  206. fn from(wrapper: WrappedError<hiring::AddOpeningError>) -> Self {
  207. match wrapper.error {
  208. hiring::AddOpeningError::OpeningMustActivateInTheFuture => {
  209. Error::AddWorkerOpeningActivatesInThePast
  210. }
  211. hiring::AddOpeningError::StakeAmountLessThanMinimumCurrencyBalance(purpose) => {
  212. match purpose {
  213. hiring::StakePurpose::Role => Error::AddWorkerOpeningRoleStakeLessThanMinimum,
  214. hiring::StakePurpose::Application => {
  215. Error::AddWorkerOpeningAppliicationStakeLessThanMinimum
  216. }
  217. }
  218. }
  219. hiring::AddOpeningError::ApplicationRationingZeroMaxApplicants => {
  220. Error::AddWorkerOpeningZeroMaxApplicantCount
  221. }
  222. }
  223. }
  224. }
  225. impl rstd::convert::From<WrappedError<hiring::BeginReviewError>> for Error {
  226. fn from(wrapper: WrappedError<hiring::BeginReviewError>) -> Self {
  227. match wrapper.error {
  228. hiring::BeginReviewError::OpeningDoesNotExist => {
  229. Error::BeginWorkerApplicantReviewOpeningDoesNotExist
  230. }
  231. hiring::BeginReviewError::OpeningNotInAcceptingApplicationsStage => {
  232. Error::BeginWorkerApplicantReviewOpeningOpeningIsNotWaitingToBegin
  233. }
  234. }
  235. }
  236. }
  237. impl<T: hiring::Trait> rstd::convert::From<WrappedError<hiring::FillOpeningError<T>>> for Error {
  238. fn from(wrapper: WrappedError<hiring::FillOpeningError<T>>) -> Self {
  239. match wrapper.error {
  240. hiring::FillOpeningError::<T>::OpeningDoesNotExist => {
  241. Error::FullWorkerOpeningOpeningDoesNotExist
  242. }
  243. hiring::FillOpeningError::<T>::OpeningNotInReviewPeriodStage => {
  244. Error::FullWorkerOpeningOpeningNotInReviewPeriodStage
  245. }
  246. hiring::FillOpeningError::<T>::UnstakingPeriodTooShort(
  247. stake_purpose,
  248. outcome_in_filled_opening,
  249. ) => match stake_purpose {
  250. hiring::StakePurpose::Application => match outcome_in_filled_opening {
  251. hiring::ApplicationOutcomeInFilledOpening::Success => {
  252. Error::FullWorkerOpeningSuccessfulApplicationStakeUnstakingPeriodTooShort
  253. }
  254. hiring::ApplicationOutcomeInFilledOpening::Failure => {
  255. Error::FullWorkerOpeningUnsuccessfulApplicationStakeUnstakingPeriodTooShort
  256. }
  257. },
  258. hiring::StakePurpose::Role => match outcome_in_filled_opening {
  259. hiring::ApplicationOutcomeInFilledOpening::Success => {
  260. Error::FullWorkerOpeningSuccessfulRoleStakeUnstakingPeriodTooShort
  261. }
  262. hiring::ApplicationOutcomeInFilledOpening::Failure => {
  263. Error::FullWorkerOpeningUnsuccessfulRoleStakeUnstakingPeriodTooShort
  264. }
  265. },
  266. },
  267. hiring::FillOpeningError::<T>::RedundantUnstakingPeriodProvided(
  268. stake_purpose,
  269. outcome_in_filled_opening,
  270. ) => match stake_purpose {
  271. hiring::StakePurpose::Application => match outcome_in_filled_opening {
  272. hiring::ApplicationOutcomeInFilledOpening::Success => {
  273. Error::FullWorkerOpeningSuccessfulApplicationStakeUnstakingPeriodRedundant
  274. }
  275. hiring::ApplicationOutcomeInFilledOpening::Failure => {
  276. Error::FullWorkerOpeningUnsuccessfulApplicationStakeUnstakingPeriodRedundant
  277. }
  278. },
  279. hiring::StakePurpose::Role => match outcome_in_filled_opening {
  280. hiring::ApplicationOutcomeInFilledOpening::Success => {
  281. Error::FullWorkerOpeningSuccessfulRoleStakeUnstakingPeriodRedundant
  282. }
  283. hiring::ApplicationOutcomeInFilledOpening::Failure => {
  284. Error::FullWorkerOpeningUnsuccessfulRoleStakeUnstakingPeriodRedundant
  285. }
  286. },
  287. },
  288. hiring::FillOpeningError::<T>::ApplicationDoesNotExist(_application_id) => {
  289. Error::FullWorkerOpeningApplicationDoesNotExist
  290. }
  291. hiring::FillOpeningError::<T>::ApplicationNotInActiveStage(_application_id) => {
  292. Error::FullWorkerOpeningApplicationNotActive
  293. }
  294. hiring::FillOpeningError::<T>::ApplicationForWrongOpening(_application_id) => {
  295. Error::FillWorkerOpeningApplicationForWrongOpening
  296. }
  297. }
  298. }
  299. }
  300. impl rstd::convert::From<WrappedError<hiring::DeactivateApplicationError>> for Error {
  301. fn from(wrapper: WrappedError<hiring::DeactivateApplicationError>) -> Self {
  302. match wrapper.error {
  303. hiring::DeactivateApplicationError::ApplicationDoesNotExist => {
  304. Error::WithdrawWorkerApplicationApplicationDoesNotExist
  305. }
  306. hiring::DeactivateApplicationError::ApplicationNotActive => {
  307. Error::WithdrawWorkerApplicationApplicationNotActive
  308. }
  309. hiring::DeactivateApplicationError::OpeningNotAcceptingApplications => {
  310. Error::WithdrawWorkerApplicationOpeningNotAcceptingApplications
  311. }
  312. hiring::DeactivateApplicationError::UnstakingPeriodTooShort(_stake_purpose) => {
  313. Error::WithdrawWorkerApplicationUnstakingPeriodTooShort
  314. }
  315. hiring::DeactivateApplicationError::RedundantUnstakingPeriodProvided(
  316. _stake_purpose,
  317. ) => Error::WithdrawWorkerApplicationRedundantUnstakingPeriod,
  318. }
  319. }
  320. }
  321. impl rstd::convert::From<WrappedError<hiring::AddApplicationError>> for Error {
  322. fn from(wrapper: WrappedError<hiring::AddApplicationError>) -> Self {
  323. match wrapper.error {
  324. hiring::AddApplicationError::OpeningDoesNotExist => {
  325. Error::AddWorkerOpeningOpeningDoesNotExist
  326. }
  327. hiring::AddApplicationError::StakeProvidedWhenRedundant(_stake_purpose) => {
  328. Error::AddWorkerOpeningStakeProvidedWhenRedundant
  329. }
  330. hiring::AddApplicationError::StakeMissingWhenRequired(_stake_purpose) => {
  331. Error::AddWorkerOpeningStakeMissingWhenRequired
  332. }
  333. hiring::AddApplicationError::StakeAmountTooLow(_stake_purpose) => {
  334. Error::AddWorkerOpeningStakeAmountTooLow
  335. }
  336. hiring::AddApplicationError::OpeningNotInAcceptingApplicationsStage => {
  337. Error::AddWorkerOpeningOpeningNotInAcceptingApplicationStage
  338. }
  339. hiring::AddApplicationError::NewApplicationWasCrowdedOut => {
  340. Error::AddWorkerOpeningNewApplicationWasCrowdedOut
  341. }
  342. }
  343. }
  344. }
  345. impl rstd::convert::From<WrappedError<members::MemberControllerAccountDidNotSign>> for Error {
  346. fn from(wrapper: WrappedError<members::MemberControllerAccountDidNotSign>) -> Self {
  347. match wrapper.error {
  348. members::MemberControllerAccountDidNotSign::UnsignedOrigin => {
  349. Error::MembershipUnsignedOrigin
  350. }
  351. members::MemberControllerAccountDidNotSign::MemberIdInvalid => {
  352. Error::MembershipInvalidMemberId
  353. }
  354. members::MemberControllerAccountDidNotSign::SignerControllerAccountMismatch => {
  355. Error::ApplyOnWorkerOpeningSignerNotControllerAccount
  356. }
  357. }
  358. }
  359. }
  360. impl rstd::convert::From<WrappedError<recurringrewards::RewardsError>> for Error {
  361. fn from(wrapper: WrappedError<recurringrewards::RewardsError>) -> Self {
  362. match wrapper.error {
  363. recurringrewards::RewardsError::NextPaymentNotInFuture => {
  364. Error::RecurringRewardsNextPaymentNotInFuture
  365. }
  366. recurringrewards::RewardsError::RecipientNotFound => {
  367. Error::RecurringRewardsRecipientNotFound
  368. }
  369. recurringrewards::RewardsError::RewardSourceNotFound => {
  370. Error::RecurringRewardsRewardSourceNotFound
  371. }
  372. recurringrewards::RewardsError::RewardRelationshipNotFound => {
  373. Error::RecurringRewardsRewardRelationshipNotFound
  374. }
  375. }
  376. }
  377. }
  378. impl rstd::convert::From<WrappedError<stake::StakeActionError<stake::InitiateUnstakingError>>>
  379. for Error
  380. {
  381. fn from(wrapper: WrappedError<stake::StakeActionError<stake::InitiateUnstakingError>>) -> Self {
  382. match wrapper.error {
  383. stake::StakeActionError::StakeNotFound => Error::StakingErrorStakeNotFound,
  384. stake::StakeActionError::Error(initiate_unstaking_error) => {
  385. match initiate_unstaking_error {
  386. stake::InitiateUnstakingError::UnstakingPeriodShouldBeGreaterThanZero => {
  387. Error::StakingErrorUnstakingPeriodShouldBeGreaterThanZero
  388. }
  389. stake::InitiateUnstakingError::UnstakingError(unstaking_error) => {
  390. match unstaking_error {
  391. stake::UnstakingError::AlreadyUnstaking => {
  392. Error::StakingErrorAlreadyUnstaking
  393. }
  394. stake::UnstakingError::NotStaked => Error::StakingErrorNotStaked,
  395. stake::UnstakingError::CannotUnstakeWhileSlashesOngoing => {
  396. Error::StakingErrorCannotUnstakeWhileSlashesOngoing
  397. }
  398. }
  399. }
  400. }
  401. }
  402. }
  403. }
  404. }
  405. impl
  406. rstd::convert::From<
  407. WrappedError<stake::StakeActionError<stake::IncreasingStakeFromAccountError>>,
  408. > for Error
  409. {
  410. fn from(
  411. wrapper: WrappedError<stake::StakeActionError<stake::IncreasingStakeFromAccountError>>,
  412. ) -> Self {
  413. match wrapper.error {
  414. stake::StakeActionError::StakeNotFound => Error::StakingErrorStakeNotFound,
  415. stake::StakeActionError::Error(increase_stake_error_from_account) => {
  416. match increase_stake_error_from_account {
  417. stake::IncreasingStakeFromAccountError::InsufficientBalanceInSourceAccount => {
  418. Error::StakingErrorInsufficientBalanceInSourceAccount
  419. }
  420. stake::IncreasingStakeFromAccountError::IncreasingStakeError(
  421. increasing_stake_error,
  422. ) => match increasing_stake_error {
  423. stake::IncreasingStakeError::NotStaked => Error::StakingErrorNotStaked,
  424. stake::IncreasingStakeError::CannotChangeStakeByZero => {
  425. Error::StakingErrorCannotChangeStakeByZero
  426. }
  427. stake::IncreasingStakeError::CannotIncreaseStakeWhileUnstaking => {
  428. Error::StakingErrorCannotIncreaseStakeWhileUnstaking
  429. }
  430. },
  431. }
  432. }
  433. }
  434. }
  435. }
  436. impl rstd::convert::From<WrappedError<stake::StakeActionError<stake::IncreasingStakeError>>>
  437. for Error
  438. {
  439. fn from(wrapper: WrappedError<stake::StakeActionError<stake::IncreasingStakeError>>) -> Self {
  440. match wrapper.error {
  441. stake::StakeActionError::StakeNotFound => Error::StakingErrorStakeNotFound,
  442. stake::StakeActionError::Error(increasing_stake_error) => {
  443. match increasing_stake_error {
  444. stake::IncreasingStakeError::NotStaked => Error::StakingErrorNotStaked,
  445. stake::IncreasingStakeError::CannotChangeStakeByZero => {
  446. Error::StakingErrorCannotChangeStakeByZero
  447. }
  448. stake::IncreasingStakeError::CannotIncreaseStakeWhileUnstaking => {
  449. Error::StakingErrorCannotIncreaseStakeWhileUnstaking
  450. }
  451. }
  452. }
  453. }
  454. }
  455. }
  456. impl rstd::convert::From<WrappedError<stake::StakeActionError<stake::DecreasingStakeError>>>
  457. for Error
  458. {
  459. fn from(wrapper: WrappedError<stake::StakeActionError<stake::DecreasingStakeError>>) -> Self {
  460. match wrapper.error {
  461. stake::StakeActionError::StakeNotFound => Error::StakingErrorStakeNotFound,
  462. stake::StakeActionError::Error(decreasing_stake_error) => {
  463. match decreasing_stake_error {
  464. stake::DecreasingStakeError::NotStaked => Error::StakingErrorNotStaked,
  465. stake::DecreasingStakeError::CannotChangeStakeByZero => {
  466. Error::StakingErrorCannotChangeStakeByZero
  467. }
  468. stake::DecreasingStakeError::CannotDecreaseStakeWhileUnstaking => {
  469. Error::StakingErrorCannotIncreaseStakeWhileUnstaking
  470. }
  471. stake::DecreasingStakeError::CannotDecreaseStakeWhileOngoingSlahes => {
  472. Error::StakingErrorCannotDecreaseWhileSlashesOngoing
  473. }
  474. stake::DecreasingStakeError::InsufficientStake => {
  475. Error::StakingErrorInsufficientStake
  476. }
  477. }
  478. }
  479. }
  480. }
  481. }
  482. impl rstd::convert::From<WrappedError<stake::StakeActionError<stake::ImmediateSlashingError>>>
  483. for Error
  484. {
  485. fn from(wrapper: WrappedError<stake::StakeActionError<stake::ImmediateSlashingError>>) -> Self {
  486. match wrapper.error {
  487. stake::StakeActionError::StakeNotFound => Error::StakingErrorStakeNotFound,
  488. stake::StakeActionError::Error(slashing_error) => match slashing_error {
  489. stake::ImmediateSlashingError::NotStaked => Error::StakingErrorNotStaked,
  490. stake::ImmediateSlashingError::SlashAmountShouldBeGreaterThanZero => {
  491. Error::StakingErrorSlashAmountShouldBeGreaterThanZero
  492. }
  493. },
  494. }
  495. }
  496. }
  497. impl rstd::convert::From<WrappedError<minting::GeneralError>> for Error {
  498. fn from(wrapper: WrappedError<minting::GeneralError>) -> Self {
  499. match wrapper.error {
  500. minting::GeneralError::MintNotFound => Error::CannotFindMint,
  501. minting::GeneralError::NextAdjustmentInPast => Error::Other("NextAdjustmentInPast"),
  502. }
  503. }
  504. }