From af1a8a546873490f031fb5f018d3c2c0f855404d Mon Sep 17 00:00:00 2001 From: Satoshi Qazi Muhammed Date: Mon, 10 Aug 2026 13:17:21 -0700 Subject: [PATCH] fix(pezkuwi-asset-hub): declare PEZ and USDT as sufficient assets MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The wallet refused USDT.p transfers to any account holding no HEZ: Your transfer will fail since the destination account does not have enough HEZ to accept other token transfers It is a false positive, and the chain disagrees with this config. DeadRecipientValidation skips the whole check when the destination asset is self-sufficient: skipIf = { assetSourceRegistry.isAssetSelfSufficient(destinationChainAsset) } and StatemineAssetBalance reads that flag from HERE, not from the chain: chainAsset.requireStatemine().isSufficient → runCatching { … }.getOrDefault(false) `isSufficient` was absent from typeExtras in every version of this config, so it resolved to false, the validation ran, and every transfer to a fresh account was warned against. Measured on chain (asset-hub-rpc.pezkuwichain.io): asset 1 PEZ sufficient=true minBalance=1 18 accounts asset 1000 wUSDT sufficient=true minBalance=10000 21 accounts Both are sufficient, so neither needs the recipient to hold native balance. Proof it works in practice rather than only in theory: account 5E2yqgUVVNjU… holds 1750.00 USDT with free=0, providers=0, sufficients=1 and nonce=0. Zero native balance, no provider reference, and it has never signed a transaction — so it was brought into existence by the incoming USDT transfer itself, which is exactly what the wallet was saying could not happen. Applied to v22 (the version the app fetches, runtime/build.gradle CHAINS_URL) and to the top-level chains.json. Noted, not changed here: this config also declares assets 1001/1002/1003 on Pezkuwi Asset Hub as DOT, ETH and BTC. None of the three exists on chain — assets.asset() returns None for all of them. They are shown to users and any transfer would fail. --- chains/chains.json | 8 +++++--- chains/v22/android/chains.json | 6 ++++-- chains/v22/android/chains_minimal.json | 8 +++++--- chains/v22/chains.json | 6 ++++-- chains/v22/chains_dev.json | 6 ++++-- 5 files changed, 22 insertions(+), 12 deletions(-) diff --git a/chains/chains.json b/chains/chains.json index 3c27ee9..727f855 100644 --- a/chains/chains.json +++ b/chains/chains.json @@ -116,7 +116,8 @@ "buyProviders": {}, "sellProviders": {}, "typeExtras": { - "assetId": "1" + "assetId": "1", + "isSufficient": true } }, { @@ -131,7 +132,8 @@ "buyProviders": {}, "sellProviders": {}, "typeExtras": { - "assetId": "1000" + "assetId": "1000", + "isSufficient": true } }, { @@ -8301,4 +8303,4 @@ "icon": "https://raw.githubusercontent.com/novasamatech/nova-utils/master/icons/chains/gradient/Acurast.svg", "addressPrefix": 42 } -] \ No newline at end of file +] diff --git a/chains/v22/android/chains.json b/chains/v22/android/chains.json index 41ce9d1..bded182 100644 --- a/chains/v22/android/chains.json +++ b/chains/v22/android/chains.json @@ -148,7 +148,8 @@ "buyProviders": {}, "sellProviders": {}, "typeExtras": { - "assetId": "1" + "assetId": "1", + "isSufficient": true } }, { @@ -163,7 +164,8 @@ "buyProviders": {}, "sellProviders": {}, "typeExtras": { - "assetId": "1000" + "assetId": "1000", + "isSufficient": true } } ], diff --git a/chains/v22/android/chains_minimal.json b/chains/v22/android/chains_minimal.json index 79745d2..a07ba3a 100644 --- a/chains/v22/android/chains_minimal.json +++ b/chains/v22/android/chains_minimal.json @@ -116,7 +116,8 @@ "buyProviders": {}, "sellProviders": {}, "typeExtras": { - "assetId": "1" + "assetId": "1", + "isSufficient": true } }, { @@ -131,7 +132,8 @@ "buyProviders": {}, "sellProviders": {}, "typeExtras": { - "assetId": "1000" + "assetId": "1000", + "isSufficient": true } }, { @@ -832,4 +834,4 @@ "defaultBlockTime": 2000 } } -] \ No newline at end of file +] diff --git a/chains/v22/chains.json b/chains/v22/chains.json index 41ce9d1..bded182 100644 --- a/chains/v22/chains.json +++ b/chains/v22/chains.json @@ -148,7 +148,8 @@ "buyProviders": {}, "sellProviders": {}, "typeExtras": { - "assetId": "1" + "assetId": "1", + "isSufficient": true } }, { @@ -163,7 +164,8 @@ "buyProviders": {}, "sellProviders": {}, "typeExtras": { - "assetId": "1000" + "assetId": "1000", + "isSufficient": true } } ], diff --git a/chains/v22/chains_dev.json b/chains/v22/chains_dev.json index fb8777f..750112b 100644 --- a/chains/v22/chains_dev.json +++ b/chains/v22/chains_dev.json @@ -148,7 +148,8 @@ "buyProviders": {}, "sellProviders": {}, "typeExtras": { - "assetId": "1" + "assetId": "1", + "isSufficient": true } }, { @@ -163,7 +164,8 @@ "buyProviders": {}, "sellProviders": {}, "typeExtras": { - "assetId": "1000" + "assetId": "1000", + "isSufficient": true } } ],