Skip to content

Commit af16b02

Browse files
authored
Merge pull request #552 from InjectiveLabs/feat/turnkey-wallet
feat: turnkey wallet
2 parents de7c94d + 3d70b20 commit af16b02

File tree

33 files changed

+1896
-199
lines changed

33 files changed

+1896
-199
lines changed

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,7 @@
113113
},
114114
"resolutions": {
115115
"@solana/web3.js": "1.98.0",
116-
"rpc-websockets": "9.0.4"
116+
"rpc-websockets": "9.0.4",
117+
"next": "file:./etc/noop"
117118
}
118119
}

packages/exceptions/src/exceptions/types/codes.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -817,4 +817,5 @@ export type ErrorContextCode =
817817
| ChainStakingErrorCodes
818818
| ChainWasmErrorCodes
819819
| ErrorCode
820+
| number
820821
| typeof UnspecifiedErrorCode

packages/networks/src/constants.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,11 @@ export const CW20_ADAPTER_CONTRACT_BY_NETWORK = {
1212
[Network.TestnetK8s]: 'inj1hdvy6tl89llqy3ze8lv6mz5qh66sx9enn0jxg6',
1313
[Network.TestnetSentry]: 'inj1hdvy6tl89llqy3ze8lv6mz5qh66sx9enn0jxg6',
1414
[Network.TestnetOld]: 'inj1hdvy6tl89llqy3ze8lv6mz5qh66sx9enn0jxg6',
15-
[Network.Devnet]: 'inj1hdvy6tl89llqy3ze8lv6mz5qh66sx9enn0jxg6',
16-
[Network.Devnet1]: 'inj1hdvy6tl89llqy3ze8lv6mz5qh66sx9enn0jxg6',
17-
[Network.Devnet2]: 'inj1hdvy6tl89llqy3ze8lv6mz5qh66sx9enn0jxg6',
18-
[Network.Devnet3]: 'inj1hdvy6tl89llqy3ze8lv6mz5qh66sx9enn0jxg6',
19-
[Network.Local]: 'inj1hdvy6tl89llqy3ze8lv6mz5qh66sx9enn0jxg6',
15+
[Network.Devnet]: 'inj1uukt3kqela4vsllvrqnrgllkna5wn3cm588w6k',
16+
[Network.Devnet1]: 'inj1uukt3kqela4vsllvrqnrgllkna5wn3cm588w6k',
17+
[Network.Devnet2]: 'inj1uukt3kqela4vsllvrqnrgllkna5wn3cm588w6k',
18+
[Network.Devnet3]: 'inj1uukt3kqela4vsllvrqnrgllkna5wn3cm588w6k',
19+
[Network.Local]: 'inj1uukt3kqela4vsllvrqnrgllkna5wn3cm588w6k',
2020
}
2121

2222
export const CW20_SWAP_CONTRACT_BY_NETWORK = {

packages/sdk-ts/src/utils/address.spec.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import {
22
getEthereumAddress,
33
getInjectiveAddress,
44
getDefaultSubaccountId,
5+
getChecksumAddress,
56
} from '../../src/utils/index.js'
67

78
describe('address helper functions', () => {
@@ -31,4 +32,13 @@ describe('address helper functions', () => {
3132
'0xaf79152ac5df276d9a8e1e2e22822f9713474902000000000000000000000000',
3233
)
3334
})
35+
36+
it('getChecksumAddress returns correct value', () => {
37+
const ethereumAddress =
38+
'0xaf79152ac5df276d9a8e1e2e22822f9713474902'.toLowerCase()
39+
40+
expect(getChecksumAddress(ethereumAddress)).toMatch(
41+
'0xAF79152AC5dF276D9A8e1E2E22822f9713474902',
42+
)
43+
})
3444
})

packages/utils/src/classes/HttpRestClient.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,9 @@ const getErrorMessage = (error: any, endpoint: string): string => {
1313
}
1414

