Skip to content

Commit dff512c

Browse files
authored
Merge pull request #16 from niftykit-inc/customProvider
Adds the ability to use custom RPC provider
2 parents e4a272c + 4029e64 commit dff512c

File tree

2 files changed

+75
-25
lines changed

2 files changed

+75
-25
lines changed

README.md

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,39 @@ const providers = {
6464
const dropkit = await DropKit.create('sdk-api-key-here', false, providers);
6565
```
6666

67+
## Use Custom Provider
68+
69+
You can optionally pass in a custom provider to the `create` method, which will be used instead of the `Web3Provider`.
70+
71+
```typescript
72+
import { ethers } from 'ethers';
73+
74+
const provider = new ethers.providers.JsonRpcProvider(
75+
'YOUR_RPC_URL',
76+
);
77+
78+
const isDev = false;
79+
const web3ModalProviders = {
80+
walletconnect: {
81+
package: WalletConnectProvider,
82+
options: {
83+
infuraId: YOUR_INFURA_ID,
84+
},
85+
},
86+
torus: {
87+
package: Torus,
88+
},
89+
walletlink: {
90+
package: WalletLink,
91+
options: {
92+
infuraId: YOUR_INFURA_ID,
93+
},
94+
},
95+
}
96+
97+
const drop = await DropKit.create('sdk-api-key-here', isDev, web3ModalProviders, provider);
98+
```
99+
67100
## API
68101

69102
```typescript

src/DropKit.ts

Lines changed: 42 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import {
66
BigNumber,
77
ContractTransaction,
88
ContractReceipt,
9+
Signer,
910
} from 'ethers'
1011
import { API_ENDPOINT, API_ENDPOINT_DEV } from './config/endpoint'
1112
import DropKitCollectionABI from './contracts/DropKitCollection.json'
@@ -19,7 +20,12 @@ import {
1920
} from './types/api-responses'
2021
import Web3Modal, { IProviderOptions } from 'web3modal'
2122
import { PROVIDER_OPTIONS } from './config/providers'
22-
import { JsonRpcSigner, Web3Provider } from '@ethersproject/providers'
23+
import {
24+
JsonRpcProvider,
25+
JsonRpcSigner,
26+
Provider,
27+
Web3Provider,
28+
} from '@ethersproject/providers'
2329
import { NETWORKS } from './config/networks'
2430

2531
const abis: Record<number, any> = {
@@ -37,7 +43,7 @@ export default class DropKit {
3743
walletAddress?: string
3844
version: number
3945
maxSupply?: number
40-
provider: Web3Provider = {} as Web3Provider
46+
provider: Web3Provider | JsonRpcProvider = {} as Web3Provider
4147
signer: JsonRpcSigner = {} as JsonRpcSigner
4248
ethInstance: any
4349
chainId = 0
@@ -59,7 +65,10 @@ export default class DropKit {
5965
this.maxSupply = 0
6066
}
6167

62-
async init(providerOptions: IProviderOptions): Promise<DropApiResponse> {
68+
async init(
69+
providerOptions: IProviderOptions,
70+
provider?: JsonRpcProvider
71+
): Promise<DropApiResponse> {
6372
const data = await DropKit.getCollectionData(this.apiKey, this.dev)
6473

6574
if (!data || !data.address || !data.collectionId) {
@@ -74,29 +83,36 @@ export default class DropKit {
7483
this.maxSupply = data.version <= 3 ? data.maxAmount : 0
7584
const abi = abis[data.version || 1]
7685

77-
const web3Modal = new Web3Modal({
78-
network: this.networkName,
79-
providerOptions,
80-
})
81-
this.ethInstance = await web3Modal.connect()
82-
if (!this.ethInstance) {
83-
throw new Error('No provider found')
84-
}
86+
let signerOrProvider: Signer | Provider
87+
if (provider) {
88+
this.provider = provider
89+
signerOrProvider = provider
90+
} else {
91+
const web3Modal = new Web3Modal({
92+
network: this.networkName,
93+
providerOptions,
94+
})
95+
this.ethInstance = await web3Modal.connect()
96+
if (!this.ethInstance) {
97+
throw new Error('No provider found')
98+
}
8599

86-
await this._initProvider()
87-
await this._checkNetwork()
100+
await this._initProvider()
101+
await this._checkNetwork()
88102

89-
if (this.ethInstance.on) {
90-
this.ethInstance.on('disconnect', () => {
91-
window.location.reload()
92-
})
93-
this.ethInstance.on('accountsChanged', () => {
94-
window.location.reload()
95-
})
96-
}
103+
if (this.ethInstance.on) {
104+
this.ethInstance.on('disconnect', () => {
105+
window.location.reload()
106+
})
107+
this.ethInstance.on('accountsChanged', () => {
108+
window.location.reload()
109+
})
110+
}
97111

98-
this.walletAddress = await this.signer.getAddress()
99-
this.contract = new ethers.Contract(data.address, abi, this.signer)
112+
this.walletAddress = await this.signer.getAddress()
113+
signerOrProvider = this.signer
114+
}
115+
this.contract = new ethers.Contract(data.address, abi, signerOrProvider)
100116
if (!this.contract) {
101117
throw new Error('Initialization failed.')
102118
}
@@ -107,11 +123,12 @@ export default class DropKit {
107123
static async create(
108124
key: string,
109125
isDev?: boolean,
110-
providerOptions?: IProviderOptions
126+
providerOptions?: IProviderOptions,
127+
provider?: JsonRpcProvider
111128
): Promise<DropKit | null> {
112129
try {
113130
const dropKit = new DropKit(key, isDev)
114-
await dropKit.init(providerOptions || PROVIDER_OPTIONS)
131+
await dropKit.init(providerOptions || PROVIDER_OPTIONS, provider)
115132
return dropKit
116133
} catch (error) {
117134
handleError(error as EthereumRpcError<unknown>)

0 commit comments

Comments
 (0)