diff --git a/package.json b/package.json index bcaa1ee2f64..baa7ead9be6 100644 --- a/package.json +++ b/package.json @@ -107,9 +107,9 @@ "@polkadot/util-crypto": "^13.4.3", "@polkadot/x-global": "^13.4.3", "@subwallet/chain-list": "0.2.102", - "@subwallet/keyring": "^0.1.9", + "@subwallet/keyring": "file:../SubWallet-Base/packages/keyring/build/", "@subwallet/react-ui": "5.1.2-b79", - "@subwallet/ui-keyring": "^0.1.9", + "@subwallet/ui-keyring": "file:../SubWallet-Base/packages/ui-keyring/build/", "@types/bn.js": "^5.1.6", "@zondax/ledger-substrate": "1.0.1", "babel-core": "^7.0.0-bridge.0", diff --git a/packages/extension-base/package.json b/packages/extension-base/package.json index 65a4820e1c7..70bde25581c 100644 --- a/packages/extension-base/package.json +++ b/packages/extension-base/package.json @@ -70,6 +70,7 @@ "@walletconnect/sign-client": "^2.14.0", "@walletconnect/types": "^2.14.0", "@walletconnect/utils": "^2.14.0", + "abstractionkit": "^0.2.16", "avail-js-sdk": "^0.2.12", "axios": "^1.6.2", "bignumber.js": "^9.1.1", diff --git a/packages/extension-base/src/background/KoniTypes.ts b/packages/extension-base/src/background/KoniTypes.ts index f554c1c4c4b..5993cab585e 100644 --- a/packages/extension-base/src/background/KoniTypes.ts +++ b/packages/extension-base/src/background/KoniTypes.ts @@ -37,6 +37,7 @@ import { SignerResult } from '@polkadot/types/types/extrinsic'; import { HexString } from '@polkadot/util/types'; import { TransactionWarning } from './warnings/TransactionWarning'; +import {UserOperationV8} from "abstractionkit"; export enum RuntimeEnvironment { Web = 'Web', @@ -1201,7 +1202,7 @@ export interface ErrorNetworkConnection { export interface ConfirmationDefinitions { addNetworkRequest: [ConfirmationsQueueItem<_NetworkUpsertParams>, ConfirmationResult], addTokenRequest: [ConfirmationsQueueItem, ConfirmationResult], - evmSignatureRequest: [ConfirmationsQueueItem, ConfirmationResult], + evmSignatureRequest: [ConfirmationsQueueItem, ConfirmationResult], evmSendTransactionRequest: [ConfirmationsQueueItem, ConfirmationResult] evmWatchTransactionRequest: [ConfirmationsQueueItem, ConfirmationResult], errorConnectNetwork: [ConfirmationsQueueItem, ConfirmationResult] diff --git a/packages/extension-base/src/koni/background/handlers/Extension.ts b/packages/extension-base/src/koni/background/handlers/Extension.ts index 97c29f47e09..33d626c0ee7 100644 --- a/packages/extension-base/src/koni/background/handlers/Extension.ts +++ b/packages/extension-base/src/koni/background/handlers/Extension.ts @@ -45,6 +45,7 @@ import { TokenHasBalanceInfo, TokenPayFeeInfo } from '@subwallet/extension-base/ import { calculateToAmountByReservePool } from '@subwallet/extension-base/services/fee-service/utils'; import { batchExtrinsicSetFeeHydration, getAssetHubTokensCanPayFee, getHydrationTokensCanPayFee } from '@subwallet/extension-base/services/fee-service/utils/tokenPayFee'; import { ClaimPolygonBridgeNotificationMetadata, NotificationSetup } from '@subwallet/extension-base/services/inapp-notification-service/interfaces'; +import { convertEVMTransactionConfigToEip7702UserOp } from '@subwallet/extension-base/services/keyring-service/context/handlers/Eip7702'; import { AppBannerData, AppConfirmationData, AppPopupData } from '@subwallet/extension-base/services/mkt-campaign-service/types'; import { EXTENSION_REQUEST_URL } from '@subwallet/extension-base/services/request-service/constants'; import { AuthUrls } from '@subwallet/extension-base/services/request-service/types'; @@ -1343,6 +1344,7 @@ export default class KoniExtension { const errors = validateTransferRequest(transferTokenInfo, from, to, value, transferAll); const warnings: TransactionWarning[] = []; + const fromChainInfo = this.#koniState.getChainInfo(chain); const nativeTokenInfo = this.#koniState.getNativeTokenInfo(chain); const nativeTokenSlug: string = nativeTokenInfo.slug; const isTransferNativeToken = nativeTokenSlug === tokenSlug; @@ -1400,6 +1402,8 @@ export default class KoniExtension { value: txVal }); } + + transaction = await convertEVMTransactionConfigToEip7702UserOp(transaction, evmApi, fromChainInfo); } else if (_isMantaZkAsset(transferTokenInfo)) { transaction = undefined; transferAmount.value = '0'; diff --git a/packages/extension-base/src/services/keyring-service/context/handlers/Eip7702.ts b/packages/extension-base/src/services/keyring-service/context/handlers/Eip7702.ts new file mode 100644 index 00000000000..762210335e1 --- /dev/null +++ b/packages/extension-base/src/services/keyring-service/context/handlers/Eip7702.ts @@ -0,0 +1,63 @@ +// Copyright 2019-2022 @subwallet/extension-base authors & contributors +// SPDX-License-Identifier: Apache-2.0 + +import { _ChainInfo } from '@subwallet/chain-list/types'; +import { _EvmApi } from '@subwallet/extension-base/services/chain-service/types'; +import { _getEvmChainId } from '@subwallet/extension-base/services/chain-service/utils'; +import { CandidePaymaster, MetaTransaction, Simple7702Account, UserOperationV8 } from 'abstractionkit'; +import { TransactionConfig } from 'web3-core'; + +export const CANDIDE_BUNDLER_URL = 'https://api.candide.dev/bundler/v3/sepolia/99700fa2b1177145a779792fdeab5cd9'; +export const CANDIDE_PAYMASTER_URL = 'https://api.candide.dev/paymaster/v3/sepolia/99700fa2b1177145a779792fdeab5cd9'; + +export const CANDIDE_CHAIN_SLUG_MAPPING = { + sepolia_ethereum: 'sepolia', + arbitrum_sepolia: 'arbitrum-sepolia' +}; + +export async function convertEVMTransactionConfigToEip7702UserOp (transactionConfig: TransactionConfig, evmApi: _EvmApi, chainInfo: _ChainInfo): Promise { + if (!transactionConfig.from || !transactionConfig.to || !transactionConfig.value) { + throw new Error('Invalid transaction config'); + } + + const smartAccount = new Simple7702Account(transactionConfig.from as string); + const tx: MetaTransaction = { + to: transactionConfig.to, + value: BigInt(transactionConfig.value as string), + data: transactionConfig.data || '' + }; + + // eslint-disable-next-line @typescript-eslint/no-unsafe-return + let userOp: UserOperationV8 = await smartAccount.createUserOperation( + [tx], + evmApi.apiUrl, + CANDIDE_BUNDLER_URL, + { + eip7702Auth: { + chainId: BigInt(_getEvmChainId(chainInfo) as number) + } + }); + + const paymaster = new CandidePaymaster(CANDIDE_PAYMASTER_URL); + + // sponsor user operation + // const [paymasterUserOperation, _sponsorMetadata] = await paymaster.createSponsorPaymasterUserOperation( + // userOp, + // CANDIDE_BUNDLER_URL, + // 'c27a8e5e0e9c3146' + // ); + // + // userOp = paymasterUserOperation; + + // pay with erc20 token + userOp = await paymaster.createTokenPaymasterUserOperation( + smartAccount, + userOp, + '0xFa5854FBf9964330d761961F46565AB7326e5a3b', + CANDIDE_BUNDLER_URL + ); + + // console.log('sponsor data', _sponsorMetadata); + + return userOp; +} diff --git a/packages/extension-base/src/services/request-service/handler/EvmRequestHandler.ts b/packages/extension-base/src/services/request-service/handler/EvmRequestHandler.ts index 080e52a3427..5ee0afc8e0e 100644 --- a/packages/extension-base/src/services/request-service/handler/EvmRequestHandler.ts +++ b/packages/extension-base/src/services/request-service/handler/EvmRequestHandler.ts @@ -10,6 +10,7 @@ import RequestService from '@subwallet/extension-base/services/request-service'; import { anyNumberToBN } from '@subwallet/extension-base/utils/eth'; import { isInternalRequest } from '@subwallet/extension-base/utils/request'; import keyring from '@subwallet/ui-keyring'; +import { UserOperationV8 } from 'abstractionkit'; import BigN from 'bignumber.js'; import BN from 'bn.js'; import { toBuffer } from 'ethereumjs-util'; @@ -53,6 +54,79 @@ export default class EvmRequestHandler { return this.confirmationsQueueSubject; } + public async addEip7702Confirmation ( + id: string, + url: string, + type: CT, + payload: ConfirmationDefinitions[CT][0]['payload'], + options: ConfirmationsQueueItemOptions = {}, + validator?: (input: ConfirmationDefinitions[CT][1]) => Error | undefined + ): Promise { + const confirmations = this.confirmationsQueueSubject.getValue(); + const confirmationType = confirmations[type] as Record; + + const payloadJson = JSON.stringify(payload, (key: string, value: any) => { + if (typeof value === 'bigint') { + return value.toString() + 'n'; + } + + // eslint-disable-next-line @typescript-eslint/no-unsafe-return + return value; + }); + // only for displaying purposes on UI, not for processing + const modifiedPayload = JSON.parse(payloadJson) as ConfirmationDefinitions[CT][0]['payload']; + + const isInternal = isInternalRequest(url); + + if (['evmSignatureRequest', 'evmSendTransactionRequest'].includes(type)) { + const isAlwaysRequired = await this.#requestService.settingService.isAlwaysRequired; + + if (isAlwaysRequired) { + this.#requestService.keyringService.lock(); + } + } + + // Check duplicate request + const duplicated = Object.values(confirmationType).find((c) => (c.url === url) && (c.payloadJson === payloadJson)); + + if (duplicated) { + throw new EvmProviderError(EvmProviderErrorType.INVALID_PARAMS, t('Duplicate request')); + } + + confirmationType[id] = { + id, + url, + isInternal, + payload: modifiedPayload, + payloadJson, + ...options + } as ConfirmationDefinitions[CT][0]; + + const promise = new Promise((resolve, reject) => { + this.confirmationsPromiseMap[id] = { + validator: validator, + resolver: { + resolve: resolve, + reject: reject + } + }; + }); + + this.confirmationsQueueSubject.next(confirmations); + + if (!isInternal) { + this.#requestService.popupOpen(); + } + + if (options.isPassConfirmation) { + await this.completeConfirmation({ [type]: { id, url, isApproved: true, payload: '' } }); + } + + this.#requestService.updateIconV2(); + + return promise; + } + public async addConfirmation ( id: string, url: string, @@ -239,7 +313,33 @@ export default class EvmRequestHandler { private async decorateResult (t: T, request: ConfirmationDefinitions[T][0], result: ConfirmationDefinitions[T][1]) { if (result.payload === '') { if (t === 'evmSignatureRequest') { - result.payload = await this.signMessage(request as ConfirmationDefinitions['evmSignatureRequest'][0]); + // result.payload = await this.signMessage(request as ConfirmationDefinitions['evmSignatureRequest'][0]); + + const data = request as ConfirmationDefinitions['evmSignatureRequest'][0]; + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment + const eip7702Payload = JSON.parse(data.payloadJson, (key: string, value: any) => { + if (typeof value === 'string' && /^\d+n$/.test(value)) { + return BigInt(value.slice(0, -1)); + } + + // eslint-disable-next-line @typescript-eslint/no-unsafe-return + return value; + }); + + // @ts-ignore + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access + const userOp = eip7702Payload?.payload as UserOperationV8; + + const pair = keyring.getPair(userOp.sender); + + if (pair.isLocked) { + keyring.unlockPair(pair.address); + } + + console.log('user op', eip7702Payload); + + result.payload = pair.evm.signUserOperationWith7702(userOp); + console.log('signed', userOp); } else if (t === 'evmSendTransactionRequest') { result.payload = await this.signTransaction(request as ConfirmationDefinitions['evmSendTransactionRequest'][0]); } @@ -276,6 +376,8 @@ export default class EvmRequestHandler { // Validate response from confirmation popup some info like password, response format.... const error = validator && validator(result); + console.log('error', error); + if (error) { resolver.reject(error); } diff --git a/packages/extension-base/src/services/request-service/index.ts b/packages/extension-base/src/services/request-service/index.ts index c1dc1be2122..19bb31a8eed 100644 --- a/packages/extension-base/src/services/request-service/index.ts +++ b/packages/extension-base/src/services/request-service/index.ts @@ -216,6 +216,16 @@ export default class RequestService { return this.#evmRequestHandler.addConfirmation(id, url, type, payload, options, validator); } + public addEip7702Confirmation ( + id: string, + url: string, + type: CT, + payload: ConfirmationDefinitions[CT][0]['payload'], + options: ConfirmationsQueueItemOptions = {} + ): Promise { + return this.#evmRequestHandler.addEip7702Confirmation(id, url, type, payload, options); + } + public addConfirmationTon ( id: string, url: string, diff --git a/packages/extension-base/src/services/transaction-service/index.ts b/packages/extension-base/src/services/transaction-service/index.ts index 268c526dd72..c2a6a4308fb 100644 --- a/packages/extension-base/src/services/transaction-service/index.ts +++ b/packages/extension-base/src/services/transaction-service/index.ts @@ -15,6 +15,7 @@ import { _getAssetDecimals, _getAssetSymbol, _getChainNativeTokenBasicInfo, _get import { EventService } from '@subwallet/extension-base/services/event-service'; import { HistoryService } from '@subwallet/extension-base/services/history-service'; import { ClaimAvailBridgeNotificationMetadata } from '@subwallet/extension-base/services/inapp-notification-service/interfaces'; +import { CANDIDE_BUNDLER_URL } from '@subwallet/extension-base/services/keyring-service/context/handlers/Eip7702'; import { EXTENSION_REQUEST_URL } from '@subwallet/extension-base/services/request-service/constants'; import { TRANSACTION_TIMEOUT } from '@subwallet/extension-base/services/transaction-service/constants'; import { parseLiquidStakingEvents, parseLiquidStakingFastUnstakeEvents, parseTransferEventLogs, parseXcmEventLogs } from '@subwallet/extension-base/services/transaction-service/event-parser'; @@ -30,6 +31,7 @@ import { getId } from '@subwallet/extension-base/utils/getId'; import { BN_ZERO } from '@subwallet/extension-base/utils/number'; import keyring from '@subwallet/ui-keyring'; import { Cell } from '@ton/core'; +import { Simple7702Account, UserOperationV8 } from 'abstractionkit'; import BigN from 'bignumber.js'; import { addHexPrefix } from 'ethereumjs-util'; import { ethers, TransactionLike } from 'ethers'; @@ -405,14 +407,19 @@ export default class TransactionService { } private async sendTransaction (transaction: SWTransaction): Promise { + // @ts-ignore + const isEip7702Tx = !!transaction.transaction.eip7702Auth; + // Send Transaction const emitter = await (transaction.chainType === 'substrate' ? this.signAndSendSubstrateTransaction(transaction) - : transaction.chainType === 'evm' + : transaction.chainType === 'evm' && !isEip7702Tx ? this.signAndSendEvmTransaction(transaction) - : transaction.chainType === 'cardano' - ? this.signAndSendCardanoTransaction(transaction) - : this.signAndSendTonTransaction(transaction)); + : transaction.chainType === 'evm' && isEip7702Tx + ? this.signAndSendEip7702Transaction(transaction) + : transaction.chainType === 'cardano' + ? this.signAndSendCardanoTransaction(transaction) + : this.signAndSendTonTransaction(transaction)); const { eventsHandler, step } = transaction; @@ -1358,6 +1365,81 @@ export default class TransactionService { return emitter; } + private signAndSendEip7702Transaction ({ address, chain, id, isPassConfirmation, step, transaction, url }: SWTransaction): Promise { + const eip7702Tx = transaction as UserOperationV8; + const evmSignaturePayload: EvmSignatureRequest = { + id: id, + type: 'eth_sign', + payload: eip7702Tx, + address: address, + hashPayload: '', + canSign: true, + processId: step?.processId + }; + const emitter = new EventEmitter(); + const eventData: TransactionEventResponse = { + id, + errors: [], + warnings: [], + extrinsicHash: id, + processId: step?.processId + }; + + this.state.requestService.addEip7702Confirmation(id, url || EXTENSION_REQUEST_URL, 'evmSignatureRequest', evmSignaturePayload, { isPassConfirmation }) + .then(async ({ isApproved, payload }) => { + if (isApproved) { + if (!payload) { + throw new EvmProviderError(EvmProviderErrorType.UNAUTHORIZED, t('Failed to sign')); + } + + // Emit signed event + emitter.emit('signed', eventData); + + const userOp = payload as UserOperationV8; + + // Send transaction + this.handleTransactionTimeout(emitter, eventData); + + eventData.nonce = Number(userOp.nonce); + eventData.startBlock = await this.state.chainService.getEvmApi(chain).api.eth.getBlockNumber(); + const smartAccount = new Simple7702Account(userOp.sender); + + const userOpSubmit = await smartAccount.sendUserOperation(userOp, CANDIDE_BUNDLER_URL); + + emitter.emit('send', eventData); // This event is needed after sending transaction with queue + console.log('submitted'); + + userOpSubmit.included() + .then((result) => { + console.log('receipt', result); + eventData.extrinsicHash = result.receipt.transactionHash; + eventData.blockHash = result.receipt.blockHash; + eventData.blockNumber = Number(result.receipt.blockNumber); + + emitter.emit('success', eventData); + }) + .catch((e) => { + eventData.errors.push(new TransactionError(BasicTxErrorType.SEND_TRANSACTION_FAILED, t(e.message))); + emitter.emit('error', eventData); + }); + + console.log('done'); + } else { + this.removeTransaction(id); + eventData.errors.push(new TransactionError(BasicTxErrorType.USER_REJECT_REQUEST)); + emitter.emit('error', eventData); + } + }) + .catch((e: Error) => { + this.removeTransaction(id); + eventData.errors.push(new TransactionError(BasicTxErrorType.UNABLE_TO_SIGN, t(e.message))); + + emitter.emit('error', eventData); + }); + + return Promise.resolve(emitter); + } + private signAndSendEvmPermitTransaction ({ address, id, isPassConfirmation, step, transaction, url }: SWPermitTransaction): TransactionEmitter { // Allow sign transaction const canSign = true; @@ -1382,7 +1464,9 @@ export default class TransactionService { }; this.state.requestService.addConfirmation(id, url || EXTENSION_REQUEST_URL, 'evmSignatureRequest', evmSignaturePayload, { isPassConfirmation }) - .then(({ isApproved, payload: signature }) => { + .then(({ isApproved, payload: _signature }) => { + const signature = _signature as string; + if (isApproved) { // Emit signed event emitter.emit('signed', eventData); diff --git a/packages/extension-base/src/services/transaction-service/types.ts b/packages/extension-base/src/services/transaction-service/types.ts index cf05c80a35a..586b5f2ab8f 100644 --- a/packages/extension-base/src/services/transaction-service/types.ts +++ b/packages/extension-base/src/services/transaction-service/types.ts @@ -5,6 +5,7 @@ import { ChainType, ExtrinsicDataTypeMap, ExtrinsicStatus, ExtrinsicType, FeeDat import { SignTypedDataMessageV3V4 } from '@subwallet/extension-base/core/logic-validation'; import { TonTransactionConfig } from '@subwallet/extension-base/services/balance-service/transfer/ton-transfer'; import { BaseRequestSign, BriefProcessStep, ProcessTransactionData, TransactionFee } from '@subwallet/extension-base/types'; +import { UserOperationV8 } from 'abstractionkit'; import EventEmitter from 'eventemitter3'; import { TransactionConfig } from 'web3-core'; @@ -25,7 +26,7 @@ export interface SWTransaction extends ValidateTransactionResponse, Partial Promise; eventsHandler?: (eventEmitter: TransactionEmitter) => void; isPassConfirmation?: boolean; diff --git a/yarn.lock b/yarn.lock index b484e5af6ee..e0c28c2f0ab 100644 --- a/yarn.lock +++ b/yarn.lock @@ -62,6 +62,13 @@ __metadata: languageName: node linkType: hard +"@adraffy/ens-normalize@npm:1.10.1": + version: 1.10.1 + resolution: "@adraffy/ens-normalize@npm:1.10.1" + checksum: 0836f394ea256972ec19a0b5e78cb7f5bcdfd48d8a32c7478afc94dd53ae44c04d1aa2303d7f3077b4f3ac2323b1f557ab9188e8059978748fdcd83e04a80dcc + languageName: node + linkType: hard + "@adraffy/ens-normalize@npm:1.9.2": version: 1.9.2 resolution: "@adraffy/ens-normalize@npm:1.9.2" @@ -2173,6 +2180,13 @@ __metadata: languageName: node linkType: hard +"@emurgo/cardano-message-signing-browser@npm:^1.1.0": + version: 1.1.0 + resolution: "@emurgo/cardano-message-signing-browser@npm:1.1.0" + checksum: 5c1ecb18a378ffc539fe04d9211dc10b1d577cf0691ad1c7365d683966f21602b8fa83f3e0b2ad6bfd3109ad7e9ed110c517216391409ab2f3518a39d3fd8ae2 + languageName: node + linkType: hard + "@emurgo/cardano-serialization-lib-browser@npm:^13.2.0": version: 13.2.0 resolution: "@emurgo/cardano-serialization-lib-browser@npm:13.2.0" @@ -4124,6 +4138,15 @@ __metadata: languageName: node linkType: hard +"@noble/curves@npm:1.2.0": + version: 1.2.0 + resolution: "@noble/curves@npm:1.2.0" + dependencies: + "@noble/hashes": 1.3.2 + checksum: bb798d7a66d8e43789e93bc3c2ddff91a1e19fdb79a99b86cd98f1e5eff0ee2024a2672902c2576ef3577b6f282f3b5c778bebd55761ddbb30e36bf275e83dd0 + languageName: node + linkType: hard + "@noble/curves@npm:1.3.0, @noble/curves@npm:^1.3.0, @noble/curves@npm:~1.3.0": version: 1.3.0 resolution: "@noble/curves@npm:1.3.0" @@ -4149,6 +4172,13 @@ __metadata: languageName: node linkType: hard +"@noble/hashes@npm:1.3.2": + version: 1.3.2 + resolution: "@noble/hashes@npm:1.3.2" + checksum: fe23536b436539d13f90e4b9be843cc63b1b17666a07634a2b1259dded6f490be3d050249e6af98076ea8f2ea0d56f578773c2197f2aa0eeaa5fba5bc18ba474 + languageName: node + linkType: hard + "@noble/hashes@npm:1.3.3, @noble/hashes@npm:^1.3.3, @noble/hashes@npm:~1.3.2": version: 1.3.3 resolution: "@noble/hashes@npm:1.3.3" @@ -6865,6 +6895,7 @@ __metadata: "@walletconnect/sign-client": ^2.14.0 "@walletconnect/types": ^2.14.0 "@walletconnect/utils": ^2.14.0 + abstractionkit: ^0.2.16 avail-js-sdk: ^0.2.12 axios: ^1.6.2 bignumber.js: ^9.1.1 @@ -7200,10 +7231,11 @@ __metadata: languageName: unknown linkType: soft -"@subwallet/keyring@npm:^0.1.9": - version: 0.1.9 - resolution: "@subwallet/keyring@npm:0.1.9" +"@subwallet/keyring@file:../SubWallet-Base/packages/keyring/build/::locator=root-workspace-0b6124%40workspace%3A.": + version: 0.1.11 + resolution: "@subwallet/keyring@file:../SubWallet-Base/packages/keyring/build/#../SubWallet-Base/packages/keyring/build/::hash=fa8266&locator=root-workspace-0b6124%40workspace%3A." dependencies: + "@emurgo/cardano-message-signing-browser": ^1.1.0 "@emurgo/cardano-serialization-lib-nodejs": ^13.2.0 "@ethereumjs/tx": ^5.0.0 "@metamask/eth-sig-util": ^7.0.3 @@ -7213,6 +7245,7 @@ __metadata: "@ton/core": ^0.56.3 "@ton/crypto": ^3.2.0 "@ton/ton": ^15.0.0 + abstractionkit: ^0.2.16 bcryptjs: ^2.4.3 bignumber.js: ^9.1.2 bip322-js: ^2.0.0 @@ -7223,7 +7256,7 @@ __metadata: rxjs: ^7.5.6 tiny-secp256k1: ^2.2.3 tslib: ^2.6.2 - checksum: a04f8370c5af418e0d9220ad405dd2f376d5879b72a8cebfa214109cd52af173713df5d1e25ec92edae6d1df6871e59b90d1694eef57d2c5b0e039502631c2ee + checksum: 3ef80864e98c1049f205efa9dbd60419b03cd51c410fd761a9da479c9a3139b1ed693df87943a244165bc1ff84dcab2457ccf3c53ed2027cbda666b35863976c languageName: node linkType: hard @@ -7314,19 +7347,19 @@ __metadata: languageName: unknown linkType: soft -"@subwallet/ui-keyring@npm:^0.1.9": - version: 0.1.9 - resolution: "@subwallet/ui-keyring@npm:0.1.9" +"@subwallet/ui-keyring@file:../SubWallet-Base/packages/ui-keyring/build/::locator=root-workspace-0b6124%40workspace%3A.": + version: 0.1.11 + resolution: "@subwallet/ui-keyring@file:../SubWallet-Base/packages/ui-keyring/build/#../SubWallet-Base/packages/ui-keyring/build/::hash=42aa41&locator=root-workspace-0b6124%40workspace%3A." dependencies: "@babel/runtime": ^7.20.1 "@polkadot/ui-settings": 2.9.14 "@polkadot/util": ^12.2.1 "@polkadot/util-crypto": ^12.2.1 - "@subwallet/keyring": ^0.1.8 + "@subwallet/keyring": ^0.1.11 mkdirp: ^1.0.4 rxjs: ^7.5.7 store: ^2.0.12 - checksum: 332502def6742a386e8c2001ea82ded2dfbcba274df669cb3b8166945ea975ca22b6e2a758733cc9cbbb38dca18a956ef92e6e7c45b85cb55f053d6a45bc07f9 + checksum: 608559c2fac0237ddabbaf16bf5055de98cab0a4690f79758b91547d5ef4d4350b4e489247a8a675799874e7e9137a2f5de7ce244ddaa741fbda5b279c37872a languageName: node linkType: hard @@ -8142,6 +8175,15 @@ __metadata: languageName: node linkType: hard +"@types/node@npm:22.7.5": + version: 22.7.5 + resolution: "@types/node@npm:22.7.5" + dependencies: + undici-types: ~6.19.2 + checksum: 1a8bbb504efaffcef7b8491074a428e5c0b5425b0c0ffb13e7262cb8462c275e8cc5eaf90a38d8fbf52a1eeda7c01ab3b940673c43fc2414140779c973e40ec6 + languageName: node + linkType: hard + "@types/node@npm:^12.12.6": version: 12.20.55 resolution: "@types/node@npm:12.20.55" @@ -9733,6 +9775,16 @@ __metadata: languageName: node linkType: hard +"abstractionkit@npm:^0.2.16": + version: 0.2.16 + resolution: "abstractionkit@npm:0.2.16" + dependencies: + ethers: ^6.13.2 + isomorphic-unfetch: ^3.1.0 + checksum: 3c041f81463351f4b6dcea16e28f107e1142329705482cca82d9a9b756f6e45fcde6d2e118c3d1690bdfcdd3603f8b3bb4f134be2d1ae0fcbadc77bb84d6c654 + languageName: node + linkType: hard + "accepts@npm:~1.3.4, accepts@npm:~1.3.5, accepts@npm:~1.3.8": version: 1.3.8 resolution: "accepts@npm:1.3.8" @@ -15278,6 +15330,21 @@ __metadata: languageName: node linkType: hard +"ethers@npm:^6.13.2": + version: 6.13.6 + resolution: "ethers@npm:6.13.6" + dependencies: + "@adraffy/ens-normalize": 1.10.1 + "@noble/curves": 1.2.0 + "@noble/hashes": 1.3.2 + "@types/node": 22.7.5 + aes-js: 4.0.0-beta.5 + tslib: 2.7.0 + ws: 8.17.1 + checksum: 9d0eb6d031c11a325dcab34378c70f335d2985c33063e07e82c85d1448135b730d2bfb47fb28c8d618c57f37462793b0fad9e16588ba3b2dffc77c898b580ee5 + languageName: node + linkType: hard + "ethers@npm:^6.4.2": version: 6.4.2 resolution: "ethers@npm:6.4.2" @@ -18415,6 +18482,16 @@ __metadata: languageName: node linkType: hard +"isomorphic-unfetch@npm:^3.1.0": + version: 3.1.0 + resolution: "isomorphic-unfetch@npm:3.1.0" + dependencies: + node-fetch: ^2.6.1 + unfetch: ^4.2.0 + checksum: 82b92fe4ec2823a81ab0fc0d11bd94d710e6f9a940d56b3cba31896d4345ec9ffc7949f4ff31ebcae84f6b95f7ebf3474c4c7452b834eb4078ea3f2c37e459c5 + languageName: node + linkType: hard + "isstream@npm:~0.1.2": version: 0.1.2 resolution: "isstream@npm:0.1.2" @@ -28126,6 +28203,13 @@ __metadata: languageName: node linkType: hard +"tslib@npm:2.7.0": + version: 2.7.0 + resolution: "tslib@npm:2.7.0" + checksum: 1606d5c89f88d466889def78653f3aab0f88692e80bb2066d090ca6112ae250ec1cfa9dbfaab0d17b60da15a4186e8ec4d893801c67896b277c17374e36e1d28 + languageName: node + linkType: hard + "tslib@npm:^2.0.0, tslib@npm:^2.6.2": version: 2.6.2 resolution: "tslib@npm:2.6.2" @@ -28423,6 +28507,13 @@ __metadata: languageName: node linkType: hard +"undici-types@npm:~6.19.2": + version: 6.19.8 + resolution: "undici-types@npm:6.19.8" + checksum: de51f1b447d22571cf155dfe14ff6d12c5bdaec237c765085b439c38ca8518fc360e88c70f99469162bf2e14188a7b0bcb06e1ed2dc031042b984b0bb9544017 + languageName: node + linkType: hard + "unenv@npm:^1.9.0": version: 1.9.0 resolution: "unenv@npm:1.9.0" @@ -28436,6 +28527,13 @@ __metadata: languageName: node linkType: hard +"unfetch@npm:^4.2.0": + version: 4.2.0 + resolution: "unfetch@npm:4.2.0" + checksum: 6a4b2557e1d921eaa80c4425ce27a404945ec26491ed06e62598f333996a91a44c7908cb26dc7c2746d735762b13276cf4aa41829b4c8f438dde63add3045d7a + languageName: node + linkType: hard + "unicode-canonical-property-names-ecmascript@npm:^2.0.0": version: 2.0.0 resolution: "unicode-canonical-property-names-ecmascript@npm:2.0.0" @@ -30106,6 +30204,21 @@ __metadata: languageName: node linkType: hard +"ws@npm:8.17.1": + version: 8.17.1 + resolution: "ws@npm:8.17.1" + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ">=5.0.2" + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + checksum: 442badcce1f1178ec87a0b5372ae2e9771e07c4929a3180321901f226127f252441e8689d765aa5cfba5f50ac60dd830954afc5aeae81609aefa11d3ddf5cecf + languageName: node + linkType: hard + "ws@npm:8.5.0": version: 8.5.0 resolution: "ws@npm:8.5.0"