1515
return error.response.data
16-
? error.response.data.message || error.response.data
16+
? error.response.data.message ||
17+
error.response.data.statusMessage ||
18+
error.response.data
1719
: error.response.statusText
1820
}
1921

packages/wallets/wallet-base/src/base.ts

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
1-
import { ChainId, CosmosChainId, EthereumChainId } from '@injectivelabs/ts-types'
21
import {
2+
ChainId,
3+
CosmosChainId,
4+
EthereumChainId,
5+
} from '@injectivelabs/ts-types'
6+
import {
7+
WalletMetadata,
38
WalletEventListener,
49
ConcreteWalletStrategyArgs,
510
ConcreteCosmosWalletStrategyArgs,
@@ -13,10 +18,19 @@ export default abstract class BaseConcreteStrategy {
1318

1419
protected listeners: Partial<Record<WalletEventListener, any>> = {}
1520

16-
protected constructor(args: ConcreteWalletStrategyArgs | ConcreteEthereumWalletStrategyArgs | ConcreteCosmosWalletStrategyArgs) {
17-
this.ethereumChainId = 'ethereumOptions' in args && args.ethereumOptions
18-
? args.ethereumOptions.ethereumChainId
19-
: undefined
21+
public metadata?: WalletMetadata
22+
23+
public constructor(
24+
args:
25+
| ConcreteWalletStrategyArgs
26+
| ConcreteEthereumWalletStrategyArgs
27+
| ConcreteCosmosWalletStrategyArgs,
28+
) {
29+
this.ethereumChainId =
30+
'ethereumOptions' in args && args.ethereumOptions
31+
? args.ethereumOptions.ethereumChainId
32+
: undefined
2033
this.chainId = args.chainId
34+
this.metadata = args.metadata
2135
}
2236
}

packages/wallets/wallet-base/src/types/enums.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ export enum Wallet {
1111
Phantom = 'phantom',
1212
Metamask = 'metamask',
1313
OkxWallet = 'okx-wallet',
14+
TurnkeyOtp = 'turnkey-otp',
15+
TurnkeyOauth = 'turnkey-oauth',
1416
TrustWallet = 'trust-wallet',
1517
PrivateKey = 'private-key',
1618
TrezorBip32 = 'trezor-bip32',

packages/wallets/wallet-base/src/types/strategy.ts

Lines changed: 59 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import {
22
ChainId,
3-
CosmosChainId,
43
AccountAddress,
54
EthereumChainId,
65
} from '@injectivelabs/ts-types'
@@ -30,10 +29,13 @@ export type MagicMetadata = {
3029
rpcEndpoint?: string
3130
}
3231

33-
export type WalletConnectMetadata = Record<
34-
string,
35-
string | Record<string, string> | Record<string, string[]>
36-
>
32+
export type PrivateKeyMetadata = {
33+
privateKey: string
34+
}
35+
36+
export type WalletConnectMetadata = {
37+
projectId?: string
38+
}
3739

3840
export interface WalletStrategyEthereumOptions {
3941
ethereumChainId: EthereumChainId
@@ -51,20 +53,57 @@ export interface SendTransactionOptions {
5153
}
5254
}
5355

54-
export interface ConcreteWalletStrategyOptions {
55-
privateKey?: string
56-
metadata?: Record<string, string | Record<string, string>>
56+
export enum TurnkeyProvider {
57+
Email = 'email',
58+
Google = 'google',
59+
Apple = 'apple',
60+
}
61+
62+
export type TurnkeySession = {
63+
sessionType: any
64+
userId: string
65+
organizationId: string
66+
expiry: number
67+
token: string
68+
}
69+
70+
export interface TurnkeyMetadata {
71+
defaultOrganizationId: string
72+
apiBaseUrl: string
73+
apiServerEndpoint: string
74+
iframeUrl?: string
75+
email?: string
76+
session?: TurnkeySession
77+
otpId?: string
78+
otpCode?: string
79+
oidcToken?: string
80+
iframeElementId?: string
81+
iframeContainerId: string
82+
credentialBundle?: string
83+
organizationId?: string
84+
provider?: TurnkeyProvider
85+
otpInitPath?: string
86+
otpVerifyPath?: string
87+
oauthLoginPath?: string
88+
googleClientId?: string
89+
googleRedirectUri?: string
90+
}
91+
92+
export interface WalletMetadata {
93+
magic?: MagicMetadata
94+
turnkey?: Partial<TurnkeyMetadata>
95+
walletConnect?: WalletConnectMetadata
96+
privateKey?: PrivateKeyMetadata
5797
}
5898

5999
export interface ConcreteWalletStrategyArgs {
60100
chainId: ChainId
61-
options?: ConcreteWalletStrategyOptions
101+
metadata?: WalletMetadata
62102
}
63103

64-
export interface ConcreteCosmosWalletStrategyArgs {
65-
chainId: CosmosChainId | ChainId
104+
export interface ConcreteCosmosWalletStrategyArgs
105+
extends ConcreteWalletStrategyArgs {
66106
wallet?: Wallet
67-
options?: ConcreteWalletStrategyOptions
68107
}
69108

70109
export interface ConcreteEthereumWalletStrategyArgs
@@ -73,6 +112,9 @@ export interface ConcreteEthereumWalletStrategyArgs
73112
}
74113

75114
export interface ConcreteCosmosWalletStrategy {
115+
metadata?: WalletMetadata
116+
117+
setMetadata?(metadata?: WalletMetadata): void
76118
/**
77119
* The accounts from the wallet (addresses)
78120
*/
@@ -125,7 +167,7 @@ export type ConcreteStrategiesArg = {
125167

126168
export interface WalletStrategyArguments {
127169
chainId: ChainId
128-
options?: ConcreteWalletStrategyOptions
170+
metadata?: WalletMetadata
129171
ethereumOptions?: WalletStrategyEthereumOptions
130172
disabledWallets?: Wallet[]
131173
wallet?: Wallet
@@ -135,9 +177,7 @@ export interface WalletStrategyArguments {
135177
export interface ConcreteWalletStrategy
136178
extends Omit<
137179
ConcreteCosmosWalletStrategy,
138-
| 'sendTransaction'
139-
| 'isChainIdSupported'
140-
| 'signAminoTransaction'
180+
'sendTransaction' | 'isChainIdSupported' | 'signAminoTransaction'
141181
> {
142182
/**
143183
* Sends Cosmos transaction. Returns a transaction hash
@@ -224,10 +264,11 @@ export interface WalletStrategy {
224264
strategies: ConcreteStrategiesArg
225265
wallet: Wallet
226266
args: WalletStrategyArguments
267+
metadata?: WalletMetadata
227268

228269
getWallet(): Wallet
229270
setWallet(wallet: Wallet): void
230-
setOptions(options?: ConcreteWalletStrategyOptions): void
271+
setMetadata(metadata?: WalletMetadata): void
231272
getStrategy(): ConcreteWalletStrategy
232273
getAddresses(args?: unknown): Promise<AccountAddress[]>
233274
getWalletDeviceType(): Promise<WalletDeviceType>
@@ -269,4 +310,4 @@ export interface WalletStrategy {
269310
getCosmosWallet?(chainId: ChainId): CosmosWalletAbstraction
270311
}
271312

272-
export { StdSignDoc}
313+
export { StdSignDoc }

packages/wallets/wallet-base/src/utils/wallet.ts

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,14 @@ export const isEvmWallet = (wallet: Wallet): boolean =>
55
Wallet.Magic,
66
Wallet.BitGet,
77
Wallet.Ledger,
8-
Wallet.TrezorBip32,
9-
Wallet.TrezorBip44,
108
Wallet.Phantom,
119
Wallet.Metamask,
1210
Wallet.OkxWallet,
1311
Wallet.PrivateKey,
12+
Wallet.TrezorBip32,
13+
Wallet.TurnkeyOtp,
14+
Wallet.TurnkeyOauth,
15+
Wallet.TrezorBip44,
1416
Wallet.TrustWallet,
1517
Wallet.LedgerLegacy,
1618
Wallet.WalletConnect,
@@ -19,14 +21,16 @@ export const isEvmWallet = (wallet: Wallet): boolean =>
1921

2022
export const isCosmosWallet = (wallet: Wallet): boolean => !isEvmWallet(wallet)
2123

22-
export const isEvmBrowserWallet = (wallet: Wallet) => [
23-
Wallet.BitGet,
24-
Wallet.Phantom,
25-
Wallet.Metamask,
26-
Wallet.OkxWallet,
27-
Wallet.TrustWallet,
28-
].includes(wallet)
29-
24+
export const isEvmBrowserWallet = (wallet: Wallet) =>
25+
[
26+
Wallet.BitGet,
27+
Wallet.Phantom,
28+
Wallet.Metamask,
29+
Wallet.OkxWallet,
30+
Wallet.TrustWallet,
31+
Wallet.TurnkeyOtp,
32+
Wallet.TurnkeyOauth,
33+
].includes(wallet)
3034

3135
export const isCosmosBrowserWallet = (wallet: Wallet): boolean =>
3236
[

packages/wallets/wallet-core/src/strategy/BaseWalletStrategy.ts

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,11 @@ import {
1818
ConcreteStrategiesArg,
1919
SendTransactionOptions,
2020
ConcreteWalletStrategy,
21+
type WalletMetadata,
2122
onAccountChangeCallback,
2223
onChainIdChangeCallback,
2324
WalletStrategyArguments,
2425
CosmosWalletAbstraction,
25-
ConcreteWalletStrategyOptions,
2626
WalletStrategy as WalletStrategyInterface,
2727
} from '@injectivelabs/wallet-base'
2828
import { StdSignDoc } from '@keplr-wallet/types'
@@ -58,12 +58,15 @@ export default class BaseWalletStrategy implements WalletStrategyInterface {
5858

5959
public args: WalletStrategyArguments
6060

61+
public metadata?: WalletMetadata
62+
6163
public wallets?: Wallet[]
6264

6365
constructor(args: WalletStrategyArguments) {
6466
this.args = args
6567
this.strategies = args.strategies
6668
this.wallet = getInitialWallet(args)
69+
this.metadata = args.metadata
6770
}
6871

6972
public getWallet(): Wallet {
@@ -74,8 +77,13 @@ export default class BaseWalletStrategy implements WalletStrategyInterface {
7477
this.wallet = wallet
7578
}
7679

77-
public setOptions(_options?: ConcreteWalletStrategyOptions) {
78-
//
80+
/**
81+
* When we use setMetadata, we are usually updating the metadata of the
82+
* existing strategy.
83+
*/
84+
public setMetadata(metadata?: WalletMetadata) {
85+
this.metadata = metadata
86+
this.getStrategy().setMetadata?.(metadata)
7987
}
8088

8189
public getStrategy(): ConcreteWalletStrategy {

packages/wallets/wallet-cosmos/src/strategy/strategy.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ export class CosmosWalletStrategy
4141
implements ConcreteWalletStrategy
4242
{
4343
public wallet: Wallet
44+
4445
private cosmosWallet: CosmosWallet
4546

4647
constructor(
@@ -49,7 +50,7 @@ export class CosmosWalletStrategy
4950
endpoints?: { rest: string; rpc: string }
5051
} & { wallet: Wallet },
5152
) {
52-
super(args)
53+
super({ ...args, chainId: args.chainId as ChainId })
5354

5455
if (!cosmosWallets.includes(args.wallet)) {
5556
throw new CosmosWalletException(
@@ -60,7 +61,7 @@ export class CosmosWalletStrategy
6061
}
6162

6263
this.wallet = args.wallet
63-
this.chainId = args.chainId || CosmosChainId.Injective
64+
this.chainId = args.chainId as ChainId
6465
this.cosmosWallet = new CosmosWallet({
6566
wallet: args.wallet,
6667
chainId: args.chainId,

0 commit comments

Comments
 (0)