From e817c9b4e25cfcd2f241f69b6b73d0152b531281 Mon Sep 17 00:00:00 2001 From: Doris Benda Date: Tue, 23 Jan 2024 18:35:13 +0200 Subject: [PATCH 01/11] Use moduleReferenceType --- front-end-tools/src/Main.tsx | 7 +- .../src/components/DeployComponent.tsx | 18 +- .../src/components/InitComponent.tsx | 240 ++++++++++-------- front-end-tools/src/constants.ts | 3 - 4 files changed, 149 insertions(+), 119 deletions(-) diff --git a/front-end-tools/src/Main.tsx b/front-end-tools/src/Main.tsx index e95954a6..6ffaf5ce 100644 --- a/front-end-tools/src/Main.tsx +++ b/front-end-tools/src/Main.tsx @@ -11,6 +11,7 @@ import { } from '@concordium/react-components'; import { Alert } from 'react-bootstrap'; +import { ModuleReference } from '@concordium/web-sdk'; import DeployComponent from './components/DeployComponent'; import ReadComponent from './components/ReadComponent'; import UpdateComponent from './components/UpdateComponent'; @@ -48,8 +49,10 @@ export default function Main(props: ConnectionProps) { const [accountBalance, setAccountBalance] = useState(undefined); // Shared state between deploy step and init step - const [moduleReferenceCalculated, setModuleReferenceCalculated] = useState(undefined); - const [moduleReferenceDeployed, setModuleReferenceDeployed] = useState(undefined); + const [moduleReferenceCalculated, setModuleReferenceCalculated] = useState( + undefined + ); + const [moduleReferenceDeployed, setModuleReferenceDeployed] = useState(undefined); const [contracts, setContracts] = useState([]); const [embeddedModuleSchemaBase64Init, setEmbeddedModuleSchemaBase64Init] = useState(undefined); diff --git a/front-end-tools/src/components/DeployComponent.tsx b/front-end-tools/src/components/DeployComponent.tsx index 39b47821..e70145e2 100644 --- a/front-end-tools/src/components/DeployComponent.tsx +++ b/front-end-tools/src/components/DeployComponent.tsx @@ -27,9 +27,9 @@ interface ConnectionProps { isTestnet: boolean; setContracts: (contracts: string[]) => void; setEmbeddedModuleSchemaBase64Init: (embeddedModuleSchemaBase64Init: string) => void; - setModuleReferenceDeployed: (moduleReferenceDeployed: string | undefined) => void; - setModuleReferenceCalculated: (moduleReferenceCalculated: string) => void; - moduleReferenceCalculated: string | undefined; + setModuleReferenceDeployed: (moduleReferenceDeployed: ModuleReference.Type | undefined) => void; + setModuleReferenceCalculated: (moduleReferenceCalculated: ModuleReference.Type) => void; + moduleReferenceCalculated: ModuleReference.Type | undefined; } /** @@ -76,7 +76,9 @@ export default function DeployComponenet(props: ConnectionProps) { report.outcome.summary.transactionType === TransactionKindString.DeployModule ) { setTransactionOutcome('Success'); - setModuleReferenceDeployed(report.outcome.summary.moduleDeployed.contents); + setModuleReferenceDeployed( + ModuleReference.fromHexString(report.outcome.summary.moduleDeployed.contents) + ); clearInterval(interval); } else { setTransactionOutcome('Fail'); @@ -97,7 +99,7 @@ export default function DeployComponenet(props: ConnectionProps) { useEffect(() => { if (connection && client && moduleReferenceCalculated) { client - .getModuleSource(ModuleReference.fromHexString(moduleReferenceCalculated)) + .getModuleSource(moduleReferenceCalculated) .then((value) => { if (value === undefined) { setIsModuleReferenceAlreadyDeployedStep1(false); @@ -160,7 +162,9 @@ export default function DeployComponenet(props: ConnectionProps) { setBase64Module(module); setModuleReferenceCalculated( - Buffer.from(sha256([new Uint8Array(arrayBuffer)])).toString('hex') + ModuleReference.fromBuffer( + Buffer.from(sha256([new Uint8Array(arrayBuffer)])) + ) ); // Concordium's tooling create versioned modules e.g. `.wasm.v1` now. @@ -250,7 +254,7 @@ export default function DeployComponenet(props: ConnectionProps) { <>
Calculated module reference: -
{moduleReferenceCalculated}
+
{moduleReferenceCalculated.moduleRef}
Module in base64: diff --git a/front-end-tools/src/components/InitComponent.tsx b/front-end-tools/src/components/InitComponent.tsx index de97797e..d839247f 100644 --- a/front-end-tools/src/components/InitComponent.tsx +++ b/front-end-tools/src/components/InitComponent.tsx @@ -23,17 +23,18 @@ import { TxHashLink } from './CCDScanLinks'; import Box from './Box'; import { initialize } from '../writing_to_blockchain'; import { getObjectExample, getArrayExample } from '../utils'; -import { REFRESH_INTERVAL, INPUT_PARAMETER_TYPES_OPTIONS, REG_MODULE_REF } from '../constants'; +import { REFRESH_INTERVAL, INPUT_PARAMETER_TYPES_OPTIONS } from '../constants'; +// import { getEmbeddedSchema } from '../../src/reading_from_blockchain'; interface ConnectionProps { - isTestnet: boolean; account: string; - connection: WalletConnection; client: ConcordiumGRPCClient | undefined; + connection: WalletConnection; contracts: string[]; embeddedModuleSchemaBase64: undefined | string; - moduleReferenceCalculated: undefined | string; - moduleReferenceDeployed: undefined | string; + isTestnet: boolean; + moduleReferenceCalculated: undefined | ModuleReference.Type; + moduleReferenceDeployed: undefined | ModuleReference.Type; } /** @@ -42,47 +43,51 @@ interface ConnectionProps { */ export default function InitComponent(props: ConnectionProps) { const { - isTestnet, account, - connection, client, + connection, + contracts, + embeddedModuleSchemaBase64, + isTestnet, moduleReferenceCalculated, moduleReferenceDeployed, - embeddedModuleSchemaBase64, - contracts, } = props; type FormType = { - moduleReference: string | undefined; - smartContractName: string | undefined; + cCDAmount: number; + deriveFromModuleRefernce: string | undefined; file: FileList | undefined; - useModuleReferenceFromStep1: boolean; - inputParameterType: string | undefined; - inputParameter: string | undefined; hasInputParameter: boolean; - maxExecutionEnergy: number; + inputParameter: string | undefined; + inputParameterType: string | undefined; isPayable: boolean; - cCDAmount: number; + maxExecutionEnergy: number; + moduleReferenceString: string | undefined; + moduleReference: ModuleReference.Type | undefined; + smartContractName: string | undefined; + useModuleReferenceFromStep1: boolean; }; const form = useForm({ mode: 'all' }); const [ - useModuleReferenceFromStep1, - smartContractName, + deriveFromModuleRefernce, + hasInputParameter, inputParameterType, isPayable, - hasInputParameter, moduleReference, + smartContractName, + useModuleReferenceFromStep1, ] = useWatch({ control: form.control, name: [ - 'useModuleReferenceFromStep1', - 'smartContractName', + 'deriveFromModuleRefernce', + 'hasInputParameter', 'inputParameterType', 'isPayable', - 'hasInputParameter', 'moduleReference', + 'smartContractName', + 'useModuleReferenceFromStep1', ], }); @@ -143,20 +148,18 @@ export default function InitComponent(props: ConnectionProps) { useEffect(() => { if (connection && client && moduleReference) { - if (REG_MODULE_REF.test(moduleReference)) { - client - .getModuleSource(ModuleReference.fromHexString(moduleReference)) - .then((value) => { - if (value === undefined) { - setIsModuleReferenceAlreadyDeployedStep2(false); - } else { - setIsModuleReferenceAlreadyDeployedStep2(true); - } - }) - .catch(() => { + client + .getModuleSource(moduleReference) + .then((value) => { + if (value === undefined) { setIsModuleReferenceAlreadyDeployedStep2(false); - }); - } + } else { + setIsModuleReferenceAlreadyDeployedStep2(true); + } + }) + .catch(() => { + setIsModuleReferenceAlreadyDeployedStep2(false); + }); } }, [connection, client, moduleReference]); @@ -249,7 +252,7 @@ export default function InitComponent(props: ConnectionProps) { connection, AccountAddress.fromBase58(account), isModuleReferenceAlreadyDeployedStep2, - data.moduleReference ? ModuleReference.fromHexString(data.moduleReference) : undefined, + data.moduleReference ? data.moduleReference : undefined, data.inputParameter, data.smartContractName ? ContractName.fromString(data.smartContractName) : undefined, data.hasInputParameter, @@ -265,99 +268,122 @@ export default function InitComponent(props: ConnectionProps) { return (
- - { - const register = form.register('useModuleReferenceFromStep1'); - - register.onChange(e); + + DeriveFromModuleRefernce + { form.setValue('deriveFromModuleRefernce', e?.value); @@ -322,7 +322,7 @@ export default function InitComponent(props: ConnectionProps) { const selectValue = form.getValues('deriveFromModuleRefernce'); - if (selectValue === 'Derive from step 1') { + if (selectValue === DERIVE_FROM_STEP_1.value) { form.clearErrors('moduleReferenceString'); setModuleReference(undefined); form.setValue('moduleReferenceString', undefined); @@ -339,7 +339,7 @@ export default function InitComponent(props: ConnectionProps) { } } - if (selectValue === 'Derive from chain') { + if (selectValue === DERIVE_FROM_CHAIN.value) { if (moduleReference === undefined) { setModuleReferenceError('Set module reference field below'); } else { @@ -348,7 +348,7 @@ export default function InitComponent(props: ConnectionProps) { } }} /> - {deriveFromModuleRefernce === 'Derive from step 1' && ( + {deriveFromModuleRefernce === DERIVE_FROM_STEP_1.value && ( <>
@@ -360,20 +360,20 @@ export default function InitComponent(props: ConnectionProps) {
  • - Select Don't derive in the above drop down, if you want to manually fill - in a module reference, the smart contract name, or an{' '} + Select {DO_NOT_DERIVE.label} in the above drop down, if you want to manually + fill in a module reference, the smart contract name, or an{' '} input parameter schema.
  • - Select Derive from chain again in the drop down, if you want to load a new - module from Step 1 because this box will not automatically update when you do - changes to Step 1. + Select {DERIVE_FROM_STEP_1.label} again in the drop down, if you want to load + a new module from Step 1 because this box will not automatically update when + you do changes to Step 1.

  • )} - {deriveFromModuleRefernce === 'Derive from chain' && ( + {deriveFromModuleRefernce === DERIVE_FROM_CHAIN.value && ( <>
    @@ -385,14 +385,14 @@ export default function InitComponent(props: ConnectionProps) {
    • - Select Don't derive in the above drop down, if you want to manually - fill in the smart contract name, or an{' '} + Select {DO_NOT_DERIVE.label} in the above drop down, if you want to + manually fill in the smart contract name, or an{' '} input parameter schema.
    • - Select Derive from chain again in the drop down, if you want to load a - new module from the chain because this box will not automatically update when - you change the moduel reference in field below. + Select {DERIVE_FROM_CHAIN.label} again in the drop down, if you want to + load a new module from the chain because this box will not automatically update + when you change the moduel reference in field below.
    @@ -408,7 +408,7 @@ export default function InitComponent(props: ConnectionProps) { Module Reference
    - {deriveFromModuleRefernce !== "Don't derive" && displayContracts.length > 0 ? ( + {deriveFromModuleRefernce !== DO_NOT_DERIVE.value && displayContracts.length > 0 ? ( Smart Contract Name @@ -536,7 +536,7 @@ export default function InitComponent(props: ConnectionProps) { {hasInputParameter && (
    - {deriveFromModuleRefernce === "Don't derive" && ( + {deriveFromModuleRefernce === DO_NOT_DERIVE.value && ( Upload Smart Contract Module Schema File (e.g. schema.bin) )} - {deriveFromModuleRefernce === "Don't derive" && schema && ( + {deriveFromModuleRefernce === DO_NOT_DERIVE.value && schema && (
    Schema in base64:
    {schema.toString().slice(0, 30)} ...
    @@ -607,11 +607,16 @@ export default function InitComponent(props: ConnectionProps) { - {(inputParameterType === 'number' || inputParameterType === 'string') && ( + {(inputParameterType === INPUT_PARAMETER_TYPE_NUMBER.value || + inputParameterType === INPUT_PARAMETER_TYPE_STRING.value) && ( Add your input parameter ({inputParameterType}): { const register = form.register('inputParameter', { @@ -630,11 +635,12 @@ export default function InitComponent(props: ConnectionProps) { )} - {(inputParameterType === 'object' || inputParameterType === 'array') && ( + {(inputParameterType === INPUT_PARAMETER_TYPE_ARRAY.value || + inputParameterType === INPUT_PARAMETER_TYPE_OBJECT.value) && ( Add your input parameter ({inputParameterType}): - {inputParameterType === 'array' && ( + {inputParameterType === INPUT_PARAMETER_TYPE_ARRAY.value && ( )} - {inputParameterType === 'object' && ( + {inputParameterType === INPUT_PARAMETER_TYPE_OBJECT.value && (