Skip to content

Commit

Permalink
feat: unbox empty box (#2387)
Browse files Browse the repository at this point in the history
provides a stripped down contract with almost nothing, but retains the
opinionated/batteries included react frontend from the PrivateToken
contract box.

<img width="1504" alt="image"
src="https://github.com/AztecProtocol/aztec-packages/assets/142251406/6124f922-fdb9-4cf3-b710-1968f4e9b393">

<img width="1513" alt="image"
src="https://github.com/AztecProtocol/aztec-packages/assets/142251406/e8659667-08ab-4b9c-88f1-1170e0ff6aed">


# Checklist:
Remove the checklist to signal you've completed it. Enable auto-merge if
the PR is ready to merge.
- [ ] If the pull request requires a cryptography review (e.g.
cryptographic algorithm implementations) I have added the 'crypto' tag.
- [ ] I have reviewed my diff in github, line by line and removed
unexpected formatting changes, testing logs, or commented-out code.
- [ ] Every change is related to the PR description.
- [ ] I have
[linked](https://docs.github.com/en/issues/tracking-your-work-with-issues/linking-a-pull-request-to-an-issue)
this pull request to relevant issues (if any exist).

---------

Co-authored-by: Leila Wang <[email protected]>
  • Loading branch information
dan-aztec and LeilaWang authored Sep 21, 2023
1 parent 16a3d9c commit 3e3930c
Show file tree
Hide file tree
Showing 63 changed files with 2,123 additions and 43 deletions.
61 changes: 61 additions & 0 deletions yarn-project/boxes/blank-react/.eslintrc.cjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
module.exports = {
root: true,
env: { browser: true, es2020: true },
extends: [
'eslint:recommended',
'plugin:@typescript-eslint/recommended',
'plugin:react-hooks/recommended',
'plugin:import/recommended',
'plugin:import/typescript',
'prettier',
],
settings: {
'import/resolver': {
typescript: true,
node: true,
},
},
ignorePatterns: ['dist', '.eslintrc.cjs'],
parser: '@typescript-eslint/parser',
plugins: ['react-refresh'],
overrides: [
{
files: ['*.ts', '*.tsx'],
parserOptions: {
// hacky workaround for CI not having the same tsconfig setup
project: true,
},
},
],
rules: {
'react-refresh/only-export-components': ['warn', { allowConstantExport: true }],
'@typescript-eslint/explicit-module-boundary-types': 'off',
'@typescript-eslint/no-non-null-assertion': 'off',
'@typescript-eslint/no-explicit-any': 'off',
'@typescript-eslint/no-empty-function': 'off',
'@typescript-eslint/await-thenable': 'error',
'@typescript-eslint/no-floating-promises': 2,
'@typescript-eslint/no-unused-vars': ['error', { argsIgnorePattern: '^_', varsIgnorePattern: '^_' }],
'require-await': 2,
'no-console': 'warn',
'no-constant-condition': 'off',
camelcase: 2,
'no-restricted-imports': [
'error',
{
patterns: [
{
group: ['client-dest'],
message: "Fix this absolute garbage import. It's your duty to solve it before it spreads.",
},
{
group: ['dest'],
message: 'You should not be importing from a build directory. Did you accidentally do a relative import?',
},
],
},
],
'import/no-unresolved': 'error',
'import/no-extraneous-dependencies': 'error',
},
};
24 changes: 24 additions & 0 deletions yarn-project/boxes/blank-react/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
lerna-debug.log*

node_modules
dest
dest-ssr
*.local

# Editor directories and files
.vscode/*
!.vscode/extensions.json
.idea
.DS_Store
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?
6 changes: 6 additions & 0 deletions yarn-project/boxes/blank-react/.prettierrc.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"singleQuote": true,
"trailingComma": "all",
"printWidth": 120,
"arrowParens": "avoid"
}
79 changes: 79 additions & 0 deletions yarn-project/boxes/blank-react/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
This is a minimal [Aztec](https://aztec.network/) Noir smart contract and frontend bootstrapped with [`aztec-cli unbox`](https://github.com/AztecProtocol/aztec-packages/tree/master/yarn-project/cli). It is recommended you use the `aztec-cli unbox blank-react` command so that the repository is copied with needed modifications from the monorepo subpackage.

## Setup

Dependencies can be installed from the root of the package:

```bash
yarn
yarn install:noir
yarn install:sandbox
```

This sandbox requires [Docker](https://www.docker.com/) to be installed _and running_ locally. In the event the image needs updating, you can run `yarn install:sandbox` (see [sandbox docs](https://aztec-docs-dev.netlify.app/dev_docs/getting_started/sandbox) for more information.)

In addition to the usual javascript dependencies, this project requires `nargo` (package manager) and `noir` (Aztec ZK smart contract language) in addition to `@aztec/aztec-cli`. The former are installed within `yarn install:noir`

## Getting started

After `yarn` has run,`yarn start:sandbox` in one terminal will launch a local instance of the Aztec sandbox via Docker Compose and `yarn start:dev` will launch a frontend app for deploying and interacting with an empty Aztec smart contract.

At this point, [http://localhost:5173](http://localhost:5173) should provide a minimal smart contract frontend.

This folder should have the following directory structure:

```
|— README.md
|— package.json
|— src
|-config.ts - Blank Contract specific configuration for the frontend.
| You may need to update this if you modify the contract functions.
|— app
|— [frontend React .tsx code files]
|- scripts
|- [helpers for frontend to interact with contract on the sandbox]
|— contracts
|— src
| The Noir smart contract source files are here.
|— main.nr - the cloned noir contract, your starting point
|- interface.nr - autogenerated from main.nr when you compile
|— Nargo.toml [Noir build file, includes Aztec smart contract dependencies]
|— artifacts
| These are both generated from `contracts/` by the compile command
|— blank_contract.json
|— blank.ts
|— tests
| A simple end2end test deploying and testing the Blank contract deploys on a local sandbox
| The test requires the sandbox and anvil to be running (yarn start:sandbox).
|- blank.contract.test.ts
```

Most relevant to you is likely `src/contracts/main.nr` (and the build config `src/contracts/Nargo.toml`). This contains the example blank contract logic that the frontend interacts with and is a good place to start writing Noir.

The `src/artifacts` folder can be re-generated from the command line

```bash
yarn compile
```

This will generate a [Contract ABI](src/artifacts/test_contract.json) and TypeScript class for the [Aztec smart contract](src/contracts/main.nr), which the frontend uses to generate the UI.

Note: the `compile` command seems to generate a Typescript file which needs a single change -

```
import TestContractAbiJson from 'text_contract.json' assert { type: 'json' };
// need to update the relative import to
import TestContractAbiJson from './test_contract.json' assert { type: 'json' };
```

After compiling, you can re-deploy the upated noir smart contract from the web UI. The function interaction forms are generated from parsing the ContractABI, so they should update automatically after you recompile.

## Learn More

To learn more about Noir Smart Contract development, take a look at the following resources:

- [Awesome Noir](https://github.com/noir-lang/awesome-noir) - learn about the Noir programming language.

## Deploy on Aztec3

Coming Soon :)
101 changes: 101 additions & 0 deletions yarn-project/boxes/blank-react/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
{
"name": "blank-contract-react",
"private": true,
"version": "0.1.0",
"type": "module",
"main": "./dest/index.js",
"scripts": {
"build": "yarn clean && webpack",
"install:noir": "curl -L https://raw.githubusercontent.com/noir-lang/noirup/main/install | bash noirup -v aztec",
"install:sandbox": "docker pull aztecprotocol/aztec-sandbox:latest",
"clean": "rm -rf ./dest .tsbuildinfo",
"start": "serve -p 3000 ./dest",
"start:dev": "webpack serve --mode=development",
"start:sandbox": "SANDBOX_VERSION=latest /bin/bash -c \"$(curl -fsSL 'https://sandbox.aztec.network')\" ",
"formatting": "prettier --check ./src && eslint ./src",
"formatting:fix": "prettier -w ./src",
"compile": "aztec-cli compile src/contracts --outdir ../artifacts --typescript ../artifacts",
"test": "NODE_NO_WARNINGS=1 node --experimental-vm-modules $(yarn bin jest) --runInBand",
"test:integration": "concurrently -k -s first -c reset,dim -n test,anvil \"yarn test\" \"anvil\""
},
"jest": {
"preset": "ts-jest/presets/default-esm",
"globals": {
"ts-jest": {
"useESM": true
}
},
"transform": {
"^.+\\.(ts|tsx)$": "ts-jest"
},
"moduleNameMapper": {
"^(\\.{1,2}/.*)\\.js$": "$1"
},
"testRegex": "./src/.*\\.test\\.ts$",
"rootDir": "./src"
},
"dependencies": {
"@aztec/aztec-ui": "^0.1.14",
"@aztec/aztec.js": "workspace:^",
"@aztec/circuits.js": "workspace:^",
"@aztec/cli": "workspace:^",
"@aztec/foundation": "workspace:^",
"classnames": "^2.3.2",
"formik": "^2.4.3",
"node-sass": "^9.0.0",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"sass-loader": "^13.3.2",
"serve": "^14.2.1",
"yup": "^1.2.0"
},
"devDependencies": {
"@types/node": "^20.5.9",
"@types/react": "^18.2.15",
"@types/react-dom": "^18.2.7",
"@typescript-eslint/eslint-plugin": "^6.0.0",
"@typescript-eslint/parser": "^6.0.0",
"autoprefixer": "^10.4.15",
"copy-webpack-plugin": "^11.0.0",
"css-loader": "^6.8.1",
"eslint": "^8.45.0",
"eslint-import-resolver-typescript": "^3.5.5",
"eslint-plugin-import": "^2.27.5",
"eslint-plugin-react-hooks": "^4.6.0",
"eslint-plugin-react-refresh": "^0.4.3",
"jest": "^29.6.4",
"postcss": "^8.4.29",
"postcss-loader": "^7.3.3",
"prettier": "^3.0.3",
"resolve-typescript-plugin": "^2.0.1",
"stream-browserify": "^3.0.0",
"style-loader": "^3.3.3",
"ts-jest": "^29.1.0",
"ts-loader": "^9.4.4",
"ts-node": "^10.9.1",
"tty-browserify": "^0.0.1",
"typescript": "^5.0.4",
"util": "^0.12.5",
"webpack": "^5.88.2",
"webpack-cli": "^5.1.4",
"webpack-dev-server": "^4.15.1"
},
"browserslist": {
"production": [
">0.5%",
"not dead",
"not op_mini all"
],
"development": [
"last 1 chrome version",
"last 1 firefox version",
"last 1 safari version"
]
},
"files": [
"dest",
"src",
"!*.test.*"
],
"types": "./dest/index.d.ts"
}
9 changes: 9 additions & 0 deletions yarn-project/boxes/blank-react/src/@types/index.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
declare module '*.svg' {
const content: any;
export default content;
}

declare module '*.module.scss' {
const content: { [className: string]: string };
export = content;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
.input {
border: none;
outline-width: 0;
outline-color: rgba(0, 0, 0, 0);
padding: 2px 20px 0 20px;
width: 100%;
height: 45px;
color: #000;
border: 1px solid rgba(0, 0, 0, 0);
font-size: 16px;
text-align: left;
font-weight: 400;
border-radius: 10px;
text-align: left;
text-overflow: ellipsis;
transition: box-shadow .2s;
box-shadow: 0px 4px 10px rgba(0, 0, 0, .1);
background-color: white;
-webkit-appearance: none;


&:disabled {
color: #4a4a4a;
background-color: rgba(239, 239, 239, 0.3);
background: radial-gradient(rgba(239, 239, 239, 0.3), rgba(239, 239, 239, 0.3));
-webkit-text-fill-color: #4a4a4a;
cursor: not-allowed;
}
}

.label {
font-weight: 450;
font-size: 18px;
display: flex;
width: 100%;
flex-direction: column;
text-align: left;
margin-bottom: 15px;
justify-content: space-between;
}

.inputWrapper {
width: 100%;
display: flex;
gap: 15px;
}

.field {
display: flex;
justify-content: start;
flex-direction: column;
align-items: flex-start;
}

.content {
display: flex;
justify-content: space-between;
flex-direction: column;
margin: 30px;
width: 450px;
gap: 30px;
}

.actionButton {
width: 100%;
align-self: center;
}
Loading

0 comments on commit 3e3930c

Please sign in to comment.