@getpara/wagmi-v2-integration 1.2.0 → 1.3.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/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- export * from './paraConnector.js';
2
- export * from './ParaEIP1193Provider.js';
1
+ "use client";
2
+ import{injected as O}from"wagmi/connectors";import{ProviderRpcError as p,webSocket as E,publicActions as y,http as S,formatTransaction as b}from"viem";import{EventEmitter as x}from"eventemitter3";import{extractRpcUrls as D}from"@wagmi/core";import{getViemChain as M,createParaViemClient as N,createParaAccount as R}from"@getpara/viem-v2-integration";import{decimalToHex as h,hexToDecimal as u}from"@getpara/react-sdk";import{ParaModal as A}from"@getpara/react-sdk";import{jsx as T}from"react/jsx-runtime";function P(n,o,e){let s=document.getElementById("para-modal"),t=s??document.createElement("div");t.id="para-modal",s||document.body.appendChild(t);let a=()=>{e(),o.onClose&&o.onClose(),r(!1)},r=async i=>{let d=T(A,{...o,onClose:a,para:n,isOpen:i});try{(await import("react-dom/client")).createRoot(t).render(d)}catch{(await import("react-dom")).render(d,t)}};r(!0)}var w="@CAPSULE/chainId",_=6e5,H={setItem:()=>{},getItem:()=>null},m=class extends x{constructor(e){super();this.getRpcUrlsFromViemChain=e=>D({chain:e,transports:this.transports});this.wagmiChainToAddEthereumChainParameters=e=>{let s=h(`${e.id}`);return[s,{chainId:s,chainName:e.name,nativeCurrency:e.nativeCurrency,rpcUrls:this.getRpcUrlsFromViemChain(e)}]};this.wagmiChainsToAddEthereumChainParameters=e=>Object.fromEntries(e.map(this.wagmiChainToAddEthereumChainParameters));this.accountFromAddress=e=>R(this.para,e);this.setCurrentChain=e=>{let s=this.chains[e];this.setChainId(e);let t=this.viemChains[e]||M(u(e)),a=this.getRpcUrlsFromViemChain(t),r;this.transports[t.id]?r=this.transports[t.id]:a[0].startsWith("ws")?r=E(s.rpcUrls[0]):(r=S(a[0]),this.chainTransportSubscribe=void 0);let i=r({chain:t});i.config.type==="ws"&&(this.chainTransportSubscribe=i.value.subscribe),this.walletClient=N(this.para,{chain:t,transport:r},{noAccount:!0}).extend(y),this.emit("chainChanged",this.currentHexChainId)};this.closeModal=()=>{this.isModalClosed=!0};this.request=async e=>{let{method:s,params:t}=e;switch(s){case"eth_accounts":return this.accounts;case"eth_chainId":return this.currentHexChainId;case"eth_requestAccounts":{if(await this.para.isFullyLoggedIn())return this.accounts;this.isModalClosed=!1;let a=()=>{this.isModalClosed=!0};this.disableModal||P(this.para,this.modalProps,a);let r=Date.now();for(;Date.now()-r<_;){if(await new Promise(i=>setTimeout(i,2e3)),await this.para.isFullyLoggedIn()){let i=this.accounts;return this.emit("accountsChanged",i),i}if(this.isModalClosed)throw new p(new Error("user closed modal"),{code:4001,shortMessage:"user closed modal"})}throw new p(new Error("timed out waiting for user to log in"),{code:4001,shortMessage:"timed out waiting for user to log in"})}case"eth_sendTransaction":{let a=t[0].from;return this.walletClient.sendTransaction({...b(t[0]),chain:void 0,account:this.accountFromAddress(a)})}case"eth_sign":case"personal_sign":return this.walletClient.signMessage({message:{raw:t[0]},account:this.accountFromAddress(t[1])});case"eth_signTransaction":{let a=t[0].from;return this.accountFromAddress(a).signTransaction(b(t[0]))}case"eth_signTypedData_v4":{let a=t[0],r=t[1];return typeof r=="string"&&(r=JSON.parse(r)),this.walletClient.signTypedData({...r,account:this.accountFromAddress(a)})}case"eth_subscribe":{if(!this.chainTransportSubscribe)throw new p(new Error("chain does not support subscriptions"),{code:4200,shortMessage:"chain does not support subscriptions"});return(await this.chainTransportSubscribe({params:t,onData:r=>{this.emit("message",{type:"eth_subscription",data:r})}})).subscriptionId}case"wallet_addEthereumChain":return this.chains[t[0].chainId]||(this.chains[t[0].chainId]=t[0]),null;case"wallet_getPermissions":return[];case"wallet_requestPermissions":return[];case"wallet_switchEthereumChain":{if(!this.chains[t[0].chainId]){let a=M(u(t[0].chainId)),[r,i]=this.wagmiChainToAddEthereumChainParameters(a);this.chains[r]=i,this.setCurrentChain(t[0].chainId)}return this.currentHexChainId!==t[0].chainId&&this.setCurrentChain(t[0].chainId),null}case"wallet_watchAsset":return!1;default:return this.walletClient.request({method:s,params:t})}};this.storage=e.storageOverride||typeof window>"u"?H:sessionStorage,this.isModalClosed=!0,this.para=e.para,this.modalProps={...e},this.disableModal=!!e.disableModal,this.viemChains=e.chains.reduce((a,r)=>(a[h(`${r.id}`)]=r,a),{}),this.chains=this.wagmiChainsToAddEthereumChainParameters(e.chains),this.transports=e.transports;let s=this.getStorageChainId()||e.chainId,t=this.chains[h(s)]?s:`${e.chains[0].id}`;this.setCurrentChain(h(t)),this.emit("connect",{chainId:this.currentHexChainId})}get accounts(){return this.para.getWalletsByType("EVM").map(e=>e.address)}getStorageChainId(){return this.storage.getItem(w)}setChainId(e){this.currentHexChainId=e,this.storage.setItem(w,u(e))}};import{createConnector as W}from"wagmi";var f="para",v="Para",F="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjE2IiBoZWlnaHQ9IjIwNCIgdmlld0JveD0iMCAwIDIxNiAyMDQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxwYXRoIGQ9Ik02MCAwSDE0NEMxODMuNzY0IDAgMjE2IDMyLjIzNTUgMjE2IDcyQzIxNiAxMTEuNzY1IDE4My43NjQgMTQ0IDE0NCAxNDRIOTZDODIuNzQ1MiAxNDQgNzIgMTU0Ljc0NSA3MiAxNjhWMjA0SDBWMTMySDM2QzQ5LjI1NDggMTMyIDYwIDEyMS4yNTUgNjAgMTA4TDYwIDBaIiBmaWxsPSJibGFjayIvPgo8L3N2Zz4K",me=({para:n,chains:o,disableModal:e,storageOverride:s,options:t,iconOverride:a,nameOverride:r,idOverride:i,transports:d,...l})=>W(c=>{let C=[...c.chains],I=new m({para:n,chainId:`${C[0].id}`,chains:C,disableModal:e,storageOverride:s,transports:d||c.transports,...l}),g=O({target:{name:v,id:i??f,provider:I},...t})(c);return{...g,type:i??f,name:r??v,icon:a??F,disconnect:async()=>{I.closeModal(),await g.disconnect(),n.logout()}}});export{m as ParaEIP1193Provider,me as paraConnector};
Binary file
Binary file
package/package.json CHANGED
@@ -1,16 +1,17 @@
1
1
  {
2
2
  "name": "@getpara/wagmi-v2-integration",
3
- "version": "1.2.0",
3
+ "version": "1.3.0",
4
4
  "type": "module",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
7
7
  "sideEffects": false,
8
8
  "dependencies": {
9
- "@getpara/react-sdk": "1.2.0",
10
- "@getpara/viem-v2-integration": "1.2.0"
9
+ "@getpara/react-sdk": "1.3.0",
10
+ "@getpara/viem-v2-integration": "1.3.0"
11
11
  },
12
12
  "scripts": {
13
- "build": "rm -rf dist && tsc"
13
+ "build": "rm -rf dist && yarn typegen && node ./scripts/build.mjs",
14
+ "typegen": "tsc --emitDeclarationOnly"
14
15
  },
15
16
  "devDependencies": {
16
17
  "typescript": "5.1.6",
@@ -27,5 +28,5 @@
27
28
  "dist",
28
29
  "package.json"
29
30
  ],
30
- "gitHead": "a9162c59be1456292d46c56787c1d5bf313bf24b"
31
+ "gitHead": "2d421556a0a1497abd08e18dca94f08ec3ad640b"
31
32
  }
