Skip to content

Commit 915db70

Browse files
committed
hotfix: bugs in contract-class view (UI)
1 parent c4b5f14 commit 915db70

File tree

7 files changed

+114
-71
lines changed

7 files changed

+114
-71
lines changed

services/event-cannon/src/cannon/scenarios/deploy-and-interact-token-contract.ts

+51-25
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,18 @@
1-
import { Contract, DeploySentTx, waitForPXE } from "@aztec/aztec.js";
1+
import {
2+
AztecAddress,
3+
Contract,
4+
DeploySentTx,
5+
waitForPXE,
6+
} from "@aztec/aztec.js";
7+
import { TokenContract } from "@aztec/noir-contracts.js/Token";
8+
import * as tokenContractArtifactJson from "@aztec/noir-contracts.js/artifacts/token_contract-Token" assert { type: "json" };
29
import { logger } from "../../logger.js";
310
import { getAztecNodeClient, getPxe, getWallets } from "../pxe.js";
411
import {
512
deployContract,
613
logAndWaitForTx,
7-
registerContractClassArtifact,
14+
verifyContractInstanceDeployment,
815
} from "./utils/index.js";
9-
import { TokenContract } from "@aztec/noir-contracts.js/Token";
10-
import * as tokenContractArtifactJson from "@aztec/noir-contracts.js/artifacts/token_contract-Token" assert { type: "json" };
1116

