-
Notifications
You must be signed in to change notification settings - Fork 370
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add useSendTransaction, refactor useContractFunction (#207)
* Add useSendTransaction tests and hook Co-authored-by: Szymon Szlachtowicz <[email protected]>
- Loading branch information
Showing
8 changed files
with
121 additions
and
40 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
--- | ||
"@usedapp/core": patch | ||
"@usedapp/testing": patch | ||
--- | ||
|
||
Add useSendTransaction, refactor useContractFunction |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,35 @@ | ||
import { TransactionResponse } from '@ethersproject/abstract-provider' | ||
import { useState } from 'react' | ||
import { useTransactionsContext } from '../providers' | ||
import { TransactionStatus, TransactionOptions } from '../../src' | ||
|
||
export function usePromiseTransaction(chainId: number | undefined, options?: TransactionOptions) { | ||
const [state, setState] = useState<TransactionStatus>({ status: 'None' }) | ||
const { addTransaction } = useTransactionsContext() | ||
|
||
const promiseTransaction = async (transactionPromise: Promise<TransactionResponse>) => { | ||
if (!chainId) return | ||
let transaction: TransactionResponse | undefined = undefined | ||
try { | ||
transaction = await transactionPromise | ||
|
||
setState({ transaction, status: 'Mining', chainId }) | ||
addTransaction({ | ||
transaction, | ||
submittedAt: Date.now(), | ||
transactionName: options?.transactionName, | ||
}) | ||
const receipt = await transaction.wait() | ||
|
||
setState({ receipt, transaction, status: 'Success', chainId }) | ||
} catch (e) { | ||
const errorMessage = e.reason ?? e.message | ||
if (transaction) { | ||
setState({ status: 'Fail', transaction, receipt: e.receipt, errorMessage, chainId }) | ||
} else { | ||
setState({ status: 'Exception', errorMessage, chainId }) | ||
} | ||
} | ||
} | ||
return { promiseTransaction, state } | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,18 @@ | ||
import { TransactionRequest } from '@ethersproject/abstract-provider' | ||
import { TransactionOptions } from '../../src' | ||
import { useEthers } from './useEthers' | ||
import { usePromiseTransaction } from './usePromiseTransaction' | ||
|
||
export function useSendTransaction(options?: TransactionOptions) { | ||
const { library, chainId } = useEthers() | ||
const { promiseTransaction, state } = usePromiseTransaction(chainId, options) | ||
|
||
const sendTransaction = async (transactionRequest: TransactionRequest) => { | ||
const signer = options?.signer || library?.getSigner() | ||
if (signer) { | ||
await promiseTransaction(signer.sendTransaction(transactionRequest)) | ||
} | ||
} | ||
|
||
return { sendTransaction, state } | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
import { Signer } from 'ethers' | ||
|
||
export interface TransactionOptions { | ||
signer?: Signer | ||
transactionName?: string | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,48 @@ | ||
import { useSendTransaction } from '@usedapp/core' | ||
import { expect } from 'chai' | ||
import { MockProvider } from 'ethereum-waffle' | ||
import { BigNumber, utils } from 'ethers' | ||
import { renderWeb3Hook } from '../src' | ||
|
||
describe('useSendTransaction', () => { | ||
const mockProvider = new MockProvider() | ||
const [spender, receiver, secondReceiver] = mockProvider.getWallets() | ||
|
||
it('success', async () => { | ||
const spenderBalance = await spender.getBalance() | ||
const receiverBalance = await receiver.getBalance() | ||
|
||
const { result, waitForCurrent } = await renderWeb3Hook(useSendTransaction, { mockProvider }) | ||
|
||
await result.current.sendTransaction({ to: await receiver.getAddress(), value: BigNumber.from(10) }) | ||
await waitForCurrent((val) => val.state !== undefined) | ||
expect(result.current.state.status).to.eq('Success') | ||
expect(await receiver.getBalance()).to.eq(receiverBalance.add(10)) | ||
expect(await spender.getBalance()).to.not.eq(spenderBalance) | ||
}) | ||
|
||
it('sends with different signer', async () => { | ||
const receiverBalance = await receiver.getBalance() | ||
const secondReceiverBalance = await secondReceiver.getBalance() | ||
|
||
const { result, waitForCurrent } = await renderWeb3Hook(() => useSendTransaction({ signer: receiver }), { | ||
mockProvider, | ||
}) | ||
|
||
await result.current.sendTransaction({ to: await secondReceiver.getAddress(), value: BigNumber.from(10) }) | ||
await waitForCurrent((val) => val.state != undefined) | ||
expect(result.current.state.status).to.eq('Success') | ||
expect(await secondReceiver.getBalance()).to.eq(secondReceiverBalance.add(10)) | ||
expect(await receiver.getBalance()).to.not.eq(receiverBalance) | ||
}) | ||
|
||
it('Exception(invalid sender)', async () => { | ||
const { result, waitForCurrent } = await renderWeb3Hook(useSendTransaction, { mockProvider }) | ||
|
||
await result.current.sendTransaction({ to: '0x1', value: utils.parseEther('1') }) | ||
await waitForCurrent((val) => val.state !== undefined) | ||
|
||
expect(result.current.state.status).to.eq('Exception') | ||
if (result.current.state.status === 'Exception') expect(result.current.state?.errorMessage).to.eq('invalid address') | ||
}) | ||
}) |