Skip to content

Commit

Permalink
Merge branch 'refs/heads/koni/dev/issue-3788' into web-runner-cron
Browse files Browse the repository at this point in the history
  • Loading branch information
bluezdot committed Oct 15, 2024
2 parents d33515c + e96d894 commit 57006f9
Show file tree
Hide file tree
Showing 65 changed files with 1,946 additions and 639 deletions.
6 changes: 6 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,11 @@
# CHANGELOG

## 1.3.1
Build date: Oct 08, 2024.

Features & Update:
- Support Unified account

## 1.2.32
Build date: Oct 01, 2024.

Expand Down
26 changes: 13 additions & 13 deletions CONTRIBUTORS
Original file line number Diff line number Diff line change
@@ -1,25 +1,26 @@
2842 AnhMTV Release version 1.2.32
2541 Nam Phạm [Issue 3680] chore: update chainlist
2192 S2kael [Issue-3711] Rollback handle pending state for balance item
848 lw-cdm [Issue-3407] WebApp - Support Avail Ledger app
565 nguyentiendung [Issue-2845] Fix UI bugs export accounts
2844 AnhMTV Release version 1.3.1
2543 Nam Phạm [Issue 3700] Unified account - enable TON network by default
2334 S2kael [Unified] Fix eslint
869 lw-cdm [MasterAccount] Update logic to reorder account on select account modal
568 nguyentiendung [Issue-3553] [Issue-3553] Refactor code and add recipient to swap history.
465 Jaco 0.42.5 (#969)
327 bluezdot [Issue-3635] feat: update content
241 Thiendekaco
388 bluezdot
354 Thiendekaco [Issue-3707] [fix] Unified account - fix dApp ui bug #4
185 quangdo
172 Frenkie Nguyen [Issue-3696] Update UI for derivation
170 lw-cdm
160 Automation Bot [CI Skip] Auto increase webapp build number
157 dominhquang
118 lw-cdm
104 khainh predefine metadata for Polkadot & Kusama chains
96 lw
83 Hieu Dao Update README.md
83 leewong
82 Thibaut Sardan Add account filtering feature (#832)
81 leewong Swap - Change idle time to 300s
70 bluedot [Issue-3579] fix: update check fully migrate
66 Frenkie Nguyen [Issue 2352] fix eslint
73 bluedot [Issue-3579] fix: update check fully migrate
63 Roman fix ui issues
53 Dominhquangdev update Bridge code
28 PDTnhah [Issue-3680] Update chainlist
24 S2kael
25 S2kael
10 Trang Trịnh api get karura and acala nfts
9 Minh Le
9 minhld1029 [#115] [ForgetAccount] catch exception refList undefined
Expand Down Expand Up @@ -51,7 +52,6 @@
1 Forrest Add Web3AccountsOptions to web3FromAddress function (#617)
1 itsonal add new language - Urdu (#847)
1 KarishmaBothara Added code to support custom signed extension/user extension (#670)
1 lw [UI] Fix issue related to input overflow width
1 Marcel Jackisch Minor changes to readme (#376)
1 Michael Healy Small typo (#932)
1 Minh Ha ✨ allows background handler to handle custom extention port name (#685)
Expand Down
4 changes: 2 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
"url": "https://github.com/Koniverse/Subwallet-V2.git"
},
"sideEffects": false,
"version": "1.2.32",
"version": "1.3.1",
"workspaces": [
"packages/*"
],
Expand Down Expand Up @@ -105,7 +105,7 @@
"@polkadot/types-support": "^12.0.2",
"@polkadot/util": "^12.6.2",
"@polkadot/util-crypto": "^12.6.2",
"@subwallet/chain-list": "0.2.88-beta.6",
"@subwallet/chain-list": "0.2.89",
"@subwallet/keyring": "^0.1.8-beta.0",
"@subwallet/react-ui": "5.1.2-b79",
"@subwallet/ui-keyring": "0.1.8-beta.0 ",
Expand Down
14 changes: 7 additions & 7 deletions packages/extension-base/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
"./detectPackage.cjs"
],
"type": "module",
"version": "1.2.32-0",
"version": "1.3.1",
"main": "index.js",
"dependencies": {
"@acala-network/api": "^5.0.2",
Expand Down Expand Up @@ -55,11 +55,11 @@
"@reduxjs/toolkit": "^1.9.1",
"@sora-substrate/type-definitions": "^1.17.7",
"@substrate/connect": "^0.8.9",
"@subwallet/chain-list": "0.2.88-beta.6",
"@subwallet/extension-base": "^1.2.32-0",
"@subwallet/extension-chains": "^1.2.32-0",
"@subwallet/extension-dapp": "^1.2.32-0",
"@subwallet/extension-inject": "^1.2.32-0",
"@subwallet/chain-list": "0.2.89",
"@subwallet/extension-base": "^1.3.1",
"@subwallet/extension-chains": "^1.3.1",
"@subwallet/extension-dapp": "^1.3.1",
"@subwallet/extension-inject": "^1.3.1",
"@subwallet/keyring": "^0.1.8-beta.0",
"@subwallet/ui-keyring": "^0.1.8-beta.0",
"@ton/core": "^0.56.3",
Expand Down Expand Up @@ -104,7 +104,7 @@
"web3-utils": "^1.10.0"
},
"devDependencies": {
"@subwallet/extension-mocks": "^1.2.32-0",
"@subwallet/extension-mocks": "^1.3.1",
"@types/uuid": "^9.0.1"
}
}
7 changes: 6 additions & 1 deletion packages/extension-base/src/background/KoniTypes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1863,6 +1863,11 @@ export interface ResponseSubscribeHistory {
items: TransactionHistoryItem[]
}

export interface ResponseNftImport {
success: boolean;
error: string;
}

/* Campaign */

/* Core types */
Expand Down Expand Up @@ -1900,7 +1905,7 @@ export interface KoniRequestSignatures {
'pri(chainService.disableChain)': [string, boolean];
'pri(chainService.removeChain)': [string, boolean];
'pri(chainService.deleteCustomAsset)': [string, boolean];
'pri(chainService.upsertCustomAsset)': [Record<string, any>, boolean];
'pri(chainService.upsertCustomAsset)': [Record<string, any>, ResponseNftImport];
'pri(chainService.validateCustomAsset)': [_ValidateCustomAssetRequest, _ValidateCustomAssetResponse];
'pri(chainService.resetDefaultChains)': [null, boolean];
'pri(chainService.getSupportedContractTypes)': [null, string[]];
Expand Down
51 changes: 45 additions & 6 deletions packages/extension-base/src/koni/background/handlers/Extension.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,19 +3,19 @@

import { Common } from '@ethereumjs/common';
import { LegacyTransaction } from '@ethereumjs/tx';
import { _AssetRef, _ChainAsset, _ChainInfo, _MultiChainAsset } from '@subwallet/chain-list/types';
import { _AssetRef, _AssetType, _ChainAsset, _ChainInfo, _MultiChainAsset } from '@subwallet/chain-list/types';
import { TransactionError } from '@subwallet/extension-base/background/errors/TransactionError';
import { withErrorLog } from '@subwallet/extension-base/background/handlers/helpers';
import { createSubscription } from '@subwallet/extension-base/background/handlers/subscriptions';
import { AccountExternalError, AddressBookInfo, AmountData, AmountDataWithId, AssetSetting, AssetSettingUpdateReq, BondingOptionParams, BrowserConfirmationType, CampaignBanner, CampaignData, CampaignDataType, ChainType, CronReloadRequest, CrowdloanJson, ExternalRequestPromiseStatus, ExtrinsicType, KeyringState, MantaPayEnableMessage, MantaPayEnableParams, MantaPayEnableResponse, MantaPaySyncState, MetadataItem, NftCollection, NftJson, NftTransactionRequest, NftTransactionResponse, PriceJson, RequestAccountCreateExternalV2, RequestAccountCreateHardwareMultiple, RequestAccountCreateHardwareV2, RequestAccountCreateWithSecretKey, RequestAccountExportPrivateKey, RequestAddInjectedAccounts, RequestApproveConnectWalletSession, RequestApproveWalletConnectNotSupport, RequestAuthorization, RequestAuthorizationBlock, RequestAuthorizationPerAccount, RequestAuthorizationPerSite, RequestAuthorizeApproveV2, RequestBondingSubmit, RequestCameraSettings, RequestCampaignBannerComplete, RequestChangeEnableChainPatrol, RequestChangeLanguage, RequestChangeMasterPassword, RequestChangePriceCurrency, RequestChangeShowBalance, RequestChangeShowZeroBalance, RequestChangeTimeAutoLock, RequestConfirmationComplete, RequestConfirmationCompleteTon, RequestConnectWalletConnect, RequestCrowdloanContributions, RequestDeleteContactAccount, RequestDisconnectWalletConnectSession, RequestEditContactAccount, RequestFindRawMetadata, RequestForgetSite, RequestFreeBalance, RequestGetTransaction, RequestKeyringExportMnemonic, RequestMaxTransferable, RequestMigratePassword, RequestParseEvmContractInput, RequestParseTransactionSubstrate, RequestPassPhishingPage, RequestQrParseRLP, RequestQrSignEvm, RequestQrSignSubstrate, RequestRejectConnectWalletSession, RequestRejectExternalRequest, RequestRejectWalletConnectNotSupport, RequestRemoveInjectedAccounts, RequestResetWallet, RequestResolveExternalRequest, RequestSaveRecentAccount, RequestSettingsType, RequestSigningApprovePasswordV2, RequestStakePoolingBonding, RequestStakePoolingUnbonding, RequestSubscribeHistory, RequestSubstrateNftSubmitTransaction, RequestTuringCancelStakeCompound, RequestTuringStakeCompound, RequestUnbondingSubmit, RequestUnlockKeyring, RequestUnlockType, ResolveAddressToDomainRequest, ResolveDomainRequest, ResponseAccountCreateWithSecretKey, ResponseAccountExportPrivateKey, ResponseChangeMasterPassword, ResponseFindRawMetadata, ResponseKeyringExportMnemonic, ResponseMigratePassword, ResponseParseEvmContractInput, ResponseParseTransactionSubstrate, ResponseQrParseRLP, ResponseQrSignEvm, ResponseQrSignSubstrate, ResponseRejectExternalRequest, ResponseResetWallet, ResponseResolveExternalRequest, ResponseSubscribeHistory, ResponseUnlockKeyring, ShowCampaignPopupRequest, StakingJson, StakingRewardJson, StakingType, ThemeNames, TransactionHistoryItem, TransactionResponse, ValidateNetworkRequest, ValidateNetworkResponse, ValidatorInfo } from '@subwallet/extension-base/background/KoniTypes';
import { AccountExternalError, AddressBookInfo, AmountData, AmountDataWithId, AssetSetting, AssetSettingUpdateReq, BondingOptionParams, BrowserConfirmationType, CampaignBanner, CampaignData, CampaignDataType, ChainType, CronReloadRequest, CrowdloanJson, ExternalRequestPromiseStatus, ExtrinsicType, KeyringState, MantaPayEnableMessage, MantaPayEnableParams, MantaPayEnableResponse, MantaPaySyncState, MetadataItem, NftCollection, NftJson, NftTransactionRequest, NftTransactionResponse, PriceJson, RequestAccountCreateExternalV2, RequestAccountCreateHardwareMultiple, RequestAccountCreateHardwareV2, RequestAccountCreateWithSecretKey, RequestAccountExportPrivateKey, RequestAddInjectedAccounts, RequestApproveConnectWalletSession, RequestApproveWalletConnectNotSupport, RequestAuthorization, RequestAuthorizationBlock, RequestAuthorizationPerAccount, RequestAuthorizationPerSite, RequestAuthorizeApproveV2, RequestBondingSubmit, RequestCameraSettings, RequestCampaignBannerComplete, RequestChangeEnableChainPatrol, RequestChangeLanguage, RequestChangeMasterPassword, RequestChangePriceCurrency, RequestChangeShowBalance, RequestChangeShowZeroBalance, RequestChangeTimeAutoLock, RequestConfirmationComplete, RequestConfirmationCompleteTon, RequestConnectWalletConnect, RequestCrowdloanContributions, RequestDeleteContactAccount, RequestDisconnectWalletConnectSession, RequestEditContactAccount, RequestFindRawMetadata, RequestForgetSite, RequestFreeBalance, RequestGetTransaction, RequestKeyringExportMnemonic, RequestMaxTransferable, RequestMigratePassword, RequestParseEvmContractInput, RequestParseTransactionSubstrate, RequestPassPhishingPage, RequestQrParseRLP, RequestQrSignEvm, RequestQrSignSubstrate, RequestRejectConnectWalletSession, RequestRejectExternalRequest, RequestRejectWalletConnectNotSupport, RequestRemoveInjectedAccounts, RequestResetWallet, RequestResolveExternalRequest, RequestSaveRecentAccount, RequestSettingsType, RequestSigningApprovePasswordV2, RequestStakePoolingBonding, RequestStakePoolingUnbonding, RequestSubscribeHistory, RequestSubstrateNftSubmitTransaction, RequestTuringCancelStakeCompound, RequestTuringStakeCompound, RequestUnbondingSubmit, RequestUnlockKeyring, RequestUnlockType, ResolveAddressToDomainRequest, ResolveDomainRequest, ResponseAccountCreateWithSecretKey, ResponseAccountExportPrivateKey, ResponseChangeMasterPassword, ResponseFindRawMetadata, ResponseKeyringExportMnemonic, ResponseMigratePassword, ResponseNftImport, ResponseParseEvmContractInput, ResponseParseTransactionSubstrate, ResponseQrParseRLP, ResponseQrSignEvm, ResponseQrSignSubstrate, ResponseRejectExternalRequest, ResponseResetWallet, ResponseResolveExternalRequest, ResponseSubscribeHistory, ResponseUnlockKeyring, ShowCampaignPopupRequest, StakingJson, StakingRewardJson, StakingType, ThemeNames, TransactionHistoryItem, TransactionResponse, ValidateNetworkRequest, ValidateNetworkResponse, ValidatorInfo } from '@subwallet/extension-base/background/KoniTypes';
import { AccountAuthType, AuthorizeRequest, MessageTypes, MetadataRequest, RequestAccountExport, RequestAuthorizeCancel, RequestAuthorizeReject, RequestCurrentAccountAddress, RequestMetadataApprove, RequestMetadataReject, RequestSigningApproveSignature, RequestSigningCancel, RequestTypes, ResponseAccountExport, ResponseAuthorizeList, ResponseType, SigningRequest, WindowOpenParams } from '@subwallet/extension-base/background/types';
import { TransactionWarning } from '@subwallet/extension-base/background/warnings/TransactionWarning';
import { ALL_ACCOUNT_KEY, LATEST_SESSION, XCM_FEE_RATIO } from '@subwallet/extension-base/constants';
import { additionalValidateTransfer, additionalValidateXcmTransfer, validateTransferRequest, validateXcmTransferRequest } from '@subwallet/extension-base/core/logic-validation/transfer';
import { _isSnowBridgeXcm } from '@subwallet/extension-base/core/substrate/xcm-parser';
import { ALLOWED_PATH } from '@subwallet/extension-base/defaults';
import { getERC20SpendingApprovalTx } from '@subwallet/extension-base/koni/api/contract-handler/evm/web3';
import { isSnowBridgeGatewayContract } from '@subwallet/extension-base/koni/api/contract-handler/utils';
import { _ERC721_ABI, isSnowBridgeGatewayContract } from '@subwallet/extension-base/koni/api/contract-handler/utils';
import { resolveAzeroAddressToDomain, resolveAzeroDomainToAddress } from '@subwallet/extension-base/koni/api/dotsama/domain';
import { parseSubstrateTransaction } from '@subwallet/extension-base/koni/api/dotsama/parseTransaction';
import { UNSUPPORTED_TRANSFER_EVM_CHAIN_NAME } from '@subwallet/extension-base/koni/api/nft/config';
Expand Down Expand Up @@ -1608,15 +1608,54 @@ export default class KoniExtension {
}
}

private async upsertCustomToken (data: _ChainAsset) {
private async validateERC721Token (data: _ChainAsset): Promise<boolean> {
const evmApi = this.#koniState.getEvmApi(data.originChain);

// eslint-disable-next-line @typescript-eslint/no-unsafe-argument
const tokenContract = new evmApi.api.eth.Contract(_ERC721_ABI, data.metadata?.contractAddress);

try {
await this.#koniState.upsertCustomToken(data);
// eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access
await tokenContract.methods.tokenOfOwnerByIndex('0xB7fdD27a8Df011816205a6e3cAA097DC4D8C2C5d', 1).call();

return true;
} catch (err) {
const error = err as Error;

if (error.message.includes('ERC721Enumerable: owner index out of bounds')) {
return true;
} else {
return false;
}
}
}

private async upsertCustomToken (data: _ChainAsset): Promise<ResponseNftImport> {
try {
if (data.assetType === _AssetType.ERC721) {
const isCompatible = await this.validateERC721Token(data);

if (!isCompatible) {
return {
success: false,
error: 'incompatibleNFT'
};
}
}

await this.#koniState.upsertCustomToken(data);

return {
success: true,
error: ''
};
} catch (e) {
console.error(e);

return false;
return {
success: false,
error: 'Error'
};
}
}

Expand Down
2 changes: 1 addition & 1 deletion packages/extension-base/src/packageInfo.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,4 @@

// Do not edit, auto-generated by @polkadot/dev

export const packageInfo = { name: '@subwallet/extension-base', path: 'auto', type: 'auto', version: '1.2.32-0' };
export const packageInfo = { name: '@subwallet/extension-base', path: 'auto', type: 'auto', version: '1.3.1' };
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,6 @@ import { getDefaultWeightV2 } from '@subwallet/extension-base/koni/api/contract-
import { _BALANCE_CHAIN_GROUP, _MANTA_ZK_CHAIN_GROUP, _ZK_ASSET_PREFIX } from '@subwallet/extension-base/services/chain-service/constants';
import { _EvmApi, _SubstrateAdapterSubscriptionArgs, _SubstrateApi } from '@subwallet/extension-base/services/chain-service/types';
import { _checkSmartContractSupportByChain, _getAssetExistentialDeposit, _getChainExistentialDeposit, _getChainNativeTokenSlug, _getContractAddressOfToken, _getTokenOnChainAssetId, _getTokenOnChainInfo, _getTokenTypesSupportedByChain, _getXcmAssetMultilocation, _isBridgedToken, _isChainEvmCompatible } from '@subwallet/extension-base/services/chain-service/utils';
import { fetchTaoDelegateState } from '@subwallet/extension-base/services/earning-service/handlers/native-staking/tao';
import { getTaoTotalStake } from '@subwallet/extension-base/services/earning-service/utils';
import { BalanceItem, SubscribeBasePalletBalance, SubscribeSubstratePalletBalance } from '@subwallet/extension-base/types';
import { filterAssetsByChainAndType } from '@subwallet/extension-base/utils';
import BigN from 'bignumber.js';
Expand Down Expand Up @@ -144,13 +142,13 @@ const subscribeWithSystemAccountPallet = async ({ addresses, callback, chainInfo
);
}

let bittensorStakingBalances = new Array<bigint>(addresses.length).fill(BigInt(0));
let bittensorStakingBalances: BigN[] = new Array<BigN>(addresses.length).fill(new BigN(0));

if (['bittensor'].includes(chainInfo.slug)) {
bittensorStakingBalances = await Promise.all(addresses.map(async (address) => {
const rawDelegateState = await fetchTaoDelegateState(address);
const TaoTotalStake = await substrateApi.api.query.subtensorModule.totalColdkeyStake(address);

return getTaoTotalStake(rawDelegateState);
return new BigN(TaoTotalStake.toString());
}));
}

Expand All @@ -173,7 +171,9 @@ const subscribeWithSystemAccountPallet = async ({ addresses, callback, chainInfo
totalLockedFromTransfer += nominationPoolBalance;
}

totalLockedFromTransfer += bittensorStakingBalances[index];
const stakeValue = BigInt(bittensorStakingBalances[index].toString());

totalLockedFromTransfer += stakeValue;

return ({
address: addresses[index],
Expand Down
27 changes: 12 additions & 15 deletions packages/extension-base/src/services/chain-service/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1892,22 +1892,19 @@ export class ChainService {
const activeChainSlugs = this.getActiveChainSlugs();
const assetRegistry = this.getAssetRegistry();

if (Object.keys(assetSettings).length === 0) { // only initiate the first time
Object.values(assetRegistry).forEach((assetInfo) => {
const isSettingExisted = assetInfo.slug in assetSettings;

// Set visible for every enabled chains
if (activeChainSlugs.includes(assetInfo.originChain) && !isSettingExisted) {
// Setting only exist when set either by chain settings or user
assetSettings[assetInfo.slug] = {
visible: true
};
}
});

this.setAssetSettings(assetSettings, false);
}
Object.values(assetRegistry).forEach((assetInfo) => {
const isSettingExisted = assetInfo.slug in assetSettings;

// Set visible for every enabled chains
if (activeChainSlugs.includes(assetInfo.originChain) && !isSettingExisted) {
// Setting only exist when set either by chain settings or user
assetSettings[assetInfo.slug] = {
visible: true
};
}
});

this.setAssetSettings(assetSettings, false);
this.eventService.emit('asset.ready', true);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,9 @@ export default abstract class BasePoolHandler {
const decimals = this.nativeToken.decimals || 0;
const defaultMaintainBalance = new BN(1).mul(BN_TEN.pow(new BN(decimals)));
const ed = new BN(this.nativeToken.minAmount || '0');
const maintainBalance = ed.gte(defaultMaintainBalance) ? new BN(15).mul(ed).div(BN_TEN) : defaultMaintainBalance;
const calculateMaintainBalance = new BN(15).mul(ed).div(BN_TEN);

const maintainBalance = ed.gte(defaultMaintainBalance) ? calculateMaintainBalance : defaultMaintainBalance;

return maintainBalance.toString();
}
Expand Down
Loading

0 comments on commit 57006f9

Please sign in to comment.