Skip to content

Commit 5658ee1

Browse files
committed
Inject keplr provider
1 parent 2aff2b8 commit 5658ee1

File tree

9 files changed

+1179
-1
lines changed

9 files changed

+1179
-1
lines changed

package-lock.json

Lines changed: 1104 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
}
2323
},
2424
"devDependencies": {
25+
"@keplr-wallet/types": "^0.11.12",
2526
"@parcel/config-webextension": "^2.4.1",
2627
"@parcel/runtime-browser-hmr": "^2.4.1",
2728
"@parcel/transformer-image": "^2.4.1",

src/background/messaging.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,11 @@ export const rpcListener = async (message: any) => {
6868
case 'solana':
6969
network = 'solana_devnet'; // TODO
7070
break;
71+
case 'keplr':
72+
// need to improve here
73+
network = 'cosmos_testnet';
74+
// config here
75+
break;
7176
default:
7277
throw new Error(`Unknown or missing provider type ${message.__provider}`);
7378
}

src/confirmation-window/index.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import App from './App';
44
import getSdk from 'pointsdk/pointsdk/sdk';
55
import getEthProvider from 'pointsdk/pointsdk/ethProvider';
66
import getSolanaProvider from 'pointsdk/pointsdk/solanaProvider';
7+
import getKeplrProvider from '../pointsdk/keplrProvider';
78
const version = browser.runtime.getManifest().version;
89
const point = getSdk('https://confirmation-window', version);
910
const ethereum = getEthProvider();
@@ -14,6 +15,7 @@ const renderWindow = () => {
1415
window.point = point;
1516
window.ethereum = ethereum;
1617
window.solana = solana;
18+
window.keplr = getKeplrProvider();
1719
ReactDOM.render(<App />, document.getElementById('point-confirmation-window'));
1820
} catch (e) {
1921
console.error('Failed to render confirmation window', e);

src/pointsdk/browser.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,12 @@ import getEthProvider from 'pointsdk/pointsdk/ethProvider';
33
import getSolanaProvider from 'pointsdk/pointsdk/solanaProvider';
44
import NETWORKS from 'pointsdk/constants/networks';
55
import swal from 'sweetalert2';
6+
import getKeplrProvider from './keplrProvider';
67

78
// eslint-disable-next-line prettier/prettier
89
window.point = getSdk(window.location.origin, String(process.env.PACKAGE_VERSION), swal);
910
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
1011
window.point.networks = NETWORKS;
1112
window.ethereum = getEthProvider();
1213
window.solana = getSolanaProvider();
14+
window.keplr = getKeplrProvider();

src/pointsdk/index.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import getSdk from 'pointsdk/pointsdk/sdk';
33
import getEthProvider from 'pointsdk/pointsdk/ethProvider';
44
import getSolanaProvider from 'pointsdk/pointsdk/solanaProvider';
55
import NETWORKS from 'pointsdk/constants/networks';
6+
import getKeplrProvider from './keplrProvider';
67

78
const version = browser.runtime.getManifest().version;
89
try {
@@ -25,3 +26,9 @@ try {
2526
} catch (e) {
2627
console.error('Failed to inject window.solana: ', e);
2728
}
29+
30+
try {
31+
window.wrappedJSObject.eval(`window.keplr = (${getKeplrProvider.toString()})();`);
32+
} catch (e) {
33+
console.error('Failed to inject window.keplr: ', e);
34+
}

src/pointsdk/keplrProvider.ts

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
2+
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
3+
4+
export default function getKeplrProvider() {
5+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
6+
const handleRequest = (request: Record<string, any>) =>
7+
new Promise((resolve, reject) => {
8+
const id = Math.random();
9+
const handler = (e: MessageEvent) => {
10+
if (e.data.__page_req_id === id && e.data.__direction === 'to_page') {
11+
window.removeEventListener('message', handler);
12+
if (e.data.__error) {
13+
const {module, code, message} = e.data.__error;
14+
return reject({module, code, message});
15+
}
16+
delete e.data.__page_req_id;
17+
delete e.data.__direction;
18+
resolve(Object.keys(e.data).length > 0 ? e.data : undefined);
19+
}
20+
};
21+
22+
window.addEventListener('message', handler);
23+
24+
window.postMessage({
25+
...request,
26+
__message_type: 'rpc',
27+
__provider: 'keplr',
28+
__page_req_id: id,
29+
__direction: 'to_bg'
30+
});
31+
});
32+
return {
33+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
34+
enable: async function (chainIds: string | string[]) {
35+
return handleRequest({
36+
method: `keplr_enable as string}`,
37+
params: [chainIds]
38+
});
39+
},
40+
getKey: async function (chainId: string) {
41+
return handleRequest({
42+
method: 'keplr_getKey',
43+
params: [chainId]
44+
});
45+
}
46+
};
47+
}
48+
/* TODO
49+
signAmino(chainId: string, signer: string, signDoc: StdSignDoc): Promise<AminoSignResponse>
50+
signDirect(chainId:string, signer:string, signDoc: {
51+
sendTx(chainId: string, tx: Uint8Array, mode: BroadcastMode): Promise<Uint8Array>;
52+
sendBack(result)
53+
signArbitrary(chainId: string, signer: string, data: string | Uint8Array): Promise<StdSignature>;
54+
verifyArbitrary(chainId: string, signer: string, data: string | Uint8Array, signature: StdSignature): Promise<boolean>;
55+
signEthereum(chainId: string, signer: string, // Bech32 address, not hex data: string | Uint8Array, type: 'message' | 'transaction'
56+
*/

src/pointsdk/sdk.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ const getSdk = (host: string, version: string, swal: any): PointType => {
3737
const gatewayAlert = async () => {
3838
swal.fire({
3939
title: 'Demo mode',
40-
html: `You cannot make writing operations right here but you can download Point Browser and have the full web3 experience.
40+
html: `You cannot make writing operations right here but you can download Point Browser and have the full web3 experience.
4141
<a href="https://pointnetwork.io/download" target="_blank" rel="noopener noreferrer">https://pointnetwork.io/download</a>`,
4242
icon: 'info'
4343
});

src/types/global.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,6 @@ declare global {
55
point: any;
66
ethereum: any;
77
solana: any;
8+
keplr: any;
89
}
910
}

0 commit comments

Comments
 (0)