@keplr-wallet/provider 0.12.131 → 0.12.133-rc.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/src/core.ts CHANGED
@@ -20,6 +20,8 @@ import {
20
20
  SettledResponses,
21
21
  DirectAuxSignResponse,
22
22
  IEthereumProvider,
23
+ IStarknetProvider,
24
+ WalletEvents,
23
25
  } from "@keplr-wallet/types";
24
26
  import {
25
27
  BACKGROUND_PORT,
@@ -35,6 +37,13 @@ import Long from "long";
35
37
  import { Buffer } from "buffer/";
36
38
  import { KeplrCoreTypes } from "./core-types";
37
39
  import EventEmitter from "events";
40
+ import {
41
+ AccountInterface,
42
+ Call,
43
+ DeployAccountSignerDetails,
44
+ InvocationsSignerDetails,
45
+ ProviderInterface,
46
+ } from "starknet";
38
47
 
39
48
  export class Keplr implements IKeplr, KeplrCoreTypes {
40
49
  protected enigmaUtils: Map<string, SecretUtils> = new Map();
@@ -1000,6 +1009,131 @@ export class Keplr implements IKeplr, KeplrCoreTypes {
1000
1009
  );
1001
1010
  }
1002
1011
 
1012
+ async getStarknetKey(chainId: string): Promise<{
1013
+ name: string;
1014
+ hexAddress: string;
1015
+ pubKey: Uint8Array;
1016
+ address: Uint8Array;
1017
+ }> {
1018
+ return new Promise((resolve, reject) => {
1019
+ let f = false;
1020
+ sendSimpleMessage(
1021
+ this.requester,
1022
+ BACKGROUND_PORT,
1023
+ "keyring-starknet",
1024
+ "get-starknet-key",
1025
+ {
1026
+ chainId,
1027
+ }
1028
+ )
1029
+ .then(resolve)
1030
+ .catch(reject)
1031
+ .finally(() => (f = true));
1032
+
1033
+ setTimeout(() => {
1034
+ if (!f) {
1035
+ this.protectedTryOpenSidePanelIfEnabled();
1036
+ }
1037
+ }, 100);
1038
+ });
1039
+ }
1040
+
1041
+ async getStarknetKeysSettled(chainIds: string[]): Promise<
1042
+ SettledResponses<{
1043
+ name: string;
1044
+ hexAddress: string;
1045
+ pubKey: Uint8Array;
1046
+ address: Uint8Array;
1047
+ }>
1048
+ > {
1049
+ return new Promise((resolve, reject) => {
1050
+ let f = false;
1051
+ sendSimpleMessage(
1052
+ this.requester,
1053
+ BACKGROUND_PORT,
1054
+ "keyring-starknet",
1055
+ "get-starknet-keys-settled",
1056
+ {
1057
+ chainIds,
1058
+ }
1059
+ )
1060
+ .then(resolve)
1061
+ .catch(reject)
1062
+ .finally(() => (f = true));
1063
+
1064
+ setTimeout(() => {
1065
+ if (!f) {
1066
+ this.protectedTryOpenSidePanelIfEnabled();
1067
+ }
1068
+ }, 100);
1069
+ });
1070
+ }
1071
+
1072
+ async signStarknetTx(
1073
+ chainId: string,
1074
+ transactions: Call[],
1075
+ details: InvocationsSignerDetails
1076
+ ): Promise<{
1077
+ transactions: Call[];
1078
+ details: InvocationsSignerDetails;
1079
+ signature: string[];
1080
+ }> {
1081
+ return new Promise((resolve, reject) => {
1082
+ let f = false;
1083
+ sendSimpleMessage(
1084
+ this.requester,
1085
+ BACKGROUND_PORT,
1086
+ "keyring-starknet",
1087
+ "request-sign-starknet-tx",
1088
+ {
1089
+ chainId,
1090
+ transactions,
1091
+ details,
1092
+ }
1093
+ )
1094
+ .then(resolve)
1095
+ .catch(reject)
1096
+ .finally(() => (f = true));
1097
+
1098
+ setTimeout(() => {
1099
+ if (!f) {
1100
+ this.protectedTryOpenSidePanelIfEnabled();
1101
+ }
1102
+ }, 100);
1103
+ });
1104
+ }
1105
+
1106
+ async signStarknetDeployAccountTransaction(
1107
+ chainId: string,
1108
+ transaction: DeployAccountSignerDetails
1109
+ ): Promise<{
1110
+ transaction: DeployAccountSignerDetails;
1111
+ signature: string[];
1112
+ }> {
1113
+ return new Promise((resolve, reject) => {
1114
+ let f = false;
1115
+ sendSimpleMessage(
1116
+ this.requester,
1117
+ BACKGROUND_PORT,
1118
+ "keyring-starknet",
1119
+ "request-sign-starknet-deploy-account-tx",
1120
+ {
1121
+ chainId,
1122
+ transaction,
1123
+ }
1124
+ )
1125
+ .then(resolve)
1126
+ .catch(reject)
1127
+ .finally(() => (f = true));
1128
+
1129
+ setTimeout(() => {
1130
+ if (!f) {
1131
+ this.protectedTryOpenSidePanelIfEnabled();
1132
+ }
1133
+ });
1134
+ });
1135
+ }
1136
+
1003
1137
  // IMPORTANT: protected로 시작하는 method는 InjectedKeplr.startProxy()에서 injected 쪽에서 event system으로도 호출할 수 없도록 막혀있다.
1004
1138
  // protected로 시작하지 않는 method는 injected keplr에 없어도 event system을 통하면 호출 할 수 있다.
1005
1139
  // 이를 막기 위해서 method 이름을 protected로 시작하게 한다.
@@ -1313,7 +1447,21 @@ export class Keplr implements IKeplr, KeplrCoreTypes {
1313
1447
  }
1314
1448
 
1315
1449
  public readonly ethereum = new EthereumProvider(this, this.requester);
1450
+
1451
+ public readonly starknet = new StarknetProvider(this, this.requester);
1316
1452
  }
