quantumcoin 6.14.2 → 6.14.5
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/CHANGELOG.md +442 -442
- package/FUNDING.json +10 -10
- package/LICENSE.md +21 -21
- package/README.md +132 -142
- package/SECURITY.md +34 -34
- package/dist/README.md +22 -22
- package/dist/quantumcoin.js +1127 -1324
- package/dist/quantumcoin.js.map +1 -1
- package/dist/quantumcoin.min.js +1 -1
- package/dist/quantumcoin.umd.js +1128 -1327
- package/dist/quantumcoin.umd.js.map +1 -1
- package/dist/quantumcoin.umd.min.js +1 -1
- package/dist/wordlists-extra.js +1 -1
- package/dist/wordlists-extra.js.map +1 -1
- package/dist/wordlists-extra.min.js +1 -1
- package/lib.commonjs/README.md +16 -16
- package/lib.commonjs/_version.js +1 -1
- package/lib.commonjs/crypto/signature.d.ts +3 -76
- package/lib.commonjs/crypto/signature.d.ts.map +1 -1
- package/lib.commonjs/crypto/signature.js +15 -199
- package/lib.commonjs/crypto/signature.js.map +1 -1
- package/lib.commonjs/crypto/signing-key.d.ts +1 -1
- package/lib.commonjs/crypto/signing-key.d.ts.map +1 -1
- package/lib.commonjs/crypto/signing-key.js +19 -10
- package/lib.commonjs/crypto/signing-key.js.map +1 -1
- package/lib.commonjs/package.json +12 -12
- package/lib.commonjs/providers/provider-jsonrpc.d.ts +0 -1
- package/lib.commonjs/providers/provider-jsonrpc.d.ts.map +1 -1
- package/lib.commonjs/providers/provider-jsonrpc.js +0 -1
- package/lib.commonjs/providers/provider-jsonrpc.js.map +1 -1
- package/lib.commonjs/quantumcoin.d.ts +2 -0
- package/lib.commonjs/quantumcoin.d.ts.map +1 -1
- package/lib.commonjs/quantumcoin.js +11 -5
- package/lib.commonjs/quantumcoin.js.map +1 -1
- package/lib.commonjs/transaction/address.d.ts.map +1 -1
- package/lib.commonjs/transaction/address.js +8 -3
- package/lib.commonjs/transaction/address.js.map +1 -1
- package/lib.commonjs/transaction/transaction.d.ts.map +1 -1
- package/lib.commonjs/transaction/transaction.js +7 -40
- package/lib.commonjs/transaction/transaction.js.map +1 -1
- package/lib.commonjs/wallet/json-keystore.d.ts.map +1 -1
- package/lib.commonjs/wallet/json-keystore.js +7 -7
- package/lib.commonjs/wallet/json-keystore.js.map +1 -1
- package/lib.commonjs/wallet/wallet.d.ts.map +1 -1
- package/lib.commonjs/wallet/wallet.js +2 -2
- package/lib.commonjs/wallet/wallet.js.map +1 -1
- package/lib.esm/README.md +16 -16
- package/lib.esm/_version.js +1 -1
- package/lib.esm/crypto/signature.d.ts +3 -76
- package/lib.esm/crypto/signature.d.ts.map +1 -1
- package/lib.esm/crypto/signature.js +16 -202
- package/lib.esm/crypto/signature.js.map +1 -1
- package/lib.esm/crypto/signing-key.d.ts +1 -1
- package/lib.esm/crypto/signing-key.d.ts.map +1 -1
- package/lib.esm/crypto/signing-key.js +20 -9
- package/lib.esm/crypto/signing-key.js.map +1 -1
- package/lib.esm/package.json +12 -12
- package/lib.esm/providers/provider-jsonrpc.d.ts +0 -1
- package/lib.esm/providers/provider-jsonrpc.d.ts.map +1 -1
- package/lib.esm/providers/provider-jsonrpc.js +0 -1
- package/lib.esm/providers/provider-jsonrpc.js.map +1 -1
- package/lib.esm/quantumcoin.d.ts +2 -0
- package/lib.esm/quantumcoin.d.ts.map +1 -1
- package/lib.esm/quantumcoin.js +6 -0
- package/lib.esm/quantumcoin.js.map +1 -1
- package/lib.esm/transaction/address.d.ts.map +1 -1
- package/lib.esm/transaction/address.js +8 -2
- package/lib.esm/transaction/address.js.map +1 -1
- package/lib.esm/transaction/transaction.d.ts.map +1 -1
- package/lib.esm/transaction/transaction.js +7 -40
- package/lib.esm/transaction/transaction.js.map +1 -1
- package/lib.esm/wallet/json-keystore.d.ts.map +1 -1
- package/lib.esm/wallet/json-keystore.js +11 -5
- package/lib.esm/wallet/json-keystore.js.map +1 -1
- package/lib.esm/wallet/wallet.d.ts.map +1 -1
- package/lib.esm/wallet/wallet.js +3 -1
- package/lib.esm/wallet/wallet.js.map +1 -1
- package/package.json +6 -5
- package/rollup.config.mjs +50 -50
- package/src.ts/_version.ts +1 -1
- package/src.ts/abi/abi-coder.ts +237 -237
- package/src.ts/abi/bytes32.ts +45 -45
- package/src.ts/abi/coders/abstract-coder.ts +541 -541
- package/src.ts/abi/coders/address.ts +36 -36
- package/src.ts/abi/coders/anonymous.ts +29 -29
- package/src.ts/abi/coders/array.ts +199 -199
- package/src.ts/abi/coders/boolean.ts +27 -27
- package/src.ts/abi/coders/bytes.ts +43 -43
- package/src.ts/abi/coders/fixed-bytes.ts +37 -37
- package/src.ts/abi/coders/null.ts +28 -28
- package/src.ts/abi/coders/number.ts +63 -63
- package/src.ts/abi/coders/string.ts +29 -29
- package/src.ts/abi/coders/tuple.ts +69 -69
- package/src.ts/abi/fragments.ts +1617 -1617
- package/src.ts/abi/index.ts +41 -41
- package/src.ts/abi/interface.ts +1271 -1271
- package/src.ts/abi/typed.ts +796 -796
- package/src.ts/address/address.ts +148 -148
- package/src.ts/address/checks.ts +123 -123
- package/src.ts/address/contract-address.ts +80 -80
- package/src.ts/address/index.ts +57 -57
- package/src.ts/constants/addresses.ts +8 -8
- package/src.ts/constants/hashes.ts +7 -7
- package/src.ts/constants/index.ts +16 -16
- package/src.ts/constants/numbers.ts +35 -35
- package/src.ts/constants/strings.ts +16 -16
- package/src.ts/contract/contract.ts +1120 -1120
- package/src.ts/contract/factory.ts +143 -143
- package/src.ts/contract/index.ts +31 -31
- package/src.ts/contract/types.ts +236 -236
- package/src.ts/contract/wrappers.ts +225 -225
- package/src.ts/crypto/crypto-browser.ts +64 -64
- package/src.ts/crypto/crypto.ts +4 -4
- package/src.ts/crypto/hmac.ts +51 -51
- package/src.ts/crypto/index.ts +59 -59
- package/src.ts/crypto/keccak.ts +54 -54
- package/src.ts/crypto/pbkdf2.ts +55 -55
- package/src.ts/crypto/random.ts +36 -36
- package/src.ts/crypto/ripemd160.ts +43 -43
- package/src.ts/crypto/scrypt.ts +114 -114
- package/src.ts/crypto/sha2.ts +78 -78
- package/src.ts/crypto/signature.ts +145 -349
- package/src.ts/crypto/signing-key.ts +126 -118
- package/src.ts/hash/authorization.ts +38 -38
- package/src.ts/hash/id.ts +17 -17
- package/src.ts/hash/index.ts +18 -18
- package/src.ts/hash/message.ts +51 -51
- package/src.ts/hash/namehash.ts +101 -101
- package/src.ts/hash/solidity.ts +117 -117
- package/src.ts/hash/typed-data.ts +658 -658
- package/src.ts/index.ts +12 -12
- package/src.ts/providers/abstract-provider.ts +1761 -1761
- package/src.ts/providers/abstract-signer.ts +314 -314
- package/src.ts/providers/community.ts +49 -49
- package/src.ts/providers/contracts.ts +42 -42
- package/src.ts/providers/default-provider.ts +96 -96
- package/src.ts/providers/ens-resolver.ts +606 -606
- package/src.ts/providers/format.ts +320 -320
- package/src.ts/providers/formatting.ts +418 -418
- package/src.ts/providers/index.ts +125 -125
- package/src.ts/providers/network.ts +327 -327
- package/src.ts/providers/pagination.ts +8 -8
- package/src.ts/providers/plugin-fallback.ts +35 -35
- package/src.ts/providers/plugins-network.ts +281 -281
- package/src.ts/providers/provider-browser.ts +334 -334
- package/src.ts/providers/provider-fallback.ts +801 -801
- package/src.ts/providers/provider-ipcsocket-browser.ts +3 -3
- package/src.ts/providers/provider-ipcsocket.ts +81 -81
- package/src.ts/providers/provider-jsonrpc.ts +1334 -1335
- package/src.ts/providers/provider-socket.ts +352 -352
- package/src.ts/providers/provider-websocket.ts +103 -103
- package/src.ts/providers/provider.ts +2136 -2136
- package/src.ts/providers/signer-noncemanager.ts +98 -98
- package/src.ts/providers/signer.ts +166 -166
- package/src.ts/providers/subscriber-connection.ts +74 -74
- package/src.ts/providers/subscriber-filterid.ts +199 -199
- package/src.ts/providers/subscriber-polling.ts +321 -321
- package/src.ts/providers/ws-browser.ts +11 -11
- package/src.ts/providers/ws.ts +3 -3
- package/src.ts/quantumcoin.ts +219 -211
- package/src.ts/thirdparty.d.ts +16 -16
- package/src.ts/transaction/accesslist.ts +43 -43
- package/src.ts/transaction/address.ts +35 -31
- package/src.ts/transaction/authorization.ts +14 -14
- package/src.ts/transaction/index.ts +51 -51
- package/src.ts/transaction/transaction.ts +1349 -1379
- package/src.ts/utils/base58.ts +73 -73
- package/src.ts/utils/base64-browser.ts +25 -25
- package/src.ts/utils/base64.ts +56 -56
- package/src.ts/utils/data.ts +199 -199
- package/src.ts/utils/errors.ts +793 -793
- package/src.ts/utils/events.ts +105 -105
- package/src.ts/utils/fetch.ts +970 -970
- package/src.ts/utils/fixednumber.ts +643 -643
- package/src.ts/utils/geturl-browser.ts +81 -81
- package/src.ts/utils/geturl.ts +134 -134
- package/src.ts/utils/index.ts +95 -95
- package/src.ts/utils/maths.ts +240 -240
- package/src.ts/utils/properties.ts +60 -60
- package/src.ts/utils/rlp-decode.ts +104 -104
- package/src.ts/utils/rlp-encode.ts +64 -64
- package/src.ts/utils/rlp.ts +20 -20
- package/src.ts/utils/units.ts +91 -91
- package/src.ts/utils/utf8.ts +325 -325
- package/src.ts/utils/uuid.ts +36 -36
- package/src.ts/wallet/base-wallet.ts +160 -160
- package/src.ts/wallet/index.ts +32 -32
- package/src.ts/wallet/json-keystore.ts +108 -106
- package/src.ts/wallet/utils.ts +147 -147
- package/src.ts/wallet/wallet.ts +138 -139
- package/src.ts/wordlists/bit-reader.ts +35 -35
- package/src.ts/wordlists/decode-owl.ts +58 -58
- package/src.ts/wordlists/decode-owla.ts +33 -33
- package/src.ts/wordlists/generation/encode-latin.ts +370 -370
- package/src.ts/wordlists/index.ts +26 -26
- package/src.ts/wordlists/lang-cz.ts +33 -33
- package/src.ts/wordlists/lang-en.ts +33 -33
- package/src.ts/wordlists/lang-es.ts +35 -35
- package/src.ts/wordlists/lang-fr.ts +34 -34
- package/src.ts/wordlists/lang-it.ts +33 -33
- package/src.ts/wordlists/lang-ja.ts +181 -181
- package/src.ts/wordlists/lang-ko.ts +104 -104
- package/src.ts/wordlists/lang-pt.ts +34 -34
- package/src.ts/wordlists/lang-zh.ts +112 -112
- package/src.ts/wordlists/wordlist-owl.ts +77 -77
- package/src.ts/wordlists/wordlist-owla.ts +41 -41
- package/src.ts/wordlists/wordlist.ts +59 -59
- package/src.ts/wordlists/wordlists-browser.ts +8 -8
- package/src.ts/wordlists/wordlists-extra.ts +9 -9
- package/src.ts/wordlists/wordlists.ts +38 -38
- package/dist/quantumcoin.min.js'.gz' +0 -0
- package/dist/quantumcoin.umd.min.js'.gz' +0 -0
- package/dist/wordlists-extra.min.js'.gz' +0 -0
- package/lib.commonjs/providers/provider-alchemy.d.ts +0 -50
- package/lib.commonjs/providers/provider-alchemy.d.ts.map +0 -1
- package/lib.commonjs/providers/provider-alchemy.js +0 -151
- package/lib.commonjs/providers/provider-alchemy.js.map +0 -1
- package/lib.commonjs/providers/provider-ankr.d.ts +0 -61
- package/lib.commonjs/providers/provider-ankr.d.ts.map +0 -1
- package/lib.commonjs/providers/provider-ankr.js +0 -137
- package/lib.commonjs/providers/provider-ankr.js.map +0 -1
- package/lib.commonjs/providers/provider-blockscout.d.ts +0 -59
- package/lib.commonjs/providers/provider-blockscout.d.ts.map +0 -1
- package/lib.commonjs/providers/provider-blockscout.js +0 -145
- package/lib.commonjs/providers/provider-blockscout.js.map +0 -1
- package/lib.commonjs/providers/provider-chainstack.d.ts +0 -46
- package/lib.commonjs/providers/provider-chainstack.d.ts.map +0 -1
- package/lib.commonjs/providers/provider-chainstack.js +0 -102
- package/lib.commonjs/providers/provider-chainstack.js.map +0 -1
- package/lib.commonjs/providers/provider-cloudflare.d.ts +0 -14
- package/lib.commonjs/providers/provider-cloudflare.d.ts.map +0 -1
- package/lib.commonjs/providers/provider-cloudflare.js +0 -26
- package/lib.commonjs/providers/provider-cloudflare.js.map +0 -1
- package/lib.commonjs/providers/provider-etherscan.d.ts +0 -147
- package/lib.commonjs/providers/provider-etherscan.d.ts.map +0 -1
- package/lib.commonjs/providers/provider-etherscan.js +0 -587
- package/lib.commonjs/providers/provider-etherscan.js.map +0 -1
- package/lib.commonjs/providers/provider-infura.d.ts +0 -101
- package/lib.commonjs/providers/provider-infura.d.ts.map +0 -1
- package/lib.commonjs/providers/provider-infura.js +0 -206
- package/lib.commonjs/providers/provider-infura.js.map +0 -1
- package/lib.commonjs/providers/provider-pocket.d.ts +0 -54
- package/lib.commonjs/providers/provider-pocket.d.ts.map +0 -1
- package/lib.commonjs/providers/provider-pocket.js +0 -109
- package/lib.commonjs/providers/provider-pocket.js.map +0 -1
- package/lib.commonjs/providers/provider-quicknode.d.ts +0 -59
- package/lib.commonjs/providers/provider-quicknode.d.ts.map +0 -1
- package/lib.commonjs/providers/provider-quicknode.js +0 -163
- package/lib.commonjs/providers/provider-quicknode.js.map +0 -1
- package/lib.commonjs/wallet/hdwallet.d.ts +0 -248
- package/lib.commonjs/wallet/hdwallet.d.ts.map +0 -1
- package/lib.commonjs/wallet/hdwallet.js +0 -505
- package/lib.commonjs/wallet/hdwallet.js.map +0 -1
- package/lib.commonjs/wallet/json-crowdsale.d.ts +0 -27
- package/lib.commonjs/wallet/json-crowdsale.d.ts.map +0 -1
- package/lib.commonjs/wallet/json-crowdsale.js +0 -60
- package/lib.commonjs/wallet/json-crowdsale.js.map +0 -1
- package/lib.commonjs/wallet/mnemonic.d.ts +0 -65
- package/lib.commonjs/wallet/mnemonic.d.ts.map +0 -1
- package/lib.commonjs/wallet/mnemonic.js +0 -169
- package/lib.commonjs/wallet/mnemonic.js.map +0 -1
- package/lib.commonjs/wallet/seedwallet.d.ts +0 -4
- package/lib.commonjs/wallet/seedwallet.d.ts.map +0 -1
- package/lib.commonjs/wallet/seedwallet.js +0 -8
- package/lib.commonjs/wallet/seedwallet.js.map +0 -1
- package/lib.esm/providers/provider-alchemy.d.ts +0 -50
- package/lib.esm/providers/provider-alchemy.d.ts.map +0 -1
- package/lib.esm/providers/provider-alchemy.js +0 -147
- package/lib.esm/providers/provider-alchemy.js.map +0 -1
- package/lib.esm/providers/provider-ankr.d.ts +0 -61
- package/lib.esm/providers/provider-ankr.d.ts.map +0 -1
- package/lib.esm/providers/provider-ankr.js +0 -133
- package/lib.esm/providers/provider-ankr.js.map +0 -1
- package/lib.esm/providers/provider-blockscout.d.ts +0 -59
- package/lib.esm/providers/provider-blockscout.d.ts.map +0 -1
- package/lib.esm/providers/provider-blockscout.js +0 -141
- package/lib.esm/providers/provider-blockscout.js.map +0 -1
- package/lib.esm/providers/provider-chainstack.d.ts +0 -46
- package/lib.esm/providers/provider-chainstack.d.ts.map +0 -1
- package/lib.esm/providers/provider-chainstack.js +0 -98
- package/lib.esm/providers/provider-chainstack.js.map +0 -1
- package/lib.esm/providers/provider-cloudflare.d.ts +0 -14
- package/lib.esm/providers/provider-cloudflare.d.ts.map +0 -1
- package/lib.esm/providers/provider-cloudflare.js +0 -22
- package/lib.esm/providers/provider-cloudflare.js.map +0 -1
- package/lib.esm/providers/provider-etherscan.d.ts +0 -147
- package/lib.esm/providers/provider-etherscan.d.ts.map +0 -1
- package/lib.esm/providers/provider-etherscan.js +0 -584
- package/lib.esm/providers/provider-etherscan.js.map +0 -1
- package/lib.esm/providers/provider-infura.d.ts +0 -101
- package/lib.esm/providers/provider-infura.d.ts.map +0 -1
- package/lib.esm/providers/provider-infura.js +0 -201
- package/lib.esm/providers/provider-infura.js.map +0 -1
- package/lib.esm/providers/provider-pocket.d.ts +0 -54
- package/lib.esm/providers/provider-pocket.d.ts.map +0 -1
- package/lib.esm/providers/provider-pocket.js +0 -105
- package/lib.esm/providers/provider-pocket.js.map +0 -1
- package/lib.esm/providers/provider-quicknode.d.ts +0 -59
- package/lib.esm/providers/provider-quicknode.d.ts.map +0 -1
- package/lib.esm/providers/provider-quicknode.js +0 -159
- package/lib.esm/providers/provider-quicknode.js.map +0 -1
- package/lib.esm/wallet/hdwallet.d.ts +0 -248
- package/lib.esm/wallet/hdwallet.d.ts.map +0 -1
- package/lib.esm/wallet/hdwallet.js +0 -498
- package/lib.esm/wallet/hdwallet.js.map +0 -1
- package/lib.esm/wallet/json-crowdsale.d.ts +0 -27
- package/lib.esm/wallet/json-crowdsale.d.ts.map +0 -1
- package/lib.esm/wallet/json-crowdsale.js +0 -55
- package/lib.esm/wallet/json-crowdsale.js.map +0 -1
- package/lib.esm/wallet/mnemonic.d.ts +0 -65
- package/lib.esm/wallet/mnemonic.d.ts.map +0 -1
- package/lib.esm/wallet/mnemonic.js +0 -165
- package/lib.esm/wallet/mnemonic.js.map +0 -1
- package/lib.esm/wallet/seedwallet.d.ts +0 -4
- package/lib.esm/wallet/seedwallet.d.ts.map +0 -1
- package/lib.esm/wallet/seedwallet.js +0 -4
- package/lib.esm/wallet/seedwallet.js.map +0 -1
|
@@ -1,334 +1,334 @@
|
|
|
1
|
-
|
|
2
|
-
import { assertArgument, makeError } from "../utils/index.js";
|
|
3
|
-
|
|
4
|
-
import { JsonRpcApiPollingProvider } from "./provider-jsonrpc.js";
|
|
5
|
-
|
|
6
|
-
import type {
|
|
7
|
-
JsonRpcApiProviderOptions,
|
|
8
|
-
JsonRpcError, JsonRpcPayload, JsonRpcResult,
|
|
9
|
-
JsonRpcSigner
|
|
10
|
-
} from "./provider-jsonrpc.js";
|
|
11
|
-
import type { Network, Networkish } from "./network.js";
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
* The interface to an [[link-eip-1193]] provider, which is a standard
|
|
15
|
-
* used by most injected providers, which the [[BrowserProvider]] accepts
|
|
16
|
-
* and exposes the API of.
|
|
17
|
-
*/
|
|
18
|
-
export interface Eip1193Provider {
|
|
19
|
-
/**
|
|
20
|
-
* See [[link-eip-1193]] for details on this method.
|
|
21
|
-
*/
|
|
22
|
-
request(request: { method: string, params?: Array<any> | Record<string, any> }): Promise<any>;
|
|
23
|
-
};
|
|
24
|
-
|
|
25
|
-
/**
|
|
26
|
-
* The possible additional events dispatched when using the ``"debug"``
|
|
27
|
-
* event on a [[BrowserProvider]].
|
|
28
|
-
*/
|
|
29
|
-
export type DebugEventBrowserProvider = {
|
|
30
|
-
action: "sendEip1193Payload",
|
|
31
|
-
payload: { method: string, params: Array<any> }
|
|
32
|
-
} | {
|
|
33
|
-
action: "receiveEip1193Result",
|
|
34
|
-
result: any
|
|
35
|
-
} | {
|
|
36
|
-
action: "receiveEip1193Error",
|
|
37
|
-
error: Error
|
|
38
|
-
};
|
|
39
|
-
|
|
40
|
-
/**
|
|
41
|
-
* Provider info provided by the [[link-eip-6963]] discovery mechanism.
|
|
42
|
-
*/
|
|
43
|
-
export interface Eip6963ProviderInfo {
|
|
44
|
-
uuid: string;
|
|
45
|
-
name: string;
|
|
46
|
-
icon: string;
|
|
47
|
-
rdns: string;
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
interface Eip6963ProviderDetail {
|
|
51
|
-
info: Eip6963ProviderInfo;
|
|
52
|
-
provider: Eip1193Provider;
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
interface Eip6963Announcement {
|
|
56
|
-
type: "eip6963:announceProvider";
|
|
57
|
-
detail: Eip6963ProviderDetail
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
export type BrowserProviderOptions = {
|
|
61
|
-
polling?: boolean;
|
|
62
|
-
staticNetwork?: null | boolean | Network;
|
|
63
|
-
|
|
64
|
-
cacheTimeout?: number;
|
|
65
|
-
pollingInterval?: number;
|
|
66
|
-
|
|
67
|
-
providerInfo?: Eip6963ProviderInfo;
|
|
68
|
-
};
|
|
69
|
-
|
|
70
|
-
/**
|
|
71
|
-
* Specifies how [[link-eip-6963]] discovery should proceed.
|
|
72
|
-
*
|
|
73
|
-
* See: [[BrowserProvider-discover]]
|
|
74
|
-
*/
|
|
75
|
-
export interface BrowserDiscoverOptions {
|
|
76
|
-
/**
|
|
77
|
-
* Override provider detection with this provider.
|
|
78
|
-
*/
|
|
79
|
-
provider?: Eip1193Provider;
|
|
80
|
-
|
|
81
|
-
/**
|
|
82
|
-
* Duration to wait to detect providers. (default: 300ms)
|
|
83
|
-
*/
|
|
84
|
-
timeout?: number;
|
|
85
|
-
|
|
86
|
-
/**
|
|
87
|
-
* Return the first detected provider. Otherwise wait for %%timeout%%
|
|
88
|
-
* and allowing filtering before selecting the desired provider.
|
|
89
|
-
*/
|
|
90
|
-
anyProvider?: boolean;
|
|
91
|
-
|
|
92
|
-
/**
|
|
93
|
-
* Use the provided window context. Useful in non-standard
|
|
94
|
-
* environments or to hijack where a provider comes from.
|
|
95
|
-
*/
|
|
96
|
-
window?: any;
|
|
97
|
-
|
|
98
|
-
/**
|
|
99
|
-
* Explicitly choose which provider to used once scanning is complete.
|
|
100
|
-
*/
|
|
101
|
-
filter?: (found: Array<Eip6963ProviderInfo>) => null | BrowserProvider |
|
|
102
|
-
Eip6963ProviderInfo;
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
/**
|
|
107
|
-
* A **BrowserProvider** is intended to wrap an injected provider which
|
|
108
|
-
* adheres to the [[link-eip-1193]] standard, which most (if not all)
|
|
109
|
-
* currently do.
|
|
110
|
-
*/
|
|
111
|
-
export class BrowserProvider extends JsonRpcApiPollingProvider {
|
|
112
|
-
#request: (method: string, params: Array<any> | Record<string, any>) => Promise<any>;
|
|
113
|
-
|
|
114
|
-
#providerInfo: null | Eip6963ProviderInfo;
|
|
115
|
-
|
|
116
|
-
/**
|
|
117
|
-
* Connect to the %%ethereum%% provider, optionally forcing the
|
|
118
|
-
* %%network%%.
|
|
119
|
-
*/
|
|
120
|
-
constructor(ethereum: Eip1193Provider, network?: Networkish, _options?: BrowserProviderOptions) {
|
|
121
|
-
|
|
122
|
-
// Copy the options
|
|
123
|
-
const options: JsonRpcApiProviderOptions = Object.assign({ },
|
|
124
|
-
((_options != null) ? _options: { }),
|
|
125
|
-
{ batchMaxCount: 1 });
|
|
126
|
-
|
|
127
|
-
assertArgument(ethereum && ethereum.request, "invalid EIP-1193 provider", "ethereum", ethereum);
|
|
128
|
-
|
|
129
|
-
super(network, options);
|
|
130
|
-
|
|
131
|
-
this.#providerInfo = null;
|
|
132
|
-
if (_options && _options.providerInfo) {
|
|
133
|
-
this.#providerInfo = _options.providerInfo;
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
this.#request = async (method: string, params: Array<any> | Record<string, any>) => {
|
|
137
|
-
const payload = { method, params };
|
|
138
|
-
this.emit("debug", { action: "sendEip1193Request", payload });
|
|
139
|
-
try {
|
|
140
|
-
const result = await ethereum.request(payload);
|
|
141
|
-
this.emit("debug", { action: "receiveEip1193Result", result });
|
|
142
|
-
return result;
|
|
143
|
-
} catch (e: any) {
|
|
144
|
-
const error = new Error(e.message);
|
|
145
|
-
(<any>error).code = e.code;
|
|
146
|
-
(<any>error).data = e.data;
|
|
147
|
-
(<any>error).payload = payload;
|
|
148
|
-
this.emit("debug", { action: "receiveEip1193Error", error });
|
|
149
|
-
throw error;
|
|
150
|
-
}
|
|
151
|
-
};
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
get providerInfo(): null | Eip6963ProviderInfo {
|
|
155
|
-
return this.#providerInfo;
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
async send(method: string, params: Array<any> | Record<string, any>): Promise<any> {
|
|
159
|
-
await this._start();
|
|
160
|
-
|
|
161
|
-
return await super.send(method, params);
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
async _send(payload: JsonRpcPayload | Array<JsonRpcPayload>): Promise<Array<JsonRpcResult | JsonRpcError>> {
|
|
165
|
-
assertArgument(!Array.isArray(payload), "EIP-1193 does not support batch request", "payload", payload);
|
|
166
|
-
|
|
167
|
-
try {
|
|
168
|
-
const result = await this.#request(payload.method, payload.params || [ ]);
|
|
169
|
-
return [ { id: payload.id, result } ];
|
|
170
|
-
} catch (e: any) {
|
|
171
|
-
return [ {
|
|
172
|
-
id: payload.id,
|
|
173
|
-
error: { code: e.code, data: e.data, message: e.message }
|
|
174
|
-
} ];
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
getRpcError(payload: JsonRpcPayload, error: JsonRpcError): Error {
|
|
179
|
-
|
|
180
|
-
error = JSON.parse(JSON.stringify(error));
|
|
181
|
-
|
|
182
|
-
// EIP-1193 gives us some machine-readable error codes, so rewrite
|
|
183
|
-
// them into Ethers standard errors.
|
|
184
|
-
switch (error.error.code || -1) {
|
|
185
|
-
case 4001:
|
|
186
|
-
error.error.message = `ethers-user-denied: ${ error.error.message }`;
|
|
187
|
-
break;
|
|
188
|
-
case 4200:
|
|
189
|
-
error.error.message = `ethers-unsupported: ${ error.error.message }`;
|
|
190
|
-
break;
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
return super.getRpcError(payload, error);
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
/**
|
|
197
|
-
* Resolves to ``true`` if the provider manages the %%address%%.
|
|
198
|
-
*/
|
|
199
|
-
async hasSigner(address: number | string): Promise<boolean> {
|
|
200
|
-
if (address == null) { address = 0; }
|
|
201
|
-
|
|
202
|
-
const accounts = await this.send("eth_accounts", [ ]);
|
|
203
|
-
if (typeof(address) === "number") {
|
|
204
|
-
return (accounts.length > address);
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
address = address.toLowerCase();
|
|
208
|
-
return accounts.filter((a: string) => (a.toLowerCase() === address)).length !== 0;
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
async getSigner(address?: number | string): Promise<JsonRpcSigner> {
|
|
212
|
-
if (address == null) { address = 0; }
|
|
213
|
-
|
|
214
|
-
if (!(await this.hasSigner(address))) {
|
|
215
|
-
try {
|
|
216
|
-
await this.#request("eth_requestAccounts", [ ]);
|
|
217
|
-
|
|
218
|
-
} catch (error: any) {
|
|
219
|
-
const payload = error.payload;
|
|
220
|
-
throw this.getRpcError(payload, { id: payload.id, error });
|
|
221
|
-
}
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
return await super.getSigner(address);
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
/**
|
|
228
|
-
* Discover and connect to a Provider in the Browser using the
|
|
229
|
-
* [[link-eip-6963]] discovery mechanism. If no providers are
|
|
230
|
-
* present, ``null`` is resolved.
|
|
231
|
-
*/
|
|
232
|
-
static async discover(options?: BrowserDiscoverOptions): Promise<null | BrowserProvider> {
|
|
233
|
-
if (options == null) { options = { }; }
|
|
234
|
-
|
|
235
|
-
if (options.provider) {
|
|
236
|
-
return new BrowserProvider(options.provider);
|
|
237
|
-
}
|
|
238
|
-
|
|
239
|
-
const context = options.window ? options.window:
|
|
240
|
-
(typeof(window) !== "undefined") ? window: null;
|
|
241
|
-
|
|
242
|
-
if (context == null) { return null; }
|
|
243
|
-
|
|
244
|
-
const anyProvider = options.anyProvider;
|
|
245
|
-
if (anyProvider && context.ethereum) {
|
|
246
|
-
return new BrowserProvider(context.ethereum);
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
if (!("addEventListener" in context && "dispatchEvent" in context
|
|
250
|
-
&& "removeEventListener" in context)) {
|
|
251
|
-
return null;
|
|
252
|
-
}
|
|
253
|
-
|
|
254
|
-
const timeout = options.timeout ? options.timeout: 300;
|
|
255
|
-
if (timeout === 0) { return null; }
|
|
256
|
-
|
|
257
|
-
return await (new Promise((resolve, reject) => {
|
|
258
|
-
let found: Array<Eip6963ProviderDetail> = [ ];
|
|
259
|
-
|
|
260
|
-
const addProvider = (event: Eip6963Announcement) => {
|
|
261
|
-
found.push(event.detail);
|
|
262
|
-
if (anyProvider) { finalize(); }
|
|
263
|
-
};
|
|
264
|
-
|
|
265
|
-
const finalize = () => {
|
|
266
|
-
clearTimeout(timer);
|
|
267
|
-
|
|
268
|
-
if (found.length) {
|
|
269
|
-
|
|
270
|
-
// If filtering is provided:
|
|
271
|
-
if (options && options.filter) {
|
|
272
|
-
|
|
273
|
-
// Call filter, with a copies of found provider infos
|
|
274
|
-
const filtered = options.filter(found.map(i =>
|
|
275
|
-
Object.assign({ }, (i.info))));
|
|
276
|
-
|
|
277
|
-
if (filtered == null) {
|
|
278
|
-
// No provider selected
|
|
279
|
-
resolve(null);
|
|
280
|
-
|
|
281
|
-
} else if (filtered instanceof BrowserProvider) {
|
|
282
|
-
// Custom provider created
|
|
283
|
-
resolve(filtered);
|
|
284
|
-
|
|
285
|
-
} else {
|
|
286
|
-
// Find the matching provider
|
|
287
|
-
let match: null | Eip6963ProviderDetail = null;
|
|
288
|
-
if (filtered.uuid) {
|
|
289
|
-
const matches = found.filter(f =>
|
|
290
|
-
(filtered.uuid === f.info.uuid));
|
|
291
|
-
// @TODO: What should happen if multiple values
|
|
292
|
-
// for the same UUID?
|
|
293
|
-
match = matches[0];
|
|
294
|
-
}
|
|
295
|
-
|
|
296
|
-
if (match) {
|
|
297
|
-
const { provider, info } = match;
|
|
298
|
-
resolve(new BrowserProvider(provider, undefined, {
|
|
299
|
-
providerInfo: info
|
|
300
|
-
}));
|
|
301
|
-
} else {
|
|
302
|
-
reject(makeError("filter returned unknown info", "UNSUPPORTED_OPERATION", {
|
|
303
|
-
value: filtered
|
|
304
|
-
}));
|
|
305
|
-
}
|
|
306
|
-
}
|
|
307
|
-
|
|
308
|
-
} else {
|
|
309
|
-
|
|
310
|
-
// Pick the first found provider
|
|
311
|
-
const { provider, info } = found[0];
|
|
312
|
-
resolve(new BrowserProvider(provider, undefined, {
|
|
313
|
-
providerInfo: info
|
|
314
|
-
}));
|
|
315
|
-
}
|
|
316
|
-
|
|
317
|
-
} else {
|
|
318
|
-
// Nothing found
|
|
319
|
-
resolve(null);
|
|
320
|
-
}
|
|
321
|
-
|
|
322
|
-
context.removeEventListener(<any>"eip6963:announceProvider",
|
|
323
|
-
addProvider);
|
|
324
|
-
};
|
|
325
|
-
|
|
326
|
-
const timer = setTimeout(() => { finalize(); }, timeout);
|
|
327
|
-
|
|
328
|
-
context.addEventListener(<any>"eip6963:announceProvider",
|
|
329
|
-
addProvider);
|
|
330
|
-
|
|
331
|
-
context.dispatchEvent(new Event("eip6963:requestProvider"));
|
|
332
|
-
}));
|
|
333
|
-
}
|
|
334
|
-
}
|
|
1
|
+
|
|
2
|
+
import { assertArgument, makeError } from "../utils/index.js";
|
|
3
|
+
|
|
4
|
+
import { JsonRpcApiPollingProvider } from "./provider-jsonrpc.js";
|
|
5
|
+
|
|
6
|
+
import type {
|
|
7
|
+
JsonRpcApiProviderOptions,
|
|
8
|
+
JsonRpcError, JsonRpcPayload, JsonRpcResult,
|
|
9
|
+
JsonRpcSigner
|
|
10
|
+
} from "./provider-jsonrpc.js";
|
|
11
|
+
import type { Network, Networkish } from "./network.js";
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* The interface to an [[link-eip-1193]] provider, which is a standard
|
|
15
|
+
* used by most injected providers, which the [[BrowserProvider]] accepts
|
|
16
|
+
* and exposes the API of.
|
|
17
|
+
*/
|
|
18
|
+
export interface Eip1193Provider {
|
|
19
|
+
/**
|
|
20
|
+
* See [[link-eip-1193]] for details on this method.
|
|
21
|
+
*/
|
|
22
|
+
request(request: { method: string, params?: Array<any> | Record<string, any> }): Promise<any>;
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* The possible additional events dispatched when using the ``"debug"``
|
|
27
|
+
* event on a [[BrowserProvider]].
|
|
28
|
+
*/
|
|
29
|
+
export type DebugEventBrowserProvider = {
|
|
30
|
+
action: "sendEip1193Payload",
|
|
31
|
+
payload: { method: string, params: Array<any> }
|
|
32
|
+
} | {
|
|
33
|
+
action: "receiveEip1193Result",
|
|
34
|
+
result: any
|
|
35
|
+
} | {
|
|
36
|
+
action: "receiveEip1193Error",
|
|
37
|
+
error: Error
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Provider info provided by the [[link-eip-6963]] discovery mechanism.
|
|
42
|
+
*/
|
|
43
|
+
export interface Eip6963ProviderInfo {
|
|
44
|
+
uuid: string;
|
|
45
|
+
name: string;
|
|
46
|
+
icon: string;
|
|
47
|
+
rdns: string;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
interface Eip6963ProviderDetail {
|
|
51
|
+
info: Eip6963ProviderInfo;
|
|
52
|
+
provider: Eip1193Provider;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
interface Eip6963Announcement {
|
|
56
|
+
type: "eip6963:announceProvider";
|
|
57
|
+
detail: Eip6963ProviderDetail
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export type BrowserProviderOptions = {
|
|
61
|
+
polling?: boolean;
|
|
62
|
+
staticNetwork?: null | boolean | Network;
|
|
63
|
+
|
|
64
|
+
cacheTimeout?: number;
|
|
65
|
+
pollingInterval?: number;
|
|
66
|
+
|
|
67
|
+
providerInfo?: Eip6963ProviderInfo;
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Specifies how [[link-eip-6963]] discovery should proceed.
|
|
72
|
+
*
|
|
73
|
+
* See: [[BrowserProvider-discover]]
|
|
74
|
+
*/
|
|
75
|
+
export interface BrowserDiscoverOptions {
|
|
76
|
+
/**
|
|
77
|
+
* Override provider detection with this provider.
|
|
78
|
+
*/
|
|
79
|
+
provider?: Eip1193Provider;
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Duration to wait to detect providers. (default: 300ms)
|
|
83
|
+
*/
|
|
84
|
+
timeout?: number;
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Return the first detected provider. Otherwise wait for %%timeout%%
|
|
88
|
+
* and allowing filtering before selecting the desired provider.
|
|
89
|
+
*/
|
|
90
|
+
anyProvider?: boolean;
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Use the provided window context. Useful in non-standard
|
|
94
|
+
* environments or to hijack where a provider comes from.
|
|
95
|
+
*/
|
|
96
|
+
window?: any;
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Explicitly choose which provider to used once scanning is complete.
|
|
100
|
+
*/
|
|
101
|
+
filter?: (found: Array<Eip6963ProviderInfo>) => null | BrowserProvider |
|
|
102
|
+
Eip6963ProviderInfo;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* A **BrowserProvider** is intended to wrap an injected provider which
|
|
108
|
+
* adheres to the [[link-eip-1193]] standard, which most (if not all)
|
|
109
|
+
* currently do.
|
|
110
|
+
*/
|
|
111
|
+
export class BrowserProvider extends JsonRpcApiPollingProvider {
|
|
112
|
+
#request: (method: string, params: Array<any> | Record<string, any>) => Promise<any>;
|
|
113
|
+
|
|
114
|
+
#providerInfo: null | Eip6963ProviderInfo;
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* Connect to the %%ethereum%% provider, optionally forcing the
|
|
118
|
+
* %%network%%.
|
|
119
|
+
*/
|
|
120
|
+
constructor(ethereum: Eip1193Provider, network?: Networkish, _options?: BrowserProviderOptions) {
|
|
121
|
+
|
|
122
|
+
// Copy the options
|
|
123
|
+
const options: JsonRpcApiProviderOptions = Object.assign({ },
|
|
124
|
+
((_options != null) ? _options: { }),
|
|
125
|
+
{ batchMaxCount: 1 });
|
|
126
|
+
|
|
127
|
+
assertArgument(ethereum && ethereum.request, "invalid EIP-1193 provider", "ethereum", ethereum);
|
|
128
|
+
|
|
129
|
+
super(network, options);
|
|
130
|
+
|
|
131
|
+
this.#providerInfo = null;
|
|
132
|
+
if (_options && _options.providerInfo) {
|
|
133
|
+
this.#providerInfo = _options.providerInfo;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
this.#request = async (method: string, params: Array<any> | Record<string, any>) => {
|
|
137
|
+
const payload = { method, params };
|
|
138
|
+
this.emit("debug", { action: "sendEip1193Request", payload });
|
|
139
|
+
try {
|
|
140
|
+
const result = await ethereum.request(payload);
|
|
141
|
+
this.emit("debug", { action: "receiveEip1193Result", result });
|
|
142
|
+
return result;
|
|
143
|
+
} catch (e: any) {
|
|
144
|
+
const error = new Error(e.message);
|
|
145
|
+
(<any>error).code = e.code;
|
|
146
|
+
(<any>error).data = e.data;
|
|
147
|
+
(<any>error).payload = payload;
|
|
148
|
+
this.emit("debug", { action: "receiveEip1193Error", error });
|
|
149
|
+
throw error;
|
|
150
|
+
}
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
get providerInfo(): null | Eip6963ProviderInfo {
|
|
155
|
+
return this.#providerInfo;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
async send(method: string, params: Array<any> | Record<string, any>): Promise<any> {
|
|
159
|
+
await this._start();
|
|
160
|
+
|
|
161
|
+
return await super.send(method, params);
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
async _send(payload: JsonRpcPayload | Array<JsonRpcPayload>): Promise<Array<JsonRpcResult | JsonRpcError>> {
|
|
165
|
+
assertArgument(!Array.isArray(payload), "EIP-1193 does not support batch request", "payload", payload);
|
|
166
|
+
|
|
167
|
+
try {
|
|
168
|
+
const result = await this.#request(payload.method, payload.params || [ ]);
|
|
169
|
+
return [ { id: payload.id, result } ];
|
|
170
|
+
} catch (e: any) {
|
|
171
|
+
return [ {
|
|
172
|
+
id: payload.id,
|
|
173
|
+
error: { code: e.code, data: e.data, message: e.message }
|
|
174
|
+
} ];
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
getRpcError(payload: JsonRpcPayload, error: JsonRpcError): Error {
|
|
179
|
+
|
|
180
|
+
error = JSON.parse(JSON.stringify(error));
|
|
181
|
+
|
|
182
|
+
// EIP-1193 gives us some machine-readable error codes, so rewrite
|
|
183
|
+
// them into Ethers standard errors.
|
|
184
|
+
switch (error.error.code || -1) {
|
|
185
|
+
case 4001:
|
|
186
|
+
error.error.message = `ethers-user-denied: ${ error.error.message }`;
|
|
187
|
+
break;
|
|
188
|
+
case 4200:
|
|
189
|
+
error.error.message = `ethers-unsupported: ${ error.error.message }`;
|
|
190
|
+
break;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
return super.getRpcError(payload, error);
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
/**
|
|
197
|
+
* Resolves to ``true`` if the provider manages the %%address%%.
|
|
198
|
+
*/
|
|
199
|
+
async hasSigner(address: number | string): Promise<boolean> {
|
|
200
|
+
if (address == null) { address = 0; }
|
|
201
|
+
|
|
202
|
+
const accounts = await this.send("eth_accounts", [ ]);
|
|
203
|
+
if (typeof(address) === "number") {
|
|
204
|
+
return (accounts.length > address);
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
address = address.toLowerCase();
|
|
208
|
+
return accounts.filter((a: string) => (a.toLowerCase() === address)).length !== 0;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
async getSigner(address?: number | string): Promise<JsonRpcSigner> {
|
|
212
|
+
if (address == null) { address = 0; }
|
|
213
|
+
|
|
214
|
+
if (!(await this.hasSigner(address))) {
|
|
215
|
+
try {
|
|
216
|
+
await this.#request("eth_requestAccounts", [ ]);
|
|
217
|
+
|
|
218
|
+
} catch (error: any) {
|
|
219
|
+
const payload = error.payload;
|
|
220
|
+
throw this.getRpcError(payload, { id: payload.id, error });
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
return await super.getSigner(address);
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
/**
|
|
228
|
+
* Discover and connect to a Provider in the Browser using the
|
|
229
|
+
* [[link-eip-6963]] discovery mechanism. If no providers are
|
|
230
|
+
* present, ``null`` is resolved.
|
|
231
|
+
*/
|
|
232
|
+
static async discover(options?: BrowserDiscoverOptions): Promise<null | BrowserProvider> {
|
|
233
|
+
if (options == null) { options = { }; }
|
|
234
|
+
|
|
235
|
+
if (options.provider) {
|
|
236
|
+
return new BrowserProvider(options.provider);
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
const context = options.window ? options.window:
|
|
240
|
+
(typeof(window) !== "undefined") ? window: null;
|
|
241
|
+
|
|
242
|
+
if (context == null) { return null; }
|
|
243
|
+
|
|
244
|
+
const anyProvider = options.anyProvider;
|
|
245
|
+
if (anyProvider && context.ethereum) {
|
|
246
|
+
return new BrowserProvider(context.ethereum);
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
if (!("addEventListener" in context && "dispatchEvent" in context
|
|
250
|
+
&& "removeEventListener" in context)) {
|
|
251
|
+
return null;
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
const timeout = options.timeout ? options.timeout: 300;
|
|
255
|
+
if (timeout === 0) { return null; }
|
|
256
|
+
|
|
257
|
+
return await (new Promise((resolve, reject) => {
|
|
258
|
+
let found: Array<Eip6963ProviderDetail> = [ ];
|
|
259
|
+
|
|
260
|
+
const addProvider = (event: Eip6963Announcement) => {
|
|
261
|
+
found.push(event.detail);
|
|
262
|
+
if (anyProvider) { finalize(); }
|
|
263
|
+
};
|
|
264
|
+
|
|
265
|
+
const finalize = () => {
|
|
266
|
+
clearTimeout(timer);
|
|
267
|
+
|
|
268
|
+
if (found.length) {
|
|
269
|
+
|
|
270
|
+
// If filtering is provided:
|
|
271
|
+
if (options && options.filter) {
|
|
272
|
+
|
|
273
|
+
// Call filter, with a copies of found provider infos
|
|
274
|
+
const filtered = options.filter(found.map(i =>
|
|
275
|
+
Object.assign({ }, (i.info))));
|
|
276
|
+
|
|
277
|
+
if (filtered == null) {
|
|
278
|
+
// No provider selected
|
|
279
|
+
resolve(null);
|
|
280
|
+
|
|
281
|
+
} else if (filtered instanceof BrowserProvider) {
|
|
282
|
+
// Custom provider created
|
|
283
|
+
resolve(filtered);
|
|
284
|
+
|
|
285
|
+
} else {
|
|
286
|
+
// Find the matching provider
|
|
287
|
+
let match: null | Eip6963ProviderDetail = null;
|
|
288
|
+
if (filtered.uuid) {
|
|
289
|
+
const matches = found.filter(f =>
|
|
290
|
+
(filtered.uuid === f.info.uuid));
|
|
291
|
+
// @TODO: What should happen if multiple values
|
|
292
|
+
// for the same UUID?
|
|
293
|
+
match = matches[0];
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
if (match) {
|
|
297
|
+
const { provider, info } = match;
|
|
298
|
+
resolve(new BrowserProvider(provider, undefined, {
|
|
299
|
+
providerInfo: info
|
|
300
|
+
}));
|
|
301
|
+
} else {
|
|
302
|
+
reject(makeError("filter returned unknown info", "UNSUPPORTED_OPERATION", {
|
|
303
|
+
value: filtered
|
|
304
|
+
}));
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
} else {
|
|
309
|
+
|
|
310
|
+
// Pick the first found provider
|
|
311
|
+
const { provider, info } = found[0];
|
|
312
|
+
resolve(new BrowserProvider(provider, undefined, {
|
|
313
|
+
providerInfo: info
|
|
314
|
+
}));
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
} else {
|
|
318
|
+
// Nothing found
|
|
319
|
+
resolve(null);
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
context.removeEventListener(<any>"eip6963:announceProvider",
|
|
323
|
+
addProvider);
|
|
324
|
+
};
|
|
325
|
+
|
|
326
|
+
const timer = setTimeout(() => { finalize(); }, timeout);
|
|
327
|
+
|
|
328
|
+
context.addEventListener(<any>"eip6963:announceProvider",
|
|
329
|
+
addProvider);
|
|
330
|
+
|
|
331
|
+
context.dispatchEvent(new Event("eip6963:requestProvider"));
|
|
332
|
+
}));
|
|
333
|
+
}
|
|
334
|
+
}
|