Skip to content

Commit

Permalink
Clean up - reorg to remove inverted/deep imports, clean up dead code,…
Browse files Browse the repository at this point in the history
… alias (#109)

* reorg

* clean up mocks

* config

* apply :core

* vendor

* vendor-js

* interface

* rename RPCFetch

* message and communicator as core

* move move move

* cipher

* remove reversed hierarchy imports

* error

* constants

* wow

* errors

* remove dead code

* errors

* errrorrororor

* erererrs

* FUCK alias

* yay

* fix jest alias

* clear persisted connection type on disconnect (#110)

* Nate/bugfix3 (#112)

* just clear keys instead of resetting, generate new keys the next time keymanager is used

* ts

---------

Co-authored-by: Nate Reiners <nate.reiners@coinbase.com>
  • Loading branch information
bangtoven and nateReiners committed Feb 29, 2024
1 parent e21d284 commit dfd757f
Show file tree
Hide file tree
Showing 101 changed files with 530 additions and 1,064 deletions.
3 changes: 1 addition & 2 deletions apps/testapp/src/components/Layout.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
import { ConnectionPreferences } from '@cbhq/wallet-sdk/dist/CoinbaseWalletSDK';
import { CheckIcon, ChevronDownIcon } from '@chakra-ui/icons';
import {
Box,
Expand Down Expand Up @@ -59,7 +58,7 @@ export function Layout({ children }: LayoutProps) {
{`Mode: ${connectionPreference}`}
</MenuButton>
<MenuList>
{ConnectionPreferences.map((preference) => (
{['default', 'embedded'].map((preference) => (
<MenuItem
color={'MenuText'}
key={preference}
Expand Down
7 changes: 2 additions & 5 deletions apps/testapp/src/context/CBWSDKReactContextProvider.tsx
Original file line number Diff line number Diff line change
@@ -1,8 +1,5 @@
import CoinbaseWalletSDK from '@cbhq/wallet-sdk';
import {
ConnectionPreference,
ConnectionPreferences,
} from '@cbhq/wallet-sdk/dist/CoinbaseWalletSDK';
import { ConnectionPreference } from '@cbhq/wallet-sdk/dist/core/communicator/ConnectionPreference';
import React, { useEffect, useMemo } from 'react';

type CBWSDKProviderProps = {
Expand Down Expand Up @@ -39,7 +36,7 @@ export function CBWSDKReactContextProvider({ children }: CBWSDKProviderProps) {
PREFERRED_CONNECTION_KEY
) as ConnectionPreference;
setConnectionPreference(
ConnectionPreferences.includes(savedPreference)
['default', 'embedded'].includes(savedPreference)
? savedPreference
: ('default' as ConnectionPreference)
);
Expand Down
1 change: 1 addition & 0 deletions packages/wallet-sdk/jest.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ export default {
// A map from regular expressions to module names or to arrays of module names that allow to stub out resources with a single module
moduleNameMapper: {
'^src/(.*)$': '<rootDir>/src/$1',
'^:core/(.*)$': '<rootDir>/src/core/$1',
},

// A list of paths to directories that Jest should use to search for files in
Expand Down
3 changes: 0 additions & 3 deletions packages/wallet-sdk/jest.setup.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,6 @@ expect.extend({
const expected = expect.objectContaining({
code,
message,
docUrl: expect.stringMatching(
/^https:\/\/.*coinbase\.com\/.*version=\d+\.\d+\.\d+.*code=-?\d+.*$/
),
});
return {
pass: this.equals(received, expected),
Expand Down
6 changes: 4 additions & 2 deletions packages/wallet-sdk/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,8 @@
"test": "jest",
"test:coverage": "yarn test:unit && open coverage/lcov-report/index.html",
"prebuild": "rm -rf ./build && node -p \"'export const LIB_VERSION = \\'' + require('./package.json').version + '\\';'\" > src/version.ts",
"build": "node compile-assets.js && tsc -p ./tsconfig.build.json && cp -a src/vendor-js dist",
"dev": "node compile-assets.js && tsc --watch",
"build": "node compile-assets.js && tsc -p ./tsconfig.build.json && tsc-alias && cp -a src/vendor-js dist",
"dev": "node compile-assets.js && tsc --watch & nodemon --watch dist --delay 1 --exec tsc-alias",
"typecheck": "tsc --noEmit",
"lint": "eslint . --ext .ts,.tsx --fix"
},
Expand Down Expand Up @@ -60,10 +60,12 @@
"jest": "^27.5.1",
"jest-chrome": "^0.7.2",
"jest-websocket-mock": "^2.4.0",
"nodemon": "^3.1.0",
"prettier": "^2.8.8",
"sass": "^1.64.1",
"ts-jest": "^27.1.5",
"ts-node": "^10.9.1",
"tsc-alias": "^1.8.8",
"tslib": "^2.6.0",
"typescript": "^5.1.6"
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { standardErrors } from '../core/error';
import { CoinbaseWalletProvider } from './CoinbaseWalletProvider';
import { standardErrors } from './core/error';

describe('EIP1193Provider', () => {
let provider: CoinbaseWalletProvider;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,19 +1,23 @@
/* eslint-disable jest/no-commented-out-tests */
import EventEmitter from 'eventemitter3';

import { ConnectionPreference } from '../CoinbaseWalletSDK';
import { standardErrors } from '../core/error';
import { AddressString, Chain } from '../core/type';
import { areAddressArraysEqual, prepend0x, showDeprecationWarning } from '../core/util';
import { FilterRequestHandler } from './handler/FilterRequestHandler';
import { JSONRPCRequestHandler } from './handler/JSONRPCRequestHandler';
import { RequestHandler } from './handler/RequestHandler';
import { SignRequestHandler } from './handler/SignRequestHandler/SignRequestHandler';
import { AccountsUpdate, ChainUpdate } from './handler/SignRequestHandler/UpdateListener';
import { StateRequestHandler } from './handler/StateRequestHandler';
import { SubscriptionRequestHandler } from './handler/SubscriptionManager';
import { getErrorForInvalidRequestArgs } from './helpers/eip1193Utils';
import { ProviderInterface, ProviderRpcError, RequestArguments } from './ProviderInterface';
import { getErrorForInvalidRequestArgs } from './core/eip1193Utils';
import { standardErrors } from './core/error';
import { AddressString, Chain } from './core/type';
import {
ProviderInterface,
ProviderRpcError,
RequestArguments,
} from './core/type/ProviderInterface';
import { RequestHandler } from './core/type/RequestHandlerInterface';
import { areAddressArraysEqual, prepend0x, showDeprecationWarning } from './core/util';
import { FilterRequestHandler } from './filter/FilterRequestHandler';
import { StateRequestHandler } from './internalState/StateRequestHandler';
import { RPCFetchRequestHandler } from './rpcFetch/RPCFetchRequestHandler';
import { SignRequestHandler } from './sign/SignRequestHanlder';
import { AccountsUpdate, ChainUpdate } from './sign/UpdateListenerInterface';
import { SubscriptionRequestHandler } from './subscription/SubscriptionRequestHandler';
import { ConnectionPreference } from ':core/communicator/ConnectionPreference';

interface ConstructorOptions {
scwUrl?: string;
Expand Down Expand Up @@ -51,7 +55,7 @@ export class CoinbaseWalletProvider extends EventEmitter implements ProviderInte
new SubscriptionRequestHandler({
provider: this,
}),
new JSONRPCRequestHandler(), // should be last
new RPCFetchRequestHandler(), // should be last
];
}

Expand Down Expand Up @@ -83,9 +87,7 @@ export class CoinbaseWalletProvider extends EventEmitter implements ProviderInte
return handler?.handleRequest(args, this.accounts, this.chain) as T;
}

// *
// deprecated methods - more methods will likely be added here later
// *
/** @deprecated Use `.request({ method: 'eth_requestAccounts' })` instead. */
public async enable(): Promise<unknown> {
showDeprecationWarning('enable', 'use request({ method: "eth_requestAccounts" })');
return await this.request({
Expand All @@ -94,7 +96,6 @@ export class CoinbaseWalletProvider extends EventEmitter implements ProviderInte
}

private emitConnectEvent() {
// https://eips.ethereum.org/EIPS/eip-1193#connect
this.emit('connect', { chainId: prepend0x(this.chain.id.toString(16)) });
}

Expand Down
7 changes: 5 additions & 2 deletions packages/wallet-sdk/src/CoinbaseWalletSDK.test.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
// eslint-disable-next-line max-classes-per-file

import { CoinbaseWalletProvider } from './CoinbaseWalletProvider';
import { CoinbaseWalletSDK } from './CoinbaseWalletSDK';
import { mockProvider } from './mocks/provider';
import { CoinbaseWalletProvider } from './provider/CoinbaseWalletProvider';
import { ProviderInterface } from './core/type/ProviderInterface';

describe('CoinbaseWalletSDK', () => {
describe('initialize', () => {
Expand Down Expand Up @@ -87,7 +87,10 @@ describe('CoinbaseWalletSDK', () => {
});
});

// TODO: revisit these tests
describe('extension', () => {
const mockProvider = { close: jest.fn() } as unknown as ProviderInterface;

beforeAll(() => {
window.coinbaseWalletExtension = mockProvider;
});
Expand Down
17 changes: 6 additions & 11 deletions packages/wallet-sdk/src/CoinbaseWalletSDK.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,12 @@
// Licensed under the Apache License, version 2.0

import { LogoType, walletLogo } from './assets/wallet-logo';
import { ScopedLocalStorage } from './core/ScopedLocalStorage';
import { CoinbaseWalletProvider } from './CoinbaseWalletProvider';
import { ScopedLocalStorage } from './core/storage/ScopedLocalStorage';
import { ProviderInterface } from './core/type/ProviderInterface';
import { getFavicon } from './core/util';
import { CoinbaseWalletProvider } from './provider/CoinbaseWalletProvider';
import { ProviderInterface } from './provider/ProviderInterface';
import { LIB_VERSION } from './version';

export const ConnectionPreferences = ['default', 'external', 'embedded'] as const;
export type ConnectionPreference = (typeof ConnectionPreferences)[number];
import { ConnectionPreference } from ':core/communicator/ConnectionPreference';

/** Coinbase Wallet SDK Constructor Options */
export interface CoinbaseWalletSDKOptions {
Expand Down Expand Up @@ -40,10 +38,7 @@ export class CoinbaseWalletSDK {
constructor(options: Readonly<CoinbaseWalletSDKOptions>) {
this.connectionPreference = options.connectionPreference || 'default';
this.chainIds = options.chainIds ? options.chainIds.map(Number) : [];

// TODO: revisit arg name. update default url to production.
this.scwUrl = options.scwUrl || 'https://scw-dev.cbhq.net/connect';

this.scwUrl = options.scwUrl;
this.appName = options.appName || 'DApp';
this.appLogoUrl = options.appLogoUrl || getFavicon();

Expand Down Expand Up @@ -96,7 +91,7 @@ export class CoinbaseWalletSDK {
}

private get walletExtension(): LegacyProviderInterface | undefined {
return window.coinbaseWalletExtension ?? window.walletLinkExtension;
return window.coinbaseWalletExtension;
}

private get coinbaseBrowser(): LegacyProviderInterface | undefined {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export type ConnectionPreference = 'default' | 'embedded';
Original file line number Diff line number Diff line change
@@ -1,11 +1,5 @@
import { UUID } from 'crypto';

import { standardErrors } from '../core/error/errors';

export interface Message {
type: 'config' | 'scw';
id: UUID;
}
import { Message } from './Message';
import { standardErrors } from ':core/error';

export abstract class CrossDomainCommunicator {
protected url: URL | undefined = undefined;
Expand Down
6 changes: 6 additions & 0 deletions packages/wallet-sdk/src/core/communicator/Message.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
import { UUID } from 'crypto';

export interface Message {
type: 'config' | 'scw';
id: UUID;
}
4 changes: 3 additions & 1 deletion packages/wallet-sdk/src/core/constants.ts
Original file line number Diff line number Diff line change
@@ -1 +1,3 @@
export const LINK_API_URL = 'https://www.walletlink.org';
export const SCW_CONNECT_URL = 'https://keys.coinbase.com/connect';
export const WALLETLINK_URL = 'https://www.walletlink.org';
export const CBW_MOBILE_DEEPLINK_URL = 'https://go.cb-w.com/walletlink';
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { standardErrors } from '../../core/error';
import { getErrorForInvalidRequestArgs } from './eip1193Utils';
import { standardErrors } from './error';

// @ts-expect-error-next-line
const invalidArgsError = (args) =>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { standardErrors } from '../../core/error';
import { RequestArguments } from '../ProviderInterface';
import { standardErrors } from './error';
import { RequestArguments } from './type/ProviderInterface';

/**
* Validates the arguments for an invalid request and returns an error if any validation fails.
Expand Down
25 changes: 23 additions & 2 deletions packages/wallet-sdk/src/core/error/errors.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import { standardErrorCodes } from './constants';
import { getMessageFromCode } from './utils';
import { errorValues, standardErrorCodes } from './constants';

export const standardErrors = {
rpc: {
Expand Down Expand Up @@ -89,6 +88,28 @@ export const standardErrors = {

// Internal

function isJsonRpcServerError(code: number): boolean {
return code >= -32099 && code <= -32000;
}

function hasKey(obj: Record<string, unknown>, key: string) {
return Object.prototype.hasOwnProperty.call(obj, key);
}

function getMessageFromCode(code: number | undefined): string {
if (code && Number.isInteger(code)) {
const codeString = code.toString();

if (hasKey(errorValues, codeString)) {
return errorValues[codeString as keyof typeof errorValues].message;
}
if (isJsonRpcServerError(code)) {
return 'Unspecified server error.';
}
}
return 'Unspecified error message.';
}

function getEthJsonRpcError<T>(code: number, arg?: EthErrorsArg<T>): EthereumRpcError<T> {
const [message, data] = parseOpts(arg);
return new EthereumRpcError(code, message || getMessageFromCode(code), data);
Expand Down
11 changes: 3 additions & 8 deletions packages/wallet-sdk/src/core/error/index.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,3 @@
import { standardErrorCodes } from './constants';
import { standardErrors } from './errors';
import { SerializedError, serializeError } from './serialize';
import { getErrorCode, getMessageFromCode } from './utils';

export { getErrorCode, getMessageFromCode, serializeError, standardErrorCodes, standardErrors };
export type ErrorType = Error | SerializedError;
export type ErrorHandler = (error?: ErrorType) => void;
export { standardErrorCodes } from './constants';
export { standardErrors } from './errors';
export type { SerializedEthereumRpcError } from './type';
Loading

0 comments on commit dfd757f

Please sign in to comment.