diff --git a/libs/remix-ui/run-tab/src/lib/actions/index.ts b/libs/remix-ui/run-tab/src/lib/actions/index.ts index a30bfc5292..afc7f27b3b 100644 --- a/libs/remix-ui/run-tab/src/lib/actions/index.ts +++ b/libs/remix-ui/run-tab/src/lib/actions/index.ts @@ -3,11 +3,13 @@ import React from 'react' import * as ethJSUtil from 'ethereumjs-util' import Web3 from 'web3' import { addressToString, shortenAddress } from '@remix-ui/helper' -import { addNewInstance, addProvider, clearAllInstances, displayNotification, displayPopUp, fetchAccountsListFailed, fetchAccountsListRequest, fetchAccountsListSuccess, fetchContractListSuccess, hidePopUp, removeExistingInstance, removeProvider, setBaseFeePerGas, setConfirmSettings, setCurrentFile, setExecutionEnvironment, setExternalEndpoint, setGasLimit, setGasPrice, setGasPriceStatus, setIpfsCheckedState, setLoadType, setMatchPassphrase, setMaxFee, setMaxPriorityFee, setNetworkName, setPassphrase, setSelectedAccount, setSendUnit, setSendValue, setTxFeeContent } from './payload' +import { addNewInstance, addProvider, clearAllInstances, displayNotification, displayPopUp, fetchAccountsListFailed, fetchAccountsListRequest, fetchAccountsListSuccess, fetchContractListSuccess, hidePopUp, removeExistingInstance, removeProvider, setBaseFeePerGas, setConfirmSettings, setCurrentFile, setDecodedResponse, setExecutionEnvironment, setExternalEndpoint, setGasLimit, setGasPrice, setGasPriceStatus, setIpfsCheckedState, setLoadType, setMatchPassphrase, setMaxFee, setMaxPriorityFee, setNetworkName, setPassphrase, setSelectedAccount, setSendUnit, setSendValue, setTxFeeContent } from './payload' import { RunTab } from '../types/run-tab' import { CompilerAbstract } from '@remix-project/remix-solidity' import * as remixLib from '@remix-project/remix-lib' -import { ContractData, Network, Tx } from '../types' +import { ContractData, FuncABI, MainnetPrompt, Network, Tx } from '../types' + +const txFormat = remixLib.execution.txFormat declare global { interface Window { _paq: any @@ -374,35 +376,49 @@ const terminalLogger = (view: JSX.Element) => { plugin.call('terminal', 'logHtml', view) } -const getConfirmationCb = (confirmDialogContent: ( - tx: Tx, network: - Network, amount: string, - gasEstimation: string, - gasFees: (maxFee: string, cb: (txFeeText: string, priceStatus: boolean) => void) => void, - determineGasPrice: (cb: (txFeeText: string, gasPriceValue: string, gasPriceStatus: boolean) => void) => void - ) => JSX.Element) => { - // this code is the same as in recorder.js. TODO need to be refactored out - const confirmationCb = (network, tx, gasEstimation, continueTxExecution, cancelCb) => { - if (network.name !== 'Main') { - return continueTxExecution(null) +const confirmationHandler = (confirmDialogContent: MainnetPrompt, network, tx, gasEstimation, continueTxExecution, cancelCb) => { + if (network.name !== 'Main') { + return continueTxExecution(null) + } + const amount = plugin.blockchain.fromWei(tx.value, true, 'ether') + const content = confirmDialogContent(tx, network, amount, gasEstimation, plugin.blockchain.determineGasFees(tx), plugin.blockchain.determineGasPrice.bind(plugin.blockchain)) + + dispatch(displayNotification('Confirm transaction', content, 'Confirm', 'Cancel', () => { + plugin.blockchain.config.setUnpersistedProperty('doNotShowTransactionConfirmationAgain', plugin.REACT_API.confirmSettings) + // TODO: check if this is check is still valid given the refactor + if (!plugin.REACT_API.gasPriceStatus) { + cancelCb('Given transaction fee is not correct') + } else { + continueTxExecution({ maxFee: plugin.REACT_API.maxFee, maxPriorityFee: plugin.REACT_API.maxPriorityFee, baseFeePerGas: plugin.REACT_API.baseFeePerGas, gasPrice: plugin.REACT_API.gasPrice }) } - const amount = plugin.blockchain.fromWei(tx.value, true, 'ether') - const content = confirmDialogContent(tx, network, amount, gasEstimation, plugin.blockchain.determineGasFees(tx), plugin.blockchain.determineGasPrice.bind(plugin.blockchain)) - - dispatch(displayNotification('Confirm transaction', content, 'Confirm', 'Cancel', () => { - plugin.blockchain.config.setUnpersistedProperty('doNotShowTransactionConfirmationAgain', plugin.REACT_API.confirmSettings) - // TODO: check if this is check is still valid given the refactor - if (!plugin.REACT_API.gasPriceStatus) { - cancelCb('Given transaction fee is not correct') - } else { - continueTxExecution({ maxFee: plugin.REACT_API.maxFee, maxPriorityFee: plugin.REACT_API.maxPriorityFee, baseFeePerGas: plugin.REACT_API.baseFeePerGas, gasPrice: plugin.REACT_API.gasPrice }) - } + }, () => { + return cancelCb('Transaction canceled by user.') + })) +} + +const getConfirmationCb = (confirmDialogContent: MainnetPrompt) => { + // this code is the same as in recorder.js. TODO need to be refactored out + return (network, tx, gasEstimation, continueTxExecution, cancelCb) => { + confirmationHandler(confirmDialogContent, network, tx, gasEstimation, continueTxExecution, cancelCb) + } +} + +const continueHandler = (gasEstimationPrompt: (msg: string) => JSX.Element, error, continueTxExecution, cancelCb) => { + if (error) { + const msg = typeof error !== 'string' ? error.message : error + + dispatch(displayNotification('Gas estimation failed', gasEstimationPrompt(msg), 'Send Transaction', 'Cancel Transaction', () => { + continueTxExecution() }, () => { - return cancelCb('Transaction canceled by user.') + cancelCb() })) + } else { + continueTxExecution() } +} - return confirmationCb +const promptHandler = (passphrasePrompt, okCb, cancelCb) => { + dispatch(displayNotification('Passphrase requested', passphrasePrompt('Personal mode is enabled. Please provide passphrase of account'), 'OK', 'Cancel', okCb, cancelCb)) } export const createInstance = async ( @@ -412,33 +428,9 @@ export const createInstance = async ( logBuilder: (msg: string) => JSX.Element, publishToStorage: (storage: 'ipfs' | 'swarm', contract: ContractData) => void, - mainnetPrompt: ( - tx: Tx, network: - Network, amount: string, - gasEstimation: string, - gasFees: (maxFee: string, cb: (txFeeText: string, priceStatus: boolean) => void) => void, - determineGasPrice: (cb: (txFeeText: string, gasPriceValue: string, gasPriceStatus: boolean) => void) => void - ) => JSX.Element, + mainnetPrompt: MainnetPrompt, isOverSizePrompt: () => JSX.Element, args) => { - const continueCb = (error, continueTxExecution, cancelCb) => { - if (error) { - const msg = typeof error !== 'string' ? error.message : error - - dispatch(displayNotification('Gas estimation failed', gasEstimationPrompt(msg), 'Send Transaction', 'Cancel Transaction', () => { - continueTxExecution() - }, () => { - cancelCb() - })) - } else { - continueTxExecution() - } - } - - const promptCb = (okCb, cancelCb) => { - dispatch(displayNotification('Passphrase requested', passphrasePrompt('Personal mode is enabled. Please provide passphrase of account'), 'OK', 'Cancel', okCb, cancelCb)) - } - const statusCb = (msg: string) => { const log = logBuilder(msg) @@ -476,14 +468,32 @@ export const createInstance = async ( if (selectedContract.isOverSizeLimit()) { return dispatch(displayNotification('Contract code size over limit', isOverSizePrompt(), 'Force Send', 'Cancel', () => { - deployContract(selectedContract, args, contractMetadata, compilerContracts, { continueCb, promptCb, statusCb, finalCb }, confirmationCb) + deployContract(selectedContract, args, contractMetadata, compilerContracts, { + continueCb: (error, continueTxExecution, cancelCb) => { + continueHandler(gasEstimationPrompt, error, continueTxExecution, cancelCb) + }, + promptCb: (okCb, cancelCb) => { + promptHandler(passphrasePrompt, okCb, cancelCb) + }, + statusCb, + finalCb + }, confirmationCb) }, () => { const log = logBuilder(`creation of ${selectedContract.name} canceled by user.`) return terminalLogger(log) })) } - deployContract(selectedContract, args, contractMetadata, compilerContracts, { continueCb, promptCb, statusCb, finalCb }, confirmationCb) + deployContract(selectedContract, args, contractMetadata, compilerContracts, { + continueCb: (error, continueTxExecution, cancelCb) => { + continueHandler(gasEstimationPrompt, error, continueTxExecution, cancelCb) + }, + promptCb: (okCb, cancelCb) => { + promptHandler(passphrasePrompt, okCb, cancelCb) + }, + statusCb, + finalCb + }, confirmationCb) } const deployContract = (selectedContract, args, contractMetadata, compilerContracts, callbacks, confirmationCb) => { @@ -574,3 +584,58 @@ const loadAddress = () => { export const getContext = () => { return plugin.blockchain.context() } + +export const runTransactions = ( + index: number, + lookupOnly: boolean, + funcABI: FuncABI, + inputsValues: string, + contractName: string, + contractABI, contract, + address, + logMsg:string, + logBuilder: (msg: string) => JSX.Element, + mainnetPrompt: MainnetPrompt, + gasEstimationPrompt: (msg: string) => JSX.Element, + passphrasePrompt: (msg: string) => JSX.Element) => { + let callinfo = '' + if (lookupOnly) callinfo = 'call' + else if (funcABI.type === 'fallback' || funcABI.type === 'receive') callinfo = 'lowLevelInteracions' + else callinfo = 'transact' + + _paq.push(['trackEvent', 'udapp', callinfo, plugin.blockchain.getCurrentNetworkStatus().network.name]) + const params = funcABI.type !== 'fallback' ? inputsValues : '' + + plugin.blockchain.runOrCallContractMethod( + contractName, + contractABI, + funcABI, + contract, + inputsValues, + address, + params, + lookupOnly, + logMsg, + (msg) => { + const log = logBuilder(msg) + + return terminalLogger(log) + }, + (returnValue) => { + const decodedResponse = txFormat.decodeResponse(returnValue, funcABI) + + console.log('decodedResponse: ', decodedResponse) + + dispatch(setDecodedResponse(index, decodedResponse)) + }, + (network, tx, gasEstimation, continueTxExecution, cancelCb) => { + confirmationHandler(mainnetPrompt, network, tx, gasEstimation, continueTxExecution, cancelCb) + }, + (error, continueTxExecution, cancelCb) => { + continueHandler(gasEstimationPrompt, error, continueTxExecution, cancelCb) + }, + (okCb, cancelCb) => { + promptHandler(passphrasePrompt, okCb, cancelCb) + } + ) +} diff --git a/libs/remix-ui/run-tab/src/lib/actions/payload.ts b/libs/remix-ui/run-tab/src/lib/actions/payload.ts index e35f072ea3..c15579e08c 100644 --- a/libs/remix-ui/run-tab/src/lib/actions/payload.ts +++ b/libs/remix-ui/run-tab/src/lib/actions/payload.ts @@ -239,3 +239,13 @@ export const clearAllInstances = () => { type: 'CLEAR_INSTANCES' } } + +export const setDecodedResponse = (index: number, decodedResponse) => { + return { + type: 'SET_DECODED_RESPONSE', + payload: { + index, + decodedResponse + } + } +} diff --git a/libs/remix-ui/run-tab/src/lib/components/contractDropdownUI.tsx b/libs/remix-ui/run-tab/src/lib/components/contractDropdownUI.tsx index c1eca2ca52..3cd2f549ba 100644 --- a/libs/remix-ui/run-tab/src/lib/components/contractDropdownUI.tsx +++ b/libs/remix-ui/run-tab/src/lib/components/contractDropdownUI.tsx @@ -1,10 +1,8 @@ // eslint-disable-next-line no-use-before-define import React, { useEffect, useState } from 'react' -import { ContractData, ContractDropdownProps, Network, Tx } from '../types' +import { ContractData, ContractDropdownProps } from '../types' import * as ethJSUtil from 'ethereumjs-util' import { ContractGUI } from './contractGUI' -import { PassphrasePrompt } from './passphrase' -import { MainnetPrompt } from './mainnet' export function ContractDropdownUI (props: ContractDropdownProps) { const [networkName, setNetworkName] = useState('') @@ -122,7 +120,7 @@ export function ContractDropdownUI (props: ContractDropdownProps) { if (selectedContract.bytecodeObject.length === 0) { return props.modal('Alert', 'This contract may be abstract, not implement an abstract parent\'s methods completely or not invoke an inherited contract\'s constructor correctly.', 'OK', () => {}) } - props.createInstance(loadedContractData, gasEstimationPrompt, passphrasePrompt, logBuilder, props.publishToStorage, mainnetPrompt, isOverSizePrompt, args) + props.createInstance(loadedContractData, props.gasEstimationPrompt, props.passphrasePrompt, props.logBuilder, props.publishToStorage, props.mainnetPrompt, isOverSizePrompt, args) } // listenToContextChange () { @@ -176,43 +174,6 @@ export function ContractDropdownUI (props: ContractDropdownProps) { setSelectedContract(value) } - const gasEstimationPrompt = (msg: string) => { - return ( -
Gas estimation errored with the following message (see below). The transaction execution will likely fail. Do you want to force sending?
- ${msg} -
- ) - } - - const logBuilder = (msg: string) => { - return
{msg}
- } - - const passphrasePrompt = (message: string) => { - return - } - - const mainnetPrompt = (tx: Tx, network: Network, amount: string, gasEstimation: string, gasFees: (maxFee: string, cb: (txFeeText: string, priceStatus: boolean) => void) => void, determineGasPrice: (cb: (txFeeText: string, gasPriceValue: string, gasPriceStatus: boolean) => void) => void) => { - return - } - const isOverSizePrompt = () => { return (
Contract creation initialization returns data with length of more than 24576 bytes. The deployment will likely fails.
diff --git a/libs/remix-ui/run-tab/src/lib/components/instanceContainerUI.tsx b/libs/remix-ui/run-tab/src/lib/components/instanceContainerUI.tsx index 6bf00cece8..d82b868201 100644 --- a/libs/remix-ui/run-tab/src/lib/components/instanceContainerUI.tsx +++ b/libs/remix-ui/run-tab/src/lib/components/instanceContainerUI.tsx @@ -23,7 +23,18 @@ export function InstanceContainerUI (props: InstanceContainerProps) {
{ instanceList.length > 0 ?
{ props.instances.instanceList.map((instance, index) => { - return + return }) }
: diff --git a/libs/remix-ui/run-tab/src/lib/components/universalDappUI.tsx b/libs/remix-ui/run-tab/src/lib/components/universalDappUI.tsx index 633fcecf80..7f7379fdf8 100644 --- a/libs/remix-ui/run-tab/src/lib/components/universalDappUI.tsx +++ b/libs/remix-ui/run-tab/src/lib/components/universalDappUI.tsx @@ -6,6 +6,8 @@ import { CopyToClipboard } from '@remix-ui/clipboard' import * as remixLib from '@remix-project/remix-lib' import * as ethJSUtil from 'ethereumjs-util' import { ContractGUI } from './contractGUI' +import { TreeView, TreeViewItem } from '@remix-ui/tree-view' +import { BN } from 'ethereumjs-util' const txHelper = remixLib.execution.txHelper @@ -13,6 +15,7 @@ export function UniversalDappUI (props: UdappProps) { const [toggleExpander, setToggleExpander] = useState(true) const [contractABI, setContractABI] = useState(null) const [address, setAddress] = useState('') + const [expandPath, setExpandPath] = useState([]) useEffect(() => { if (!props.abi) { @@ -135,41 +138,95 @@ export function UniversalDappUI (props: UdappProps) { const functionName = funcABI.type === 'function' ? funcABI.name : `(${funcABI.type})` const logMsg = `${lookupOnly ? 'call' : 'transact'} to ${props.instance.name}.${functionName}` - // const callbacksInContext = txCallBacks.getCallBacksWithContext(this, this.blockchain) - - // const outputCb = (returnValue) => { - // if (outputOverride) { - // const decoded = decodeResponseToTreeView(returnValue, args.funABI) - // outputOverride.innerHTML = '' - // outputOverride.appendChild(decoded) - // } - // } - // let callinfo = '' - // if (lookupOnly) callinfo = 'call' - // else if (args.funABI.type === 'fallback' || args.funABI.type === 'receive') callinfo = 'lowLevelInteracions' - // else callinfo = 'transact' - - // _paq.push(['trackEvent', 'udapp', callinfo, this.blockchain.getCurrentNetworkStatus().network.name]) - // const params = args.funABI.type !== 'fallback' ? inputsValues : '' - // this.blockchain.runOrCallContractMethod( - // args.contractName, - // args.contractABI, - // args.funABI, - // args.contract, - // inputsValues, - // args.address, - // params, - // lookupOnly, - // logMsg, - // this.logCallback, - // outputCb, - // callbacksInContext.confirmationCb.bind(callbacksInContext), - // callbacksInContext.continueCb.bind(callbacksInContext), - // callbacksInContext.promptCb.bind(callbacksInContext)) + props.runTransactions( + props.index, + lookupOnly, + funcABI, + inputsValues, + props.instance.name, + contractABI, + props.instance.contractData, + props.instance.address, + logMsg, + props.logBuilder, + props.mainnetPrompt, + props.gasEstimationPrompt, + props.passphrasePrompt) + } + + const extractDataDefault = (item, parent?) => { + const ret: any = {} + + if (BN.isBN(item)) { + ret.self = item.toString(10) + ret.children = [] + } else { + if (item instanceof Array) { + ret.children = item.map((item, index) => { + return { key: index, value: item } + }) + ret.self = 'Array' + ret.isNode = true + ret.isLeaf = false + } else if (item instanceof Object) { + ret.children = Object.keys(item).map((key) => { + return { key: key, value: item[key] } + }) + ret.self = 'Object' + ret.isNode = true + ret.isLeaf = false + } else { + ret.self = item + ret.children = null + ret.isNode = false + ret.isLeaf = true + } + } + return ret + } + + const handleExpand = (path: string) => { + if (expandPath.includes(path)) { + const filteredPath = expandPath.filter(value => value !== path) + + setExpandPath(filteredPath) + } else { + setExpandPath([...expandPath, path]) + } + } + + const label = (key: string | number, value: string) => { + return ( +
+ + +
+ ) + } + + const renderData = (item, parent, key: string | number, keyPath: string) => { + const data = extractDataDefault(item, parent) + const children = (data.children || []).map((child) => { + return ( + renderData(child.value, data, child.key, keyPath + '/' + child.key) + ) + }) + + if (children && children.length > 0) { + return ( + handleExpand(keyPath)} expand={expandPath.includes(keyPath)}> + + {children} + + + ) + } else { + return handleExpand(keyPath)} expand={expandPath.includes(keyPath)} /> + } } return ( -
+
- +
) diff --git a/libs/remix-ui/run-tab/src/lib/reducers/runTab.ts b/libs/remix-ui/run-tab/src/lib/reducers/runTab.ts index 0f0a6473a9..bde670c4cb 100644 --- a/libs/remix-ui/run-tab/src/lib/reducers/runTab.ts +++ b/libs/remix-ui/run-tab/src/lib/reducers/runTab.ts @@ -68,7 +68,8 @@ export interface RunTabState { instanceList: { contractData: ContractData, address: string, - name: string + name: string, + decodedResponse?: any }[], error: string } @@ -566,6 +567,22 @@ export const runTabReducer = (state: RunTabState = runTabInitialState, action: A } } + case 'SET_DECODED_RESPONSE': { + const payload: any = action.payload + + return { + ...state, + instances: { + ...state.instances, + instanceList: state.instances.instanceList.map((instance, index) => { + console.log('payload: ', payload) + if (payload.index === index) instance.decodedResponse = payload.decodedResponse + return instance + }) + } + } + } + default: return state } diff --git a/libs/remix-ui/run-tab/src/lib/run-tab.tsx b/libs/remix-ui/run-tab/src/lib/run-tab.tsx index d78ca9f3dd..c6d7bf2480 100644 --- a/libs/remix-ui/run-tab/src/lib/run-tab.tsx +++ b/libs/remix-ui/run-tab/src/lib/run-tab.tsx @@ -7,7 +7,7 @@ import { ContractDropdownUI } from './components/contractDropdownUI' import { InstanceContainerUI } from './components/instanceContainerUI' import { RecorderUI } from './components/recorderCardUI' import { SettingsUI } from './components/settingsUI' -import { ContractData, Modal, RunTabProps } from './types' +import { ContractData, Modal, Network, RunTabProps, Tx } from './types' import { runTabInitialState, runTabReducer } from './reducers/runTab' import { initRunTab, setAccount, @@ -21,10 +21,13 @@ import { updateGasPrice, updateGasPriceStatus, updateMaxFee, updateMaxPriorityFee, updateTxFeeContent, clearInstances, - removeInstance, getContext + removeInstance, getContext, + runTransactions } from './actions' import './css/run-tab.css' import { PublishToStorage } from '@remix-ui/publish-to-storage' +import { PassphrasePrompt } from './components/passphrase' +import { MainnetPrompt } from './components/mainnet' export function RunTabUI (props: RunTabProps) { const { plugin } = props @@ -142,6 +145,43 @@ export function RunTabUI (props: RunTabProps) { }) } + const gasEstimationPrompt = (msg: string) => { + return ( +
Gas estimation errored with the following message (see below). The transaction execution will likely fail. Do you want to force sending?
+ {msg} +
+ ) + } + + const logBuilder = (msg: string) => { + return
{msg}
+ } + + const passphrasePrompt = (message: string) => { + return + } + + const mainnetPrompt = (tx: Tx, network: Network, amount: string, gasEstimation: string, gasFees: (maxFee: string, cb: (txFeeText: string, priceStatus: boolean) => void) => void, determineGasPrice: (cb: (txFeeText: string, gasPriceValue: string, gasPriceStatus: boolean) => void) => void) => { + return + } + return (
@@ -180,19 +220,23 @@ export function RunTabUI (props: RunTabProps) { ipfsCheckedState={runTab.ipfsChecked} setIpfsCheckedState={setCheckIpfs} publishToStorage={publishToStorage} - updateBaseFeePerGas={updateBaseFeePerGas} - updateConfirmSettings={updateConfirmSettings} - updateGasPrice={updateGasPrice} - updateGasPriceStatus={updateGasPriceStatus} - updateMaxFee={updateMaxFee} - updateMaxPriorityFee={updateMaxPriorityFee} - updateTxFeeContent={updateTxFeeContent} - txFeeContent={runTab.txFeeContent} - maxFee={runTab.maxFee} - maxPriorityFee={runTab.maxPriorityFee} + gasEstimationPrompt={gasEstimationPrompt} + logBuilder={logBuilder} + passphrasePrompt={passphrasePrompt} + mainnetPrompt={mainnetPrompt} /> - +
diff --git a/libs/remix-ui/run-tab/src/lib/types/blockchain.d.ts b/libs/remix-ui/run-tab/src/lib/types/blockchain.d.ts index bd19058d4a..406459b1a0 100644 --- a/libs/remix-ui/run-tab/src/lib/types/blockchain.d.ts +++ b/libs/remix-ui/run-tab/src/lib/types/blockchain.d.ts @@ -14,6 +14,10 @@ export class Blockchain extends Plugin { getCurrentNetworkStatus(): { name: string; id: string; + network?: { + name: string; + id: string; + }; }; setupProviders(): void; providers: {}; diff --git a/libs/remix-ui/run-tab/src/lib/types/index.ts b/libs/remix-ui/run-tab/src/lib/types/index.ts index a56cd94a4b..988a9bc593 100644 --- a/libs/remix-ui/run-tab/src/lib/types/index.ts +++ b/libs/remix-ui/run-tab/src/lib/types/index.ts @@ -1,3 +1,4 @@ +import { type } from 'os' import { RunTab } from './run-tab' export interface RunTabProps { plugin: RunTab @@ -137,6 +138,14 @@ export interface Network { } } +export type MainnetPrompt = ( + tx: Tx, network: + Network, amount: string, + gasEstimation: string, + gasFees: (maxFee: string, cb: (txFeeText: string, priceStatus: boolean) => void) => void, + determineGasPrice: (cb: (txFeeText: string, gasPriceValue: string, gasPriceStatus: boolean) => void) => void + ) => JSX.Element + export interface ContractDropdownProps { exEnvironment: string, contracts: { @@ -155,34 +164,23 @@ export interface ContractDropdownProps { modal: (title: string, message: string | JSX.Element, okLabel: string, okFn: () => void, cancelLabel?: string, cancelFn?: () => void) => void, passphrase: string, setPassphrase: (passphrase: string) => void, - createInstance: (selectedContract: ContractData, - gasEstimationPrompt: (msg: string) => JSX.Element, - passphrasePrompt: (msg: string) => JSX.Element, - logBuilder: (msg: string) => JSX.Element, - publishToStorage: (storage: 'ipfs' | 'swarm', - contract: ContractData) => void, - mainnetPrompt: ( - tx: Tx, network: - Network, amount: string, - gasEstimation: string, - gasFees: (maxFee: string, cb: (txFeeText: string, priceStatus: boolean) => void) => void, - determineGasPrice: (cb: (txFeeText: string, gasPriceValue: string, gasPriceStatus: boolean) => void) => void - ) => JSX.Element, - isOverSizePrompt: () => JSX.Element, - args) => void, + createInstance: ( + selectedContract: ContractData, + gasEstimationPrompt: (msg: string) => JSX.Element, + passphrasePrompt: (msg: string) => JSX.Element, + logBuilder: (msg: string) => JSX.Element, + publishToStorage: (storage: 'ipfs' | 'swarm', + contract: ContractData) => void, + mainnetPrompt: MainnetPrompt, + isOverSizePrompt: () => JSX.Element, + args) => void, ipfsCheckedState: boolean, setIpfsCheckedState: (value: boolean) => void, publishToStorage: (storage: 'ipfs' | 'swarm', contract: ContractData) => void, - updateBaseFeePerGas: (baseFee: string) => void, - updateGasPriceStatus: (status: boolean) => void, - updateConfirmSettings: (confirmation: boolean) => void, - updateMaxFee: (fee: string) => void, - updateMaxPriorityFee: (fee: string) => void, - updateGasPrice: (price: string) => void, - updateTxFeeContent: (content: string) => void, - txFeeContent: string, - maxFee: string, - maxPriorityFee: string + gasEstimationPrompt: (msg: string) => JSX.Element, + logBuilder: (msg: string) => JSX.Element, + passphrasePrompt: (message: string) => JSX.Element, + mainnetPrompt: (tx: Tx, network: Network, amount: string, gasEstimation: string, gasFees: (maxFee: string, cb: (txFeeText: string, priceStatus: boolean) => void) => void, determineGasPrice: (cb: (txFeeText: string, gasPriceValue: string, gasPriceStatus: boolean) => void) => void) => JSX.Element } export interface RecorderProps { @@ -194,13 +192,31 @@ export interface InstanceContainerProps { instanceList: { contractData: ContractData, address: string, - name: string + name: string, + decodedResponse?: any }[], error: string }, clearInstances: () => void, removeInstance: (index: number) => void, - getContext: () => 'memory' | 'blockchain' + getContext: () => 'memory' | 'blockchain', + runTransactions: ( + index: number, + lookupOnly: boolean, + funcABI: FuncABI, + inputsValues: string, + contractName: string, + contractABI, contract, + address, + logMsg:string, + logBuilder: (msg: string) => JSX.Element, + mainnetPrompt: MainnetPrompt, + gasEstimationPrompt: (msg: string) => JSX.Element, + passphrasePrompt: (msg: string) => JSX.Element) => void, + gasEstimationPrompt: (msg: string) => JSX.Element, + logBuilder: (msg: string) => JSX.Element, + passphrasePrompt: (message: string) => JSX.Element, + mainnetPrompt: (tx: Tx, network: Network, amount: string, gasEstimation: string, gasFees: (maxFee: string, cb: (txFeeText: string, priceStatus: boolean) => void) => void, determineGasPrice: (cb: (txFeeText: string, gasPriceValue: string, gasPriceStatus: boolean) => void) => void) => JSX.Element } export interface Modal { @@ -251,5 +267,23 @@ export interface UdappProps { context: 'memory' | 'blockchain', abi?: FuncABI[], removeInstance: (index: number) => void, - index: number + index: number, + gasEstimationPrompt: (msg: string) => JSX.Element, + logBuilder: (msg: string) => JSX.Element, + passphrasePrompt: (message: string) => JSX.Element, + mainnetPrompt: (tx: Tx, network: Network, amount: string, gasEstimation: string, gasFees: (maxFee: string, cb: (txFeeText: string, priceStatus: boolean) => void) => void, determineGasPrice: (cb: (txFeeText: string, gasPriceValue: string, gasPriceStatus: boolean) => void) => void) => JSX.Element, + runTransactions: ( + index: number, + lookupOnly: boolean, + funcABI: FuncABI, + inputsValues: string, + contractName: string, + contractABI, contract, + address, + logMsg:string, + logBuilder: (msg: string) => JSX.Element, + mainnetPrompt: MainnetPrompt, + gasEstimationPrompt: (msg: string) => JSX.Element, + passphrasePrompt: (msg: string) => JSX.Element) => void, + decodedResponse: any }