web3-core#PromiEvent TypeScript Examples
The following examples show how to use
web3-core#PromiEvent.
You can vote up the ones you like or vote down the ones you don't like,
and go to the original project or source file by following the links above each example. You may check out the related API usage on the sidebar.
Example #1
Source File: safeHelper.ts From multisig-react with MIT License | 6 votes |
mockNonPayableTransactionObject = (callResult?: string): NonPayableTransactionObject<string | void | boolean | string[]> => {
return {
arguments: [],
call: (tx?) => new Promise((resolve) => resolve(callResult || '')),
encodeABI: (tx?) => '',
estimateGas: (tx?) => new Promise((resolve) => resolve(1000)),
send: () => { return {} as PromiEvent<any>}
}
}
Example #2
Source File: index.ts From ethereum-sdk with MIT License | 6 votes |
async send(options: EthereumProvider.EthereumSendOptions = {}): Promise<EthereumProvider.EthereumTransaction> {
const from = toAddress(await this.getFrom())
const promiEvent: PromiEvent<Contract> = this.sendMethod.send({
from,
gas: this.config.gas || options.gas,
value: options.value,
gasPrice: options.gasPrice?.toString(),
})
const { hash, receipt } = toPromises(promiEvent)
const hashValue = await hash
const tx = await this.getTransaction(hashValue)
return new Web3Transaction(
receipt,
toWord(hashValue),
toBinary(this.data),
tx.nonce,
from,
toAddress(this.contract.options.address)
)
}
Example #3
Source File: to-promises.ts From ethereum-sdk with MIT License | 6 votes |
export function toPromises(promiEvent: PromiEvent<any>) {
return {
hash: new Promise<string>((resolve, reject) => {
promiEvent.on("error", reject)
promiEvent.on("transactionHash", resolve)
}),
receipt: new Promise<TransactionReceipt>((resolve, reject) => {
promiEvent.on("error", reject)
promiEvent.on("receipt", resolve)
}),
}
}
Example #4
Source File: send-transaction.ts From ethereum-sdk with MIT License | 5 votes |
export async function waitForHash<T>(promiEvent: PromiEvent<T>): Promise<string> {
return new Promise((resolve, reject) => {
promiEvent.on("transactionHash", hash => resolve(hash))
promiEvent.on("error", error => reject(error))
})
}
Example #5
Source File: Contracts.ts From perpetual with Apache License 2.0 | 4 votes |
private async _send( // tslint:disable-line:function-name
method: ContractSendMethod,
sendOptions: SendOptions = {},
): Promise<TxResult> {
const {
confirmations,
confirmationType,
gasMultiplier,
...txOptions
} = sendOptions;
if (!Object.values(ConfirmationType).includes(confirmationType)) {
throw new Error(`Invalid confirmation type: ${confirmationType}`);
}
if (confirmationType === ConfirmationType.Simulate || !txOptions.gas) {
const gasEstimate = await this.estimateGas(method, txOptions);
txOptions.gas = Math.floor(gasEstimate * gasMultiplier);
if (confirmationType === ConfirmationType.Simulate) {
return {
gasEstimate,
gas: txOptions.gas,
};
}
}
const promi: PromiEvent<Contract> = method.send(this.toNativeSendOptions(txOptions) as any);
let hashOutcome = OUTCOMES.INITIAL;
let confirmationOutcome = OUTCOMES.INITIAL;
let transactionHash: string;
let hashPromise: Promise<string>;
let confirmationPromise: Promise<TransactionReceipt>;
if ([
ConfirmationType.Hash,
ConfirmationType.Both,
].includes(confirmationType)) {
hashPromise = new Promise(
(resolve, reject) => {
promi.on('error', (error: Error) => {
if (hashOutcome === OUTCOMES.INITIAL) {
hashOutcome = OUTCOMES.REJECTED;
reject(error);
(promi as any).off();
}
});
promi.on('transactionHash', (txHash: string) => {
if (hashOutcome === OUTCOMES.INITIAL) {
hashOutcome = OUTCOMES.RESOLVED;
resolve(txHash);
if (confirmationType !== ConfirmationType.Both) {
(promi as any).off();
}
}
});
},
);
transactionHash = await hashPromise;
}
if ([
ConfirmationType.Confirmed,
ConfirmationType.Both,
].includes(confirmationType)) {
confirmationPromise = new Promise(
(resolve, reject) => {
promi.on('error', (error: Error) => {
if (
confirmationOutcome === OUTCOMES.INITIAL
&& (
confirmationType === ConfirmationType.Confirmed
|| hashOutcome === OUTCOMES.RESOLVED
)
) {
confirmationOutcome = OUTCOMES.REJECTED;
reject(error);
(promi as any).off();
}
});
if (confirmations) {
promi.on('confirmation', (confNumber: number, receipt: TransactionReceipt) => {
if (confNumber >= confirmations) {
if (confirmationOutcome === OUTCOMES.INITIAL) {
confirmationOutcome = OUTCOMES.RESOLVED;
resolve(receipt);
(promi as any).off();
}
}
});
} else {
promi.on('receipt', (receipt: TransactionReceipt) => {
confirmationOutcome = OUTCOMES.RESOLVED;
resolve(receipt);
(promi as any).off();
});
}
},
);
}
if (confirmationType === ConfirmationType.Hash) {
return this.normalizeResponse({ transactionHash });
}
if (confirmationType === ConfirmationType.Confirmed) {
return confirmationPromise;
}
return this.normalizeResponse({
transactionHash,
confirmation: confirmationPromise,
});
}
Example #6
Source File: Open.tsx From multisig-react with MIT License | 4 votes |
Open = (): React.ReactElement => {
const [loading, setLoading] = useState(false)
const [showProgress, setShowProgress] = useState(false)
const [creationTxPromise, setCreationTxPromise] = useState<PromiEvent<TransactionReceipt>>()
const [safeCreationPendingInfo, setSafeCreationPendingInfo] = useState<any>()
const [safePropsFromUrl, setSafePropsFromUrl] = useState()
const userAccount = useSelector(userAccountSelector)
const dispatch = useDispatch()
useEffect(() => {
// #122: Allow to migrate an old Multisig by passing the parameters to the URL.
const query = queryString.parse(window.location.search, { arrayFormat: 'comma' })
const { name, owneraddresses, ownernames, threshold } = query
if (validateQueryParams(owneraddresses, ownernames, threshold, name)) {
setSafePropsFromUrl({
name,
ownerAddresses: owneraddresses,
ownerNames: ownernames,
threshold,
} as any)
}
}, [])
// check if there is a safe being created
useEffect(() => {
const load = async () => {
const pendingCreation = await loadFromStorage<{ txHash: string }>(SAFE_PENDING_CREATION_STORAGE_KEY)
if (pendingCreation && pendingCreation.txHash) {
setSafeCreationPendingInfo(pendingCreation)
setShowProgress(true)
} else {
setShowProgress(false)
}
setLoading(false)
}
load()
}, [])
const createSafeProxy = async (formValues?: any) => {
let values = formValues
// save form values, used when the user rejects the TX and wants to retry
if (formValues) {
const copy = { ...formValues }
saveToStorage(SAFE_PENDING_CREATION_STORAGE_KEY, copy)
} else {
values = await loadFromStorage(SAFE_PENDING_CREATION_STORAGE_KEY)
}
const promiEvent = createSafe(values, userAccount)
setCreationTxPromise(promiEvent)
setShowProgress(true)
}
const onSafeCreated = async (safeAddress): Promise<void> => {
const pendingCreation = await loadFromStorage<{ txHash: string }>(SAFE_PENDING_CREATION_STORAGE_KEY)
const name = getSafeNameFrom(pendingCreation)
const ownersNames = getNamesFrom(pendingCreation)
const ownerAddresses = getAccountsFrom(pendingCreation)
const safeProps = await getSafeProps(safeAddress, name, ownersNames, ownerAddresses)
await dispatch(addOrUpdateSafe(safeProps))
removeFromStorage(SAFE_PENDING_CREATION_STORAGE_KEY)
const url = {
pathname: `${SAFELIST_ADDRESS}/${safeProps.address}/balances`,
state: {
name,
tx: pendingCreation?.txHash,
},
}
history.push(url)
}
const onCancel = () => {
removeFromStorage(SAFE_PENDING_CREATION_STORAGE_KEY)
history.push({
pathname: `${WELCOME_ADDRESS}`,
})
}
const onRetry = async () => {
const values = await loadFromStorage<{ txHash?: string }>(SAFE_PENDING_CREATION_STORAGE_KEY)
delete values?.txHash
await saveToStorage(SAFE_PENDING_CREATION_STORAGE_KEY, values)
setSafeCreationPendingInfo(values)
createSafeProxy()
}
if (loading || showProgress === undefined) {
return <Loader size="md" />
}
return (
<Page>
{showProgress ? (
<Opening
creationTxHash={safeCreationPendingInfo?.txHash}
onCancel={onCancel}
onRetry={onRetry}
onSuccess={onSafeCreated}
submittedPromise={creationTxPromise}
/>
) : (
<Layout onCallSafeContractSubmit={createSafeProxy} safeProps={safePropsFromUrl} />
)}
</Page>
)
}