@@ -1,224 +0,0 @@
1
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
- return new (P || (P = Promise))(function (resolve, reject) {
4
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
- step((generator = generator.apply(thisArg, _arguments || [])).next());
8
- });
9
- };
10
- import { ProviderRpcError, webSocket, publicActions, http, formatTransaction, } from 'viem';
11
- import { EventEmitter } from 'eventemitter3';
12
- import { extractRpcUrls } from '@wagmi/core';
13
- import { getViemChain, createParaViemClient, createParaAccount } from '@getpara/viem-v2-integration';
14
- import { decimalToHex, hexToDecimal } from '@getpara/react-sdk';
15
- import { renderModal } from './connectorModal.js';
16
- const STORAGE_CHAIN_ID_KEY = '@CAPSULE/chainId';
17
- const TEN_MINUTES_MS = 600000;
18
- const serverSessionStorageStub = {
19
- setItem: () => { },
20
- getItem: () => null,
21
- };
22
- export class ParaEIP1193Provider extends EventEmitter {
23
- constructor(opts) {
24
- super();
25
- this.getRpcUrlsFromViemChain = (chain) => {
26
- return extractRpcUrls({ chain, transports: this.transports });
27
- };
28
- this.wagmiChainToAddEthereumChainParameters = (chain) => {
29
- const hexChainId = decimalToHex(`${chain.id}`);
30
- return [
31
- hexChainId,
32
- {
33
- chainId: hexChainId,
34
- chainName: chain.name,
35
- nativeCurrency: chain.nativeCurrency,
36
- rpcUrls: this.getRpcUrlsFromViemChain(chain),
37
- },
38
- ];
39
- };
40
- this.wagmiChainsToAddEthereumChainParameters = (chains) => {
41
- return Object.fromEntries(chains.map(this.wagmiChainToAddEthereumChainParameters));
42
- };
43
- this.accountFromAddress = (address) => {
44
- return createParaAccount(this.para, address);
45
- };
46
- this.setCurrentChain = (chainId) => {
47
- const chain = this.chains[chainId];
48
- this.setChainId(chainId);
49
- const viemChain = this.viemChains[chainId] || getViemChain(hexToDecimal(chainId));
50
- const rpcUrls = this.getRpcUrlsFromViemChain(viemChain);
51
- let transport;
52
- if (this.transports[viemChain.id]) {
53
- transport = this.transports[viemChain.id];
54
- }
55
- else if (rpcUrls[0].startsWith('ws')) {
56
- transport = webSocket(chain.rpcUrls[0]);
57
- }
58
- else {
59
- transport = http(rpcUrls[0]);
60
- this.chainTransportSubscribe = undefined;
61
- }
62
- const chainTransport = transport({
63
- chain: viemChain,
64
- });
65
- if (chainTransport.config.type === 'ws') {
66
- this.chainTransportSubscribe = chainTransport.value.subscribe;
67
- }
68
- this.walletClient = createParaViemClient(this.para, {
69
- chain: viemChain,
70
- transport,
71
- // @ts-ignore
72
- }, { noAccount: true }).extend(publicActions);
73
- this.emit('chainChanged', this.currentHexChainId);
74
- };
75
- this.closeModal = () => {
76
- this.isModalClosed = true;
77
- };
78
- this.request = (args) => __awaiter(this, void 0, void 0, function* () {
79
- const { method, params } = args;
80
- switch (method) {
81
- case 'eth_accounts': {
82
- return this.accounts;
83
- }
84
- case 'eth_chainId': {
85
- return this.currentHexChainId;
86
- }
87
- case 'eth_requestAccounts': {
88
- if (yield this.para.isFullyLoggedIn()) {
89
- return this.accounts;
90
- }
91
- this.isModalClosed = false;
92
- const onClose = () => {
93
- this.isModalClosed = true;
94
- };
95
- if (!this.disableModal) {
96
- renderModal(this.para, this.modalProps, onClose);
97
- }
98
- // check if para is fully logged in every 2 seconds for 10 minutes at most
99
- const now = Date.now();
100
- while (Date.now() - now < TEN_MINUTES_MS) {
101
- yield new Promise(resolve => setTimeout(resolve, 2000));
102
- if (yield this.para.isFullyLoggedIn()) {
103
- const accounts = this.accounts;
104
- this.emit('accountsChanged', accounts);
105
- return accounts;
106
- }
107
- if (this.isModalClosed) {
108
- throw new ProviderRpcError(new Error('user closed modal'), {
109
- code: 4001,
110
- shortMessage: 'user closed modal',
111
- });
112
- }
113
- }
114
- throw new ProviderRpcError(new Error('timed out waiting for user to log in'), {
115
- code: 4001,
116
- shortMessage: 'timed out waiting for user to log in',
117
- });
118
- }
119
- case 'eth_sendTransaction': {
120
- const fromAddress = params[0].from;
121
- return this.walletClient.sendTransaction(Object.assign(Object.assign({}, formatTransaction(params[0])), { chain: undefined, account: this.accountFromAddress(fromAddress) }));
122
- }
123
- case 'eth_sign':
124
- case 'personal_sign': {
125
- return this.walletClient.signMessage({
126
- message: { raw: params[0] },
127
- account: this.accountFromAddress(params[1]),
128
- });
129
- }
130
- case 'eth_signTransaction': {
131
- const fromAddress = params[0].from;
132
- return this.accountFromAddress(fromAddress).signTransaction(formatTransaction(params[0]));
133
- }
134
- case 'eth_signTypedData_v4': {
135
- const fromAddress = params[0];
136
- let typedMessage = params[1];
137
- if (typeof typedMessage === 'string') {
138
- typedMessage = JSON.parse(typedMessage);
139
- }
140
- return this.walletClient.signTypedData(Object.assign(Object.assign({}, typedMessage), { account: this.accountFromAddress(fromAddress) }));
141
- }
142
- case 'eth_subscribe': {
143
- if (!this.chainTransportSubscribe) {
144
- throw new ProviderRpcError(new Error('chain does not support subscriptions'), {
145
- code: 4200,
146
- shortMessage: 'chain does not support subscriptions',
147
- });
148
- }
149
- const res = yield this.chainTransportSubscribe({
150
- params: params,
151
- onData: data => {
152
- this.emit('message', {
153
- type: 'eth_subscription',
154
- data,
155
- });
156
- },
157
- });
158
- return res.subscriptionId;
159
- }
160
- case 'wallet_addEthereumChain': {
161
- if (!this.chains[params[0].chainId]) {
162
- this.chains[params[0].chainId] = params[0];
163
- }
164
- return null;
165
- }
166
- case 'wallet_getPermissions': {
167
- // para doesn't support this type of functionality for now
168
- return [];
169
- }
170
- case 'wallet_requestPermissions': {
171
- // para doesn't support this type of functionality for now
172
- return [];
173
- }
174
- case 'wallet_switchEthereumChain': {
175
- if (!this.chains[params[0].chainId]) {
176
- const chain = getViemChain(hexToDecimal(params[0].chainId));
177
- const [hexChainId, addEthereumChainParameter] = this.wagmiChainToAddEthereumChainParameters(chain);
178
- this.chains[hexChainId] = addEthereumChainParameter;
179
- this.setCurrentChain(params[0].chainId);
180
- }
181
- if (this.currentHexChainId !== params[0].chainId) {
182
- this.setCurrentChain(params[0].chainId);
183
- }
184
- return null;
185
- }
186
- case 'wallet_watchAsset': {
187
- // para doesn't support this type of functionality for now
188
- return false;
189
- }
190
- default: {
191
- return this.walletClient.request({
192
- method,
193
- params,
194
- });
195
- }
196
- }
197
- });
198
- this.storage = opts.storageOverride || typeof window === 'undefined' ? serverSessionStorageStub : sessionStorage;
199
- this.isModalClosed = true;
200
- this.para = opts.para;
201
- this.modalProps = Object.assign({}, opts);
202
- this.disableModal = !!opts.disableModal;
203
- this.viemChains = opts.chains.reduce((acc, curChain) => {
204
- acc[decimalToHex(`${curChain.id}`)] = curChain;
205
- return acc;
206
- }, {});
207
- this.chains = this.wagmiChainsToAddEthereumChainParameters(opts.chains);
208
- this.transports = opts.transports;
209
- const defaultChainId = this.getStorageChainId() || opts.chainId;
210
- const currentChainId = this.chains[decimalToHex(defaultChainId)] ? defaultChainId : `${opts.chains[0].id}`;
211
- this.setCurrentChain(decimalToHex(currentChainId));
212
- this.emit('connect', { chainId: this.currentHexChainId });
213
- }
214
- get accounts() {
215
- return this.para.getWalletsByType('EVM').map(w => w.address);
216
- }
217
- getStorageChainId() {
218
- return this.storage.getItem(STORAGE_CHAIN_ID_KEY);
219
- }
220
- setChainId(hexChainId) {
221
- this.currentHexChainId = hexChainId;
222
- this.storage.setItem(STORAGE_CHAIN_ID_KEY, hexToDecimal(hexChainId));
223
- }
224
- }
@@ -1,37 +0,0 @@
1
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
- return new (P || (P = Promise))(function (resolve, reject) {
4
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
- step((generator = generator.apply(thisArg, _arguments || [])).next());
8
- });
9
- };
10
- import { jsx as _jsx } from "react/jsx-runtime";
11
- import { ParaModal } from '@getpara/react-sdk';
12
- export function renderModal(para, modalProps, onCloseArg) {
13
- const existingContainer = document.getElementById('para-modal');
14
- const container = existingContainer !== null && existingContainer !== void 0 ? existingContainer : document.createElement('div');
15
- container.id = 'para-modal';
16
- if (!existingContainer) {
17
- document.body.appendChild(container); // Add the container to the DOM
18
- }
19
- const onClose = () => {
20
- onCloseArg();
21
- modalProps.onClose && modalProps.onClose();
22
- render(false);
23
- };
24
- const render = (isOpen) => __awaiter(this, void 0, void 0, function* () {
25
- const Modal = _jsx(ParaModal, Object.assign({}, modalProps, { onClose: onClose, para: para, isOpen: isOpen }));
26
- try {
27
- const client = yield import('react-dom/client');
28
- const root = client.createRoot(container);
29
- root.render(Modal);
30
- }
31
- catch (e) {
32
- const ReactDOM = yield import('react-dom');
33
- ReactDOM.render(Modal, container);
34
- }
35
- });
36
- render(true);
37
- }
@@ -1,45 +0,0 @@
1
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
- return new (P || (P = Promise))(function (resolve, reject) {
4
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
- step((generator = generator.apply(thisArg, _arguments || [])).next());
8
- });
9
- };
10
- var __rest = (this && this.__rest) || function (s, e) {
11
- var t = {};
12
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
13
- t[p] = s[p];
14
- if (s != null && typeof Object.getOwnPropertySymbols === "function")
15
- for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
16
- if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
17
- t[p[i]] = s[p[i]];
18
- }
19
- return t;
20
- };
21
- import { injected } from 'wagmi/connectors';
22
- import { ParaEIP1193Provider } from './ParaEIP1193Provider.js';
23
- import { createConnector } from 'wagmi';
24
- const PARA_ID = 'para';
25
- const PARA_NAME = 'Para';
26
- const PARA_ICON = 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjE2IiBoZWlnaHQ9IjIwNCIgdmlld0JveD0iMCAwIDIxNiAyMDQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxwYXRoIGQ9Ik02MCAwSDE0NEMxODMuNzY0IDAgMjE2IDMyLjIzNTUgMjE2IDcyQzIxNiAxMTEuNzY1IDE4My43NjQgMTQ0IDE0NCAxNDRIOTZDODIuNzQ1MiAxNDQgNzIgMTU0Ljc0NSA3MiAxNjhWMjA0SDBWMTMySDM2QzQ5LjI1NDggMTMyIDYwIDEyMS4yNTUgNjAgMTA4TDYwIDBaIiBmaWxsPSJibGFjayIvPgo8L3N2Zz4K';
27
- export const paraConnector = (_a) => {
28
- var { para, chains: _chains, disableModal, storageOverride, options, iconOverride, nameOverride, idOverride, transports } = _a, modalProps = __rest(_a, ["para", "chains", "disableModal", "storageOverride", "options", "iconOverride", "nameOverride", "idOverride", "transports"]);
29
- return createConnector(config => {
30
- const chains = [...config.chains];
31
- const eip1193Provider = new ParaEIP1193Provider(Object.assign({ para, chainId: `${chains[0].id}`, chains,
32
- disableModal,
33
- storageOverride, transports: transports || config.transports }, modalProps));
34
- const injectedObj = injected(Object.assign({ target: {
35
- name: PARA_NAME,
36
- id: idOverride !== null && idOverride !== void 0 ? idOverride : PARA_ID,
37
- provider: eip1193Provider,
38
- } }, options))(config);
39
- return Object.assign(Object.assign({}, injectedObj), { type: idOverride !== null && idOverride !== void 0 ? idOverride : PARA_ID, name: nameOverride !== null && nameOverride !== void 0 ? nameOverride : PARA_NAME, icon: iconOverride !== null && iconOverride !== void 0 ? iconOverride : PARA_ICON, disconnect: () => __awaiter(void 0, void 0, void 0, function* () {
40
- eip1193Provider.closeModal();
41
- yield injectedObj.disconnect();
42
- para.logout();
43
- }) });
44
- });
45
- };