Не вижу тут никакой особой логики - только ничем не мотивированное усложнение кода. Если вы говорите, что "возвращать ничего не надо" - зачем тогда получать результаты, складывать их? Да ещё и перетирая один из них, никак не использовав. Так что: вызов первого экшена - оставляем без изменений; второй и третий - просто await'ы, переменную coins убираем; в конце - просто await market, return и суммирование убираем.
Зачем сохранять контекст в отдельную переменную? - при создании стрелочных функций тоже можно использовать async.
Установка значения isLoading - почему вы меняете состояние хранилища вне мутации? Так дела не делаются.