@xyo-network/react-chain-provider 1.15.16 → 1.15.18
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/browser/components/connected/ConnectAccountsStack.d.ts +1 -0
- package/dist/browser/components/connected/ConnectAccountsStack.d.ts.map +1 -1
- package/dist/browser/hooks/helpers/index.d.ts +1 -0
- package/dist/browser/hooks/helpers/index.d.ts.map +1 -1
- package/dist/browser/hooks/helpers/transaction/Confirmation.d.ts +34 -0
- package/dist/browser/hooks/helpers/transaction/Confirmation.d.ts.map +1 -0
- package/dist/browser/hooks/helpers/transaction/index.d.ts +2 -0
- package/dist/browser/hooks/helpers/transaction/index.d.ts.map +1 -0
- package/dist/browser/hooks/index.d.ts +1 -0
- package/dist/browser/hooks/index.d.ts.map +1 -1
- package/dist/browser/hooks/useConfirmTransactionBase.d.ts +8 -0
- package/dist/browser/hooks/useConfirmTransactionBase.d.ts.map +1 -0
- package/dist/browser/hooks/useConnectAccount.d.ts +1 -1
- package/dist/browser/hooks/useConnectAccount.d.ts.map +1 -1
- package/dist/browser/index.mjs +208 -35
- package/dist/browser/index.mjs.map +1 -1
- package/package.json +7 -5
- package/src/components/connected/ConnectAccountsStack.tsx +8 -0
- package/src/hooks/helpers/index.ts +1 -0
- package/src/hooks/helpers/transaction/Confirmation.ts +127 -0
- package/src/hooks/helpers/transaction/index.ts +1 -0
- package/src/hooks/index.ts +1 -0
- package/src/hooks/useConfirmTransactionBase.ts +63 -0
- package/src/hooks/useConnectAccount.ts +12 -6
|
@@ -11,6 +11,7 @@ export interface ConnectClientAccountsStackProps extends StackProps {
|
|
|
11
11
|
}>;
|
|
12
12
|
NoWalletInstalledComponent?: ComponentType;
|
|
13
13
|
onAccountConnected?: (account: Address) => void;
|
|
14
|
+
onCancel?: () => void;
|
|
14
15
|
timeout?: number;
|
|
15
16
|
}
|
|
16
17
|
export declare const ConnectAccountsStack: React.FC<ConnectClientAccountsStackProps>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConnectAccountsStack.d.ts","sourceRoot":"","sources":["../../../../src/components/connected/ConnectAccountsStack.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAK/C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAK1C,OAAO,KAAK,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,OAAO,CAAA;AAC7D,OAAO,KAAoB,MAAM,OAAO,CAAA;AA4BxC,MAAM,WAAW,+BAAgC,SAAQ,UAAU;IACjE,gBAAgB,CAAC,EAAE,aAAa,CAAC;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IACtD,gBAAgB,CAAC,EAAE,aAAa,CAAC;QAAE,OAAO,CAAC,EAAE,iBAAiB,CAAC,WAAW,CAAC,CAAA;KAAE,CAAC,CAAA;IAC9E,0BAA0B,CAAC,EAAE,aAAa,CAAA;IAC1C,kBAAkB,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAA;IAC/C,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,eAAO,MAAM,oBAAoB,EAAE,KAAK,CAAC,EAAE,CAAC,+BAA+B,
|
|
1
|
+
{"version":3,"file":"ConnectAccountsStack.d.ts","sourceRoot":"","sources":["../../../../src/components/connected/ConnectAccountsStack.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAK/C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAK1C,OAAO,KAAK,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,OAAO,CAAA;AAC7D,OAAO,KAAoB,MAAM,OAAO,CAAA;AA4BxC,MAAM,WAAW,+BAAgC,SAAQ,UAAU;IACjE,gBAAgB,CAAC,EAAE,aAAa,CAAC;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IACtD,gBAAgB,CAAC,EAAE,aAAa,CAAC;QAAE,OAAO,CAAC,EAAE,iBAAiB,CAAC,WAAW,CAAC,CAAA;KAAE,CAAC,CAAA;IAC9E,0BAA0B,CAAC,EAAE,aAAa,CAAA;IAC1C,kBAAkB,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAA;IAC/C,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAA;IACrB,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,eAAO,MAAM,oBAAoB,EAAE,KAAK,CAAC,EAAE,CAAC,+BAA+B,CAuC1E,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/hooks/helpers/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/hooks/helpers/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAA;AACjC,cAAc,wBAAwB,CAAA"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { Hash } from '@xylabs/hex';
|
|
2
|
+
import type { Promisable } from '@xylabs/promise';
|
|
3
|
+
import type { SignedHydratedTransaction, XyoViewer } from '@xyo-network/xl1-protocol';
|
|
4
|
+
export type ConfirmationStatusUpdate = {
|
|
5
|
+
blockNumber: number;
|
|
6
|
+
confirmed: boolean;
|
|
7
|
+
error?: Error;
|
|
8
|
+
progress?: number;
|
|
9
|
+
remainingBlocks?: number;
|
|
10
|
+
};
|
|
11
|
+
export type TransactionConfirmationParams = {
|
|
12
|
+
onStatusUpdate?: (status: ConfirmationStatusUpdate) => void;
|
|
13
|
+
transaction: SignedHydratedTransaction;
|
|
14
|
+
txHash: Hash;
|
|
15
|
+
viewer: XyoViewer;
|
|
16
|
+
};
|
|
17
|
+
export declare class TransactionConfirmationStatus {
|
|
18
|
+
private readonly _params;
|
|
19
|
+
private active;
|
|
20
|
+
constructor(params: TransactionConfirmationParams);
|
|
21
|
+
get exp(): number;
|
|
22
|
+
get nbf(): number;
|
|
23
|
+
get onStatusUpdate(): TransactionConfirmationParams['onStatusUpdate'];
|
|
24
|
+
get params(): TransactionConfirmationParams;
|
|
25
|
+
get transaction(): SignedHydratedTransaction;
|
|
26
|
+
get txHash(): Hash;
|
|
27
|
+
get viewer(): XyoViewer;
|
|
28
|
+
static create(params: TransactionConfirmationParams): Promisable<TransactionConfirmationStatus>;
|
|
29
|
+
start(): Promise<void>;
|
|
30
|
+
stop(): Promisable<void>;
|
|
31
|
+
private checkBlock;
|
|
32
|
+
private checkConfirmation;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=Confirmation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Confirmation.d.ts","sourceRoot":"","sources":["../../../../../src/hooks/helpers/transaction/Confirmation.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;AACvC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAEjD,OAAO,KAAK,EAAE,yBAAyB,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAA;AAErF,MAAM,MAAM,wBAAwB,GAAG;IACrC,WAAW,EAAE,MAAM,CAAA;IACnB,SAAS,EAAE,OAAO,CAAA;IAClB,KAAK,CAAC,EAAE,KAAK,CAAA;IACb,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,eAAe,CAAC,EAAE,MAAM,CAAA;CACzB,CAAA;AAED,MAAM,MAAM,6BAA6B,GAAG;IAC1C,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,wBAAwB,KAAK,IAAI,CAAA;IAC3D,WAAW,EAAE,yBAAyB,CAAA;IACtC,MAAM,EAAE,IAAI,CAAA;IACZ,MAAM,EAAE,SAAS,CAAA;CAClB,CAAA;AAED,qBAAa,6BAA6B;IACxC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA+B;IACvD,OAAO,CAAC,MAAM,CAAQ;gBAEV,MAAM,EAAE,6BAA6B;IAIjD,IAAI,GAAG,IAAI,MAAM,CAEhB;IAED,IAAI,GAAG,IAAI,MAAM,CAEhB;IAED,IAAI,cAAc,IAAI,6BAA6B,CAAC,gBAAgB,CAAC,CAEpE;IAED,IAAI,MAAM,IAAI,6BAA6B,CAE1C;IAED,IAAI,WAAW,IAAI,yBAAyB,CAE3C;IAED,IAAI,MAAM,IAAI,IAAI,CAEjB;IAED,IAAI,MAAM,IAAI,SAAS,CAEtB;IAED,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,6BAA6B,GAAG,UAAU,CAAC,6BAA6B,CAAC;IAIzF,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAqB5B,IAAI,IAAI,UAAU,CAAC,IAAI,CAAC;YAIV,UAAU;YAsBV,iBAAiB;CAgBhC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/hooks/helpers/transaction/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAA"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
export * from './client/index.ts';
|
|
2
2
|
export * from './helpers/index.ts';
|
|
3
3
|
export * from './useAddressBalance.ts';
|
|
4
|
+
export * from './useConfirmTransactionBase.ts';
|
|
4
5
|
export * from './useConnectAccount.ts';
|
|
5
6
|
export * from './useCurrentBlock.ts';
|
|
6
7
|
export * from './useHttpRpcRunner.ts';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/hooks/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAA;AACjC,cAAc,oBAAoB,CAAA;AAClC,cAAc,wBAAwB,CAAA;AACtC,cAAc,wBAAwB,CAAA;AACtC,cAAc,sBAAsB,CAAA;AACpC,cAAc,uBAAuB,CAAA;AACrC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,mBAAmB,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/hooks/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAA;AACjC,cAAc,oBAAoB,CAAA;AAClC,cAAc,wBAAwB,CAAA;AACtC,cAAc,gCAAgC,CAAA;AAC9C,cAAc,wBAAwB,CAAA;AACtC,cAAc,sBAAsB,CAAA;AACpC,cAAc,uBAAuB,CAAA;AACrC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,mBAAmB,CAAA"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { Hash } from '@xylabs/hex';
|
|
2
|
+
import type { SignedHydratedTransaction, XyoRunner, XyoViewer } from '@xyo-network/xl1-protocol';
|
|
3
|
+
import type { ConfirmationStatusUpdate, TransactionConfirmationParams } from './helpers/index.ts';
|
|
4
|
+
export declare const useConfirmTransactionBase: (transaction?: SignedHydratedTransaction, onBroadcast?: (hash: Hash) => void, onStatusUpdate?: TransactionConfirmationParams["onStatusUpdate"], runner?: XyoRunner, viewer?: XyoViewer) => {
|
|
5
|
+
status: ConfirmationStatusUpdate | undefined;
|
|
6
|
+
transactionConfirmationError: Error | undefined;
|
|
7
|
+
};
|
|
8
|
+
//# sourceMappingURL=useConfirmTransactionBase.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useConfirmTransactionBase.d.ts","sourceRoot":"","sources":["../../../src/hooks/useConfirmTransactionBase.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;AAKvC,OAAO,KAAK,EACV,yBAAyB,EAAE,SAAS,EAAE,SAAS,EAChD,MAAM,2BAA2B,CAAA;AAGlC,OAAO,KAAK,EAAE,wBAAwB,EAAE,6BAA6B,EAAE,MAAM,oBAAoB,CAAA;AAGjG,eAAO,MAAM,yBAAyB,GAEpC,cAAc,yBAAyB,EAEvC,cAAc,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,EAElC,iBAAiB,6BAA6B,CAAC,gBAAgB,CAAC,EAEhE,SAAS,SAAS,EAElB,SAAS,SAAS;;;CAsCnB,CAAA"}
|
|
@@ -9,7 +9,7 @@ export declare const useConnectAccount: (gatewayName?: GatewayName, timeout?: nu
|
|
|
9
9
|
readonly __hex: true;
|
|
10
10
|
}>, {
|
|
11
11
|
readonly __address: true;
|
|
12
|
-
}
|
|
12
|
+
}> | undefined>;
|
|
13
13
|
error: Error | undefined;
|
|
14
14
|
gateway: import("@xyo-network/xl1-protocol").XyoGatewayProvider | undefined;
|
|
15
15
|
timedout: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useConnectAccount.d.ts","sourceRoot":"","sources":["../../../src/hooks/useConnectAccount.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAA;AAK5D,eAAO,MAAM,iBAAiB,GAAI,cAAa,WAA4B,EAAE,UAAU,MAAM;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"useConnectAccount.d.ts","sourceRoot":"","sources":["../../../src/hooks/useConnectAccount.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAA;AAK5D,eAAO,MAAM,iBAAiB,GAAI,cAAa,WAA4B,EAAE,UAAU,MAAM;;;;;;;;;;;;;;CA0B5F,CAAA"}
|
package/dist/browser/index.mjs
CHANGED
|
@@ -27,9 +27,9 @@ var ConnectedAccount = /* @__PURE__ */ __name(({ address }) => {
|
|
|
27
27
|
// src/components/connected/ConnectAccountsStack.tsx
|
|
28
28
|
import { Alert, AlertTitle, Button, Stack as Stack2, Typography as Typography2 } from "@mui/material";
|
|
29
29
|
import { ButtonEx } from "@xylabs/react-button";
|
|
30
|
-
import { isDefined as
|
|
30
|
+
import { isDefined as isDefined7, isUndefined as isUndefined6 } from "@xylabs/typeof";
|
|
31
31
|
import { ErrorRender } from "@xyo-network/react-error";
|
|
32
|
-
import React2, { useEffect as
|
|
32
|
+
import React2, { useEffect as useEffect4 } from "react";
|
|
33
33
|
|
|
34
34
|
// src/hooks/client/useClient.ts
|
|
35
35
|
import { useSyncExternalStore } from "react";
|
|
@@ -63,6 +63,113 @@ async function getXyoClient(timeout = CLIENT_LISTENER_TIMEOUT) {
|
|
|
63
63
|
}
|
|
64
64
|
__name(getXyoClient, "getXyoClient");
|
|
65
65
|
|
|
66
|
+
// src/hooks/helpers/transaction/Confirmation.ts
|
|
67
|
+
import { assertEx } from "@xylabs/assert";
|
|
68
|
+
import { delay } from "@xylabs/delay";
|
|
69
|
+
import { forget } from "@xylabs/forget";
|
|
70
|
+
import { isDefined, isNull } from "@xylabs/typeof";
|
|
71
|
+
var TransactionConfirmationStatus = class _TransactionConfirmationStatus {
|
|
72
|
+
static {
|
|
73
|
+
__name(this, "TransactionConfirmationStatus");
|
|
74
|
+
}
|
|
75
|
+
_params;
|
|
76
|
+
active = false;
|
|
77
|
+
constructor(params) {
|
|
78
|
+
this._params = params;
|
|
79
|
+
}
|
|
80
|
+
get exp() {
|
|
81
|
+
return assertEx(this.transaction[0].exp, () => "exp is not found, transaction is not set");
|
|
82
|
+
}
|
|
83
|
+
get nbf() {
|
|
84
|
+
return assertEx(this.transaction[0].nbf, () => "nbf is not found, transaction is not set");
|
|
85
|
+
}
|
|
86
|
+
get onStatusUpdate() {
|
|
87
|
+
return this._params.onStatusUpdate;
|
|
88
|
+
}
|
|
89
|
+
get params() {
|
|
90
|
+
return this._params;
|
|
91
|
+
}
|
|
92
|
+
get transaction() {
|
|
93
|
+
return this.params.transaction;
|
|
94
|
+
}
|
|
95
|
+
get txHash() {
|
|
96
|
+
return this.params.txHash;
|
|
97
|
+
}
|
|
98
|
+
get viewer() {
|
|
99
|
+
return this.params.viewer;
|
|
100
|
+
}
|
|
101
|
+
static create(params) {
|
|
102
|
+
return new _TransactionConfirmationStatus(params);
|
|
103
|
+
}
|
|
104
|
+
async start() {
|
|
105
|
+
this.active = true;
|
|
106
|
+
try {
|
|
107
|
+
const currentBlockNumber = await this.viewer.currentBlockNumber();
|
|
108
|
+
while (isDefined(currentBlockNumber) && this.active) {
|
|
109
|
+
await this.checkBlock(currentBlockNumber);
|
|
110
|
+
await delay(1e3);
|
|
111
|
+
}
|
|
112
|
+
} catch (error) {
|
|
113
|
+
await this.stop();
|
|
114
|
+
forget(this.onStatusUpdate?.({
|
|
115
|
+
error: error instanceof Error ? error : new Error("Unknown error occurred"),
|
|
116
|
+
confirmed: false,
|
|
117
|
+
blockNumber: 0,
|
|
118
|
+
progress: 0,
|
|
119
|
+
remainingBlocks: 0
|
|
120
|
+
}));
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
stop() {
|
|
124
|
+
this.active = false;
|
|
125
|
+
}
|
|
126
|
+
async checkBlock(blockNumber) {
|
|
127
|
+
if (blockNumber < this.nbf) {
|
|
128
|
+
await this.stop();
|
|
129
|
+
forget(this.onStatusUpdate?.({
|
|
130
|
+
error: new Error(`Block number: ${blockNumber} is before ${this.nbf}`),
|
|
131
|
+
confirmed: false,
|
|
132
|
+
blockNumber,
|
|
133
|
+
progress: 0,
|
|
134
|
+
remainingBlocks: this.exp - blockNumber
|
|
135
|
+
}));
|
|
136
|
+
}
|
|
137
|
+
if (blockNumber > this.exp) {
|
|
138
|
+
forget(this.onStatusUpdate?.({
|
|
139
|
+
confirmed: false,
|
|
140
|
+
blockNumber,
|
|
141
|
+
progress: 100,
|
|
142
|
+
remainingBlocks: 0
|
|
143
|
+
}));
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
if (blockNumber < this.exp) {
|
|
147
|
+
await this.checkConfirmation(blockNumber);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
async checkConfirmation(blockNumber) {
|
|
151
|
+
const remainingBlocks = this.exp - blockNumber;
|
|
152
|
+
const progress = Math.round((blockNumber - this.nbf) / (this.exp - this.nbf) * 100);
|
|
153
|
+
const tx = await this.viewer.transactionByHash?.(this.txHash);
|
|
154
|
+
if (isNull(tx)) {
|
|
155
|
+
this.onStatusUpdate?.({
|
|
156
|
+
confirmed: false,
|
|
157
|
+
blockNumber,
|
|
158
|
+
progress,
|
|
159
|
+
remainingBlocks
|
|
160
|
+
});
|
|
161
|
+
} else {
|
|
162
|
+
this.onStatusUpdate?.({
|
|
163
|
+
confirmed: true,
|
|
164
|
+
blockNumber,
|
|
165
|
+
progress,
|
|
166
|
+
remainingBlocks
|
|
167
|
+
});
|
|
168
|
+
await this.stop();
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
};
|
|
172
|
+
|
|
66
173
|
// src/hooks/client/useClient.ts
|
|
67
174
|
var currentState = {
|
|
68
175
|
client: void 0,
|
|
@@ -136,15 +243,15 @@ var usePermissions = /* @__PURE__ */ __name(() => {
|
|
|
136
243
|
|
|
137
244
|
// src/hooks/client/permissions/usePermissionsAccounts.ts
|
|
138
245
|
import { usePromise } from "@xylabs/react-promise";
|
|
139
|
-
import { isArray, isDefined as
|
|
246
|
+
import { isArray, isDefined as isDefined3, isDefinedNotNull, isString } from "@xylabs/typeof";
|
|
140
247
|
|
|
141
248
|
// src/hooks/client/helpers/findCaveat.ts
|
|
142
|
-
import { isDefined } from "@xylabs/typeof";
|
|
249
|
+
import { isDefined as isDefined2 } from "@xylabs/typeof";
|
|
143
250
|
var findCaveat = /* @__PURE__ */ __name(async (permissions, targetCapability, targetCaveatType) => {
|
|
144
251
|
const existingPermissions = await permissions.getPermissions();
|
|
145
|
-
if (
|
|
252
|
+
if (isDefined2(existingPermissions) && existingPermissions.length > 0) {
|
|
146
253
|
const foundPermissions = existingPermissions.find((p) => p.parentCapability === targetCapability);
|
|
147
|
-
if (
|
|
254
|
+
if (isDefined2(foundPermissions)) {
|
|
148
255
|
return foundPermissions.caveats?.find((caveat) => caveat.type === targetCaveatType)?.value ?? [];
|
|
149
256
|
}
|
|
150
257
|
}
|
|
@@ -153,7 +260,7 @@ var findCaveat = /* @__PURE__ */ __name(async (permissions, targetCapability, ta
|
|
|
153
260
|
|
|
154
261
|
// src/hooks/client/permissions/usePermissionsAccounts.ts
|
|
155
262
|
var validateRestrictedAccounts = /* @__PURE__ */ __name((restrictedAccounts) => {
|
|
156
|
-
if (
|
|
263
|
+
if (isDefined3(restrictedAccounts)) {
|
|
157
264
|
if (isArray(restrictedAccounts) && restrictedAccounts.every(isString)) {
|
|
158
265
|
return restrictedAccounts;
|
|
159
266
|
}
|
|
@@ -167,7 +274,7 @@ var useAccountPermissions = /* @__PURE__ */ __name(() => {
|
|
|
167
274
|
const { permissions, error } = usePermissions();
|
|
168
275
|
return usePromise(async () => {
|
|
169
276
|
if (isDefinedNotNull(error)) throw error;
|
|
170
|
-
if (
|
|
277
|
+
if (isDefined3(permissions)) {
|
|
171
278
|
const restrictedAccounts = await findCaveat(
|
|
172
279
|
permissions,
|
|
173
280
|
// TODO - extract to constant in protocol package
|
|
@@ -263,21 +370,77 @@ var useAddressBalance = /* @__PURE__ */ __name((address, viewer, refresh) => {
|
|
|
263
370
|
};
|
|
264
371
|
}, "useAddressBalance");
|
|
265
372
|
|
|
373
|
+
// src/hooks/useConfirmTransactionBase.ts
|
|
374
|
+
import { forget as forget2 } from "@xylabs/forget";
|
|
375
|
+
import { isHash } from "@xylabs/hex";
|
|
376
|
+
import { usePromise as usePromise2 } from "@xylabs/react-promise";
|
|
377
|
+
import { isDefined as isDefined4 } from "@xylabs/typeof";
|
|
378
|
+
import { PayloadBuilder } from "@xyo-network/payload-builder";
|
|
379
|
+
import { useEffect as useEffect2, useState as useState2 } from "react";
|
|
380
|
+
var useConfirmTransactionBase = /* @__PURE__ */ __name((transaction, onBroadcast, onStatusUpdate, runner, viewer) => {
|
|
381
|
+
const [status, setStatus] = useState2();
|
|
382
|
+
const onStatusUpdateLocal = /* @__PURE__ */ __name((newStatus) => {
|
|
383
|
+
setStatus(newStatus);
|
|
384
|
+
}, "onStatusUpdateLocal");
|
|
385
|
+
const [transactionConfirmationStatus, transactionConfirmationError] = usePromise2(async () => {
|
|
386
|
+
const hasRunner = isDefined4(runner);
|
|
387
|
+
if (transaction && viewer) {
|
|
388
|
+
const hash = hasRunner ? await runner.broadcastTransaction(transaction) : PayloadBuilder.hash(transaction[0]);
|
|
389
|
+
if (isHash(hash)) {
|
|
390
|
+
if (hasRunner && isDefined4(onBroadcast)) onBroadcast(hash);
|
|
391
|
+
const params = {
|
|
392
|
+
onStatusUpdate: onStatusUpdate ?? onStatusUpdateLocal,
|
|
393
|
+
transaction,
|
|
394
|
+
txHash: hash,
|
|
395
|
+
viewer
|
|
396
|
+
};
|
|
397
|
+
const instance = await TransactionConfirmationStatus.create(params);
|
|
398
|
+
await instance.start();
|
|
399
|
+
return instance;
|
|
400
|
+
} else {
|
|
401
|
+
throw new Error("unexpected return type from broadcast transaction");
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
}, [
|
|
405
|
+
transaction,
|
|
406
|
+
runner,
|
|
407
|
+
viewer
|
|
408
|
+
]);
|
|
409
|
+
useEffect2(() => {
|
|
410
|
+
return () => {
|
|
411
|
+
if (transactionConfirmationStatus) {
|
|
412
|
+
forget2(transactionConfirmationStatus.stop());
|
|
413
|
+
}
|
|
414
|
+
};
|
|
415
|
+
}, [
|
|
416
|
+
transactionConfirmationStatus
|
|
417
|
+
]);
|
|
418
|
+
return {
|
|
419
|
+
status,
|
|
420
|
+
transactionConfirmationError
|
|
421
|
+
};
|
|
422
|
+
}, "useConfirmTransactionBase");
|
|
423
|
+
|
|
266
424
|
// src/hooks/useConnectAccount.ts
|
|
267
|
-
import { assertEx } from "@xylabs/assert";
|
|
425
|
+
import { assertEx as assertEx2 } from "@xylabs/assert";
|
|
268
426
|
import { asAddress } from "@xylabs/hex";
|
|
269
427
|
import { MainNetwork } from "@xyo-network/chain-network-model";
|
|
270
|
-
import { useCallback, useState as
|
|
428
|
+
import { useCallback, useState as useState3 } from "react";
|
|
271
429
|
var useConnectAccount = /* @__PURE__ */ __name((gatewayName = MainNetwork.id, timeout) => {
|
|
430
|
+
const [connectError, setConnectError] = useState3();
|
|
272
431
|
const { gateway, error, timedout } = useGateway(gatewayName, timeout);
|
|
273
432
|
const [accountPermissions, accountPermissionsError] = useAccountPermissions();
|
|
274
|
-
const [address, setAddress] =
|
|
433
|
+
const [address, setAddress] = useState3();
|
|
275
434
|
const connectSigner = useCallback(async () => {
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
435
|
+
try {
|
|
436
|
+
const assertedGateway = assertEx2(gateway, () => `Gateway ${gatewayName} is not available`);
|
|
437
|
+
const signer = await assertedGateway.signer();
|
|
438
|
+
const address2 = await signer.address();
|
|
439
|
+
setAddress(address2);
|
|
440
|
+
return address2;
|
|
441
|
+
} catch (e) {
|
|
442
|
+
setConnectError(e);
|
|
443
|
+
}
|
|
281
444
|
}, [
|
|
282
445
|
gateway,
|
|
283
446
|
gatewayName
|
|
@@ -285,17 +448,17 @@ var useConnectAccount = /* @__PURE__ */ __name((gatewayName = MainNetwork.id, ti
|
|
|
285
448
|
return {
|
|
286
449
|
address: asAddress(accountPermissions?.[0] ?? address),
|
|
287
450
|
connectSigner,
|
|
288
|
-
error: error ?? accountPermissionsError,
|
|
451
|
+
error: error ?? accountPermissionsError ?? connectError,
|
|
289
452
|
gateway,
|
|
290
453
|
timedout
|
|
291
454
|
};
|
|
292
455
|
}, "useConnectAccount");
|
|
293
456
|
|
|
294
457
|
// src/hooks/useCurrentBlock.ts
|
|
295
|
-
import { usePromise as
|
|
458
|
+
import { usePromise as usePromise3 } from "@xylabs/react-promise";
|
|
296
459
|
import { isDefinedNotNull as isDefinedNotNull2 } from "@xylabs/typeof";
|
|
297
460
|
var useCurrentBlock = /* @__PURE__ */ __name((refresh = 1, viewer) => {
|
|
298
|
-
return
|
|
461
|
+
return usePromise3(async () => {
|
|
299
462
|
if (isDefinedNotNull2(viewer) && refresh > 0) {
|
|
300
463
|
const block = await viewer.currentBlock();
|
|
301
464
|
return block;
|
|
@@ -346,11 +509,11 @@ var useSigner = /* @__PURE__ */ __name((_provider, account) => {
|
|
|
346
509
|
}, "useSigner");
|
|
347
510
|
|
|
348
511
|
// src/hooks/viewer/useCheckRpc.ts
|
|
349
|
-
import { delay } from "@xylabs/delay";
|
|
350
|
-
import { isDefined as
|
|
512
|
+
import { delay as delay2 } from "@xylabs/delay";
|
|
513
|
+
import { isDefined as isDefined5, isUndefined as isUndefined4 } from "@xylabs/typeof";
|
|
351
514
|
import { LocalNetwork, SequenceNetwork } from "@xyo-network/chain-network-model";
|
|
352
515
|
import { HttpRpcTransport as HttpRpcTransport2, JsonRpcXyoViewer, XyoViewerRpcSchemas } from "@xyo-network/xl1-rpc";
|
|
353
|
-
import { useEffect as
|
|
516
|
+
import { useEffect as useEffect3, useMemo as useMemo5, useState as useState4 } from "react";
|
|
354
517
|
var INTERVAL = 5e3;
|
|
355
518
|
var localRpcEndpoint = `${LocalNetwork.url}/rpc`;
|
|
356
519
|
var sequenceRpcEndpoint = `${SequenceNetwork.url}/rpc`;
|
|
@@ -363,8 +526,8 @@ var useCheckSequenceRpc = /* @__PURE__ */ __name(() => {
|
|
|
363
526
|
return isLocalProducer;
|
|
364
527
|
}, "useCheckSequenceRpc");
|
|
365
528
|
var useCheckRpc = /* @__PURE__ */ __name((endpoint) => {
|
|
366
|
-
const [isLocalProducer, setIsLocalProducer] =
|
|
367
|
-
const [error, setError] =
|
|
529
|
+
const [isLocalProducer, setIsLocalProducer] = useState4(false);
|
|
530
|
+
const [error, setError] = useState4();
|
|
368
531
|
const viewer = useMemo5(() => {
|
|
369
532
|
if (isUndefined4(endpoint)) return;
|
|
370
533
|
const transport = new HttpRpcTransport2(endpoint, XyoViewerRpcSchemas);
|
|
@@ -373,19 +536,19 @@ var useCheckRpc = /* @__PURE__ */ __name((endpoint) => {
|
|
|
373
536
|
}, [
|
|
374
537
|
endpoint
|
|
375
538
|
]);
|
|
376
|
-
|
|
539
|
+
useEffect3(() => {
|
|
377
540
|
if (isUndefined4(viewer)) return;
|
|
378
541
|
void (async () => {
|
|
379
542
|
setError(void 0);
|
|
380
543
|
while (!isLocalProducer) {
|
|
381
544
|
try {
|
|
382
545
|
const block = await viewer.currentBlock();
|
|
383
|
-
setIsLocalProducer(
|
|
546
|
+
setIsLocalProducer(isDefined5(block));
|
|
384
547
|
} catch (err) {
|
|
385
548
|
setError(err);
|
|
386
549
|
setIsLocalProducer(false);
|
|
387
550
|
}
|
|
388
|
-
await
|
|
551
|
+
await delay2(INTERVAL);
|
|
389
552
|
}
|
|
390
553
|
})();
|
|
391
554
|
}, [
|
|
@@ -415,14 +578,14 @@ var useHttpRpcViewer = /* @__PURE__ */ __name((url) => {
|
|
|
415
578
|
}, "useHttpRpcViewer");
|
|
416
579
|
|
|
417
580
|
// src/hooks/viewer/useViewerFromWallet.ts
|
|
418
|
-
import { usePromise as
|
|
419
|
-
import { isDefined as
|
|
581
|
+
import { usePromise as usePromise4 } from "@xylabs/react-promise";
|
|
582
|
+
import { isDefined as isDefined6, isDefinedNotNull as isDefinedNotNull3 } from "@xylabs/typeof";
|
|
420
583
|
var useViewerFromWallet = /* @__PURE__ */ __name((networkId) => {
|
|
421
584
|
const { gateway, error, isLoading } = useGateway(networkId);
|
|
422
|
-
return
|
|
585
|
+
return usePromise4(async () => {
|
|
423
586
|
if (isDefinedNotNull3(error)) return null;
|
|
424
587
|
if (isLoading) return;
|
|
425
|
-
if (
|
|
588
|
+
if (isDefined6(gateway) && isDefined6(networkId)) {
|
|
426
589
|
const connection = await gateway?.connection();
|
|
427
590
|
return connection?.viewer;
|
|
428
591
|
}
|
|
@@ -453,10 +616,18 @@ var DefaultNoWalletInstalledComponent = /* @__PURE__ */ __name(() => /* @__PURE_
|
|
|
453
616
|
target: "_blank",
|
|
454
617
|
rel: "noopener"
|
|
455
618
|
}, "Get XL1 Wallet")), "DefaultNoWalletInstalledComponent");
|
|
456
|
-
var ConnectAccountsStack = /* @__PURE__ */ __name(({ AccountComponent = ConnectedAccount, ConnectComponent = DefaultConnectComponent, NoWalletInstalledComponent = DefaultNoWalletInstalledComponent, onAccountConnected, timeout, ...props }) => {
|
|
619
|
+
var ConnectAccountsStack = /* @__PURE__ */ __name(({ AccountComponent = ConnectedAccount, ConnectComponent = DefaultConnectComponent, NoWalletInstalledComponent = DefaultNoWalletInstalledComponent, onAccountConnected, onCancel, timeout, ...props }) => {
|
|
457
620
|
const { address, connectSigner, error, timedout } = useConnectAccount(void 0, timeout);
|
|
458
|
-
|
|
459
|
-
if (
|
|
621
|
+
useEffect4(() => {
|
|
622
|
+
if (isDefined7(error) && isDefined7(onCancel)) {
|
|
623
|
+
onCancel();
|
|
624
|
+
}
|
|
625
|
+
}, [
|
|
626
|
+
error,
|
|
627
|
+
onCancel
|
|
628
|
+
]);
|
|
629
|
+
useEffect4(() => {
|
|
630
|
+
if (isDefined7(address) && isDefined7(onAccountConnected)) {
|
|
460
631
|
onAccountConnected(address);
|
|
461
632
|
}
|
|
462
633
|
}, [
|
|
@@ -468,7 +639,7 @@ var ConnectAccountsStack = /* @__PURE__ */ __name(({ AccountComponent = Connecte
|
|
|
468
639
|
alignItems: "start",
|
|
469
640
|
spacing: 2,
|
|
470
641
|
...props
|
|
471
|
-
},
|
|
642
|
+
}, isDefined7(address) ? /* @__PURE__ */ React2.createElement(AccountComponent, {
|
|
472
643
|
address
|
|
473
644
|
}) : null, isUndefined6(address) && !timedout && /* @__PURE__ */ React2.createElement(ConnectComponent, {
|
|
474
645
|
onClick: /* @__PURE__ */ __name(() => void connectSigner(), "onClick")
|
|
@@ -480,6 +651,7 @@ var ConnectAccountsStack = /* @__PURE__ */ __name(({ AccountComponent = Connecte
|
|
|
480
651
|
export {
|
|
481
652
|
ConnectAccountsStack,
|
|
482
653
|
ConnectedAccount,
|
|
654
|
+
TransactionConfirmationStatus,
|
|
483
655
|
getXyoClient,
|
|
484
656
|
listenForClientInjection,
|
|
485
657
|
useAccountPermissions,
|
|
@@ -488,6 +660,7 @@ export {
|
|
|
488
660
|
useCheckRpc,
|
|
489
661
|
useCheckSequenceRpc,
|
|
490
662
|
useClient,
|
|
663
|
+
useConfirmTransactionBase,
|
|
491
664
|
useConnectAccount,
|
|
492
665
|
useCurrentBlock,
|
|
493
666
|
useGateway,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/components/connected/account/Connected.tsx","../../src/components/connected/ConnectAccountsStack.tsx","../../src/hooks/client/useClient.ts","../../src/hooks/helpers/getXyoClient.ts","../../src/hooks/client/permissions/usePermissions.ts","../../src/hooks/client/permissions/usePermissionsAccounts.ts","../../src/hooks/client/helpers/findCaveat.ts","../../src/hooks/client/useGateway.ts","../../src/hooks/useAddressBalance.ts","../../src/hooks/useConnectAccount.ts","../../src/hooks/useCurrentBlock.ts","../../src/hooks/useHttpRpcRunner.ts","../../src/hooks/useNetwork.ts","../../src/hooks/useSigner.ts","../../src/hooks/viewer/useCheckRpc.ts","../../src/hooks/viewer/useHttpRpcViewer.ts","../../src/hooks/viewer/useViewerFromWallet.ts"],"sourcesContent":["import {\n Stack, Tooltip, Typography,\n} from '@mui/material'\nimport { EthAddressWrapper } from '@xylabs/eth-address'\nimport { BlockiesAvatarAddress } from '@xyo-network/react-chain-blockies'\nimport React from 'react'\n\nexport const ConnectedAccount: React.FC<{ address: string }> = ({ address }) => {\n const shortenedAddress = `${EthAddressWrapper.fromString(address)?.toShortString(4)}`\n\n return (\n <Stack direction=\"row\" alignItems=\"center\" spacing={1}>\n <BlockiesAvatarAddress address={address} size={21} />\n <Tooltip title={address}>\n <Typography color=\"textSecondary\" variant=\"caption\" fontFamily=\"monospace\">{shortenedAddress}</Typography>\n </Tooltip>\n </Stack>\n )\n}\n","import type { StackProps } from '@mui/material'\nimport {\n Alert, AlertTitle, Button, Stack,\n Typography,\n} from '@mui/material'\nimport type { Address } from '@xylabs/hex'\nimport type { ButtonExProps } from '@xylabs/react-button'\nimport { ButtonEx } from '@xylabs/react-button'\nimport { isDefined, isUndefined } from '@xylabs/typeof'\nimport { ErrorRender } from '@xyo-network/react-error'\nimport type { ComponentType, MouseEventHandler } from 'react'\nimport React, { useEffect } from 'react'\n\nimport { useConnectAccount } from '../../hooks/index.ts'\nimport { ConnectedAccount } from './account/index.ts'\n\nconst DefaultConnectComponent: React.FC<ButtonExProps> = props => (\n <ButtonEx variant=\"contained\" size=\"small\" {...props} />\n)\n\nconst DefaultNoWalletInstalledComponent: React.FC = () => (\n <Alert severity=\"warning\">\n <AlertTitle>XL1 Wallet Not Found</AlertTitle>\n <Typography gutterBottom>\n Please ensure that your XL1 Wallet is installed to connect your account.\n </Typography>\n <Button\n sx={{ display: 'flex', justifySelf: 'end' }}\n size=\"small\"\n variant=\"outlined\"\n href=\"https://chromewebstore.google.com/detail/xl1-wallet/fblbagcjeigmhakkfgjpdlcapcgmcfbm\"\n target=\"_blank\"\n rel=\"noopener\"\n >\n Get XL1 Wallet\n </Button>\n </Alert>\n)\n\nexport interface ConnectClientAccountsStackProps extends StackProps {\n AccountComponent?: ComponentType<{ account?: string }>\n ConnectComponent?: ComponentType<{ onClick?: MouseEventHandler<HTMLElement> }>\n NoWalletInstalledComponent?: ComponentType\n onAccountConnected?: (account: Address) => void\n timeout?: number\n}\n\nexport const ConnectAccountsStack: React.FC<ConnectClientAccountsStackProps> = ({\n AccountComponent = ConnectedAccount,\n ConnectComponent = DefaultConnectComponent,\n NoWalletInstalledComponent = DefaultNoWalletInstalledComponent,\n onAccountConnected,\n timeout,\n ...props\n}) => {\n const {\n address, connectSigner, error, timedout,\n } = useConnectAccount(undefined, timeout)\n\n useEffect(() => {\n if (isDefined(address) && isDefined(onAccountConnected)) {\n onAccountConnected(address)\n }\n }, [address, onAccountConnected])\n\n return (\n <Stack direction=\"row\" alignItems=\"start\" spacing={2} {...props}>\n {isDefined(address)\n ? <AccountComponent address={address} />\n : null}\n {isUndefined(address) && !timedout && (\n <ConnectComponent onClick={() => void connectSigner()}>Connect</ConnectComponent>\n )}\n {isUndefined(address) && timedout && (\n <NoWalletInstalledComponent />\n )}\n <ErrorRender error={error} scope=\"ConnectSigner:error\" />\n </Stack>\n )\n}\n","import type { XyoClient } from '@xyo-network/xl1-protocol'\nimport { useSyncExternalStore } from 'react'\n\nimport { getXyoClient } from '../helpers/index.ts'\n\ninterface ClientState {\n client?: XyoClient\n error: Error | null\n isLoading: boolean\n timedout: boolean\n}\n\nlet currentState: ClientState = {\n client: undefined,\n error: null,\n isLoading: false,\n timedout: false,\n}\n\nconst listeners = new Set<() => void>()\n\nconst emitChange = () => {\n for (const listener of listeners) listener()\n}\n\nconst updateState = (newState: Partial<ClientState>) => {\n currentState = { ...currentState, ...newState }\n emitChange()\n}\n\nconst initializeClient = async (timeout?: number) => {\n if (currentState.isLoading || currentState.client) return\n\n updateState({ isLoading: true, error: null })\n\n try {\n const client = await getXyoClient(timeout)\n if (client === null) {\n updateState({ timedout: true, isLoading: false })\n return\n }\n updateState({\n client, isLoading: false, error: null,\n })\n } catch (error) {\n console.error('Error initializing XyoClient', error)\n updateState({ error: error as Error, isLoading: false })\n }\n}\n\nconst subscribe = (listener: () => void, timeout?: number) => {\n listeners.add(listener)\n\n void initializeClient(timeout)\n\n return () => {\n listeners.delete(listener)\n }\n}\n\nconst getSnapshot = (): ClientState => currentState\n\nexport const useClient = (timeout?: number) => {\n const subscribeWithTimeout = (listener: () => void) => subscribe(listener, timeout)\n return useSyncExternalStore(subscribeWithTimeout, getSnapshot)\n}\n","import type { XyoClient } from '@xyo-network/xl1-protocol'\n\nconst CLIENT_LISTENER_TIMEOUT = 500\n\nconst hasXyoClient = () => {\n return 'client' in globalThis.xyo\n}\n\nexport const listenForClientInjection = (onClientReady: () => void, timeout: number, onTimeout: () => void) => {\n let resolved = false\n const listener: EventListener = () => {\n onClientReady()\n resolved = true\n }\n globalThis.addEventListener('xyo:plugin-ready', listener)\n setTimeout(() => {\n if (!resolved) {\n onTimeout()\n }\n }, timeout)\n}\n\ntype ReturnType = XyoClient | undefined | null\n\nexport async function getXyoClient(timeout = CLIENT_LISTENER_TIMEOUT): Promise<ReturnType> {\n return hasXyoClient()\n ? globalThis.xyo.client\n // listen for the XyoWallet to be injected\n : await new Promise<ReturnType>((resolve) => {\n listenForClientInjection(\n () => {\n resolve(globalThis.xyo.client)\n },\n timeout,\n () => {\n resolve(null)\n },\n )\n })\n}\n","import { useClient } from '../useClient.ts'\n\nexport const usePermissions = () => {\n const {\n client, isLoading, error, timedout,\n } = useClient()\n const permissions = client?.permissions\n return {\n permissions,\n isLoading,\n error,\n timedout,\n }\n}\n","import { usePromise } from '@xylabs/react-promise'\nimport {\n isArray, isDefined, isDefinedNotNull, isString,\n} from '@xylabs/typeof'\nimport type { JsonValue } from '@xyo-network/xl1-rpc'\n\nimport { findCaveat } from '../helpers/index.ts'\nimport { usePermissions } from './usePermissions.ts'\n\nconst validateRestrictedAccounts = (restrictedAccounts: JsonValue): readonly string [] => {\n if (isDefined(restrictedAccounts)) {\n if (isArray(restrictedAccounts) && restrictedAccounts.every(isString)) {\n return restrictedAccounts\n }\n throw new Error(\n `Unrecognized format for restrictReturnedAccounts caveat found on permissions. \\n\n Should be an array of strings: ${JSON.stringify(restrictedAccounts)}`,\n )\n }\n return []\n}\n\nexport const useAccountPermissions = () => {\n const { permissions, error } = usePermissions()\n\n return usePromise(async () => {\n if (isDefinedNotNull(error)) throw error\n if (isDefined(permissions)) {\n const restrictedAccounts = await findCaveat(\n permissions,\n // TODO - extract to constant in protocol package\n 'xyoWallet_getAccounts',\n 'restrictReturnedAccounts',\n )\n return validateRestrictedAccounts(restrictedAccounts)\n }\n }, [permissions])\n}\n","import { isDefined } from '@xylabs/typeof'\nimport type { CaveatTypes, XyoPermissions } from '@xyo-network/xl1-protocol'\nimport type { ParentCapability } from '@xyo-network/xl1-rpc'\n\nexport const findCaveat = async (\n permissions: XyoPermissions,\n targetCapability: ParentCapability,\n targetCaveatType: CaveatTypes,\n) => {\n const existingPermissions = await permissions.getPermissions()\n if (isDefined(existingPermissions) && existingPermissions.length > 0) {\n const foundPermissions = existingPermissions\n .find(p => p.parentCapability === targetCapability)\n if (isDefined(foundPermissions)) {\n return foundPermissions.caveats?.find(caveat => caveat.type === targetCaveatType)?.value ?? []\n }\n }\n return existingPermissions\n}\n","import type { GatewayName } from '@xyo-network/xl1-protocol'\n\nimport { useClient } from './useClient.ts'\n\nexport const useGateway = (gatewayName?: GatewayName, timeout?: number) => {\n const {\n client, isLoading, error, timedout,\n } = useClient(timeout)\n return {\n gateway: gatewayName ? client?.gateways?.[gatewayName] : undefined,\n isLoading,\n error,\n timedout,\n }\n}\n","import type { Address } from '@xylabs/hex'\nimport { isUndefined, isUndefinedOrNull } from '@xylabs/typeof'\nimport type { AttoXL1, XyoViewer } from '@xyo-network/xl1-protocol'\nimport { ShiftedBigInt } from '@xyo-network/xl1-protocol'\nimport {\n useEffect, useMemo, useState,\n} from 'react'\n\nexport const useAddressBalance = (\n // address to get balance for\n address?: Address,\n // viewer to use for fetching balance\n viewer?: XyoViewer,\n // refresh balance trigger\n refresh?: number,\n) => {\n const [balancesResult, setBalancesResult] = useState<AttoXL1 | null>()\n const [loading, setLoading] = useState(false)\n const [balancesError, setBalancesError] = useState<Error>()\n\n useEffect(() => {\n let isCurrent = true\n if (isUndefined(viewer) || isUndefined(address)) return\n // Ensure the render is the current one before setting the state.\n // This solves the issue of overlapping calls where a previous call takes\n // longer than a subsequent one and returns a state value. Now, the latest\n // result is always returned.\n (viewer.accountBalance(address) as Promise<AttoXL1>).then((result) => {\n if (isCurrent) {\n setBalancesResult(result as AttoXL1)\n setLoading(false)\n }\n })\n .catch((err) => {\n if (isCurrent) {\n console.error('Error in queued call:', err)\n setBalancesResult(undefined)\n setBalancesError(err)\n setLoading(false)\n }\n })\n\n return () => {\n isCurrent = false\n }\n }, [address, viewer, refresh])\n\n useMemo(() => {\n if (balancesError) {\n setLoading(false)\n }\n }, [balancesError])\n\n const shiftedBigInt = useMemo(() => {\n if (typeof balancesResult !== 'bigint') return\n return new ShiftedBigInt(balancesResult, {\n places: 18, maxDecimal: 18, maxCharacters: 9, minDecimals: 1, locale: navigator.language,\n })\n }, [balancesResult])\n\n const balanceIntlFriendly = useMemo(() => {\n return shiftedBigInt?.toFullString()\n }, [shiftedBigInt])\n\n const shortBalanceIntlFriendly = useMemo(() => {\n return isUndefinedOrNull(balancesResult)\n ? undefined\n : (balancesResult < 1_000_000_000_000n && balancesResult > 0n) ? '<0.00001' : shiftedBigInt?.toShortString()\n }, [shiftedBigInt])\n\n return {\n address,\n balanceForAddress: balancesResult,\n balanceIntlFriendly,\n shortBalanceIntlFriendly,\n error: balancesError,\n loading,\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport { type Address, asAddress } from '@xylabs/hex'\nimport { MainNetwork } from '@xyo-network/chain-network-model'\nimport type { GatewayName } from '@xyo-network/xl1-protocol'\nimport { useCallback, useState } from 'react'\n\nimport { useAccountPermissions, useGateway } from './client/index.ts'\n\nexport const useConnectAccount = (gatewayName: GatewayName = MainNetwork.id, timeout?: number) => {\n const {\n gateway, error, timedout,\n } = useGateway(gatewayName, timeout)\n\n const [accountPermissions, accountPermissionsError] = useAccountPermissions()\n\n const [address, setAddress] = useState<Address>()\n\n const connectSigner = useCallback(async () => {\n const assertedGateway = assertEx(gateway, () => `Gateway ${gatewayName} is not available`)\n const signer = await assertedGateway.signer()\n const address = await signer.address()\n setAddress(address)\n return address\n }, [gateway, gatewayName])\n\n return {\n address: asAddress(accountPermissions?.[0] ?? address), connectSigner, error: error ?? accountPermissionsError, gateway, timedout,\n }\n}\n","import { usePromise } from '@xylabs/react-promise'\nimport { isDefinedNotNull } from '@xylabs/typeof'\nimport type { XyoViewer } from '@xyo-network/xl1-protocol'\n\nexport const useCurrentBlock = (refresh = 1, viewer?: XyoViewer | null) => {\n return usePromise(async () => {\n if (isDefinedNotNull(viewer) && refresh > 0) {\n const block = await viewer.currentBlock()\n return block\n }\n }, [viewer, refresh])\n}\n","import { isUndefined } from '@xylabs/typeof'\nimport type { RpcTransport, XyoRunnerRpcSchemas } from '@xyo-network/xl1-rpc'\nimport {\n AllRpcSchemas, HttpRpcTransport, JsonRpcXyoRunner,\n} from '@xyo-network/xl1-rpc'\nimport { useMemo } from 'react'\n\nexport const useHttpRpcRunner = (url?: string) => {\n return useMemo(() => {\n if (isUndefined(url)) {\n return\n }\n const transport = new HttpRpcTransport(`${url}/rpc`, AllRpcSchemas)\n return new JsonRpcXyoRunner(transport as RpcTransport<typeof XyoRunnerRpcSchemas>)\n }, [url])\n}\n","import { isUndefined } from '@xylabs/typeof'\nimport type { DefaultNetworkIds } from '@xyo-network/xl1-protocol'\nimport { MemoryXyoNetwork } from '@xyo-network/xl1-rpc'\nimport { useMemo } from 'react'\n\nexport const useNetwork = (id?: DefaultNetworkIds) => {\n const network = useMemo(() => {\n if (isUndefined(id)) return\n return new MemoryXyoNetwork(id)\n }, [id])\n\n return network\n}\n","import type { AccountInstance } from '@xyo-network/account-model'\nimport type { XyoConnection, XyoSigner } from '@xyo-network/xl1-protocol'\nimport { MemoryXyoSigner } from '@xyo-network/xl1-rpc'\nimport { useMemo } from 'react'\n\nexport const useSigner = (_provider?: XyoConnection, account?: AccountInstance) => {\n return useMemo<XyoSigner | undefined>(() => account ? new MemoryXyoSigner(account) : undefined, [account])\n}\n","import { delay } from '@xylabs/delay'\nimport { isDefined, isUndefined } from '@xylabs/typeof'\nimport { LocalNetwork, SequenceNetwork } from '@xyo-network/chain-network-model'\nimport {\n HttpRpcTransport, JsonRpcXyoViewer, XyoViewerRpcSchemas,\n} from '@xyo-network/xl1-rpc'\nimport {\n useEffect, useMemo, useState,\n} from 'react'\n\nconst INTERVAL = 5000 // 5 seconds\n\nconst localRpcEndpoint: string = `${LocalNetwork.url}/rpc`\nconst sequenceRpcEndpoint: string = `${SequenceNetwork.url}/rpc`\n\nexport const useCheckLocalRpc = () => {\n const isLocalProducer = useCheckRpc(localRpcEndpoint)\n return isLocalProducer\n}\n\nexport const useCheckSequenceRpc = () => {\n const isLocalProducer = useCheckRpc(sequenceRpcEndpoint)\n return isLocalProducer\n}\n\nexport const useCheckRpc = (endpoint?: string) => {\n const [isLocalProducer, setIsLocalProducer] = useState(false)\n const [error, setError] = useState<Error>()\n\n const viewer = useMemo(() => {\n if (isUndefined(endpoint)) return\n\n const transport = new HttpRpcTransport(endpoint, XyoViewerRpcSchemas)\n const viewer = new JsonRpcXyoViewer(transport)\n return viewer\n }, [endpoint])\n\n useEffect(() => {\n if (isUndefined(viewer)) return\n\n void (async () => {\n setError(undefined)\n while (!isLocalProducer) {\n try {\n const block = await viewer.currentBlock()\n setIsLocalProducer(isDefined(block))\n } catch (err) {\n setError(err as Error)\n setIsLocalProducer(false)\n }\n await delay(INTERVAL)\n }\n })()\n }, [viewer])\n\n return { isLocalProducer, error }\n}\n","import { isUndefined } from '@xylabs/typeof'\nimport {\n HttpRpcTransport, JsonRpcXyoViewer, XyoViewerRpcSchemas,\n} from '@xyo-network/xl1-rpc'\nimport { useMemo } from 'react'\n\nexport const useHttpRpcViewer = (url?: string) => {\n const resolvedViewer = useMemo(() => {\n if (isUndefined(url)) {\n return\n }\n const transport = new HttpRpcTransport(`${url}/rpc`, XyoViewerRpcSchemas)\n return new JsonRpcXyoViewer(transport)\n }, [url])\n\n return resolvedViewer\n}\n","import { usePromise } from '@xylabs/react-promise'\nimport { isDefined, isDefinedNotNull } from '@xylabs/typeof'\nimport type { GatewayName } from '@xyo-network/xl1-protocol'\n\nimport { useGateway } from '../client/index.ts'\n\n/**\n * Creates a JsonRpcXyoViewer instance based on the provided networkId.\n * @param networkId - a network id like 'sequence', 'local', etc.\n * @returns An instance of XyoViewer if the networkId is found in wallet gateways\n * otherwise undefined.\n */\nexport const useViewerFromWallet = (networkId?: GatewayName) => {\n const {\n gateway, error, isLoading,\n } = useGateway(networkId)\n\n return usePromise(async () => {\n if (isDefinedNotNull(error)) return null\n if (isLoading) return\n if (isDefined(gateway) && isDefined(networkId)) {\n const connection = await gateway?.connection()\n return connection?.viewer\n }\n }, [gateway, networkId])\n}\n"],"mappings":"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","names":["Stack","Tooltip","Typography","EthAddressWrapper","BlockiesAvatarAddress","React","ConnectedAccount","address","shortenedAddress","EthAddressWrapper","fromString","toShortString","Stack","direction","alignItems","spacing","BlockiesAvatarAddress","size","Tooltip","title","Typography","color","variant","fontFamily","Alert","AlertTitle","Button","Stack","Typography","ButtonEx","isDefined","isUndefined","ErrorRender","React","useEffect","useSyncExternalStore","CLIENT_LISTENER_TIMEOUT","hasXyoClient","globalThis","xyo","listenForClientInjection","onClientReady","timeout","onTimeout","resolved","listener","addEventListener","setTimeout","getXyoClient","client","Promise","resolve","currentState","client","undefined","error","isLoading","timedout","listeners","Set","emitChange","listener","updateState","newState","initializeClient","timeout","getXyoClient","console","subscribe","add","delete","getSnapshot","useClient","subscribeWithTimeout","useSyncExternalStore","usePermissions","client","isLoading","error","timedout","useClient","permissions","usePromise","isArray","isDefined","isDefinedNotNull","isString","isDefined","findCaveat","permissions","targetCapability","targetCaveatType","existingPermissions","getPermissions","isDefined","length","foundPermissions","find","p","parentCapability","caveats","caveat","type","value","validateRestrictedAccounts","restrictedAccounts","isDefined","isArray","every","isString","Error","JSON","stringify","useAccountPermissions","permissions","error","usePermissions","usePromise","isDefinedNotNull","findCaveat","useGateway","gatewayName","timeout","client","isLoading","error","timedout","useClient","gateway","gateways","undefined","isUndefined","isUndefinedOrNull","ShiftedBigInt","useEffect","useMemo","useState","useAddressBalance","address","viewer","refresh","balancesResult","setBalancesResult","useState","loading","setLoading","balancesError","setBalancesError","useEffect","isCurrent","isUndefined","accountBalance","then","result","catch","err","console","error","undefined","useMemo","shiftedBigInt","ShiftedBigInt","places","maxDecimal","maxCharacters","minDecimals","locale","navigator","language","balanceIntlFriendly","toFullString","shortBalanceIntlFriendly","isUndefinedOrNull","toShortString","balanceForAddress","assertEx","asAddress","MainNetwork","useCallback","useState","useConnectAccount","gatewayName","MainNetwork","id","timeout","gateway","error","timedout","useGateway","accountPermissions","accountPermissionsError","useAccountPermissions","address","setAddress","useState","connectSigner","useCallback","assertedGateway","assertEx","signer","asAddress","usePromise","isDefinedNotNull","useCurrentBlock","refresh","viewer","usePromise","isDefinedNotNull","block","currentBlock","isUndefined","AllRpcSchemas","HttpRpcTransport","JsonRpcXyoRunner","useMemo","useHttpRpcRunner","url","useMemo","isUndefined","transport","HttpRpcTransport","AllRpcSchemas","JsonRpcXyoRunner","isUndefined","MemoryXyoNetwork","useMemo","useNetwork","id","network","useMemo","isUndefined","MemoryXyoNetwork","MemoryXyoSigner","useMemo","useSigner","_provider","account","useMemo","MemoryXyoSigner","undefined","delay","isDefined","isUndefined","LocalNetwork","SequenceNetwork","HttpRpcTransport","JsonRpcXyoViewer","XyoViewerRpcSchemas","useEffect","useMemo","useState","INTERVAL","localRpcEndpoint","LocalNetwork","url","sequenceRpcEndpoint","SequenceNetwork","useCheckLocalRpc","isLocalProducer","useCheckRpc","useCheckSequenceRpc","endpoint","setIsLocalProducer","useState","error","setError","viewer","useMemo","isUndefined","transport","HttpRpcTransport","XyoViewerRpcSchemas","JsonRpcXyoViewer","useEffect","undefined","block","currentBlock","isDefined","err","delay","isUndefined","HttpRpcTransport","JsonRpcXyoViewer","XyoViewerRpcSchemas","useMemo","useHttpRpcViewer","url","resolvedViewer","useMemo","isUndefined","transport","HttpRpcTransport","XyoViewerRpcSchemas","JsonRpcXyoViewer","usePromise","isDefined","isDefinedNotNull","useViewerFromWallet","networkId","gateway","error","isLoading","useGateway","usePromise","isDefinedNotNull","isDefined","connection","viewer","DefaultConnectComponent","props","React","ButtonEx","variant","size","DefaultNoWalletInstalledComponent","Alert","severity","AlertTitle","Typography","gutterBottom","Button","sx","display","justifySelf","href","target","rel","ConnectAccountsStack","AccountComponent","ConnectedAccount","ConnectComponent","NoWalletInstalledComponent","onAccountConnected","timeout","address","connectSigner","error","timedout","useConnectAccount","undefined","useEffect","isDefined","Stack","direction","alignItems","spacing","isUndefined","onClick","ErrorRender","scope"]}
|
|
1
|
+
{"version":3,"sources":["../../src/components/connected/account/Connected.tsx","../../src/components/connected/ConnectAccountsStack.tsx","../../src/hooks/client/useClient.ts","../../src/hooks/helpers/getXyoClient.ts","../../src/hooks/helpers/transaction/Confirmation.ts","../../src/hooks/client/permissions/usePermissions.ts","../../src/hooks/client/permissions/usePermissionsAccounts.ts","../../src/hooks/client/helpers/findCaveat.ts","../../src/hooks/client/useGateway.ts","../../src/hooks/useAddressBalance.ts","../../src/hooks/useConfirmTransactionBase.ts","../../src/hooks/useConnectAccount.ts","../../src/hooks/useCurrentBlock.ts","../../src/hooks/useHttpRpcRunner.ts","../../src/hooks/useNetwork.ts","../../src/hooks/useSigner.ts","../../src/hooks/viewer/useCheckRpc.ts","../../src/hooks/viewer/useHttpRpcViewer.ts","../../src/hooks/viewer/useViewerFromWallet.ts"],"sourcesContent":["import {\n Stack, Tooltip, Typography,\n} from '@mui/material'\nimport { EthAddressWrapper } from '@xylabs/eth-address'\nimport { BlockiesAvatarAddress } from '@xyo-network/react-chain-blockies'\nimport React from 'react'\n\nexport const ConnectedAccount: React.FC<{ address: string }> = ({ address }) => {\n const shortenedAddress = `${EthAddressWrapper.fromString(address)?.toShortString(4)}`\n\n return (\n <Stack direction=\"row\" alignItems=\"center\" spacing={1}>\n <BlockiesAvatarAddress address={address} size={21} />\n <Tooltip title={address}>\n <Typography color=\"textSecondary\" variant=\"caption\" fontFamily=\"monospace\">{shortenedAddress}</Typography>\n </Tooltip>\n </Stack>\n )\n}\n","import type { StackProps } from '@mui/material'\nimport {\n Alert, AlertTitle, Button, Stack,\n Typography,\n} from '@mui/material'\nimport type { Address } from '@xylabs/hex'\nimport type { ButtonExProps } from '@xylabs/react-button'\nimport { ButtonEx } from '@xylabs/react-button'\nimport { isDefined, isUndefined } from '@xylabs/typeof'\nimport { ErrorRender } from '@xyo-network/react-error'\nimport type { ComponentType, MouseEventHandler } from 'react'\nimport React, { useEffect } from 'react'\n\nimport { useConnectAccount } from '../../hooks/index.ts'\nimport { ConnectedAccount } from './account/index.ts'\n\nconst DefaultConnectComponent: React.FC<ButtonExProps> = props => (\n <ButtonEx variant=\"contained\" size=\"small\" {...props} />\n)\n\nconst DefaultNoWalletInstalledComponent: React.FC = () => (\n <Alert severity=\"warning\">\n <AlertTitle>XL1 Wallet Not Found</AlertTitle>\n <Typography gutterBottom>\n Please ensure that your XL1 Wallet is installed to connect your account.\n </Typography>\n <Button\n sx={{ display: 'flex', justifySelf: 'end' }}\n size=\"small\"\n variant=\"outlined\"\n href=\"https://chromewebstore.google.com/detail/xl1-wallet/fblbagcjeigmhakkfgjpdlcapcgmcfbm\"\n target=\"_blank\"\n rel=\"noopener\"\n >\n Get XL1 Wallet\n </Button>\n </Alert>\n)\n\nexport interface ConnectClientAccountsStackProps extends StackProps {\n AccountComponent?: ComponentType<{ account?: string }>\n ConnectComponent?: ComponentType<{ onClick?: MouseEventHandler<HTMLElement> }>\n NoWalletInstalledComponent?: ComponentType\n onAccountConnected?: (account: Address) => void\n onCancel?: () => void\n timeout?: number\n}\n\nexport const ConnectAccountsStack: React.FC<ConnectClientAccountsStackProps> = ({\n AccountComponent = ConnectedAccount,\n ConnectComponent = DefaultConnectComponent,\n NoWalletInstalledComponent = DefaultNoWalletInstalledComponent,\n onAccountConnected,\n onCancel,\n timeout,\n ...props\n}) => {\n const {\n address, connectSigner, error, timedout,\n } = useConnectAccount(undefined, timeout)\n\n useEffect(() => {\n if (isDefined(error) && isDefined(onCancel)) {\n onCancel()\n }\n }, [error, onCancel])\n\n useEffect(() => {\n if (isDefined(address) && isDefined(onAccountConnected)) {\n onAccountConnected(address)\n }\n }, [address, onAccountConnected])\n\n return (\n <Stack direction=\"row\" alignItems=\"start\" spacing={2} {...props}>\n {isDefined(address)\n ? <AccountComponent address={address} />\n : null}\n {isUndefined(address) && !timedout && (\n <ConnectComponent onClick={() => void connectSigner()}>Connect</ConnectComponent>\n )}\n {isUndefined(address) && timedout && (\n <NoWalletInstalledComponent />\n )}\n <ErrorRender error={error} scope=\"ConnectSigner:error\" />\n </Stack>\n )\n}\n","import type { XyoClient } from '@xyo-network/xl1-protocol'\nimport { useSyncExternalStore } from 'react'\n\nimport { getXyoClient } from '../helpers/index.ts'\n\ninterface ClientState {\n client?: XyoClient\n error: Error | null\n isLoading: boolean\n timedout: boolean\n}\n\nlet currentState: ClientState = {\n client: undefined,\n error: null,\n isLoading: false,\n timedout: false,\n}\n\nconst listeners = new Set<() => void>()\n\nconst emitChange = () => {\n for (const listener of listeners) listener()\n}\n\nconst updateState = (newState: Partial<ClientState>) => {\n currentState = { ...currentState, ...newState }\n emitChange()\n}\n\nconst initializeClient = async (timeout?: number) => {\n if (currentState.isLoading || currentState.client) return\n\n updateState({ isLoading: true, error: null })\n\n try {\n const client = await getXyoClient(timeout)\n if (client === null) {\n updateState({ timedout: true, isLoading: false })\n return\n }\n updateState({\n client, isLoading: false, error: null,\n })\n } catch (error) {\n console.error('Error initializing XyoClient', error)\n updateState({ error: error as Error, isLoading: false })\n }\n}\n\nconst subscribe = (listener: () => void, timeout?: number) => {\n listeners.add(listener)\n\n void initializeClient(timeout)\n\n return () => {\n listeners.delete(listener)\n }\n}\n\nconst getSnapshot = (): ClientState => currentState\n\nexport const useClient = (timeout?: number) => {\n const subscribeWithTimeout = (listener: () => void) => subscribe(listener, timeout)\n return useSyncExternalStore(subscribeWithTimeout, getSnapshot)\n}\n","import type { XyoClient } from '@xyo-network/xl1-protocol'\n\nconst CLIENT_LISTENER_TIMEOUT = 500\n\nconst hasXyoClient = () => {\n return 'client' in globalThis.xyo\n}\n\nexport const listenForClientInjection = (onClientReady: () => void, timeout: number, onTimeout: () => void) => {\n let resolved = false\n const listener: EventListener = () => {\n onClientReady()\n resolved = true\n }\n globalThis.addEventListener('xyo:plugin-ready', listener)\n setTimeout(() => {\n if (!resolved) {\n onTimeout()\n }\n }, timeout)\n}\n\ntype ReturnType = XyoClient | undefined | null\n\nexport async function getXyoClient(timeout = CLIENT_LISTENER_TIMEOUT): Promise<ReturnType> {\n return hasXyoClient()\n ? globalThis.xyo.client\n // listen for the XyoWallet to be injected\n : await new Promise<ReturnType>((resolve) => {\n listenForClientInjection(\n () => {\n resolve(globalThis.xyo.client)\n },\n timeout,\n () => {\n resolve(null)\n },\n )\n })\n}\n","import { assertEx } from '@xylabs/assert'\nimport { delay } from '@xylabs/delay'\nimport { forget } from '@xylabs/forget'\nimport type { Hash } from '@xylabs/hex'\nimport type { Promisable } from '@xylabs/promise'\nimport { isDefined, isNull } from '@xylabs/typeof'\nimport type { SignedHydratedTransaction, XyoViewer } from '@xyo-network/xl1-protocol'\n\nexport type ConfirmationStatusUpdate = {\n blockNumber: number\n confirmed: boolean\n error?: Error\n progress?: number\n remainingBlocks?: number\n}\n\nexport type TransactionConfirmationParams = {\n onStatusUpdate?: (status: ConfirmationStatusUpdate) => void\n transaction: SignedHydratedTransaction\n txHash: Hash\n viewer: XyoViewer\n}\n\nexport class TransactionConfirmationStatus {\n private readonly _params: TransactionConfirmationParams\n private active = false\n\n constructor(params: TransactionConfirmationParams) {\n this._params = params\n }\n\n get exp(): number {\n return assertEx(this.transaction[0].exp, () => 'exp is not found, transaction is not set')\n }\n\n get nbf(): number {\n return assertEx(this.transaction[0].nbf, () => 'nbf is not found, transaction is not set')\n }\n\n get onStatusUpdate(): TransactionConfirmationParams['onStatusUpdate'] {\n return this._params.onStatusUpdate\n }\n\n get params(): TransactionConfirmationParams {\n return this._params\n }\n\n get transaction(): SignedHydratedTransaction {\n return this.params.transaction\n }\n\n get txHash(): Hash {\n return this.params.txHash\n }\n\n get viewer(): XyoViewer {\n return this.params.viewer\n }\n\n static create(params: TransactionConfirmationParams): Promisable<TransactionConfirmationStatus> {\n return new TransactionConfirmationStatus(params)\n }\n\n async start(): Promise<void> {\n this.active = true\n try {\n const currentBlockNumber = await this.viewer.currentBlockNumber()\n while (isDefined(currentBlockNumber) && this.active) {\n await this.checkBlock(currentBlockNumber)\n // check block every second to see if the transaction is confirmed\n await delay(1000)\n }\n } catch (error) {\n await this.stop()\n forget(this.onStatusUpdate?.({\n error: error instanceof Error ? error : new Error('Unknown error occurred'),\n confirmed: false,\n blockNumber: 0,\n progress: 0,\n remainingBlocks: 0,\n }))\n }\n }\n\n stop(): Promisable<void> {\n this.active = false\n }\n\n private async checkBlock(blockNumber: number): Promise<void> {\n if (blockNumber < this.nbf) {\n await this.stop()\n forget(this.onStatusUpdate?.({\n error: new Error(`Block number: ${blockNumber} is before ${this.nbf}`),\n confirmed: false,\n blockNumber,\n progress: 0,\n remainingBlocks: this.exp - blockNumber,\n }))\n }\n if (blockNumber > this.exp) {\n forget(this.onStatusUpdate?.({\n confirmed: false, blockNumber, progress: 100, remainingBlocks: 0,\n }))\n return\n }\n if (blockNumber < this.exp) {\n await this.checkConfirmation(blockNumber)\n }\n }\n\n private async checkConfirmation(blockNumber: number): Promise<void> {\n const remainingBlocks = this.exp - blockNumber\n const progress = Math.round(((blockNumber - this.nbf) / (this.exp - this.nbf)) * 100)\n\n const tx = await this.viewer.transactionByHash?.(this.txHash)\n if (isNull(tx)) {\n this.onStatusUpdate?.({\n confirmed: false, blockNumber, progress, remainingBlocks,\n })\n } else {\n this.onStatusUpdate?.({\n confirmed: true, blockNumber, progress, remainingBlocks,\n })\n await this.stop()\n }\n }\n}\n","import { useClient } from '../useClient.ts'\n\nexport const usePermissions = () => {\n const {\n client, isLoading, error, timedout,\n } = useClient()\n const permissions = client?.permissions\n return {\n permissions,\n isLoading,\n error,\n timedout,\n }\n}\n","import { usePromise } from '@xylabs/react-promise'\nimport {\n isArray, isDefined, isDefinedNotNull, isString,\n} from '@xylabs/typeof'\nimport type { JsonValue } from '@xyo-network/xl1-rpc'\n\nimport { findCaveat } from '../helpers/index.ts'\nimport { usePermissions } from './usePermissions.ts'\n\nconst validateRestrictedAccounts = (restrictedAccounts: JsonValue): readonly string [] => {\n if (isDefined(restrictedAccounts)) {\n if (isArray(restrictedAccounts) && restrictedAccounts.every(isString)) {\n return restrictedAccounts\n }\n throw new Error(\n `Unrecognized format for restrictReturnedAccounts caveat found on permissions. \\n\n Should be an array of strings: ${JSON.stringify(restrictedAccounts)}`,\n )\n }\n return []\n}\n\nexport const useAccountPermissions = () => {\n const { permissions, error } = usePermissions()\n\n return usePromise(async () => {\n if (isDefinedNotNull(error)) throw error\n if (isDefined(permissions)) {\n const restrictedAccounts = await findCaveat(\n permissions,\n // TODO - extract to constant in protocol package\n 'xyoWallet_getAccounts',\n 'restrictReturnedAccounts',\n )\n return validateRestrictedAccounts(restrictedAccounts)\n }\n }, [permissions])\n}\n","import { isDefined } from '@xylabs/typeof'\nimport type { CaveatTypes, XyoPermissions } from '@xyo-network/xl1-protocol'\nimport type { ParentCapability } from '@xyo-network/xl1-rpc'\n\nexport const findCaveat = async (\n permissions: XyoPermissions,\n targetCapability: ParentCapability,\n targetCaveatType: CaveatTypes,\n) => {\n const existingPermissions = await permissions.getPermissions()\n if (isDefined(existingPermissions) && existingPermissions.length > 0) {\n const foundPermissions = existingPermissions\n .find(p => p.parentCapability === targetCapability)\n if (isDefined(foundPermissions)) {\n return foundPermissions.caveats?.find(caveat => caveat.type === targetCaveatType)?.value ?? []\n }\n }\n return existingPermissions\n}\n","import type { GatewayName } from '@xyo-network/xl1-protocol'\n\nimport { useClient } from './useClient.ts'\n\nexport const useGateway = (gatewayName?: GatewayName, timeout?: number) => {\n const {\n client, isLoading, error, timedout,\n } = useClient(timeout)\n return {\n gateway: gatewayName ? client?.gateways?.[gatewayName] : undefined,\n isLoading,\n error,\n timedout,\n }\n}\n","import type { Address } from '@xylabs/hex'\nimport { isUndefined, isUndefinedOrNull } from '@xylabs/typeof'\nimport type { AttoXL1, XyoViewer } from '@xyo-network/xl1-protocol'\nimport { ShiftedBigInt } from '@xyo-network/xl1-protocol'\nimport {\n useEffect, useMemo, useState,\n} from 'react'\n\nexport const useAddressBalance = (\n // address to get balance for\n address?: Address,\n // viewer to use for fetching balance\n viewer?: XyoViewer,\n // refresh balance trigger\n refresh?: number,\n) => {\n const [balancesResult, setBalancesResult] = useState<AttoXL1 | null>()\n const [loading, setLoading] = useState(false)\n const [balancesError, setBalancesError] = useState<Error>()\n\n useEffect(() => {\n let isCurrent = true\n if (isUndefined(viewer) || isUndefined(address)) return\n // Ensure the render is the current one before setting the state.\n // This solves the issue of overlapping calls where a previous call takes\n // longer than a subsequent one and returns a state value. Now, the latest\n // result is always returned.\n (viewer.accountBalance(address) as Promise<AttoXL1>).then((result) => {\n if (isCurrent) {\n setBalancesResult(result as AttoXL1)\n setLoading(false)\n }\n })\n .catch((err) => {\n if (isCurrent) {\n console.error('Error in queued call:', err)\n setBalancesResult(undefined)\n setBalancesError(err)\n setLoading(false)\n }\n })\n\n return () => {\n isCurrent = false\n }\n }, [address, viewer, refresh])\n\n useMemo(() => {\n if (balancesError) {\n setLoading(false)\n }\n }, [balancesError])\n\n const shiftedBigInt = useMemo(() => {\n if (typeof balancesResult !== 'bigint') return\n return new ShiftedBigInt(balancesResult, {\n places: 18, maxDecimal: 18, maxCharacters: 9, minDecimals: 1, locale: navigator.language,\n })\n }, [balancesResult])\n\n const balanceIntlFriendly = useMemo(() => {\n return shiftedBigInt?.toFullString()\n }, [shiftedBigInt])\n\n const shortBalanceIntlFriendly = useMemo(() => {\n return isUndefinedOrNull(balancesResult)\n ? undefined\n : (balancesResult < 1_000_000_000_000n && balancesResult > 0n) ? '<0.00001' : shiftedBigInt?.toShortString()\n }, [shiftedBigInt])\n\n return {\n address,\n balanceForAddress: balancesResult,\n balanceIntlFriendly,\n shortBalanceIntlFriendly,\n error: balancesError,\n loading,\n }\n}\n","import { forget } from '@xylabs/forget'\nimport type { Hash } from '@xylabs/hex'\nimport { isHash } from '@xylabs/hex'\nimport { usePromise } from '@xylabs/react-promise'\nimport { isDefined } from '@xylabs/typeof'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport type {\n SignedHydratedTransaction, XyoRunner, XyoViewer,\n} from '@xyo-network/xl1-protocol'\nimport { useEffect, useState } from 'react'\n\nimport type { ConfirmationStatusUpdate, TransactionConfirmationParams } from './helpers/index.ts'\nimport { TransactionConfirmationStatus } from './helpers/index.ts'\n\nexport const useConfirmTransactionBase = (\n // The transaction to confirm\n transaction?: SignedHydratedTransaction,\n // Callback for when the transaction is broadcast to the network\n onBroadcast?: (hash: Hash) => void,\n // Optional callback for status updates during confirmation\n onStatusUpdate?: TransactionConfirmationParams['onStatusUpdate'],\n // Runner to use for broadcasting transactions\n runner?: XyoRunner,\n // Viewer to use for checking transaction status\n viewer?: XyoViewer,\n) => {\n const [status, setStatus] = useState<ConfirmationStatusUpdate>()\n const onStatusUpdateLocal = (newStatus: ConfirmationStatusUpdate) => {\n setStatus(newStatus)\n }\n\n const [transactionConfirmationStatus, transactionConfirmationError] = usePromise(async () => {\n const hasRunner = isDefined(runner)\n if (transaction && viewer) {\n const hash = hasRunner ? (await runner.broadcastTransaction(transaction)) : PayloadBuilder.hash(transaction[0])\n if (isHash(hash)) {\n if (hasRunner && isDefined(onBroadcast)) onBroadcast(hash)\n const params: TransactionConfirmationParams = {\n onStatusUpdate: onStatusUpdate ?? onStatusUpdateLocal,\n transaction,\n txHash: hash,\n viewer,\n }\n const instance = await TransactionConfirmationStatus.create(params)\n await instance.start()\n return instance\n } else {\n throw new Error('unexpected return type from broadcast transaction')\n }\n }\n }, [transaction, runner, viewer])\n\n useEffect(() => {\n return () => {\n if (transactionConfirmationStatus) {\n // Stop the transaction confirmation status instance when the component unmounts\n forget(transactionConfirmationStatus.stop())\n }\n }\n }, [transactionConfirmationStatus])\n\n return { status, transactionConfirmationError }\n}\n","import { assertEx } from '@xylabs/assert'\nimport { type Address, asAddress } from '@xylabs/hex'\nimport { MainNetwork } from '@xyo-network/chain-network-model'\nimport type { GatewayName } from '@xyo-network/xl1-protocol'\nimport { useCallback, useState } from 'react'\n\nimport { useAccountPermissions, useGateway } from './client/index.ts'\n\nexport const useConnectAccount = (gatewayName: GatewayName = MainNetwork.id, timeout?: number) => {\n const [connectError, setConnectError] = useState<Error>()\n\n const {\n gateway, error, timedout,\n } = useGateway(gatewayName, timeout)\n\n const [accountPermissions, accountPermissionsError] = useAccountPermissions()\n\n const [address, setAddress] = useState<Address>()\n\n const connectSigner = useCallback(async () => {\n try {\n const assertedGateway = assertEx(gateway, () => `Gateway ${gatewayName} is not available`)\n const signer = await assertedGateway.signer()\n const address = await signer.address()\n setAddress(address)\n return address\n } catch (e) {\n setConnectError(e as Error)\n }\n }, [gateway, gatewayName])\n\n return {\n address: asAddress(accountPermissions?.[0] ?? address), connectSigner, error: error ?? accountPermissionsError ?? connectError, gateway, timedout,\n }\n}\n","import { usePromise } from '@xylabs/react-promise'\nimport { isDefinedNotNull } from '@xylabs/typeof'\nimport type { XyoViewer } from '@xyo-network/xl1-protocol'\n\nexport const useCurrentBlock = (refresh = 1, viewer?: XyoViewer | null) => {\n return usePromise(async () => {\n if (isDefinedNotNull(viewer) && refresh > 0) {\n const block = await viewer.currentBlock()\n return block\n }\n }, [viewer, refresh])\n}\n","import { isUndefined } from '@xylabs/typeof'\nimport type { RpcTransport, XyoRunnerRpcSchemas } from '@xyo-network/xl1-rpc'\nimport {\n AllRpcSchemas, HttpRpcTransport, JsonRpcXyoRunner,\n} from '@xyo-network/xl1-rpc'\nimport { useMemo } from 'react'\n\nexport const useHttpRpcRunner = (url?: string) => {\n return useMemo(() => {\n if (isUndefined(url)) {\n return\n }\n const transport = new HttpRpcTransport(`${url}/rpc`, AllRpcSchemas)\n return new JsonRpcXyoRunner(transport as RpcTransport<typeof XyoRunnerRpcSchemas>)\n }, [url])\n}\n","import { isUndefined } from '@xylabs/typeof'\nimport type { DefaultNetworkIds } from '@xyo-network/xl1-protocol'\nimport { MemoryXyoNetwork } from '@xyo-network/xl1-rpc'\nimport { useMemo } from 'react'\n\nexport const useNetwork = (id?: DefaultNetworkIds) => {\n const network = useMemo(() => {\n if (isUndefined(id)) return\n return new MemoryXyoNetwork(id)\n }, [id])\n\n return network\n}\n","import type { AccountInstance } from '@xyo-network/account-model'\nimport type { XyoConnection, XyoSigner } from '@xyo-network/xl1-protocol'\nimport { MemoryXyoSigner } from '@xyo-network/xl1-rpc'\nimport { useMemo } from 'react'\n\nexport const useSigner = (_provider?: XyoConnection, account?: AccountInstance) => {\n return useMemo<XyoSigner | undefined>(() => account ? new MemoryXyoSigner(account) : undefined, [account])\n}\n","import { delay } from '@xylabs/delay'\nimport { isDefined, isUndefined } from '@xylabs/typeof'\nimport { LocalNetwork, SequenceNetwork } from '@xyo-network/chain-network-model'\nimport {\n HttpRpcTransport, JsonRpcXyoViewer, XyoViewerRpcSchemas,\n} from '@xyo-network/xl1-rpc'\nimport {\n useEffect, useMemo, useState,\n} from 'react'\n\nconst INTERVAL = 5000 // 5 seconds\n\nconst localRpcEndpoint: string = `${LocalNetwork.url}/rpc`\nconst sequenceRpcEndpoint: string = `${SequenceNetwork.url}/rpc`\n\nexport const useCheckLocalRpc = () => {\n const isLocalProducer = useCheckRpc(localRpcEndpoint)\n return isLocalProducer\n}\n\nexport const useCheckSequenceRpc = () => {\n const isLocalProducer = useCheckRpc(sequenceRpcEndpoint)\n return isLocalProducer\n}\n\nexport const useCheckRpc = (endpoint?: string) => {\n const [isLocalProducer, setIsLocalProducer] = useState(false)\n const [error, setError] = useState<Error>()\n\n const viewer = useMemo(() => {\n if (isUndefined(endpoint)) return\n\n const transport = new HttpRpcTransport(endpoint, XyoViewerRpcSchemas)\n const viewer = new JsonRpcXyoViewer(transport)\n return viewer\n }, [endpoint])\n\n useEffect(() => {\n if (isUndefined(viewer)) return\n\n void (async () => {\n setError(undefined)\n while (!isLocalProducer) {\n try {\n const block = await viewer.currentBlock()\n setIsLocalProducer(isDefined(block))\n } catch (err) {\n setError(err as Error)\n setIsLocalProducer(false)\n }\n await delay(INTERVAL)\n }\n })()\n }, [viewer])\n\n return { isLocalProducer, error }\n}\n","import { isUndefined } from '@xylabs/typeof'\nimport {\n HttpRpcTransport, JsonRpcXyoViewer, XyoViewerRpcSchemas,\n} from '@xyo-network/xl1-rpc'\nimport { useMemo } from 'react'\n\nexport const useHttpRpcViewer = (url?: string) => {\n const resolvedViewer = useMemo(() => {\n if (isUndefined(url)) {\n return\n }\n const transport = new HttpRpcTransport(`${url}/rpc`, XyoViewerRpcSchemas)\n return new JsonRpcXyoViewer(transport)\n }, [url])\n\n return resolvedViewer\n}\n","import { usePromise } from '@xylabs/react-promise'\nimport { isDefined, isDefinedNotNull } from '@xylabs/typeof'\nimport type { GatewayName } from '@xyo-network/xl1-protocol'\n\nimport { useGateway } from '../client/index.ts'\n\n/**\n * Creates a JsonRpcXyoViewer instance based on the provided networkId.\n * @param networkId - a network id like 'sequence', 'local', etc.\n * @returns An instance of XyoViewer if the networkId is found in wallet gateways\n * otherwise undefined.\n */\nexport const useViewerFromWallet = (networkId?: GatewayName) => {\n const {\n gateway, error, isLoading,\n } = useGateway(networkId)\n\n return usePromise(async () => {\n if (isDefinedNotNull(error)) return null\n if (isLoading) return\n if (isDefined(gateway) && isDefined(networkId)) {\n const connection = await gateway?.connection()\n return connection?.viewer\n }\n }, [gateway, networkId])\n}\n"],"mappings":"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","names":["Stack","Tooltip","Typography","EthAddressWrapper","BlockiesAvatarAddress","React","ConnectedAccount","address","shortenedAddress","EthAddressWrapper","fromString","toShortString","Stack","direction","alignItems","spacing","BlockiesAvatarAddress","size","Tooltip","title","Typography","color","variant","fontFamily","Alert","AlertTitle","Button","Stack","Typography","ButtonEx","isDefined","isUndefined","ErrorRender","React","useEffect","useSyncExternalStore","CLIENT_LISTENER_TIMEOUT","hasXyoClient","globalThis","xyo","listenForClientInjection","onClientReady","timeout","onTimeout","resolved","listener","addEventListener","setTimeout","getXyoClient","client","Promise","resolve","assertEx","delay","forget","isDefined","isNull","TransactionConfirmationStatus","_params","active","params","exp","assertEx","transaction","nbf","onStatusUpdate","txHash","viewer","create","start","currentBlockNumber","isDefined","checkBlock","delay","error","stop","forget","Error","confirmed","blockNumber","progress","remainingBlocks","checkConfirmation","Math","round","tx","transactionByHash","isNull","currentState","client","undefined","error","isLoading","timedout","listeners","Set","emitChange","listener","updateState","newState","initializeClient","timeout","getXyoClient","console","subscribe","add","delete","getSnapshot","useClient","subscribeWithTimeout","useSyncExternalStore","usePermissions","client","isLoading","error","timedout","useClient","permissions","usePromise","isArray","isDefined","isDefinedNotNull","isString","isDefined","findCaveat","permissions","targetCapability","targetCaveatType","existingPermissions","getPermissions","isDefined","length","foundPermissions","find","p","parentCapability","caveats","caveat","type","value","validateRestrictedAccounts","restrictedAccounts","isDefined","isArray","every","isString","Error","JSON","stringify","useAccountPermissions","permissions","error","usePermissions","usePromise","isDefinedNotNull","findCaveat","useGateway","gatewayName","timeout","client","isLoading","error","timedout","useClient","gateway","gateways","undefined","isUndefined","isUndefinedOrNull","ShiftedBigInt","useEffect","useMemo","useState","useAddressBalance","address","viewer","refresh","balancesResult","setBalancesResult","useState","loading","setLoading","balancesError","setBalancesError","useEffect","isCurrent","isUndefined","accountBalance","then","result","catch","err","console","error","undefined","useMemo","shiftedBigInt","ShiftedBigInt","places","maxDecimal","maxCharacters","minDecimals","locale","navigator","language","balanceIntlFriendly","toFullString","shortBalanceIntlFriendly","isUndefinedOrNull","toShortString","balanceForAddress","forget","isHash","usePromise","isDefined","PayloadBuilder","useEffect","useState","useConfirmTransactionBase","transaction","onBroadcast","onStatusUpdate","runner","viewer","status","setStatus","useState","onStatusUpdateLocal","newStatus","transactionConfirmationStatus","transactionConfirmationError","usePromise","hasRunner","isDefined","hash","broadcastTransaction","PayloadBuilder","isHash","params","txHash","instance","TransactionConfirmationStatus","create","start","Error","useEffect","forget","stop","assertEx","asAddress","MainNetwork","useCallback","useState","useConnectAccount","gatewayName","MainNetwork","id","timeout","connectError","setConnectError","useState","gateway","error","timedout","useGateway","accountPermissions","accountPermissionsError","useAccountPermissions","address","setAddress","connectSigner","useCallback","assertedGateway","assertEx","signer","e","asAddress","usePromise","isDefinedNotNull","useCurrentBlock","refresh","viewer","usePromise","isDefinedNotNull","block","currentBlock","isUndefined","AllRpcSchemas","HttpRpcTransport","JsonRpcXyoRunner","useMemo","useHttpRpcRunner","url","useMemo","isUndefined","transport","HttpRpcTransport","AllRpcSchemas","JsonRpcXyoRunner","isUndefined","MemoryXyoNetwork","useMemo","useNetwork","id","network","useMemo","isUndefined","MemoryXyoNetwork","MemoryXyoSigner","useMemo","useSigner","_provider","account","useMemo","MemoryXyoSigner","undefined","delay","isDefined","isUndefined","LocalNetwork","SequenceNetwork","HttpRpcTransport","JsonRpcXyoViewer","XyoViewerRpcSchemas","useEffect","useMemo","useState","INTERVAL","localRpcEndpoint","LocalNetwork","url","sequenceRpcEndpoint","SequenceNetwork","useCheckLocalRpc","isLocalProducer","useCheckRpc","useCheckSequenceRpc","endpoint","setIsLocalProducer","useState","error","setError","viewer","useMemo","isUndefined","transport","HttpRpcTransport","XyoViewerRpcSchemas","JsonRpcXyoViewer","useEffect","undefined","block","currentBlock","isDefined","err","delay","isUndefined","HttpRpcTransport","JsonRpcXyoViewer","XyoViewerRpcSchemas","useMemo","useHttpRpcViewer","url","resolvedViewer","useMemo","isUndefined","transport","HttpRpcTransport","XyoViewerRpcSchemas","JsonRpcXyoViewer","usePromise","isDefined","isDefinedNotNull","useViewerFromWallet","networkId","gateway","error","isLoading","useGateway","usePromise","isDefinedNotNull","isDefined","connection","viewer","DefaultConnectComponent","props","React","ButtonEx","variant","size","DefaultNoWalletInstalledComponent","Alert","severity","AlertTitle","Typography","gutterBottom","Button","sx","display","justifySelf","href","target","rel","ConnectAccountsStack","AccountComponent","ConnectedAccount","ConnectComponent","NoWalletInstalledComponent","onAccountConnected","onCancel","timeout","address","connectSigner","error","timedout","useConnectAccount","undefined","useEffect","isDefined","Stack","direction","alignItems","spacing","isUndefined","onClick","ErrorRender","scope"]}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "http://json.schemastore.org/package.json",
|
|
3
3
|
"name": "@xyo-network/react-chain-provider",
|
|
4
|
-
"version": "1.15.
|
|
4
|
+
"version": "1.15.18",
|
|
5
5
|
"description": "XYO Layer One API",
|
|
6
6
|
"homepage": "https://xylabs.com",
|
|
7
7
|
"bugs": {
|
|
@@ -44,16 +44,18 @@
|
|
|
44
44
|
"@xylabs/assert": "~5.0.13",
|
|
45
45
|
"@xylabs/delay": "~5.0.13",
|
|
46
46
|
"@xylabs/eth-address": "~5.0.13",
|
|
47
|
+
"@xylabs/forget": "~5.0.13",
|
|
47
48
|
"@xylabs/hex": "~5.0.13",
|
|
49
|
+
"@xylabs/promise": "~5.0.13",
|
|
48
50
|
"@xylabs/react-button": "~7.1.6",
|
|
49
51
|
"@xylabs/react-promise": "~7.1.6",
|
|
50
52
|
"@xylabs/typeof": "~5.0.13",
|
|
51
53
|
"@xyo-network/account-model": "~5.1.7",
|
|
52
|
-
"@xyo-network/chain-network-model": "~1.15.
|
|
53
|
-
"@xyo-network/react-chain-blockies": "~1.15.
|
|
54
|
+
"@xyo-network/chain-network-model": "~1.15.18",
|
|
55
|
+
"@xyo-network/react-chain-blockies": "~1.15.18",
|
|
54
56
|
"@xyo-network/react-error": "~7.3.6",
|
|
55
57
|
"@xyo-network/xl1-protocol": "~1.12.84",
|
|
56
|
-
"@xyo-network/xl1-rpc": "~1.15.
|
|
58
|
+
"@xyo-network/xl1-rpc": "~1.15.18"
|
|
57
59
|
},
|
|
58
60
|
"devDependencies": {
|
|
59
61
|
"@emotion/react": "~11.14.0",
|
|
@@ -66,7 +68,7 @@
|
|
|
66
68
|
"@xylabs/tsconfig": "~7.1.8",
|
|
67
69
|
"@xylabs/tsconfig-dom": "~7.1.8",
|
|
68
70
|
"@xylabs/tsconfig-react": "~7.1.8",
|
|
69
|
-
"@xyo-network/react-chain-model": "~1.15.
|
|
71
|
+
"@xyo-network/react-chain-model": "~1.15.18",
|
|
70
72
|
"@xyo-network/react-error": "~7.3.6",
|
|
71
73
|
"eslint": "^9.38.0",
|
|
72
74
|
"react": "~19.2.0",
|
|
@@ -42,6 +42,7 @@ export interface ConnectClientAccountsStackProps extends StackProps {
|
|
|
42
42
|
ConnectComponent?: ComponentType<{ onClick?: MouseEventHandler<HTMLElement> }>
|
|
43
43
|
NoWalletInstalledComponent?: ComponentType
|
|
44
44
|
onAccountConnected?: (account: Address) => void
|
|
45
|
+
onCancel?: () => void
|
|
45
46
|
timeout?: number
|
|
46
47
|
}
|
|
47
48
|
|
|
@@ -50,6 +51,7 @@ export const ConnectAccountsStack: React.FC<ConnectClientAccountsStackProps> = (
|
|
|
50
51
|
ConnectComponent = DefaultConnectComponent,
|
|
51
52
|
NoWalletInstalledComponent = DefaultNoWalletInstalledComponent,
|
|
52
53
|
onAccountConnected,
|
|
54
|
+
onCancel,
|
|
53
55
|
timeout,
|
|
54
56
|
...props
|
|
55
57
|
}) => {
|
|
@@ -57,6 +59,12 @@ export const ConnectAccountsStack: React.FC<ConnectClientAccountsStackProps> = (
|
|
|
57
59
|
address, connectSigner, error, timedout,
|
|
58
60
|
} = useConnectAccount(undefined, timeout)
|
|
59
61
|
|
|
62
|
+
useEffect(() => {
|
|
63
|
+
if (isDefined(error) && isDefined(onCancel)) {
|
|
64
|
+
onCancel()
|
|
65
|
+
}
|
|
66
|
+
}, [error, onCancel])
|
|
67
|
+
|
|
60
68
|
useEffect(() => {
|
|
61
69
|
if (isDefined(address) && isDefined(onAccountConnected)) {
|
|
62
70
|
onAccountConnected(address)
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import { assertEx } from '@xylabs/assert'
|
|
2
|
+
import { delay } from '@xylabs/delay'
|
|
3
|
+
import { forget } from '@xylabs/forget'
|
|
4
|
+
import type { Hash } from '@xylabs/hex'
|
|
5
|
+
import type { Promisable } from '@xylabs/promise'
|
|
6
|
+
import { isDefined, isNull } from '@xylabs/typeof'
|
|
7
|
+
import type { SignedHydratedTransaction, XyoViewer } from '@xyo-network/xl1-protocol'
|
|
8
|
+
|
|
9
|
+
export type ConfirmationStatusUpdate = {
|
|
10
|
+
blockNumber: number
|
|
11
|
+
confirmed: boolean
|
|
12
|
+
error?: Error
|
|
13
|
+
progress?: number
|
|
14
|
+
remainingBlocks?: number
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export type TransactionConfirmationParams = {
|
|
18
|
+
onStatusUpdate?: (status: ConfirmationStatusUpdate) => void
|
|
19
|
+
transaction: SignedHydratedTransaction
|
|
20
|
+
txHash: Hash
|
|
21
|
+
viewer: XyoViewer
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export class TransactionConfirmationStatus {
|
|
25
|
+
private readonly _params: TransactionConfirmationParams
|
|
26
|
+
private active = false
|
|
27
|
+
|
|
28
|
+
constructor(params: TransactionConfirmationParams) {
|
|
29
|
+
this._params = params
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
get exp(): number {
|
|
33
|
+
return assertEx(this.transaction[0].exp, () => 'exp is not found, transaction is not set')
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
get nbf(): number {
|
|
37
|
+
return assertEx(this.transaction[0].nbf, () => 'nbf is not found, transaction is not set')
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
get onStatusUpdate(): TransactionConfirmationParams['onStatusUpdate'] {
|
|
41
|
+
return this._params.onStatusUpdate
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
get params(): TransactionConfirmationParams {
|
|
45
|
+
return this._params
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
get transaction(): SignedHydratedTransaction {
|
|
49
|
+
return this.params.transaction
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
get txHash(): Hash {
|
|
53
|
+
return this.params.txHash
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
get viewer(): XyoViewer {
|
|
57
|
+
return this.params.viewer
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
static create(params: TransactionConfirmationParams): Promisable<TransactionConfirmationStatus> {
|
|
61
|
+
return new TransactionConfirmationStatus(params)
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
async start(): Promise<void> {
|
|
65
|
+
this.active = true
|
|
66
|
+
try {
|
|
67
|
+
const currentBlockNumber = await this.viewer.currentBlockNumber()
|
|
68
|
+
while (isDefined(currentBlockNumber) && this.active) {
|
|
69
|
+
await this.checkBlock(currentBlockNumber)
|
|
70
|
+
// check block every second to see if the transaction is confirmed
|
|
71
|
+
await delay(1000)
|
|
72
|
+
}
|
|
73
|
+
} catch (error) {
|
|
74
|
+
await this.stop()
|
|
75
|
+
forget(this.onStatusUpdate?.({
|
|
76
|
+
error: error instanceof Error ? error : new Error('Unknown error occurred'),
|
|
77
|
+
confirmed: false,
|
|
78
|
+
blockNumber: 0,
|
|
79
|
+
progress: 0,
|
|
80
|
+
remainingBlocks: 0,
|
|
81
|
+
}))
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
stop(): Promisable<void> {
|
|
86
|
+
this.active = false
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
private async checkBlock(blockNumber: number): Promise<void> {
|
|
90
|
+
if (blockNumber < this.nbf) {
|
|
91
|
+
await this.stop()
|
|
92
|
+
forget(this.onStatusUpdate?.({
|
|
93
|
+
error: new Error(`Block number: ${blockNumber} is before ${this.nbf}`),
|
|
94
|
+
confirmed: false,
|
|
95
|
+
blockNumber,
|
|
96
|
+
progress: 0,
|
|
97
|
+
remainingBlocks: this.exp - blockNumber,
|
|
98
|
+
}))
|
|
99
|
+
}
|
|
100
|
+
if (blockNumber > this.exp) {
|
|
101
|
+
forget(this.onStatusUpdate?.({
|
|
102
|
+
confirmed: false, blockNumber, progress: 100, remainingBlocks: 0,
|
|
103
|
+
}))
|
|
104
|
+
return
|
|
105
|
+
}
|
|
106
|
+
if (blockNumber < this.exp) {
|
|
107
|
+
await this.checkConfirmation(blockNumber)
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
private async checkConfirmation(blockNumber: number): Promise<void> {
|
|
112
|
+
const remainingBlocks = this.exp - blockNumber
|
|
113
|
+
const progress = Math.round(((blockNumber - this.nbf) / (this.exp - this.nbf)) * 100)
|
|
114
|
+
|
|
115
|
+
const tx = await this.viewer.transactionByHash?.(this.txHash)
|
|
116
|
+
if (isNull(tx)) {
|
|
117
|
+
this.onStatusUpdate?.({
|
|
118
|
+
confirmed: false, blockNumber, progress, remainingBlocks,
|
|
119
|
+
})
|
|
120
|
+
} else {
|
|
121
|
+
this.onStatusUpdate?.({
|
|
122
|
+
confirmed: true, blockNumber, progress, remainingBlocks,
|
|
123
|
+
})
|
|
124
|
+
await this.stop()
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './Confirmation.ts'
|
package/src/hooks/index.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
export * from './client/index.ts'
|
|
2
2
|
export * from './helpers/index.ts'
|
|
3
3
|
export * from './useAddressBalance.ts'
|
|
4
|
+
export * from './useConfirmTransactionBase.ts'
|
|
4
5
|
export * from './useConnectAccount.ts'
|
|
5
6
|
export * from './useCurrentBlock.ts'
|
|
6
7
|
export * from './useHttpRpcRunner.ts'
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { forget } from '@xylabs/forget'
|
|
2
|
+
import type { Hash } from '@xylabs/hex'
|
|
3
|
+
import { isHash } from '@xylabs/hex'
|
|
4
|
+
import { usePromise } from '@xylabs/react-promise'
|
|
5
|
+
import { isDefined } from '@xylabs/typeof'
|
|
6
|
+
import { PayloadBuilder } from '@xyo-network/payload-builder'
|
|
7
|
+
import type {
|
|
8
|
+
SignedHydratedTransaction, XyoRunner, XyoViewer,
|
|
9
|
+
} from '@xyo-network/xl1-protocol'
|
|
10
|
+
import { useEffect, useState } from 'react'
|
|
11
|
+
|
|
12
|
+
import type { ConfirmationStatusUpdate, TransactionConfirmationParams } from './helpers/index.ts'
|
|
13
|
+
import { TransactionConfirmationStatus } from './helpers/index.ts'
|
|
14
|
+
|
|
15
|
+
export const useConfirmTransactionBase = (
|
|
16
|
+
// The transaction to confirm
|
|
17
|
+
transaction?: SignedHydratedTransaction,
|
|
18
|
+
// Callback for when the transaction is broadcast to the network
|
|
19
|
+
onBroadcast?: (hash: Hash) => void,
|
|
20
|
+
// Optional callback for status updates during confirmation
|
|
21
|
+
onStatusUpdate?: TransactionConfirmationParams['onStatusUpdate'],
|
|
22
|
+
// Runner to use for broadcasting transactions
|
|
23
|
+
runner?: XyoRunner,
|
|
24
|
+
// Viewer to use for checking transaction status
|
|
25
|
+
viewer?: XyoViewer,
|
|
26
|
+
) => {
|
|
27
|
+
const [status, setStatus] = useState<ConfirmationStatusUpdate>()
|
|
28
|
+
const onStatusUpdateLocal = (newStatus: ConfirmationStatusUpdate) => {
|
|
29
|
+
setStatus(newStatus)
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
const [transactionConfirmationStatus, transactionConfirmationError] = usePromise(async () => {
|
|
33
|
+
const hasRunner = isDefined(runner)
|
|
34
|
+
if (transaction && viewer) {
|
|
35
|
+
const hash = hasRunner ? (await runner.broadcastTransaction(transaction)) : PayloadBuilder.hash(transaction[0])
|
|
36
|
+
if (isHash(hash)) {
|
|
37
|
+
if (hasRunner && isDefined(onBroadcast)) onBroadcast(hash)
|
|
38
|
+
const params: TransactionConfirmationParams = {
|
|
39
|
+
onStatusUpdate: onStatusUpdate ?? onStatusUpdateLocal,
|
|
40
|
+
transaction,
|
|
41
|
+
txHash: hash,
|
|
42
|
+
viewer,
|
|
43
|
+
}
|
|
44
|
+
const instance = await TransactionConfirmationStatus.create(params)
|
|
45
|
+
await instance.start()
|
|
46
|
+
return instance
|
|
47
|
+
} else {
|
|
48
|
+
throw new Error('unexpected return type from broadcast transaction')
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}, [transaction, runner, viewer])
|
|
52
|
+
|
|
53
|
+
useEffect(() => {
|
|
54
|
+
return () => {
|
|
55
|
+
if (transactionConfirmationStatus) {
|
|
56
|
+
// Stop the transaction confirmation status instance when the component unmounts
|
|
57
|
+
forget(transactionConfirmationStatus.stop())
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}, [transactionConfirmationStatus])
|
|
61
|
+
|
|
62
|
+
return { status, transactionConfirmationError }
|
|
63
|
+
}
|
|
@@ -7,6 +7,8 @@ import { useCallback, useState } from 'react'
|
|
|
7
7
|
import { useAccountPermissions, useGateway } from './client/index.ts'
|
|
8
8
|
|
|
9
9
|
export const useConnectAccount = (gatewayName: GatewayName = MainNetwork.id, timeout?: number) => {
|
|
10
|
+
const [connectError, setConnectError] = useState<Error>()
|
|
11
|
+
|
|
10
12
|
const {
|
|
11
13
|
gateway, error, timedout,
|
|
12
14
|
} = useGateway(gatewayName, timeout)
|
|
@@ -16,14 +18,18 @@ export const useConnectAccount = (gatewayName: GatewayName = MainNetwork.id, tim
|
|
|
16
18
|
const [address, setAddress] = useState<Address>()
|
|
17
19
|
|
|
18
20
|
const connectSigner = useCallback(async () => {
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
21
|
+
try {
|
|
22
|
+
const assertedGateway = assertEx(gateway, () => `Gateway ${gatewayName} is not available`)
|
|
23
|
+
const signer = await assertedGateway.signer()
|
|
24
|
+
const address = await signer.address()
|
|
25
|
+
setAddress(address)
|
|
26
|
+
return address
|
|
27
|
+
} catch (e) {
|
|
28
|
+
setConnectError(e as Error)
|
|
29
|
+
}
|
|
24
30
|
}, [gateway, gatewayName])
|
|
25
31
|
|
|
26
32
|
return {
|
|
27
|
-
address: asAddress(accountPermissions?.[0] ?? address), connectSigner, error: error ?? accountPermissionsError, gateway, timedout,
|
|
33
|
+
address: asAddress(accountPermissions?.[0] ?? address), connectSigner, error: error ?? accountPermissionsError ?? connectError, gateway, timedout,
|
|
28
34
|
}
|
|
29
35
|
}
|