Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
67 commits
Select commit Hold shift + click to select a range
82b627d
Bug Fix. Validation on balance of a controller (#326)
FrogTravel Jun 25, 2021
a3548d9
Fix. Alert dialog for controller zero balance (#321)
FrogTravel Jun 28, 2021
d0c294c
Merge branch 'master' into dev_master
valentunn Jun 29, 2021
8f2968a
Fix - failed requirement if nominators are null (#332)
valentunn Jun 29, 2021
ebdc8b7
Merge branch 'develop' into dev_master
valentunn Jun 29, 2021
3231312
Merge pull request #330 from soramitsu/dev_master
valentunn Jun 29, 2021
b6942c8
Really bad way to count down, but it works
FrogTravel Jul 1, 2021
75bac74
Finished algorithm to count time for the rest of the era
FrogTravel Jul 2, 2021
a26734a
Caching for algorithm
FrogTravel Jul 2, 2021
5329546
Change Historical Updater base class range from [current_era - histor…
FrogTravel Jul 5, 2021
5caa7de
Code style
FrogTravel Jul 5, 2021
e04c978
Staking Widget timer added
FrogTravel Jul 5, 2021
a51937c
Timer logic for destination era
FrogTravel Jul 6, 2021
f8d7400
Unbonding timer; lots of timer implementation
FrogTravel Jul 7, 2021
81860c7
Merge branch 'develop' of https://github.com/soramitsu/fearless-Andro…
FrogTravel Jul 7, 2021
f600328
Payout Rewards timer;
FrogTravel Jul 7, 2021
699adfd
Era number in active and in inactive status returned
FrogTravel Jul 7, 2021
d2bba09
KlintFormat
FrogTravel Jul 7, 2021
8d1d451
Feature/custom validators (#328)
valentunn Jul 13, 2021
cf4412e
Format nominators count (#336)
valentunn Jul 14, 2021
817eccd
Disallow selecting blocked validator via search (#335)
valentunn Jul 14, 2021
e4aa326
Fix - clear filters is always enabled (#337)
valentunn Jul 14, 2021
f7cdd48
Fix - crash at start staking (#338)
valentunn Jul 14, 2021
594c0f1
Fix/crowdloan crash (#341)
valentunn Jul 21, 2021
cd8afb7
Update fearlesslib version (#340)
valentunn Jul 21, 2021
3d03402
Refactor of historicalRange method
FrogTravel Jul 21, 2021
a867b46
Flw 1059 (#344)
valentunn Jul 21, 2021
3be46a6
Calculator logic refactoring
FrogTravel Jul 21, 2021
3893557
Timer logic refactoring
FrogTravel Jul 21, 2021
ad11025
Merge branch 'develop' of https://github.com/soramitsu/fearless-Andro…
FrogTravel Jul 22, 2021
0c6971c
Merge branch 'feature/timer_task' of https://github.com/soramitsu/fea…
FrogTravel Jul 22, 2021
5124430
Refactoring of staking widget
FrogTravel Jul 22, 2021
7ddda67
Linter
FrogTravel Jul 22, 2021
8c6d5de
staking payout expired when left time is zero
FrogTravel Jul 22, 2021
9db6ae0
Codestyle
FrogTravel Jul 26, 2021
ee0b816
Bug fix
FrogTravel Jul 26, 2021
165413c
Color added
FrogTravel Jul 26, 2021
0689eec
Merge pull request #334 from soramitsu/feature/timer_task
antonkhvorov Jul 26, 2021
e6dc808
Revert "Feature/timer task" (#348)
FrogTravel Jul 30, 2021
93dd1b2
Flw 1076 (#342)
valentunn Jul 30, 2021
de60c7a
Feature/rename reward (#347)
FrogTravel Jul 30, 2021
fa9ea71
Develop update to 1.9.0 version (#351)
FrogTravel Aug 11, 2021
4102592
Merge pull request #354 from soramitsu/master
valentunn Aug 16, 2021
b7f4e5c
Fix/min bond (#357)
valentunn Aug 18, 2021
d69b3a4
Use mortal era instead of immortal (#356)
valentunn Aug 19, 2021
cec918d
Change subscan request to subquery (#362)
FrogTravel Aug 24, 2021
879334e
Feature/info confirmation screen (#350)
FrogTravel Aug 24, 2021
ef119d4
Feature/your validators update (#353)
FrogTravel Aug 25, 2021
5f511ed
Hide bond more alert for validator (#360)
valentunn Aug 25, 2021
dfb81f4
Feature/timer new branch (#358)
FrogTravel Aug 25, 2021
90863cf
Feature/subuqery total reward (#371)
valentunn Sep 6, 2021
3f6e080
Remove max nominator limitation for already nominating users
valentunn Sep 6, 2021
297209a
Merge pull request #372 from soramitsu/feature/remove_some_staking_li…
arvifox Sep 6, 2021
321f33d
Show oversubscribed unpaid warning only if user nomination is in over…
valentunn Sep 6, 2021
3457246
Migrate from Subscan to Coingeck API for fiat representation (#374)
antonkhvorov Sep 10, 2021
9691843
Fix current validator elected list (#375)
valentunn Sep 10, 2021
9d9ec32
Fix/elected count (#377)
valentunn Sep 13, 2021
d97f564
Optimize era validator infos query (#381)
valentunn Sep 13, 2021
604279a
Subquery history (#378)
valentunn Sep 13, 2021
2ed5e98
Optional reward rate (#379)
valentunn Sep 13, 2021
6d399c7
Change patract nodes url (#382)
valentunn Sep 13, 2021
629914a
Bump versions
valentunn Sep 13, 2021
7e84d6b
Bump versions
valentunn Sep 13, 2021
52833e0
Bump versions
valentunn Sep 13, 2021
fcbbb66
Fix - crash when no active validators found on current validators scr…
valentunn Sep 14, 2021
1873dc5
Merge branch 'develop' into rc/1.9.4
valentunn Sep 14, 2021
6169ce1
Bump versions
valentunn Sep 14, 2021
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 0 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,12 +21,9 @@ To build Fearless Wallet Android project, you need to provide several keys eithe
``` properties
MOONPAY_TEST_SECRET=stub
MOONPAY_PRODUCTION_SECRET=stub
SUBSCAN_API_KEY=
```

Note, that with stub keys buy via moonpay will not work correctly. However, other parts of application will not be affected.

If you will leave SUBSCAN_API_KEY value empty, you will have very strict limits for the subscan api requests. If you want to increase the limits, check the [Subscan website](https://docs.api.subscan.io/#introduction) and then add the api key to the 'local.properties' -> SUBSCAN_API_KEY=YOUR_API_KEY

## License
Fearless Wallet Android is available under the Apache 2.0 license. See the LICENSE file for more info.
28 changes: 23 additions & 5 deletions app/src/main/java/jp/co/soramitsu/app/root/navigation/Navigator.kt
Original file line number Diff line number Diff line change
Expand Up @@ -65,11 +65,13 @@ import jp.co.soramitsu.feature_staking_impl.presentation.validators.parcel.Valid
import jp.co.soramitsu.feature_wallet_api.domain.model.Token
import jp.co.soramitsu.feature_wallet_impl.presentation.WalletRouter
import jp.co.soramitsu.feature_wallet_impl.presentation.balance.detail.BalanceDetailFragment
import jp.co.soramitsu.feature_wallet_impl.presentation.model.TransactionModel
import jp.co.soramitsu.feature_wallet_impl.presentation.model.OperationParcelizeModel
import jp.co.soramitsu.feature_wallet_impl.presentation.send.TransferDraft
import jp.co.soramitsu.feature_wallet_impl.presentation.send.amount.ChooseAmountFragment
import jp.co.soramitsu.feature_wallet_impl.presentation.send.confirm.ConfirmTransferFragment
import jp.co.soramitsu.feature_wallet_impl.presentation.transaction.detail.TransactionDetailFragment
import jp.co.soramitsu.feature_wallet_impl.presentation.transaction.detail.extrinsic.ExtrinsicDetailFragment
import jp.co.soramitsu.feature_wallet_impl.presentation.transaction.detail.reward.RewardDetailFragment
import jp.co.soramitsu.feature_wallet_impl.presentation.transaction.detail.transfer.TransferDetailFragment
import jp.co.soramitsu.splash.SplashRouter
import kotlinx.android.parcel.Parcelize
import kotlinx.coroutines.flow.Flow
Expand Down Expand Up @@ -345,6 +347,10 @@ class Navigator :
navController?.navigate(R.id.action_open_send)
}

override fun openFilter() {
navController?.navigate(R.id.action_mainFragment_to_filterFragment)
}

override fun openChooseAmount(recipientAddress: String) {
val bundle = ChooseAmountFragment.getBundle(recipientAddress)

Expand All @@ -367,10 +373,22 @@ class Navigator :
navController?.navigate(R.id.openSelectAmount, bundle)
}

override fun openTransactionDetail(transaction: TransactionModel) {
val bundle = TransactionDetailFragment.getBundle(transaction)
override fun openTransferDetail(transaction: OperationParcelizeModel.Transfer) {
val bundle = TransferDetailFragment.getBundle(transaction)

navController?.navigate(R.id.open_transfer_detail, bundle)
}

override fun openRewardDetail(reward: OperationParcelizeModel.Reward) {
val bundle = RewardDetailFragment.getBundle(reward)

navController?.navigate(R.id.open_reward_detail, bundle)
}

override fun openExtrinsicDetail(extrinsic: OperationParcelizeModel.Extrinsic) {
val bundle = ExtrinsicDetailFragment.getBundle(extrinsic)

navController?.navigate(R.id.open_transaction_detail, bundle)
navController?.navigate(R.id.open_extrinsic_detail, bundle)
}

override fun openAccounts(accountChosenNavDirection: AccountChosenNavDirection) {
Expand Down
53 changes: 47 additions & 6 deletions app/src/main/res/navigation/main_nav_graph.xml
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,24 @@
app:popExitAnim="@anim/fragment_close_exit" />

<action
android:id="@+id/open_transaction_detail"
app:destination="@id/transactionDetailFragment"
android:id="@+id/open_transfer_detail"
app:destination="@id/transferDetailFragment"
app:enterAnim="@anim/fragment_open_enter"
app:exitAnim="@anim/fragment_open_exit"
app:popEnterAnim="@anim/fragment_close_enter"
app:popExitAnim="@anim/fragment_close_exit" />

<action
android:id="@+id/open_reward_detail"
app:destination="@id/rewardDetailFragment"
app:enterAnim="@anim/fragment_open_enter"
app:exitAnim="@anim/fragment_open_exit"
app:popEnterAnim="@anim/fragment_close_enter"
app:popExitAnim="@anim/fragment_close_exit" />

<action
android:id="@+id/open_extrinsic_detail"
app:destination="@id/extrinsicDetailFragment"
app:enterAnim="@anim/fragment_open_enter"
app:exitAnim="@anim/fragment_open_exit"
app:popEnterAnim="@anim/fragment_close_enter"
Expand Down Expand Up @@ -283,10 +299,22 @@


<fragment
android:id="@+id/transactionDetailFragment"
android:name="jp.co.soramitsu.feature_wallet_impl.presentation.transaction.detail.TransactionDetailFragment"
android:label="TransactionDetailFragment"
tools:layout="@layout/fragment_transaction_details" />
android:id="@+id/transferDetailFragment"
android:name="jp.co.soramitsu.feature_wallet_impl.presentation.transaction.detail.transfer.TransferDetailFragment"
android:label="TransferDetailFragment"
tools:layout="@layout/fragment_transfer_details" />

<fragment
android:id="@+id/extrinsicDetailFragment"
android:name="jp.co.soramitsu.feature_wallet_impl.presentation.transaction.detail.extrinsic.ExtrinsicDetailFragment"
android:label="ExtrinsicDetailFragment"
tools:layout="@layout/fragment_extrinsic_details" />

<fragment
android:id="@+id/rewardDetailFragment"
android:name="jp.co.soramitsu.feature_wallet_impl.presentation.transaction.detail.reward.RewardDetailFragment"
android:label="RewardDetailFragment"
tools:layout="@layout/fragment_reward_slash_details" />

<action
android:id="@+id/openSelectAmount"
Expand Down Expand Up @@ -332,6 +360,19 @@
app:popExitAnim="@anim/fragment_close_exit" />
</fragment>

<action
android:id="@+id/action_mainFragment_to_filterFragment"
app:destination="@id/transactionHistoryFilterFragment"
app:enterAnim="@anim/fragment_open_enter"
app:exitAnim="@anim/fragment_open_exit"
app:popEnterAnim="@anim/fragment_close_enter"
app:popExitAnim="@anim/fragment_close_exit" />

<fragment
android:id="@+id/transactionHistoryFilterFragment"
android:name="jp.co.soramitsu.feature_wallet_impl.presentation.transaction.filter.TransactionHistoryFilterFragment"
android:label="TransactionHistoryFilterFragment"/>

<fragment
android:id="@+id/confirmTransferFragment"
android:name="jp.co.soramitsu.feature_wallet_impl.presentation.send.confirm.ConfirmTransferFragment"
Expand Down
6 changes: 3 additions & 3 deletions build.gradle
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
buildscript {
ext {
// App version
versionName = '1.9.0'
versionCode = 20
versionName = '1.9.4'
versionCode = 24

// SDK and tools
compileSdkVersion = 29
Expand Down Expand Up @@ -42,7 +42,7 @@ buildscript {

bouncyCastleVersion = '1.60'

fearlessLibVersion = '1.0.75'
fearlessLibVersion = '1.0.77'

gifVersion = '1.2.19'

Expand Down
5 changes: 1 addition & 4 deletions common/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -21,16 +21,13 @@ android {

buildConfigField "String", "TWITTER_ACCOUNT_TEMPLATE", "\"https://twitter.com/%s\""

buildConfigField "String", "ROADMAP_URL", "\"https://soramitsucoltd.aha.io/shared/97bc3006ee3c1baa0598863615cf8d14\""
buildConfigField "String", "DEV_STATUS_URL", "\"https://soramitsucoltd.aha.io/shared/343e5db57d53398e3f26d0048158c4a2\""

buildConfigField "String", "SUBSCAN_TRANSACTION_TEMPLATE", "\"https://%1\$s.subscan.io/extrinsic/%2\$s\""
buildConfigField "String", "SUBSCAN_ACCOUNT_TEMPLATE", "\"https://%1\$s.subscan.io/account/%2\$s\""

buildConfigField "String", "POLKSASCAN_TRANSACTION_TEMPLATE", "\"https://polkascan.io/%1\$s/extrinsic/%2\$s\""
buildConfigField "String", "POLKSASCAN_ACCOUNT_TEMPLATE", "\"https://polkascan.io/%1\$s/account/%2\$s\""
buildConfigField "String", "POLKSASCAN_EVENT_TEMPLATE", "\"https://polkascan.io/%1\$s/event/%2\$s\""

buildConfigField "String", "NOMINATOR_LEARN_MORE", "\"https://wiki.polkadot.network/docs/en/learn-nominator\""
buildConfigField "String", "PAYOUTS_LEARN_MORE", "\"https://wiki.polkadot.network/docs/en/learn-simple-payouts\""

buildConfigField "String", "SET_CONTROLLER_LEARN_MORE", "\"https://wiki.polkadot.network/docs/en/maintain-guides-how-to-nominate-polkadot#setting-up-stash-and-controller-keys\""
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ class AddressIconGenerator(
companion object {
const val SIZE_SMALL = 18
const val SIZE_MEDIUM = 24
const val SIZE_BIG = 32
}

@Throws(AddressFormatException::class)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package jp.co.soramitsu.common.data.model

data class CursorPage<T>(
val nextCursor: String?,
val items: List<T>
) : List<T> by items
Original file line number Diff line number Diff line change
Expand Up @@ -9,44 +9,46 @@ class AppLinksProvider(

private val externalAnalyzerTemplates: Map<ExternalAnalyzer, ExternalAnalyzerLinks>,

val roadMapUrl: String,
val devStatusUrl: String,

val nominatorLearnMore: String,
val payoutsLearnMore: String,
val twitterAccountTemplate: String,
val setControllerLearnMore: String
) {

fun getExternalEventUrl(
analyzer: ExternalAnalyzer,
eventId: String,
networkType: Node.NetworkType
) = getExternalUrl(analyzer, eventId, networkType, ExternalAnalyzerLinks::event)

fun getExternalTransactionUrl(
analyzer: ExternalAnalyzer,
hash: String,
networkType: Node.NetworkType
) = getExternalUrl(analyzer, hashWithPrefix(hash), networkType, ExternalAnalyzerLinks::transaction)
) = getExternalUrl(analyzer, hashWithPrefix(hash), networkType, ExternalAnalyzerLinks::transaction)!!

fun getExternalAddressUrl(
analyzer: ExternalAnalyzer,
address: String,
networkType: Node.NetworkType
) = getExternalUrl(analyzer, address, networkType, ExternalAnalyzerLinks::account)
) = getExternalUrl(analyzer, address, networkType, ExternalAnalyzerLinks::account)!!

private fun getExternalUrl(
analyzer: ExternalAnalyzer,
value: String,
networkType: Node.NetworkType,
extractor: (ExternalAnalyzerLinks) -> String
): String {
extractor: (ExternalAnalyzerLinks) -> String?
): String? {
val template = externalAnalyzerTemplates[analyzer] ?: error("No template for $analyzer")

return extractor(template).format(networkPathSegment(networkType), value)
return extractor(template)?.format(networkPathSegment(networkType), value)
}

fun getTwitterAccountUrl(
accountName: String
): String = twitterAccountTemplate.format(accountName)
}

class ExternalAnalyzerLinks(val transaction: String, val account: String)
class ExternalAnalyzerLinks(val transaction: String, val account: String, val event: String?)

enum class ExternalAnalyzer(val supportedNetworks: List<Node.NetworkType>) {
SUBSCAN(
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package jp.co.soramitsu.common.data.network.coingecko

import com.google.gson.annotations.SerializedName
import java.math.BigDecimal

class PriceInfo(
@SerializedName("usd")
val price: BigDecimal,
@SerializedName("usd_24h_change")
val rateChange: BigDecimal
)
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,14 @@ import java.math.BigInteger
fun bindNumberConstant(
constant: Constant,
runtime: RuntimeSnapshot
): BigInteger {
): BigInteger = bindNullableNumberConstant(constant, runtime) ?: incompatible()

@HelperBinding
fun bindNullableNumberConstant(
constant: Constant,
runtime: RuntimeSnapshot
): BigInteger? {
val decoded = constant.type?.fromByteArrayOrNull(runtime, constant.value) ?: incompatible()

return decoded as? BigInteger ?: incompatible()
return decoded as BigInteger?
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package jp.co.soramitsu.common.data.network.runtime.calls

import jp.co.soramitsu.common.data.network.runtime.binding.BlockNumber
import jp.co.soramitsu.fearless_utils.wsrpc.request.runtime.RuntimeRequest

class GetBlockHashRequest(blockNumber: BlockNumber?) : RuntimeRequest(
method = "chain_getBlockHash",
params = listOfNotNull(
blockNumber
)
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package jp.co.soramitsu.common.data.network.runtime.calls

import jp.co.soramitsu.fearless_utils.wsrpc.request.runtime.RuntimeRequest

object GetFinalizedHeadRequest : RuntimeRequest(
method = "chain_getFinalizedHead",
params = emptyList()
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package jp.co.soramitsu.common.data.network.runtime.calls

import jp.co.soramitsu.fearless_utils.wsrpc.request.runtime.RuntimeRequest

class GetHeaderRequest(blockHash: String? = null) : RuntimeRequest(
method = "chain_getHeader",
params = listOfNotNull(
blockHash
)
)
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
package jp.co.soramitsu.common.data.network.runtime.calls

import jp.co.soramitsu.common.data.network.runtime.binding.BlockNumber
import jp.co.soramitsu.common.data.network.runtime.model.FeeResponse
import jp.co.soramitsu.common.data.network.runtime.model.SignedBlock
import jp.co.soramitsu.common.data.network.runtime.model.SignedBlock.Block.Header
import jp.co.soramitsu.fearless_utils.wsrpc.SocketService
import jp.co.soramitsu.fearless_utils.wsrpc.executeAsync
import jp.co.soramitsu.fearless_utils.wsrpc.mappers.nonNull
Expand All @@ -13,7 +15,7 @@ import jp.co.soramitsu.fearless_utils.wsrpc.request.runtime.chain.RuntimeVersion
import java.math.BigInteger

@Suppress("EXPERIMENTAL_API_USAGE")
class SubstrateCalls(
class RpcCalls(
private val socketService: SocketService,
) {

Expand Down Expand Up @@ -59,4 +61,29 @@ class SubstrateCalls(

return socketService.executeAsync(blockRequest, mapper = pojo<SignedBlock>().nonNull())
}

/**
* Get hash of the last finalized block in the canon chain
*/
suspend fun getFinalizedHead(): String {
return socketService.executeAsync(GetFinalizedHeadRequest, mapper = pojo<String>().nonNull())
}

/**
* Retrieves the header for a specific block
*
* @param hash - hash of the block. If null - then the best pending header is returned
*/
suspend fun getBlockHeader(hash: String? = null): Header {
return socketService.executeAsync(GetHeaderRequest(hash), mapper = pojo<Header>().nonNull())
}

/**
* Retrieves the hash of a specific block
*
* @param blockNumber - if null, then the best block hash is returned
*/
suspend fun getBlockHash(blockNumber: BlockNumber? = null): String {
return socketService.executeAsync(GetBlockHashRequest(blockNumber), mapper = pojo<String>().nonNull())
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,16 @@
package jp.co.soramitsu.common.data.network.runtime.model

import com.google.gson.annotations.SerializedName
import jp.co.soramitsu.common.utils.decodeToInt
import jp.co.soramitsu.fearless_utils.extensions.fromHex

class SignedBlock(val block: Block, val justification: Any?) {
class Block(val extrinsics: List<String>, val header: Header) {
class Header(val number: String)
class Header(@SerializedName("number") val numberRaw: String, val parentHash: String?) {
val number: Int
get() {
return numberRaw.fromHex().decodeToInt()
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package jp.co.soramitsu.common.data.network.subquery

import java.math.BigInteger

class EraValidatorInfoQueryResponse(val query: EraValidatorInfo?) {
class EraValidatorInfo(val eraValidatorInfos: Nodes?) {
class Nodes(val nodes: List<Node>?) {
class Node(
val id: String,
val address: String,
val era: BigInteger,
val total: String,
val own: String,
)
}
}
}
Loading