1217
export async function run() {
1318
logger.info("===== TOKEN CONTRACT =====");
@@ -19,47 +24,68 @@ export async function run() {
1924
const tokenAdmin = namedWallets.alice.getAddress();
2025

2126
const contractLoggingName = "Token Contract";
27+
const constructorArgs: [AztecAddress, string, string, number] = [
28+
tokenAdmin,
29+
"lol",
30+
"LOL",
31+
9,
32+
];
2233
const tokenContract = await deployContract({
2334
contractLoggingName,
2435
deployFn: (): DeploySentTx<TokenContract> => {
2536
return TokenContract.deploy(
2637
deployerWallet,
27-
tokenAdmin,
28-
"lol",
29-
"LOL",
30-
9
38+
constructorArgs[0],
39+
constructorArgs[1],
40+
constructorArgs[2],
41+
constructorArgs[3],
3142
).send();
3243
},
3344
node: getAztecNodeClient(),
3445
});
3546

36-
registerContractClassArtifact(
47+
verifyContractInstanceDeployment({
3748
contractLoggingName,
38-
tokenContractArtifactJson,
39-
tokenContract.instance.contractClassId.toString(),
40-
tokenContract.instance.version
41-
).catch((err) => {
42-
logger.error(err);
49+
contractInstanceAddress: tokenContract.address.toString(),
50+
verifyArgs: {
51+
artifactObj: tokenContractArtifactJson,
52+
publicKeysString: tokenContract.instance.publicKeys.toString(),
53+
deployer: tokenContract.instance.deployer.toString(),
54+
salt: tokenContract.instance.salt.toString(),
55+
constructorArgs: constructorArgs.map((arg) => arg.toString()),
56+
},
57+
deployerMetadata: {
58+
contractIdentifier: contractLoggingName,
59+
details: "Token contract",
60+
creatorName: "Event Cannon",
61+
creatorContact:
62+
"email: [email protected], discord: test#1234, telegram: @test",
63+
appUrl: "https://aztec.network",
64+
repoUrl: "https://github.com/AztecProtocol/aztec-packages",
65+
reviewedAt: new Date(),
66+
},
67+
}).catch((err) => {
68+
logger.error(`Failed to verify contract instance deployment: ${err}`);
4369
});
4470

4571
await Promise.all([
4672
logAndWaitForTx(
4773
tokenContract.methods
4874
.mint_to_public(namedWallets.alice.getAddress(), 1000)
4975
.send(),
50-
"Mint to Alice"
76+
"Mint to Alice",
5177
),
5278
logAndWaitForTx(
5379
tokenContract.methods
5480
.mint_to_public(namedWallets.bob.getAddress(), 1000)
5581
.send(),
56-
"Mint to Bob"
82+
"Mint to Bob",
5783
),
5884
logAndWaitForTx(
5985
tokenContract.methods
6086
.mint_to_public(namedWallets.charlie.getAddress(), 1000)
6187
.send(),
62-
"Mint to Charlie"
88+
"Mint to Charlie",
6389
),
6490
]);
6591
const [balanceAlice, balanceBob, balanceCharlie] = await Promise.all([
@@ -83,19 +109,19 @@ export async function run() {
83109
const aliceContract = (await Contract.at(
84110
tokenContract.address,
85111
TokenContract.artifact,
86-
namedWallets.alice
112+
namedWallets.alice,
87113
)) as TokenContract;
88114

89115
const bobsTokenContract = (await Contract.at(
90116
tokenContract.address,
91117
TokenContract.artifact,
92-
namedWallets.bob
118+
namedWallets.bob,
93119
)) as TokenContract;
94120

95121
const charliesTokenContract = (await Contract.at(
96122
tokenContract.address,
97123
TokenContract.artifact,
98-
namedWallets.charlie
124+
namedWallets.charlie,
99125
)) as TokenContract;
100126

101127
let bobNonce = 0;
@@ -105,10 +131,10 @@ export async function run() {
105131
namedWallets.bob.getAddress(),
106132
namedWallets.alice.getAddress(),
107133
100,
108-
bobNonce
134+
bobNonce,
109135
)
110136
.send(),
111-
"Public transfer from Alice to Bob"
137+
"Public transfer from Alice to Bob",
112138
);
113139
bobNonce++;
114140

@@ -130,7 +156,7 @@ export async function run() {
130156
charliesTokenContract.methods
131157
.transfer_to_private(namedWallets.alice.getAddress(), 100)
132158
.send(),
133-
"Public to private transfer from Charlie to Alice"
159+
"Public to private transfer from Charlie to Alice",
134160
);
135161

136162
let aliceNonce = 0;
@@ -140,10 +166,10 @@ export async function run() {
140166
namedWallets.alice.getAddress(),
141167
namedWallets.bob.getAddress(),
142168
100,
143-
aliceNonce
169+
aliceNonce,
144170
)
145171
.send(),
146-
"Private transfer from Bob to Alice"
172+
"Private transfer from Bob to Alice",
147173
);
148174
aliceNonce++;
149175

services/event-cannon/src/cannon/scenarios/deploy-and-interact-vote-contract.ts

+7-13
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ import { getAztecNodeClient, getPxe, getWallets } from "../pxe.js";
99
import {
1010
deployContract,
1111
logAndWaitForTx,
12-
registerContractClassArtifact,
1312
verifyContractInstanceDeployment,
1413
} from "./utils/index.js";
1514

@@ -25,23 +24,18 @@ export async function run() {
2524
const votingAdmin = namedWallets.alice.getAddress();
2625

2726
const contractLoggingName = contractId;
27+
const constructorArgs = [votingAdmin];
28+
2829
const contract = await deployContract({
2930
contractLoggingName,
3031
deployFn: (): DeploySentTx<EasyPrivateVotingContract> =>
31-
EasyPrivateVotingContract.deploy(deployerWallet, votingAdmin).send(),
32+
EasyPrivateVotingContract.deploy(
33+
deployerWallet,
34+
constructorArgs[0],
35+
).send(),
3236
broadcastWithWallet: deployerWallet, // NOTE: comment this out to not broadcast
3337
node: getAztecNodeClient(),
3438
});
35-
registerContractClassArtifact(
36-
contractLoggingName,
37-
contractArtifactJson,
38-
contract.instance.contractClassId.toString(),
39-
contract.instance.version,
40-
).catch((err) => {
41-
logger.error(
42-
`Failed to register contract class artifact: ${(err as Error).stack}`,
43-
);
44-
});
4539

4640
verifyContractInstanceDeployment({
4741
contractLoggingName,
@@ -51,7 +45,7 @@ export async function run() {
5145
publicKeysString: contract.instance.publicKeys.toString(),
5246
deployer: contract.instance.deployer.toString(),
5347
salt: contract.instance.salt.toString(),
54-
constructorArgs: [votingAdmin.toString()],
48+
constructorArgs: constructorArgs.map((arg) => arg.toString()),
5549
},
5650
deployerMetadata: {
5751
contractIdentifier: contractId,

services/explorer-ui/src/components/info-display/key-value-row.tsx

+5-1
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,11 @@ export const KeyValueRow: FC<KeyValueRowProps> = ({
5656
{displayType === DisplayType.HEX && (
5757
<span className={commonTextClasses}>
5858
<CopyableText
59-
text={truncateHashString(value)}
59+
text={
60+
value.startsWith("0x") && !value.includes(", ")
61+
? truncateHashString(value)
62+
: value
63+
}
6064
toCopy={value}
6165
additionalClassesIcon="justify-end"
6266
/>

services/explorer-ui/src/pages/contract-class-details/index.tsx

+4-4
Original file line numberDiff line numberDiff line change
@@ -26,14 +26,14 @@ export const ContractClassDetails: FC = () => {
2626
const selectedVersion = selectedVersionWithArtifactRes?.data
2727
? selectedVersionWithArtifactRes.data
2828
: contractClassesRes.data?.find(
29-
(contract) => contract.version === Number(version)
29+
(contract) => contract.version === Number(version),
3030
);
3131

32-
const headerStr = `Contract class details - "${
32+
const headerStr = `Contract class details${
3333
selectedVersion?.artifactContractName
34-
? selectedVersion?.artifactContractName
34+
? ` - "${selectedVersion?.artifactContractName}"`
3535
: ""
36-
}"`;
36+
}`;
3737

3838
return (
3939
<div className="mx-auto px-[70px] max-w-[1440px]">

services/explorer-ui/src/pages/contract-class-details/tabs-section.tsx

+22-12
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,19 @@ interface TabSectionProps {
2525
contractArtifactError: Error | null;
2626
}
2727

28+
export const getDataFromMap = (data: SimplifiedViewOfFunc) => {
29+
// eslint-disable-next-line @typescript-eslint/consistent-indexed-object-style
30+
const result: { [key: string]: { [key: string]: string } } = {};
31+
for (const [key, value] of data) {
32+
// eslint-disable-next-line @typescript-eslint/consistent-indexed-object-style
33+
result[key] = {};
34+
for (const [k, v] of value) {
35+
result[key][k] = v;
36+
}
37+
}
38+
return result;
39+
};
40+
2841
export const TabSection: FC<TabSectionProps> = ({
2942
contractClasses,
3043
contractClassId,
@@ -38,9 +51,9 @@ export const TabSection: FC<TabSectionProps> = ({
3851
};
3952

4053
let artifact: SimpleArtifactData;
41-
let privFunc: SimplifiedViewOfFunc = {};
42-
let pubFunc: SimplifiedViewOfFunc = {};
43-
let uncFunc: SimplifiedViewOfFunc = {};
54+
let privFunc: SimplifiedViewOfFunc = new Map();
55+
let pubFunc: SimplifiedViewOfFunc = new Map();
56+
let uncFunc: SimplifiedViewOfFunc = new Map();
4457

4558
if (selectedVersion?.artifactJson) {
4659
const artifactData = getArtifactData(selectedVersion);
@@ -54,12 +67,9 @@ export const TabSection: FC<TabSectionProps> = ({
5467
contractVersions: !!contractClasses && !!contractClasses.data?.length,
5568
contractInstances: !!contractInstances && !!contractInstances.data?.length,
5669

57-
privateFunctions:
58-
!!selectedVersion && privFunc && Object.values(privFunc).length > 1,
59-
unconstrainedFunctions:
60-
!!selectedVersion && uncFunc && Object.values(uncFunc).length > 1,
61-
publicFunctions:
62-
!!selectedVersion && pubFunc && Object.values(pubFunc).length > 1,
70+
privateFunctions: !!selectedVersion && privFunc && privFunc.size > 1,
71+
unconstrainedFunctions: !!selectedVersion && uncFunc && uncFunc.size > 1,
72+
publicFunctions: !!selectedVersion && pubFunc && pubFunc.size > 1,
6373
artifactJson:
6474
!!selectedVersion &&
6575
(!!selectedVersion.artifactJson || isContractArtifactLoading),
@@ -73,11 +83,11 @@ export const TabSection: FC<TabSectionProps> = ({
7383
case "contractInstances":
7484
return <ContractInstancesTab data={contractInstances} />;
7585
case "privateFunctions":
76-
return <JsonTab data={privFunc} />;
86+
return <JsonTab data={getDataFromMap(privFunc)} />;
7787
case "unconstrainedFunctions":
78-
return <JsonTab data={uncFunc} />;
88+
return <JsonTab data={getDataFromMap(uncFunc)} />;
7989
case "publicFunctions":
80-
return <JsonTab data={pubFunc} />;
90+
return <JsonTab data={getDataFromMap(pubFunc)} />;
8191
case "artifactJson":
8292
return isContractArtifactLoading ? (
8393
<Loader amount={1} />

services/explorer-ui/src/pages/contract-class-details/tabs/json-tab.tsx

+1-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
import { type FC } from "react";
2-
import { type SimpleArtifactData, type SimplifiedViewOfFunc } from "../util";
32

43
interface JsonTabProps {
5-
data: SimpleArtifactData | SimplifiedViewOfFunc;
4+
data: unknown
65
}
76
export const JsonTab: FC<JsonTabProps> = ({ data }) => {
87
return <pre className="overflow-auto">{JSON.stringify(data, null, 2)}</pre>;

0 commit comments

Comments
 (0)