diff --git a/src/ComposableController.ts b/src/ComposableController.ts index 7bfe8134ddf..5404ab11d83 100644 --- a/src/ComposableController.ts +++ b/src/ComposableController.ts @@ -59,7 +59,10 @@ export class ComposableController extends BaseController { ); this.initialize(); this.controllers = controllers; - this.messagingSystem = messenger; + if (messenger) { + this.messagingSystem = messenger; + } + this.controllers.forEach((controller) => { const { name } = controller; if ((controller as BaseController).subscribe !== undefined) { diff --git a/src/ControllerMessenger.ts b/src/ControllerMessenger.ts index 1c080b9a7a8..6e7e500d6b2 100644 --- a/src/ControllerMessenger.ts +++ b/src/ControllerMessenger.ts @@ -620,8 +620,8 @@ export class ControllerMessenger< >({ controllerMessenger: this, name, - allowedActions, - allowedEvents, + ...(allowedActions ? { allowedActions } : {}), + ...(allowedEvents ? { allowedEvents } : {}), }); } } diff --git a/src/assets/CollectiblesController.ts b/src/assets/CollectiblesController.ts index 646a41afbd3..95523ce48bf 100644 --- a/src/assets/CollectiblesController.ts +++ b/src/assets/CollectiblesController.ts @@ -1069,7 +1069,9 @@ export class CollectiblesController extends BaseController< } } - collectible.isCurrentlyOwned = isOwned; + if (isOwned) { + collectible.isCurrentlyOwned = isOwned; + } if (batch === true) { return collectible; @@ -1084,7 +1086,9 @@ export class CollectiblesController extends BaseController< item.address.toLowerCase() === address.toLowerCase(), ); if (collectibleToUpdate) { - collectibleToUpdate.isCurrentlyOwned = isOwned; + if (isOwned) { + collectibleToUpdate.isCurrentlyOwned = isOwned; + } this.updateNestedCollectibleState( collectibles, ALL_COLLECTIBLES_STATE_KEY, diff --git a/src/assets/TokensController.ts b/src/assets/TokensController.ts index 4e47d6c3772..8fd4a312511 100644 --- a/src/assets/TokensController.ts +++ b/src/assets/TokensController.ts @@ -218,7 +218,13 @@ export class TokensController extends BaseController< address = toChecksumHexAddress(address); const { tokens, ignoredTokens } = this.state; const isERC721 = await this._detectIsERC721(address); - const newEntry: Token = { address, symbol, decimals, image, isERC721 }; + const newEntry: Token = { + address, + symbol, + decimals, + ...(image ? { image } : {}), + isERC721, + }; const previousEntry = tokens.find( (token) => token.address.toLowerCase() === address.toLowerCase(), ); @@ -276,8 +282,8 @@ export class TokensController extends BaseController< address: checksumAddress, symbol, decimals, - image, - isERC721, + ...(image ? { image } : {}), + ...(isERC721 ? { isERC721 } : {}), }; const previousEntry = tokens.find( (token) => diff --git a/src/gas/GasFeeController.test.ts b/src/gas/GasFeeController.test.ts index 0d7ac19238f..3e94c20557c 100644 --- a/src/gas/GasFeeController.test.ts +++ b/src/gas/GasFeeController.test.ts @@ -185,7 +185,7 @@ describe('GasFeeController', () => { getCurrentNetworkEIP1559Compatibility: getIsEIP1559Compatible, // change this for networkController.state.properties.isEIP1559Compatible ??? legacyAPIEndpoint, EIP1559APIEndpoint, - clientId, + ...(clientId ? { clientId } : {}), }); } diff --git a/src/gas/GasFeeController.ts b/src/gas/GasFeeController.ts index 08ea6a0f715..a9e3345de60 100644 --- a/src/gas/GasFeeController.ts +++ b/src/gas/GasFeeController.ts @@ -328,7 +328,10 @@ export class GasFeeController extends BaseController< this.currentChainId = this.getChainId(); const provider = getProvider(); this.ethQuery = new EthQuery(provider); - this.clientId = clientId; + if (clientId) { + this.clientId = clientId; + } + onNetworkStateChange(async () => { const newProvider = getProvider(); const newChainId = this.getChainId(); diff --git a/src/keyring/KeyringController.test.ts b/src/keyring/KeyringController.test.ts index 8405ce0b72f..5edd05bd37f 100644 --- a/src/keyring/KeyringController.test.ts +++ b/src/keyring/KeyringController.test.ts @@ -756,10 +756,7 @@ describe('KeyringController', () => { maxFeePerGas: '0x2540be400', maxPriorityFeePerGas: '0x3b9aca00', nonce: '0x68', - r: undefined, - s: undefined, to: '0x0c54fccd2e384b4bb6f2e405bf5cbc15a017aafb', - v: undefined, value: '0x0', type: 2, }, diff --git a/src/keyring/KeyringController.ts b/src/keyring/KeyringController.ts index 02edff69ea2..12e3e74365d 100644 --- a/src/keyring/KeyringController.ts +++ b/src/keyring/KeyringController.ts @@ -188,7 +188,9 @@ export class KeyringController extends BaseController< this.syncIdentities = syncIdentities; this.updateIdentities = updateIdentities; this.setSelectedAddress = setSelectedAddress; - this.setAccountLabel = setAccountLabel; + if (setAccountLabel) { + this.setAccountLabel = setAccountLabel; + } this.initialize(); this.fullUpdate(); } diff --git a/src/message-manager/MessageManager.ts b/src/message-manager/MessageManager.ts index dfd533fc395..18b26f67864 100644 --- a/src/message-manager/MessageManager.ts +++ b/src/message-manager/MessageManager.ts @@ -111,7 +111,7 @@ export class MessageManager extends AbstractMessageManager< * @returns The id of the newly created message. */ addUnapprovedMessage(messageParams: MessageParams, req?: OriginalRequest) { - if (req) { + if (req?.origin) { messageParams.origin = req.origin; } messageParams.data = normalizeMessageData(messageParams.data); diff --git a/src/message-manager/PersonalMessageManager.ts b/src/message-manager/PersonalMessageManager.ts index 114412b044a..cde3d7f78a8 100644 --- a/src/message-manager/PersonalMessageManager.ts +++ b/src/message-manager/PersonalMessageManager.ts @@ -115,7 +115,7 @@ export class PersonalMessageManager extends AbstractMessageManager< messageParams: PersonalMessageParams, req?: OriginalRequest, ) { - if (req) { + if (req?.origin) { messageParams.origin = req.origin; } messageParams.data = normalizeMessageData(messageParams.data); diff --git a/src/message-manager/TypedMessageManager.ts b/src/message-manager/TypedMessageManager.ts index 1b9fe91d865..5e82091be71 100644 --- a/src/message-manager/TypedMessageManager.ts +++ b/src/message-manager/TypedMessageManager.ts @@ -152,7 +152,7 @@ export class TypedMessageManager extends AbstractMessageManager< metamaskId: messageId, version, }; - if (req) { + if (req?.origin) { messageParams.origin = req.origin; } const messageData: TypedMessage = { diff --git a/src/network/NetworkController.ts b/src/network/NetworkController.ts index 82053826c03..575e009e448 100644 --- a/src/network/NetworkController.ts +++ b/src/network/NetworkController.ts @@ -308,7 +308,11 @@ export class NetworkController extends BaseController< this.update({ provider: { ...this.state.provider, - ...{ type: RPC, ticker, rpcTarget, chainId, nickname }, + type: RPC, + rpcTarget, + chainId, + ...(ticker ? { ticker } : {}), + ...(nickname ? { nickname } : {}), }, }); this.refreshNetwork(); diff --git a/src/permissions/PermissionController.ts b/src/permissions/PermissionController.ts index 40544b38700..da5f594f0f9 100644 --- a/src/permissions/PermissionController.ts +++ b/src/permissions/PermissionController.ts @@ -1582,7 +1582,7 @@ export class PermissionController< ); const permissionOptions = { - caveats, + ...(caveats ? { caveats } : {}), invoker: origin, target: targetName, }; diff --git a/src/permissions/errors.ts b/src/permissions/errors.ts index 51dc97db56e..1fe74e03197 100644 --- a/src/permissions/errors.ts +++ b/src/permissions/errors.ts @@ -14,7 +14,7 @@ export function unauthorized(opts: UnauthorizedArg) { return ethErrors.provider.unauthorized({ message: 'Unauthorized to perform action. Try requesting the required permission(s) first. For more information, see: https://docs.metamask.io/guide/rpc-api.html#permissions', - data: opts.data, + ...(opts.data ? { data: opts.data } : {}), }); } @@ -47,10 +47,7 @@ type InvalidParamsArg = { * @returns The built error */ export function invalidParams(opts: InvalidParamsArg) { - return ethErrors.rpc.invalidParams({ - data: opts.data, - message: opts.message, - }); + return ethErrors.rpc.invalidParams(opts); } /** @@ -76,7 +73,10 @@ export function internalError>( message: string, data?: Data, ): EthereumRpcError { - return ethErrors.rpc.internal({ message, data }); + return ethErrors.rpc.internal({ + ...(message ? { message } : {}), + ...(data ? { data } : {}), + }); } export class InvalidSubjectIdentifierError extends Error { diff --git a/src/transaction/TransactionController.ts b/src/transaction/TransactionController.ts index 6aa3eca3a9e..7b95ff88639 100644 --- a/src/transaction/TransactionController.ts +++ b/src/transaction/TransactionController.ts @@ -508,11 +508,11 @@ export class TransactionController extends BaseController< id: random(), networkID: network, chainId: provider.chainId, - origin, + ...(origin ? { origin } : {}), status: TransactionStatus.unapproved as TransactionStatus.unapproved, time: Date.now(), transaction, - deviceConfirmedOn, + ...(deviceConfirmedOn ? { deviceConfirmedOn } : {}), verifiedOnBlockchain: false, }; @@ -591,7 +591,7 @@ export class TransactionController extends BaseController< } const customChainParams = { - name, + ...(name ? { name } : {}), chainId: parseInt(chainId, undefined), networkId: parseInt(networkId, undefined), }; @@ -978,10 +978,9 @@ export class TransactionController extends BaseController< return { gas: '0x5208', gasPrice }; } - // if data, should be hex string format - estimatedTransaction.data = !data - ? data - : /* istanbul ignore next */ addHexPrefix(data); + if (data) { + estimatedTransaction.data = addHexPrefix(data); + } // 3. If this is a contract address, safely estimate gas using RPC estimatedTransaction.value = diff --git a/src/transaction/mocks/txsMock.ts b/src/transaction/mocks/txsMock.ts index 61b435f1a03..57b21efa1a8 100644 --- a/src/transaction/mocks/txsMock.ts +++ b/src/transaction/mocks/txsMock.ts @@ -465,7 +465,6 @@ export const txsInStateWithOutdatedGasDataMock = ( data: '0x', gas: '624874', gasPrice: '20000000000', - gasUsed: undefined, nonce: '0x12', to: '0x881d40237659c251811cec9c364ef91dc08d300c', value: '0x0', @@ -483,7 +482,6 @@ export const txsInStateWithOutdatedGasDataMock = ( data: '0x', gas: '0x51d68', gasPrice: '0x2540be400', - gasUsed: undefined, nonce: '0x12', to: '0x6bf137f335ea1b8f193b8f6ea92561a60d23a207', value: '100000000000000000', @@ -507,7 +505,6 @@ export const txsInStateWithOutdatedStatusAndGasDataMock = ( data: '0x', gas: '624874', gasPrice: '20000000000', - gasUsed: undefined, nonce: '0x12', to: '0x881d40237659c251811cec9c364ef91dc08d300c', value: '0x0', @@ -525,7 +522,6 @@ export const txsInStateWithOutdatedStatusAndGasDataMock = ( data: '0x', gas: '0x51d68', gasPrice: '0x2540be400', - gasUsed: undefined, nonce: '0x12', to: '0x6bf137f335ea1b8f193b8f6ea92561a60d23a207', value: '100000000000000000', diff --git a/src/user/PreferencesController.ts b/src/user/PreferencesController.ts index a810a062676..5921b2ae4ec 100644 --- a/src/user/PreferencesController.ts +++ b/src/user/PreferencesController.ts @@ -245,11 +245,22 @@ export class PreferencesController extends BaseController< } const newFrequestRpc: FrequentRpc = { rpcUrl: url, - chainId, - ticker, - nickname, - rpcPrefs, }; + if (chainId) { + newFrequestRpc.chainId = chainId; + } + + if (ticker) { + newFrequestRpc.ticker = ticker; + } + + if (nickname) { + newFrequestRpc.nickname = nickname; + } + + if (rpcPrefs) { + newFrequestRpc.rpcPrefs = rpcPrefs; + } frequentRpcList.push(newFrequestRpc); this.update({ frequentRpcList: [...frequentRpcList] }); } diff --git a/src/util.ts b/src/util.ts index f3713f0697c..797d9c40c11 100644 --- a/src/util.ts +++ b/src/util.ts @@ -844,7 +844,7 @@ export function getIpfsCIDv1AndPath(ipfsUrl: string): { // because most cid v0s appear to be incompatible with IPFS subdomains return { cid: CID.parse(cid).toV1().toString(), - path, + ...(path ? { path } : {}), }; } diff --git a/tsconfig.json b/tsconfig.json index de3572e5f74..ad2c68e0501 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -2,6 +2,7 @@ "compilerOptions": { "baseUrl": ".", "esModuleInterop": true, + "exactOptionalPropertyTypes": true, "inlineSources": true, "module": "commonjs", "moduleResolution": "node",