1453
+
1454
+ // IMPORTANT: 사이드 패널을 열어야하는 JSON-RPC 메소드들이 생길 때마다 여기에 추가해야한다.
1455
+ const sidePanelOpenNeededJSONRPCMethods = [
1456
+ "eth_sendTransaction",
1457
+ "personal_sign",
1458
+ "eth_signTypedData_v3",
1459
+ "eth_signTypedData_v4",
1460
+ "wallet_addEthereumChain",
1461
+ "wallet_switchEthereumChain",
1462
+ "wallet_watchAsset",
1463
+ ];
1464
+
1317
1465
  class EthereumProvider extends EventEmitter implements IEthereumProvider {
1318
1466
  chainId: string | null = null;
1319
1467
  selectedAddress: string | null = null;
@@ -1418,12 +1566,112 @@ class EthereumProvider extends EventEmitter implements IEthereumProvider {
1418
1566
  }
1419
1567
 
1420
1568
  // IMPORTANT: 사이드 패널을 열어야하는 JSON-RPC 메소드들이 생길 때마다 여기에 추가해야한다.
1421
- const sidePanelOpenNeededJSONRPCMethods = [
1422
- "eth_sendTransaction",
1423
- "personal_sign",
1424
- "eth_signTypedData_v3",
1425
- "eth_signTypedData_v4",
1426
- "wallet_addEthereumChain",
1427
- "wallet_switchEthereumChain",
1569
+ const sidePanelOpenNeededStarknetJSONRPCMethods = [
1428
1570
  "wallet_watchAsset",
1571
+ "wallet_switchStarknetChain",
1572
+ "wallet_addInvokeTransaction",
1573
+ "wallet_addDeclareTransaction",
1574
+ "wallet_signTypedData",
1429
1575
  ];
1576
+
1577
+ class StarknetProvider implements IStarknetProvider {
1578
+ id: string = "";
1579
+ name: string = "";
1580
+ version: string = "";
1581
+ icon: string = "";
1582
+
1583
+ isConnected: boolean = false;
1584
+
1585
+ chainId?: string | undefined;
1586
+
1587
+ selectedAddress?: string | undefined;
1588
+
1589
+ account?: AccountInterface;
1590
+
1591
+ provider?: ProviderInterface;
1592
+
1593
+ constructor(
1594
+ protected readonly keplr: Keplr,
1595
+ protected readonly requester: MessageRequester
1596
+ ) {}
1597
+
1598
+ protected async protectedEnableAccess(): Promise<void> {
1599
+ return new Promise((resolve, reject) => {
1600
+ let f = false;
1601
+
1602
+ sendSimpleMessage(
1603
+ this.requester,
1604
+ BACKGROUND_PORT,
1605
+ "permission-interactive",
1606
+ "enable-access-for-starknet",
1607
+ {}
1608
+ )
1609
+ .then(resolve)
1610
+ .catch(reject)
1611
+ .finally(() => (f = true));
1612
+
1613
+ setTimeout(() => {
1614
+ if (!f) {
1615
+ this.keplr.protectedTryOpenSidePanelIfEnabled();
1616
+ }
1617
+ }, 100);
1618
+ });
1619
+ }
1620
+
1621
+ async request<T = unknown>({
1622
+ type,
1623
+ params,
1624
+ }: {
1625
+ type: string;
1626
+ params?: unknown[] | Record<string, unknown>;
1627
+ }): Promise<T> {
1628
+ if (typeof type !== "string") {
1629
+ throw new Error("Invalid parameter: `type` must be a string");
1630
+ }
1631
+
1632
+ // XXX: 원래 enable을 미리하지 않아도 백그라운드에서 알아서 처리해주는 시스템이였는데...
1633
+ // side panel에서는 불가능하기 때문에 이젠 provider에서 permission도 관리해줘야한다...
1634
+ // request의 경우는 일종의 쿼리이기 때문에 언제 결과가 올지 알 수 없다. 그러므로 미리 권한 처리를 해야한다.
1635
+ if (type !== "keplr_initStarknetProviderState") {
1636
+ await this.protectedEnableAccess();
1637
+ }
1638
+
1639
+ return new Promise((resolve, reject) => {
1640
+ let f = false;
1641
+ sendSimpleMessage(
1642
+ this.requester,
1643
+ BACKGROUND_PORT,
1644
+ "keyring-starknet",
1645
+ "request-json-rpc-to-starknet",
1646
+ {
1647
+ // 메시지에서 type이라는 변수가 쓰이기 때문에 method로 변경한다.
1648
+ method: type,
1649
+ params,
1650
+ }
1651
+ )
1652
+ .then(resolve)
1653
+ .catch(reject)
1654
+ .finally(() => (f = true));
1655
+
1656
+ setTimeout(() => {
1657
+ if (!f && sidePanelOpenNeededStarknetJSONRPCMethods.includes(type)) {
1658
+ this.keplr.protectedTryOpenSidePanelIfEnabled();
1659
+ }
1660
+ }, 100);
1661
+ });
1662
+ }
1663
+ async enable(_options?: {
1664
+ starknetVersion?: "v4" | "v5";
1665
+ }): Promise<string[]> {
1666
+ throw new Error("Method not implemented.");
1667
+ }
1668
+ isPreauthorized(): Promise<boolean> {
1669
+ throw new Error("Method not implemented.");
1670
+ }
1671
+ on<E extends WalletEvents>(_event: E["type"], _handleEvent: E["handler"]) {
1672
+ throw new Error("Method not implemented.");
1673
+ }
1674
+ off<E extends WalletEvents>(_event: E["type"], _handleEvent: E["handler"]) {
1675
+ throw new Error("Method not implemented.");
1676
+ }
1677
+ }