Repository: Shard-Labs/starknet-hardhat-plugin Branch: master Commit: 4514b439c38b Files: 308 Total size: 883.8 KB Directory structure: gitextract_4bx1t30c/ ├── .circleci/ │ └── config.yml ├── .eslintrc.json ├── .github/ │ ├── ISSUE_TEMPLATE/ │ │ └── bug_report.md │ └── pull_request_template.md ├── .gitignore ├── .prettierrc ├── LICENSE ├── README.md ├── config.json ├── contract-artifacts/ │ ├── ArgentAccount/ │ │ └── 780760e4156afe592bb1feff7e769cf279ae9831/ │ │ ├── ArgentAccount.cairo/ │ │ │ ├── ArgentAccount.json │ │ │ └── ArgentAccount_abi.json │ │ └── Proxy.cairo/ │ │ ├── Proxy.json │ │ └── Proxy_abi.json │ ├── OpenZeppelinAccount/ │ │ └── 0.5.1/ │ │ └── Account.cairo/ │ │ ├── Account.json │ │ └── Account_abi.json │ ├── OpenZeppelinUDC/ │ │ └── 0.5.0/ │ │ └── UDC.cairo/ │ │ ├── UDC.json │ │ └── UDC_abi.json │ └── Token/ │ └── ERC20.cairo/ │ ├── ERC20.json │ └── ERC20_abi.json ├── hardhat.config.ts ├── package.json ├── scripts/ │ ├── devnet-restart.sh │ ├── devnet-run.sh │ ├── devnet-stop.sh │ ├── ensure-python.sh │ ├── install-devnet.sh │ ├── npm-publish.sh │ ├── set-alpha-vars.sh │ ├── set-devnet-vars.sh │ ├── setup-compiler.sh │ ├── setup-venv.sh │ ├── test-dev.sh │ ├── test-setup.sh │ ├── test.sh │ ├── update-oz-account.sh │ └── versions.sh ├── src/ │ ├── account-utils.ts │ ├── account.ts │ ├── adapt.ts │ ├── cairo1-compiler.ts │ ├── constants.ts │ ├── devnet-utils.ts │ ├── extend-utils.ts │ ├── external-server/ │ │ ├── create-devnet-wrapper.ts │ │ ├── docker-amarna.ts │ │ ├── docker-devnet.ts │ │ ├── docker-server.ts │ │ ├── external-server.ts │ │ ├── index.ts │ │ ├── integrated-devnet-logger.ts │ │ └── venv-devnet.ts │ ├── index.ts │ ├── recompiler.ts │ ├── scarb-wrapper.ts │ ├── starknet-docker-proxy.ts │ ├── starknet-js-wrapper.ts │ ├── starknet-plugin-error.ts │ ├── starknet-types.ts │ ├── starknet-venv-proxy.ts │ ├── starknet-wrappers.ts │ ├── starknet_cli_wrapper.py │ ├── task-actions.ts │ ├── type-extensions.ts │ ├── types/ │ │ ├── devnet.ts │ │ ├── index.ts │ │ └── starknet.ts │ ├── utils/ │ │ ├── check-command-path.ts │ │ └── venv.ts │ └── utils.ts ├── test/ │ ├── configuration-tests/ │ │ ├── with-account-compilation-option/ │ │ │ ├── check.ts │ │ │ ├── dummy_account.cairo │ │ │ ├── hardhat.config.ts │ │ │ └── network.json │ │ ├── with-artifacts-path/ │ │ │ ├── check.ts │ │ │ ├── hardhat.config.ts │ │ │ └── network.json │ │ ├── with-cairo-path/ │ │ │ ├── check.ts │ │ │ ├── hardhat.config.ts │ │ │ └── network.json │ │ ├── with-cairo-version/ │ │ │ ├── check.ts │ │ │ ├── hardhat.config.ts │ │ │ └── network.json │ │ ├── with-cairo1-compiler-dir/ │ │ │ ├── check.ts │ │ │ ├── hardhat.config.ts │ │ │ └── network.json │ │ ├── with-cairo1-compiler-dir-omitted/ │ │ │ ├── check.ts │ │ │ ├── hardhat.config.ts │ │ │ └── network.json │ │ ├── with-cli-network/ │ │ │ ├── check.ts │ │ │ ├── hardhat.config.ts │ │ │ └── network.json │ │ ├── with-compiler-version/ │ │ │ ├── check.ts │ │ │ ├── hardhat.config.ts │ │ │ └── network.json │ │ ├── with-disable-hint-compilation-option/ │ │ │ ├── check.ts │ │ │ ├── contract_with_unwhitelisted_hints.cairo │ │ │ ├── hardhat.config.ts │ │ │ └── network.json │ │ ├── with-networks/ │ │ │ ├── check.ts │ │ │ ├── hardhat.config.ts │ │ │ ├── invalid-cli-network.txt │ │ │ ├── invalid-config-network.txt │ │ │ ├── network.json │ │ │ └── without-starknet-network.txt │ │ ├── with-request-timeout-1ms/ │ │ │ ├── check.ts │ │ │ ├── hardhat.config.ts │ │ │ └── network.json │ │ ├── with-request-timeout-default/ │ │ │ ├── check.ts │ │ │ ├── hardhat.config.ts │ │ │ └── network.json │ │ ├── with-scarb-custom/ │ │ │ ├── check.ts │ │ │ ├── hardhat.config.ts │ │ │ └── network.json │ │ ├── with-scarb-custom-cli/ │ │ │ ├── check.ts │ │ │ ├── hardhat.config.ts │ │ │ └── network.json │ │ ├── with-scarb-custom-invalid-cairo/ │ │ │ ├── check.ts │ │ │ ├── hardhat.config.ts │ │ │ ├── multiple_contracts_invalid.cairo │ │ │ └── network.json │ │ ├── with-scarb-custom-invalid-config/ │ │ │ ├── Scarb-invalid.toml │ │ │ ├── check.ts │ │ │ ├── hardhat.config.ts │ │ │ └── network.json │ │ ├── with-scarb-custom-multiple-projects/ │ │ │ ├── check.ts │ │ │ ├── hardhat.config.ts │ │ │ └── network.json │ │ ├── with-scarb-dockerized/ │ │ │ ├── check.ts │ │ │ ├── hardhat.config.ts │ │ │ └── network.json │ │ └── with-sources-path/ │ │ ├── check.ts │ │ ├── hardhat.config.ts │ │ └── network.json │ ├── constants/ │ │ └── constants.ts │ ├── general-tests/ │ │ ├── account-test/ │ │ │ ├── check.ts │ │ │ ├── hardhat.config.ts │ │ │ └── network.json │ │ ├── amarna/ │ │ │ ├── check.ts │ │ │ ├── hardhat.config.ts │ │ │ └── network.json │ │ ├── cairo0-constructor-test/ │ │ │ ├── check.ts │ │ │ ├── hardhat.config.ts │ │ │ └── network.json │ │ ├── contract-test/ │ │ │ ├── check.ts │ │ │ ├── hardhat.config.ts │ │ │ └── network.json │ │ ├── declare-test/ │ │ │ ├── check.ts │ │ │ ├── hardhat.config.ts │ │ │ └── network.json │ │ ├── declare-v2-test/ │ │ │ ├── check.ts │ │ │ ├── hardhat.config.ts │ │ │ └── network.json │ │ ├── decode-event-test/ │ │ │ ├── check.ts │ │ │ ├── hardhat.config.ts │ │ │ └── network.json │ │ ├── decode-event-v2-test/ │ │ │ ├── check.ts │ │ │ ├── hardhat.config.ts │ │ │ └── network.json │ │ ├── devnet-block-time/ │ │ │ ├── check.ts │ │ │ ├── hardhat.config.ts │ │ │ └── network.json │ │ ├── devnet-create-block/ │ │ │ ├── check.ts │ │ │ ├── hardhat.config.ts │ │ │ └── network.json │ │ ├── devnet-dump-and-load/ │ │ │ ├── check.ts │ │ │ ├── hardhat.config.ts │ │ │ └── network.json │ │ ├── devnet-mint/ │ │ │ ├── check.ts │ │ │ ├── hardhat.config.ts │ │ │ └── network.json │ │ ├── devnet-restart/ │ │ │ ├── check.ts │ │ │ ├── hardhat.config.ts │ │ │ └── network.json │ │ ├── expect-error-on-compile/ │ │ │ ├── check.ts │ │ │ ├── hardhat.config.ts │ │ │ ├── invalid_contract.cairo │ │ │ └── network.json │ │ ├── function-argument-number/ │ │ │ ├── check.ts │ │ │ ├── hardhat.config.ts │ │ │ └── network.json │ │ ├── getBalance/ │ │ │ ├── check.ts │ │ │ ├── hardhat.config.ts │ │ │ └── network.json │ │ ├── getContractFactory/ │ │ │ ├── check.ts │ │ │ ├── hardhat.config.ts │ │ │ └── network.json │ │ ├── hardhat-run/ │ │ │ ├── check.ts │ │ │ ├── hardhat.config.ts │ │ │ └── network.json │ │ ├── plain/ │ │ │ ├── check.ts │ │ │ ├── hardhat.config.ts │ │ │ └── network.json │ │ ├── postman/ │ │ │ ├── check.ts │ │ │ ├── hardhat.config.ts │ │ │ └── network.json │ │ ├── predeployed-accounts-test/ │ │ │ ├── check.ts │ │ │ ├── hardhat.config.ts │ │ │ └── network.json │ │ ├── proxy-call/ │ │ │ ├── check.ts │ │ │ ├── hardhat.config.ts │ │ │ └── network.json │ │ ├── relative-artifact-test/ │ │ │ ├── check.ts │ │ │ ├── hardhat.config.ts │ │ │ └── network.json │ │ ├── short-string-test/ │ │ │ ├── check.ts │ │ │ ├── hardhat.config.ts │ │ │ ├── network.json │ │ │ └── short-string-test.ts │ │ ├── starknet-plugin-version/ │ │ │ ├── check.ts │ │ │ ├── hardhat.config.ts │ │ │ └── network.json │ │ ├── starknet-verify/ │ │ │ ├── check.ts │ │ │ ├── hardhat.config.ts │ │ │ └── network.json │ │ └── transaction-trace/ │ │ ├── check.ts │ │ ├── hardhat.config.ts │ │ └── network.json │ ├── integrated-devnet-tests/ │ │ ├── predeployed-accounts-test/ │ │ │ ├── check.ts │ │ │ ├── hardhat.config.ts │ │ │ └── network.json │ │ ├── with-active-venv/ │ │ │ ├── check.ts │ │ │ ├── hardhat.config.ts │ │ │ └── network.json │ │ ├── with-active-venv-args/ │ │ │ ├── check.ts │ │ │ ├── hardhat.config.ts │ │ │ └── network.json │ │ ├── with-default/ │ │ │ ├── check.ts │ │ │ ├── hardhat.config.ts │ │ │ └── network.json │ │ ├── with-docker/ │ │ │ ├── check.ts │ │ │ ├── hardhat.config.ts │ │ │ └── network.json │ │ ├── with-docker-address-occupied/ │ │ │ ├── check.ts │ │ │ ├── hardhat.config.ts │ │ │ └── network.json │ │ ├── with-docker-args/ │ │ │ ├── check.ts │ │ │ ├── hardhat.config.ts │ │ │ └── network.json │ │ ├── with-docker-full-image/ │ │ │ ├── check.ts │ │ │ ├── hardhat.config.ts │ │ │ └── network.json │ │ ├── with-docker-vmlang-rust/ │ │ │ ├── check.ts │ │ │ ├── hardhat.config.ts │ │ │ └── network.json │ │ ├── with-docker-wrong-cli/ │ │ │ ├── check.ts │ │ │ ├── hardhat.config.ts │ │ │ └── network.json │ │ ├── with-stderr-to-STDERR/ │ │ │ ├── check.ts │ │ │ ├── hardhat.config.ts │ │ │ └── network.json │ │ ├── with-stderr-to-STDOUT/ │ │ │ ├── check.ts │ │ │ ├── hardhat.config.ts │ │ │ └── network.json │ │ ├── with-stderr-to-file/ │ │ │ ├── check.ts │ │ │ ├── hardhat.config.ts │ │ │ └── network.json │ │ ├── with-venv/ │ │ │ ├── check.ts │ │ │ ├── hardhat.config.ts │ │ │ └── network.json │ │ ├── with-venv-address-occupied/ │ │ │ ├── check.ts │ │ │ ├── hardhat.config.ts │ │ │ └── network.json │ │ └── with-venv-wrong-cli/ │ │ ├── check.ts │ │ ├── hardhat.config.ts │ │ └── network.json │ ├── network.schema │ ├── recompilation-tests/ │ │ ├── hardhat-run/ │ │ │ ├── check.ts │ │ │ ├── hardhat.config.ts │ │ │ └── network.json │ │ ├── hardhat-test/ │ │ │ ├── check.ts │ │ │ ├── contract_test_cache.cairo │ │ │ ├── contract_test_cache_no_dependency.cairo │ │ │ ├── dependency.cairo │ │ │ ├── get_balance.cairo │ │ │ ├── hardhat.config.ts │ │ │ └── network.json │ │ ├── recompiler-default/ │ │ │ ├── check.ts │ │ │ ├── hardhat.config.ts │ │ │ └── network.json │ │ └── recompiler-off/ │ │ ├── check.ts │ │ ├── hardhat.config.ts │ │ └── network.json │ ├── utils/ │ │ ├── cli-functions.ts │ │ ├── scarb-utils.ts │ │ └── utils.ts │ └── venv-tests/ │ ├── with-venv/ │ │ ├── check.ts │ │ ├── hardhat.config.ts │ │ └── network.json │ └── with-venv-active/ │ ├── check.ts │ ├── hardhat.config.ts │ └── network.json ├── tsconfig.json └── www/ ├── .gitignore ├── README.md ├── babel.config.js ├── blog/ │ └── authors.yml ├── docs/ │ ├── dev.md │ └── intro.md ├── docusaurus.config.js ├── package.json ├── sidebars.js ├── src/ │ ├── components/ │ │ └── HomepageFeatures/ │ │ ├── index.js │ │ └── styles.module.css │ ├── css/ │ │ └── custom.css │ └── pages/ │ ├── index.js │ ├── index.module.css │ └── markdown-page.md └── static/ └── .nojekyll ================================================ FILE CONTENTS ================================================ ================================================ FILE: .circleci/config.yml ================================================ version: 2.1 executors: linux-node: machine: image: ubuntu-2004:2022.10.1 macos-node: macos: xcode: 14.2.0 resource_class: macos.m1.large.gen1 environment: TERM: xterm-256color # Aliases - encapsulation of lengthy logic # # `restore_*` aliases refer to downloading the saved cache of their respective key, if it exists # i.e - `restore_macos_brew_cache` will try to download the cache that holds the data installed after running `brew install gmp` # # `save_*` aliases refer to saving the installation data to cache # i.e - `save_macos_brew_cache` will save the result of installing gmp with the command `brew install gmp` # # Available caches: # # `brew-gmp-cache` is used to save/restore cache of the gmp package installation on macos # # `venv_cache` is used to save/restore cache of the venv tests, which use starknet commands installed in the virtual environment `my-venv` # # `cairo_cache` is used to save/restore cache of the cairo-lang package, which uses starknet commands installed in the local bin folder # # `devnet_cache` is used to save/restore cache of starknet-devnet, including all its dependencies # # # key format: {cache name}-{key version}-{executor architecture}-{checksum of the dependency version} # Where: # {cache name} is a descriptive name for the cache we're saving, as described above (`brew-gmp-cache`, `venv-cache`, etc); # {key version} is the version of the cache configuration, i.e, if a change needs to be done to the paths for example, this version should be upped so a new key is generated for it; # {executor architecture} is the identifier for the architecture of each executor, which is generated by the {{ arch }} template; # {checksum of the dependency version} is the checksum generated with the template {{ checksum "PATH/TO/FILE" }}, where the file contains the latest version of the dependency ; # Exception is "brew-gmp-cache", which we do not need to verify the checksum # aliases: - &restore_macos_brew_cache # Try to restore only if the executor is a macos one # - when: condition: and: - equal: [macos-node, << parameters.platform >>] steps: - restore_cache: name: "Restore venv Cache" key: brew-gmp-cache-v1-{{ arch }} - &save_macos_brew_cache # Save only if the executor is a macos one # - when: condition: and: - equal: [macos-node, << parameters.platform >>] steps: - save_cache: name: "Save brew-gmp Cache" key: brew-gmp-cache-v1-{{ arch }} paths: - /usr/local/Cellar/gmp - /usr/local/include - /usr/local/lib/libgmp.10.dylib - /usr/local/lib/libgmp.a - /usr/local/lib/libgmp.dylib - /usr/local/lib/libgmpxx.4.dylib - /usr/local/lib/libgmpxx.a - /usr/local/lib/libgmpxx.dylib - &restore_venv_cache # Try to restore only if the test name is "test-venv-tests" # - when: condition: and: - equal: [test-venv-tests, << parameters.test-name >>] steps: - restore_cache: name: "Restore venv Cache" key: venv-cache-{{ arch }}-v1-{{ checksum "/tmp/cairo-lang-version" }} - &save_venv_cache # Save only if the test name is "test-venv-tests" # - when: condition: and: - equal: [test-venv-tests, << parameters.test-name >>] steps: - save_cache: name: "Save venv Cache" key: venv-cache-{{ arch }}-v1-{{ checksum "/tmp/cairo-lang-version" }} paths: - /Users/distiller/project/my-venv - /home/circleci/project/my-venv - &restore_cairo_cache # Try to restore only if the test name is not "test-venv-tests" # - when: condition: and: - not: equal: [test-venv-tests, << parameters.test-name >>] steps: - restore_cache: name: "Restore cairo-lang Cache" key: cairo-lang-cache-{{ arch }}-v1-{{ checksum "/tmp/cairo-lang-version" }} - &save_cairo_cache # Try to save only if the test name is not "test-venv-tests" # - when: condition: and: - not: equal: [test-venv-tests, << parameters.test-name >>] steps: - save_cache: name: "Save cairo-lang Cache" key: cairo-lang-cache-{{ arch }}-v1-{{ checksum "/tmp/cairo-lang-version" }} paths: - /usr/python3.9/dist-packages/cairo-lang - /usr/local/bin/starknet - /usr/local/bin/starknet-compile - &restore_devnet_cache - restore_cache: name: "Restore devnet Cache" key: devnet-cache-{{ arch }}-v1-{{ checksum "/tmp/devnet-version" }} - &save_devnet_cache - save_cache: name: "Save devnet Cache" key: devnet-cache-{{ arch }}-v1-{{ checksum "/tmp/devnet-version" }} paths: - /opt/circleci/.pyenv/versions - /opt/circleci/.pyenv/shims/starknet-devnet - /usr/local/bin/starknet-devnet - /usr/local/lib/python3.9/site-packages # Commands # fetch_dependecies_version - retrieves the latest version of the dependencies (starknet-devnet and cairo-lang). # These are saved to different files, from which we verify the checksum to check for any needed updates, and create caches with new keys # # restore_dependency_cache - download dependencies from cache. It calls the `restore_*` aliases defined above for each dependecy. # # save_dependency_cache - save the dependencies in cache. It calls the `save_*` aliases defined above for each dependecy. commands: fetch_dependecies_version: description: "Fetch the dependencies version" steps: - run: name: "Load config enviroment variables at runtime" command: | for key in $(jq -r 'keys[]' config.json); do echo $key=$(jq -r .[\""$key"\"] config.json) >> $BASH_ENV done cat $BASH_ENV - run: name: "Fetch Devnet version" command: echo "$STARKNET_DEVNET" > /tmp/devnet-version - run: name: "Set cairo-lang version" command: echo "$CAIRO_LANG"> /tmp/cairo-lang-version restore_dependency_cache: parameters: platform: type: string test-name: type: string description: "Restore the dependencies from cache" steps: - <<: *restore_macos_brew_cache - <<: *restore_cairo_cache - <<: *restore_venv_cache - <<: *restore_devnet_cache save_dependency_cache: parameters: platform: type: string test-name: type: string description: "Save the dependencies to cache" steps: - <<: *save_macos_brew_cache - <<: *save_cairo_cache - <<: *save_venv_cache - <<: *save_devnet_cache jobs: test: parameters: platform: type: string test-name: type: string executor: << parameters.platform >> steps: - checkout # If on a Linux executor, add permissions for user to be able to write to "/usr/local/bin", so that we're able to download cache that will be in that folder - when: condition: and: - equal: [linux-node, << parameters.platform >>] steps: - run: name: Add file permissions command: sudo chown -R circleci /usr/local/bin # Retrieve the latest versions of the dependencies - fetch_dependecies_version # Call Command: restore_dependency_cache - restore the dependencies that were saved in cache. The parameters are passed because some caches depend on the executor and test # - restore_dependency_cache: platform: << parameters.platform >> test-name: << parameters.test-name >> - run: name: Install command: npm install - run: name: Lint command: npm run lint - run: name: Build command: npm run build - run: name: << parameters.test-name >> command: npm run << parameters.test-name >> no_output_timeout: 15m # Call Command: save_dependency_cache - save dependencies that were installed during the job run. The parameters are passed because some caches depend on the executor and test # - save_dependency_cache: platform: << parameters.platform >> test-name: << parameters.test-name >> npm_publish: executor: linux-node steps: - checkout - run: name: Publish command: ./scripts/npm-publish.sh workflows: test_and_publish: jobs: - test: matrix: parameters: platform: [linux-node, macos-node] test-name: [ test-general-tests, test-configuration-tests, test-venv-tests, test-integrated-devnet-tests, test-recompilation-tests ] exclude: - platform: macos-node test-name: test-general-tests - platform: macos-node test-name: test-configuration-tests - platform: macos-node test-name: test-integrated-devnet-tests - platform: macos-node test-name: test-recompilation-tests context: spaceshard - npm_publish: context: spaceshard filters: branches: only: - master requires: - test ================================================ FILE: .eslintrc.json ================================================ { "env": { "es2021": true, "node": true }, "extends": ["eslint:recommended", "plugin:@typescript-eslint/recommended"], "parser": "@typescript-eslint/parser", "parserOptions": { "ecmaVersion": "latest", "sourceType": "module" }, "plugins": ["@typescript-eslint"], "rules": { "array-bracket-spacing": ["error", "never"], "block-spacing": ["error", "always"], "brace-style": ["error", "1tbs"], "comma-dangle": ["error", "never"], "comma-spacing": [ "error", { "before": false, "after": true } ], "eol-last": ["error", "always"], "keyword-spacing": [ "error", { "overrides": { "this": { "before": false, "after": false } }, "before": true, "after": true } ], "key-spacing": [ "error", { "beforeColon": false, "afterColon": true } ], "linebreak-style": ["error", "unix"], "no-trailing-spaces": ["error"], "no-var": ["error"], "no-warning-comments": ["error"], "object-curly-spacing": ["error", "always"], "quotes": ["error", "double"], "semi": ["error", "always"], "semi-spacing": [ "error", { "before": false, "after": true } ], "space-before-blocks": ["error", "always"], "space-in-parens": ["error", "never"], "switch-colon-spacing": [ "error", { "before": false, "after": true } ], "template-curly-spacing": ["error", "never"], "@typescript-eslint/no-unused-vars": ["error", { "argsIgnorePattern": "^_" }], "@typescript-eslint/no-empty-interface": [ "error", { "allowSingleExtends": true } ] } } ================================================ FILE: .github/ISSUE_TEMPLATE/bug_report.md ================================================ --- name: Bug report about: Create a report to help us improve title: "" labels: "" assignees: "" --- **Describe the bug (observed vs expected behavior)** A clear and concise description of what the bug is. If applicable, add screenshots, but prefer providing copyable text. **Hardhat config file** Paste your hardhat.config.ts or hardhat.config.js. **To Reproduce** Steps to reproduce the behavior: 1. ... 2. ... **Plugin version** Please provide the results of these commands on your system: | Command | Version | | ------------------------------------- | ---------- | | `npx hardhat starknet-plugin-version` | your value | | `npx hardhat --version` | your value | | `npm --version` | your value | | `node --version` | your value | **System specifications** - OS: ================================================ FILE: .github/pull_request_template.md ================================================ ## Usage related changes - Change x. - ... ## Development related changes - Change y. - ... ## Checklist: - [ ] Formatted the code - [ ] No linter errors + tried to avoid introducing linter warnings - [ ] Performed a self-review of the code - [ ] Rebased to the last commit of the target branch (or merged it into my branch) - [ ] Documented the changes - [ ] Updated the `test` directory (with a test case consisting of `network.json`, `hardhat.config.ts`, `check.ts`) - [ ] Linked issues which this PR resolves - [ ] Created a PR to the `plugin` branch of [`starknet-hardhat-example`](https://github.com/0xSpaceShard/starknet-hardhat-example): - < EXAMPLE_REPO_PR_URL > - [ ] Modified `test.sh` to use my example repo branch - [ ] Restored `test.sh` to to use the original branch (after the example repo PR has been merged) - [ ] All tests are passing (for external contributors who don't have access to the CI/CD pipeline) ================================================ FILE: .gitignore ================================================ dist node_modules starknet-hardhat-example starknet-hardhat-example-link cache .vscode my-venv cairo/ ================================================ FILE: .prettierrc ================================================ { "printWidth": 100, "tabWidth": 4, "trailingComma": "none" } ================================================ FILE: LICENSE ================================================ MIT License Copyright (c) 2023 SpaceShard Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ================================================ FILE: README.md ================================================

Hardhat Plugin

Starknet Hardhat Plugin

[![npm package](https://img.shields.io/npm/v/@shardlabs/starknet-hardhat-plugin?color=blue)](https://www.npmjs.com/package/@shardlabs/starknet-hardhat-plugin) If you've used Hardhat 👷‍♀️👷‍♂️ and want to develop for Starknet starknet, this plugin might come in hand. If you've never set up a Hardhat project, check out [this guide](https://hardhat.org/tutorial/creating-a-new-hardhat-project.html). ## Starknet Devnet JS You might be more interested in a better-maintained repository that provides Starknet Devnet interaction. Check out [starknet-devnet.js](https://github.com/0xspaceShard/starknet-devnet-js). ## 🌐 Docs On the following links you can find the documentation of: - [the latest official release](https://0xspaceshard.github.io/starknet-hardhat-plugin/) - [the latest master commit (not officially released)](https://github.com/0xSpaceShard/starknet-hardhat-plugin/tree/master/www/docs/intro.md) ## ✏️ Contributing We ❤️ and encourage all contributions! [Click here](https://0xspaceshard.github.io/starknet-hardhat-plugin/docs/dev) for the development guide. Special thanks 🙌 to all the [contributors](https://github.com/0xSpaceShard/starknet-hardhat-plugin/graphs/contributors)! ================================================ FILE: config.json ================================================ { "CAIRO_LANG": "0.11.2", "STARKNET_DEVNET": "0.6.3", "CAIRO_COMPILER": "2.2.0", "SCARB_VERSION": "0.7.0" } ================================================ FILE: contract-artifacts/ArgentAccount/780760e4156afe592bb1feff7e769cf279ae9831/ArgentAccount.cairo/ArgentAccount.json ================================================ {"abi":[{"members":[{"name":"to","offset":0,"type":"felt"},{"name":"selector","offset":1,"type":"felt"},{"name":"data_offset","offset":2,"type":"felt"},{"name":"data_len","offset":3,"type":"felt"}],"name":"CallArray","size":4,"type":"struct"},{"data":[{"name":"new_signer","type":"felt"}],"keys":[],"name":"signer_changed","type":"event"},{"data":[{"name":"new_guardian","type":"felt"}],"keys":[],"name":"guardian_changed","type":"event"},{"data":[{"name":"new_guardian","type":"felt"}],"keys":[],"name":"guardian_backup_changed","type":"event"},{"data":[{"name":"active_at","type":"felt"}],"keys":[],"name":"escape_guardian_triggered","type":"event"},{"data":[{"name":"active_at","type":"felt"}],"keys":[],"name":"escape_signer_triggered","type":"event"},{"data":[],"keys":[],"name":"escape_canceled","type":"event"},{"data":[{"name":"new_guardian","type":"felt"}],"keys":[],"name":"guardian_escaped","type":"event"},{"data":[{"name":"new_signer","type":"felt"}],"keys":[],"name":"signer_escaped","type":"event"},{"data":[{"name":"new_implementation","type":"felt"}],"keys":[],"name":"account_upgraded","type":"event"},{"data":[{"name":"account","type":"felt"},{"name":"key","type":"felt"},{"name":"guardian","type":"felt"}],"keys":[],"name":"account_created","type":"event"},{"data":[{"name":"hash","type":"felt"},{"name":"response_len","type":"felt"},{"name":"response","type":"felt*"}],"keys":[],"name":"transaction_executed","type":"event"},{"inputs":[{"name":"call_array_len","type":"felt"},{"name":"call_array","type":"CallArray*"},{"name":"calldata_len","type":"felt"},{"name":"calldata","type":"felt*"}],"name":"__validate__","outputs":[],"type":"function"},{"inputs":[{"name":"call_array_len","type":"felt"},{"name":"call_array","type":"CallArray*"},{"name":"calldata_len","type":"felt"},{"name":"calldata","type":"felt*"}],"name":"__execute__","outputs":[{"name":"retdata_size","type":"felt"},{"name":"retdata","type":"felt*"}],"type":"function"},{"inputs":[{"name":"class_hash","type":"felt"}],"name":"__validate_declare__","outputs":[],"type":"function"},{"inputs":[{"name":"selector","type":"felt"},{"name":"calldata_size","type":"felt"},{"name":"calldata","type":"felt*"}],"name":"__validate_deploy__","outputs":[],"type":"function"},{"inputs":[{"name":"hash","type":"felt"},{"name":"sig_len","type":"felt"},{"name":"sig","type":"felt*"}],"name":"isValidSignature","outputs":[{"name":"isValid","type":"felt"}],"stateMutability":"view","type":"function"},{"inputs":[{"name":"interfaceId","type":"felt"}],"name":"supportsInterface","outputs":[{"name":"success","type":"felt"}],"stateMutability":"view","type":"function"},{"inputs":[{"name":"signer","type":"felt"},{"name":"guardian","type":"felt"}],"name":"initialize","outputs":[],"type":"function"},{"inputs":[{"name":"implementation","type":"felt"},{"name":"calldata_len","type":"felt"},{"name":"calldata","type":"felt*"}],"name":"upgrade","outputs":[{"name":"retdata_len","type":"felt"},{"name":"retdata","type":"felt*"}],"type":"function"},{"inputs":[{"name":"call_array_len","type":"felt"},{"name":"call_array","type":"CallArray*"},{"name":"calldata_len","type":"felt"},{"name":"calldata","type":"felt*"}],"name":"execute_after_upgrade","outputs":[{"name":"retdata_len","type":"felt"},{"name":"retdata","type":"felt*"}],"type":"function"},{"inputs":[{"name":"newSigner","type":"felt"}],"name":"changeSigner","outputs":[],"type":"function"},{"inputs":[{"name":"newGuardian","type":"felt"}],"name":"changeGuardian","outputs":[],"type":"function"},{"inputs":[{"name":"newGuardian","type":"felt"}],"name":"changeGuardianBackup","outputs":[],"type":"function"},{"inputs":[],"name":"triggerEscapeGuardian","outputs":[],"type":"function"},{"inputs":[],"name":"triggerEscapeSigner","outputs":[],"type":"function"},{"inputs":[],"name":"cancelEscape","outputs":[],"type":"function"},{"inputs":[{"name":"newGuardian","type":"felt"}],"name":"escapeGuardian","outputs":[],"type":"function"},{"inputs":[{"name":"newSigner","type":"felt"}],"name":"escapeSigner","outputs":[],"type":"function"},{"inputs":[],"name":"getSigner","outputs":[{"name":"signer","type":"felt"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getGuardian","outputs":[{"name":"guardian","type":"felt"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getGuardianBackup","outputs":[{"name":"guardianBackup","type":"felt"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getEscape","outputs":[{"name":"activeAt","type":"felt"},{"name":"type","type":"felt"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getVersion","outputs":[{"name":"version","type":"felt"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getName","outputs":[{"name":"name","type":"felt"}],"stateMutability":"view","type":"function"},{"inputs":[{"name":"hash","type":"felt"},{"name":"sig_len","type":"felt"},{"name":"sig","type":"felt*"}],"name":"is_valid_signature","outputs":[{"name":"is_valid","type":"felt"}],"stateMutability":"view","type":"function"}],"entry_points_by_type":{"CONSTRUCTOR":[],"EXTERNAL":[{"offset":"0x762","selector":"0x529b7e53729fd0ea35e794b8f3422ac7e09c3b6e32dd6565505467c2500ea4"},{"offset":"0x715","selector":"0x62cde820fb315bb2444ca8828f417996d4c4183014d10d9f512ca11e741509"},{"offset":"0x64f","selector":"0x79dc0da7c54b95f10aa182ad0a46400db63156920adb65eca2654c0945a463"},{"offset":"0x874","selector":"0x9278fa5f64a571de10741418f1c4c0c4322aef645dd9d94a429c1f3e99a8a5"},{"offset":"0x695","selector":"0xf2f7c15cbe06c8d94597cd91fd7f3369eae842359235712def5584f8d270cd"},{"offset":"0x778","selector":"0xf983a425403fd146fdc6a964bc73affdd6845f35011c87a723931c628394ec"},{"offset":"0x7a5","selector":"0x121140442dcb4325a0a2c033703ba3718931ad18fde8114ac75b012d55534d1"},{"offset":"0x559","selector":"0x15d40a3d6ca2ac30f4031e42be28da9b056fef9bb7357ac5e85627ee876e5ad"},{"offset":"0x50e","selector":"0x162da33a4585851fe8d3af3c2a9c60b557814e221e0d4f30ff0b2189d9c7775"},{"offset":"0x6e2","selector":"0x1a1e41f464a235695e5050a846a26ca22ecc27acac54be5f6666848031efb8f"},{"offset":"0x83f","selector":"0x1edd8158d47d62424f3501d1f27566195850a3255ce93e89956b01f6982765c"},{"offset":"0x5f9","selector":"0x213dfe25e2ca309c4d615a09cfc95fdb2fc7dc73fbcad12c450fe93b1f2ff9e"},{"offset":"0x7e1","selector":"0x239e10ae97b247b05959d468aa46c8d2a3ecdc7802dcf7ba10b891b9c08a372"},{"offset":"0x894","selector":"0x28420862938116cb3bbdbedee07451ccc54d4e9412dbef71142ad1980a30941"},{"offset":"0x59f","selector":"0x289da278a8dc833409cabfdad1581e8e7d40e42dcaed693fa4008dcdb4963b3"},{"offset":"0x627","selector":"0x29e211664c0b63c79638fbea474206ca74016b3e9a3dc4f9ac300ffd8bdf2cd"},{"offset":"0x85b","selector":"0x2aa20ff86b29546fd697eb81064769cf566031d56b10b8bba2c70125bd8403a"},{"offset":"0x72f","selector":"0x2dd8cf34d192b6c4448f9717eac28668efac0bff6733c9b9f8f62156cbb061e"},{"offset":"0x800","selector":"0x2ff51bcdcbd41bef2550e0f8a9d9dd79e4f98dbcb549b95c37063306f3609f0"},{"offset":"0x78e","selector":"0x31192dded6b74f2dc49269501217664c259d80f2f536d3e28db0ba7bec552cf"},{"offset":"0x7bf","selector":"0x337911595c795dcc8a63e228cae2dd2c63849ad8827172108bb7212a3e323ef"},{"offset":"0x81f","selector":"0x33af5ebe001ea89636c2da77a3c8294c282b0d378d72b1a4a4c25b675ae2310"},{"offset":"0x749","selector":"0x35de51632091a69425f5316febbc814cde19717d4d00a48c1e4aa92ccaf0bf0"},{"offset":"0x5d3","selector":"0x36fcbf06cd96843058359e1a75928beacfac10727dab22a3972f0af8aa92895"}],"L1_HANDLER":[]},"program":{"attributes":[{"accessible_scopes":["contracts.utils.calls","contracts.utils.calls.execute_calls"],"end_pc":177,"flow_tracking_data":{"ap_tracking":{"group":19,"offset":3},"reference_ids":{"contracts.utils.calls.execute_calls.index":13}},"name":"error_message","start_pc":167,"value":"multicall {index} failed"},{"accessible_scopes":["contracts.account.library","contracts.account.library.assert_only_self"],"end_pc":578,"flow_tracking_data":{"ap_tracking":{"group":47,"offset":12},"reference_ids":{}},"name":"error_message","start_pc":577,"value":"argent: only self"},{"accessible_scopes":["contracts.account.library","contracts.account.library.assert_initialized"],"end_pc":587,"flow_tracking_data":{"ap_tracking":{"group":48,"offset":23},"reference_ids":{}},"name":"error_message","start_pc":585,"value":"argent: account not initialized"},{"accessible_scopes":["contracts.account.library","contracts.account.library.assert_non_reentrant"],"end_pc":596,"flow_tracking_data":{"ap_tracking":{"group":49,"offset":6},"reference_ids":{}},"name":"error_message","start_pc":594,"value":"argent: no reentrant call"},{"accessible_scopes":["contracts.account.library","contracts.account.library.assert_correct_tx_version"],"end_pc":605,"flow_tracking_data":{"ap_tracking":{"group":50,"offset":0},"reference_ids":{}},"name":"error_message","start_pc":598,"value":"argent: invalid tx version"},{"accessible_scopes":["contracts.account.library","contracts.account.library.assert_guardian_set"],"end_pc":614,"flow_tracking_data":{"ap_tracking":{"group":51,"offset":23},"reference_ids":{}},"name":"error_message","start_pc":612,"value":"argent: guardian required"},{"accessible_scopes":["contracts.account.library","contracts.account.library.ArgentModel","contracts.account.library.ArgentModel.initialize"],"end_pc":640,"flow_tracking_data":{"ap_tracking":{"group":54,"offset":23},"reference_ids":{}},"name":"error_message","start_pc":638,"value":"argent: already initialized"},{"accessible_scopes":["contracts.account.library","contracts.account.library.ArgentModel","contracts.account.library.ArgentModel.initialize"],"end_pc":643,"flow_tracking_data":{"ap_tracking":{"group":54,"offset":23},"reference_ids":{}},"name":"error_message","start_pc":640,"value":"argent: signer cannot be null"},{"accessible_scopes":["contracts.account.library","contracts.account.library.ArgentModel","contracts.account.library.ArgentModel.upgrade"],"end_pc":675,"flow_tracking_data":{"ap_tracking":{"group":55,"offset":16},"reference_ids":{}},"name":"error_message","start_pc":656,"value":"argent: invalid implementation"},{"accessible_scopes":["contracts.account.library","contracts.account.library.ArgentModel","contracts.account.library.ArgentModel.change_signer"],"end_pc":696,"flow_tracking_data":{"ap_tracking":{"group":56,"offset":16},"reference_ids":{}},"name":"error_message","start_pc":693,"value":"argent: signer cannot be null"},{"accessible_scopes":["contracts.account.library","contracts.account.library.ArgentModel","contracts.account.library.ArgentModel.change_guardian"],"end_pc":724,"flow_tracking_data":{"ap_tracking":{"group":57,"offset":38},"reference_ids":{}},"name":"error_message","start_pc":722,"value":"argent: new guardian invalid"},{"accessible_scopes":["contracts.account.library","contracts.account.library.ArgentModel","contracts.account.library.ArgentModel.trigger_escape_signer"],"end_pc":801,"flow_tracking_data":{"ap_tracking":{"group":60,"offset":76},"reference_ids":{}},"name":"error_message","start_pc":796,"value":"argent: cannot override escape"},{"accessible_scopes":["contracts.account.library","contracts.account.library.ArgentModel","contracts.account.library.ArgentModel.cancel_escape"],"end_pc":833,"flow_tracking_data":{"ap_tracking":{"group":61,"offset":46},"reference_ids":{}},"name":"error_message","start_pc":830,"value":"argent: no active escape"},{"accessible_scopes":["contracts.account.library","contracts.account.library.ArgentModel","contracts.account.library.ArgentModel.escape_guardian"],"end_pc":867,"flow_tracking_data":{"ap_tracking":{"group":62,"offset":82},"reference_ids":{}},"name":"error_message","start_pc":864,"value":"argent: not escaping"},{"accessible_scopes":["contracts.account.library","contracts.account.library.ArgentModel","contracts.account.library.ArgentModel.escape_guardian"],"end_pc":872,"flow_tracking_data":{"ap_tracking":{"group":62,"offset":85},"reference_ids":{}},"name":"error_message","start_pc":867,"value":"argent: escape not active"},{"accessible_scopes":["contracts.account.library","contracts.account.library.ArgentModel","contracts.account.library.ArgentModel.escape_guardian"],"end_pc":874,"flow_tracking_data":{"ap_tracking":{"group":62,"offset":95},"reference_ids":{}},"name":"error_message","start_pc":872,"value":"argent: escape type invalid"},{"accessible_scopes":["contracts.account.library","contracts.account.library.ArgentModel","contracts.account.library.ArgentModel.escape_signer"],"end_pc":918,"flow_tracking_data":{"ap_tracking":{"group":63,"offset":82},"reference_ids":{}},"name":"error_message","start_pc":915,"value":"argent: not escaping"},{"accessible_scopes":["contracts.account.library","contracts.account.library.ArgentModel","contracts.account.library.ArgentModel.escape_signer"],"end_pc":923,"flow_tracking_data":{"ap_tracking":{"group":63,"offset":85},"reference_ids":{}},"name":"error_message","start_pc":918,"value":"argent: escape not active"},{"accessible_scopes":["contracts.account.library","contracts.account.library.ArgentModel","contracts.account.library.ArgentModel.escape_signer"],"end_pc":925,"flow_tracking_data":{"ap_tracking":{"group":63,"offset":95},"reference_ids":{}},"name":"error_message","start_pc":923,"value":"argent: escape type invalid"},{"accessible_scopes":["contracts.account.library","contracts.account.library.ArgentModel","contracts.account.library.ArgentModel.validate_signer_signature"],"end_pc":1058,"flow_tracking_data":{"ap_tracking":{"group":72,"offset":0},"reference_ids":{}},"name":"error_message","start_pc":1041,"value":"argent: signer signature invalid"},{"accessible_scopes":["contracts.account.library","contracts.account.library.ArgentModel","contracts.account.library.ArgentModel.validate_guardian_signature"],"end_pc":1092,"flow_tracking_data":{"ap_tracking":{"group":73,"offset":24},"reference_ids":{}},"name":"error_message","start_pc":1085,"value":"argent: guardian signature invalid"},{"accessible_scopes":["contracts.account.library","contracts.account.library.ArgentModel","contracts.account.library.ArgentModel.validate_guardian_signature"],"end_pc":1111,"flow_tracking_data":{"ap_tracking":{"group":73,"offset":47},"reference_ids":{}},"name":"error_message","start_pc":1104,"value":"argent: signature format invalid"},{"accessible_scopes":["contracts.account.library","contracts.account.library.ArgentModel","contracts.account.library.ArgentModel.validate_guardian_signature"],"end_pc":1118,"flow_tracking_data":{"ap_tracking":{"group":73,"offset":50},"reference_ids":{}},"name":"error_message","start_pc":1111,"value":"argent: guardian backup signature invalid"},{"accessible_scopes":["__main__","__main__","__main__.__validate__"],"end_pc":1260,"flow_tracking_data":{"ap_tracking":{"group":77,"offset":57},"reference_ids":{}},"name":"error_message","start_pc":1255,"value":"argent: forbidden call"}],"builtins":["pedersen","range_check","ecdsa"],"compiler_version":"0.10.2","data":["0x40780017fff7fff","0x1","0x208b7fff7fff7ffe","0x20780017fff7ffd","0x3","0x208b7fff7fff7ffe","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x480080007fff8000","0x400080007ffd7fff","0x482480017ffd8001","0x1","0x482480017ffd8001","0x1","0xa0680017fff7ffe","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffffb","0x402a7ffc7ffd7fff","0x208b7fff7fff7ffe","0x20780017fff7ffd","0x4","0x400780017fff7ffd","0x1","0x208b7fff7fff7ffe","0x400380007ffc7ffd","0x482680017ffc8000","0x1","0x208b7fff7fff7ffe","0x480a7ffb7fff8000","0x48297ffc80007ffd","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffffb","0x208b7fff7fff7ffe","0x480680017fff8000","0x43616c6c436f6e7472616374","0x400280007ff97fff","0x400380017ff97ffa","0x400380027ff97ffb","0x400380037ff97ffc","0x400380047ff97ffd","0x482680017ff98000","0x7","0x480280057ff98000","0x480280067ff98000","0x208b7fff7fff7ffe","0x480680017fff8000","0x4c69627261727943616c6c","0x400280007ff97fff","0x400380017ff97ffa","0x400380027ff97ffb","0x400380037ff97ffc","0x400380047ff97ffd","0x482680017ff98000","0x7","0x480280057ff98000","0x480280067ff98000","0x208b7fff7fff7ffe","0x480680017fff8000","0x47657443616c6c657241646472657373","0x400280007ffd7fff","0x482680017ffd8000","0x2","0x480280017ffd8000","0x208b7fff7fff7ffe","0x480680017fff8000","0x476574436f6e747261637441646472657373","0x400280007ffd7fff","0x482680017ffd8000","0x2","0x480280017ffd8000","0x208b7fff7fff7ffe","0x480680017fff8000","0x476574426c6f636b54696d657374616d70","0x400280007ffd7fff","0x482680017ffd8000","0x2","0x480280017ffd8000","0x208b7fff7fff7ffe","0x480680017fff8000","0x53746f7261676552656164","0x400280007ffc7fff","0x400380017ffc7ffd","0x482680017ffc8000","0x3","0x480280027ffc8000","0x208b7fff7fff7ffe","0x480680017fff8000","0x53746f726167655772697465","0x400280007ffb7fff","0x400380017ffb7ffc","0x400380027ffb7ffd","0x482680017ffb8000","0x3","0x208b7fff7fff7ffe","0x480680017fff8000","0x456d69744576656e74","0x400280007ff97fff","0x400380017ff97ffa","0x400380027ff97ffb","0x400380037ff97ffc","0x400380047ff97ffd","0x482680017ff98000","0x5","0x208b7fff7fff7ffe","0x480680017fff8000","0x4765745478496e666f","0x400280007ffd7fff","0x482680017ffd8000","0x2","0x480280017ffd8000","0x208b7fff7fff7ffe","0x20780017fff7ffa","0x4","0x480a7ff97fff8000","0x208b7fff7fff7ffe","0x480280007ffb8000","0x400280007ffd7fff","0x480280017ffb8000","0x400280017ffd7fff","0x480280037ffb8000","0x400280027ffd7fff","0x480280027ffb8000","0x48327fff7ffc8000","0x400280037ffd7fff","0x480a7ff97fff8000","0x482680017ffa8000","0x800000000000011000000000000000000000000000000000000000000000000","0x482680017ffb8000","0x4","0x480a7ffc7fff8000","0x482680017ffd8000","0x4","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffec","0x208b7fff7fff7ffe","0x40780017fff7fff","0x2","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff79","0x40137fff7fff8000","0x480a7ff97fff8000","0x480a7ffa7fff8000","0x480a7ffb7fff8000","0x480a7ffd7fff8000","0x480a80007fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffdf","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff6f","0x40137fff7fff8001","0x48127ffc7fff8000","0x480a7ffa7fff8000","0x480a80007fff8000","0x480a80017fff8000","0x480680017fff8000","0x0","0x1104800180018000","0x4","0x480a80017fff8000","0x208b7fff7fff7ffe","0x40780017fff7fff","0x3","0x20780017fff7ffa","0x6","0x480a7ff97fff8000","0x480680017fff8000","0x0","0x208b7fff7fff7ffe","0x480a7ff97fff8000","0x480280007ffb8000","0x480280017ffb8000","0x480280027ffb8000","0x480280037ffb8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff75","0x40137ffe7fff8000","0x40137fff7fff8001","0x40137ffd7fff8002","0x480a7ffc7fff8000","0x480a80017fff8000","0x480a80007fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff50","0x480a80027fff8000","0x482680017ffa8000","0x800000000000011000000000000000000000000000000000000000000000000","0x482680017ffb8000","0x4","0x482a80007ffc8000","0x482680017ffd8000","0x1","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffe2","0x48127ffe7fff8000","0x482880007ffe8000","0x208b7fff7fff7ffe","0x400380017ff97ffa","0x400380007ff97ffb","0x482680017ff98000","0x2","0x208b7fff7fff7ffe","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x480680017fff8000","0xf920571b9f85bdd92a867cfdc73319d0f8836f0e69e06e4c5566b6203f75cc","0x208b7fff7fff7ffe","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffffa","0x480a7ffa7fff8000","0x48127ffe7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff82","0x48127ff67fff8000","0x48127ff67fff8000","0x208b7fff7fff7ffe","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff39","0x480a7ffa7fff8000","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffee","0x208b7fff7fff7ffe","0x40780017fff7fff","0x2","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff1c","0x40137fff7fff8000","0x480680017fff8000","0xb3dad08565eac3fa5d58691be077d428ef3156ff5407bd4bbee0ac68ab8f63","0x4002800080007fff","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff16","0x40137fff7fff8001","0x4003800080017ffd","0x4826800180018000","0x1","0x480a7ffb7fff8000","0x480680017fff8000","0x1","0x480a80007fff8000","0x4828800180007ffc","0x480a80017fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff67","0x480a7ffc7fff8000","0x208b7fff7fff7ffe","0x40780017fff7fff","0x2","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff04","0x40137fff7fff8000","0x480680017fff8000","0x23bad8d102433c088e9db7ed1c63d3c97cb2af1471606a71fbb60449e867f8f","0x4002800080007fff","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffefe","0x40137fff7fff8001","0x4003800080017ffd","0x4826800180018000","0x1","0x480a7ffb7fff8000","0x480680017fff8000","0x1","0x480a80007fff8000","0x4828800180007ffc","0x480a80017fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff4f","0x480a7ffc7fff8000","0x208b7fff7fff7ffe","0x40780017fff7fff","0x2","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffeec","0x40137fff7fff8000","0x480680017fff8000","0x107a2e2e5a8b6552e977246c45bfac446305174e86be2e5c74e8c0a20fd1de7","0x4002800080007fff","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffee6","0x40137fff7fff8001","0x4003800080017ffd","0x4826800180018000","0x1","0x480a7ffb7fff8000","0x480680017fff8000","0x1","0x480a80007fff8000","0x4828800180007ffc","0x480a80017fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff37","0x480a7ffc7fff8000","0x208b7fff7fff7ffe","0x40780017fff7fff","0x2","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffed4","0x40137fff7fff8000","0x480680017fff8000","0x2a51090713d169db8c21b794b222ff5dfad9498a96f87856bd08e4e18f1d5b9","0x4002800080007fff","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffece","0x40137fff7fff8001","0x4003800080017ffd","0x4826800180018000","0x1","0x480a7ffb7fff8000","0x480680017fff8000","0x1","0x480a80007fff8000","0x4828800180007ffc","0x480a80017fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff1f","0x480a7ffc7fff8000","0x208b7fff7fff7ffe","0x40780017fff7fff","0x2","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffebc","0x40137fff7fff8000","0x480680017fff8000","0x30398ee6b5eb5f9dd0e4bb0a1b0e3ea13bbab3b2cb6675988ccaa92961c7d1","0x4002800080007fff","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffeb6","0x40137fff7fff8001","0x4003800080017ffd","0x4826800180018000","0x1","0x480a7ffb7fff8000","0x480680017fff8000","0x1","0x480a80007fff8000","0x4828800180007ffc","0x480a80017fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff07","0x480a7ffc7fff8000","0x208b7fff7fff7ffe","0x40780017fff7fff","0x2","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffea4","0x40137fff7fff8000","0x480680017fff8000","0x2e011d5f09eaddee926fc346351731750ccf087bf843692ad9718681d7cbaa5","0x4002800080007fff","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffe9e","0x40137fff7fff8001","0x480a7ffc7fff8000","0x480680017fff8000","0x1","0x480a80007fff8000","0x4829800180008001","0x480a80017fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffef2","0x480a7ffd7fff8000","0x208b7fff7fff7ffe","0x40780017fff7fff","0x2","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffe8f","0x40137fff7fff8000","0x480680017fff8000","0x7a0aed07bb70ba331488c013b98ac5b836c5b713c7c0acda355543bb61e321","0x4002800080007fff","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffe89","0x40137fff7fff8001","0x4003800080017ffd","0x4826800180018000","0x1","0x480a7ffb7fff8000","0x480680017fff8000","0x1","0x480a80007fff8000","0x4828800180007ffc","0x480a80017fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffeda","0x480a7ffc7fff8000","0x208b7fff7fff7ffe","0x40780017fff7fff","0x2","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffe77","0x40137fff7fff8000","0x480680017fff8000","0xec4e9763d54a0a721416be3adfaba05ef0e02c6cf6ee4cd4d1ed0dd0f6d7e7","0x4002800080007fff","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffe71","0x40137fff7fff8001","0x4003800080017ffd","0x4826800180018000","0x1","0x480a7ffb7fff8000","0x480680017fff8000","0x1","0x480a80007fff8000","0x4828800180007ffc","0x480a80017fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffec2","0x480a7ffc7fff8000","0x208b7fff7fff7ffe","0x40780017fff7fff","0x2","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffe5f","0x40137fff7fff8000","0x480680017fff8000","0x112d26124b60e4d99e8c4387c732086fd96b159bf3d72e6d8f5f60c944533f1","0x4002800080007fff","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffe59","0x40137fff7fff8001","0x4003800080017ffd","0x4826800180018000","0x1","0x480a7ffb7fff8000","0x480680017fff8000","0x1","0x480a80007fff8000","0x4828800180007ffc","0x480a80017fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffeaa","0x480a7ffc7fff8000","0x208b7fff7fff7ffe","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x480680017fff8000","0x1ccc09c8a19948e048de7add6929589945e25f22059c7345aaf7837188d8d05","0x208b7fff7fff7ffe","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffffa","0x480a7ffb7fff8000","0x48127ffe7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffe8b","0x48127ffe7fff8000","0x48127ff57fff8000","0x48127ff57fff8000","0x48127ffc7fff8000","0x208b7fff7fff7ffe","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffed","0x480a7ffa7fff8000","0x48127ffe7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffe85","0x48127ff67fff8000","0x48127ff67fff8000","0x208b7fff7fff7ffe","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x480680017fff8000","0x31e7534f8ddb1628d6e07db5c743e33403b9a0b57508a93f4c49582040a2f71","0x208b7fff7fff7ffe","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffffa","0x480a7ffb7fff8000","0x48127ffe7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffe6d","0x48127ffe7fff8000","0x48127ff57fff8000","0x48127ff57fff8000","0x48127ffc7fff8000","0x208b7fff7fff7ffe","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffed","0x480a7ffa7fff8000","0x48127ffe7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffe67","0x48127ff67fff8000","0x48127ff67fff8000","0x208b7fff7fff7ffe","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x480680017fff8000","0x1c0f41bf28d630c8a0bd10f3a5d5c0d1619cf96cfdb7da51b112c420ced36c9","0x208b7fff7fff7ffe","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffffa","0x480a7ffb7fff8000","0x48127ffe7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffe4f","0x48127ffe7fff8000","0x48127ff57fff8000","0x48127ff57fff8000","0x48127ffc7fff8000","0x208b7fff7fff7ffe","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffed","0x480a7ffa7fff8000","0x48127ffe7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffe49","0x48127ff67fff8000","0x48127ff67fff8000","0x208b7fff7fff7ffe","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x480680017fff8000","0x13f17de67551ae34866d4aa875cbace82f3a041eaa58b1d9e34568b0d0561b","0x208b7fff7fff7ffe","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffffa","0x480a7ffb7fff8000","0x48127ffe7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffe31","0x48127ffe7fff8000","0x482480017ff78000","0x1","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffe2c","0x48127ffe7fff8000","0x48127fee7fff8000","0x48127fee7fff8000","0x48127ff57fff8000","0x48127ffb7fff8000","0x208b7fff7fff7ffe","0x480a7ffa7fff8000","0x480a7ffb7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffe7","0x480a7ff97fff8000","0x48127ffe7fff8000","0x480a7ffc7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffe25","0x482480017ff88000","0x1","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffe20","0x48127ff07fff8000","0x48127ff07fff8000","0x208b7fff7fff7ffe","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffe04","0x48127ffe7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffdfa","0x40127fff7fff7ff9","0x48127ffe7fff8000","0x208b7fff7fff7ffe","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff77","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffdca","0x48127ffa7fff8000","0x48127ffa7fff8000","0x48127ffa7fff8000","0x208b7fff7fff7ffe","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffde9","0x400680017fff7fff","0x0","0x48127ffe7fff8000","0x208b7fff7fff7ffe","0x482680017ffd8000","0x800000000000011000000000000000000000000000000000000000000000000","0x482680017ffd8000","0x800000000000010ffffffffffffffff00000000000000000000000000000000","0x480680017fff8000","0x0","0x40507ffe7ffd7fff","0x480a7ffc7fff8000","0x208b7fff7fff7ffe","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff7a","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffdaf","0x48127ffa7fff8000","0x48127ffa7fff8000","0x48127ffa7fff8000","0x208b7fff7fff7ffe","0x20780017fff7ffc","0x3","0x208b7fff7fff7ffe","0x480280007ffd8000","0x48287ffb80007fff","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffda4","0x480a7ffb7fff8000","0x482680017ffc8000","0x800000000000011000000000000000000000000000000000000000000000000","0x482680017ffd8000","0x4","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffff5","0x208b7fff7fff7ffe","0x480a7ff97fff8000","0x480a7ffa7fff8000","0x480a7ffb7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff42","0x400680017fff7fff","0x0","0x480a7ffc7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffd92","0x48127ff97fff8000","0x48127ff97fff8000","0x48127ff97fff8000","0x480a7ffc7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff44","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff5f","0x208b7fff7fff7ffe","0x480a7ffa7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffae","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffd71","0x480680017fff8000","0x3943f10f","0x400080007ffe7fff","0x48127ffb7fff8000","0x480a7ffd7fff8000","0x480680017fff8000","0x29e211664c0b63c79638fbea474206ca74016b3e9a3dc4f9ac300ffd8bdf2cd","0x480680017fff8000","0x1","0x48127ffa7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffd91","0x400680017fff7ffe","0x1","0x480680017fff8000","0x1","0x400080007ffe7fff","0x48127ffc7fff8000","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffe33","0x48127ffd7fff8000","0x48127ffe7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffef5","0x48127ffe7fff8000","0x48127fe47fff8000","0x48127ffd7fff8000","0x208b7fff7fff7ffe","0x480a7ffa7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff89","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffd5d","0x48127ffc7fff8000","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff0f","0x48127ffd7fff8000","0x48127ffe7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffe23","0x48127ffe7fff8000","0x48127fe47fff8000","0x48127ffd7fff8000","0x208b7fff7fff7ffe","0x40780017fff7fff","0x0","0x480a7ffa7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff72","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff2c","0x20780017fff7ffd","0x4","0x400680017fff7fff","0x0","0x48127ffc7fff8000","0x48127ffc7fff8000","0x48127ffc7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff11","0x48127ffd7fff8000","0x48127ffe7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffe1f","0x48127ffe7fff8000","0x48127fe47fff8000","0x48127ffd7fff8000","0x208b7fff7fff7ffe","0x480a7ffa7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff58","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff78","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff1c","0x48127ffd7fff8000","0x48127ffe7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffe24","0x48127ffe7fff8000","0x48127fe47fff8000","0x48127ffd7fff8000","0x208b7fff7fff7ffe","0x480a7ffb7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff45","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff65","0x48127ffd7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffd49","0x48127ffe7fff8000","0x48127ff77fff8000","0x48127ff77fff8000","0x482480017ffc8000","0x93a80","0x480680017fff8000","0x1","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff24","0x48127ffd7fff8000","0x48127ffe7fff8000","0x482480017fe08000","0x93a80","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffe1f","0x48127ffe7fff8000","0x48127fe47fff8000","0x48127ffd7fff8000","0x208b7fff7fff7ffe","0x480a7ffb7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff28","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff48","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffefe","0x482480017fff8000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffff","0x480680017fff8000","0x0","0x40507ffe7ffc7fff","0x48127ff97fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffd25","0x48127ffe7fff8000","0x48127ff37fff8000","0x48127ff37fff8000","0x482480017ffc8000","0x93a80","0x480680017fff8000","0x2","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff00","0x48127ffd7fff8000","0x48127ffe7fff8000","0x482480017fe08000","0x93a80","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffe13","0x48127ffe7fff8000","0x48127fe47fff8000","0x48127ffd7fff8000","0x208b7fff7fff7ffe","0x480a7ffb7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff04","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffedc","0x48127ffe7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffcd4","0x48127ff87fff8000","0x48127ff87fff8000","0x48127ff87fff8000","0x480680017fff8000","0x0","0x480680017fff8000","0x0","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffee3","0x48127ffd7fff8000","0x48127ffe7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffe10","0x48127ffe7fff8000","0x48127fe67fff8000","0x48127ffd7fff8000","0x208b7fff7fff7ffe","0x40780017fff7fff","0x0","0x480a7ffa7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffee7","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff07","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffebd","0x48127ffb7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffce9","0x48127ff87fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffcb2","0x48127ff47fff8000","0x48127ff47fff8000","0x48127ffa7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffcb6","0x400680017fff7fec","0x1","0x48127ff17fff8000","0x48127fe87fff8000","0x48127ffd7fff8000","0x480680017fff8000","0x0","0x480680017fff8000","0x0","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffeba","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffc9f","0x48127ffa7fff8000","0x48127ffa7fff8000","0x48127ffa7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffe6f","0x48127ffd7fff8000","0x48127ffe7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffdf2","0x48127ffe7fff8000","0x48127fe47fff8000","0x48127ffd7fff8000","0x208b7fff7fff7ffe","0x40780017fff7fff","0x0","0x480a7ffa7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffeb4","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffed4","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffe8a","0x48127ffb7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffcb6","0x48127ff87fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffc7f","0x48127ff47fff8000","0x48127ff47fff8000","0x48127ffa7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffc83","0x400680017fff7fec","0x2","0x48127ff17fff8000","0x48127fe87fff8000","0x48127ffd7fff8000","0x480680017fff8000","0x0","0x480680017fff8000","0x0","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffe87","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffc6c","0x48127ffa7fff8000","0x48127ffa7fff8000","0x48127ffa7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffe1e","0x48127ffd7fff8000","0x48127ffe7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffdd7","0x48127ffe7fff8000","0x48127fe47fff8000","0x48127ffd7fff8000","0x208b7fff7fff7ffe","0x40780017fff7fff","0x1","0x480a7ff77fff8000","0x480a7ff87fff8000","0x480a7ff97fff8000","0x480a7ffa7fff8000","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x50","0x40137fff7fff8000","0x48127ffb7fff8000","0x48127ffb7fff8000","0x48127ffb7fff8000","0x48127ffb7fff8000","0x480a7ffb7fff8000","0x482680017ffc8000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffff","0x482680017ffd8000","0x2","0x1104800180018000","0x5c","0x48127ffb7fff8000","0x48127ffb7fff8000","0x48127ffb7fff8000","0x48127ffb7fff8000","0x48527ffb80008000","0x208b7fff7fff7ffe","0x482680017ffd8000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffe00365a","0x20680017fff7fff","0x8","0x480a7ffa7fff8000","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x480680017fff8000","0x1","0x208b7fff7fff7ffe","0x482680017ffd8000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffc6bc0ef2","0x20680017fff7fff","0x8","0x480a7ffa7fff8000","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x480680017fff8000","0x1","0x208b7fff7fff7ffe","0x482680017ffd8000","0x800000000000010ffffffffffffffffffffffffffffffffffffffff0ef242bd","0x20680017fff7fff","0x8","0x480a7ffa7fff8000","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x480680017fff8000","0x1","0x208b7fff7fff7ffe","0x480a7ffa7fff8000","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x480680017fff8000","0x0","0x208b7fff7fff7ffe","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffdc2","0x208b7fff7fff7ffe","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffdda","0x208b7fff7fff7ffe","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffdf2","0x208b7fff7fff7ffe","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffe0a","0x208b7fff7fff7ffe","0x480a7ffa7fff8000","0x482680017ffc8000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffff","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffc04","0x480a7ff77fff8000","0x480a7ff87fff8000","0x48127ffd7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffda5","0x480a7ff97fff8000","0x480a7ffb7fff8000","0x48127ffd7fff8000","0x480280007ffd8000","0x480280017ffd8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffca4","0x48127ff47fff8000","0x48127ff47fff8000","0x48127ffd7fff8000","0x48127ff37fff8000","0x480680017fff8000","0x1","0x208b7fff7fff7ffe","0x40780017fff7fff","0x0","0x480a7ff77fff8000","0x480a7ff87fff8000","0x480a7ffa7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffdae","0x20680017fff7fff","0x9","0x48127ffc7fff8000","0x48127ffc7fff8000","0x480a7ff97fff8000","0x48127ffb7fff8000","0x480680017fff8000","0x1","0x208b7fff7fff7ffe","0x482680017ffc8000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffff","0x20680017fff7fff","0x10","0x480a7ff97fff8000","0x480a7ffb7fff8000","0x48127ffc7fff8000","0x480280007ffd8000","0x480280017ffd8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffc82","0x48127ff37fff8000","0x48127ff37fff8000","0x48127ffd7fff8000","0x48127ff27fff8000","0x480680017fff8000","0x1","0x208b7fff7fff7ffe","0x48127ffb7fff8000","0x48127ffb7fff8000","0x48127ffb7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffdac","0x400780017fff7ffc","0x4","0x480280007ffd8000","0x480280017ffd8000","0x480680017fff8000","0x0","0x40307ffe7ffd7fff","0x480a7ff97fff8000","0x480a7ffb7fff8000","0x48127ffa7fff8000","0x480280027ffd8000","0x480280037ffd8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffc68","0x48127ff17fff8000","0x48127ff17fff8000","0x48127ffd7fff8000","0x48127ff07fff8000","0x480680017fff8000","0x1","0x208b7fff7fff7ffe","0x40780017fff7fff","0x2","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffb9a","0x40137fff7fff8000","0x480680017fff8000","0x10c19bef19acd19b2c9f4caa40fd47c9fbe1d9f91324d44dcd36be2dae96784","0x4002800080007fff","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffb94","0x40137fff7fff8001","0x4003800080017ffb","0x4003800180017ffc","0x4003800280017ffd","0x4826800180018000","0x3","0x480a7ff97fff8000","0x480680017fff8000","0x1","0x480a80007fff8000","0x4828800180007ffc","0x480a80017fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffbe3","0x480a7ffa7fff8000","0x208b7fff7fff7ffe","0x40780017fff7fff","0x4","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffb80","0x40137fff7fff8000","0x480680017fff8000","0x5ad857f66a5b55f1301ff1ed7e098ac6d4433148f0b72ebc4a2945ab85ad53","0x4002800080007fff","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffb7a","0x40137fff7fff8001","0x4003800080017ffb","0x4003800180017ffc","0x400380007ffa7ffc","0x402780017ffa8002","0x1","0x4826800180018000","0x2","0x40297ffc7fff8003","0x4826800180018000","0x2","0x480a7ffd7fff8000","0x480a7ffc7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffb6e","0x480a7ff97fff8000","0x480680017fff8000","0x1","0x480a80007fff8000","0x4829800180008003","0x480a80017fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffbc0","0x480a80027fff8000","0x208b7fff7fff7ffe","0x40780017fff7fff","0x4","0x480a7ff67fff8000","0x480a7ff77fff8000","0x480a7ff97fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffd9e","0x40137ffe7fff8000","0x40137fff7fff8001","0x48127ffd7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffbbc","0x40137fff7fff8002","0x40137ffe7fff8003","0x482680017ffa8000","0x800000000000011000000000000000000000000000000000000000000000000","0x20680017fff7fff","0x3c","0x480280007ffb8000","0x4802800180028000","0x48307fff80007ffe","0x20680017fff7fff","0x35","0x480280017ffb8000","0x482480017fff8000","0x6deebfbbd234bdea5f5d3fcc8fc45c8e76ce52e70217eeb538a4fed2aaacb30","0x480280017ffb8000","0x482480017fff8000","0x7ad6481ac8d604015ca186b470cbdd5381f63c491cd229a9aafab983daff15d","0x48507fff7ffd8000","0x480280017ffb8000","0x482480017fff8000","0x4c86eea6a386a343759c1dd7351d22d39c7b65277d8e8def7448ded5c1cdc12","0x480280017ffb8000","0x482480017fff8000","0x7067c5bdabfc03fb90239569b438c5002297ba0cafee37858dc6ce39d7c6b15","0x48507fff7ffd8000","0x20680017fff7ffa","0x10","0x480a80037fff8000","0x480a80007fff8000","0x480a7ff87fff8000","0x480a80017fff8000","0x4802800580028000","0x4802800380028000","0x4802800480028000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff42","0x48127ffb7fff8000","0x48127ffb7fff8000","0x48127ffb7fff8000","0x48127ffb7fff8000","0x208b7fff7fff7ffe","0x20680017fff7fff","0x10","0x480a80037fff8000","0x480a80007fff8000","0x480a7ff87fff8000","0x480a80017fff8000","0x4802800580028000","0x4802800380028000","0x4802800480028000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff4a","0x48127ffb7fff8000","0x48127ffb7fff8000","0x48127ffb7fff8000","0x48127ffb7fff8000","0x208b7fff7fff7ffe","0x480280017ffb8000","0x482480017fff8000","0x65e1be0b9b5dcba6a1afaf57b95d935dd133d85353ab41a099997b7fce10472","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffb29","0x10780017fff7fff","0x7","0x4802800180028000","0x480a7ffa7fff8000","0x480a7ffb7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffd7a","0x480a80037fff8000","0x480a80007fff8000","0x480a7ff87fff8000","0x480a80017fff8000","0x4802800580028000","0x4802800380028000","0x4802800480028000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff18","0x4802800380028000","0x4802800480028000","0x48127ff97fff8000","0x48127ff97fff8000","0x48127ff97fff8000","0x48127ff97fff8000","0x4802800580028000","0x482480017ff98000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffff","0x482480017ff98000","0x2","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff23","0x48127ffb7fff8000","0x48127ffb7fff8000","0x48127ffb7fff8000","0x48127ffb7fff8000","0x208b7fff7fff7ffe","0x480280027ffb8000","0x480280007ffd8000","0x400080007ffe7fff","0x482680017ffd8000","0x1","0x480280007ffd8000","0x484480017fff8000","0x4","0x48307fff7ffd8000","0x480280027ffb8000","0x480080007ffe8000","0x400080017ffe7fff","0x482480017ffd8000","0x1","0x480080007ffc8000","0x48307fff7ffe8000","0x402a7ffd7ffc7fff","0x480280027ffb8000","0x480280007ffb8000","0x480280017ffb8000","0x480280037ffb8000","0x482480017ffc8000","0x2","0x480280007ffd8000","0x482680017ffd8000","0x1","0x480080007ff38000","0x482480017ff28000","0x1","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff78","0x40780017fff7fff","0x1","0x48127ffb7fff8000","0x48127ffb7fff8000","0x48127ffc7fff8000","0x48127ffa7fff8000","0x480680017fff8000","0x0","0x48127ffa7fff8000","0x208b7fff7fff7ffe","0x40780017fff7fff","0x3","0x480a7ff67fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffb2e","0x40137fff7fff8000","0x48127ffe7fff8000","0x4802800080008000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffd18","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffd0f","0x480a7ffa7fff8000","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffb40","0x40137ffe7fff8001","0x40137fff7fff8002","0x48127ffd7fff8000","0x480a7ff97fff8000","0x4802800580008000","0x480a80017fff8000","0x480a80027fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff30","0x48127ffe7fff8000","0x480a7ff77fff8000","0x480a7ff87fff8000","0x48127ffc7fff8000","0x480a80017fff8000","0x480a80027fff8000","0x208b7fff7fff7ffe","0x480280027ffb8000","0x480280007ffd8000","0x400080007ffe7fff","0x482680017ffd8000","0x1","0x480280007ffd8000","0x484480017fff8000","0x4","0x48307fff7ffd8000","0x480280027ffb8000","0x480080007ffe8000","0x400080017ffe7fff","0x482480017ffd8000","0x1","0x480080007ffc8000","0x48307fff7ffe8000","0x402a7ffd7ffc7fff","0x480280027ffb8000","0x480280007ffb8000","0x480280017ffb8000","0x480280037ffb8000","0x482480017ffc8000","0x2","0x480280007ffd8000","0x482680017ffd8000","0x1","0x480080007ff38000","0x482480017ff28000","0x1","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffc2","0x48127ffa7fff8000","0x48127ffa7fff8000","0x48127ffb7fff8000","0x48127ff97fff8000","0x48127ffa7fff8000","0x48127ffa7fff8000","0x208b7fff7fff7ffe","0x40780017fff7fff","0x0","0x480a7ff97fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffae6","0x48127ffe7fff8000","0x480a7ffa7fff8000","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x480080057ffb8000","0x480080037ffa8000","0x480080047ff98000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffe87","0x480080037fcd8000","0x480080047fcc8000","0x48127ff97fff8000","0x48127ff97fff8000","0x48127ff97fff8000","0x48127ff97fff8000","0x480080057fc78000","0x482480017ff98000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffff","0x482480017ff98000","0x2","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffe92","0x48127ffb7fff8000","0x48127ffb7fff8000","0x48127ffb7fff8000","0x48127ffb7fff8000","0x208b7fff7fff7ffe","0x482680017ffd8000","0x1","0x402a7ffd7ffc7fff","0x480280007ffb8000","0x480280017ffb8000","0x480280037ffb8000","0x480280027ffb8000","0x480280007ffd8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffd9","0x40780017fff7fff","0x1","0x48127ffb7fff8000","0x48127ffb7fff8000","0x48127ffc7fff8000","0x48127ffa7fff8000","0x480680017fff8000","0x0","0x48127ffa7fff8000","0x208b7fff7fff7ffe","0x40780017fff7fff","0x0","0x480a7ff77fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffab2","0x48127ffe7fff8000","0x480a7ff87fff8000","0x480a7ff97fff8000","0x480a7ffa7fff8000","0x480080057ffb8000","0x480080037ffa8000","0x480080047ff98000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffe53","0x480080037fcd8000","0x480080047fcc8000","0x48127ff97fff8000","0x48127ff97fff8000","0x48127ff97fff8000","0x48127ff97fff8000","0x480080057fc78000","0x482480017ff98000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffff","0x482480017ff98000","0x2","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffe5e","0x48127ffb7fff8000","0x48127ffb7fff8000","0x48127ffb7fff8000","0x48127ffb7fff8000","0x208b7fff7fff7ffe","0x480280007ffb8000","0x480280017ffb8000","0x480280037ffb8000","0x480280027ffb8000","0x480a7ffa7fff8000","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffda","0x40780017fff7fff","0x1","0x48127ffb7fff8000","0x48127ffb7fff8000","0x48127ffc7fff8000","0x48127ffa7fff8000","0x480680017fff8000","0x0","0x48127ffa7fff8000","0x208b7fff7fff7ffe","0x480a7ff77fff8000","0x480a7ff87fff8000","0x480a7ff97fff8000","0x480a7ffa7fff8000","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffdcc","0x208b7fff7fff7ffe","0x40780017fff7fff","0x1","0x4003800080007ffc","0x4826800180008000","0x1","0x480a7ffd7fff8000","0x4828800080007ffe","0x480a80007fff8000","0x208b7fff7fff7ffe","0x480280027ffb8000","0x480280017ffd8000","0x400080007ffe7fff","0x482680017ffd8000","0x2","0x480280017ffd8000","0x48307fff7ffe8000","0x402a7ffd7ffc7fff","0x480280027ffb8000","0x480280007ffb8000","0x480280017ffb8000","0x480280037ffb8000","0x482480017ffc8000","0x1","0x480280007ffd8000","0x480280017ffd8000","0x482680017ffd8000","0x2","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffdc","0x48127ffe7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffe3","0x48127ff37fff8000","0x48127ff37fff8000","0x48127ffb7fff8000","0x48127ff27fff8000","0x48127ffa7fff8000","0x48127ffa7fff8000","0x208b7fff7fff7ffe","0x480a7ffa7fff8000","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffdbb","0x208b7fff7fff7ffe","0x40780017fff7fff","0x1","0x4003800080007ffc","0x4826800180008000","0x1","0x480a7ffd7fff8000","0x4828800080007ffe","0x480a80007fff8000","0x208b7fff7fff7ffe","0x482680017ffd8000","0x1","0x402a7ffd7ffc7fff","0x480280007ffb8000","0x480280017ffb8000","0x480280027ffb8000","0x480280007ffd8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffea","0x48127ffe7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffee","0x48127ff47fff8000","0x48127ff47fff8000","0x48127ffb7fff8000","0x480280037ffb8000","0x48127ffa7fff8000","0x48127ffa7fff8000","0x208b7fff7fff7ffe","0x480a7ff97fff8000","0x480a7ffa7fff8000","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffc3b","0x48127ffd7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff9fe","0x48127ffe7fff8000","0x48127ff87fff8000","0x48127ffd7fff8000","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffe1d","0x48127ffe7fff8000","0x48127fdc7fff8000","0x48127ffd7fff8000","0x208b7fff7fff7ffe","0x482680017ffd8000","0x2","0x402a7ffd7ffc7fff","0x480280007ffb8000","0x480280017ffb8000","0x480280027ffb8000","0x480280007ffd8000","0x480280017ffd8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffe4","0x40780017fff7fff","0x1","0x48127ffc7fff8000","0x48127ffc7fff8000","0x48127ffc7fff8000","0x480280037ffb8000","0x480680017fff8000","0x0","0x48127ffa7fff8000","0x208b7fff7fff7ffe","0x480a7ff87fff8000","0x480a7ff97fff8000","0x480a7ffa7fff8000","0x480a7ffb7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffc27","0x20780017fff7ffc","0xb","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff996","0x48127ffa7fff8000","0x48127ffa7fff8000","0x48127ffa7fff8000","0x480680017fff8000","0x0","0x48127ffb7fff8000","0x208b7fff7fff7ffe","0x48127ffd7fff8000","0x480a7ffb7fff8000","0x480680017fff8000","0x1a1e41f464a235695e5050a846a26ca22ecc27acac54be5f6666848031efb8f","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff9b3","0x48127ffd7fff8000","0x48127ff27fff8000","0x48127ff27fff8000","0x48127ffb7fff8000","0x48127ffb7fff8000","0x208b7fff7fff7ffe","0x40780017fff7fff","0x3","0x4003800080007ffb","0x400380007ffd7ffb","0x402780017ffd8001","0x1","0x4826800180008000","0x1","0x40297ffb7fff8002","0x4826800180008000","0x1","0x480a7ffc7fff8000","0x480a7ffb7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff975","0x480a80017fff8000","0x4829800080008002","0x480a80007fff8000","0x208b7fff7fff7ffe","0x40780017fff7fff","0x2","0x480280027ffb8000","0x480280017ffd8000","0x400080007ffe7fff","0x482680017ffd8000","0x2","0x480280017ffd8000","0x48307fff7ffe8000","0x402a7ffd7ffc7fff","0x480280027ffb8000","0x480280007ffb8000","0x480280017ffb8000","0x482480017ffd8000","0x1","0x480280007ffd8000","0x480280017ffd8000","0x482680017ffd8000","0x2","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffbc","0x40137ffb7fff8000","0x40137ffc7fff8001","0x48127ffd7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffd6","0x480a80007fff8000","0x480a80017fff8000","0x48127ffb7fff8000","0x480280037ffb8000","0x48127ffa7fff8000","0x48127ffa7fff8000","0x208b7fff7fff7ffe","0x40780017fff7fff","0x1","0x480a7ff77fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffb83","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff985","0x40137ffe7fff8000","0x480a7ffa7fff8000","0x480a7ffb7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffbab","0x480a80007fff8000","0x480a7ffa7fff8000","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff9c0","0x48127ffd7fff8000","0x480a7ff87fff8000","0x480a7ff97fff8000","0x48127ffb7fff8000","0x48127ffb7fff8000","0x208b7fff7fff7ffe","0x40780017fff7fff","0x3","0x4003800080007ffb","0x400380007ffd7ffb","0x402780017ffd8001","0x1","0x4826800180008000","0x1","0x40297ffb7fff8002","0x4826800180008000","0x1","0x480a7ffc7fff8000","0x480a7ffb7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff928","0x480a80017fff8000","0x4829800080008002","0x480a80007fff8000","0x208b7fff7fff7ffe","0x40780017fff7fff","0x2","0x480280027ffb8000","0x480280007ffd8000","0x400080007ffe7fff","0x482680017ffd8000","0x1","0x480280007ffd8000","0x484480017fff8000","0x4","0x48307fff7ffd8000","0x480280027ffb8000","0x480080007ffe8000","0x400080017ffe7fff","0x482480017ffd8000","0x1","0x480080007ffc8000","0x48307fff7ffe8000","0x402a7ffd7ffc7fff","0x480280027ffb8000","0x480280007ffb8000","0x480280017ffb8000","0x482480017ffd8000","0x2","0x480280007ffd8000","0x482680017ffd8000","0x1","0x480080007ff48000","0x482480017ff38000","0x1","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffb7","0x40137ffb7fff8000","0x40137ffc7fff8001","0x48127ffd7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffcb","0x480a80007fff8000","0x480a80017fff8000","0x48127ffb7fff8000","0x480280037ffb8000","0x48127ffa7fff8000","0x48127ffa7fff8000","0x208b7fff7fff7ffe","0x480a7ffa7fff8000","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffba1","0x208b7fff7fff7ffe","0x482680017ffd8000","0x1","0x402a7ffd7ffc7fff","0x480280007ffb8000","0x480280017ffb8000","0x480280027ffb8000","0x480280007ffd8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffff3","0x40780017fff7fff","0x1","0x48127ffc7fff8000","0x48127ffc7fff8000","0x48127ffc7fff8000","0x480280037ffb8000","0x480680017fff8000","0x0","0x48127ffa7fff8000","0x208b7fff7fff7ffe","0x480a7ffa7fff8000","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffb9c","0x208b7fff7fff7ffe","0x482680017ffd8000","0x1","0x402a7ffd7ffc7fff","0x480280007ffb8000","0x480280017ffb8000","0x480280027ffb8000","0x480280007ffd8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffff3","0x40780017fff7fff","0x1","0x48127ffc7fff8000","0x48127ffc7fff8000","0x48127ffc7fff8000","0x480280037ffb8000","0x480680017fff8000","0x0","0x48127ffa7fff8000","0x208b7fff7fff7ffe","0x480a7ffa7fff8000","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffb9e","0x208b7fff7fff7ffe","0x482680017ffd8000","0x1","0x402a7ffd7ffc7fff","0x480280007ffb8000","0x480280017ffb8000","0x480280027ffb8000","0x480280007ffd8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffff3","0x40780017fff7fff","0x1","0x48127ffc7fff8000","0x48127ffc7fff8000","0x48127ffc7fff8000","0x480280037ffb8000","0x480680017fff8000","0x0","0x48127ffa7fff8000","0x208b7fff7fff7ffe","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffb98","0x208b7fff7fff7ffe","0x402b7ffd7ffc7ffd","0x480280007ffb8000","0x480280017ffb8000","0x480280027ffb8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffff7","0x40780017fff7fff","0x1","0x48127ffc7fff8000","0x48127ffc7fff8000","0x48127ffc7fff8000","0x480280037ffb8000","0x480680017fff8000","0x0","0x48127ffa7fff8000","0x208b7fff7fff7ffe","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffb9f","0x208b7fff7fff7ffe","0x402b7ffd7ffc7ffd","0x480280007ffb8000","0x480280017ffb8000","0x480280027ffb8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffff7","0x40780017fff7fff","0x1","0x48127ffc7fff8000","0x48127ffc7fff8000","0x48127ffc7fff8000","0x480280037ffb8000","0x480680017fff8000","0x0","0x48127ffa7fff8000","0x208b7fff7fff7ffe","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffbad","0x208b7fff7fff7ffe","0x402b7ffd7ffc7ffd","0x480280007ffb8000","0x480280017ffb8000","0x480280027ffb8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffff7","0x40780017fff7fff","0x1","0x48127ffc7fff8000","0x48127ffc7fff8000","0x48127ffc7fff8000","0x480280037ffb8000","0x480680017fff8000","0x0","0x48127ffa7fff8000","0x208b7fff7fff7ffe","0x480a7ffa7fff8000","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffbb1","0x208b7fff7fff7ffe","0x482680017ffd8000","0x1","0x402a7ffd7ffc7fff","0x480280007ffb8000","0x480280017ffb8000","0x480280027ffb8000","0x480280007ffd8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffff3","0x40780017fff7fff","0x1","0x48127ffc7fff8000","0x48127ffc7fff8000","0x48127ffc7fff8000","0x480280037ffb8000","0x480680017fff8000","0x0","0x48127ffa7fff8000","0x208b7fff7fff7ffe","0x480a7ffa7fff8000","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffbca","0x208b7fff7fff7ffe","0x482680017ffd8000","0x1","0x402a7ffd7ffc7fff","0x480280007ffb8000","0x480280017ffb8000","0x480280027ffb8000","0x480280007ffd8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffff3","0x40780017fff7fff","0x1","0x48127ffc7fff8000","0x48127ffc7fff8000","0x48127ffc7fff8000","0x480280037ffb8000","0x480680017fff8000","0x0","0x48127ffa7fff8000","0x208b7fff7fff7ffe","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffc25","0x208b7fff7fff7ffe","0x40780017fff7fff","0x1","0x4003800080007ffc","0x4826800180008000","0x1","0x480a7ffd7fff8000","0x4828800080007ffe","0x480a80007fff8000","0x208b7fff7fff7ffe","0x402b7ffd7ffc7ffd","0x480280007ffb8000","0x480280017ffb8000","0x480280027ffb8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffee","0x48127ffe7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffff1","0x48127ff47fff8000","0x48127ff47fff8000","0x48127ffb7fff8000","0x480280037ffb8000","0x48127ffa7fff8000","0x48127ffa7fff8000","0x208b7fff7fff7ffe","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffc0c","0x208b7fff7fff7ffe","0x40780017fff7fff","0x1","0x4003800080007ffc","0x4826800180008000","0x1","0x480a7ffd7fff8000","0x4828800080007ffe","0x480a80007fff8000","0x208b7fff7fff7ffe","0x402b7ffd7ffc7ffd","0x480280007ffb8000","0x480280017ffb8000","0x480280027ffb8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffee","0x48127ffe7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffff1","0x48127ff47fff8000","0x48127ff47fff8000","0x48127ffb7fff8000","0x480280037ffb8000","0x48127ffa7fff8000","0x48127ffa7fff8000","0x208b7fff7fff7ffe","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffbf3","0x208b7fff7fff7ffe","0x40780017fff7fff","0x1","0x4003800080007ffc","0x4826800180008000","0x1","0x480a7ffd7fff8000","0x4828800080007ffe","0x480a80007fff8000","0x208b7fff7fff7ffe","0x402b7ffd7ffc7ffd","0x480280007ffb8000","0x480280017ffb8000","0x480280027ffb8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffee","0x48127ffe7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffff1","0x48127ff47fff8000","0x48127ff47fff8000","0x48127ffb7fff8000","0x480280037ffb8000","0x48127ffa7fff8000","0x48127ffa7fff8000","0x208b7fff7fff7ffe","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffbda","0x208b7fff7fff7ffe","0x40780017fff7fff","0x1","0x4003800080007ffb","0x4003800180007ffc","0x4826800180008000","0x2","0x480a7ffd7fff8000","0x4828800080007ffe","0x480a80007fff8000","0x208b7fff7fff7ffe","0x402b7ffd7ffc7ffd","0x480280007ffb8000","0x480280017ffb8000","0x480280027ffb8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffed","0x48127ffd7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffff0","0x48127ff37fff8000","0x48127ff37fff8000","0x48127ffb7fff8000","0x480280037ffb8000","0x48127ffa7fff8000","0x48127ffa7fff8000","0x208b7fff7fff7ffe","0x480680017fff8000","0x302e322e33","0x208b7fff7fff7ffe","0x40780017fff7fff","0x1","0x4003800080007ffc","0x4826800180008000","0x1","0x480a7ffd7fff8000","0x4828800080007ffe","0x480a80007fff8000","0x208b7fff7fff7ffe","0x402b7ffd7ffc7ffd","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffff4","0x480280027ffb8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffff4","0x480280007ffb8000","0x480280017ffb8000","0x48127ffb7fff8000","0x480280037ffb8000","0x48127ffa7fff8000","0x48127ffa7fff8000","0x208b7fff7fff7ffe","0x480680017fff8000","0x417267656e744163636f756e74","0x208b7fff7fff7ffe","0x40780017fff7fff","0x1","0x4003800080007ffc","0x4826800180008000","0x1","0x480a7ffd7fff8000","0x4828800080007ffe","0x480a80007fff8000","0x208b7fff7fff7ffe","0x402b7ffd7ffc7ffd","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffff4","0x480280027ffb8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffff4","0x480280007ffb8000","0x480280017ffb8000","0x48127ffb7fff8000","0x480280037ffb8000","0x48127ffa7fff8000","0x48127ffa7fff8000","0x208b7fff7fff7ffe","0x480a7ff77fff8000","0x480a7ff87fff8000","0x480a7ff97fff8000","0x480a7ffa7fff8000","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffb31","0x208b7fff7fff7ffe","0x40780017fff7fff","0x1","0x4003800080007ffc","0x4826800180008000","0x1","0x480a7ffd7fff8000","0x4828800080007ffe","0x480a80007fff8000","0x208b7fff7fff7ffe","0x480280027ffb8000","0x480280017ffd8000","0x400080007ffe7fff","0x482680017ffd8000","0x2","0x480280017ffd8000","0x48307fff7ffe8000","0x402a7ffd7ffc7fff","0x480280027ffb8000","0x480280007ffb8000","0x480280017ffb8000","0x480280037ffb8000","0x482480017ffc8000","0x1","0x480280007ffd8000","0x480280017ffd8000","0x482680017ffd8000","0x2","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffdc","0x48127ffe7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffe3","0x48127ff37fff8000","0x48127ff37fff8000","0x48127ffb7fff8000","0x48127ff27fff8000","0x48127ffa7fff8000","0x48127ffa7fff8000","0x208b7fff7fff7ffe"],"hints":{"0":[{"accessible_scopes":["starkware.cairo.common.alloc","starkware.cairo.common.alloc.alloc"],"code":"memory[ap] = segments.add()","flow_tracking_data":{"ap_tracking":{"group":0,"offset":0},"reference_ids":{}}}],"6":[{"accessible_scopes":["starkware.cairo.common.memcpy","starkware.cairo.common.memcpy.memcpy"],"code":"vm_enter_scope({'n': ids.len})","flow_tracking_data":{"ap_tracking":{"group":1,"offset":0},"reference_ids":{"starkware.cairo.common.memcpy.memcpy.len":0}}}],"14":[{"accessible_scopes":["starkware.cairo.common.memcpy","starkware.cairo.common.memcpy.memcpy"],"code":"n -= 1\nids.continue_copying = 1 if n > 0 else 0","flow_tracking_data":{"ap_tracking":{"group":1,"offset":5},"reference_ids":{"starkware.cairo.common.memcpy.memcpy.continue_copying":1}}}],"17":[{"accessible_scopes":["starkware.cairo.common.memcpy","starkware.cairo.common.memcpy.memcpy"],"code":"vm_exit_scope()","flow_tracking_data":{"ap_tracking":{"group":1,"offset":6},"reference_ids":{}}}],"18":[{"accessible_scopes":["starkware.cairo.common.math","starkware.cairo.common.math.assert_not_zero"],"code":"from starkware.cairo.common.math_utils import assert_integer\nassert_integer(ids.value)\nassert ids.value % PRIME != 0, f'assert_not_zero failed: {ids.value} = 0.'","flow_tracking_data":{"ap_tracking":{"group":2,"offset":0},"reference_ids":{"starkware.cairo.common.math.assert_not_zero.value":2}}}],"23":[{"accessible_scopes":["starkware.cairo.common.math","starkware.cairo.common.math.assert_nn"],"code":"from starkware.cairo.common.math_utils import assert_integer\nassert_integer(ids.a)\nassert 0 <= ids.a % PRIME < range_check_builtin.bound, f'a = {ids.a} is out of range.'","flow_tracking_data":{"ap_tracking":{"group":3,"offset":0},"reference_ids":{"starkware.cairo.common.math.assert_nn.a":3}}}],"39":[{"accessible_scopes":["starkware.starknet.common.syscalls","starkware.starknet.common.syscalls.call_contract"],"code":"syscall_handler.call_contract(segments=segments, syscall_ptr=ids.syscall_ptr)","flow_tracking_data":{"ap_tracking":{"group":5,"offset":1},"reference_ids":{"starkware.starknet.common.syscalls.call_contract.syscall_ptr":4}}}],"51":[{"accessible_scopes":["starkware.starknet.common.syscalls","starkware.starknet.common.syscalls.library_call"],"code":"syscall_handler.library_call(segments=segments, syscall_ptr=ids.syscall_ptr)","flow_tracking_data":{"ap_tracking":{"group":6,"offset":1},"reference_ids":{"starkware.starknet.common.syscalls.library_call.syscall_ptr":5}}}],"59":[{"accessible_scopes":["starkware.starknet.common.syscalls","starkware.starknet.common.syscalls.get_caller_address"],"code":"syscall_handler.get_caller_address(segments=segments, syscall_ptr=ids.syscall_ptr)","flow_tracking_data":{"ap_tracking":{"group":7,"offset":1},"reference_ids":{"starkware.starknet.common.syscalls.get_caller_address.syscall_ptr":6}}}],"66":[{"accessible_scopes":["starkware.starknet.common.syscalls","starkware.starknet.common.syscalls.get_contract_address"],"code":"syscall_handler.get_contract_address(segments=segments, syscall_ptr=ids.syscall_ptr)","flow_tracking_data":{"ap_tracking":{"group":8,"offset":1},"reference_ids":{"starkware.starknet.common.syscalls.get_contract_address.syscall_ptr":7}}}],"73":[{"accessible_scopes":["starkware.starknet.common.syscalls","starkware.starknet.common.syscalls.get_block_timestamp"],"code":"syscall_handler.get_block_timestamp(segments=segments, syscall_ptr=ids.syscall_ptr)","flow_tracking_data":{"ap_tracking":{"group":9,"offset":1},"reference_ids":{"starkware.starknet.common.syscalls.get_block_timestamp.syscall_ptr":8}}}],"81":[{"accessible_scopes":["starkware.starknet.common.syscalls","starkware.starknet.common.syscalls.storage_read"],"code":"syscall_handler.storage_read(segments=segments, syscall_ptr=ids.syscall_ptr)","flow_tracking_data":{"ap_tracking":{"group":10,"offset":1},"reference_ids":{"starkware.starknet.common.syscalls.storage_read.syscall_ptr":9}}}],"90":[{"accessible_scopes":["starkware.starknet.common.syscalls","starkware.starknet.common.syscalls.storage_write"],"code":"syscall_handler.storage_write(segments=segments, syscall_ptr=ids.syscall_ptr)","flow_tracking_data":{"ap_tracking":{"group":11,"offset":1},"reference_ids":{"starkware.starknet.common.syscalls.storage_write.syscall_ptr":10}}}],"100":[{"accessible_scopes":["starkware.starknet.common.syscalls","starkware.starknet.common.syscalls.emit_event"],"code":"syscall_handler.emit_event(segments=segments, syscall_ptr=ids.syscall_ptr)","flow_tracking_data":{"ap_tracking":{"group":12,"offset":1},"reference_ids":{"starkware.starknet.common.syscalls.emit_event.syscall_ptr":11}}}],"106":[{"accessible_scopes":["starkware.starknet.common.syscalls","starkware.starknet.common.syscalls.get_tx_info"],"code":"syscall_handler.get_tx_info(segments=segments, syscall_ptr=ids.syscall_ptr)","flow_tracking_data":{"ap_tracking":{"group":13,"offset":1},"reference_ids":{"starkware.starknet.common.syscalls.get_tx_info.syscall_ptr":12}}}],"195":[{"accessible_scopes":["starkware.cairo.common.signature","starkware.cairo.common.signature.verify_ecdsa_signature"],"code":"ecdsa_builtin.add_signature(ids.ecdsa_ptr.address_, (ids.signature_r, ids.signature_s))","flow_tracking_data":{"ap_tracking":{"group":22,"offset":0},"reference_ids":{"starkware.cairo.common.signature.verify_ecdsa_signature.ecdsa_ptr":16,"starkware.cairo.common.signature.verify_ecdsa_signature.signature_r":14,"starkware.cairo.common.signature.verify_ecdsa_signature.signature_s":15}}}],"1325":[{"accessible_scopes":["__main__","__main__","__wrappers__","__wrappers__.__validate__"],"code":"memory[ap] = segments.add()","flow_tracking_data":{"ap_tracking":{"group":84,"offset":0},"reference_ids":{}}}],"1449":[{"accessible_scopes":["__main__","__main__","__wrappers__","__wrappers__.__validate_declare__"],"code":"memory[ap] = segments.add()","flow_tracking_data":{"ap_tracking":{"group":93,"offset":0},"reference_ids":{}}}],"1500":[{"accessible_scopes":["__main__","__main__","__wrappers__","__wrappers__.__validate_deploy__"],"code":"memory[ap] = segments.add()","flow_tracking_data":{"ap_tracking":{"group":97,"offset":0},"reference_ids":{}}}],"1520":[{"accessible_scopes":["__main__","__main__","__wrappers__","__wrappers__.isValidSignature_encode_return"],"code":"memory[ap] = segments.add()","flow_tracking_data":{"ap_tracking":{"group":100,"offset":0},"reference_ids":{}}}],"1566":[{"accessible_scopes":["__main__","__main__","__wrappers__","__wrappers__.supportsInterface_encode_return"],"code":"memory[ap] = segments.add()","flow_tracking_data":{"ap_tracking":{"group":105,"offset":0},"reference_ids":{}}}],"1625":[{"accessible_scopes":["__main__","__main__","__wrappers__","__wrappers__.initialize"],"code":"memory[ap] = segments.add()","flow_tracking_data":{"ap_tracking":{"group":109,"offset":118},"reference_ids":{}}}],"1666":[{"accessible_scopes":["__main__","__main__","__wrappers__","__wrappers__.upgrade_encode_return"],"code":"memory[ap] = segments.add()","flow_tracking_data":{"ap_tracking":{"group":111,"offset":0},"reference_ids":{}}}],"1743":[{"accessible_scopes":["__main__","__main__","__wrappers__","__wrappers__.execute_after_upgrade_encode_return"],"code":"memory[ap] = segments.add()","flow_tracking_data":{"ap_tracking":{"group":119,"offset":0},"reference_ids":{}}}],"1822":[{"accessible_scopes":["__main__","__main__","__wrappers__","__wrappers__.changeSigner"],"code":"memory[ap] = segments.add()","flow_tracking_data":{"ap_tracking":{"group":125,"offset":82},"reference_ids":{}}}],"1848":[{"accessible_scopes":["__main__","__main__","__wrappers__","__wrappers__.changeGuardian"],"code":"memory[ap] = segments.add()","flow_tracking_data":{"ap_tracking":{"group":127,"offset":101},"reference_ids":{}}}],"1874":[{"accessible_scopes":["__main__","__main__","__wrappers__","__wrappers__.changeGuardianBackup"],"code":"memory[ap] = segments.add()","flow_tracking_data":{"ap_tracking":{"group":129,"offset":108},"reference_ids":{}}}],"1896":[{"accessible_scopes":["__main__","__main__","__wrappers__","__wrappers__.triggerEscapeGuardian"],"code":"memory[ap] = segments.add()","flow_tracking_data":{"ap_tracking":{"group":131,"offset":121},"reference_ids":{}}}],"1918":[{"accessible_scopes":["__main__","__main__","__wrappers__","__wrappers__.triggerEscapeSigner"],"code":"memory[ap] = segments.add()","flow_tracking_data":{"ap_tracking":{"group":133,"offset":151},"reference_ids":{}}}],"1940":[{"accessible_scopes":["__main__","__main__","__wrappers__","__wrappers__.cancelEscape"],"code":"memory[ap] = segments.add()","flow_tracking_data":{"ap_tracking":{"group":135,"offset":114},"reference_ids":{}}}],"1966":[{"accessible_scopes":["__main__","__main__","__wrappers__","__wrappers__.escapeGuardian"],"code":"memory[ap] = segments.add()","flow_tracking_data":{"ap_tracking":{"group":137,"offset":190},"reference_ids":{}}}],"1992":[{"accessible_scopes":["__main__","__main__","__wrappers__","__wrappers__.escapeSigner"],"code":"memory[ap] = segments.add()","flow_tracking_data":{"ap_tracking":{"group":139,"offset":190},"reference_ids":{}}}],"2008":[{"accessible_scopes":["__main__","__main__","__wrappers__","__wrappers__.getSigner_encode_return"],"code":"memory[ap] = segments.add()","flow_tracking_data":{"ap_tracking":{"group":141,"offset":0},"reference_ids":{}}}],"2039":[{"accessible_scopes":["__main__","__main__","__wrappers__","__wrappers__.getGuardian_encode_return"],"code":"memory[ap] = segments.add()","flow_tracking_data":{"ap_tracking":{"group":144,"offset":0},"reference_ids":{}}}],"2070":[{"accessible_scopes":["__main__","__main__","__wrappers__","__wrappers__.getGuardianBackup_encode_return"],"code":"memory[ap] = segments.add()","flow_tracking_data":{"ap_tracking":{"group":147,"offset":0},"reference_ids":{}}}],"2101":[{"accessible_scopes":["__main__","__main__","__wrappers__","__wrappers__.getEscape_encode_return"],"code":"memory[ap] = segments.add()","flow_tracking_data":{"ap_tracking":{"group":150,"offset":0},"reference_ids":{}}}],"2130":[{"accessible_scopes":["__main__","__main__","__wrappers__","__wrappers__.getVersion_encode_return"],"code":"memory[ap] = segments.add()","flow_tracking_data":{"ap_tracking":{"group":153,"offset":0},"reference_ids":{}}}],"2155":[{"accessible_scopes":["__main__","__main__","__wrappers__","__wrappers__.getName_encode_return"],"code":"memory[ap] = segments.add()","flow_tracking_data":{"ap_tracking":{"group":156,"offset":0},"reference_ids":{}}}],"2187":[{"accessible_scopes":["__main__","__main__","__wrappers__","__wrappers__.is_valid_signature_encode_return"],"code":"memory[ap] = segments.add()","flow_tracking_data":{"ap_tracking":{"group":160,"offset":0},"reference_ids":{}}}]},"identifiers":{"__main__.ArgentModel":{"destination":"contracts.account.library.ArgentModel","type":"alias"},"__main__.CallArray":{"destination":"contracts.utils.calls.CallArray","type":"alias"},"__main__.Escape":{"destination":"contracts.account.library.Escape","type":"alias"},"__main__.HashBuiltin":{"destination":"starkware.cairo.common.cairo_builtins.HashBuiltin","type":"alias"},"__main__.NAME":{"type":"const","value":5.185236852902769e+30},"__main__.SignatureBuiltin":{"destination":"starkware.cairo.common.cairo_builtins.SignatureBuiltin","type":"alias"},"__main__.VERSION":{"type":"const","value":206933470771},"__main__.__execute__":{"decorators":["external","raw_output"],"pc":1335,"type":"function"},"__main__.__execute__.Args":{"full_name":"__main__.__execute__.Args","members":{"call_array":{"cairo_type":"contracts.utils.calls.CallArray*","offset":1},"call_array_len":{"cairo_type":"felt","offset":0},"calldata":{"cairo_type":"felt*","offset":3},"calldata_len":{"cairo_type":"felt","offset":2}},"size":4,"type":"struct"},"__main__.__execute__.ImplicitArgs":{"full_name":"__main__.__execute__.ImplicitArgs","members":{"ecdsa_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.SignatureBuiltin*","offset":2},"pedersen_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.HashBuiltin*","offset":1},"range_check_ptr":{"cairo_type":"felt","offset":3},"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":4,"type":"struct"},"__main__.__execute__.Return":{"cairo_type":"(retdata_size: felt, retdata: felt*)","type":"type_definition"},"__main__.__execute__.SIZEOF_LOCALS":{"type":"const","value":3},"__main__.__validate__":{"decorators":["external"],"pc":1186,"type":"function"},"__main__.__validate__.Args":{"full_name":"__main__.__validate__.Args","members":{"call_array":{"cairo_type":"contracts.utils.calls.CallArray*","offset":1},"call_array_len":{"cairo_type":"felt","offset":0},"calldata":{"cairo_type":"felt*","offset":3},"calldata_len":{"cairo_type":"felt","offset":2}},"size":4,"type":"struct"},"__main__.__validate__.ImplicitArgs":{"full_name":"__main__.__validate__.ImplicitArgs","members":{"ecdsa_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.SignatureBuiltin*","offset":2},"pedersen_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.HashBuiltin*","offset":1},"range_check_ptr":{"cairo_type":"felt","offset":3},"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":4,"type":"struct"},"__main__.__validate__.Return":{"cairo_type":"()","type":"type_definition"},"__main__.__validate__.SIZEOF_LOCALS":{"type":"const","value":4},"__main__.__validate_declare__":{"decorators":["external"],"pc":1407,"type":"function"},"__main__.__validate_declare__.Args":{"full_name":"__main__.__validate_declare__.Args","members":{"class_hash":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"__main__.__validate_declare__.ImplicitArgs":{"full_name":"__main__.__validate_declare__.ImplicitArgs","members":{"ecdsa_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.SignatureBuiltin*","offset":2},"pedersen_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.HashBuiltin*","offset":1},"range_check_ptr":{"cairo_type":"felt","offset":3},"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":4,"type":"struct"},"__main__.__validate_declare__.Return":{"cairo_type":"()","type":"type_definition"},"__main__.__validate_declare__.SIZEOF_LOCALS":{"type":"const","value":0},"__main__.__validate_deploy__":{"decorators":["raw_input","external"],"pc":1459,"type":"function"},"__main__.__validate_deploy__.Args":{"full_name":"__main__.__validate_deploy__.Args","members":{"calldata":{"cairo_type":"felt*","offset":2},"calldata_size":{"cairo_type":"felt","offset":1},"selector":{"cairo_type":"felt","offset":0}},"size":3,"type":"struct"},"__main__.__validate_deploy__.ImplicitArgs":{"full_name":"__main__.__validate_deploy__.ImplicitArgs","members":{"ecdsa_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.SignatureBuiltin*","offset":2},"pedersen_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.HashBuiltin*","offset":1},"range_check_ptr":{"cairo_type":"felt","offset":3},"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":4,"type":"struct"},"__main__.__validate_deploy__.Return":{"cairo_type":"()","type":"type_definition"},"__main__.__validate_deploy__.SIZEOF_LOCALS":{"type":"const","value":0},"__main__.account_created":{"type":"namespace"},"__main__.account_created.Args":{"full_name":"__main__.account_created.Args","members":{},"size":0,"type":"struct"},"__main__.account_created.ImplicitArgs":{"full_name":"__main__.account_created.ImplicitArgs","members":{},"size":0,"type":"struct"},"__main__.account_created.Return":{"cairo_type":"()","type":"type_definition"},"__main__.account_created.SELECTOR":{"type":"const","value":4.736927048530874e+74},"__main__.account_created.SIZEOF_LOCALS":{"type":"const","value":0},"__main__.account_created.alloc":{"destination":"starkware.cairo.common.alloc.alloc","type":"alias"},"__main__.account_created.emit":{"decorators":[],"pc":1125,"type":"function"},"__main__.account_created.emit.Args":{"full_name":"__main__.account_created.emit.Args","members":{"account":{"cairo_type":"felt","offset":0},"guardian":{"cairo_type":"felt","offset":2},"key":{"cairo_type":"felt","offset":1}},"size":3,"type":"struct"},"__main__.account_created.emit.ImplicitArgs":{"full_name":"__main__.account_created.emit.ImplicitArgs","members":{"range_check_ptr":{"cairo_type":"felt","offset":1},"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":2,"type":"struct"},"__main__.account_created.emit.Return":{"cairo_type":"()","type":"type_definition"},"__main__.account_created.emit.SIZEOF_LOCALS":{"type":"const","value":2},"__main__.account_created.emit_event":{"destination":"starkware.starknet.common.syscalls.emit_event","type":"alias"},"__main__.account_created.memcpy":{"destination":"starkware.cairo.common.memcpy.memcpy","type":"alias"},"__main__.alloc":{"destination":"starkware.cairo.common.alloc.alloc","type":"alias"},"__main__.assert_correct_tx_version":{"destination":"contracts.account.library.assert_correct_tx_version","type":"alias"},"__main__.assert_initialized":{"destination":"contracts.account.library.assert_initialized","type":"alias"},"__main__.assert_no_self_call":{"destination":"contracts.account.library.assert_no_self_call","type":"alias"},"__main__.assert_non_reentrant":{"destination":"contracts.account.library.assert_non_reentrant","type":"alias"},"__main__.assert_not_zero":{"destination":"starkware.cairo.common.math.assert_not_zero","type":"alias"},"__main__.assert_only_self":{"destination":"contracts.account.library.assert_only_self","type":"alias"},"__main__.cancelEscape":{"decorators":["external"],"pc":1928,"type":"function"},"__main__.cancelEscape.Args":{"full_name":"__main__.cancelEscape.Args","members":{},"size":0,"type":"struct"},"__main__.cancelEscape.ImplicitArgs":{"full_name":"__main__.cancelEscape.ImplicitArgs","members":{"pedersen_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.HashBuiltin*","offset":1},"range_check_ptr":{"cairo_type":"felt","offset":2},"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":3,"type":"struct"},"__main__.cancelEscape.Return":{"cairo_type":"()","type":"type_definition"},"__main__.cancelEscape.SIZEOF_LOCALS":{"type":"const","value":0},"__main__.changeGuardian":{"decorators":["external"],"pc":1832,"type":"function"},"__main__.changeGuardian.Args":{"full_name":"__main__.changeGuardian.Args","members":{"newGuardian":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"__main__.changeGuardian.ImplicitArgs":{"full_name":"__main__.changeGuardian.ImplicitArgs","members":{"pedersen_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.HashBuiltin*","offset":1},"range_check_ptr":{"cairo_type":"felt","offset":2},"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":3,"type":"struct"},"__main__.changeGuardian.Return":{"cairo_type":"()","type":"type_definition"},"__main__.changeGuardian.SIZEOF_LOCALS":{"type":"const","value":0},"__main__.changeGuardianBackup":{"decorators":["external"],"pc":1858,"type":"function"},"__main__.changeGuardianBackup.Args":{"full_name":"__main__.changeGuardianBackup.Args","members":{"newGuardian":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"__main__.changeGuardianBackup.ImplicitArgs":{"full_name":"__main__.changeGuardianBackup.ImplicitArgs","members":{"pedersen_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.HashBuiltin*","offset":1},"range_check_ptr":{"cairo_type":"felt","offset":2},"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":3,"type":"struct"},"__main__.changeGuardianBackup.Return":{"cairo_type":"()","type":"type_definition"},"__main__.changeGuardianBackup.SIZEOF_LOCALS":{"type":"const","value":0},"__main__.changeSigner":{"decorators":["external"],"pc":1806,"type":"function"},"__main__.changeSigner.Args":{"full_name":"__main__.changeSigner.Args","members":{"newSigner":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"__main__.changeSigner.ImplicitArgs":{"full_name":"__main__.changeSigner.ImplicitArgs","members":{"pedersen_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.HashBuiltin*","offset":1},"range_check_ptr":{"cairo_type":"felt","offset":2},"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":3,"type":"struct"},"__main__.changeSigner.Return":{"cairo_type":"()","type":"type_definition"},"__main__.changeSigner.SIZEOF_LOCALS":{"type":"const","value":0},"__main__.escapeGuardian":{"decorators":["external"],"pc":1950,"type":"function"},"__main__.escapeGuardian.Args":{"full_name":"__main__.escapeGuardian.Args","members":{"newGuardian":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"__main__.escapeGuardian.ImplicitArgs":{"full_name":"__main__.escapeGuardian.ImplicitArgs","members":{"pedersen_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.HashBuiltin*","offset":1},"range_check_ptr":{"cairo_type":"felt","offset":2},"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":3,"type":"struct"},"__main__.escapeGuardian.Return":{"cairo_type":"()","type":"type_definition"},"__main__.escapeGuardian.SIZEOF_LOCALS":{"type":"const","value":0},"__main__.escapeSigner":{"decorators":["external"],"pc":1976,"type":"function"},"__main__.escapeSigner.Args":{"full_name":"__main__.escapeSigner.Args","members":{"newSigner":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"__main__.escapeSigner.ImplicitArgs":{"full_name":"__main__.escapeSigner.ImplicitArgs","members":{"pedersen_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.HashBuiltin*","offset":1},"range_check_ptr":{"cairo_type":"felt","offset":2},"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":3,"type":"struct"},"__main__.escapeSigner.Return":{"cairo_type":"()","type":"type_definition"},"__main__.escapeSigner.SIZEOF_LOCALS":{"type":"const","value":0},"__main__.execute_after_upgrade":{"decorators":["external"],"pc":1718,"type":"function"},"__main__.execute_after_upgrade.Args":{"full_name":"__main__.execute_after_upgrade.Args","members":{"call_array":{"cairo_type":"contracts.utils.calls.CallArray*","offset":1},"call_array_len":{"cairo_type":"felt","offset":0},"calldata":{"cairo_type":"felt*","offset":3},"calldata_len":{"cairo_type":"felt","offset":2}},"size":4,"type":"struct"},"__main__.execute_after_upgrade.ImplicitArgs":{"full_name":"__main__.execute_after_upgrade.ImplicitArgs","members":{"pedersen_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.HashBuiltin*","offset":1},"range_check_ptr":{"cairo_type":"felt","offset":2},"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":3,"type":"struct"},"__main__.execute_after_upgrade.Return":{"cairo_type":"(retdata_len: felt, retdata: felt*)","type":"type_definition"},"__main__.execute_after_upgrade.SIZEOF_LOCALS":{"type":"const","value":1},"__main__.execute_call_array":{"destination":"contracts.utils.calls.execute_call_array","type":"alias"},"__main__.getEscape":{"decorators":["view"],"pc":2095,"type":"function"},"__main__.getEscape.Args":{"full_name":"__main__.getEscape.Args","members":{},"size":0,"type":"struct"},"__main__.getEscape.ImplicitArgs":{"full_name":"__main__.getEscape.ImplicitArgs","members":{"pedersen_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.HashBuiltin*","offset":1},"range_check_ptr":{"cairo_type":"felt","offset":2},"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":3,"type":"struct"},"__main__.getEscape.Return":{"cairo_type":"(activeAt: felt, type: felt)","type":"type_definition"},"__main__.getEscape.SIZEOF_LOCALS":{"type":"const","value":0},"__main__.getGuardian":{"decorators":["view"],"pc":2033,"type":"function"},"__main__.getGuardian.Args":{"full_name":"__main__.getGuardian.Args","members":{},"size":0,"type":"struct"},"__main__.getGuardian.ImplicitArgs":{"full_name":"__main__.getGuardian.ImplicitArgs","members":{"pedersen_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.HashBuiltin*","offset":1},"range_check_ptr":{"cairo_type":"felt","offset":2},"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":3,"type":"struct"},"__main__.getGuardian.Return":{"cairo_type":"(guardian: felt)","type":"type_definition"},"__main__.getGuardian.SIZEOF_LOCALS":{"type":"const","value":0},"__main__.getGuardianBackup":{"decorators":["view"],"pc":2064,"type":"function"},"__main__.getGuardianBackup.Args":{"full_name":"__main__.getGuardianBackup.Args","members":{},"size":0,"type":"struct"},"__main__.getGuardianBackup.ImplicitArgs":{"full_name":"__main__.getGuardianBackup.ImplicitArgs","members":{"pedersen_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.HashBuiltin*","offset":1},"range_check_ptr":{"cairo_type":"felt","offset":2},"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":3,"type":"struct"},"__main__.getGuardianBackup.Return":{"cairo_type":"(guardianBackup: felt)","type":"type_definition"},"__main__.getGuardianBackup.SIZEOF_LOCALS":{"type":"const","value":0},"__main__.getName":{"decorators":["view"],"pc":2152,"type":"function"},"__main__.getName.Args":{"full_name":"__main__.getName.Args","members":{},"size":0,"type":"struct"},"__main__.getName.ImplicitArgs":{"full_name":"__main__.getName.ImplicitArgs","members":{},"size":0,"type":"struct"},"__main__.getName.Return":{"cairo_type":"(name: felt)","type":"type_definition"},"__main__.getName.SIZEOF_LOCALS":{"type":"const","value":0},"__main__.getSigner":{"decorators":["view"],"pc":2002,"type":"function"},"__main__.getSigner.Args":{"full_name":"__main__.getSigner.Args","members":{},"size":0,"type":"struct"},"__main__.getSigner.ImplicitArgs":{"full_name":"__main__.getSigner.ImplicitArgs","members":{"pedersen_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.HashBuiltin*","offset":1},"range_check_ptr":{"cairo_type":"felt","offset":2},"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":3,"type":"struct"},"__main__.getSigner.Return":{"cairo_type":"(signer: felt)","type":"type_definition"},"__main__.getSigner.SIZEOF_LOCALS":{"type":"const","value":0},"__main__.getVersion":{"decorators":["view"],"pc":2127,"type":"function"},"__main__.getVersion.Args":{"full_name":"__main__.getVersion.Args","members":{},"size":0,"type":"struct"},"__main__.getVersion.ImplicitArgs":{"full_name":"__main__.getVersion.ImplicitArgs","members":{},"size":0,"type":"struct"},"__main__.getVersion.Return":{"cairo_type":"(version: felt)","type":"type_definition"},"__main__.getVersion.SIZEOF_LOCALS":{"type":"const","value":0},"__main__.get_contract_address":{"destination":"starkware.starknet.common.syscalls.get_contract_address","type":"alias"},"__main__.get_tx_info":{"destination":"starkware.starknet.common.syscalls.get_tx_info","type":"alias"},"__main__.initialize":{"decorators":["external"],"pc":1594,"type":"function"},"__main__.initialize.Args":{"full_name":"__main__.initialize.Args","members":{"guardian":{"cairo_type":"felt","offset":1},"signer":{"cairo_type":"felt","offset":0}},"size":2,"type":"struct"},"__main__.initialize.ImplicitArgs":{"full_name":"__main__.initialize.ImplicitArgs","members":{"pedersen_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.HashBuiltin*","offset":1},"range_check_ptr":{"cairo_type":"felt","offset":2},"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":3,"type":"struct"},"__main__.initialize.Return":{"cairo_type":"()","type":"type_definition"},"__main__.initialize.SIZEOF_LOCALS":{"type":"const","value":0},"__main__.isValidSignature":{"decorators":["view"],"pc":1510,"type":"function"},"__main__.isValidSignature.Args":{"full_name":"__main__.isValidSignature.Args","members":{"hash":{"cairo_type":"felt","offset":0},"sig":{"cairo_type":"felt*","offset":2},"sig_len":{"cairo_type":"felt","offset":1}},"size":3,"type":"struct"},"__main__.isValidSignature.ImplicitArgs":{"full_name":"__main__.isValidSignature.ImplicitArgs","members":{"ecdsa_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.SignatureBuiltin*","offset":2},"pedersen_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.HashBuiltin*","offset":1},"range_check_ptr":{"cairo_type":"felt","offset":3},"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":4,"type":"struct"},"__main__.isValidSignature.Return":{"cairo_type":"(isValid: felt)","type":"type_definition"},"__main__.isValidSignature.SIZEOF_LOCALS":{"type":"const","value":0},"__main__.is_valid_signature":{"decorators":["view"],"pc":2177,"type":"function"},"__main__.is_valid_signature.Args":{"full_name":"__main__.is_valid_signature.Args","members":{"hash":{"cairo_type":"felt","offset":0},"sig":{"cairo_type":"felt*","offset":2},"sig_len":{"cairo_type":"felt","offset":1}},"size":3,"type":"struct"},"__main__.is_valid_signature.ImplicitArgs":{"full_name":"__main__.is_valid_signature.ImplicitArgs","members":{"ecdsa_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.SignatureBuiltin*","offset":2},"pedersen_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.HashBuiltin*","offset":1},"range_check_ptr":{"cairo_type":"felt","offset":3},"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":4,"type":"struct"},"__main__.is_valid_signature.Return":{"cairo_type":"(is_valid: felt)","type":"type_definition"},"__main__.is_valid_signature.SIZEOF_LOCALS":{"type":"const","value":0},"__main__.library_call":{"destination":"starkware.starknet.common.syscalls.library_call","type":"alias"},"__main__.memcpy":{"destination":"starkware.cairo.common.memcpy.memcpy","type":"alias"},"__main__.supportsInterface":{"decorators":["view"],"pc":1559,"type":"function"},"__main__.supportsInterface.Args":{"full_name":"__main__.supportsInterface.Args","members":{"interfaceId":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"__main__.supportsInterface.ImplicitArgs":{"full_name":"__main__.supportsInterface.ImplicitArgs","members":{"pedersen_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.HashBuiltin*","offset":1},"range_check_ptr":{"cairo_type":"felt","offset":2},"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":3,"type":"struct"},"__main__.supportsInterface.Return":{"cairo_type":"(success: felt)","type":"type_definition"},"__main__.supportsInterface.SIZEOF_LOCALS":{"type":"const","value":0},"__main__.transaction_executed":{"type":"namespace"},"__main__.transaction_executed.Args":{"full_name":"__main__.transaction_executed.Args","members":{},"size":0,"type":"struct"},"__main__.transaction_executed.ImplicitArgs":{"full_name":"__main__.transaction_executed.ImplicitArgs","members":{},"size":0,"type":"struct"},"__main__.transaction_executed.Return":{"cairo_type":"()","type":"type_definition"},"__main__.transaction_executed.SELECTOR":{"type":"const","value":1.6050938450689777e+74},"__main__.transaction_executed.SIZEOF_LOCALS":{"type":"const","value":0},"__main__.transaction_executed.alloc":{"destination":"starkware.cairo.common.alloc.alloc","type":"alias"},"__main__.transaction_executed.emit":{"decorators":[],"pc":1151,"type":"function"},"__main__.transaction_executed.emit.Args":{"full_name":"__main__.transaction_executed.emit.Args","members":{"hash":{"cairo_type":"felt","offset":0},"response":{"cairo_type":"felt*","offset":2},"response_len":{"cairo_type":"felt","offset":1}},"size":3,"type":"struct"},"__main__.transaction_executed.emit.ImplicitArgs":{"full_name":"__main__.transaction_executed.emit.ImplicitArgs","members":{"range_check_ptr":{"cairo_type":"felt","offset":1},"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":2,"type":"struct"},"__main__.transaction_executed.emit.Return":{"cairo_type":"()","type":"type_definition"},"__main__.transaction_executed.emit.SIZEOF_LOCALS":{"type":"const","value":4},"__main__.transaction_executed.emit_event":{"destination":"starkware.starknet.common.syscalls.emit_event","type":"alias"},"__main__.transaction_executed.memcpy":{"destination":"starkware.cairo.common.memcpy.memcpy","type":"alias"},"__main__.triggerEscapeGuardian":{"decorators":["external"],"pc":1884,"type":"function"},"__main__.triggerEscapeGuardian.Args":{"full_name":"__main__.triggerEscapeGuardian.Args","members":{},"size":0,"type":"struct"},"__main__.triggerEscapeGuardian.ImplicitArgs":{"full_name":"__main__.triggerEscapeGuardian.ImplicitArgs","members":{"pedersen_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.HashBuiltin*","offset":1},"range_check_ptr":{"cairo_type":"felt","offset":2},"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":3,"type":"struct"},"__main__.triggerEscapeGuardian.Return":{"cairo_type":"()","type":"type_definition"},"__main__.triggerEscapeGuardian.SIZEOF_LOCALS":{"type":"const","value":0},"__main__.triggerEscapeSigner":{"decorators":["external"],"pc":1906,"type":"function"},"__main__.triggerEscapeSigner.Args":{"full_name":"__main__.triggerEscapeSigner.Args","members":{},"size":0,"type":"struct"},"__main__.triggerEscapeSigner.ImplicitArgs":{"full_name":"__main__.triggerEscapeSigner.ImplicitArgs","members":{"pedersen_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.HashBuiltin*","offset":1},"range_check_ptr":{"cairo_type":"felt","offset":2},"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":3,"type":"struct"},"__main__.triggerEscapeSigner.Return":{"cairo_type":"()","type":"type_definition"},"__main__.triggerEscapeSigner.SIZEOF_LOCALS":{"type":"const","value":0},"__main__.upgrade":{"decorators":["external"],"pc":1635,"type":"function"},"__main__.upgrade.Args":{"full_name":"__main__.upgrade.Args","members":{"calldata":{"cairo_type":"felt*","offset":2},"calldata_len":{"cairo_type":"felt","offset":1},"implementation":{"cairo_type":"felt","offset":0}},"size":3,"type":"struct"},"__main__.upgrade.ImplicitArgs":{"full_name":"__main__.upgrade.ImplicitArgs","members":{"pedersen_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.HashBuiltin*","offset":1},"range_check_ptr":{"cairo_type":"felt","offset":2},"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":3,"type":"struct"},"__main__.upgrade.Return":{"cairo_type":"(retdata_len: felt, retdata: felt*)","type":"type_definition"},"__main__.upgrade.SIZEOF_LOCALS":{"type":"const","value":0},"__wrappers__.__execute__":{"decorators":["external","raw_output"],"pc":1369,"type":"function"},"__wrappers__.__execute__.Args":{"full_name":"__wrappers__.__execute__.Args","members":{},"size":0,"type":"struct"},"__wrappers__.__execute__.ImplicitArgs":{"full_name":"__wrappers__.__execute__.ImplicitArgs","members":{},"size":0,"type":"struct"},"__wrappers__.__execute__.Return":{"cairo_type":"(syscall_ptr: felt*, pedersen_ptr: starkware.cairo.common.cairo_builtins.HashBuiltin*, range_check_ptr: felt, ecdsa_ptr: starkware.cairo.common.cairo_builtins.SignatureBuiltin*, size: felt, retdata: felt*)","type":"type_definition"},"__wrappers__.__execute__.SIZEOF_LOCALS":{"type":"const","value":0},"__wrappers__.__execute__.__wrapped_func":{"destination":"__main__.__execute__","type":"alias"},"__wrappers__.__execute___encode_return.memcpy":{"destination":"starkware.cairo.common.memcpy.memcpy","type":"alias"},"__wrappers__.__validate__":{"decorators":["external"],"pc":1294,"type":"function"},"__wrappers__.__validate__.Args":{"full_name":"__wrappers__.__validate__.Args","members":{},"size":0,"type":"struct"},"__wrappers__.__validate__.ImplicitArgs":{"full_name":"__wrappers__.__validate__.ImplicitArgs","members":{},"size":0,"type":"struct"},"__wrappers__.__validate__.Return":{"cairo_type":"(syscall_ptr: felt*, pedersen_ptr: starkware.cairo.common.cairo_builtins.HashBuiltin*, range_check_ptr: felt, ecdsa_ptr: starkware.cairo.common.cairo_builtins.SignatureBuiltin*, size: felt, retdata: felt*)","type":"type_definition"},"__wrappers__.__validate__.SIZEOF_LOCALS":{"type":"const","value":0},"__wrappers__.__validate__.__wrapped_func":{"destination":"__main__.__validate__","type":"alias"},"__wrappers__.__validate___encode_return.memcpy":{"destination":"starkware.cairo.common.memcpy.memcpy","type":"alias"},"__wrappers__.__validate_declare__":{"decorators":["external"],"pc":1439,"type":"function"},"__wrappers__.__validate_declare__.Args":{"full_name":"__wrappers__.__validate_declare__.Args","members":{},"size":0,"type":"struct"},"__wrappers__.__validate_declare__.ImplicitArgs":{"full_name":"__wrappers__.__validate_declare__.ImplicitArgs","members":{},"size":0,"type":"struct"},"__wrappers__.__validate_declare__.Return":{"cairo_type":"(syscall_ptr: felt*, pedersen_ptr: starkware.cairo.common.cairo_builtins.HashBuiltin*, range_check_ptr: felt, ecdsa_ptr: starkware.cairo.common.cairo_builtins.SignatureBuiltin*, size: felt, retdata: felt*)","type":"type_definition"},"__wrappers__.__validate_declare__.SIZEOF_LOCALS":{"type":"const","value":0},"__wrappers__.__validate_declare__.__wrapped_func":{"destination":"__main__.__validate_declare__","type":"alias"},"__wrappers__.__validate_declare___encode_return.memcpy":{"destination":"starkware.cairo.common.memcpy.memcpy","type":"alias"},"__wrappers__.__validate_deploy__":{"decorators":["raw_input","external"],"pc":1491,"type":"function"},"__wrappers__.__validate_deploy__.Args":{"full_name":"__wrappers__.__validate_deploy__.Args","members":{},"size":0,"type":"struct"},"__wrappers__.__validate_deploy__.ImplicitArgs":{"full_name":"__wrappers__.__validate_deploy__.ImplicitArgs","members":{},"size":0,"type":"struct"},"__wrappers__.__validate_deploy__.Return":{"cairo_type":"(syscall_ptr: felt*, pedersen_ptr: starkware.cairo.common.cairo_builtins.HashBuiltin*, range_check_ptr: felt, ecdsa_ptr: starkware.cairo.common.cairo_builtins.SignatureBuiltin*, size: felt, retdata: felt*)","type":"type_definition"},"__wrappers__.__validate_deploy__.SIZEOF_LOCALS":{"type":"const","value":0},"__wrappers__.__validate_deploy__.__wrapped_func":{"destination":"__main__.__validate_deploy__","type":"alias"},"__wrappers__.__validate_deploy___encode_return.memcpy":{"destination":"starkware.cairo.common.memcpy.memcpy","type":"alias"},"__wrappers__.cancelEscape":{"decorators":["external"],"pc":1934,"type":"function"},"__wrappers__.cancelEscape.Args":{"full_name":"__wrappers__.cancelEscape.Args","members":{},"size":0,"type":"struct"},"__wrappers__.cancelEscape.ImplicitArgs":{"full_name":"__wrappers__.cancelEscape.ImplicitArgs","members":{},"size":0,"type":"struct"},"__wrappers__.cancelEscape.Return":{"cairo_type":"(syscall_ptr: felt*, pedersen_ptr: starkware.cairo.common.cairo_builtins.HashBuiltin*, range_check_ptr: felt, ecdsa_ptr: felt, size: felt, retdata: felt*)","type":"type_definition"},"__wrappers__.cancelEscape.SIZEOF_LOCALS":{"type":"const","value":0},"__wrappers__.cancelEscape.__wrapped_func":{"destination":"__main__.cancelEscape","type":"alias"},"__wrappers__.cancelEscape_encode_return.memcpy":{"destination":"starkware.cairo.common.memcpy.memcpy","type":"alias"},"__wrappers__.changeGuardian":{"decorators":["external"],"pc":1839,"type":"function"},"__wrappers__.changeGuardian.Args":{"full_name":"__wrappers__.changeGuardian.Args","members":{},"size":0,"type":"struct"},"__wrappers__.changeGuardian.ImplicitArgs":{"full_name":"__wrappers__.changeGuardian.ImplicitArgs","members":{},"size":0,"type":"struct"},"__wrappers__.changeGuardian.Return":{"cairo_type":"(syscall_ptr: felt*, pedersen_ptr: starkware.cairo.common.cairo_builtins.HashBuiltin*, range_check_ptr: felt, ecdsa_ptr: felt, size: felt, retdata: felt*)","type":"type_definition"},"__wrappers__.changeGuardian.SIZEOF_LOCALS":{"type":"const","value":0},"__wrappers__.changeGuardian.__wrapped_func":{"destination":"__main__.changeGuardian","type":"alias"},"__wrappers__.changeGuardianBackup":{"decorators":["external"],"pc":1865,"type":"function"},"__wrappers__.changeGuardianBackup.Args":{"full_name":"__wrappers__.changeGuardianBackup.Args","members":{},"size":0,"type":"struct"},"__wrappers__.changeGuardianBackup.ImplicitArgs":{"full_name":"__wrappers__.changeGuardianBackup.ImplicitArgs","members":{},"size":0,"type":"struct"},"__wrappers__.changeGuardianBackup.Return":{"cairo_type":"(syscall_ptr: felt*, pedersen_ptr: starkware.cairo.common.cairo_builtins.HashBuiltin*, range_check_ptr: felt, ecdsa_ptr: felt, size: felt, retdata: felt*)","type":"type_definition"},"__wrappers__.changeGuardianBackup.SIZEOF_LOCALS":{"type":"const","value":0},"__wrappers__.changeGuardianBackup.__wrapped_func":{"destination":"__main__.changeGuardianBackup","type":"alias"},"__wrappers__.changeGuardianBackup_encode_return.memcpy":{"destination":"starkware.cairo.common.memcpy.memcpy","type":"alias"},"__wrappers__.changeGuardian_encode_return.memcpy":{"destination":"starkware.cairo.common.memcpy.memcpy","type":"alias"},"__wrappers__.changeSigner":{"decorators":["external"],"pc":1813,"type":"function"},"__wrappers__.changeSigner.Args":{"full_name":"__wrappers__.changeSigner.Args","members":{},"size":0,"type":"struct"},"__wrappers__.changeSigner.ImplicitArgs":{"full_name":"__wrappers__.changeSigner.ImplicitArgs","members":{},"size":0,"type":"struct"},"__wrappers__.changeSigner.Return":{"cairo_type":"(syscall_ptr: felt*, pedersen_ptr: starkware.cairo.common.cairo_builtins.HashBuiltin*, range_check_ptr: felt, ecdsa_ptr: felt, size: felt, retdata: felt*)","type":"type_definition"},"__wrappers__.changeSigner.SIZEOF_LOCALS":{"type":"const","value":0},"__wrappers__.changeSigner.__wrapped_func":{"destination":"__main__.changeSigner","type":"alias"},"__wrappers__.changeSigner_encode_return.memcpy":{"destination":"starkware.cairo.common.memcpy.memcpy","type":"alias"},"__wrappers__.escapeGuardian":{"decorators":["external"],"pc":1957,"type":"function"},"__wrappers__.escapeGuardian.Args":{"full_name":"__wrappers__.escapeGuardian.Args","members":{},"size":0,"type":"struct"},"__wrappers__.escapeGuardian.ImplicitArgs":{"full_name":"__wrappers__.escapeGuardian.ImplicitArgs","members":{},"size":0,"type":"struct"},"__wrappers__.escapeGuardian.Return":{"cairo_type":"(syscall_ptr: felt*, pedersen_ptr: starkware.cairo.common.cairo_builtins.HashBuiltin*, range_check_ptr: felt, ecdsa_ptr: felt, size: felt, retdata: felt*)","type":"type_definition"},"__wrappers__.escapeGuardian.SIZEOF_LOCALS":{"type":"const","value":0},"__wrappers__.escapeGuardian.__wrapped_func":{"destination":"__main__.escapeGuardian","type":"alias"},"__wrappers__.escapeGuardian_encode_return.memcpy":{"destination":"starkware.cairo.common.memcpy.memcpy","type":"alias"},"__wrappers__.escapeSigner":{"decorators":["external"],"pc":1983,"type":"function"},"__wrappers__.escapeSigner.Args":{"full_name":"__wrappers__.escapeSigner.Args","members":{},"size":0,"type":"struct"},"__wrappers__.escapeSigner.ImplicitArgs":{"full_name":"__wrappers__.escapeSigner.ImplicitArgs","members":{},"size":0,"type":"struct"},"__wrappers__.escapeSigner.Return":{"cairo_type":"(syscall_ptr: felt*, pedersen_ptr: starkware.cairo.common.cairo_builtins.HashBuiltin*, range_check_ptr: felt, ecdsa_ptr: felt, size: felt, retdata: felt*)","type":"type_definition"},"__wrappers__.escapeSigner.SIZEOF_LOCALS":{"type":"const","value":0},"__wrappers__.escapeSigner.__wrapped_func":{"destination":"__main__.escapeSigner","type":"alias"},"__wrappers__.escapeSigner_encode_return.memcpy":{"destination":"starkware.cairo.common.memcpy.memcpy","type":"alias"},"__wrappers__.execute_after_upgrade":{"decorators":["external"],"pc":1762,"type":"function"},"__wrappers__.execute_after_upgrade.Args":{"full_name":"__wrappers__.execute_after_upgrade.Args","members":{},"size":0,"type":"struct"},"__wrappers__.execute_after_upgrade.ImplicitArgs":{"full_name":"__wrappers__.execute_after_upgrade.ImplicitArgs","members":{},"size":0,"type":"struct"},"__wrappers__.execute_after_upgrade.Return":{"cairo_type":"(syscall_ptr: felt*, pedersen_ptr: starkware.cairo.common.cairo_builtins.HashBuiltin*, range_check_ptr: felt, ecdsa_ptr: felt, size: felt, retdata: felt*)","type":"type_definition"},"__wrappers__.execute_after_upgrade.SIZEOF_LOCALS":{"type":"const","value":2},"__wrappers__.execute_after_upgrade.__wrapped_func":{"destination":"__main__.execute_after_upgrade","type":"alias"},"__wrappers__.execute_after_upgrade_encode_return":{"decorators":[],"pc":1743,"type":"function"},"__wrappers__.execute_after_upgrade_encode_return.Args":{"full_name":"__wrappers__.execute_after_upgrade_encode_return.Args","members":{"range_check_ptr":{"cairo_type":"felt","offset":2},"ret_value":{"cairo_type":"(retdata_len: felt, retdata: felt*)","offset":0}},"size":3,"type":"struct"},"__wrappers__.execute_after_upgrade_encode_return.ImplicitArgs":{"full_name":"__wrappers__.execute_after_upgrade_encode_return.ImplicitArgs","members":{},"size":0,"type":"struct"},"__wrappers__.execute_after_upgrade_encode_return.Return":{"cairo_type":"(range_check_ptr: felt, data_len: felt, data: felt*)","type":"type_definition"},"__wrappers__.execute_after_upgrade_encode_return.SIZEOF_LOCALS":{"type":"const","value":3},"__wrappers__.execute_after_upgrade_encode_return.memcpy":{"destination":"starkware.cairo.common.memcpy.memcpy","type":"alias"},"__wrappers__.getEscape":{"decorators":["view"],"pc":2111,"type":"function"},"__wrappers__.getEscape.Args":{"full_name":"__wrappers__.getEscape.Args","members":{},"size":0,"type":"struct"},"__wrappers__.getEscape.ImplicitArgs":{"full_name":"__wrappers__.getEscape.ImplicitArgs","members":{},"size":0,"type":"struct"},"__wrappers__.getEscape.Return":{"cairo_type":"(syscall_ptr: felt*, pedersen_ptr: starkware.cairo.common.cairo_builtins.HashBuiltin*, range_check_ptr: felt, ecdsa_ptr: felt, size: felt, retdata: felt*)","type":"type_definition"},"__wrappers__.getEscape.SIZEOF_LOCALS":{"type":"const","value":0},"__wrappers__.getEscape.__wrapped_func":{"destination":"__main__.getEscape","type":"alias"},"__wrappers__.getEscape_encode_return":{"decorators":[],"pc":2101,"type":"function"},"__wrappers__.getEscape_encode_return.Args":{"full_name":"__wrappers__.getEscape_encode_return.Args","members":{"range_check_ptr":{"cairo_type":"felt","offset":2},"ret_value":{"cairo_type":"(activeAt: felt, type: felt)","offset":0}},"size":3,"type":"struct"},"__wrappers__.getEscape_encode_return.ImplicitArgs":{"full_name":"__wrappers__.getEscape_encode_return.ImplicitArgs","members":{},"size":0,"type":"struct"},"__wrappers__.getEscape_encode_return.Return":{"cairo_type":"(range_check_ptr: felt, data_len: felt, data: felt*)","type":"type_definition"},"__wrappers__.getEscape_encode_return.SIZEOF_LOCALS":{"type":"const","value":1},"__wrappers__.getEscape_encode_return.memcpy":{"destination":"starkware.cairo.common.memcpy.memcpy","type":"alias"},"__wrappers__.getGuardian":{"decorators":["view"],"pc":2048,"type":"function"},"__wrappers__.getGuardian.Args":{"full_name":"__wrappers__.getGuardian.Args","members":{},"size":0,"type":"struct"},"__wrappers__.getGuardian.ImplicitArgs":{"full_name":"__wrappers__.getGuardian.ImplicitArgs","members":{},"size":0,"type":"struct"},"__wrappers__.getGuardian.Return":{"cairo_type":"(syscall_ptr: felt*, pedersen_ptr: starkware.cairo.common.cairo_builtins.HashBuiltin*, range_check_ptr: felt, ecdsa_ptr: felt, size: felt, retdata: felt*)","type":"type_definition"},"__wrappers__.getGuardian.SIZEOF_LOCALS":{"type":"const","value":0},"__wrappers__.getGuardian.__wrapped_func":{"destination":"__main__.getGuardian","type":"alias"},"__wrappers__.getGuardianBackup":{"decorators":["view"],"pc":2079,"type":"function"},"__wrappers__.getGuardianBackup.Args":{"full_name":"__wrappers__.getGuardianBackup.Args","members":{},"size":0,"type":"struct"},"__wrappers__.getGuardianBackup.ImplicitArgs":{"full_name":"__wrappers__.getGuardianBackup.ImplicitArgs","members":{},"size":0,"type":"struct"},"__wrappers__.getGuardianBackup.Return":{"cairo_type":"(syscall_ptr: felt*, pedersen_ptr: starkware.cairo.common.cairo_builtins.HashBuiltin*, range_check_ptr: felt, ecdsa_ptr: felt, size: felt, retdata: felt*)","type":"type_definition"},"__wrappers__.getGuardianBackup.SIZEOF_LOCALS":{"type":"const","value":0},"__wrappers__.getGuardianBackup.__wrapped_func":{"destination":"__main__.getGuardianBackup","type":"alias"},"__wrappers__.getGuardianBackup_encode_return":{"decorators":[],"pc":2070,"type":"function"},"__wrappers__.getGuardianBackup_encode_return.Args":{"full_name":"__wrappers__.getGuardianBackup_encode_return.Args","members":{"range_check_ptr":{"cairo_type":"felt","offset":1},"ret_value":{"cairo_type":"(guardianBackup: felt)","offset":0}},"size":2,"type":"struct"},"__wrappers__.getGuardianBackup_encode_return.ImplicitArgs":{"full_name":"__wrappers__.getGuardianBackup_encode_return.ImplicitArgs","members":{},"size":0,"type":"struct"},"__wrappers__.getGuardianBackup_encode_return.Return":{"cairo_type":"(range_check_ptr: felt, data_len: felt, data: felt*)","type":"type_definition"},"__wrappers__.getGuardianBackup_encode_return.SIZEOF_LOCALS":{"type":"const","value":1},"__wrappers__.getGuardianBackup_encode_return.memcpy":{"destination":"starkware.cairo.common.memcpy.memcpy","type":"alias"},"__wrappers__.getGuardian_encode_return":{"decorators":[],"pc":2039,"type":"function"},"__wrappers__.getGuardian_encode_return.Args":{"full_name":"__wrappers__.getGuardian_encode_return.Args","members":{"range_check_ptr":{"cairo_type":"felt","offset":1},"ret_value":{"cairo_type":"(guardian: felt)","offset":0}},"size":2,"type":"struct"},"__wrappers__.getGuardian_encode_return.ImplicitArgs":{"full_name":"__wrappers__.getGuardian_encode_return.ImplicitArgs","members":{},"size":0,"type":"struct"},"__wrappers__.getGuardian_encode_return.Return":{"cairo_type":"(range_check_ptr: felt, data_len: felt, data: felt*)","type":"type_definition"},"__wrappers__.getGuardian_encode_return.SIZEOF_LOCALS":{"type":"const","value":1},"__wrappers__.getGuardian_encode_return.memcpy":{"destination":"starkware.cairo.common.memcpy.memcpy","type":"alias"},"__wrappers__.getName":{"decorators":["view"],"pc":2164,"type":"function"},"__wrappers__.getName.Args":{"full_name":"__wrappers__.getName.Args","members":{},"size":0,"type":"struct"},"__wrappers__.getName.ImplicitArgs":{"full_name":"__wrappers__.getName.ImplicitArgs","members":{},"size":0,"type":"struct"},"__wrappers__.getName.Return":{"cairo_type":"(syscall_ptr: felt, pedersen_ptr: felt, range_check_ptr: felt, ecdsa_ptr: felt, size: felt, retdata: felt*)","type":"type_definition"},"__wrappers__.getName.SIZEOF_LOCALS":{"type":"const","value":0},"__wrappers__.getName.__wrapped_func":{"destination":"__main__.getName","type":"alias"},"__wrappers__.getName_encode_return":{"decorators":[],"pc":2155,"type":"function"},"__wrappers__.getName_encode_return.Args":{"full_name":"__wrappers__.getName_encode_return.Args","members":{"range_check_ptr":{"cairo_type":"felt","offset":1},"ret_value":{"cairo_type":"(name: felt)","offset":0}},"size":2,"type":"struct"},"__wrappers__.getName_encode_return.ImplicitArgs":{"full_name":"__wrappers__.getName_encode_return.ImplicitArgs","members":{},"size":0,"type":"struct"},"__wrappers__.getName_encode_return.Return":{"cairo_type":"(range_check_ptr: felt, data_len: felt, data: felt*)","type":"type_definition"},"__wrappers__.getName_encode_return.SIZEOF_LOCALS":{"type":"const","value":1},"__wrappers__.getName_encode_return.memcpy":{"destination":"starkware.cairo.common.memcpy.memcpy","type":"alias"},"__wrappers__.getSigner":{"decorators":["view"],"pc":2017,"type":"function"},"__wrappers__.getSigner.Args":{"full_name":"__wrappers__.getSigner.Args","members":{},"size":0,"type":"struct"},"__wrappers__.getSigner.ImplicitArgs":{"full_name":"__wrappers__.getSigner.ImplicitArgs","members":{},"size":0,"type":"struct"},"__wrappers__.getSigner.Return":{"cairo_type":"(syscall_ptr: felt*, pedersen_ptr: starkware.cairo.common.cairo_builtins.HashBuiltin*, range_check_ptr: felt, ecdsa_ptr: felt, size: felt, retdata: felt*)","type":"type_definition"},"__wrappers__.getSigner.SIZEOF_LOCALS":{"type":"const","value":0},"__wrappers__.getSigner.__wrapped_func":{"destination":"__main__.getSigner","type":"alias"},"__wrappers__.getSigner_encode_return":{"decorators":[],"pc":2008,"type":"function"},"__wrappers__.getSigner_encode_return.Args":{"full_name":"__wrappers__.getSigner_encode_return.Args","members":{"range_check_ptr":{"cairo_type":"felt","offset":1},"ret_value":{"cairo_type":"(signer: felt)","offset":0}},"size":2,"type":"struct"},"__wrappers__.getSigner_encode_return.ImplicitArgs":{"full_name":"__wrappers__.getSigner_encode_return.ImplicitArgs","members":{},"size":0,"type":"struct"},"__wrappers__.getSigner_encode_return.Return":{"cairo_type":"(range_check_ptr: felt, data_len: felt, data: felt*)","type":"type_definition"},"__wrappers__.getSigner_encode_return.SIZEOF_LOCALS":{"type":"const","value":1},"__wrappers__.getSigner_encode_return.memcpy":{"destination":"starkware.cairo.common.memcpy.memcpy","type":"alias"},"__wrappers__.getVersion":{"decorators":["view"],"pc":2139,"type":"function"},"__wrappers__.getVersion.Args":{"full_name":"__wrappers__.getVersion.Args","members":{},"size":0,"type":"struct"},"__wrappers__.getVersion.ImplicitArgs":{"full_name":"__wrappers__.getVersion.ImplicitArgs","members":{},"size":0,"type":"struct"},"__wrappers__.getVersion.Return":{"cairo_type":"(syscall_ptr: felt, pedersen_ptr: felt, range_check_ptr: felt, ecdsa_ptr: felt, size: felt, retdata: felt*)","type":"type_definition"},"__wrappers__.getVersion.SIZEOF_LOCALS":{"type":"const","value":0},"__wrappers__.getVersion.__wrapped_func":{"destination":"__main__.getVersion","type":"alias"},"__wrappers__.getVersion_encode_return":{"decorators":[],"pc":2130,"type":"function"},"__wrappers__.getVersion_encode_return.Args":{"full_name":"__wrappers__.getVersion_encode_return.Args","members":{"range_check_ptr":{"cairo_type":"felt","offset":1},"ret_value":{"cairo_type":"(version: felt)","offset":0}},"size":2,"type":"struct"},"__wrappers__.getVersion_encode_return.ImplicitArgs":{"full_name":"__wrappers__.getVersion_encode_return.ImplicitArgs","members":{},"size":0,"type":"struct"},"__wrappers__.getVersion_encode_return.Return":{"cairo_type":"(range_check_ptr: felt, data_len: felt, data: felt*)","type":"type_definition"},"__wrappers__.getVersion_encode_return.SIZEOF_LOCALS":{"type":"const","value":1},"__wrappers__.getVersion_encode_return.memcpy":{"destination":"starkware.cairo.common.memcpy.memcpy","type":"alias"},"__wrappers__.initialize":{"decorators":["external"],"pc":1615,"type":"function"},"__wrappers__.initialize.Args":{"full_name":"__wrappers__.initialize.Args","members":{},"size":0,"type":"struct"},"__wrappers__.initialize.ImplicitArgs":{"full_name":"__wrappers__.initialize.ImplicitArgs","members":{},"size":0,"type":"struct"},"__wrappers__.initialize.Return":{"cairo_type":"(syscall_ptr: felt*, pedersen_ptr: starkware.cairo.common.cairo_builtins.HashBuiltin*, range_check_ptr: felt, ecdsa_ptr: felt, size: felt, retdata: felt*)","type":"type_definition"},"__wrappers__.initialize.SIZEOF_LOCALS":{"type":"const","value":0},"__wrappers__.initialize.__wrapped_func":{"destination":"__main__.initialize","type":"alias"},"__wrappers__.initialize_encode_return.memcpy":{"destination":"starkware.cairo.common.memcpy.memcpy","type":"alias"},"__wrappers__.isValidSignature":{"decorators":["view"],"pc":1529,"type":"function"},"__wrappers__.isValidSignature.Args":{"full_name":"__wrappers__.isValidSignature.Args","members":{},"size":0,"type":"struct"},"__wrappers__.isValidSignature.ImplicitArgs":{"full_name":"__wrappers__.isValidSignature.ImplicitArgs","members":{},"size":0,"type":"struct"},"__wrappers__.isValidSignature.Return":{"cairo_type":"(syscall_ptr: felt*, pedersen_ptr: starkware.cairo.common.cairo_builtins.HashBuiltin*, range_check_ptr: felt, ecdsa_ptr: starkware.cairo.common.cairo_builtins.SignatureBuiltin*, size: felt, retdata: felt*)","type":"type_definition"},"__wrappers__.isValidSignature.SIZEOF_LOCALS":{"type":"const","value":0},"__wrappers__.isValidSignature.__wrapped_func":{"destination":"__main__.isValidSignature","type":"alias"},"__wrappers__.isValidSignature_encode_return":{"decorators":[],"pc":1520,"type":"function"},"__wrappers__.isValidSignature_encode_return.Args":{"full_name":"__wrappers__.isValidSignature_encode_return.Args","members":{"range_check_ptr":{"cairo_type":"felt","offset":1},"ret_value":{"cairo_type":"(isValid: felt)","offset":0}},"size":2,"type":"struct"},"__wrappers__.isValidSignature_encode_return.ImplicitArgs":{"full_name":"__wrappers__.isValidSignature_encode_return.ImplicitArgs","members":{},"size":0,"type":"struct"},"__wrappers__.isValidSignature_encode_return.Return":{"cairo_type":"(range_check_ptr: felt, data_len: felt, data: felt*)","type":"type_definition"},"__wrappers__.isValidSignature_encode_return.SIZEOF_LOCALS":{"type":"const","value":1},"__wrappers__.isValidSignature_encode_return.memcpy":{"destination":"starkware.cairo.common.memcpy.memcpy","type":"alias"},"__wrappers__.is_valid_signature":{"decorators":["view"],"pc":2196,"type":"function"},"__wrappers__.is_valid_signature.Args":{"full_name":"__wrappers__.is_valid_signature.Args","members":{},"size":0,"type":"struct"},"__wrappers__.is_valid_signature.ImplicitArgs":{"full_name":"__wrappers__.is_valid_signature.ImplicitArgs","members":{},"size":0,"type":"struct"},"__wrappers__.is_valid_signature.Return":{"cairo_type":"(syscall_ptr: felt*, pedersen_ptr: starkware.cairo.common.cairo_builtins.HashBuiltin*, range_check_ptr: felt, ecdsa_ptr: starkware.cairo.common.cairo_builtins.SignatureBuiltin*, size: felt, retdata: felt*)","type":"type_definition"},"__wrappers__.is_valid_signature.SIZEOF_LOCALS":{"type":"const","value":0},"__wrappers__.is_valid_signature.__wrapped_func":{"destination":"__main__.is_valid_signature","type":"alias"},"__wrappers__.is_valid_signature_encode_return":{"decorators":[],"pc":2187,"type":"function"},"__wrappers__.is_valid_signature_encode_return.Args":{"full_name":"__wrappers__.is_valid_signature_encode_return.Args","members":{"range_check_ptr":{"cairo_type":"felt","offset":1},"ret_value":{"cairo_type":"(is_valid: felt)","offset":0}},"size":2,"type":"struct"},"__wrappers__.is_valid_signature_encode_return.ImplicitArgs":{"full_name":"__wrappers__.is_valid_signature_encode_return.ImplicitArgs","members":{},"size":0,"type":"struct"},"__wrappers__.is_valid_signature_encode_return.Return":{"cairo_type":"(range_check_ptr: felt, data_len: felt, data: felt*)","type":"type_definition"},"__wrappers__.is_valid_signature_encode_return.SIZEOF_LOCALS":{"type":"const","value":1},"__wrappers__.is_valid_signature_encode_return.memcpy":{"destination":"starkware.cairo.common.memcpy.memcpy","type":"alias"},"__wrappers__.supportsInterface":{"decorators":["view"],"pc":1575,"type":"function"},"__wrappers__.supportsInterface.Args":{"full_name":"__wrappers__.supportsInterface.Args","members":{},"size":0,"type":"struct"},"__wrappers__.supportsInterface.ImplicitArgs":{"full_name":"__wrappers__.supportsInterface.ImplicitArgs","members":{},"size":0,"type":"struct"},"__wrappers__.supportsInterface.Return":{"cairo_type":"(syscall_ptr: felt*, pedersen_ptr: starkware.cairo.common.cairo_builtins.HashBuiltin*, range_check_ptr: felt, ecdsa_ptr: felt, size: felt, retdata: felt*)","type":"type_definition"},"__wrappers__.supportsInterface.SIZEOF_LOCALS":{"type":"const","value":0},"__wrappers__.supportsInterface.__wrapped_func":{"destination":"__main__.supportsInterface","type":"alias"},"__wrappers__.supportsInterface_encode_return":{"decorators":[],"pc":1566,"type":"function"},"__wrappers__.supportsInterface_encode_return.Args":{"full_name":"__wrappers__.supportsInterface_encode_return.Args","members":{"range_check_ptr":{"cairo_type":"felt","offset":1},"ret_value":{"cairo_type":"(success: felt)","offset":0}},"size":2,"type":"struct"},"__wrappers__.supportsInterface_encode_return.ImplicitArgs":{"full_name":"__wrappers__.supportsInterface_encode_return.ImplicitArgs","members":{},"size":0,"type":"struct"},"__wrappers__.supportsInterface_encode_return.Return":{"cairo_type":"(range_check_ptr: felt, data_len: felt, data: felt*)","type":"type_definition"},"__wrappers__.supportsInterface_encode_return.SIZEOF_LOCALS":{"type":"const","value":1},"__wrappers__.supportsInterface_encode_return.memcpy":{"destination":"starkware.cairo.common.memcpy.memcpy","type":"alias"},"__wrappers__.triggerEscapeGuardian":{"decorators":["external"],"pc":1890,"type":"function"},"__wrappers__.triggerEscapeGuardian.Args":{"full_name":"__wrappers__.triggerEscapeGuardian.Args","members":{},"size":0,"type":"struct"},"__wrappers__.triggerEscapeGuardian.ImplicitArgs":{"full_name":"__wrappers__.triggerEscapeGuardian.ImplicitArgs","members":{},"size":0,"type":"struct"},"__wrappers__.triggerEscapeGuardian.Return":{"cairo_type":"(syscall_ptr: felt*, pedersen_ptr: starkware.cairo.common.cairo_builtins.HashBuiltin*, range_check_ptr: felt, ecdsa_ptr: felt, size: felt, retdata: felt*)","type":"type_definition"},"__wrappers__.triggerEscapeGuardian.SIZEOF_LOCALS":{"type":"const","value":0},"__wrappers__.triggerEscapeGuardian.__wrapped_func":{"destination":"__main__.triggerEscapeGuardian","type":"alias"},"__wrappers__.triggerEscapeGuardian_encode_return.memcpy":{"destination":"starkware.cairo.common.memcpy.memcpy","type":"alias"},"__wrappers__.triggerEscapeSigner":{"decorators":["external"],"pc":1912,"type":"function"},"__wrappers__.triggerEscapeSigner.Args":{"full_name":"__wrappers__.triggerEscapeSigner.Args","members":{},"size":0,"type":"struct"},"__wrappers__.triggerEscapeSigner.ImplicitArgs":{"full_name":"__wrappers__.triggerEscapeSigner.ImplicitArgs","members":{},"size":0,"type":"struct"},"__wrappers__.triggerEscapeSigner.Return":{"cairo_type":"(syscall_ptr: felt*, pedersen_ptr: starkware.cairo.common.cairo_builtins.HashBuiltin*, range_check_ptr: felt, ecdsa_ptr: felt, size: felt, retdata: felt*)","type":"type_definition"},"__wrappers__.triggerEscapeSigner.SIZEOF_LOCALS":{"type":"const","value":0},"__wrappers__.triggerEscapeSigner.__wrapped_func":{"destination":"__main__.triggerEscapeSigner","type":"alias"},"__wrappers__.triggerEscapeSigner_encode_return.memcpy":{"destination":"starkware.cairo.common.memcpy.memcpy","type":"alias"},"__wrappers__.upgrade":{"decorators":["external"],"pc":1685,"type":"function"},"__wrappers__.upgrade.Args":{"full_name":"__wrappers__.upgrade.Args","members":{},"size":0,"type":"struct"},"__wrappers__.upgrade.ImplicitArgs":{"full_name":"__wrappers__.upgrade.ImplicitArgs","members":{},"size":0,"type":"struct"},"__wrappers__.upgrade.Return":{"cairo_type":"(syscall_ptr: felt*, pedersen_ptr: starkware.cairo.common.cairo_builtins.HashBuiltin*, range_check_ptr: felt, ecdsa_ptr: felt, size: felt, retdata: felt*)","type":"type_definition"},"__wrappers__.upgrade.SIZEOF_LOCALS":{"type":"const","value":2},"__wrappers__.upgrade.__wrapped_func":{"destination":"__main__.upgrade","type":"alias"},"__wrappers__.upgrade_encode_return":{"decorators":[],"pc":1666,"type":"function"},"__wrappers__.upgrade_encode_return.Args":{"full_name":"__wrappers__.upgrade_encode_return.Args","members":{"range_check_ptr":{"cairo_type":"felt","offset":2},"ret_value":{"cairo_type":"(retdata_len: felt, retdata: felt*)","offset":0}},"size":3,"type":"struct"},"__wrappers__.upgrade_encode_return.ImplicitArgs":{"full_name":"__wrappers__.upgrade_encode_return.ImplicitArgs","members":{},"size":0,"type":"struct"},"__wrappers__.upgrade_encode_return.Return":{"cairo_type":"(range_check_ptr: felt, data_len: felt, data: felt*)","type":"type_definition"},"__wrappers__.upgrade_encode_return.SIZEOF_LOCALS":{"type":"const","value":3},"__wrappers__.upgrade_encode_return.memcpy":{"destination":"starkware.cairo.common.memcpy.memcpy","type":"alias"},"contracts.account.library.ArgentModel":{"type":"namespace"},"contracts.account.library.ArgentModel.Args":{"full_name":"contracts.account.library.ArgentModel.Args","members":{},"size":0,"type":"struct"},"contracts.account.library.ArgentModel.CANCEL_ESCAPE_SELECTOR":{"type":"const","value":1.387988583969095e+75},"contracts.account.library.ArgentModel.CHANGE_GUARDIAN_SELECTOR":{"type":"const","value":1.296071702357547e+75},"contracts.account.library.ArgentModel.CHANGE_SIGNER_SELECTOR":{"type":"const","value":1.7457212853032857e+74},"contracts.account.library.ArgentModel.ESCAPE_GUARDIAN_SELECTOR":{"type":"const","value":5.107569515290791e+74},"contracts.account.library.ArgentModel.ESCAPE_SECURITY_PERIOD":{"type":"const","value":604800},"contracts.account.library.ArgentModel.ESCAPE_SIGNER_SELECTOR":{"type":"const","value":1.455116469465411e+75},"contracts.account.library.ArgentModel.ESCAPE_TYPE_GUARDIAN":{"type":"const","value":1},"contracts.account.library.ArgentModel.ESCAPE_TYPE_SIGNER":{"type":"const","value":2},"contracts.account.library.ArgentModel.EXECUTE_AFTER_UPGRADE_SELECTOR":{"type":"const","value":7.383496673403602e+74},"contracts.account.library.ArgentModel.ImplicitArgs":{"full_name":"contracts.account.library.ArgentModel.ImplicitArgs","members":{},"size":0,"type":"struct"},"contracts.account.library.ArgentModel.Return":{"cairo_type":"()","type":"type_definition"},"contracts.account.library.ArgentModel.SIZEOF_LOCALS":{"type":"const","value":0},"contracts.account.library.ArgentModel.TRIGGER_ESCAPE_GUARDIAN_SELECTOR":{"type":"const","value":1.45954635736934e+74},"contracts.account.library.ArgentModel.TRIGGER_ESCAPE_SIGNER_SELECTOR":{"type":"const","value":4.408534732554861e+74},"contracts.account.library.ArgentModel.cancel_escape":{"decorators":[],"pc":823,"type":"function"},"contracts.account.library.ArgentModel.cancel_escape.Args":{"full_name":"contracts.account.library.ArgentModel.cancel_escape.Args","members":{},"size":0,"type":"struct"},"contracts.account.library.ArgentModel.cancel_escape.ImplicitArgs":{"full_name":"contracts.account.library.ArgentModel.cancel_escape.ImplicitArgs","members":{"pedersen_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.HashBuiltin*","offset":1},"range_check_ptr":{"cairo_type":"felt","offset":2},"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":3,"type":"struct"},"contracts.account.library.ArgentModel.cancel_escape.Return":{"cairo_type":"()","type":"type_definition"},"contracts.account.library.ArgentModel.cancel_escape.SIZEOF_LOCALS":{"type":"const","value":0},"contracts.account.library.ArgentModel.change_guardian":{"decorators":[],"pc":711,"type":"function"},"contracts.account.library.ArgentModel.change_guardian.Args":{"full_name":"contracts.account.library.ArgentModel.change_guardian.Args","members":{"new_guardian":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"contracts.account.library.ArgentModel.change_guardian.ImplicitArgs":{"full_name":"contracts.account.library.ArgentModel.change_guardian.ImplicitArgs","members":{"pedersen_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.HashBuiltin*","offset":1},"range_check_ptr":{"cairo_type":"felt","offset":2},"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":3,"type":"struct"},"contracts.account.library.ArgentModel.change_guardian.Return":{"cairo_type":"()","type":"type_definition"},"contracts.account.library.ArgentModel.change_guardian.SIZEOF_LOCALS":{"type":"const","value":0},"contracts.account.library.ArgentModel.change_guardian_backup":{"decorators":[],"pc":739,"type":"function"},"contracts.account.library.ArgentModel.change_guardian_backup.Args":{"full_name":"contracts.account.library.ArgentModel.change_guardian_backup.Args","members":{"new_guardian":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"contracts.account.library.ArgentModel.change_guardian_backup.ImplicitArgs":{"full_name":"contracts.account.library.ArgentModel.change_guardian_backup.ImplicitArgs","members":{"pedersen_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.HashBuiltin*","offset":1},"range_check_ptr":{"cairo_type":"felt","offset":2},"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":3,"type":"struct"},"contracts.account.library.ArgentModel.change_guardian_backup.Return":{"cairo_type":"()","type":"type_definition"},"contracts.account.library.ArgentModel.change_guardian_backup.SIZEOF_LOCALS":{"type":"const","value":0},"contracts.account.library.ArgentModel.change_signer":{"decorators":[],"pc":690,"type":"function"},"contracts.account.library.ArgentModel.change_signer.Args":{"full_name":"contracts.account.library.ArgentModel.change_signer.Args","members":{"new_signer":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"contracts.account.library.ArgentModel.change_signer.ImplicitArgs":{"full_name":"contracts.account.library.ArgentModel.change_signer.ImplicitArgs","members":{"pedersen_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.HashBuiltin*","offset":1},"range_check_ptr":{"cairo_type":"felt","offset":2},"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":3,"type":"struct"},"contracts.account.library.ArgentModel.change_signer.Return":{"cairo_type":"()","type":"type_definition"},"contracts.account.library.ArgentModel.change_signer.SIZEOF_LOCALS":{"type":"const","value":0},"contracts.account.library.ArgentModel.escape_guardian":{"decorators":[],"pc":850,"type":"function"},"contracts.account.library.ArgentModel.escape_guardian.Args":{"full_name":"contracts.account.library.ArgentModel.escape_guardian.Args","members":{"new_guardian":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"contracts.account.library.ArgentModel.escape_guardian.ImplicitArgs":{"full_name":"contracts.account.library.ArgentModel.escape_guardian.ImplicitArgs","members":{"pedersen_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.HashBuiltin*","offset":1},"range_check_ptr":{"cairo_type":"felt","offset":2},"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":3,"type":"struct"},"contracts.account.library.ArgentModel.escape_guardian.Return":{"cairo_type":"()","type":"type_definition"},"contracts.account.library.ArgentModel.escape_guardian.SIZEOF_LOCALS":{"type":"const","value":0},"contracts.account.library.ArgentModel.escape_signer":{"decorators":[],"pc":901,"type":"function"},"contracts.account.library.ArgentModel.escape_signer.Args":{"full_name":"contracts.account.library.ArgentModel.escape_signer.Args","members":{"new_signer":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"contracts.account.library.ArgentModel.escape_signer.ImplicitArgs":{"full_name":"contracts.account.library.ArgentModel.escape_signer.ImplicitArgs","members":{"pedersen_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.HashBuiltin*","offset":1},"range_check_ptr":{"cairo_type":"felt","offset":2},"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":3,"type":"struct"},"contracts.account.library.ArgentModel.escape_signer.Return":{"cairo_type":"()","type":"type_definition"},"contracts.account.library.ArgentModel.escape_signer.SIZEOF_LOCALS":{"type":"const","value":0},"contracts.account.library.ArgentModel.get_escape":{"decorators":[],"pc":1035,"type":"function"},"contracts.account.library.ArgentModel.get_escape.Args":{"full_name":"contracts.account.library.ArgentModel.get_escape.Args","members":{},"size":0,"type":"struct"},"contracts.account.library.ArgentModel.get_escape.ImplicitArgs":{"full_name":"contracts.account.library.ArgentModel.get_escape.ImplicitArgs","members":{"pedersen_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.HashBuiltin*","offset":1},"range_check_ptr":{"cairo_type":"felt","offset":2},"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":3,"type":"struct"},"contracts.account.library.ArgentModel.get_escape.Return":{"cairo_type":"(active_at: felt, type: felt)","type":"type_definition"},"contracts.account.library.ArgentModel.get_escape.SIZEOF_LOCALS":{"type":"const","value":0},"contracts.account.library.ArgentModel.get_guardian":{"decorators":[],"pc":1023,"type":"function"},"contracts.account.library.ArgentModel.get_guardian.Args":{"full_name":"contracts.account.library.ArgentModel.get_guardian.Args","members":{},"size":0,"type":"struct"},"contracts.account.library.ArgentModel.get_guardian.ImplicitArgs":{"full_name":"contracts.account.library.ArgentModel.get_guardian.ImplicitArgs","members":{"pedersen_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.HashBuiltin*","offset":1},"range_check_ptr":{"cairo_type":"felt","offset":2},"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":3,"type":"struct"},"contracts.account.library.ArgentModel.get_guardian.Return":{"cairo_type":"(guardian: felt)","type":"type_definition"},"contracts.account.library.ArgentModel.get_guardian.SIZEOF_LOCALS":{"type":"const","value":0},"contracts.account.library.ArgentModel.get_guardian_backup":{"decorators":[],"pc":1029,"type":"function"},"contracts.account.library.ArgentModel.get_guardian_backup.Args":{"full_name":"contracts.account.library.ArgentModel.get_guardian_backup.Args","members":{},"size":0,"type":"struct"},"contracts.account.library.ArgentModel.get_guardian_backup.ImplicitArgs":{"full_name":"contracts.account.library.ArgentModel.get_guardian_backup.ImplicitArgs","members":{"pedersen_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.HashBuiltin*","offset":1},"range_check_ptr":{"cairo_type":"felt","offset":2},"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":3,"type":"struct"},"contracts.account.library.ArgentModel.get_guardian_backup.Return":{"cairo_type":"(guardian_backup: felt)","type":"type_definition"},"contracts.account.library.ArgentModel.get_guardian_backup.SIZEOF_LOCALS":{"type":"const","value":0},"contracts.account.library.ArgentModel.get_signer":{"decorators":[],"pc":1017,"type":"function"},"contracts.account.library.ArgentModel.get_signer.Args":{"full_name":"contracts.account.library.ArgentModel.get_signer.Args","members":{},"size":0,"type":"struct"},"contracts.account.library.ArgentModel.get_signer.ImplicitArgs":{"full_name":"contracts.account.library.ArgentModel.get_signer.ImplicitArgs","members":{"pedersen_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.HashBuiltin*","offset":1},"range_check_ptr":{"cairo_type":"felt","offset":2},"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":3,"type":"struct"},"contracts.account.library.ArgentModel.get_signer.Return":{"cairo_type":"(signer: felt)","type":"type_definition"},"contracts.account.library.ArgentModel.get_signer.SIZEOF_LOCALS":{"type":"const","value":0},"contracts.account.library.ArgentModel.initialize":{"decorators":[],"pc":633,"type":"function"},"contracts.account.library.ArgentModel.initialize.Args":{"full_name":"contracts.account.library.ArgentModel.initialize.Args","members":{"guardian":{"cairo_type":"felt","offset":1},"signer":{"cairo_type":"felt","offset":0}},"size":2,"type":"struct"},"contracts.account.library.ArgentModel.initialize.ImplicitArgs":{"full_name":"contracts.account.library.ArgentModel.initialize.ImplicitArgs","members":{"pedersen_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.HashBuiltin*","offset":1},"range_check_ptr":{"cairo_type":"felt","offset":2},"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":3,"type":"struct"},"contracts.account.library.ArgentModel.initialize.Return":{"cairo_type":"()","type":"type_definition"},"contracts.account.library.ArgentModel.initialize.SIZEOF_LOCALS":{"type":"const","value":0},"contracts.account.library.ArgentModel.is_valid_signature":{"decorators":[],"pc":952,"type":"function"},"contracts.account.library.ArgentModel.is_valid_signature.Args":{"full_name":"contracts.account.library.ArgentModel.is_valid_signature.Args","members":{"hash":{"cairo_type":"felt","offset":0},"sig":{"cairo_type":"felt*","offset":2},"sig_len":{"cairo_type":"felt","offset":1}},"size":3,"type":"struct"},"contracts.account.library.ArgentModel.is_valid_signature.ImplicitArgs":{"full_name":"contracts.account.library.ArgentModel.is_valid_signature.ImplicitArgs","members":{"ecdsa_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.SignatureBuiltin*","offset":2},"pedersen_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.HashBuiltin*","offset":1},"range_check_ptr":{"cairo_type":"felt","offset":3},"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":4,"type":"struct"},"contracts.account.library.ArgentModel.is_valid_signature.Return":{"cairo_type":"(is_valid: felt)","type":"type_definition"},"contracts.account.library.ArgentModel.is_valid_signature.SIZEOF_LOCALS":{"type":"const","value":1},"contracts.account.library.ArgentModel.supports_interface":{"decorators":[],"pc":981,"type":"function"},"contracts.account.library.ArgentModel.supports_interface.Args":{"full_name":"contracts.account.library.ArgentModel.supports_interface.Args","members":{"interface_id":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"contracts.account.library.ArgentModel.supports_interface.ImplicitArgs":{"full_name":"contracts.account.library.ArgentModel.supports_interface.ImplicitArgs","members":{"pedersen_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.HashBuiltin*","offset":1},"range_check_ptr":{"cairo_type":"felt","offset":2},"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":3,"type":"struct"},"contracts.account.library.ArgentModel.supports_interface.Return":{"cairo_type":"(success: felt)","type":"type_definition"},"contracts.account.library.ArgentModel.supports_interface.SIZEOF_LOCALS":{"type":"const","value":0},"contracts.account.library.ArgentModel.trigger_escape_guardian":{"decorators":[],"pc":758,"type":"function"},"contracts.account.library.ArgentModel.trigger_escape_guardian.Args":{"full_name":"contracts.account.library.ArgentModel.trigger_escape_guardian.Args","members":{},"size":0,"type":"struct"},"contracts.account.library.ArgentModel.trigger_escape_guardian.ImplicitArgs":{"full_name":"contracts.account.library.ArgentModel.trigger_escape_guardian.ImplicitArgs","members":{"pedersen_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.HashBuiltin*","offset":1},"range_check_ptr":{"cairo_type":"felt","offset":2},"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":3,"type":"struct"},"contracts.account.library.ArgentModel.trigger_escape_guardian.Return":{"cairo_type":"()","type":"type_definition"},"contracts.account.library.ArgentModel.trigger_escape_guardian.SIZEOF_LOCALS":{"type":"const","value":0},"contracts.account.library.ArgentModel.trigger_escape_signer":{"decorators":[],"pc":787,"type":"function"},"contracts.account.library.ArgentModel.trigger_escape_signer.Args":{"full_name":"contracts.account.library.ArgentModel.trigger_escape_signer.Args","members":{},"size":0,"type":"struct"},"contracts.account.library.ArgentModel.trigger_escape_signer.ImplicitArgs":{"full_name":"contracts.account.library.ArgentModel.trigger_escape_signer.ImplicitArgs","members":{"pedersen_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.HashBuiltin*","offset":1},"range_check_ptr":{"cairo_type":"felt","offset":2},"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":3,"type":"struct"},"contracts.account.library.ArgentModel.trigger_escape_signer.Return":{"cairo_type":"()","type":"type_definition"},"contracts.account.library.ArgentModel.trigger_escape_signer.SIZEOF_LOCALS":{"type":"const","value":0},"contracts.account.library.ArgentModel.upgrade":{"decorators":[],"pc":653,"type":"function"},"contracts.account.library.ArgentModel.upgrade.Args":{"full_name":"contracts.account.library.ArgentModel.upgrade.Args","members":{"implementation":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"contracts.account.library.ArgentModel.upgrade.ImplicitArgs":{"full_name":"contracts.account.library.ArgentModel.upgrade.ImplicitArgs","members":{"pedersen_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.HashBuiltin*","offset":1},"range_check_ptr":{"cairo_type":"felt","offset":2},"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":3,"type":"struct"},"contracts.account.library.ArgentModel.upgrade.Return":{"cairo_type":"()","type":"type_definition"},"contracts.account.library.ArgentModel.upgrade.SIZEOF_LOCALS":{"type":"const","value":0},"contracts.account.library.ArgentModel.validate_guardian_signature":{"decorators":[],"pc":1065,"type":"function"},"contracts.account.library.ArgentModel.validate_guardian_signature.Args":{"full_name":"contracts.account.library.ArgentModel.validate_guardian_signature.Args","members":{"message":{"cairo_type":"felt","offset":0},"signatures":{"cairo_type":"felt*","offset":2},"signatures_len":{"cairo_type":"felt","offset":1}},"size":3,"type":"struct"},"contracts.account.library.ArgentModel.validate_guardian_signature.ImplicitArgs":{"full_name":"contracts.account.library.ArgentModel.validate_guardian_signature.ImplicitArgs","members":{"ecdsa_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.SignatureBuiltin*","offset":2},"pedersen_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.HashBuiltin*","offset":1},"range_check_ptr":{"cairo_type":"felt","offset":3},"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":4,"type":"struct"},"contracts.account.library.ArgentModel.validate_guardian_signature.Return":{"cairo_type":"(is_valid: felt)","type":"type_definition"},"contracts.account.library.ArgentModel.validate_guardian_signature.SIZEOF_LOCALS":{"type":"const","value":0},"contracts.account.library.ArgentModel.validate_signer_signature":{"decorators":[],"pc":1041,"type":"function"},"contracts.account.library.ArgentModel.validate_signer_signature.Args":{"full_name":"contracts.account.library.ArgentModel.validate_signer_signature.Args","members":{"message":{"cairo_type":"felt","offset":0},"signatures":{"cairo_type":"felt*","offset":2},"signatures_len":{"cairo_type":"felt","offset":1}},"size":3,"type":"struct"},"contracts.account.library.ArgentModel.validate_signer_signature.ImplicitArgs":{"full_name":"contracts.account.library.ArgentModel.validate_signer_signature.ImplicitArgs","members":{"ecdsa_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.SignatureBuiltin*","offset":2},"pedersen_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.HashBuiltin*","offset":1},"range_check_ptr":{"cairo_type":"felt","offset":3},"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":4,"type":"struct"},"contracts.account.library.ArgentModel.validate_signer_signature.Return":{"cairo_type":"(is_valid: felt)","type":"type_definition"},"contracts.account.library.ArgentModel.validate_signer_signature.SIZEOF_LOCALS":{"type":"const","value":0},"contracts.account.library.CallArray":{"destination":"contracts.utils.calls.CallArray","type":"alias"},"contracts.account.library.ERC165_ACCOUNT_INTERFACE_ID":{"type":"const","value":960753935},"contracts.account.library.ERC165_ACCOUNT_INTERFACE_ID_OLD":{"type":"const","value":4044209476},"contracts.account.library.Escape":{"full_name":"contracts.account.library.Escape","members":{"active_at":{"cairo_type":"felt","offset":0},"type":{"cairo_type":"felt","offset":1}},"size":2,"type":"struct"},"contracts.account.library.FALSE":{"destination":"starkware.cairo.common.bool.FALSE","type":"alias"},"contracts.account.library.HashBuiltin":{"destination":"starkware.cairo.common.cairo_builtins.HashBuiltin","type":"alias"},"contracts.account.library.QUERY_VERSION":{"type":"const","value":3.402823669209385e+38},"contracts.account.library.SUPPORTS_INTERFACE_SELECTOR":{"type":"const","value":1.1840158947602945e+75},"contracts.account.library.SignatureBuiltin":{"destination":"starkware.cairo.common.cairo_builtins.SignatureBuiltin","type":"alias"},"contracts.account.library.TRANSACTION_VERSION":{"type":"const","value":1},"contracts.account.library.TRUE":{"destination":"starkware.cairo.common.bool.TRUE","type":"alias"},"contracts.account.library._escape":{"type":"namespace"},"contracts.account.library._escape.Args":{"full_name":"contracts.account.library._escape.Args","members":{},"size":0,"type":"struct"},"contracts.account.library._escape.HashBuiltin":{"destination":"starkware.cairo.common.cairo_builtins.HashBuiltin","type":"alias"},"contracts.account.library._escape.ImplicitArgs":{"full_name":"contracts.account.library._escape.ImplicitArgs","members":{},"size":0,"type":"struct"},"contracts.account.library._escape.Return":{"cairo_type":"()","type":"type_definition"},"contracts.account.library._escape.SIZEOF_LOCALS":{"type":"const","value":0},"contracts.account.library._escape.addr":{"decorators":[],"pc":530,"type":"function"},"contracts.account.library._escape.addr.Args":{"full_name":"contracts.account.library._escape.addr.Args","members":{},"size":0,"type":"struct"},"contracts.account.library._escape.addr.ImplicitArgs":{"full_name":"contracts.account.library._escape.addr.ImplicitArgs","members":{"pedersen_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.HashBuiltin*","offset":0},"range_check_ptr":{"cairo_type":"felt","offset":1}},"size":2,"type":"struct"},"contracts.account.library._escape.addr.Return":{"cairo_type":"(res: felt)","type":"type_definition"},"contracts.account.library._escape.addr.SIZEOF_LOCALS":{"type":"const","value":0},"contracts.account.library._escape.hash2":{"destination":"starkware.cairo.common.hash.hash2","type":"alias"},"contracts.account.library._escape.normalize_address":{"destination":"starkware.starknet.common.storage.normalize_address","type":"alias"},"contracts.account.library._escape.read":{"decorators":[],"pc":535,"type":"function"},"contracts.account.library._escape.read.Args":{"full_name":"contracts.account.library._escape.read.Args","members":{},"size":0,"type":"struct"},"contracts.account.library._escape.read.ImplicitArgs":{"full_name":"contracts.account.library._escape.read.ImplicitArgs","members":{"pedersen_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.HashBuiltin*","offset":1},"range_check_ptr":{"cairo_type":"felt","offset":2},"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":3,"type":"struct"},"contracts.account.library._escape.read.Return":{"cairo_type":"(res: contracts.account.library.Escape)","type":"type_definition"},"contracts.account.library._escape.read.SIZEOF_LOCALS":{"type":"const","value":0},"contracts.account.library._escape.storage_read":{"destination":"starkware.starknet.common.syscalls.storage_read","type":"alias"},"contracts.account.library._escape.storage_write":{"destination":"starkware.starknet.common.syscalls.storage_write","type":"alias"},"contracts.account.library._escape.write":{"decorators":[],"pc":554,"type":"function"},"contracts.account.library._escape.write.Args":{"full_name":"contracts.account.library._escape.write.Args","members":{"value":{"cairo_type":"contracts.account.library.Escape","offset":0}},"size":2,"type":"struct"},"contracts.account.library._escape.write.ImplicitArgs":{"full_name":"contracts.account.library._escape.write.ImplicitArgs","members":{"pedersen_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.HashBuiltin*","offset":1},"range_check_ptr":{"cairo_type":"felt","offset":2},"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":3,"type":"struct"},"contracts.account.library._escape.write.Return":{"cairo_type":"()","type":"type_definition"},"contracts.account.library._escape.write.SIZEOF_LOCALS":{"type":"const","value":0},"contracts.account.library._guardian":{"type":"namespace"},"contracts.account.library._guardian.Args":{"full_name":"contracts.account.library._guardian.Args","members":{},"size":0,"type":"struct"},"contracts.account.library._guardian.HashBuiltin":{"destination":"starkware.cairo.common.cairo_builtins.HashBuiltin","type":"alias"},"contracts.account.library._guardian.ImplicitArgs":{"full_name":"contracts.account.library._guardian.ImplicitArgs","members":{},"size":0,"type":"struct"},"contracts.account.library._guardian.Return":{"cairo_type":"()","type":"type_definition"},"contracts.account.library._guardian.SIZEOF_LOCALS":{"type":"const","value":0},"contracts.account.library._guardian.addr":{"decorators":[],"pc":470,"type":"function"},"contracts.account.library._guardian.addr.Args":{"full_name":"contracts.account.library._guardian.addr.Args","members":{},"size":0,"type":"struct"},"contracts.account.library._guardian.addr.ImplicitArgs":{"full_name":"contracts.account.library._guardian.addr.ImplicitArgs","members":{"pedersen_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.HashBuiltin*","offset":0},"range_check_ptr":{"cairo_type":"felt","offset":1}},"size":2,"type":"struct"},"contracts.account.library._guardian.addr.Return":{"cairo_type":"(res: felt)","type":"type_definition"},"contracts.account.library._guardian.addr.SIZEOF_LOCALS":{"type":"const","value":0},"contracts.account.library._guardian.hash2":{"destination":"starkware.cairo.common.hash.hash2","type":"alias"},"contracts.account.library._guardian.normalize_address":{"destination":"starkware.starknet.common.storage.normalize_address","type":"alias"},"contracts.account.library._guardian.read":{"decorators":[],"pc":475,"type":"function"},"contracts.account.library._guardian.read.Args":{"full_name":"contracts.account.library._guardian.read.Args","members":{},"size":0,"type":"struct"},"contracts.account.library._guardian.read.ImplicitArgs":{"full_name":"contracts.account.library._guardian.read.ImplicitArgs","members":{"pedersen_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.HashBuiltin*","offset":1},"range_check_ptr":{"cairo_type":"felt","offset":2},"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":3,"type":"struct"},"contracts.account.library._guardian.read.Return":{"cairo_type":"(res: felt)","type":"type_definition"},"contracts.account.library._guardian.read.SIZEOF_LOCALS":{"type":"const","value":0},"contracts.account.library._guardian.storage_read":{"destination":"starkware.starknet.common.syscalls.storage_read","type":"alias"},"contracts.account.library._guardian.storage_write":{"destination":"starkware.starknet.common.syscalls.storage_write","type":"alias"},"contracts.account.library._guardian.write":{"decorators":[],"pc":488,"type":"function"},"contracts.account.library._guardian.write.Args":{"full_name":"contracts.account.library._guardian.write.Args","members":{"value":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"contracts.account.library._guardian.write.ImplicitArgs":{"full_name":"contracts.account.library._guardian.write.ImplicitArgs","members":{"pedersen_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.HashBuiltin*","offset":1},"range_check_ptr":{"cairo_type":"felt","offset":2},"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":3,"type":"struct"},"contracts.account.library._guardian.write.Return":{"cairo_type":"()","type":"type_definition"},"contracts.account.library._guardian.write.SIZEOF_LOCALS":{"type":"const","value":0},"contracts.account.library._guardian_backup":{"type":"namespace"},"contracts.account.library._guardian_backup.Args":{"full_name":"contracts.account.library._guardian_backup.Args","members":{},"size":0,"type":"struct"},"contracts.account.library._guardian_backup.HashBuiltin":{"destination":"starkware.cairo.common.cairo_builtins.HashBuiltin","type":"alias"},"contracts.account.library._guardian_backup.ImplicitArgs":{"full_name":"contracts.account.library._guardian_backup.ImplicitArgs","members":{},"size":0,"type":"struct"},"contracts.account.library._guardian_backup.Return":{"cairo_type":"()","type":"type_definition"},"contracts.account.library._guardian_backup.SIZEOF_LOCALS":{"type":"const","value":0},"contracts.account.library._guardian_backup.addr":{"decorators":[],"pc":500,"type":"function"},"contracts.account.library._guardian_backup.addr.Args":{"full_name":"contracts.account.library._guardian_backup.addr.Args","members":{},"size":0,"type":"struct"},"contracts.account.library._guardian_backup.addr.ImplicitArgs":{"full_name":"contracts.account.library._guardian_backup.addr.ImplicitArgs","members":{"pedersen_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.HashBuiltin*","offset":0},"range_check_ptr":{"cairo_type":"felt","offset":1}},"size":2,"type":"struct"},"contracts.account.library._guardian_backup.addr.Return":{"cairo_type":"(res: felt)","type":"type_definition"},"contracts.account.library._guardian_backup.addr.SIZEOF_LOCALS":{"type":"const","value":0},"contracts.account.library._guardian_backup.hash2":{"destination":"starkware.cairo.common.hash.hash2","type":"alias"},"contracts.account.library._guardian_backup.normalize_address":{"destination":"starkware.starknet.common.storage.normalize_address","type":"alias"},"contracts.account.library._guardian_backup.read":{"decorators":[],"pc":505,"type":"function"},"contracts.account.library._guardian_backup.read.Args":{"full_name":"contracts.account.library._guardian_backup.read.Args","members":{},"size":0,"type":"struct"},"contracts.account.library._guardian_backup.read.ImplicitArgs":{"full_name":"contracts.account.library._guardian_backup.read.ImplicitArgs","members":{"pedersen_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.HashBuiltin*","offset":1},"range_check_ptr":{"cairo_type":"felt","offset":2},"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":3,"type":"struct"},"contracts.account.library._guardian_backup.read.Return":{"cairo_type":"(res: felt)","type":"type_definition"},"contracts.account.library._guardian_backup.read.SIZEOF_LOCALS":{"type":"const","value":0},"contracts.account.library._guardian_backup.storage_read":{"destination":"starkware.starknet.common.syscalls.storage_read","type":"alias"},"contracts.account.library._guardian_backup.storage_write":{"destination":"starkware.starknet.common.syscalls.storage_write","type":"alias"},"contracts.account.library._guardian_backup.write":{"decorators":[],"pc":518,"type":"function"},"contracts.account.library._guardian_backup.write.Args":{"full_name":"contracts.account.library._guardian_backup.write.Args","members":{"value":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"contracts.account.library._guardian_backup.write.ImplicitArgs":{"full_name":"contracts.account.library._guardian_backup.write.ImplicitArgs","members":{"pedersen_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.HashBuiltin*","offset":1},"range_check_ptr":{"cairo_type":"felt","offset":2},"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":3,"type":"struct"},"contracts.account.library._guardian_backup.write.Return":{"cairo_type":"()","type":"type_definition"},"contracts.account.library._guardian_backup.write.SIZEOF_LOCALS":{"type":"const","value":0},"contracts.account.library._set_implementation":{"destination":"contracts.upgrade.Upgradable._set_implementation","type":"alias"},"contracts.account.library._signer":{"type":"namespace"},"contracts.account.library._signer.Args":{"full_name":"contracts.account.library._signer.Args","members":{},"size":0,"type":"struct"},"contracts.account.library._signer.HashBuiltin":{"destination":"starkware.cairo.common.cairo_builtins.HashBuiltin","type":"alias"},"contracts.account.library._signer.ImplicitArgs":{"full_name":"contracts.account.library._signer.ImplicitArgs","members":{},"size":0,"type":"struct"},"contracts.account.library._signer.Return":{"cairo_type":"()","type":"type_definition"},"contracts.account.library._signer.SIZEOF_LOCALS":{"type":"const","value":0},"contracts.account.library._signer.addr":{"decorators":[],"pc":440,"type":"function"},"contracts.account.library._signer.addr.Args":{"full_name":"contracts.account.library._signer.addr.Args","members":{},"size":0,"type":"struct"},"contracts.account.library._signer.addr.ImplicitArgs":{"full_name":"contracts.account.library._signer.addr.ImplicitArgs","members":{"pedersen_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.HashBuiltin*","offset":0},"range_check_ptr":{"cairo_type":"felt","offset":1}},"size":2,"type":"struct"},"contracts.account.library._signer.addr.Return":{"cairo_type":"(res: felt)","type":"type_definition"},"contracts.account.library._signer.addr.SIZEOF_LOCALS":{"type":"const","value":0},"contracts.account.library._signer.hash2":{"destination":"starkware.cairo.common.hash.hash2","type":"alias"},"contracts.account.library._signer.normalize_address":{"destination":"starkware.starknet.common.storage.normalize_address","type":"alias"},"contracts.account.library._signer.read":{"decorators":[],"pc":445,"type":"function"},"contracts.account.library._signer.read.Args":{"full_name":"contracts.account.library._signer.read.Args","members":{},"size":0,"type":"struct"},"contracts.account.library._signer.read.ImplicitArgs":{"full_name":"contracts.account.library._signer.read.ImplicitArgs","members":{"pedersen_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.HashBuiltin*","offset":1},"range_check_ptr":{"cairo_type":"felt","offset":2},"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":3,"type":"struct"},"contracts.account.library._signer.read.Return":{"cairo_type":"(res: felt)","type":"type_definition"},"contracts.account.library._signer.read.SIZEOF_LOCALS":{"type":"const","value":0},"contracts.account.library._signer.storage_read":{"destination":"starkware.starknet.common.syscalls.storage_read","type":"alias"},"contracts.account.library._signer.storage_write":{"destination":"starkware.starknet.common.syscalls.storage_write","type":"alias"},"contracts.account.library._signer.write":{"decorators":[],"pc":458,"type":"function"},"contracts.account.library._signer.write.Args":{"full_name":"contracts.account.library._signer.write.Args","members":{"value":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"contracts.account.library._signer.write.ImplicitArgs":{"full_name":"contracts.account.library._signer.write.ImplicitArgs","members":{"pedersen_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.HashBuiltin*","offset":1},"range_check_ptr":{"cairo_type":"felt","offset":2},"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":3,"type":"struct"},"contracts.account.library._signer.write.Return":{"cairo_type":"()","type":"type_definition"},"contracts.account.library._signer.write.SIZEOF_LOCALS":{"type":"const","value":0},"contracts.account.library.account_upgraded":{"type":"namespace"},"contracts.account.library.account_upgraded.Args":{"full_name":"contracts.account.library.account_upgraded.Args","members":{},"size":0,"type":"struct"},"contracts.account.library.account_upgraded.ImplicitArgs":{"full_name":"contracts.account.library.account_upgraded.ImplicitArgs","members":{},"size":0,"type":"struct"},"contracts.account.library.account_upgraded.Return":{"cairo_type":"()","type":"type_definition"},"contracts.account.library.account_upgraded.SELECTOR":{"type":"const","value":4.85568081463066e+74},"contracts.account.library.account_upgraded.SIZEOF_LOCALS":{"type":"const","value":0},"contracts.account.library.account_upgraded.alloc":{"destination":"starkware.cairo.common.alloc.alloc","type":"alias"},"contracts.account.library.account_upgraded.emit":{"decorators":[],"pc":416,"type":"function"},"contracts.account.library.account_upgraded.emit.Args":{"full_name":"contracts.account.library.account_upgraded.emit.Args","members":{"new_implementation":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"contracts.account.library.account_upgraded.emit.ImplicitArgs":{"full_name":"contracts.account.library.account_upgraded.emit.ImplicitArgs","members":{"range_check_ptr":{"cairo_type":"felt","offset":1},"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":2,"type":"struct"},"contracts.account.library.account_upgraded.emit.Return":{"cairo_type":"()","type":"type_definition"},"contracts.account.library.account_upgraded.emit.SIZEOF_LOCALS":{"type":"const","value":2},"contracts.account.library.account_upgraded.emit_event":{"destination":"starkware.starknet.common.syscalls.emit_event","type":"alias"},"contracts.account.library.account_upgraded.memcpy":{"destination":"starkware.cairo.common.memcpy.memcpy","type":"alias"},"contracts.account.library.alloc":{"destination":"starkware.cairo.common.alloc.alloc","type":"alias"},"contracts.account.library.assert_correct_tx_version":{"decorators":[],"pc":598,"type":"function"},"contracts.account.library.assert_correct_tx_version.Args":{"full_name":"contracts.account.library.assert_correct_tx_version.Args","members":{"tx_version":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"contracts.account.library.assert_correct_tx_version.ImplicitArgs":{"full_name":"contracts.account.library.assert_correct_tx_version.ImplicitArgs","members":{"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":1,"type":"struct"},"contracts.account.library.assert_correct_tx_version.Return":{"cairo_type":"()","type":"type_definition"},"contracts.account.library.assert_correct_tx_version.SIZEOF_LOCALS":{"type":"const","value":0},"contracts.account.library.assert_guardian_set":{"decorators":[],"pc":607,"type":"function"},"contracts.account.library.assert_guardian_set.Args":{"full_name":"contracts.account.library.assert_guardian_set.Args","members":{},"size":0,"type":"struct"},"contracts.account.library.assert_guardian_set.ImplicitArgs":{"full_name":"contracts.account.library.assert_guardian_set.ImplicitArgs","members":{"pedersen_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.HashBuiltin*","offset":1},"range_check_ptr":{"cairo_type":"felt","offset":2},"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":3,"type":"struct"},"contracts.account.library.assert_guardian_set.Return":{"cairo_type":"()","type":"type_definition"},"contracts.account.library.assert_guardian_set.SIZEOF_LOCALS":{"type":"const","value":0},"contracts.account.library.assert_initialized":{"decorators":[],"pc":580,"type":"function"},"contracts.account.library.assert_initialized.Args":{"full_name":"contracts.account.library.assert_initialized.Args","members":{},"size":0,"type":"struct"},"contracts.account.library.assert_initialized.ImplicitArgs":{"full_name":"contracts.account.library.assert_initialized.ImplicitArgs","members":{"pedersen_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.HashBuiltin*","offset":1},"range_check_ptr":{"cairo_type":"felt","offset":2},"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":3,"type":"struct"},"contracts.account.library.assert_initialized.Return":{"cairo_type":"()","type":"type_definition"},"contracts.account.library.assert_initialized.SIZEOF_LOCALS":{"type":"const","value":0},"contracts.account.library.assert_le":{"destination":"starkware.cairo.common.math.assert_le","type":"alias"},"contracts.account.library.assert_nn":{"destination":"starkware.cairo.common.math.assert_nn","type":"alias"},"contracts.account.library.assert_no_self_call":{"decorators":[],"pc":618,"type":"function"},"contracts.account.library.assert_no_self_call.Args":{"full_name":"contracts.account.library.assert_no_self_call.Args","members":{"call_array":{"cairo_type":"contracts.utils.calls.CallArray*","offset":2},"call_array_len":{"cairo_type":"felt","offset":1},"self":{"cairo_type":"felt","offset":0}},"size":3,"type":"struct"},"contracts.account.library.assert_no_self_call.ImplicitArgs":{"full_name":"contracts.account.library.assert_no_self_call.ImplicitArgs","members":{},"size":0,"type":"struct"},"contracts.account.library.assert_no_self_call.Return":{"cairo_type":"()","type":"type_definition"},"contracts.account.library.assert_no_self_call.SIZEOF_LOCALS":{"type":"const","value":0},"contracts.account.library.assert_non_reentrant":{"decorators":[],"pc":591,"type":"function"},"contracts.account.library.assert_non_reentrant.Args":{"full_name":"contracts.account.library.assert_non_reentrant.Args","members":{},"size":0,"type":"struct"},"contracts.account.library.assert_non_reentrant.ImplicitArgs":{"full_name":"contracts.account.library.assert_non_reentrant.ImplicitArgs","members":{"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":1,"type":"struct"},"contracts.account.library.assert_non_reentrant.Return":{"cairo_type":"()","type":"type_definition"},"contracts.account.library.assert_non_reentrant.SIZEOF_LOCALS":{"type":"const","value":0},"contracts.account.library.assert_not_zero":{"destination":"starkware.cairo.common.math.assert_not_zero","type":"alias"},"contracts.account.library.assert_only_self":{"decorators":[],"pc":571,"type":"function"},"contracts.account.library.assert_only_self.Args":{"full_name":"contracts.account.library.assert_only_self.Args","members":{},"size":0,"type":"struct"},"contracts.account.library.assert_only_self.ImplicitArgs":{"full_name":"contracts.account.library.assert_only_self.ImplicitArgs","members":{"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":1,"type":"struct"},"contracts.account.library.assert_only_self.Return":{"cairo_type":"()","type":"type_definition"},"contracts.account.library.assert_only_self.SIZEOF_LOCALS":{"type":"const","value":0},"contracts.account.library.call_contract":{"destination":"starkware.starknet.common.syscalls.call_contract","type":"alias"},"contracts.account.library.escape_canceled":{"type":"namespace"},"contracts.account.library.escape_canceled.Args":{"full_name":"contracts.account.library.escape_canceled.Args","members":{},"size":0,"type":"struct"},"contracts.account.library.escape_canceled.ImplicitArgs":{"full_name":"contracts.account.library.escape_canceled.ImplicitArgs","members":{},"size":0,"type":"struct"},"contracts.account.library.escape_canceled.Return":{"cairo_type":"()","type":"type_definition"},"contracts.account.library.escape_canceled.SELECTOR":{"type":"const","value":1.3005225371736532e+75},"contracts.account.library.escape_canceled.SIZEOF_LOCALS":{"type":"const","value":0},"contracts.account.library.escape_canceled.alloc":{"destination":"starkware.cairo.common.alloc.alloc","type":"alias"},"contracts.account.library.escape_canceled.emit":{"decorators":[],"pc":347,"type":"function"},"contracts.account.library.escape_canceled.emit.Args":{"full_name":"contracts.account.library.escape_canceled.emit.Args","members":{},"size":0,"type":"struct"},"contracts.account.library.escape_canceled.emit.ImplicitArgs":{"full_name":"contracts.account.library.escape_canceled.emit.ImplicitArgs","members":{"range_check_ptr":{"cairo_type":"felt","offset":1},"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":2,"type":"struct"},"contracts.account.library.escape_canceled.emit.Return":{"cairo_type":"()","type":"type_definition"},"contracts.account.library.escape_canceled.emit.SIZEOF_LOCALS":{"type":"const","value":2},"contracts.account.library.escape_canceled.emit_event":{"destination":"starkware.starknet.common.syscalls.emit_event","type":"alias"},"contracts.account.library.escape_canceled.memcpy":{"destination":"starkware.cairo.common.memcpy.memcpy","type":"alias"},"contracts.account.library.escape_guardian_triggered":{"type":"namespace"},"contracts.account.library.escape_guardian_triggered.Args":{"full_name":"contracts.account.library.escape_guardian_triggered.Args","members":{},"size":0,"type":"struct"},"contracts.account.library.escape_guardian_triggered.ImplicitArgs":{"full_name":"contracts.account.library.escape_guardian_triggered.ImplicitArgs","members":{},"size":0,"type":"struct"},"contracts.account.library.escape_guardian_triggered.Return":{"cairo_type":"()","type":"type_definition"},"contracts.account.library.escape_guardian_triggered.SELECTOR":{"type":"const","value":1.1962697849542542e+75},"contracts.account.library.escape_guardian_triggered.SIZEOF_LOCALS":{"type":"const","value":0},"contracts.account.library.escape_guardian_triggered.alloc":{"destination":"starkware.cairo.common.alloc.alloc","type":"alias"},"contracts.account.library.escape_guardian_triggered.emit":{"decorators":[],"pc":299,"type":"function"},"contracts.account.library.escape_guardian_triggered.emit.Args":{"full_name":"contracts.account.library.escape_guardian_triggered.emit.Args","members":{"active_at":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"contracts.account.library.escape_guardian_triggered.emit.ImplicitArgs":{"full_name":"contracts.account.library.escape_guardian_triggered.emit.ImplicitArgs","members":{"range_check_ptr":{"cairo_type":"felt","offset":1},"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":2,"type":"struct"},"contracts.account.library.escape_guardian_triggered.emit.Return":{"cairo_type":"()","type":"type_definition"},"contracts.account.library.escape_guardian_triggered.emit.SIZEOF_LOCALS":{"type":"const","value":2},"contracts.account.library.escape_guardian_triggered.emit_event":{"destination":"starkware.starknet.common.syscalls.emit_event","type":"alias"},"contracts.account.library.escape_guardian_triggered.memcpy":{"destination":"starkware.cairo.common.memcpy.memcpy","type":"alias"},"contracts.account.library.escape_signer_triggered":{"type":"namespace"},"contracts.account.library.escape_signer_triggered.Args":{"full_name":"contracts.account.library.escape_signer_triggered.Args","members":{},"size":0,"type":"struct"},"contracts.account.library.escape_signer_triggered.ImplicitArgs":{"full_name":"contracts.account.library.escape_signer_triggered.ImplicitArgs","members":{},"size":0,"type":"struct"},"contracts.account.library.escape_signer_triggered.Return":{"cairo_type":"()","type":"type_definition"},"contracts.account.library.escape_signer_triggered.SELECTOR":{"type":"const","value":8.520591126022064e+73},"contracts.account.library.escape_signer_triggered.SIZEOF_LOCALS":{"type":"const","value":0},"contracts.account.library.escape_signer_triggered.alloc":{"destination":"starkware.cairo.common.alloc.alloc","type":"alias"},"contracts.account.library.escape_signer_triggered.emit":{"decorators":[],"pc":323,"type":"function"},"contracts.account.library.escape_signer_triggered.emit.Args":{"full_name":"contracts.account.library.escape_signer_triggered.emit.Args","members":{"active_at":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"contracts.account.library.escape_signer_triggered.emit.ImplicitArgs":{"full_name":"contracts.account.library.escape_signer_triggered.emit.ImplicitArgs","members":{"range_check_ptr":{"cairo_type":"felt","offset":1},"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":2,"type":"struct"},"contracts.account.library.escape_signer_triggered.emit.Return":{"cairo_type":"()","type":"type_definition"},"contracts.account.library.escape_signer_triggered.emit.SIZEOF_LOCALS":{"type":"const","value":2},"contracts.account.library.escape_signer_triggered.emit_event":{"destination":"starkware.starknet.common.syscalls.emit_event","type":"alias"},"contracts.account.library.escape_signer_triggered.memcpy":{"destination":"starkware.cairo.common.memcpy.memcpy","type":"alias"},"contracts.account.library.get_block_timestamp":{"destination":"starkware.starknet.common.syscalls.get_block_timestamp","type":"alias"},"contracts.account.library.get_caller_address":{"destination":"starkware.starknet.common.syscalls.get_caller_address","type":"alias"},"contracts.account.library.get_contract_address":{"destination":"starkware.starknet.common.syscalls.get_contract_address","type":"alias"},"contracts.account.library.get_tx_info":{"destination":"starkware.starknet.common.syscalls.get_tx_info","type":"alias"},"contracts.account.library.guardian_backup_changed":{"type":"namespace"},"contracts.account.library.guardian_backup_changed.Args":{"full_name":"contracts.account.library.guardian_backup_changed.Args","members":{},"size":0,"type":"struct"},"contracts.account.library.guardian_backup_changed.ImplicitArgs":{"full_name":"contracts.account.library.guardian_backup_changed.ImplicitArgs","members":{},"size":0,"type":"struct"},"contracts.account.library.guardian_backup_changed.Return":{"cairo_type":"()","type":"type_definition"},"contracts.account.library.guardian_backup_changed.SELECTOR":{"type":"const","value":4.658049780787609e+74},"contracts.account.library.guardian_backup_changed.SIZEOF_LOCALS":{"type":"const","value":0},"contracts.account.library.guardian_backup_changed.alloc":{"destination":"starkware.cairo.common.alloc.alloc","type":"alias"},"contracts.account.library.guardian_backup_changed.emit":{"decorators":[],"pc":275,"type":"function"},"contracts.account.library.guardian_backup_changed.emit.Args":{"full_name":"contracts.account.library.guardian_backup_changed.emit.Args","members":{"new_guardian":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"contracts.account.library.guardian_backup_changed.emit.ImplicitArgs":{"full_name":"contracts.account.library.guardian_backup_changed.emit.ImplicitArgs","members":{"range_check_ptr":{"cairo_type":"felt","offset":1},"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":2,"type":"struct"},"contracts.account.library.guardian_backup_changed.emit.Return":{"cairo_type":"()","type":"type_definition"},"contracts.account.library.guardian_backup_changed.emit.SIZEOF_LOCALS":{"type":"const","value":2},"contracts.account.library.guardian_backup_changed.emit_event":{"destination":"starkware.starknet.common.syscalls.emit_event","type":"alias"},"contracts.account.library.guardian_backup_changed.memcpy":{"destination":"starkware.cairo.common.memcpy.memcpy","type":"alias"},"contracts.account.library.guardian_changed":{"type":"namespace"},"contracts.account.library.guardian_changed.Args":{"full_name":"contracts.account.library.guardian_changed.Args","members":{},"size":0,"type":"struct"},"contracts.account.library.guardian_changed.ImplicitArgs":{"full_name":"contracts.account.library.guardian_changed.ImplicitArgs","members":{},"size":0,"type":"struct"},"contracts.account.library.guardian_changed.Return":{"cairo_type":"()","type":"type_definition"},"contracts.account.library.guardian_changed.SELECTOR":{"type":"const","value":1.0100674791588217e+75},"contracts.account.library.guardian_changed.SIZEOF_LOCALS":{"type":"const","value":0},"contracts.account.library.guardian_changed.alloc":{"destination":"starkware.cairo.common.alloc.alloc","type":"alias"},"contracts.account.library.guardian_changed.emit":{"decorators":[],"pc":251,"type":"function"},"contracts.account.library.guardian_changed.emit.Args":{"full_name":"contracts.account.library.guardian_changed.emit.Args","members":{"new_guardian":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"contracts.account.library.guardian_changed.emit.ImplicitArgs":{"full_name":"contracts.account.library.guardian_changed.emit.ImplicitArgs","members":{"range_check_ptr":{"cairo_type":"felt","offset":1},"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":2,"type":"struct"},"contracts.account.library.guardian_changed.emit.Return":{"cairo_type":"()","type":"type_definition"},"contracts.account.library.guardian_changed.emit.SIZEOF_LOCALS":{"type":"const","value":2},"contracts.account.library.guardian_changed.emit_event":{"destination":"starkware.starknet.common.syscalls.emit_event","type":"alias"},"contracts.account.library.guardian_changed.memcpy":{"destination":"starkware.cairo.common.memcpy.memcpy","type":"alias"},"contracts.account.library.guardian_escaped":{"type":"namespace"},"contracts.account.library.guardian_escaped.Args":{"full_name":"contracts.account.library.guardian_escaped.Args","members":{},"size":0,"type":"struct"},"contracts.account.library.guardian_escaped.ImplicitArgs":{"full_name":"contracts.account.library.guardian_escaped.ImplicitArgs","members":{},"size":0,"type":"struct"},"contracts.account.library.guardian_escaped.Return":{"cairo_type":"()","type":"type_definition"},"contracts.account.library.guardian_escaped.SELECTOR":{"type":"const","value":2.1563074968808545e+74},"contracts.account.library.guardian_escaped.SIZEOF_LOCALS":{"type":"const","value":0},"contracts.account.library.guardian_escaped.alloc":{"destination":"starkware.cairo.common.alloc.alloc","type":"alias"},"contracts.account.library.guardian_escaped.emit":{"decorators":[],"pc":368,"type":"function"},"contracts.account.library.guardian_escaped.emit.Args":{"full_name":"contracts.account.library.guardian_escaped.emit.Args","members":{"new_guardian":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"contracts.account.library.guardian_escaped.emit.ImplicitArgs":{"full_name":"contracts.account.library.guardian_escaped.emit.ImplicitArgs","members":{"range_check_ptr":{"cairo_type":"felt","offset":1},"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":2,"type":"struct"},"contracts.account.library.guardian_escaped.emit.Return":{"cairo_type":"()","type":"type_definition"},"contracts.account.library.guardian_escaped.emit.SIZEOF_LOCALS":{"type":"const","value":2},"contracts.account.library.guardian_escaped.emit_event":{"destination":"starkware.starknet.common.syscalls.emit_event","type":"alias"},"contracts.account.library.guardian_escaped.memcpy":{"destination":"starkware.cairo.common.memcpy.memcpy","type":"alias"},"contracts.account.library.library_call":{"destination":"starkware.starknet.common.syscalls.library_call","type":"alias"},"contracts.account.library.memcpy":{"destination":"starkware.cairo.common.memcpy.memcpy","type":"alias"},"contracts.account.library.signer_changed":{"type":"namespace"},"contracts.account.library.signer_changed.Args":{"full_name":"contracts.account.library.signer_changed.Args","members":{},"size":0,"type":"struct"},"contracts.account.library.signer_changed.ImplicitArgs":{"full_name":"contracts.account.library.signer_changed.ImplicitArgs","members":{},"size":0,"type":"struct"},"contracts.account.library.signer_changed.Return":{"cairo_type":"()","type":"type_definition"},"contracts.account.library.signer_changed.SELECTOR":{"type":"const","value":3.177758270162989e+74},"contracts.account.library.signer_changed.SIZEOF_LOCALS":{"type":"const","value":0},"contracts.account.library.signer_changed.alloc":{"destination":"starkware.cairo.common.alloc.alloc","type":"alias"},"contracts.account.library.signer_changed.emit":{"decorators":[],"pc":227,"type":"function"},"contracts.account.library.signer_changed.emit.Args":{"full_name":"contracts.account.library.signer_changed.emit.Args","members":{"new_signer":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"contracts.account.library.signer_changed.emit.ImplicitArgs":{"full_name":"contracts.account.library.signer_changed.emit.ImplicitArgs","members":{"range_check_ptr":{"cairo_type":"felt","offset":1},"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":2,"type":"struct"},"contracts.account.library.signer_changed.emit.Return":{"cairo_type":"()","type":"type_definition"},"contracts.account.library.signer_changed.emit.SIZEOF_LOCALS":{"type":"const","value":2},"contracts.account.library.signer_changed.emit_event":{"destination":"starkware.starknet.common.syscalls.emit_event","type":"alias"},"contracts.account.library.signer_changed.memcpy":{"destination":"starkware.cairo.common.memcpy.memcpy","type":"alias"},"contracts.account.library.signer_escaped":{"type":"namespace"},"contracts.account.library.signer_escaped.Args":{"full_name":"contracts.account.library.signer_escaped.Args","members":{},"size":0,"type":"struct"},"contracts.account.library.signer_escaped.ImplicitArgs":{"full_name":"contracts.account.library.signer_escaped.ImplicitArgs","members":{},"size":0,"type":"struct"},"contracts.account.library.signer_escaped.Return":{"cairo_type":"()","type":"type_definition"},"contracts.account.library.signer_escaped.SELECTOR":{"type":"const","value":4.1751832496835406e+74},"contracts.account.library.signer_escaped.SIZEOF_LOCALS":{"type":"const","value":0},"contracts.account.library.signer_escaped.alloc":{"destination":"starkware.cairo.common.alloc.alloc","type":"alias"},"contracts.account.library.signer_escaped.emit":{"decorators":[],"pc":392,"type":"function"},"contracts.account.library.signer_escaped.emit.Args":{"full_name":"contracts.account.library.signer_escaped.emit.Args","members":{"new_signer":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"contracts.account.library.signer_escaped.emit.ImplicitArgs":{"full_name":"contracts.account.library.signer_escaped.emit.ImplicitArgs","members":{"range_check_ptr":{"cairo_type":"felt","offset":1},"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":2,"type":"struct"},"contracts.account.library.signer_escaped.emit.Return":{"cairo_type":"()","type":"type_definition"},"contracts.account.library.signer_escaped.emit.SIZEOF_LOCALS":{"type":"const","value":2},"contracts.account.library.signer_escaped.emit_event":{"destination":"starkware.starknet.common.syscalls.emit_event","type":"alias"},"contracts.account.library.signer_escaped.memcpy":{"destination":"starkware.cairo.common.memcpy.memcpy","type":"alias"},"contracts.account.library.verify_ecdsa_signature":{"destination":"starkware.cairo.common.signature.verify_ecdsa_signature","type":"alias"},"contracts.upgrade.Upgradable.HashBuiltin":{"destination":"starkware.cairo.common.cairo_builtins.HashBuiltin","type":"alias"},"contracts.upgrade.Upgradable._implementation":{"type":"namespace"},"contracts.upgrade.Upgradable._implementation.Args":{"full_name":"contracts.upgrade.Upgradable._implementation.Args","members":{},"size":0,"type":"struct"},"contracts.upgrade.Upgradable._implementation.HashBuiltin":{"destination":"starkware.cairo.common.cairo_builtins.HashBuiltin","type":"alias"},"contracts.upgrade.Upgradable._implementation.ImplicitArgs":{"full_name":"contracts.upgrade.Upgradable._implementation.ImplicitArgs","members":{},"size":0,"type":"struct"},"contracts.upgrade.Upgradable._implementation.Return":{"cairo_type":"()","type":"type_definition"},"contracts.upgrade.Upgradable._implementation.SIZEOF_LOCALS":{"type":"const","value":0},"contracts.upgrade.Upgradable._implementation.addr":{"decorators":[],"pc":200,"type":"function"},"contracts.upgrade.Upgradable._implementation.addr.Args":{"full_name":"contracts.upgrade.Upgradable._implementation.addr.Args","members":{},"size":0,"type":"struct"},"contracts.upgrade.Upgradable._implementation.addr.ImplicitArgs":{"full_name":"contracts.upgrade.Upgradable._implementation.addr.ImplicitArgs","members":{"pedersen_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.HashBuiltin*","offset":0},"range_check_ptr":{"cairo_type":"felt","offset":1}},"size":2,"type":"struct"},"contracts.upgrade.Upgradable._implementation.addr.Return":{"cairo_type":"(res: felt)","type":"type_definition"},"contracts.upgrade.Upgradable._implementation.addr.SIZEOF_LOCALS":{"type":"const","value":0},"contracts.upgrade.Upgradable._implementation.hash2":{"destination":"starkware.cairo.common.hash.hash2","type":"alias"},"contracts.upgrade.Upgradable._implementation.normalize_address":{"destination":"starkware.starknet.common.storage.normalize_address","type":"alias"},"contracts.upgrade.Upgradable._implementation.storage_read":{"destination":"starkware.starknet.common.syscalls.storage_read","type":"alias"},"contracts.upgrade.Upgradable._implementation.storage_write":{"destination":"starkware.starknet.common.syscalls.storage_write","type":"alias"},"contracts.upgrade.Upgradable._implementation.write":{"decorators":[],"pc":205,"type":"function"},"contracts.upgrade.Upgradable._implementation.write.Args":{"full_name":"contracts.upgrade.Upgradable._implementation.write.Args","members":{"value":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"contracts.upgrade.Upgradable._implementation.write.ImplicitArgs":{"full_name":"contracts.upgrade.Upgradable._implementation.write.ImplicitArgs","members":{"pedersen_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.HashBuiltin*","offset":1},"range_check_ptr":{"cairo_type":"felt","offset":2},"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":3,"type":"struct"},"contracts.upgrade.Upgradable._implementation.write.Return":{"cairo_type":"()","type":"type_definition"},"contracts.upgrade.Upgradable._implementation.write.SIZEOF_LOCALS":{"type":"const","value":0},"contracts.upgrade.Upgradable._set_implementation":{"decorators":[],"pc":217,"type":"function"},"contracts.upgrade.Upgradable._set_implementation.Args":{"full_name":"contracts.upgrade.Upgradable._set_implementation.Args","members":{"implementation":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"contracts.upgrade.Upgradable._set_implementation.ImplicitArgs":{"full_name":"contracts.upgrade.Upgradable._set_implementation.ImplicitArgs","members":{"pedersen_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.HashBuiltin*","offset":1},"range_check_ptr":{"cairo_type":"felt","offset":2},"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":3,"type":"struct"},"contracts.upgrade.Upgradable._set_implementation.Return":{"cairo_type":"()","type":"type_definition"},"contracts.upgrade.Upgradable._set_implementation.SIZEOF_LOCALS":{"type":"const","value":0},"contracts.upgrade.Upgradable.assert_not_zero":{"destination":"starkware.cairo.common.math.assert_not_zero","type":"alias"},"contracts.utils.calls.Call":{"full_name":"contracts.utils.calls.Call","members":{"calldata":{"cairo_type":"felt*","offset":3},"calldata_len":{"cairo_type":"felt","offset":2},"selector":{"cairo_type":"felt","offset":1},"to":{"cairo_type":"felt","offset":0}},"size":4,"type":"struct"},"contracts.utils.calls.CallArray":{"full_name":"contracts.utils.calls.CallArray","members":{"data_len":{"cairo_type":"felt","offset":3},"data_offset":{"cairo_type":"felt","offset":2},"selector":{"cairo_type":"felt","offset":1},"to":{"cairo_type":"felt","offset":0}},"size":4,"type":"struct"},"contracts.utils.calls.FALSE":{"destination":"starkware.cairo.common.bool.FALSE","type":"alias"},"contracts.utils.calls.HashBuiltin":{"destination":"starkware.cairo.common.cairo_builtins.HashBuiltin","type":"alias"},"contracts.utils.calls.SignatureBuiltin":{"destination":"starkware.cairo.common.cairo_builtins.SignatureBuiltin","type":"alias"},"contracts.utils.calls.TRUE":{"destination":"starkware.cairo.common.bool.TRUE","type":"alias"},"contracts.utils.calls.alloc":{"destination":"starkware.cairo.common.alloc.alloc","type":"alias"},"contracts.utils.calls.assert_le":{"destination":"starkware.cairo.common.math.assert_le","type":"alias"},"contracts.utils.calls.assert_nn":{"destination":"starkware.cairo.common.math.assert_nn","type":"alias"},"contracts.utils.calls.assert_not_zero":{"destination":"starkware.cairo.common.math.assert_not_zero","type":"alias"},"contracts.utils.calls.call_contract":{"destination":"starkware.starknet.common.syscalls.call_contract","type":"alias"},"contracts.utils.calls.execute_call_array":{"decorators":[],"pc":134,"type":"function"},"contracts.utils.calls.execute_call_array.Args":{"full_name":"contracts.utils.calls.execute_call_array.Args","members":{"call_array":{"cairo_type":"contracts.utils.calls.CallArray*","offset":1},"call_array_len":{"cairo_type":"felt","offset":0},"calldata":{"cairo_type":"felt*","offset":3},"calldata_len":{"cairo_type":"felt","offset":2}},"size":4,"type":"struct"},"contracts.utils.calls.execute_call_array.ImplicitArgs":{"full_name":"contracts.utils.calls.execute_call_array.ImplicitArgs","members":{"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":1,"type":"struct"},"contracts.utils.calls.execute_call_array.Return":{"cairo_type":"(retdata_len: felt, retdata: felt*)","type":"type_definition"},"contracts.utils.calls.execute_call_array.SIZEOF_LOCALS":{"type":"const","value":2},"contracts.utils.calls.execute_calls":{"decorators":[],"pc":159,"type":"function"},"contracts.utils.calls.execute_calls.Args":{"full_name":"contracts.utils.calls.execute_calls.Args","members":{"calls":{"cairo_type":"contracts.utils.calls.Call*","offset":1},"calls_len":{"cairo_type":"felt","offset":0},"index":{"cairo_type":"felt","offset":3},"response":{"cairo_type":"felt*","offset":2}},"size":4,"type":"struct"},"contracts.utils.calls.execute_calls.ImplicitArgs":{"full_name":"contracts.utils.calls.execute_calls.ImplicitArgs","members":{"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":1,"type":"struct"},"contracts.utils.calls.execute_calls.Return":{"cairo_type":"(response_len: felt)","type":"type_definition"},"contracts.utils.calls.execute_calls.SIZEOF_LOCALS":{"type":"const","value":3},"contracts.utils.calls.execute_calls.index":{"cairo_type":"felt","full_name":"contracts.utils.calls.execute_calls.index","references":[{"ap_tracking_data":{"group":19,"offset":0},"pc":159,"value":"[cast(fp + (-3), felt*)]"}],"type":"reference"},"contracts.utils.calls.from_call_array_to_call":{"decorators":[],"pc":110,"type":"function"},"contracts.utils.calls.from_call_array_to_call.Args":{"full_name":"contracts.utils.calls.from_call_array_to_call.Args","members":{"call_array":{"cairo_type":"contracts.utils.calls.CallArray*","offset":1},"call_array_len":{"cairo_type":"felt","offset":0},"calldata":{"cairo_type":"felt*","offset":2},"calls":{"cairo_type":"contracts.utils.calls.Call*","offset":3}},"size":4,"type":"struct"},"contracts.utils.calls.from_call_array_to_call.ImplicitArgs":{"full_name":"contracts.utils.calls.from_call_array_to_call.ImplicitArgs","members":{"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":1,"type":"struct"},"contracts.utils.calls.from_call_array_to_call.Return":{"cairo_type":"()","type":"type_definition"},"contracts.utils.calls.from_call_array_to_call.SIZEOF_LOCALS":{"type":"const","value":0},"contracts.utils.calls.memcpy":{"destination":"starkware.cairo.common.memcpy.memcpy","type":"alias"},"starkware.cairo.common.alloc.alloc":{"decorators":[],"pc":0,"type":"function"},"starkware.cairo.common.alloc.alloc.Args":{"full_name":"starkware.cairo.common.alloc.alloc.Args","members":{},"size":0,"type":"struct"},"starkware.cairo.common.alloc.alloc.ImplicitArgs":{"full_name":"starkware.cairo.common.alloc.alloc.ImplicitArgs","members":{},"size":0,"type":"struct"},"starkware.cairo.common.alloc.alloc.Return":{"cairo_type":"(ptr: felt*)","type":"type_definition"},"starkware.cairo.common.alloc.alloc.SIZEOF_LOCALS":{"type":"const","value":0},"starkware.cairo.common.bool.FALSE":{"type":"const","value":0},"starkware.cairo.common.bool.TRUE":{"type":"const","value":1},"starkware.cairo.common.cairo_builtins.BitwiseBuiltin":{"full_name":"starkware.cairo.common.cairo_builtins.BitwiseBuiltin","members":{"x":{"cairo_type":"felt","offset":0},"x_and_y":{"cairo_type":"felt","offset":2},"x_or_y":{"cairo_type":"felt","offset":4},"x_xor_y":{"cairo_type":"felt","offset":3},"y":{"cairo_type":"felt","offset":1}},"size":5,"type":"struct"},"starkware.cairo.common.cairo_builtins.EcOpBuiltin":{"full_name":"starkware.cairo.common.cairo_builtins.EcOpBuiltin","members":{"m":{"cairo_type":"felt","offset":4},"p":{"cairo_type":"starkware.cairo.common.ec_point.EcPoint","offset":0},"q":{"cairo_type":"starkware.cairo.common.ec_point.EcPoint","offset":2},"r":{"cairo_type":"starkware.cairo.common.ec_point.EcPoint","offset":5}},"size":7,"type":"struct"},"starkware.cairo.common.cairo_builtins.EcPoint":{"destination":"starkware.cairo.common.ec_point.EcPoint","type":"alias"},"starkware.cairo.common.cairo_builtins.HashBuiltin":{"full_name":"starkware.cairo.common.cairo_builtins.HashBuiltin","members":{"result":{"cairo_type":"felt","offset":2},"x":{"cairo_type":"felt","offset":0},"y":{"cairo_type":"felt","offset":1}},"size":3,"type":"struct"},"starkware.cairo.common.cairo_builtins.KeccakBuiltin":{"full_name":"starkware.cairo.common.cairo_builtins.KeccakBuiltin","members":{"input":{"cairo_type":"starkware.cairo.common.keccak_state.KeccakBuiltinState","offset":0},"output":{"cairo_type":"starkware.cairo.common.keccak_state.KeccakBuiltinState","offset":8}},"size":16,"type":"struct"},"starkware.cairo.common.cairo_builtins.KeccakBuiltinState":{"destination":"starkware.cairo.common.keccak_state.KeccakBuiltinState","type":"alias"},"starkware.cairo.common.cairo_builtins.SignatureBuiltin":{"full_name":"starkware.cairo.common.cairo_builtins.SignatureBuiltin","members":{"message":{"cairo_type":"felt","offset":1},"pub_key":{"cairo_type":"felt","offset":0}},"size":2,"type":"struct"},"starkware.cairo.common.dict_access.DictAccess":{"full_name":"starkware.cairo.common.dict_access.DictAccess","members":{"key":{"cairo_type":"felt","offset":0},"new_value":{"cairo_type":"felt","offset":2},"prev_value":{"cairo_type":"felt","offset":1}},"size":3,"type":"struct"},"starkware.cairo.common.ec.EcOpBuiltin":{"destination":"starkware.cairo.common.cairo_builtins.EcOpBuiltin","type":"alias"},"starkware.cairo.common.ec.EcPoint":{"destination":"starkware.cairo.common.ec_point.EcPoint","type":"alias"},"starkware.cairo.common.ec.StarkCurve":{"type":"namespace"},"starkware.cairo.common.ec.StarkCurve.ALPHA":{"type":"const","value":1},"starkware.cairo.common.ec.StarkCurve.Args":{"full_name":"starkware.cairo.common.ec.StarkCurve.Args","members":{},"size":0,"type":"struct"},"starkware.cairo.common.ec.StarkCurve.BETA":{"type":"const","value":-4.76910135076338e+74},"starkware.cairo.common.ec.StarkCurve.GEN_X":{"type":"const","value":8.747394510780078e+74},"starkware.cairo.common.ec.StarkCurve.GEN_Y":{"type":"const","value":1.5266679207151883e+74},"starkware.cairo.common.ec.StarkCurve.ImplicitArgs":{"full_name":"starkware.cairo.common.ec.StarkCurve.ImplicitArgs","members":{},"size":0,"type":"struct"},"starkware.cairo.common.ec.StarkCurve.ORDER":{"type":"const","value":-9.63634636155092e+37},"starkware.cairo.common.ec.StarkCurve.Return":{"cairo_type":"()","type":"type_definition"},"starkware.cairo.common.ec.StarkCurve.SIZEOF_LOCALS":{"type":"const","value":0},"starkware.cairo.common.ec.is_quad_residue":{"destination":"starkware.cairo.common.math.is_quad_residue","type":"alias"},"starkware.cairo.common.ec_point.EcPoint":{"full_name":"starkware.cairo.common.ec_point.EcPoint","members":{"x":{"cairo_type":"felt","offset":0},"y":{"cairo_type":"felt","offset":1}},"size":2,"type":"struct"},"starkware.cairo.common.hash.HashBuiltin":{"destination":"starkware.cairo.common.cairo_builtins.HashBuiltin","type":"alias"},"starkware.cairo.common.keccak_state.KeccakBuiltinState":{"full_name":"starkware.cairo.common.keccak_state.KeccakBuiltinState","members":{"s0":{"cairo_type":"felt","offset":0},"s1":{"cairo_type":"felt","offset":1},"s2":{"cairo_type":"felt","offset":2},"s3":{"cairo_type":"felt","offset":3},"s4":{"cairo_type":"felt","offset":4},"s5":{"cairo_type":"felt","offset":5},"s6":{"cairo_type":"felt","offset":6},"s7":{"cairo_type":"felt","offset":7}},"size":8,"type":"struct"},"starkware.cairo.common.math.FALSE":{"destination":"starkware.cairo.common.bool.FALSE","type":"alias"},"starkware.cairo.common.math.TRUE":{"destination":"starkware.cairo.common.bool.TRUE","type":"alias"},"starkware.cairo.common.math.assert_le":{"decorators":[],"pc":27,"type":"function"},"starkware.cairo.common.math.assert_le.Args":{"full_name":"starkware.cairo.common.math.assert_le.Args","members":{"a":{"cairo_type":"felt","offset":0},"b":{"cairo_type":"felt","offset":1}},"size":2,"type":"struct"},"starkware.cairo.common.math.assert_le.ImplicitArgs":{"full_name":"starkware.cairo.common.math.assert_le.ImplicitArgs","members":{"range_check_ptr":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"starkware.cairo.common.math.assert_le.Return":{"cairo_type":"()","type":"type_definition"},"starkware.cairo.common.math.assert_le.SIZEOF_LOCALS":{"type":"const","value":0},"starkware.cairo.common.math.assert_nn":{"decorators":[],"pc":23,"type":"function"},"starkware.cairo.common.math.assert_nn.Args":{"full_name":"starkware.cairo.common.math.assert_nn.Args","members":{"a":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"starkware.cairo.common.math.assert_nn.ImplicitArgs":{"full_name":"starkware.cairo.common.math.assert_nn.ImplicitArgs","members":{"range_check_ptr":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"starkware.cairo.common.math.assert_nn.Return":{"cairo_type":"()","type":"type_definition"},"starkware.cairo.common.math.assert_nn.SIZEOF_LOCALS":{"type":"const","value":0},"starkware.cairo.common.math.assert_nn.a":{"cairo_type":"felt","full_name":"starkware.cairo.common.math.assert_nn.a","references":[{"ap_tracking_data":{"group":3,"offset":0},"pc":23,"value":"[cast(fp + (-3), felt*)]"}],"type":"reference"},"starkware.cairo.common.math.assert_not_zero":{"decorators":[],"pc":18,"type":"function"},"starkware.cairo.common.math.assert_not_zero.Args":{"full_name":"starkware.cairo.common.math.assert_not_zero.Args","members":{"value":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"starkware.cairo.common.math.assert_not_zero.ImplicitArgs":{"full_name":"starkware.cairo.common.math.assert_not_zero.ImplicitArgs","members":{},"size":0,"type":"struct"},"starkware.cairo.common.math.assert_not_zero.Return":{"cairo_type":"()","type":"type_definition"},"starkware.cairo.common.math.assert_not_zero.SIZEOF_LOCALS":{"type":"const","value":0},"starkware.cairo.common.math.assert_not_zero.value":{"cairo_type":"felt","full_name":"starkware.cairo.common.math.assert_not_zero.value","references":[{"ap_tracking_data":{"group":2,"offset":0},"pc":18,"value":"[cast(fp + (-3), felt*)]"}],"type":"reference"},"starkware.cairo.common.memcpy.memcpy":{"decorators":[],"pc":3,"type":"function"},"starkware.cairo.common.memcpy.memcpy.Args":{"full_name":"starkware.cairo.common.memcpy.memcpy.Args","members":{"dst":{"cairo_type":"felt*","offset":0},"len":{"cairo_type":"felt","offset":2},"src":{"cairo_type":"felt*","offset":1}},"size":3,"type":"struct"},"starkware.cairo.common.memcpy.memcpy.ImplicitArgs":{"full_name":"starkware.cairo.common.memcpy.memcpy.ImplicitArgs","members":{},"size":0,"type":"struct"},"starkware.cairo.common.memcpy.memcpy.LoopFrame":{"full_name":"starkware.cairo.common.memcpy.memcpy.LoopFrame","members":{"dst":{"cairo_type":"felt*","offset":0},"src":{"cairo_type":"felt*","offset":1}},"size":2,"type":"struct"},"starkware.cairo.common.memcpy.memcpy.Return":{"cairo_type":"()","type":"type_definition"},"starkware.cairo.common.memcpy.memcpy.SIZEOF_LOCALS":{"type":"const","value":0},"starkware.cairo.common.memcpy.memcpy.continue_copying":{"cairo_type":"felt","full_name":"starkware.cairo.common.memcpy.memcpy.continue_copying","references":[{"ap_tracking_data":{"group":1,"offset":3},"pc":10,"value":"[cast(ap, felt*)]"}],"type":"reference"},"starkware.cairo.common.memcpy.memcpy.len":{"cairo_type":"felt","full_name":"starkware.cairo.common.memcpy.memcpy.len","references":[{"ap_tracking_data":{"group":1,"offset":0},"pc":3,"value":"[cast(fp + (-3), felt*)]"}],"type":"reference"},"starkware.cairo.common.memcpy.memcpy.loop":{"pc":8,"type":"label"},"starkware.cairo.common.signature.EcOpBuiltin":{"destination":"starkware.cairo.common.cairo_builtins.EcOpBuiltin","type":"alias"},"starkware.cairo.common.signature.EcPoint":{"destination":"starkware.cairo.common.ec_point.EcPoint","type":"alias"},"starkware.cairo.common.signature.FALSE":{"destination":"starkware.cairo.common.bool.FALSE","type":"alias"},"starkware.cairo.common.signature.SignatureBuiltin":{"destination":"starkware.cairo.common.cairo_builtins.SignatureBuiltin","type":"alias"},"starkware.cairo.common.signature.StarkCurve":{"destination":"starkware.cairo.common.ec.StarkCurve","type":"alias"},"starkware.cairo.common.signature.TRUE":{"destination":"starkware.cairo.common.bool.TRUE","type":"alias"},"starkware.cairo.common.signature.ec_add":{"destination":"starkware.cairo.common.ec.ec_add","type":"alias"},"starkware.cairo.common.signature.ec_mul":{"destination":"starkware.cairo.common.ec.ec_mul","type":"alias"},"starkware.cairo.common.signature.ec_sub":{"destination":"starkware.cairo.common.ec.ec_sub","type":"alias"},"starkware.cairo.common.signature.is_x_on_curve":{"destination":"starkware.cairo.common.ec.is_x_on_curve","type":"alias"},"starkware.cairo.common.signature.recover_y":{"destination":"starkware.cairo.common.ec.recover_y","type":"alias"},"starkware.cairo.common.signature.verify_ecdsa_signature":{"decorators":[],"pc":195,"type":"function"},"starkware.cairo.common.signature.verify_ecdsa_signature.Args":{"full_name":"starkware.cairo.common.signature.verify_ecdsa_signature.Args","members":{"message":{"cairo_type":"felt","offset":0},"public_key":{"cairo_type":"felt","offset":1},"signature_r":{"cairo_type":"felt","offset":2},"signature_s":{"cairo_type":"felt","offset":3}},"size":4,"type":"struct"},"starkware.cairo.common.signature.verify_ecdsa_signature.ImplicitArgs":{"full_name":"starkware.cairo.common.signature.verify_ecdsa_signature.ImplicitArgs","members":{"ecdsa_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.SignatureBuiltin*","offset":0}},"size":1,"type":"struct"},"starkware.cairo.common.signature.verify_ecdsa_signature.Return":{"cairo_type":"()","type":"type_definition"},"starkware.cairo.common.signature.verify_ecdsa_signature.SIZEOF_LOCALS":{"type":"const","value":0},"starkware.cairo.common.signature.verify_ecdsa_signature.ecdsa_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.SignatureBuiltin*","full_name":"starkware.cairo.common.signature.verify_ecdsa_signature.ecdsa_ptr","references":[{"ap_tracking_data":{"group":22,"offset":0},"pc":195,"value":"[cast(fp + (-7), starkware.cairo.common.cairo_builtins.SignatureBuiltin**)]"},{"ap_tracking_data":{"group":22,"offset":0},"pc":197,"value":"cast([fp + (-7)] + 2, starkware.cairo.common.cairo_builtins.SignatureBuiltin*)"}],"type":"reference"},"starkware.cairo.common.signature.verify_ecdsa_signature.signature_r":{"cairo_type":"felt","full_name":"starkware.cairo.common.signature.verify_ecdsa_signature.signature_r","references":[{"ap_tracking_data":{"group":22,"offset":0},"pc":195,"value":"[cast(fp + (-4), felt*)]"}],"type":"reference"},"starkware.cairo.common.signature.verify_ecdsa_signature.signature_s":{"cairo_type":"felt","full_name":"starkware.cairo.common.signature.verify_ecdsa_signature.signature_s","references":[{"ap_tracking_data":{"group":22,"offset":0},"pc":195,"value":"[cast(fp + (-3), felt*)]"}],"type":"reference"},"starkware.starknet.common.storage.ADDR_BOUND":{"type":"const","value":-1.0671072950157357e+59},"starkware.starknet.common.storage.MAX_STORAGE_ITEM_SIZE":{"type":"const","value":256},"starkware.starknet.common.storage.assert_250_bit":{"destination":"starkware.cairo.common.math.assert_250_bit","type":"alias"},"starkware.starknet.common.syscalls.CALL_CONTRACT_SELECTOR":{"type":"const","value":2.0853273475220474e+28},"starkware.starknet.common.syscalls.CallContract":{"full_name":"starkware.starknet.common.syscalls.CallContract","members":{"request":{"cairo_type":"starkware.starknet.common.syscalls.CallContractRequest","offset":0},"response":{"cairo_type":"starkware.starknet.common.syscalls.CallContractResponse","offset":5}},"size":7,"type":"struct"},"starkware.starknet.common.syscalls.CallContractRequest":{"full_name":"starkware.starknet.common.syscalls.CallContractRequest","members":{"calldata":{"cairo_type":"felt*","offset":4},"calldata_size":{"cairo_type":"felt","offset":3},"contract_address":{"cairo_type":"felt","offset":1},"function_selector":{"cairo_type":"felt","offset":2},"selector":{"cairo_type":"felt","offset":0}},"size":5,"type":"struct"},"starkware.starknet.common.syscalls.CallContractResponse":{"full_name":"starkware.starknet.common.syscalls.CallContractResponse","members":{"retdata":{"cairo_type":"felt*","offset":1},"retdata_size":{"cairo_type":"felt","offset":0}},"size":2,"type":"struct"},"starkware.starknet.common.syscalls.DELEGATE_CALL_SELECTOR":{"type":"const","value":2.1167594061783206e+28},"starkware.starknet.common.syscalls.DELEGATE_L1_HANDLER_SELECTOR":{"type":"const","value":2.3274015802972845e+40},"starkware.starknet.common.syscalls.DEPLOY_SELECTOR":{"type":"const","value":75202468540281},"starkware.starknet.common.syscalls.Deploy":{"full_name":"starkware.starknet.common.syscalls.Deploy","members":{"request":{"cairo_type":"starkware.starknet.common.syscalls.DeployRequest","offset":0},"response":{"cairo_type":"starkware.starknet.common.syscalls.DeployResponse","offset":6}},"size":9,"type":"struct"},"starkware.starknet.common.syscalls.DeployRequest":{"full_name":"starkware.starknet.common.syscalls.DeployRequest","members":{"class_hash":{"cairo_type":"felt","offset":1},"constructor_calldata":{"cairo_type":"felt*","offset":4},"constructor_calldata_size":{"cairo_type":"felt","offset":3},"contract_address_salt":{"cairo_type":"felt","offset":2},"deploy_from_zero":{"cairo_type":"felt","offset":5},"selector":{"cairo_type":"felt","offset":0}},"size":6,"type":"struct"},"starkware.starknet.common.syscalls.DeployResponse":{"full_name":"starkware.starknet.common.syscalls.DeployResponse","members":{"constructor_retdata":{"cairo_type":"felt*","offset":2},"constructor_retdata_size":{"cairo_type":"felt","offset":1},"contract_address":{"cairo_type":"felt","offset":0}},"size":3,"type":"struct"},"starkware.starknet.common.syscalls.DictAccess":{"destination":"starkware.cairo.common.dict_access.DictAccess","type":"alias"},"starkware.starknet.common.syscalls.EMIT_EVENT_SELECTOR":{"type":"const","value":1.2807093015503357e+21},"starkware.starknet.common.syscalls.EmitEvent":{"full_name":"starkware.starknet.common.syscalls.EmitEvent","members":{"data":{"cairo_type":"felt*","offset":4},"data_len":{"cairo_type":"felt","offset":3},"keys":{"cairo_type":"felt*","offset":2},"keys_len":{"cairo_type":"felt","offset":1},"selector":{"cairo_type":"felt","offset":0}},"size":5,"type":"struct"},"starkware.starknet.common.syscalls.GET_BLOCK_NUMBER_SELECTOR":{"type":"const","value":1.448089106835523e+33},"starkware.starknet.common.syscalls.GET_BLOCK_TIMESTAMP_SELECTOR":{"type":"const","value":2.4294903732626647e+40},"starkware.starknet.common.syscalls.GET_CALLER_ADDRESS_SELECTOR":{"type":"const","value":9.490196778139308e+37},"starkware.starknet.common.syscalls.GET_CONTRACT_ADDRESS_SELECTOR":{"type":"const","value":6.219495360805491e+42},"starkware.starknet.common.syscalls.GET_SEQUENCER_ADDRESS_SELECTOR":{"type":"const","value":1.5921908335819916e+45},"starkware.starknet.common.syscalls.GET_TX_INFO_SELECTOR":{"type":"const","value":1.3170293902041122e+21},"starkware.starknet.common.syscalls.GET_TX_SIGNATURE_SELECTOR":{"type":"const","value":1.44808912865234e+33},"starkware.starknet.common.syscalls.GetBlockNumber":{"full_name":"starkware.starknet.common.syscalls.GetBlockNumber","members":{"request":{"cairo_type":"starkware.starknet.common.syscalls.GetBlockNumberRequest","offset":0},"response":{"cairo_type":"starkware.starknet.common.syscalls.GetBlockNumberResponse","offset":1}},"size":2,"type":"struct"},"starkware.starknet.common.syscalls.GetBlockNumberRequest":{"full_name":"starkware.starknet.common.syscalls.GetBlockNumberRequest","members":{"selector":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"starkware.starknet.common.syscalls.GetBlockNumberResponse":{"full_name":"starkware.starknet.common.syscalls.GetBlockNumberResponse","members":{"block_number":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"starkware.starknet.common.syscalls.GetBlockTimestamp":{"full_name":"starkware.starknet.common.syscalls.GetBlockTimestamp","members":{"request":{"cairo_type":"starkware.starknet.common.syscalls.GetBlockTimestampRequest","offset":0},"response":{"cairo_type":"starkware.starknet.common.syscalls.GetBlockTimestampResponse","offset":1}},"size":2,"type":"struct"},"starkware.starknet.common.syscalls.GetBlockTimestampRequest":{"full_name":"starkware.starknet.common.syscalls.GetBlockTimestampRequest","members":{"selector":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"starkware.starknet.common.syscalls.GetBlockTimestampResponse":{"full_name":"starkware.starknet.common.syscalls.GetBlockTimestampResponse","members":{"block_timestamp":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"starkware.starknet.common.syscalls.GetCallerAddress":{"full_name":"starkware.starknet.common.syscalls.GetCallerAddress","members":{"request":{"cairo_type":"starkware.starknet.common.syscalls.GetCallerAddressRequest","offset":0},"response":{"cairo_type":"starkware.starknet.common.syscalls.GetCallerAddressResponse","offset":1}},"size":2,"type":"struct"},"starkware.starknet.common.syscalls.GetCallerAddressRequest":{"full_name":"starkware.starknet.common.syscalls.GetCallerAddressRequest","members":{"selector":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"starkware.starknet.common.syscalls.GetCallerAddressResponse":{"full_name":"starkware.starknet.common.syscalls.GetCallerAddressResponse","members":{"caller_address":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"starkware.starknet.common.syscalls.GetContractAddress":{"full_name":"starkware.starknet.common.syscalls.GetContractAddress","members":{"request":{"cairo_type":"starkware.starknet.common.syscalls.GetContractAddressRequest","offset":0},"response":{"cairo_type":"starkware.starknet.common.syscalls.GetContractAddressResponse","offset":1}},"size":2,"type":"struct"},"starkware.starknet.common.syscalls.GetContractAddressRequest":{"full_name":"starkware.starknet.common.syscalls.GetContractAddressRequest","members":{"selector":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"starkware.starknet.common.syscalls.GetContractAddressResponse":{"full_name":"starkware.starknet.common.syscalls.GetContractAddressResponse","members":{"contract_address":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"starkware.starknet.common.syscalls.GetSequencerAddress":{"full_name":"starkware.starknet.common.syscalls.GetSequencerAddress","members":{"request":{"cairo_type":"starkware.starknet.common.syscalls.GetSequencerAddressRequest","offset":0},"response":{"cairo_type":"starkware.starknet.common.syscalls.GetSequencerAddressResponse","offset":1}},"size":2,"type":"struct"},"starkware.starknet.common.syscalls.GetSequencerAddressRequest":{"full_name":"starkware.starknet.common.syscalls.GetSequencerAddressRequest","members":{"selector":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"starkware.starknet.common.syscalls.GetSequencerAddressResponse":{"full_name":"starkware.starknet.common.syscalls.GetSequencerAddressResponse","members":{"sequencer_address":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"starkware.starknet.common.syscalls.GetTxInfo":{"full_name":"starkware.starknet.common.syscalls.GetTxInfo","members":{"request":{"cairo_type":"starkware.starknet.common.syscalls.GetTxInfoRequest","offset":0},"response":{"cairo_type":"starkware.starknet.common.syscalls.GetTxInfoResponse","offset":1}},"size":2,"type":"struct"},"starkware.starknet.common.syscalls.GetTxInfoRequest":{"full_name":"starkware.starknet.common.syscalls.GetTxInfoRequest","members":{"selector":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"starkware.starknet.common.syscalls.GetTxInfoResponse":{"full_name":"starkware.starknet.common.syscalls.GetTxInfoResponse","members":{"tx_info":{"cairo_type":"starkware.starknet.common.syscalls.TxInfo*","offset":0}},"size":1,"type":"struct"},"starkware.starknet.common.syscalls.GetTxSignature":{"full_name":"starkware.starknet.common.syscalls.GetTxSignature","members":{"request":{"cairo_type":"starkware.starknet.common.syscalls.GetTxSignatureRequest","offset":0},"response":{"cairo_type":"starkware.starknet.common.syscalls.GetTxSignatureResponse","offset":1}},"size":3,"type":"struct"},"starkware.starknet.common.syscalls.GetTxSignatureRequest":{"full_name":"starkware.starknet.common.syscalls.GetTxSignatureRequest","members":{"selector":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"starkware.starknet.common.syscalls.GetTxSignatureResponse":{"full_name":"starkware.starknet.common.syscalls.GetTxSignatureResponse","members":{"signature":{"cairo_type":"felt*","offset":1},"signature_len":{"cairo_type":"felt","offset":0}},"size":2,"type":"struct"},"starkware.starknet.common.syscalls.LIBRARY_CALL_L1_HANDLER_SELECTOR":{"type":"const","value":4.362334527541981e+47},"starkware.starknet.common.syscalls.LIBRARY_CALL_SELECTOR":{"type":"const","value":9.2376026794327e+25},"starkware.starknet.common.syscalls.LibraryCall":{"full_name":"starkware.starknet.common.syscalls.LibraryCall","members":{"request":{"cairo_type":"starkware.starknet.common.syscalls.LibraryCallRequest","offset":0},"response":{"cairo_type":"starkware.starknet.common.syscalls.CallContractResponse","offset":5}},"size":7,"type":"struct"},"starkware.starknet.common.syscalls.LibraryCallRequest":{"full_name":"starkware.starknet.common.syscalls.LibraryCallRequest","members":{"calldata":{"cairo_type":"felt*","offset":4},"calldata_size":{"cairo_type":"felt","offset":3},"class_hash":{"cairo_type":"felt","offset":1},"function_selector":{"cairo_type":"felt","offset":2},"selector":{"cairo_type":"felt","offset":0}},"size":5,"type":"struct"},"starkware.starknet.common.syscalls.SEND_MESSAGE_TO_L1_SELECTOR":{"type":"const","value":4.3301790876830345e+35},"starkware.starknet.common.syscalls.STORAGE_READ_SELECTOR":{"type":"const","value":1.0089069337060175e+26},"starkware.starknet.common.syscalls.STORAGE_WRITE_SELECTOR":{"type":"const","value":2.582801750287405e+28},"starkware.starknet.common.syscalls.SendMessageToL1SysCall":{"full_name":"starkware.starknet.common.syscalls.SendMessageToL1SysCall","members":{"payload_ptr":{"cairo_type":"felt*","offset":3},"payload_size":{"cairo_type":"felt","offset":2},"selector":{"cairo_type":"felt","offset":0},"to_address":{"cairo_type":"felt","offset":1}},"size":4,"type":"struct"},"starkware.starknet.common.syscalls.StorageRead":{"full_name":"starkware.starknet.common.syscalls.StorageRead","members":{"request":{"cairo_type":"starkware.starknet.common.syscalls.StorageReadRequest","offset":0},"response":{"cairo_type":"starkware.starknet.common.syscalls.StorageReadResponse","offset":2}},"size":3,"type":"struct"},"starkware.starknet.common.syscalls.StorageReadRequest":{"full_name":"starkware.starknet.common.syscalls.StorageReadRequest","members":{"address":{"cairo_type":"felt","offset":1},"selector":{"cairo_type":"felt","offset":0}},"size":2,"type":"struct"},"starkware.starknet.common.syscalls.StorageReadResponse":{"full_name":"starkware.starknet.common.syscalls.StorageReadResponse","members":{"value":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"starkware.starknet.common.syscalls.StorageWrite":{"full_name":"starkware.starknet.common.syscalls.StorageWrite","members":{"address":{"cairo_type":"felt","offset":1},"selector":{"cairo_type":"felt","offset":0},"value":{"cairo_type":"felt","offset":2}},"size":3,"type":"struct"},"starkware.starknet.common.syscalls.TxInfo":{"full_name":"starkware.starknet.common.syscalls.TxInfo","members":{"account_contract_address":{"cairo_type":"felt","offset":1},"chain_id":{"cairo_type":"felt","offset":6},"max_fee":{"cairo_type":"felt","offset":2},"nonce":{"cairo_type":"felt","offset":7},"signature":{"cairo_type":"felt*","offset":4},"signature_len":{"cairo_type":"felt","offset":3},"transaction_hash":{"cairo_type":"felt","offset":5},"version":{"cairo_type":"felt","offset":0}},"size":8,"type":"struct"},"starkware.starknet.common.syscalls.call_contract":{"decorators":[],"pc":32,"type":"function"},"starkware.starknet.common.syscalls.call_contract.Args":{"full_name":"starkware.starknet.common.syscalls.call_contract.Args","members":{"calldata":{"cairo_type":"felt*","offset":3},"calldata_size":{"cairo_type":"felt","offset":2},"contract_address":{"cairo_type":"felt","offset":0},"function_selector":{"cairo_type":"felt","offset":1}},"size":4,"type":"struct"},"starkware.starknet.common.syscalls.call_contract.ImplicitArgs":{"full_name":"starkware.starknet.common.syscalls.call_contract.ImplicitArgs","members":{"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":1,"type":"struct"},"starkware.starknet.common.syscalls.call_contract.Return":{"cairo_type":"(retdata_size: felt, retdata: felt*)","type":"type_definition"},"starkware.starknet.common.syscalls.call_contract.SIZEOF_LOCALS":{"type":"const","value":0},"starkware.starknet.common.syscalls.call_contract.syscall_ptr":{"cairo_type":"felt*","full_name":"starkware.starknet.common.syscalls.call_contract.syscall_ptr","references":[{"ap_tracking_data":{"group":5,"offset":0},"pc":32,"value":"[cast(fp + (-7), felt**)]"},{"ap_tracking_data":{"group":5,"offset":1},"pc":39,"value":"cast([fp + (-7)] + 7, felt*)"}],"type":"reference"},"starkware.starknet.common.syscalls.emit_event":{"decorators":[],"pc":93,"type":"function"},"starkware.starknet.common.syscalls.emit_event.Args":{"full_name":"starkware.starknet.common.syscalls.emit_event.Args","members":{"data":{"cairo_type":"felt*","offset":3},"data_len":{"cairo_type":"felt","offset":2},"keys":{"cairo_type":"felt*","offset":1},"keys_len":{"cairo_type":"felt","offset":0}},"size":4,"type":"struct"},"starkware.starknet.common.syscalls.emit_event.ImplicitArgs":{"full_name":"starkware.starknet.common.syscalls.emit_event.ImplicitArgs","members":{"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":1,"type":"struct"},"starkware.starknet.common.syscalls.emit_event.Return":{"cairo_type":"()","type":"type_definition"},"starkware.starknet.common.syscalls.emit_event.SIZEOF_LOCALS":{"type":"const","value":0},"starkware.starknet.common.syscalls.emit_event.syscall_ptr":{"cairo_type":"felt*","full_name":"starkware.starknet.common.syscalls.emit_event.syscall_ptr","references":[{"ap_tracking_data":{"group":12,"offset":0},"pc":93,"value":"[cast(fp + (-7), felt**)]"},{"ap_tracking_data":{"group":12,"offset":1},"pc":100,"value":"cast([fp + (-7)] + 5, felt*)"}],"type":"reference"},"starkware.starknet.common.syscalls.get_block_timestamp":{"decorators":[],"pc":70,"type":"function"},"starkware.starknet.common.syscalls.get_block_timestamp.Args":{"full_name":"starkware.starknet.common.syscalls.get_block_timestamp.Args","members":{},"size":0,"type":"struct"},"starkware.starknet.common.syscalls.get_block_timestamp.ImplicitArgs":{"full_name":"starkware.starknet.common.syscalls.get_block_timestamp.ImplicitArgs","members":{"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":1,"type":"struct"},"starkware.starknet.common.syscalls.get_block_timestamp.Return":{"cairo_type":"(block_timestamp: felt)","type":"type_definition"},"starkware.starknet.common.syscalls.get_block_timestamp.SIZEOF_LOCALS":{"type":"const","value":0},"starkware.starknet.common.syscalls.get_block_timestamp.syscall_ptr":{"cairo_type":"felt*","full_name":"starkware.starknet.common.syscalls.get_block_timestamp.syscall_ptr","references":[{"ap_tracking_data":{"group":9,"offset":0},"pc":70,"value":"[cast(fp + (-3), felt**)]"},{"ap_tracking_data":{"group":9,"offset":1},"pc":73,"value":"cast([fp + (-3)] + 2, felt*)"}],"type":"reference"},"starkware.starknet.common.syscalls.get_caller_address":{"decorators":[],"pc":56,"type":"function"},"starkware.starknet.common.syscalls.get_caller_address.Args":{"full_name":"starkware.starknet.common.syscalls.get_caller_address.Args","members":{},"size":0,"type":"struct"},"starkware.starknet.common.syscalls.get_caller_address.ImplicitArgs":{"full_name":"starkware.starknet.common.syscalls.get_caller_address.ImplicitArgs","members":{"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":1,"type":"struct"},"starkware.starknet.common.syscalls.get_caller_address.Return":{"cairo_type":"(caller_address: felt)","type":"type_definition"},"starkware.starknet.common.syscalls.get_caller_address.SIZEOF_LOCALS":{"type":"const","value":0},"starkware.starknet.common.syscalls.get_caller_address.syscall_ptr":{"cairo_type":"felt*","full_name":"starkware.starknet.common.syscalls.get_caller_address.syscall_ptr","references":[{"ap_tracking_data":{"group":7,"offset":0},"pc":56,"value":"[cast(fp + (-3), felt**)]"},{"ap_tracking_data":{"group":7,"offset":1},"pc":59,"value":"cast([fp + (-3)] + 2, felt*)"}],"type":"reference"},"starkware.starknet.common.syscalls.get_contract_address":{"decorators":[],"pc":63,"type":"function"},"starkware.starknet.common.syscalls.get_contract_address.Args":{"full_name":"starkware.starknet.common.syscalls.get_contract_address.Args","members":{},"size":0,"type":"struct"},"starkware.starknet.common.syscalls.get_contract_address.ImplicitArgs":{"full_name":"starkware.starknet.common.syscalls.get_contract_address.ImplicitArgs","members":{"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":1,"type":"struct"},"starkware.starknet.common.syscalls.get_contract_address.Return":{"cairo_type":"(contract_address: felt)","type":"type_definition"},"starkware.starknet.common.syscalls.get_contract_address.SIZEOF_LOCALS":{"type":"const","value":0},"starkware.starknet.common.syscalls.get_contract_address.syscall_ptr":{"cairo_type":"felt*","full_name":"starkware.starknet.common.syscalls.get_contract_address.syscall_ptr","references":[{"ap_tracking_data":{"group":8,"offset":0},"pc":63,"value":"[cast(fp + (-3), felt**)]"},{"ap_tracking_data":{"group":8,"offset":1},"pc":66,"value":"cast([fp + (-3)] + 2, felt*)"}],"type":"reference"},"starkware.starknet.common.syscalls.get_tx_info":{"decorators":[],"pc":103,"type":"function"},"starkware.starknet.common.syscalls.get_tx_info.Args":{"full_name":"starkware.starknet.common.syscalls.get_tx_info.Args","members":{},"size":0,"type":"struct"},"starkware.starknet.common.syscalls.get_tx_info.ImplicitArgs":{"full_name":"starkware.starknet.common.syscalls.get_tx_info.ImplicitArgs","members":{"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":1,"type":"struct"},"starkware.starknet.common.syscalls.get_tx_info.Return":{"cairo_type":"(tx_info: starkware.starknet.common.syscalls.TxInfo*)","type":"type_definition"},"starkware.starknet.common.syscalls.get_tx_info.SIZEOF_LOCALS":{"type":"const","value":0},"starkware.starknet.common.syscalls.get_tx_info.syscall_ptr":{"cairo_type":"felt*","full_name":"starkware.starknet.common.syscalls.get_tx_info.syscall_ptr","references":[{"ap_tracking_data":{"group":13,"offset":0},"pc":103,"value":"[cast(fp + (-3), felt**)]"},{"ap_tracking_data":{"group":13,"offset":1},"pc":106,"value":"cast([fp + (-3)] + 2, felt*)"}],"type":"reference"},"starkware.starknet.common.syscalls.library_call":{"decorators":[],"pc":44,"type":"function"},"starkware.starknet.common.syscalls.library_call.Args":{"full_name":"starkware.starknet.common.syscalls.library_call.Args","members":{"calldata":{"cairo_type":"felt*","offset":3},"calldata_size":{"cairo_type":"felt","offset":2},"class_hash":{"cairo_type":"felt","offset":0},"function_selector":{"cairo_type":"felt","offset":1}},"size":4,"type":"struct"},"starkware.starknet.common.syscalls.library_call.ImplicitArgs":{"full_name":"starkware.starknet.common.syscalls.library_call.ImplicitArgs","members":{"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":1,"type":"struct"},"starkware.starknet.common.syscalls.library_call.Return":{"cairo_type":"(retdata_size: felt, retdata: felt*)","type":"type_definition"},"starkware.starknet.common.syscalls.library_call.SIZEOF_LOCALS":{"type":"const","value":0},"starkware.starknet.common.syscalls.library_call.syscall_ptr":{"cairo_type":"felt*","full_name":"starkware.starknet.common.syscalls.library_call.syscall_ptr","references":[{"ap_tracking_data":{"group":6,"offset":0},"pc":44,"value":"[cast(fp + (-7), felt**)]"},{"ap_tracking_data":{"group":6,"offset":1},"pc":51,"value":"cast([fp + (-7)] + 7, felt*)"}],"type":"reference"},"starkware.starknet.common.syscalls.storage_read":{"decorators":[],"pc":77,"type":"function"},"starkware.starknet.common.syscalls.storage_read.Args":{"full_name":"starkware.starknet.common.syscalls.storage_read.Args","members":{"address":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"starkware.starknet.common.syscalls.storage_read.ImplicitArgs":{"full_name":"starkware.starknet.common.syscalls.storage_read.ImplicitArgs","members":{"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":1,"type":"struct"},"starkware.starknet.common.syscalls.storage_read.Return":{"cairo_type":"(value: felt)","type":"type_definition"},"starkware.starknet.common.syscalls.storage_read.SIZEOF_LOCALS":{"type":"const","value":0},"starkware.starknet.common.syscalls.storage_read.syscall_ptr":{"cairo_type":"felt*","full_name":"starkware.starknet.common.syscalls.storage_read.syscall_ptr","references":[{"ap_tracking_data":{"group":10,"offset":0},"pc":77,"value":"[cast(fp + (-4), felt**)]"},{"ap_tracking_data":{"group":10,"offset":1},"pc":81,"value":"cast([fp + (-4)] + 3, felt*)"}],"type":"reference"},"starkware.starknet.common.syscalls.storage_write":{"decorators":[],"pc":85,"type":"function"},"starkware.starknet.common.syscalls.storage_write.Args":{"full_name":"starkware.starknet.common.syscalls.storage_write.Args","members":{"address":{"cairo_type":"felt","offset":0},"value":{"cairo_type":"felt","offset":1}},"size":2,"type":"struct"},"starkware.starknet.common.syscalls.storage_write.ImplicitArgs":{"full_name":"starkware.starknet.common.syscalls.storage_write.ImplicitArgs","members":{"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":1,"type":"struct"},"starkware.starknet.common.syscalls.storage_write.Return":{"cairo_type":"()","type":"type_definition"},"starkware.starknet.common.syscalls.storage_write.SIZEOF_LOCALS":{"type":"const","value":0},"starkware.starknet.common.syscalls.storage_write.syscall_ptr":{"cairo_type":"felt*","full_name":"starkware.starknet.common.syscalls.storage_write.syscall_ptr","references":[{"ap_tracking_data":{"group":11,"offset":0},"pc":85,"value":"[cast(fp + (-5), felt**)]"},{"ap_tracking_data":{"group":11,"offset":1},"pc":90,"value":"cast([fp + (-5)] + 3, felt*)"}],"type":"reference"}},"main_scope":"__main__","prime":"0x800000000000011000000000000000000000000000000000000000000000001","reference_manager":{"references":[{"ap_tracking_data":{"group":1,"offset":0},"pc":3,"value":"[cast(fp + (-3), felt*)]"},{"ap_tracking_data":{"group":1,"offset":3},"pc":10,"value":"[cast(ap, felt*)]"},{"ap_tracking_data":{"group":2,"offset":0},"pc":18,"value":"[cast(fp + (-3), felt*)]"},{"ap_tracking_data":{"group":3,"offset":0},"pc":23,"value":"[cast(fp + (-3), felt*)]"},{"ap_tracking_data":{"group":5,"offset":0},"pc":32,"value":"[cast(fp + (-7), felt**)]"},{"ap_tracking_data":{"group":6,"offset":0},"pc":44,"value":"[cast(fp + (-7), felt**)]"},{"ap_tracking_data":{"group":7,"offset":0},"pc":56,"value":"[cast(fp + (-3), felt**)]"},{"ap_tracking_data":{"group":8,"offset":0},"pc":63,"value":"[cast(fp + (-3), felt**)]"},{"ap_tracking_data":{"group":9,"offset":0},"pc":70,"value":"[cast(fp + (-3), felt**)]"},{"ap_tracking_data":{"group":10,"offset":0},"pc":77,"value":"[cast(fp + (-4), felt**)]"},{"ap_tracking_data":{"group":11,"offset":0},"pc":85,"value":"[cast(fp + (-5), felt**)]"},{"ap_tracking_data":{"group":12,"offset":0},"pc":93,"value":"[cast(fp + (-7), felt**)]"},{"ap_tracking_data":{"group":13,"offset":0},"pc":103,"value":"[cast(fp + (-3), felt**)]"},{"ap_tracking_data":{"group":19,"offset":0},"pc":159,"value":"[cast(fp + (-3), felt*)]"},{"ap_tracking_data":{"group":22,"offset":0},"pc":195,"value":"[cast(fp + (-4), felt*)]"},{"ap_tracking_data":{"group":22,"offset":0},"pc":195,"value":"[cast(fp + (-3), felt*)]"},{"ap_tracking_data":{"group":22,"offset":0},"pc":195,"value":"[cast(fp + (-7), starkware.cairo.common.cairo_builtins.SignatureBuiltin**)]"}]}}} ================================================ FILE: contract-artifacts/ArgentAccount/780760e4156afe592bb1feff7e769cf279ae9831/ArgentAccount.cairo/ArgentAccount_abi.json ================================================ [{ "members": [{ "name": "to", "offset": 0, "type": "felt" }, { "name": "selector", "offset": 1, "type": "felt" }, { "name": "data_offset", "offset": 2, "type": "felt" }, { "name": "data_len", "offset": 3, "type": "felt" }], "name": "CallArray", "size": 4, "type": "struct" }, { "data": [{ "name": "new_signer", "type": "felt" }], "keys": [], "name": "signer_changed", "type": "event" }, { "data": [{ "name": "new_guardian", "type": "felt" }], "keys": [], "name": "guardian_changed", "type": "event" }, { "data": [{ "name": "new_guardian", "type": "felt" }], "keys": [], "name": "guardian_backup_changed", "type": "event" }, { "data": [{ "name": "active_at", "type": "felt" }], "keys": [], "name": "escape_guardian_triggered", "type": "event" }, { "data": [{ "name": "active_at", "type": "felt" }], "keys": [], "name": "escape_signer_triggered", "type": "event" }, { "data": [], "keys": [], "name": "escape_canceled", "type": "event" }, { "data": [{ "name": "new_guardian", "type": "felt" }], "keys": [], "name": "guardian_escaped", "type": "event" }, { "data": [{ "name": "new_signer", "type": "felt" }], "keys": [], "name": "signer_escaped", "type": "event" }, { "data": [{ "name": "new_implementation", "type": "felt" }], "keys": [], "name": "account_upgraded", "type": "event" }, { "data": [{ "name": "account", "type": "felt" }, { "name": "key", "type": "felt" }, { "name": "guardian", "type": "felt" }], "keys": [], "name": "account_created", "type": "event" }, { "data": [{ "name": "hash", "type": "felt" }, { "name": "response_len", "type": "felt" }, { "name": "response", "type": "felt*" }], "keys": [], "name": "transaction_executed", "type": "event" }, { "inputs": [{ "name": "call_array_len", "type": "felt" }, { "name": "call_array", "type": "CallArray*" }, { "name": "calldata_len", "type": "felt" }, { "name": "calldata", "type": "felt*" }], "name": "__validate__", "outputs": [], "type": "function" }, { "inputs": [{ "name": "call_array_len", "type": "felt" }, { "name": "call_array", "type": "CallArray*" }, { "name": "calldata_len", "type": "felt" }, { "name": "calldata", "type": "felt*" }], "name": "__execute__", "outputs": [{ "name": "retdata_size", "type": "felt" }, { "name": "retdata", "type": "felt*" }], "type": "function" }, { "inputs": [{ "name": "class_hash", "type": "felt" }], "name": "__validate_declare__", "outputs": [], "type": "function" }, { "inputs": [{ "name": "selector", "type": "felt" }, { "name": "calldata_size", "type": "felt" }, { "name": "calldata", "type": "felt*" }], "name": "__validate_deploy__", "outputs": [], "type": "function" }, { "inputs": [{ "name": "hash", "type": "felt" }, { "name": "sig_len", "type": "felt" }, { "name": "sig", "type": "felt*" }], "name": "isValidSignature", "outputs": [{ "name": "isValid", "type": "felt" }], "stateMutability": "view", "type": "function" }, { "inputs": [{ "name": "interfaceId", "type": "felt" }], "name": "supportsInterface", "outputs": [{ "name": "success", "type": "felt" }], "stateMutability": "view", "type": "function" }, { "inputs": [{ "name": "signer", "type": "felt" }, { "name": "guardian", "type": "felt" }], "name": "initialize", "outputs": [], "type": "function" }, { "inputs": [{ "name": "implementation", "type": "felt" }, { "name": "calldata_len", "type": "felt" }, { "name": "calldata", "type": "felt*" }], "name": "upgrade", "outputs": [{ "name": "retdata_len", "type": "felt" }, { "name": "retdata", "type": "felt*" }], "type": "function" }, { "inputs": [{ "name": "call_array_len", "type": "felt" }, { "name": "call_array", "type": "CallArray*" }, { "name": "calldata_len", "type": "felt" }, { "name": "calldata", "type": "felt*" }], "name": "execute_after_upgrade", "outputs": [{ "name": "retdata_len", "type": "felt" }, { "name": "retdata", "type": "felt*" }], "type": "function" }, { "inputs": [{ "name": "newSigner", "type": "felt" }], "name": "changeSigner", "outputs": [], "type": "function" }, { "inputs": [{ "name": "newGuardian", "type": "felt" }], "name": "changeGuardian", "outputs": [], "type": "function" }, { "inputs": [{ "name": "newGuardian", "type": "felt" }], "name": "changeGuardianBackup", "outputs": [], "type": "function" }, { "inputs": [], "name": "triggerEscapeGuardian", "outputs": [], "type": "function" }, { "inputs": [], "name": "triggerEscapeSigner", "outputs": [], "type": "function" }, { "inputs": [], "name": "cancelEscape", "outputs": [], "type": "function" }, { "inputs": [{ "name": "newGuardian", "type": "felt" }], "name": "escapeGuardian", "outputs": [], "type": "function" }, { "inputs": [{ "name": "newSigner", "type": "felt" }], "name": "escapeSigner", "outputs": [], "type": "function" }, { "inputs": [], "name": "getSigner", "outputs": [{ "name": "signer", "type": "felt" }], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "getGuardian", "outputs": [{ "name": "guardian", "type": "felt" }], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "getGuardianBackup", "outputs": [{ "name": "guardianBackup", "type": "felt" }], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "getEscape", "outputs": [{ "name": "activeAt", "type": "felt" }, { "name": "type", "type": "felt" }], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "getVersion", "outputs": [{ "name": "version", "type": "felt" }], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "getName", "outputs": [{ "name": "name", "type": "felt" }], "stateMutability": "view", "type": "function" }, { "inputs": [{ "name": "hash", "type": "felt" }, { "name": "sig_len", "type": "felt" }, { "name": "sig", "type": "felt*" }], "name": "is_valid_signature", "outputs": [{ "name": "is_valid", "type": "felt" }], "stateMutability": "view", "type": "function" }] ================================================ FILE: contract-artifacts/ArgentAccount/780760e4156afe592bb1feff7e769cf279ae9831/Proxy.cairo/Proxy.json ================================================ {"abi":[{"inputs":[{"name":"implementation","type":"felt"},{"name":"selector","type":"felt"},{"name":"calldata_len","type":"felt"},{"name":"calldata","type":"felt*"}],"name":"constructor","outputs":[],"type":"constructor"},{"inputs":[{"name":"selector","type":"felt"},{"name":"calldata_size","type":"felt"},{"name":"calldata","type":"felt*"}],"name":"__default__","outputs":[{"name":"retdata_size","type":"felt"},{"name":"retdata","type":"felt*"}],"type":"function"},{"inputs":[{"name":"selector","type":"felt"},{"name":"calldata_size","type":"felt"},{"name":"calldata","type":"felt*"}],"name":"__l1_default__","outputs":[],"type":"l1_handler"},{"inputs":[],"name":"get_implementation","outputs":[{"name":"implementation","type":"felt"}],"stateMutability":"view","type":"function"}],"entry_points_by_type":{"CONSTRUCTOR":[{"offset":"0x6c","selector":"0x28ffe4ff0f226a9107253e17a904099aa4f63a02a5621de0576e5aa71bc5194"}],"EXTERNAL":[{"offset":"0x9b","selector":"0x0"},{"offset":"0xd4","selector":"0x21691762da057c1b71f851f9b709e0c143628acf6e0cbc9735411a65663d747"}],"L1_HANDLER":[{"offset":"0xb4","selector":"0x0"}]},"program":{"attributes":[],"builtins":["pedersen","range_check"],"compiler_version":"0.10.2","data":["0x20780017fff7ffd","0x4","0x400780017fff7ffd","0x1","0x208b7fff7fff7ffe","0x480680017fff8000","0x4c69627261727943616c6c","0x400280007ff97fff","0x400380017ff97ffa","0x400380027ff97ffb","0x400380037ff97ffc","0x400380047ff97ffd","0x482680017ff98000","0x7","0x480280057ff98000","0x480280067ff98000","0x208b7fff7fff7ffe","0x480680017fff8000","0x4c69627261727943616c6c4c3148616e646c6572","0x400280007ff97fff","0x400380017ff97ffa","0x400380027ff97ffb","0x400380037ff97ffc","0x400380047ff97ffd","0x482680017ff98000","0x7","0x480280057ff98000","0x480280067ff98000","0x208b7fff7fff7ffe","0x480680017fff8000","0x53746f7261676552656164","0x400280007ffc7fff","0x400380017ffc7ffd","0x482680017ffc8000","0x3","0x480280027ffc8000","0x208b7fff7fff7ffe","0x480680017fff8000","0x53746f726167655772697465","0x400280007ffb7fff","0x400380017ffb7ffc","0x400380027ffb7ffd","0x482680017ffb8000","0x3","0x208b7fff7fff7ffe","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x480680017fff8000","0xf920571b9f85bdd92a867cfdc73319d0f8836f0e69e06e4c5566b6203f75cc","0x208b7fff7fff7ffe","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffffa","0x480a7ffb7fff8000","0x48127ffe7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffe6","0x48127ffe7fff8000","0x48127ff57fff8000","0x48127ff57fff8000","0x48127ffc7fff8000","0x208b7fff7fff7ffe","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffed","0x480a7ffa7fff8000","0x48127ffe7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffe0","0x48127ff67fff8000","0x48127ff67fff8000","0x208b7fff7fff7ffe","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffe5","0x208b7fff7fff7ffe","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffaf","0x480a7ffa7fff8000","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffe8","0x208b7fff7fff7ffe","0x480a7ff77fff8000","0x480a7ff87fff8000","0x480a7ff97fff8000","0x480a7ffa7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffff3","0x48127ffd7fff8000","0x480a7ffa7fff8000","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffa0","0x48127ffd7fff8000","0x48127ff27fff8000","0x48127ff27fff8000","0x208b7fff7fff7ffe","0x480280027ffb8000","0x480280027ffd8000","0x400080007ffe7fff","0x482680017ffd8000","0x3","0x480280027ffd8000","0x48307fff7ffe8000","0x402a7ffd7ffc7fff","0x480280027ffb8000","0x480280007ffb8000","0x480280017ffb8000","0x482480017ffd8000","0x1","0x480280007ffd8000","0x480280017ffd8000","0x480280027ffd8000","0x482680017ffd8000","0x3","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffde","0x40780017fff7fff","0x1","0x48127ffc7fff8000","0x48127ffc7fff8000","0x48127ffc7fff8000","0x480680017fff8000","0x0","0x48127ffb7fff8000","0x208b7fff7fff7ffe","0x480a7ff87fff8000","0x480a7ff97fff8000","0x480a7ffa7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffc0","0x48127ffc7fff8000","0x48127ffe7fff8000","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff73","0x48127ffd7fff8000","0x48127ff17fff8000","0x48127ff17fff8000","0x48127ffb7fff8000","0x48127ffb7fff8000","0x208b7fff7fff7ffe","0x480280007ffb8000","0x480280017ffb8000","0x480280027ffb8000","0x480a7ffa7fff8000","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffe9","0x208b7fff7fff7ffe","0x480a7ff87fff8000","0x480a7ff97fff8000","0x480a7ffa7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffa5","0x48127ffc7fff8000","0x48127ffe7fff8000","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff64","0x48127ffd7fff8000","0x48127ff17fff8000","0x48127ff17fff8000","0x208b7fff7fff7ffe","0x480280007ffb8000","0x480280017ffb8000","0x480280027ffb8000","0x480a7ffa7fff8000","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffeb","0x40780017fff7fff","0x1","0x48127ffc7fff8000","0x48127ffc7fff8000","0x48127ffc7fff8000","0x480680017fff8000","0x0","0x48127ffb7fff8000","0x208b7fff7fff7ffe","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff84","0x208b7fff7fff7ffe","0x40780017fff7fff","0x1","0x4003800080007ffc","0x4826800180008000","0x1","0x480a7ffd7fff8000","0x4828800080007ffe","0x480a80007fff8000","0x208b7fff7fff7ffe","0x402b7ffd7ffc7ffd","0x480280007ffb8000","0x480280017ffb8000","0x480280027ffb8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffee","0x48127ffe7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffff1","0x48127ff47fff8000","0x48127ff47fff8000","0x48127ffb7fff8000","0x48127ffb7fff8000","0x48127ffb7fff8000","0x208b7fff7fff7ffe"],"hints":{"0":[{"accessible_scopes":["starkware.cairo.common.math","starkware.cairo.common.math.assert_not_zero"],"code":"from starkware.cairo.common.math_utils import assert_integer\nassert_integer(ids.value)\nassert ids.value % PRIME != 0, f'assert_not_zero failed: {ids.value} = 0.'","flow_tracking_data":{"ap_tracking":{"group":0,"offset":0},"reference_ids":{"starkware.cairo.common.math.assert_not_zero.value":0}}}],"12":[{"accessible_scopes":["starkware.starknet.common.syscalls","starkware.starknet.common.syscalls.library_call"],"code":"syscall_handler.library_call(segments=segments, syscall_ptr=ids.syscall_ptr)","flow_tracking_data":{"ap_tracking":{"group":1,"offset":1},"reference_ids":{"starkware.starknet.common.syscalls.library_call.syscall_ptr":1}}}],"24":[{"accessible_scopes":["starkware.starknet.common.syscalls","starkware.starknet.common.syscalls.library_call_l1_handler"],"code":"syscall_handler.library_call_l1_handler(segments=segments, syscall_ptr=ids.syscall_ptr)","flow_tracking_data":{"ap_tracking":{"group":2,"offset":1},"reference_ids":{"starkware.starknet.common.syscalls.library_call_l1_handler.syscall_ptr":2}}}],"33":[{"accessible_scopes":["starkware.starknet.common.syscalls","starkware.starknet.common.syscalls.storage_read"],"code":"syscall_handler.storage_read(segments=segments, syscall_ptr=ids.syscall_ptr)","flow_tracking_data":{"ap_tracking":{"group":3,"offset":1},"reference_ids":{"starkware.starknet.common.syscalls.storage_read.syscall_ptr":3}}}],"42":[{"accessible_scopes":["starkware.starknet.common.syscalls","starkware.starknet.common.syscalls.storage_write"],"code":"syscall_handler.storage_write(segments=segments, syscall_ptr=ids.syscall_ptr)","flow_tracking_data":{"ap_tracking":{"group":4,"offset":1},"reference_ids":{"starkware.starknet.common.syscalls.storage_write.syscall_ptr":4}}}],"128":[{"accessible_scopes":["__main__","__main__","__wrappers__","__wrappers__.constructor"],"code":"memory[ap] = segments.add()","flow_tracking_data":{"ap_tracking":{"group":11,"offset":60},"reference_ids":{}}}],"188":[{"accessible_scopes":["__main__","__main__","__wrappers__","__wrappers__.__l1_default__"],"code":"memory[ap] = segments.add()","flow_tracking_data":{"ap_tracking":{"group":15,"offset":50},"reference_ids":{}}}],"203":[{"accessible_scopes":["__main__","__main__","__wrappers__","__wrappers__.get_implementation_encode_return"],"code":"memory[ap] = segments.add()","flow_tracking_data":{"ap_tracking":{"group":17,"offset":0},"reference_ids":{}}}]},"identifiers":{"__main__.HashBuiltin":{"destination":"starkware.cairo.common.cairo_builtins.HashBuiltin","type":"alias"},"__main__.__default__":{"decorators":["external","raw_input","raw_output"],"pc":137,"type":"function"},"__main__.__default__.Args":{"full_name":"__main__.__default__.Args","members":{"calldata":{"cairo_type":"felt*","offset":2},"calldata_size":{"cairo_type":"felt","offset":1},"selector":{"cairo_type":"felt","offset":0}},"size":3,"type":"struct"},"__main__.__default__.ImplicitArgs":{"full_name":"__main__.__default__.ImplicitArgs","members":{"pedersen_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.HashBuiltin*","offset":1},"range_check_ptr":{"cairo_type":"felt","offset":2},"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":3,"type":"struct"},"__main__.__default__.Return":{"cairo_type":"(retdata_size: felt, retdata: felt*)","type":"type_definition"},"__main__.__default__.SIZEOF_LOCALS":{"type":"const","value":0},"__main__.__l1_default__":{"decorators":["l1_handler","raw_input"],"pc":164,"type":"function"},"__main__.__l1_default__.Args":{"full_name":"__main__.__l1_default__.Args","members":{"calldata":{"cairo_type":"felt*","offset":2},"calldata_size":{"cairo_type":"felt","offset":1},"selector":{"cairo_type":"felt","offset":0}},"size":3,"type":"struct"},"__main__.__l1_default__.ImplicitArgs":{"full_name":"__main__.__l1_default__.ImplicitArgs","members":{"pedersen_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.HashBuiltin*","offset":1},"range_check_ptr":{"cairo_type":"felt","offset":2},"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":3,"type":"struct"},"__main__.__l1_default__.Return":{"cairo_type":"()","type":"type_definition"},"__main__.__l1_default__.SIZEOF_LOCALS":{"type":"const","value":0},"__main__._get_implementation":{"destination":"contracts.upgrade.Upgradable._get_implementation","type":"alias"},"__main__._set_implementation":{"destination":"contracts.upgrade.Upgradable._set_implementation","type":"alias"},"__main__.constructor":{"decorators":["constructor"],"pc":91,"type":"function"},"__main__.constructor.Args":{"full_name":"__main__.constructor.Args","members":{"calldata":{"cairo_type":"felt*","offset":3},"calldata_len":{"cairo_type":"felt","offset":2},"implementation":{"cairo_type":"felt","offset":0},"selector":{"cairo_type":"felt","offset":1}},"size":4,"type":"struct"},"__main__.constructor.ImplicitArgs":{"full_name":"__main__.constructor.ImplicitArgs","members":{"pedersen_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.HashBuiltin*","offset":1},"range_check_ptr":{"cairo_type":"felt","offset":2},"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":3,"type":"struct"},"__main__.constructor.Return":{"cairo_type":"()","type":"type_definition"},"__main__.constructor.SIZEOF_LOCALS":{"type":"const","value":0},"__main__.get_implementation":{"decorators":["view"],"pc":197,"type":"function"},"__main__.get_implementation.Args":{"full_name":"__main__.get_implementation.Args","members":{},"size":0,"type":"struct"},"__main__.get_implementation.ImplicitArgs":{"full_name":"__main__.get_implementation.ImplicitArgs","members":{"pedersen_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.HashBuiltin*","offset":1},"range_check_ptr":{"cairo_type":"felt","offset":2},"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":3,"type":"struct"},"__main__.get_implementation.Return":{"cairo_type":"(implementation: felt)","type":"type_definition"},"__main__.get_implementation.SIZEOF_LOCALS":{"type":"const","value":0},"__main__.library_call":{"destination":"starkware.starknet.common.syscalls.library_call","type":"alias"},"__main__.library_call_l1_handler":{"destination":"starkware.starknet.common.syscalls.library_call_l1_handler","type":"alias"},"__wrappers__.__default__":{"decorators":["external","raw_input","raw_output"],"pc":155,"type":"function"},"__wrappers__.__default__.Args":{"full_name":"__wrappers__.__default__.Args","members":{},"size":0,"type":"struct"},"__wrappers__.__default__.ImplicitArgs":{"full_name":"__wrappers__.__default__.ImplicitArgs","members":{},"size":0,"type":"struct"},"__wrappers__.__default__.Return":{"cairo_type":"(syscall_ptr: felt*, pedersen_ptr: starkware.cairo.common.cairo_builtins.HashBuiltin*, range_check_ptr: felt, size: felt, retdata: felt*)","type":"type_definition"},"__wrappers__.__default__.SIZEOF_LOCALS":{"type":"const","value":0},"__wrappers__.__default__.__wrapped_func":{"destination":"__main__.__default__","type":"alias"},"__wrappers__.__default___encode_return.memcpy":{"destination":"starkware.cairo.common.memcpy.memcpy","type":"alias"},"__wrappers__.__l1_default__":{"decorators":["l1_handler","raw_input"],"pc":180,"type":"function"},"__wrappers__.__l1_default__.Args":{"full_name":"__wrappers__.__l1_default__.Args","members":{},"size":0,"type":"struct"},"__wrappers__.__l1_default__.ImplicitArgs":{"full_name":"__wrappers__.__l1_default__.ImplicitArgs","members":{},"size":0,"type":"struct"},"__wrappers__.__l1_default__.Return":{"cairo_type":"(syscall_ptr: felt*, pedersen_ptr: starkware.cairo.common.cairo_builtins.HashBuiltin*, range_check_ptr: felt, size: felt, retdata: felt*)","type":"type_definition"},"__wrappers__.__l1_default__.SIZEOF_LOCALS":{"type":"const","value":0},"__wrappers__.__l1_default__.__wrapped_func":{"destination":"__main__.__l1_default__","type":"alias"},"__wrappers__.__l1_default___encode_return.memcpy":{"destination":"starkware.cairo.common.memcpy.memcpy","type":"alias"},"__wrappers__.constructor":{"decorators":["constructor"],"pc":108,"type":"function"},"__wrappers__.constructor.Args":{"full_name":"__wrappers__.constructor.Args","members":{},"size":0,"type":"struct"},"__wrappers__.constructor.ImplicitArgs":{"full_name":"__wrappers__.constructor.ImplicitArgs","members":{},"size":0,"type":"struct"},"__wrappers__.constructor.Return":{"cairo_type":"(syscall_ptr: felt*, pedersen_ptr: starkware.cairo.common.cairo_builtins.HashBuiltin*, range_check_ptr: felt, size: felt, retdata: felt*)","type":"type_definition"},"__wrappers__.constructor.SIZEOF_LOCALS":{"type":"const","value":0},"__wrappers__.constructor.__wrapped_func":{"destination":"__main__.constructor","type":"alias"},"__wrappers__.constructor_encode_return.memcpy":{"destination":"starkware.cairo.common.memcpy.memcpy","type":"alias"},"__wrappers__.get_implementation":{"decorators":["view"],"pc":212,"type":"function"},"__wrappers__.get_implementation.Args":{"full_name":"__wrappers__.get_implementation.Args","members":{},"size":0,"type":"struct"},"__wrappers__.get_implementation.ImplicitArgs":{"full_name":"__wrappers__.get_implementation.ImplicitArgs","members":{},"size":0,"type":"struct"},"__wrappers__.get_implementation.Return":{"cairo_type":"(syscall_ptr: felt*, pedersen_ptr: starkware.cairo.common.cairo_builtins.HashBuiltin*, range_check_ptr: felt, size: felt, retdata: felt*)","type":"type_definition"},"__wrappers__.get_implementation.SIZEOF_LOCALS":{"type":"const","value":0},"__wrappers__.get_implementation.__wrapped_func":{"destination":"__main__.get_implementation","type":"alias"},"__wrappers__.get_implementation_encode_return":{"decorators":[],"pc":203,"type":"function"},"__wrappers__.get_implementation_encode_return.Args":{"full_name":"__wrappers__.get_implementation_encode_return.Args","members":{"range_check_ptr":{"cairo_type":"felt","offset":1},"ret_value":{"cairo_type":"(implementation: felt)","offset":0}},"size":2,"type":"struct"},"__wrappers__.get_implementation_encode_return.ImplicitArgs":{"full_name":"__wrappers__.get_implementation_encode_return.ImplicitArgs","members":{},"size":0,"type":"struct"},"__wrappers__.get_implementation_encode_return.Return":{"cairo_type":"(range_check_ptr: felt, data_len: felt, data: felt*)","type":"type_definition"},"__wrappers__.get_implementation_encode_return.SIZEOF_LOCALS":{"type":"const","value":1},"__wrappers__.get_implementation_encode_return.memcpy":{"destination":"starkware.cairo.common.memcpy.memcpy","type":"alias"},"contracts.upgrade.Upgradable.HashBuiltin":{"destination":"starkware.cairo.common.cairo_builtins.HashBuiltin","type":"alias"},"contracts.upgrade.Upgradable._get_implementation":{"decorators":[],"pc":75,"type":"function"},"contracts.upgrade.Upgradable._get_implementation.Args":{"full_name":"contracts.upgrade.Upgradable._get_implementation.Args","members":{},"size":0,"type":"struct"},"contracts.upgrade.Upgradable._get_implementation.ImplicitArgs":{"full_name":"contracts.upgrade.Upgradable._get_implementation.ImplicitArgs","members":{"pedersen_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.HashBuiltin*","offset":1},"range_check_ptr":{"cairo_type":"felt","offset":2},"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":3,"type":"struct"},"contracts.upgrade.Upgradable._get_implementation.Return":{"cairo_type":"(implementation: felt)","type":"type_definition"},"contracts.upgrade.Upgradable._get_implementation.SIZEOF_LOCALS":{"type":"const","value":0},"contracts.upgrade.Upgradable._implementation":{"type":"namespace"},"contracts.upgrade.Upgradable._implementation.Args":{"full_name":"contracts.upgrade.Upgradable._implementation.Args","members":{},"size":0,"type":"struct"},"contracts.upgrade.Upgradable._implementation.HashBuiltin":{"destination":"starkware.cairo.common.cairo_builtins.HashBuiltin","type":"alias"},"contracts.upgrade.Upgradable._implementation.ImplicitArgs":{"full_name":"contracts.upgrade.Upgradable._implementation.ImplicitArgs","members":{},"size":0,"type":"struct"},"contracts.upgrade.Upgradable._implementation.Return":{"cairo_type":"()","type":"type_definition"},"contracts.upgrade.Upgradable._implementation.SIZEOF_LOCALS":{"type":"const","value":0},"contracts.upgrade.Upgradable._implementation.addr":{"decorators":[],"pc":45,"type":"function"},"contracts.upgrade.Upgradable._implementation.addr.Args":{"full_name":"contracts.upgrade.Upgradable._implementation.addr.Args","members":{},"size":0,"type":"struct"},"contracts.upgrade.Upgradable._implementation.addr.ImplicitArgs":{"full_name":"contracts.upgrade.Upgradable._implementation.addr.ImplicitArgs","members":{"pedersen_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.HashBuiltin*","offset":0},"range_check_ptr":{"cairo_type":"felt","offset":1}},"size":2,"type":"struct"},"contracts.upgrade.Upgradable._implementation.addr.Return":{"cairo_type":"(res: felt)","type":"type_definition"},"contracts.upgrade.Upgradable._implementation.addr.SIZEOF_LOCALS":{"type":"const","value":0},"contracts.upgrade.Upgradable._implementation.hash2":{"destination":"starkware.cairo.common.hash.hash2","type":"alias"},"contracts.upgrade.Upgradable._implementation.normalize_address":{"destination":"starkware.starknet.common.storage.normalize_address","type":"alias"},"contracts.upgrade.Upgradable._implementation.read":{"decorators":[],"pc":50,"type":"function"},"contracts.upgrade.Upgradable._implementation.read.Args":{"full_name":"contracts.upgrade.Upgradable._implementation.read.Args","members":{},"size":0,"type":"struct"},"contracts.upgrade.Upgradable._implementation.read.ImplicitArgs":{"full_name":"contracts.upgrade.Upgradable._implementation.read.ImplicitArgs","members":{"pedersen_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.HashBuiltin*","offset":1},"range_check_ptr":{"cairo_type":"felt","offset":2},"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":3,"type":"struct"},"contracts.upgrade.Upgradable._implementation.read.Return":{"cairo_type":"(address: felt)","type":"type_definition"},"contracts.upgrade.Upgradable._implementation.read.SIZEOF_LOCALS":{"type":"const","value":0},"contracts.upgrade.Upgradable._implementation.storage_read":{"destination":"starkware.starknet.common.syscalls.storage_read","type":"alias"},"contracts.upgrade.Upgradable._implementation.storage_write":{"destination":"starkware.starknet.common.syscalls.storage_write","type":"alias"},"contracts.upgrade.Upgradable._implementation.write":{"decorators":[],"pc":63,"type":"function"},"contracts.upgrade.Upgradable._implementation.write.Args":{"full_name":"contracts.upgrade.Upgradable._implementation.write.Args","members":{"value":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"contracts.upgrade.Upgradable._implementation.write.ImplicitArgs":{"full_name":"contracts.upgrade.Upgradable._implementation.write.ImplicitArgs","members":{"pedersen_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.HashBuiltin*","offset":1},"range_check_ptr":{"cairo_type":"felt","offset":2},"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":3,"type":"struct"},"contracts.upgrade.Upgradable._implementation.write.Return":{"cairo_type":"()","type":"type_definition"},"contracts.upgrade.Upgradable._implementation.write.SIZEOF_LOCALS":{"type":"const","value":0},"contracts.upgrade.Upgradable._set_implementation":{"decorators":[],"pc":81,"type":"function"},"contracts.upgrade.Upgradable._set_implementation.Args":{"full_name":"contracts.upgrade.Upgradable._set_implementation.Args","members":{"implementation":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"contracts.upgrade.Upgradable._set_implementation.ImplicitArgs":{"full_name":"contracts.upgrade.Upgradable._set_implementation.ImplicitArgs","members":{"pedersen_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.HashBuiltin*","offset":1},"range_check_ptr":{"cairo_type":"felt","offset":2},"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":3,"type":"struct"},"contracts.upgrade.Upgradable._set_implementation.Return":{"cairo_type":"()","type":"type_definition"},"contracts.upgrade.Upgradable._set_implementation.SIZEOF_LOCALS":{"type":"const","value":0},"contracts.upgrade.Upgradable.assert_not_zero":{"destination":"starkware.cairo.common.math.assert_not_zero","type":"alias"},"starkware.cairo.common.bool.FALSE":{"type":"const","value":0},"starkware.cairo.common.bool.TRUE":{"type":"const","value":1},"starkware.cairo.common.cairo_builtins.BitwiseBuiltin":{"full_name":"starkware.cairo.common.cairo_builtins.BitwiseBuiltin","members":{"x":{"cairo_type":"felt","offset":0},"x_and_y":{"cairo_type":"felt","offset":2},"x_or_y":{"cairo_type":"felt","offset":4},"x_xor_y":{"cairo_type":"felt","offset":3},"y":{"cairo_type":"felt","offset":1}},"size":5,"type":"struct"},"starkware.cairo.common.cairo_builtins.EcOpBuiltin":{"full_name":"starkware.cairo.common.cairo_builtins.EcOpBuiltin","members":{"m":{"cairo_type":"felt","offset":4},"p":{"cairo_type":"starkware.cairo.common.ec_point.EcPoint","offset":0},"q":{"cairo_type":"starkware.cairo.common.ec_point.EcPoint","offset":2},"r":{"cairo_type":"starkware.cairo.common.ec_point.EcPoint","offset":5}},"size":7,"type":"struct"},"starkware.cairo.common.cairo_builtins.EcPoint":{"destination":"starkware.cairo.common.ec_point.EcPoint","type":"alias"},"starkware.cairo.common.cairo_builtins.HashBuiltin":{"full_name":"starkware.cairo.common.cairo_builtins.HashBuiltin","members":{"result":{"cairo_type":"felt","offset":2},"x":{"cairo_type":"felt","offset":0},"y":{"cairo_type":"felt","offset":1}},"size":3,"type":"struct"},"starkware.cairo.common.cairo_builtins.KeccakBuiltin":{"full_name":"starkware.cairo.common.cairo_builtins.KeccakBuiltin","members":{"input":{"cairo_type":"starkware.cairo.common.keccak_state.KeccakBuiltinState","offset":0},"output":{"cairo_type":"starkware.cairo.common.keccak_state.KeccakBuiltinState","offset":8}},"size":16,"type":"struct"},"starkware.cairo.common.cairo_builtins.KeccakBuiltinState":{"destination":"starkware.cairo.common.keccak_state.KeccakBuiltinState","type":"alias"},"starkware.cairo.common.cairo_builtins.SignatureBuiltin":{"full_name":"starkware.cairo.common.cairo_builtins.SignatureBuiltin","members":{"message":{"cairo_type":"felt","offset":1},"pub_key":{"cairo_type":"felt","offset":0}},"size":2,"type":"struct"},"starkware.cairo.common.dict_access.DictAccess":{"full_name":"starkware.cairo.common.dict_access.DictAccess","members":{"key":{"cairo_type":"felt","offset":0},"new_value":{"cairo_type":"felt","offset":2},"prev_value":{"cairo_type":"felt","offset":1}},"size":3,"type":"struct"},"starkware.cairo.common.ec_point.EcPoint":{"full_name":"starkware.cairo.common.ec_point.EcPoint","members":{"x":{"cairo_type":"felt","offset":0},"y":{"cairo_type":"felt","offset":1}},"size":2,"type":"struct"},"starkware.cairo.common.hash.HashBuiltin":{"destination":"starkware.cairo.common.cairo_builtins.HashBuiltin","type":"alias"},"starkware.cairo.common.keccak_state.KeccakBuiltinState":{"full_name":"starkware.cairo.common.keccak_state.KeccakBuiltinState","members":{"s0":{"cairo_type":"felt","offset":0},"s1":{"cairo_type":"felt","offset":1},"s2":{"cairo_type":"felt","offset":2},"s3":{"cairo_type":"felt","offset":3},"s4":{"cairo_type":"felt","offset":4},"s5":{"cairo_type":"felt","offset":5},"s6":{"cairo_type":"felt","offset":6},"s7":{"cairo_type":"felt","offset":7}},"size":8,"type":"struct"},"starkware.cairo.common.math.FALSE":{"destination":"starkware.cairo.common.bool.FALSE","type":"alias"},"starkware.cairo.common.math.TRUE":{"destination":"starkware.cairo.common.bool.TRUE","type":"alias"},"starkware.cairo.common.math.assert_not_zero":{"decorators":[],"pc":0,"type":"function"},"starkware.cairo.common.math.assert_not_zero.Args":{"full_name":"starkware.cairo.common.math.assert_not_zero.Args","members":{"value":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"starkware.cairo.common.math.assert_not_zero.ImplicitArgs":{"full_name":"starkware.cairo.common.math.assert_not_zero.ImplicitArgs","members":{},"size":0,"type":"struct"},"starkware.cairo.common.math.assert_not_zero.Return":{"cairo_type":"()","type":"type_definition"},"starkware.cairo.common.math.assert_not_zero.SIZEOF_LOCALS":{"type":"const","value":0},"starkware.cairo.common.math.assert_not_zero.value":{"cairo_type":"felt","full_name":"starkware.cairo.common.math.assert_not_zero.value","references":[{"ap_tracking_data":{"group":0,"offset":0},"pc":0,"value":"[cast(fp + (-3), felt*)]"}],"type":"reference"},"starkware.starknet.common.storage.ADDR_BOUND":{"type":"const","value":-1.0671072950157357e+59},"starkware.starknet.common.storage.MAX_STORAGE_ITEM_SIZE":{"type":"const","value":256},"starkware.starknet.common.storage.assert_250_bit":{"destination":"starkware.cairo.common.math.assert_250_bit","type":"alias"},"starkware.starknet.common.syscalls.CALL_CONTRACT_SELECTOR":{"type":"const","value":2.0853273475220474e+28},"starkware.starknet.common.syscalls.CallContract":{"full_name":"starkware.starknet.common.syscalls.CallContract","members":{"request":{"cairo_type":"starkware.starknet.common.syscalls.CallContractRequest","offset":0},"response":{"cairo_type":"starkware.starknet.common.syscalls.CallContractResponse","offset":5}},"size":7,"type":"struct"},"starkware.starknet.common.syscalls.CallContractRequest":{"full_name":"starkware.starknet.common.syscalls.CallContractRequest","members":{"calldata":{"cairo_type":"felt*","offset":4},"calldata_size":{"cairo_type":"felt","offset":3},"contract_address":{"cairo_type":"felt","offset":1},"function_selector":{"cairo_type":"felt","offset":2},"selector":{"cairo_type":"felt","offset":0}},"size":5,"type":"struct"},"starkware.starknet.common.syscalls.CallContractResponse":{"full_name":"starkware.starknet.common.syscalls.CallContractResponse","members":{"retdata":{"cairo_type":"felt*","offset":1},"retdata_size":{"cairo_type":"felt","offset":0}},"size":2,"type":"struct"},"starkware.starknet.common.syscalls.DELEGATE_CALL_SELECTOR":{"type":"const","value":2.1167594061783206e+28},"starkware.starknet.common.syscalls.DELEGATE_L1_HANDLER_SELECTOR":{"type":"const","value":2.3274015802972845e+40},"starkware.starknet.common.syscalls.DEPLOY_SELECTOR":{"type":"const","value":75202468540281},"starkware.starknet.common.syscalls.Deploy":{"full_name":"starkware.starknet.common.syscalls.Deploy","members":{"request":{"cairo_type":"starkware.starknet.common.syscalls.DeployRequest","offset":0},"response":{"cairo_type":"starkware.starknet.common.syscalls.DeployResponse","offset":6}},"size":9,"type":"struct"},"starkware.starknet.common.syscalls.DeployRequest":{"full_name":"starkware.starknet.common.syscalls.DeployRequest","members":{"class_hash":{"cairo_type":"felt","offset":1},"constructor_calldata":{"cairo_type":"felt*","offset":4},"constructor_calldata_size":{"cairo_type":"felt","offset":3},"contract_address_salt":{"cairo_type":"felt","offset":2},"deploy_from_zero":{"cairo_type":"felt","offset":5},"selector":{"cairo_type":"felt","offset":0}},"size":6,"type":"struct"},"starkware.starknet.common.syscalls.DeployResponse":{"full_name":"starkware.starknet.common.syscalls.DeployResponse","members":{"constructor_retdata":{"cairo_type":"felt*","offset":2},"constructor_retdata_size":{"cairo_type":"felt","offset":1},"contract_address":{"cairo_type":"felt","offset":0}},"size":3,"type":"struct"},"starkware.starknet.common.syscalls.DictAccess":{"destination":"starkware.cairo.common.dict_access.DictAccess","type":"alias"},"starkware.starknet.common.syscalls.EMIT_EVENT_SELECTOR":{"type":"const","value":1.2807093015503357e+21},"starkware.starknet.common.syscalls.EmitEvent":{"full_name":"starkware.starknet.common.syscalls.EmitEvent","members":{"data":{"cairo_type":"felt*","offset":4},"data_len":{"cairo_type":"felt","offset":3},"keys":{"cairo_type":"felt*","offset":2},"keys_len":{"cairo_type":"felt","offset":1},"selector":{"cairo_type":"felt","offset":0}},"size":5,"type":"struct"},"starkware.starknet.common.syscalls.GET_BLOCK_NUMBER_SELECTOR":{"type":"const","value":1.448089106835523e+33},"starkware.starknet.common.syscalls.GET_BLOCK_TIMESTAMP_SELECTOR":{"type":"const","value":2.4294903732626647e+40},"starkware.starknet.common.syscalls.GET_CALLER_ADDRESS_SELECTOR":{"type":"const","value":9.490196778139308e+37},"starkware.starknet.common.syscalls.GET_CONTRACT_ADDRESS_SELECTOR":{"type":"const","value":6.219495360805491e+42},"starkware.starknet.common.syscalls.GET_SEQUENCER_ADDRESS_SELECTOR":{"type":"const","value":1.5921908335819916e+45},"starkware.starknet.common.syscalls.GET_TX_INFO_SELECTOR":{"type":"const","value":1.3170293902041122e+21},"starkware.starknet.common.syscalls.GET_TX_SIGNATURE_SELECTOR":{"type":"const","value":1.44808912865234e+33},"starkware.starknet.common.syscalls.GetBlockNumber":{"full_name":"starkware.starknet.common.syscalls.GetBlockNumber","members":{"request":{"cairo_type":"starkware.starknet.common.syscalls.GetBlockNumberRequest","offset":0},"response":{"cairo_type":"starkware.starknet.common.syscalls.GetBlockNumberResponse","offset":1}},"size":2,"type":"struct"},"starkware.starknet.common.syscalls.GetBlockNumberRequest":{"full_name":"starkware.starknet.common.syscalls.GetBlockNumberRequest","members":{"selector":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"starkware.starknet.common.syscalls.GetBlockNumberResponse":{"full_name":"starkware.starknet.common.syscalls.GetBlockNumberResponse","members":{"block_number":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"starkware.starknet.common.syscalls.GetBlockTimestamp":{"full_name":"starkware.starknet.common.syscalls.GetBlockTimestamp","members":{"request":{"cairo_type":"starkware.starknet.common.syscalls.GetBlockTimestampRequest","offset":0},"response":{"cairo_type":"starkware.starknet.common.syscalls.GetBlockTimestampResponse","offset":1}},"size":2,"type":"struct"},"starkware.starknet.common.syscalls.GetBlockTimestampRequest":{"full_name":"starkware.starknet.common.syscalls.GetBlockTimestampRequest","members":{"selector":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"starkware.starknet.common.syscalls.GetBlockTimestampResponse":{"full_name":"starkware.starknet.common.syscalls.GetBlockTimestampResponse","members":{"block_timestamp":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"starkware.starknet.common.syscalls.GetCallerAddress":{"full_name":"starkware.starknet.common.syscalls.GetCallerAddress","members":{"request":{"cairo_type":"starkware.starknet.common.syscalls.GetCallerAddressRequest","offset":0},"response":{"cairo_type":"starkware.starknet.common.syscalls.GetCallerAddressResponse","offset":1}},"size":2,"type":"struct"},"starkware.starknet.common.syscalls.GetCallerAddressRequest":{"full_name":"starkware.starknet.common.syscalls.GetCallerAddressRequest","members":{"selector":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"starkware.starknet.common.syscalls.GetCallerAddressResponse":{"full_name":"starkware.starknet.common.syscalls.GetCallerAddressResponse","members":{"caller_address":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"starkware.starknet.common.syscalls.GetContractAddress":{"full_name":"starkware.starknet.common.syscalls.GetContractAddress","members":{"request":{"cairo_type":"starkware.starknet.common.syscalls.GetContractAddressRequest","offset":0},"response":{"cairo_type":"starkware.starknet.common.syscalls.GetContractAddressResponse","offset":1}},"size":2,"type":"struct"},"starkware.starknet.common.syscalls.GetContractAddressRequest":{"full_name":"starkware.starknet.common.syscalls.GetContractAddressRequest","members":{"selector":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"starkware.starknet.common.syscalls.GetContractAddressResponse":{"full_name":"starkware.starknet.common.syscalls.GetContractAddressResponse","members":{"contract_address":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"starkware.starknet.common.syscalls.GetSequencerAddress":{"full_name":"starkware.starknet.common.syscalls.GetSequencerAddress","members":{"request":{"cairo_type":"starkware.starknet.common.syscalls.GetSequencerAddressRequest","offset":0},"response":{"cairo_type":"starkware.starknet.common.syscalls.GetSequencerAddressResponse","offset":1}},"size":2,"type":"struct"},"starkware.starknet.common.syscalls.GetSequencerAddressRequest":{"full_name":"starkware.starknet.common.syscalls.GetSequencerAddressRequest","members":{"selector":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"starkware.starknet.common.syscalls.GetSequencerAddressResponse":{"full_name":"starkware.starknet.common.syscalls.GetSequencerAddressResponse","members":{"sequencer_address":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"starkware.starknet.common.syscalls.GetTxInfo":{"full_name":"starkware.starknet.common.syscalls.GetTxInfo","members":{"request":{"cairo_type":"starkware.starknet.common.syscalls.GetTxInfoRequest","offset":0},"response":{"cairo_type":"starkware.starknet.common.syscalls.GetTxInfoResponse","offset":1}},"size":2,"type":"struct"},"starkware.starknet.common.syscalls.GetTxInfoRequest":{"full_name":"starkware.starknet.common.syscalls.GetTxInfoRequest","members":{"selector":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"starkware.starknet.common.syscalls.GetTxInfoResponse":{"full_name":"starkware.starknet.common.syscalls.GetTxInfoResponse","members":{"tx_info":{"cairo_type":"starkware.starknet.common.syscalls.TxInfo*","offset":0}},"size":1,"type":"struct"},"starkware.starknet.common.syscalls.GetTxSignature":{"full_name":"starkware.starknet.common.syscalls.GetTxSignature","members":{"request":{"cairo_type":"starkware.starknet.common.syscalls.GetTxSignatureRequest","offset":0},"response":{"cairo_type":"starkware.starknet.common.syscalls.GetTxSignatureResponse","offset":1}},"size":3,"type":"struct"},"starkware.starknet.common.syscalls.GetTxSignatureRequest":{"full_name":"starkware.starknet.common.syscalls.GetTxSignatureRequest","members":{"selector":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"starkware.starknet.common.syscalls.GetTxSignatureResponse":{"full_name":"starkware.starknet.common.syscalls.GetTxSignatureResponse","members":{"signature":{"cairo_type":"felt*","offset":1},"signature_len":{"cairo_type":"felt","offset":0}},"size":2,"type":"struct"},"starkware.starknet.common.syscalls.LIBRARY_CALL_L1_HANDLER_SELECTOR":{"type":"const","value":4.362334527541981e+47},"starkware.starknet.common.syscalls.LIBRARY_CALL_SELECTOR":{"type":"const","value":9.2376026794327e+25},"starkware.starknet.common.syscalls.LibraryCall":{"full_name":"starkware.starknet.common.syscalls.LibraryCall","members":{"request":{"cairo_type":"starkware.starknet.common.syscalls.LibraryCallRequest","offset":0},"response":{"cairo_type":"starkware.starknet.common.syscalls.CallContractResponse","offset":5}},"size":7,"type":"struct"},"starkware.starknet.common.syscalls.LibraryCallRequest":{"full_name":"starkware.starknet.common.syscalls.LibraryCallRequest","members":{"calldata":{"cairo_type":"felt*","offset":4},"calldata_size":{"cairo_type":"felt","offset":3},"class_hash":{"cairo_type":"felt","offset":1},"function_selector":{"cairo_type":"felt","offset":2},"selector":{"cairo_type":"felt","offset":0}},"size":5,"type":"struct"},"starkware.starknet.common.syscalls.SEND_MESSAGE_TO_L1_SELECTOR":{"type":"const","value":4.3301790876830345e+35},"starkware.starknet.common.syscalls.STORAGE_READ_SELECTOR":{"type":"const","value":1.0089069337060175e+26},"starkware.starknet.common.syscalls.STORAGE_WRITE_SELECTOR":{"type":"const","value":2.582801750287405e+28},"starkware.starknet.common.syscalls.SendMessageToL1SysCall":{"full_name":"starkware.starknet.common.syscalls.SendMessageToL1SysCall","members":{"payload_ptr":{"cairo_type":"felt*","offset":3},"payload_size":{"cairo_type":"felt","offset":2},"selector":{"cairo_type":"felt","offset":0},"to_address":{"cairo_type":"felt","offset":1}},"size":4,"type":"struct"},"starkware.starknet.common.syscalls.StorageRead":{"full_name":"starkware.starknet.common.syscalls.StorageRead","members":{"request":{"cairo_type":"starkware.starknet.common.syscalls.StorageReadRequest","offset":0},"response":{"cairo_type":"starkware.starknet.common.syscalls.StorageReadResponse","offset":2}},"size":3,"type":"struct"},"starkware.starknet.common.syscalls.StorageReadRequest":{"full_name":"starkware.starknet.common.syscalls.StorageReadRequest","members":{"address":{"cairo_type":"felt","offset":1},"selector":{"cairo_type":"felt","offset":0}},"size":2,"type":"struct"},"starkware.starknet.common.syscalls.StorageReadResponse":{"full_name":"starkware.starknet.common.syscalls.StorageReadResponse","members":{"value":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"starkware.starknet.common.syscalls.StorageWrite":{"full_name":"starkware.starknet.common.syscalls.StorageWrite","members":{"address":{"cairo_type":"felt","offset":1},"selector":{"cairo_type":"felt","offset":0},"value":{"cairo_type":"felt","offset":2}},"size":3,"type":"struct"},"starkware.starknet.common.syscalls.TxInfo":{"full_name":"starkware.starknet.common.syscalls.TxInfo","members":{"account_contract_address":{"cairo_type":"felt","offset":1},"chain_id":{"cairo_type":"felt","offset":6},"max_fee":{"cairo_type":"felt","offset":2},"nonce":{"cairo_type":"felt","offset":7},"signature":{"cairo_type":"felt*","offset":4},"signature_len":{"cairo_type":"felt","offset":3},"transaction_hash":{"cairo_type":"felt","offset":5},"version":{"cairo_type":"felt","offset":0}},"size":8,"type":"struct"},"starkware.starknet.common.syscalls.library_call":{"decorators":[],"pc":5,"type":"function"},"starkware.starknet.common.syscalls.library_call.Args":{"full_name":"starkware.starknet.common.syscalls.library_call.Args","members":{"calldata":{"cairo_type":"felt*","offset":3},"calldata_size":{"cairo_type":"felt","offset":2},"class_hash":{"cairo_type":"felt","offset":0},"function_selector":{"cairo_type":"felt","offset":1}},"size":4,"type":"struct"},"starkware.starknet.common.syscalls.library_call.ImplicitArgs":{"full_name":"starkware.starknet.common.syscalls.library_call.ImplicitArgs","members":{"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":1,"type":"struct"},"starkware.starknet.common.syscalls.library_call.Return":{"cairo_type":"(retdata_size: felt, retdata: felt*)","type":"type_definition"},"starkware.starknet.common.syscalls.library_call.SIZEOF_LOCALS":{"type":"const","value":0},"starkware.starknet.common.syscalls.library_call.syscall_ptr":{"cairo_type":"felt*","full_name":"starkware.starknet.common.syscalls.library_call.syscall_ptr","references":[{"ap_tracking_data":{"group":1,"offset":0},"pc":5,"value":"[cast(fp + (-7), felt**)]"},{"ap_tracking_data":{"group":1,"offset":1},"pc":12,"value":"cast([fp + (-7)] + 7, felt*)"}],"type":"reference"},"starkware.starknet.common.syscalls.library_call_l1_handler":{"decorators":[],"pc":17,"type":"function"},"starkware.starknet.common.syscalls.library_call_l1_handler.Args":{"full_name":"starkware.starknet.common.syscalls.library_call_l1_handler.Args","members":{"calldata":{"cairo_type":"felt*","offset":3},"calldata_size":{"cairo_type":"felt","offset":2},"class_hash":{"cairo_type":"felt","offset":0},"function_selector":{"cairo_type":"felt","offset":1}},"size":4,"type":"struct"},"starkware.starknet.common.syscalls.library_call_l1_handler.ImplicitArgs":{"full_name":"starkware.starknet.common.syscalls.library_call_l1_handler.ImplicitArgs","members":{"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":1,"type":"struct"},"starkware.starknet.common.syscalls.library_call_l1_handler.Return":{"cairo_type":"(retdata_size: felt, retdata: felt*)","type":"type_definition"},"starkware.starknet.common.syscalls.library_call_l1_handler.SIZEOF_LOCALS":{"type":"const","value":0},"starkware.starknet.common.syscalls.library_call_l1_handler.syscall_ptr":{"cairo_type":"felt*","full_name":"starkware.starknet.common.syscalls.library_call_l1_handler.syscall_ptr","references":[{"ap_tracking_data":{"group":2,"offset":0},"pc":17,"value":"[cast(fp + (-7), felt**)]"},{"ap_tracking_data":{"group":2,"offset":1},"pc":24,"value":"cast([fp + (-7)] + 7, felt*)"}],"type":"reference"},"starkware.starknet.common.syscalls.storage_read":{"decorators":[],"pc":29,"type":"function"},"starkware.starknet.common.syscalls.storage_read.Args":{"full_name":"starkware.starknet.common.syscalls.storage_read.Args","members":{"address":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"starkware.starknet.common.syscalls.storage_read.ImplicitArgs":{"full_name":"starkware.starknet.common.syscalls.storage_read.ImplicitArgs","members":{"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":1,"type":"struct"},"starkware.starknet.common.syscalls.storage_read.Return":{"cairo_type":"(value: felt)","type":"type_definition"},"starkware.starknet.common.syscalls.storage_read.SIZEOF_LOCALS":{"type":"const","value":0},"starkware.starknet.common.syscalls.storage_read.syscall_ptr":{"cairo_type":"felt*","full_name":"starkware.starknet.common.syscalls.storage_read.syscall_ptr","references":[{"ap_tracking_data":{"group":3,"offset":0},"pc":29,"value":"[cast(fp + (-4), felt**)]"},{"ap_tracking_data":{"group":3,"offset":1},"pc":33,"value":"cast([fp + (-4)] + 3, felt*)"}],"type":"reference"},"starkware.starknet.common.syscalls.storage_write":{"decorators":[],"pc":37,"type":"function"},"starkware.starknet.common.syscalls.storage_write.Args":{"full_name":"starkware.starknet.common.syscalls.storage_write.Args","members":{"address":{"cairo_type":"felt","offset":0},"value":{"cairo_type":"felt","offset":1}},"size":2,"type":"struct"},"starkware.starknet.common.syscalls.storage_write.ImplicitArgs":{"full_name":"starkware.starknet.common.syscalls.storage_write.ImplicitArgs","members":{"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":1,"type":"struct"},"starkware.starknet.common.syscalls.storage_write.Return":{"cairo_type":"()","type":"type_definition"},"starkware.starknet.common.syscalls.storage_write.SIZEOF_LOCALS":{"type":"const","value":0},"starkware.starknet.common.syscalls.storage_write.syscall_ptr":{"cairo_type":"felt*","full_name":"starkware.starknet.common.syscalls.storage_write.syscall_ptr","references":[{"ap_tracking_data":{"group":4,"offset":0},"pc":37,"value":"[cast(fp + (-5), felt**)]"},{"ap_tracking_data":{"group":4,"offset":1},"pc":42,"value":"cast([fp + (-5)] + 3, felt*)"}],"type":"reference"}},"main_scope":"__main__","prime":"0x800000000000011000000000000000000000000000000000000000000000001","reference_manager":{"references":[{"ap_tracking_data":{"group":0,"offset":0},"pc":0,"value":"[cast(fp + (-3), felt*)]"},{"ap_tracking_data":{"group":1,"offset":0},"pc":5,"value":"[cast(fp + (-7), felt**)]"},{"ap_tracking_data":{"group":2,"offset":0},"pc":17,"value":"[cast(fp + (-7), felt**)]"},{"ap_tracking_data":{"group":3,"offset":0},"pc":29,"value":"[cast(fp + (-4), felt**)]"},{"ap_tracking_data":{"group":4,"offset":0},"pc":37,"value":"[cast(fp + (-5), felt**)]"}]}}} ================================================ FILE: contract-artifacts/ArgentAccount/780760e4156afe592bb1feff7e769cf279ae9831/Proxy.cairo/Proxy_abi.json ================================================ [{"inputs":[{"name":"implementation","type":"felt"},{"name":"selector","type":"felt"},{"name":"calldata_len","type":"felt"},{"name":"calldata","type":"felt*"}],"name":"constructor","outputs":[],"type":"constructor"},{"inputs":[{"name":"selector","type":"felt"},{"name":"calldata_size","type":"felt"},{"name":"calldata","type":"felt*"}],"name":"__default__","outputs":[{"name":"retdata_size","type":"felt"},{"name":"retdata","type":"felt*"}],"type":"function"},{"inputs":[{"name":"selector","type":"felt"},{"name":"calldata_size","type":"felt"},{"name":"calldata","type":"felt*"}],"name":"__l1_default__","outputs":[],"type":"l1_handler"},{"inputs":[],"name":"get_implementation","outputs":[{"name":"implementation","type":"felt"}],"stateMutability":"view","type":"function"}] ================================================ FILE: contract-artifacts/OpenZeppelinAccount/0.5.1/Account.cairo/Account.json ================================================ {"abi":[{"members":[{"name":"to","offset":0,"type":"felt"},{"name":"selector","offset":1,"type":"felt"},{"name":"data_offset","offset":2,"type":"felt"},{"name":"data_len","offset":3,"type":"felt"}],"name":"AccountCallArray","size":4,"type":"struct"},{"inputs":[{"name":"publicKey","type":"felt"}],"name":"constructor","outputs":[],"type":"constructor"},{"inputs":[],"name":"getPublicKey","outputs":[{"name":"publicKey","type":"felt"}],"stateMutability":"view","type":"function"},{"inputs":[{"name":"interfaceId","type":"felt"}],"name":"supportsInterface","outputs":[{"name":"success","type":"felt"}],"stateMutability":"view","type":"function"},{"inputs":[{"name":"newPublicKey","type":"felt"}],"name":"setPublicKey","outputs":[],"type":"function"},{"inputs":[{"name":"hash","type":"felt"},{"name":"signature_len","type":"felt"},{"name":"signature","type":"felt*"}],"name":"isValidSignature","outputs":[{"name":"isValid","type":"felt"}],"stateMutability":"view","type":"function"},{"inputs":[{"name":"call_array_len","type":"felt"},{"name":"call_array","type":"AccountCallArray*"},{"name":"calldata_len","type":"felt"},{"name":"calldata","type":"felt*"}],"name":"__validate__","outputs":[],"type":"function"},{"inputs":[{"name":"class_hash","type":"felt"}],"name":"__validate_declare__","outputs":[],"type":"function"},{"inputs":[{"name":"class_hash","type":"felt"},{"name":"salt","type":"felt"},{"name":"publicKey","type":"felt"}],"name":"__validate_deploy__","outputs":[],"type":"function"},{"inputs":[{"name":"call_array_len","type":"felt"},{"name":"call_array","type":"AccountCallArray*"},{"name":"calldata_len","type":"felt"},{"name":"calldata","type":"felt*"}],"name":"__execute__","outputs":[{"name":"response_len","type":"felt"},{"name":"response","type":"felt*"}],"type":"function"}],"entry_points_by_type":{"CONSTRUCTOR":[{"offset":"0x16e","selector":"0x28ffe4ff0f226a9107253e17a904099aa4f63a02a5621de0576e5aa71bc5194"}],"EXTERNAL":[{"offset":"0x1cd","selector":"0xbc0eb87884ab91e330445c3584a50d7ddf4b568f02fbeb456a6242cce3f5d9"},{"offset":"0x2bb","selector":"0x15d40a3d6ca2ac30f4031e42be28da9b056fef9bb7357ac5e85627ee876e5ad"},{"offset":"0x224","selector":"0x162da33a4585851fe8d3af3c2a9c60b557814e221e0d4f30ff0b2189d9c7775"},{"offset":"0x191","selector":"0x1a6c6a0bdec86cc645c91997d8eea83e87148659e3e61122f72361fd5e94079"},{"offset":"0x1f4","selector":"0x213dfe25e2ca309c4d615a09cfc95fdb2fc7dc73fbcad12c450fe93b1f2ff9e"},{"offset":"0x25f","selector":"0x289da278a8dc833409cabfdad1581e8e7d40e42dcaed693fa4008dcdb4963b3"},{"offset":"0x1b2","selector":"0x29e211664c0b63c79638fbea474206ca74016b3e9a3dc4f9ac300ffd8bdf2cd"},{"offset":"0x285","selector":"0x36fcbf06cd96843058359e1a75928beacfac10727dab22a3972f0af8aa92895"}],"L1_HANDLER":[]},"program":{"attributes":[{"accessible_scopes":["openzeppelin.account.library","openzeppelin.account.library.Account","openzeppelin.account.library.Account.assert_only_self"],"end_pc":192,"flow_tracking_data":{"ap_tracking":{"group":16,"offset":12},"reference_ids":{}},"name":"error_message","start_pc":191,"value":"Account: caller is not this account"},{"accessible_scopes":["openzeppelin.account.library","openzeppelin.account.library.Account","openzeppelin.account.library.Account.execute"],"end_pc":269,"flow_tracking_data":{"ap_tracking":{"group":21,"offset":9},"reference_ids":{}},"name":"error_message","start_pc":259,"value":"Account: deprecated tx version"},{"accessible_scopes":["openzeppelin.account.library","openzeppelin.account.library.Account","openzeppelin.account.library.Account.execute"],"end_pc":274,"flow_tracking_data":{"ap_tracking":{"group":21,"offset":49},"reference_ids":{}},"name":"error_message","start_pc":272,"value":"Account: reentrant call"}],"builtins":["pedersen","range_check","ecdsa","bitwise"],"compiler_version":"0.10.2","data":["0x40780017fff7fff","0x1","0x208b7fff7fff7ffe","0x20780017fff7ffd","0x3","0x208b7fff7fff7ffe","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x480080007fff8000","0x400080007ffd7fff","0x482480017ffd8001","0x1","0x482480017ffd8001","0x1","0xa0680017fff7ffe","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffffb","0x402a7ffc7ffd7fff","0x208b7fff7fff7ffe","0x480280007ffb8000","0x480280017ffb8000","0x484480017fff8000","0x2aaaaaaaaaaaab05555555555555556","0x48307fff7ffd8000","0x480280027ffb8000","0x480280037ffb8000","0x484480017fff8000","0x4000000000000088000000000000001","0x48307fff7ffd8000","0xa0680017fff8000","0xe","0x480680017fff8000","0x800000000000011000000000000000000000000000000000000000000000000","0x48287ffc80007fff","0x40307ffc7ff87fff","0x48297ffd80007ffc","0x482680017ffd8000","0x1","0x48507fff7ffe8000","0x40507ff97ff57fff","0x482680017ffb8000","0x4","0x208b7fff7fff7ffe","0xa0680017fff8000","0xc","0x480680017fff8000","0x800000000000011000000000000000000000000000000000000000000000000","0x48287ffd80007fff","0x48327fff7ffc8000","0x40307ffa7ff67fff","0x48527ffe7ffc8000","0x40507ff97ff57fff","0x482680017ffb8000","0x4","0x208b7fff7fff7ffe","0x40317ffd7ff97ffd","0x48297ffc80007ffd","0x48527fff7ffc8000","0x40507ffb7ff77fff","0x40780017fff7fff","0x2","0x482680017ffb8000","0x4","0x208b7fff7fff7ffe","0x48297ffd80007ffc","0x20680017fff7fff","0x4","0x402780017ffc7ffc","0x1","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffcc","0x208b7fff7fff7ffe","0x480680017fff8000","0x43616c6c436f6e7472616374","0x400280007ff97fff","0x400380017ff97ffa","0x400380027ff97ffb","0x400380037ff97ffc","0x400380047ff97ffd","0x482680017ff98000","0x7","0x480280057ff98000","0x480280067ff98000","0x208b7fff7fff7ffe","0x480680017fff8000","0x47657443616c6c657241646472657373","0x400280007ffd7fff","0x482680017ffd8000","0x2","0x480280017ffd8000","0x208b7fff7fff7ffe","0x480680017fff8000","0x476574436f6e747261637441646472657373","0x400280007ffd7fff","0x482680017ffd8000","0x2","0x480280017ffd8000","0x208b7fff7fff7ffe","0x480680017fff8000","0x53746f7261676552656164","0x400280007ffc7fff","0x400380017ffc7ffd","0x482680017ffc8000","0x3","0x480280027ffc8000","0x208b7fff7fff7ffe","0x480680017fff8000","0x53746f726167655772697465","0x400280007ffb7fff","0x400380017ffb7ffc","0x400380027ffb7ffd","0x482680017ffb8000","0x3","0x208b7fff7fff7ffe","0x480680017fff8000","0x4765745478496e666f","0x400280007ffd7fff","0x482680017ffd8000","0x2","0x480280017ffd8000","0x208b7fff7fff7ffe","0x400380017ff97ffa","0x400380007ff97ffb","0x482680017ff98000","0x2","0x208b7fff7fff7ffe","0xa0680017fff8000","0xc","0x40780017fff7fff","0x6","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff8c","0x480680017fff8000","0x1","0x208b7fff7fff7ffe","0x480a7ffb7fff8000","0x480a7ffd7fff8000","0x480a7ffc7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffb1","0x480680017fff8000","0x0","0x208b7fff7fff7ffe","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x480680017fff8000","0x1379ac0624b939ceb9dede92211d7db5ee174fe28be72245b0a1a2abd81c98f","0x208b7fff7fff7ffe","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffffa","0x480a7ffb7fff8000","0x48127ffe7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffc6","0x48127ffe7fff8000","0x48127ff57fff8000","0x48127ff57fff8000","0x48127ffc7fff8000","0x208b7fff7fff7ffe","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffed","0x480a7ffa7fff8000","0x48127ffe7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffc0","0x48127ff67fff8000","0x48127ff67fff8000","0x208b7fff7fff7ffe","0x480a7ffa7fff8000","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffff1","0x208b7fff7fff7ffe","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffa4","0x48127ffe7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff9a","0x40127fff7fff7ff9","0x48127ffe7fff8000","0x208b7fff7fff7ffe","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffd5","0x208b7fff7fff7ffe","0x482680017ffd8000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffe00365a","0x20680017fff7fff","0x8","0x480a7ffa7fff8000","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x480680017fff8000","0x1","0x208b7fff7fff7ffe","0x482680017ffd8000","0x800000000000010ffffffffffffffffffffffffffffffffffffffff59942a8c","0x20680017fff7fff","0x8","0x480a7ffa7fff8000","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x480680017fff8000","0x1","0x208b7fff7fff7ffe","0x480a7ffa7fff8000","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x480680017fff8000","0x0","0x208b7fff7fff7ffe","0x480a7ffa7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffd7","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffbf","0x208b7fff7fff7ffe","0x480a7ff77fff8000","0x480a7ff87fff8000","0x480a7ffa7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffac","0x480a7ff97fff8000","0x480a7ffb7fff8000","0x48127ffd7fff8000","0x480280007ffd8000","0x480280017ffd8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff87","0x48127ff47fff8000","0x48127ff47fff8000","0x48127ffd7fff8000","0x48127ff37fff8000","0x480680017fff8000","0x1","0x208b7fff7fff7ffe","0x40780017fff7fff","0x3","0x480a7ff57fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff74","0x480a7ff97fff8000","0x480680017fff8000","0x1","0x480080007ffd8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff7a","0x480680017fff8000","0x1","0x40127fff7fff7ffe","0x40137ffd7fff8000","0x48127fdc7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff49","0x400680017fff7fff","0x0","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffeef","0x40137fff7fff8001","0x48127ffb7fff8000","0x480a7ffa7fff8000","0x480a7ffb7fff8000","0x480a7ffd7fff8000","0x480a80017fff8000","0x1104800180018000","0x35","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffee5","0x40137fff7fff8002","0x48127ffc7fff8000","0x480a7ffa7fff8000","0x480a80017fff8000","0x480a80027fff8000","0x1104800180018000","0xa","0x48127ffe7fff8000","0x480a7ff67fff8000","0x480a7ff77fff8000","0x480a7ff87fff8000","0x480a80007fff8000","0x48127ffa7fff8000","0x480a80027fff8000","0x208b7fff7fff7ffe","0x40780017fff7fff","0x3","0x20780017fff7ffb","0x6","0x480a7ffa7fff8000","0x480680017fff8000","0x0","0x208b7fff7fff7ffe","0x480a7ffa7fff8000","0x480280007ffc8000","0x480280017ffc8000","0x480280027ffc8000","0x480280037ffc8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff11","0x40137ffe7fff8000","0x40137fff7fff8001","0x40137ffd7fff8002","0x480a7ffd7fff8000","0x480a80017fff8000","0x480a80007fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffec2","0x480a80027fff8000","0x482680017ffb8000","0x800000000000011000000000000000000000000000000000000000000000000","0x482680017ffc8000","0x4","0x482a80007ffd8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffe4","0x48127ffe7fff8000","0x482880007ffe8000","0x208b7fff7fff7ffe","0x20780017fff7ffa","0x4","0x480a7ff97fff8000","0x208b7fff7fff7ffe","0x480280007ffb8000","0x400280007ffd7fff","0x480280017ffb8000","0x400280017ffd7fff","0x480280037ffb8000","0x400280027ffd7fff","0x480280027ffb8000","0x48327fff7ffc8000","0x400280037ffd7fff","0x480a7ff97fff8000","0x482680017ffa8000","0x800000000000011000000000000000000000000000000000000000000000000","0x482680017ffb8000","0x4","0x480a7ffc7fff8000","0x482680017ffd8000","0x4","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffec","0x208b7fff7fff7ffe","0x480a7ffa7fff8000","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff48","0x208b7fff7fff7ffe","0x482680017ffd8000","0x1","0x402a7ffd7ffc7fff","0x480280007ffb8000","0x480280017ffb8000","0x480280027ffb8000","0x480280007ffd8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffff3","0x40780017fff7fff","0x1","0x48127ffc7fff8000","0x48127ffc7fff8000","0x48127ffc7fff8000","0x480280037ffb8000","0x480280047ffb8000","0x480680017fff8000","0x0","0x48127ff97fff8000","0x208b7fff7fff7ffe","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff3e","0x208b7fff7fff7ffe","0x40780017fff7fff","0x1","0x4003800080007ffc","0x4826800180008000","0x1","0x480a7ffd7fff8000","0x4828800080007ffe","0x480a80007fff8000","0x208b7fff7fff7ffe","0x402b7ffd7ffc7ffd","0x480280007ffb8000","0x480280017ffb8000","0x480280027ffb8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffee","0x48127ffe7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffff1","0x48127ff47fff8000","0x48127ff47fff8000","0x48127ffb7fff8000","0x480280037ffb8000","0x480280047ffb8000","0x48127ff97fff8000","0x48127ff97fff8000","0x208b7fff7fff7ffe","0x480a7ffa7fff8000","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff23","0x208b7fff7fff7ffe","0x40780017fff7fff","0x1","0x4003800080007ffc","0x4826800180008000","0x1","0x480a7ffd7fff8000","0x4828800080007ffe","0x480a80007fff8000","0x208b7fff7fff7ffe","0x482680017ffd8000","0x1","0x402a7ffd7ffc7fff","0x480280007ffb8000","0x480280017ffb8000","0x480280027ffb8000","0x480280007ffd8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffea","0x48127ffe7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffee","0x48127ff47fff8000","0x48127ff47fff8000","0x48127ffb7fff8000","0x480280037ffb8000","0x480280047ffb8000","0x48127ff97fff8000","0x48127ff97fff8000","0x208b7fff7fff7ffe","0x480a7ffa7fff8000","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff19","0x208b7fff7fff7ffe","0x482680017ffd8000","0x1","0x402a7ffd7ffc7fff","0x480280007ffb8000","0x480280017ffb8000","0x480280027ffb8000","0x480280007ffd8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffff3","0x40780017fff7fff","0x1","0x48127ffc7fff8000","0x48127ffc7fff8000","0x48127ffc7fff8000","0x480280037ffb8000","0x480280047ffb8000","0x480680017fff8000","0x0","0x48127ff97fff8000","0x208b7fff7fff7ffe","0x480a7ff77fff8000","0x480a7ff87fff8000","0x480a7ff97fff8000","0x480a7ffa7fff8000","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff04","0x208b7fff7fff7ffe","0x40780017fff7fff","0x1","0x4003800080007ffc","0x4826800180008000","0x1","0x480a7ffd7fff8000","0x4828800080007ffe","0x480a80007fff8000","0x208b7fff7fff7ffe","0x480280027ffb8000","0x480280017ffd8000","0x400080007ffe7fff","0x482680017ffd8000","0x2","0x480280017ffd8000","0x48307fff7ffe8000","0x402a7ffd7ffc7fff","0x480280027ffb8000","0x480280007ffb8000","0x480280017ffb8000","0x480280037ffb8000","0x482480017ffc8000","0x1","0x480280007ffd8000","0x480280017ffd8000","0x482680017ffd8000","0x2","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffdc","0x48127ffe7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffe3","0x48127ff37fff8000","0x48127ff37fff8000","0x48127ffb7fff8000","0x48127ff27fff8000","0x480280047ffb8000","0x48127ff97fff8000","0x48127ff97fff8000","0x208b7fff7fff7ffe","0x480a7ff67fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffe61","0x48127ffe7fff8000","0x480a7ff77fff8000","0x480a7ff87fff8000","0x480a7ff97fff8000","0x480080057ffb8000","0x480080037ffa8000","0x480080047ff98000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffecf","0x48127ffb7fff8000","0x48127ffb7fff8000","0x48127ffb7fff8000","0x48127ffb7fff8000","0x208b7fff7fff7ffe","0x480280027ffb8000","0x480280007ffd8000","0x400080007ffe7fff","0x482680017ffd8000","0x1","0x480280007ffd8000","0x484480017fff8000","0x4","0x48307fff7ffd8000","0x480280027ffb8000","0x480080007ffe8000","0x400080017ffe7fff","0x482480017ffd8000","0x1","0x480080007ffc8000","0x48307fff7ffe8000","0x402a7ffd7ffc7fff","0x480280027ffb8000","0x480280007ffb8000","0x480280017ffb8000","0x480280037ffb8000","0x482480017ffc8000","0x2","0x480280007ffd8000","0x482680017ffd8000","0x1","0x480080007ff38000","0x482480017ff28000","0x1","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffd3","0x40780017fff7fff","0x1","0x48127ffb7fff8000","0x48127ffb7fff8000","0x48127ffc7fff8000","0x48127ffa7fff8000","0x480280047ffb8000","0x480680017fff8000","0x0","0x48127ff97fff8000","0x208b7fff7fff7ffe","0x480a7ff97fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffe26","0x48127ffe7fff8000","0x480a7ffa7fff8000","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x480080057ffb8000","0x480080037ffa8000","0x480080047ff98000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffe94","0x48127ffb7fff8000","0x48127ffb7fff8000","0x48127ffb7fff8000","0x48127ffb7fff8000","0x208b7fff7fff7ffe","0x482680017ffd8000","0x1","0x402a7ffd7ffc7fff","0x480280007ffb8000","0x480280017ffb8000","0x480280037ffb8000","0x480280027ffb8000","0x480280007ffd8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffe8","0x40780017fff7fff","0x1","0x48127ffb7fff8000","0x48127ffb7fff8000","0x48127ffc7fff8000","0x48127ffa7fff8000","0x480280047ffb8000","0x480680017fff8000","0x0","0x48127ff97fff8000","0x208b7fff7fff7ffe","0x480a7ff77fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffe00","0x48127ffe7fff8000","0x480a7ff87fff8000","0x480a7ff97fff8000","0x480a7ffa7fff8000","0x480080057ffb8000","0x480080037ffa8000","0x480080047ff98000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffe6e","0x48127ffb7fff8000","0x48127ffb7fff8000","0x48127ffb7fff8000","0x48127ffb7fff8000","0x208b7fff7fff7ffe","0x482680017ffd8000","0x3","0x402a7ffd7ffc7fff","0x480280007ffb8000","0x480280017ffb8000","0x480280037ffb8000","0x480280027ffb8000","0x480280007ffd8000","0x480280017ffd8000","0x480280027ffd8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffe6","0x40780017fff7fff","0x1","0x48127ffb7fff8000","0x48127ffb7fff8000","0x48127ffc7fff8000","0x48127ffa7fff8000","0x480280047ffb8000","0x480680017fff8000","0x0","0x48127ff97fff8000","0x208b7fff7fff7ffe","0x480a7ff57fff8000","0x480a7ff67fff8000","0x480a7ff77fff8000","0x480a7ff87fff8000","0x480a7ff97fff8000","0x480a7ffa7fff8000","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffe5a","0x208b7fff7fff7ffe","0x40780017fff7fff","0x3","0x4003800080007ffb","0x400380007ffd7ffb","0x402780017ffd8001","0x1","0x4826800180008000","0x1","0x40297ffb7fff8002","0x4826800180008000","0x1","0x480a7ffc7fff8000","0x480a7ffb7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffd4f","0x480a80017fff8000","0x4829800080008002","0x480a80007fff8000","0x208b7fff7fff7ffe","0x40780017fff7fff","0x4","0x480280027ffb8000","0x480280007ffd8000","0x400080007ffe7fff","0x482680017ffd8000","0x1","0x480280007ffd8000","0x484480017fff8000","0x4","0x48307fff7ffd8000","0x480280027ffb8000","0x480080007ffe8000","0x400080017ffe7fff","0x482480017ffd8000","0x1","0x480080007ffc8000","0x48307fff7ffe8000","0x402a7ffd7ffc7fff","0x480280027ffb8000","0x480280007ffb8000","0x480280017ffb8000","0x480280037ffb8000","0x480280047ffb8000","0x482480017ffb8000","0x2","0x480280007ffd8000","0x482680017ffd8000","0x1","0x480080007ff28000","0x482480017ff18000","0x1","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffc2","0x40137ff97fff8000","0x40137ffa7fff8001","0x40137ffb7fff8002","0x40137ffc7fff8003","0x48127ffd7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffc7","0x480a80007fff8000","0x480a80017fff8000","0x48127ffb7fff8000","0x480a80027fff8000","0x480a80037fff8000","0x48127ff97fff8000","0x48127ff97fff8000","0x208b7fff7fff7ffe"],"hints":{"0":[{"accessible_scopes":["starkware.cairo.common.alloc","starkware.cairo.common.alloc.alloc"],"code":"memory[ap] = segments.add()","flow_tracking_data":{"ap_tracking":{"group":0,"offset":0},"reference_ids":{}}}],"6":[{"accessible_scopes":["starkware.cairo.common.memcpy","starkware.cairo.common.memcpy.memcpy"],"code":"vm_enter_scope({'n': ids.len})","flow_tracking_data":{"ap_tracking":{"group":1,"offset":0},"reference_ids":{"starkware.cairo.common.memcpy.memcpy.len":0}}}],"14":[{"accessible_scopes":["starkware.cairo.common.memcpy","starkware.cairo.common.memcpy.memcpy"],"code":"n -= 1\nids.continue_copying = 1 if n > 0 else 0","flow_tracking_data":{"ap_tracking":{"group":1,"offset":5},"reference_ids":{"starkware.cairo.common.memcpy.memcpy.continue_copying":1}}}],"17":[{"accessible_scopes":["starkware.cairo.common.memcpy","starkware.cairo.common.memcpy.memcpy"],"code":"vm_exit_scope()","flow_tracking_data":{"ap_tracking":{"group":1,"offset":6},"reference_ids":{}}}],"18":[{"accessible_scopes":["starkware.cairo.common.math","starkware.cairo.common.math.assert_le_felt"],"code":"import itertools\n\nfrom starkware.cairo.common.math_utils import assert_integer\nassert_integer(ids.a)\nassert_integer(ids.b)\na = ids.a % PRIME\nb = ids.b % PRIME\nassert a <= b, f'a = {a} is not less than or equal to b = {b}.'\n\n# Find an arc less than PRIME / 3, and another less than PRIME / 2.\nlengths_and_indices = [(a, 0), (b - a, 1), (PRIME - 1 - b, 2)]\nlengths_and_indices.sort()\nassert lengths_and_indices[0][0] <= PRIME // 3 and lengths_and_indices[1][0] <= PRIME // 2\nexcluded = lengths_and_indices[2][1]\n\nmemory[ids.range_check_ptr + 1], memory[ids.range_check_ptr + 0] = (\n divmod(lengths_and_indices[0][0], ids.PRIME_OVER_3_HIGH))\nmemory[ids.range_check_ptr + 3], memory[ids.range_check_ptr + 2] = (\n divmod(lengths_and_indices[1][0], ids.PRIME_OVER_2_HIGH))","flow_tracking_data":{"ap_tracking":{"group":2,"offset":0},"reference_ids":{"starkware.cairo.common.math.assert_le_felt.a":2,"starkware.cairo.common.math.assert_le_felt.b":3,"starkware.cairo.common.math.assert_le_felt.range_check_ptr":4}}}],"28":[{"accessible_scopes":["starkware.cairo.common.math","starkware.cairo.common.math.assert_le_felt"],"code":"memory[ap] = 1 if excluded != 0 else 0","flow_tracking_data":{"ap_tracking":{"group":2,"offset":8},"reference_ids":{}}}],"42":[{"accessible_scopes":["starkware.cairo.common.math","starkware.cairo.common.math.assert_le_felt"],"code":"memory[ap] = 1 if excluded != 1 else 0","flow_tracking_data":{"ap_tracking":{"group":2,"offset":9},"reference_ids":{}}}],"54":[{"accessible_scopes":["starkware.cairo.common.math","starkware.cairo.common.math.assert_le_felt"],"code":"assert excluded == 2","flow_tracking_data":{"ap_tracking":{"group":2,"offset":10},"reference_ids":{}}}],"63":[{"accessible_scopes":["starkware.cairo.common.math","starkware.cairo.common.math.assert_lt_felt"],"code":"from starkware.cairo.common.math_utils import assert_integer\nassert_integer(ids.a)\nassert_integer(ids.b)\nassert (ids.a % PRIME) < (ids.b % PRIME), \\\n f'a = {ids.a % PRIME} is not less than b = {ids.b % PRIME}.'","flow_tracking_data":{"ap_tracking":{"group":3,"offset":0},"reference_ids":{"starkware.cairo.common.math.assert_lt_felt.a":5,"starkware.cairo.common.math.assert_lt_felt.b":6}}}],"81":[{"accessible_scopes":["starkware.starknet.common.syscalls","starkware.starknet.common.syscalls.call_contract"],"code":"syscall_handler.call_contract(segments=segments, syscall_ptr=ids.syscall_ptr)","flow_tracking_data":{"ap_tracking":{"group":4,"offset":1},"reference_ids":{"starkware.starknet.common.syscalls.call_contract.syscall_ptr":7}}}],"89":[{"accessible_scopes":["starkware.starknet.common.syscalls","starkware.starknet.common.syscalls.get_caller_address"],"code":"syscall_handler.get_caller_address(segments=segments, syscall_ptr=ids.syscall_ptr)","flow_tracking_data":{"ap_tracking":{"group":5,"offset":1},"reference_ids":{"starkware.starknet.common.syscalls.get_caller_address.syscall_ptr":8}}}],"96":[{"accessible_scopes":["starkware.starknet.common.syscalls","starkware.starknet.common.syscalls.get_contract_address"],"code":"syscall_handler.get_contract_address(segments=segments, syscall_ptr=ids.syscall_ptr)","flow_tracking_data":{"ap_tracking":{"group":6,"offset":1},"reference_ids":{"starkware.starknet.common.syscalls.get_contract_address.syscall_ptr":9}}}],"104":[{"accessible_scopes":["starkware.starknet.common.syscalls","starkware.starknet.common.syscalls.storage_read"],"code":"syscall_handler.storage_read(segments=segments, syscall_ptr=ids.syscall_ptr)","flow_tracking_data":{"ap_tracking":{"group":7,"offset":1},"reference_ids":{"starkware.starknet.common.syscalls.storage_read.syscall_ptr":10}}}],"113":[{"accessible_scopes":["starkware.starknet.common.syscalls","starkware.starknet.common.syscalls.storage_write"],"code":"syscall_handler.storage_write(segments=segments, syscall_ptr=ids.syscall_ptr)","flow_tracking_data":{"ap_tracking":{"group":8,"offset":1},"reference_ids":{"starkware.starknet.common.syscalls.storage_write.syscall_ptr":11}}}],"119":[{"accessible_scopes":["starkware.starknet.common.syscalls","starkware.starknet.common.syscalls.get_tx_info"],"code":"syscall_handler.get_tx_info(segments=segments, syscall_ptr=ids.syscall_ptr)","flow_tracking_data":{"ap_tracking":{"group":9,"offset":1},"reference_ids":{"starkware.starknet.common.syscalls.get_tx_info.syscall_ptr":12}}}],"123":[{"accessible_scopes":["starkware.cairo.common.signature","starkware.cairo.common.signature.verify_ecdsa_signature"],"code":"ecdsa_builtin.add_signature(ids.ecdsa_ptr.address_, (ids.signature_r, ids.signature_s))","flow_tracking_data":{"ap_tracking":{"group":10,"offset":0},"reference_ids":{"starkware.cairo.common.signature.verify_ecdsa_signature.ecdsa_ptr":15,"starkware.cairo.common.signature.verify_ecdsa_signature.signature_r":13,"starkware.cairo.common.signature.verify_ecdsa_signature.signature_s":14}}}],"128":[{"accessible_scopes":["starkware.cairo.common.math_cmp","starkware.cairo.common.math_cmp.is_le_felt"],"code":"memory[ap] = 0 if (ids.a % PRIME) <= (ids.b % PRIME) else 1","flow_tracking_data":{"ap_tracking":{"group":11,"offset":0},"reference_ids":{"starkware.cairo.common.math_cmp.is_le_felt.a":16,"starkware.cairo.common.math_cmp.is_le_felt.b":17}}}],"375":[{"accessible_scopes":["__main__","__main__","__wrappers__","__wrappers__.constructor"],"code":"memory[ap] = segments.add()","flow_tracking_data":{"ap_tracking":{"group":30,"offset":35},"reference_ids":{}}}],"392":[{"accessible_scopes":["__main__","__main__","__wrappers__","__wrappers__.getPublicKey_encode_return"],"code":"memory[ap] = segments.add()","flow_tracking_data":{"ap_tracking":{"group":32,"offset":0},"reference_ids":{}}}],"425":[{"accessible_scopes":["__main__","__main__","__wrappers__","__wrappers__.supportsInterface_encode_return"],"code":"memory[ap] = segments.add()","flow_tracking_data":{"ap_tracking":{"group":36,"offset":0},"reference_ids":{}}}],"470":[{"accessible_scopes":["__main__","__main__","__wrappers__","__wrappers__.setPublicKey"],"code":"memory[ap] = segments.add()","flow_tracking_data":{"ap_tracking":{"group":40,"offset":50},"reference_ids":{}}}],"491":[{"accessible_scopes":["__main__","__main__","__wrappers__","__wrappers__.isValidSignature_encode_return"],"code":"memory[ap] = segments.add()","flow_tracking_data":{"ap_tracking":{"group":42,"offset":0},"reference_ids":{}}}],"579":[{"accessible_scopes":["__main__","__main__","__wrappers__","__wrappers__.__validate__"],"code":"memory[ap] = segments.add()","flow_tracking_data":{"ap_tracking":{"group":45,"offset":77},"reference_ids":{}}}],"617":[{"accessible_scopes":["__main__","__main__","__wrappers__","__wrappers__.__validate_declare__"],"code":"memory[ap] = segments.add()","flow_tracking_data":{"ap_tracking":{"group":47,"offset":63},"reference_ids":{}}}],"657":[{"accessible_scopes":["__main__","__main__","__wrappers__","__wrappers__.__validate_deploy__"],"code":"memory[ap] = segments.add()","flow_tracking_data":{"ap_tracking":{"group":49,"offset":65},"reference_ids":{}}}],"680":[{"accessible_scopes":["__main__","__main__","__wrappers__","__wrappers__.__execute___encode_return"],"code":"memory[ap] = segments.add()","flow_tracking_data":{"ap_tracking":{"group":52,"offset":0},"reference_ids":{}}}]},"identifiers":{"__main__.Account":{"destination":"openzeppelin.account.library.Account","type":"alias"},"__main__.AccountCallArray":{"destination":"openzeppelin.account.library.AccountCallArray","type":"alias"},"__main__.BitwiseBuiltin":{"destination":"starkware.cairo.common.cairo_builtins.BitwiseBuiltin","type":"alias"},"__main__.HashBuiltin":{"destination":"starkware.cairo.common.cairo_builtins.HashBuiltin","type":"alias"},"__main__.SignatureBuiltin":{"destination":"starkware.cairo.common.cairo_builtins.SignatureBuiltin","type":"alias"},"__main__.__execute__":{"decorators":["external"],"pc":668,"type":"function"},"__main__.__execute__.Args":{"full_name":"__main__.__execute__.Args","members":{"call_array":{"cairo_type":"openzeppelin.account.library.AccountCallArray*","offset":1},"call_array_len":{"cairo_type":"felt","offset":0},"calldata":{"cairo_type":"felt*","offset":3},"calldata_len":{"cairo_type":"felt","offset":2}},"size":4,"type":"struct"},"__main__.__execute__.ImplicitArgs":{"full_name":"__main__.__execute__.ImplicitArgs","members":{"bitwise_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.BitwiseBuiltin*","offset":3},"ecdsa_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.SignatureBuiltin*","offset":2},"pedersen_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.HashBuiltin*","offset":1},"range_check_ptr":{"cairo_type":"felt","offset":4},"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":5,"type":"struct"},"__main__.__execute__.Return":{"cairo_type":"(response_len: felt, response: felt*)","type":"type_definition"},"__main__.__execute__.SIZEOF_LOCALS":{"type":"const","value":0},"__main__.__validate__":{"decorators":["external"],"pc":531,"type":"function"},"__main__.__validate__.Args":{"full_name":"__main__.__validate__.Args","members":{"call_array":{"cairo_type":"openzeppelin.account.library.AccountCallArray*","offset":1},"call_array_len":{"cairo_type":"felt","offset":0},"calldata":{"cairo_type":"felt*","offset":3},"calldata_len":{"cairo_type":"felt","offset":2}},"size":4,"type":"struct"},"__main__.__validate__.ImplicitArgs":{"full_name":"__main__.__validate__.ImplicitArgs","members":{"ecdsa_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.SignatureBuiltin*","offset":2},"pedersen_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.HashBuiltin*","offset":1},"range_check_ptr":{"cairo_type":"felt","offset":3},"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":4,"type":"struct"},"__main__.__validate__.Return":{"cairo_type":"()","type":"type_definition"},"__main__.__validate__.SIZEOF_LOCALS":{"type":"const","value":0},"__main__.__validate_declare__":{"decorators":["external"],"pc":590,"type":"function"},"__main__.__validate_declare__.Args":{"full_name":"__main__.__validate_declare__.Args","members":{"class_hash":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"__main__.__validate_declare__.ImplicitArgs":{"full_name":"__main__.__validate_declare__.ImplicitArgs","members":{"ecdsa_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.SignatureBuiltin*","offset":2},"pedersen_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.HashBuiltin*","offset":1},"range_check_ptr":{"cairo_type":"felt","offset":3},"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":4,"type":"struct"},"__main__.__validate_declare__.Return":{"cairo_type":"()","type":"type_definition"},"__main__.__validate_declare__.SIZEOF_LOCALS":{"type":"const","value":0},"__main__.__validate_deploy__":{"decorators":["external"],"pc":628,"type":"function"},"__main__.__validate_deploy__.Args":{"full_name":"__main__.__validate_deploy__.Args","members":{"class_hash":{"cairo_type":"felt","offset":0},"publicKey":{"cairo_type":"felt","offset":2},"salt":{"cairo_type":"felt","offset":1}},"size":3,"type":"struct"},"__main__.__validate_deploy__.ImplicitArgs":{"full_name":"__main__.__validate_deploy__.ImplicitArgs","members":{"ecdsa_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.SignatureBuiltin*","offset":2},"pedersen_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.HashBuiltin*","offset":1},"range_check_ptr":{"cairo_type":"felt","offset":3},"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":4,"type":"struct"},"__main__.__validate_deploy__.Return":{"cairo_type":"()","type":"type_definition"},"__main__.__validate_deploy__.SIZEOF_LOCALS":{"type":"const","value":0},"__main__.constructor":{"decorators":["constructor"],"pc":359,"type":"function"},"__main__.constructor.Args":{"full_name":"__main__.constructor.Args","members":{"publicKey":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"__main__.constructor.ImplicitArgs":{"full_name":"__main__.constructor.ImplicitArgs","members":{"pedersen_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.HashBuiltin*","offset":1},"range_check_ptr":{"cairo_type":"felt","offset":2},"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":3,"type":"struct"},"__main__.constructor.Return":{"cairo_type":"()","type":"type_definition"},"__main__.constructor.SIZEOF_LOCALS":{"type":"const","value":0},"__main__.getPublicKey":{"decorators":["view"],"pc":386,"type":"function"},"__main__.getPublicKey.Args":{"full_name":"__main__.getPublicKey.Args","members":{},"size":0,"type":"struct"},"__main__.getPublicKey.ImplicitArgs":{"full_name":"__main__.getPublicKey.ImplicitArgs","members":{"pedersen_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.HashBuiltin*","offset":1},"range_check_ptr":{"cairo_type":"felt","offset":2},"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":3,"type":"struct"},"__main__.getPublicKey.Return":{"cairo_type":"(publicKey: felt)","type":"type_definition"},"__main__.getPublicKey.SIZEOF_LOCALS":{"type":"const","value":0},"__main__.get_tx_info":{"destination":"starkware.starknet.common.syscalls.get_tx_info","type":"alias"},"__main__.isValidSignature":{"decorators":["view"],"pc":481,"type":"function"},"__main__.isValidSignature.Args":{"full_name":"__main__.isValidSignature.Args","members":{"hash":{"cairo_type":"felt","offset":0},"signature":{"cairo_type":"felt*","offset":2},"signature_len":{"cairo_type":"felt","offset":1}},"size":3,"type":"struct"},"__main__.isValidSignature.ImplicitArgs":{"full_name":"__main__.isValidSignature.ImplicitArgs","members":{"ecdsa_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.SignatureBuiltin*","offset":2},"pedersen_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.HashBuiltin*","offset":1},"range_check_ptr":{"cairo_type":"felt","offset":3},"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":4,"type":"struct"},"__main__.isValidSignature.Return":{"cairo_type":"(isValid: felt)","type":"type_definition"},"__main__.isValidSignature.SIZEOF_LOCALS":{"type":"const","value":0},"__main__.setPublicKey":{"decorators":["external"],"pc":454,"type":"function"},"__main__.setPublicKey.Args":{"full_name":"__main__.setPublicKey.Args","members":{"newPublicKey":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"__main__.setPublicKey.ImplicitArgs":{"full_name":"__main__.setPublicKey.ImplicitArgs","members":{"pedersen_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.HashBuiltin*","offset":1},"range_check_ptr":{"cairo_type":"felt","offset":2},"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":3,"type":"struct"},"__main__.setPublicKey.Return":{"cairo_type":"()","type":"type_definition"},"__main__.setPublicKey.SIZEOF_LOCALS":{"type":"const","value":0},"__main__.supportsInterface":{"decorators":["view"],"pc":418,"type":"function"},"__main__.supportsInterface.Args":{"full_name":"__main__.supportsInterface.Args","members":{"interfaceId":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"__main__.supportsInterface.ImplicitArgs":{"full_name":"__main__.supportsInterface.ImplicitArgs","members":{"pedersen_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.HashBuiltin*","offset":1},"range_check_ptr":{"cairo_type":"felt","offset":2},"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":3,"type":"struct"},"__main__.supportsInterface.Return":{"cairo_type":"(success: felt)","type":"type_definition"},"__main__.supportsInterface.SIZEOF_LOCALS":{"type":"const","value":0},"__wrappers__.__execute__":{"decorators":["external"],"pc":699,"type":"function"},"__wrappers__.__execute__.Args":{"full_name":"__wrappers__.__execute__.Args","members":{},"size":0,"type":"struct"},"__wrappers__.__execute__.ImplicitArgs":{"full_name":"__wrappers__.__execute__.ImplicitArgs","members":{},"size":0,"type":"struct"},"__wrappers__.__execute__.Return":{"cairo_type":"(syscall_ptr: felt*, pedersen_ptr: starkware.cairo.common.cairo_builtins.HashBuiltin*, range_check_ptr: felt, ecdsa_ptr: starkware.cairo.common.cairo_builtins.SignatureBuiltin*, bitwise_ptr: starkware.cairo.common.cairo_builtins.BitwiseBuiltin*, size: felt, retdata: felt*)","type":"type_definition"},"__wrappers__.__execute__.SIZEOF_LOCALS":{"type":"const","value":4},"__wrappers__.__execute__.__wrapped_func":{"destination":"__main__.__execute__","type":"alias"},"__wrappers__.__execute___encode_return":{"decorators":[],"pc":680,"type":"function"},"__wrappers__.__execute___encode_return.Args":{"full_name":"__wrappers__.__execute___encode_return.Args","members":{"range_check_ptr":{"cairo_type":"felt","offset":2},"ret_value":{"cairo_type":"(response_len: felt, response: felt*)","offset":0}},"size":3,"type":"struct"},"__wrappers__.__execute___encode_return.ImplicitArgs":{"full_name":"__wrappers__.__execute___encode_return.ImplicitArgs","members":{},"size":0,"type":"struct"},"__wrappers__.__execute___encode_return.Return":{"cairo_type":"(range_check_ptr: felt, data_len: felt, data: felt*)","type":"type_definition"},"__wrappers__.__execute___encode_return.SIZEOF_LOCALS":{"type":"const","value":3},"__wrappers__.__execute___encode_return.memcpy":{"destination":"starkware.cairo.common.memcpy.memcpy","type":"alias"},"__wrappers__.__validate__":{"decorators":["external"],"pc":548,"type":"function"},"__wrappers__.__validate__.Args":{"full_name":"__wrappers__.__validate__.Args","members":{},"size":0,"type":"struct"},"__wrappers__.__validate__.ImplicitArgs":{"full_name":"__wrappers__.__validate__.ImplicitArgs","members":{},"size":0,"type":"struct"},"__wrappers__.__validate__.Return":{"cairo_type":"(syscall_ptr: felt*, pedersen_ptr: starkware.cairo.common.cairo_builtins.HashBuiltin*, range_check_ptr: felt, ecdsa_ptr: starkware.cairo.common.cairo_builtins.SignatureBuiltin*, bitwise_ptr: felt, size: felt, retdata: felt*)","type":"type_definition"},"__wrappers__.__validate__.SIZEOF_LOCALS":{"type":"const","value":0},"__wrappers__.__validate__.__wrapped_func":{"destination":"__main__.__validate__","type":"alias"},"__wrappers__.__validate___encode_return.memcpy":{"destination":"starkware.cairo.common.memcpy.memcpy","type":"alias"},"__wrappers__.__validate_declare__":{"decorators":["external"],"pc":607,"type":"function"},"__wrappers__.__validate_declare__.Args":{"full_name":"__wrappers__.__validate_declare__.Args","members":{},"size":0,"type":"struct"},"__wrappers__.__validate_declare__.ImplicitArgs":{"full_name":"__wrappers__.__validate_declare__.ImplicitArgs","members":{},"size":0,"type":"struct"},"__wrappers__.__validate_declare__.Return":{"cairo_type":"(syscall_ptr: felt*, pedersen_ptr: starkware.cairo.common.cairo_builtins.HashBuiltin*, range_check_ptr: felt, ecdsa_ptr: starkware.cairo.common.cairo_builtins.SignatureBuiltin*, bitwise_ptr: felt, size: felt, retdata: felt*)","type":"type_definition"},"__wrappers__.__validate_declare__.SIZEOF_LOCALS":{"type":"const","value":0},"__wrappers__.__validate_declare__.__wrapped_func":{"destination":"__main__.__validate_declare__","type":"alias"},"__wrappers__.__validate_declare___encode_return.memcpy":{"destination":"starkware.cairo.common.memcpy.memcpy","type":"alias"},"__wrappers__.__validate_deploy__":{"decorators":["external"],"pc":645,"type":"function"},"__wrappers__.__validate_deploy__.Args":{"full_name":"__wrappers__.__validate_deploy__.Args","members":{},"size":0,"type":"struct"},"__wrappers__.__validate_deploy__.ImplicitArgs":{"full_name":"__wrappers__.__validate_deploy__.ImplicitArgs","members":{},"size":0,"type":"struct"},"__wrappers__.__validate_deploy__.Return":{"cairo_type":"(syscall_ptr: felt*, pedersen_ptr: starkware.cairo.common.cairo_builtins.HashBuiltin*, range_check_ptr: felt, ecdsa_ptr: starkware.cairo.common.cairo_builtins.SignatureBuiltin*, bitwise_ptr: felt, size: felt, retdata: felt*)","type":"type_definition"},"__wrappers__.__validate_deploy__.SIZEOF_LOCALS":{"type":"const","value":0},"__wrappers__.__validate_deploy__.__wrapped_func":{"destination":"__main__.__validate_deploy__","type":"alias"},"__wrappers__.__validate_deploy___encode_return.memcpy":{"destination":"starkware.cairo.common.memcpy.memcpy","type":"alias"},"__wrappers__.constructor":{"decorators":["constructor"],"pc":366,"type":"function"},"__wrappers__.constructor.Args":{"full_name":"__wrappers__.constructor.Args","members":{},"size":0,"type":"struct"},"__wrappers__.constructor.ImplicitArgs":{"full_name":"__wrappers__.constructor.ImplicitArgs","members":{},"size":0,"type":"struct"},"__wrappers__.constructor.Return":{"cairo_type":"(syscall_ptr: felt*, pedersen_ptr: starkware.cairo.common.cairo_builtins.HashBuiltin*, range_check_ptr: felt, ecdsa_ptr: felt, bitwise_ptr: felt, size: felt, retdata: felt*)","type":"type_definition"},"__wrappers__.constructor.SIZEOF_LOCALS":{"type":"const","value":0},"__wrappers__.constructor.__wrapped_func":{"destination":"__main__.constructor","type":"alias"},"__wrappers__.constructor_encode_return.memcpy":{"destination":"starkware.cairo.common.memcpy.memcpy","type":"alias"},"__wrappers__.getPublicKey":{"decorators":["view"],"pc":401,"type":"function"},"__wrappers__.getPublicKey.Args":{"full_name":"__wrappers__.getPublicKey.Args","members":{},"size":0,"type":"struct"},"__wrappers__.getPublicKey.ImplicitArgs":{"full_name":"__wrappers__.getPublicKey.ImplicitArgs","members":{},"size":0,"type":"struct"},"__wrappers__.getPublicKey.Return":{"cairo_type":"(syscall_ptr: felt*, pedersen_ptr: starkware.cairo.common.cairo_builtins.HashBuiltin*, range_check_ptr: felt, ecdsa_ptr: felt, bitwise_ptr: felt, size: felt, retdata: felt*)","type":"type_definition"},"__wrappers__.getPublicKey.SIZEOF_LOCALS":{"type":"const","value":0},"__wrappers__.getPublicKey.__wrapped_func":{"destination":"__main__.getPublicKey","type":"alias"},"__wrappers__.getPublicKey_encode_return":{"decorators":[],"pc":392,"type":"function"},"__wrappers__.getPublicKey_encode_return.Args":{"full_name":"__wrappers__.getPublicKey_encode_return.Args","members":{"range_check_ptr":{"cairo_type":"felt","offset":1},"ret_value":{"cairo_type":"(publicKey: felt)","offset":0}},"size":2,"type":"struct"},"__wrappers__.getPublicKey_encode_return.ImplicitArgs":{"full_name":"__wrappers__.getPublicKey_encode_return.ImplicitArgs","members":{},"size":0,"type":"struct"},"__wrappers__.getPublicKey_encode_return.Return":{"cairo_type":"(range_check_ptr: felt, data_len: felt, data: felt*)","type":"type_definition"},"__wrappers__.getPublicKey_encode_return.SIZEOF_LOCALS":{"type":"const","value":1},"__wrappers__.getPublicKey_encode_return.memcpy":{"destination":"starkware.cairo.common.memcpy.memcpy","type":"alias"},"__wrappers__.isValidSignature":{"decorators":["view"],"pc":500,"type":"function"},"__wrappers__.isValidSignature.Args":{"full_name":"__wrappers__.isValidSignature.Args","members":{},"size":0,"type":"struct"},"__wrappers__.isValidSignature.ImplicitArgs":{"full_name":"__wrappers__.isValidSignature.ImplicitArgs","members":{},"size":0,"type":"struct"},"__wrappers__.isValidSignature.Return":{"cairo_type":"(syscall_ptr: felt*, pedersen_ptr: starkware.cairo.common.cairo_builtins.HashBuiltin*, range_check_ptr: felt, ecdsa_ptr: starkware.cairo.common.cairo_builtins.SignatureBuiltin*, bitwise_ptr: felt, size: felt, retdata: felt*)","type":"type_definition"},"__wrappers__.isValidSignature.SIZEOF_LOCALS":{"type":"const","value":0},"__wrappers__.isValidSignature.__wrapped_func":{"destination":"__main__.isValidSignature","type":"alias"},"__wrappers__.isValidSignature_encode_return":{"decorators":[],"pc":491,"type":"function"},"__wrappers__.isValidSignature_encode_return.Args":{"full_name":"__wrappers__.isValidSignature_encode_return.Args","members":{"range_check_ptr":{"cairo_type":"felt","offset":1},"ret_value":{"cairo_type":"(isValid: felt)","offset":0}},"size":2,"type":"struct"},"__wrappers__.isValidSignature_encode_return.ImplicitArgs":{"full_name":"__wrappers__.isValidSignature_encode_return.ImplicitArgs","members":{},"size":0,"type":"struct"},"__wrappers__.isValidSignature_encode_return.Return":{"cairo_type":"(range_check_ptr: felt, data_len: felt, data: felt*)","type":"type_definition"},"__wrappers__.isValidSignature_encode_return.SIZEOF_LOCALS":{"type":"const","value":1},"__wrappers__.isValidSignature_encode_return.memcpy":{"destination":"starkware.cairo.common.memcpy.memcpy","type":"alias"},"__wrappers__.setPublicKey":{"decorators":["external"],"pc":461,"type":"function"},"__wrappers__.setPublicKey.Args":{"full_name":"__wrappers__.setPublicKey.Args","members":{},"size":0,"type":"struct"},"__wrappers__.setPublicKey.ImplicitArgs":{"full_name":"__wrappers__.setPublicKey.ImplicitArgs","members":{},"size":0,"type":"struct"},"__wrappers__.setPublicKey.Return":{"cairo_type":"(syscall_ptr: felt*, pedersen_ptr: starkware.cairo.common.cairo_builtins.HashBuiltin*, range_check_ptr: felt, ecdsa_ptr: felt, bitwise_ptr: felt, size: felt, retdata: felt*)","type":"type_definition"},"__wrappers__.setPublicKey.SIZEOF_LOCALS":{"type":"const","value":0},"__wrappers__.setPublicKey.__wrapped_func":{"destination":"__main__.setPublicKey","type":"alias"},"__wrappers__.setPublicKey_encode_return.memcpy":{"destination":"starkware.cairo.common.memcpy.memcpy","type":"alias"},"__wrappers__.supportsInterface":{"decorators":["view"],"pc":434,"type":"function"},"__wrappers__.supportsInterface.Args":{"full_name":"__wrappers__.supportsInterface.Args","members":{},"size":0,"type":"struct"},"__wrappers__.supportsInterface.ImplicitArgs":{"full_name":"__wrappers__.supportsInterface.ImplicitArgs","members":{},"size":0,"type":"struct"},"__wrappers__.supportsInterface.Return":{"cairo_type":"(syscall_ptr: felt*, pedersen_ptr: starkware.cairo.common.cairo_builtins.HashBuiltin*, range_check_ptr: felt, ecdsa_ptr: felt, bitwise_ptr: felt, size: felt, retdata: felt*)","type":"type_definition"},"__wrappers__.supportsInterface.SIZEOF_LOCALS":{"type":"const","value":0},"__wrappers__.supportsInterface.__wrapped_func":{"destination":"__main__.supportsInterface","type":"alias"},"__wrappers__.supportsInterface_encode_return":{"decorators":[],"pc":425,"type":"function"},"__wrappers__.supportsInterface_encode_return.Args":{"full_name":"__wrappers__.supportsInterface_encode_return.Args","members":{"range_check_ptr":{"cairo_type":"felt","offset":1},"ret_value":{"cairo_type":"(success: felt)","offset":0}},"size":2,"type":"struct"},"__wrappers__.supportsInterface_encode_return.ImplicitArgs":{"full_name":"__wrappers__.supportsInterface_encode_return.ImplicitArgs","members":{},"size":0,"type":"struct"},"__wrappers__.supportsInterface_encode_return.Return":{"cairo_type":"(range_check_ptr: felt, data_len: felt, data: felt*)","type":"type_definition"},"__wrappers__.supportsInterface_encode_return.SIZEOF_LOCALS":{"type":"const","value":1},"__wrappers__.supportsInterface_encode_return.memcpy":{"destination":"starkware.cairo.common.memcpy.memcpy","type":"alias"},"openzeppelin.account.library.Account":{"type":"namespace"},"openzeppelin.account.library.Account.Args":{"full_name":"openzeppelin.account.library.Account.Args","members":{},"size":0,"type":"struct"},"openzeppelin.account.library.Account.ImplicitArgs":{"full_name":"openzeppelin.account.library.Account.ImplicitArgs","members":{},"size":0,"type":"struct"},"openzeppelin.account.library.Account.Return":{"cairo_type":"()","type":"type_definition"},"openzeppelin.account.library.Account.SIZEOF_LOCALS":{"type":"const","value":0},"openzeppelin.account.library.Account._execute_list":{"decorators":[],"pc":301,"type":"function"},"openzeppelin.account.library.Account._execute_list.Args":{"full_name":"openzeppelin.account.library.Account._execute_list.Args","members":{"calls":{"cairo_type":"openzeppelin.account.library.Call*","offset":1},"calls_len":{"cairo_type":"felt","offset":0},"response":{"cairo_type":"felt*","offset":2}},"size":3,"type":"struct"},"openzeppelin.account.library.Account._execute_list.ImplicitArgs":{"full_name":"openzeppelin.account.library.Account._execute_list.ImplicitArgs","members":{"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":1,"type":"struct"},"openzeppelin.account.library.Account._execute_list.Return":{"cairo_type":"(response_len: felt)","type":"type_definition"},"openzeppelin.account.library.Account._execute_list.SIZEOF_LOCALS":{"type":"const","value":3},"openzeppelin.account.library.Account._from_call_array_to_call":{"decorators":[],"pc":335,"type":"function"},"openzeppelin.account.library.Account._from_call_array_to_call.Args":{"full_name":"openzeppelin.account.library.Account._from_call_array_to_call.Args","members":{"call_array":{"cairo_type":"openzeppelin.account.library.AccountCallArray*","offset":1},"call_array_len":{"cairo_type":"felt","offset":0},"calldata":{"cairo_type":"felt*","offset":2},"calls":{"cairo_type":"openzeppelin.account.library.Call*","offset":3}},"size":4,"type":"struct"},"openzeppelin.account.library.Account._from_call_array_to_call.ImplicitArgs":{"full_name":"openzeppelin.account.library.Account._from_call_array_to_call.ImplicitArgs","members":{"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":1,"type":"struct"},"openzeppelin.account.library.Account._from_call_array_to_call.Return":{"cairo_type":"()","type":"type_definition"},"openzeppelin.account.library.Account._from_call_array_to_call.SIZEOF_LOCALS":{"type":"const","value":0},"openzeppelin.account.library.Account.assert_only_self":{"decorators":[],"pc":185,"type":"function"},"openzeppelin.account.library.Account.assert_only_self.Args":{"full_name":"openzeppelin.account.library.Account.assert_only_self.Args","members":{},"size":0,"type":"struct"},"openzeppelin.account.library.Account.assert_only_self.ImplicitArgs":{"full_name":"openzeppelin.account.library.Account.assert_only_self.ImplicitArgs","members":{"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":1,"type":"struct"},"openzeppelin.account.library.Account.assert_only_self.Return":{"cairo_type":"()","type":"type_definition"},"openzeppelin.account.library.Account.assert_only_self.SIZEOF_LOCALS":{"type":"const","value":0},"openzeppelin.account.library.Account.execute":{"decorators":[],"pc":254,"type":"function"},"openzeppelin.account.library.Account.execute.Args":{"full_name":"openzeppelin.account.library.Account.execute.Args","members":{"call_array":{"cairo_type":"openzeppelin.account.library.AccountCallArray*","offset":1},"call_array_len":{"cairo_type":"felt","offset":0},"calldata":{"cairo_type":"felt*","offset":3},"calldata_len":{"cairo_type":"felt","offset":2}},"size":4,"type":"struct"},"openzeppelin.account.library.Account.execute.ImplicitArgs":{"full_name":"openzeppelin.account.library.Account.execute.ImplicitArgs","members":{"bitwise_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.BitwiseBuiltin*","offset":3},"ecdsa_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.SignatureBuiltin*","offset":2},"pedersen_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.HashBuiltin*","offset":1},"range_check_ptr":{"cairo_type":"felt","offset":4},"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":5,"type":"struct"},"openzeppelin.account.library.Account.execute.Return":{"cairo_type":"(response_len: felt, response: felt*)","type":"type_definition"},"openzeppelin.account.library.Account.execute.SIZEOF_LOCALS":{"type":"const","value":3},"openzeppelin.account.library.Account.get_public_key":{"decorators":[],"pc":194,"type":"function"},"openzeppelin.account.library.Account.get_public_key.Args":{"full_name":"openzeppelin.account.library.Account.get_public_key.Args","members":{},"size":0,"type":"struct"},"openzeppelin.account.library.Account.get_public_key.ImplicitArgs":{"full_name":"openzeppelin.account.library.Account.get_public_key.ImplicitArgs","members":{"pedersen_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.HashBuiltin*","offset":1},"range_check_ptr":{"cairo_type":"felt","offset":2},"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":3,"type":"struct"},"openzeppelin.account.library.Account.get_public_key.Return":{"cairo_type":"(public_key: felt)","type":"type_definition"},"openzeppelin.account.library.Account.get_public_key.SIZEOF_LOCALS":{"type":"const","value":0},"openzeppelin.account.library.Account.initializer":{"decorators":[],"pc":178,"type":"function"},"openzeppelin.account.library.Account.initializer.Args":{"full_name":"openzeppelin.account.library.Account.initializer.Args","members":{"_public_key":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"openzeppelin.account.library.Account.initializer.ImplicitArgs":{"full_name":"openzeppelin.account.library.Account.initializer.ImplicitArgs","members":{"pedersen_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.HashBuiltin*","offset":1},"range_check_ptr":{"cairo_type":"felt","offset":2},"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":3,"type":"struct"},"openzeppelin.account.library.Account.initializer.Return":{"cairo_type":"()","type":"type_definition"},"openzeppelin.account.library.Account.initializer.SIZEOF_LOCALS":{"type":"const","value":0},"openzeppelin.account.library.Account.is_valid_signature":{"decorators":[],"pc":235,"type":"function"},"openzeppelin.account.library.Account.is_valid_signature.Args":{"full_name":"openzeppelin.account.library.Account.is_valid_signature.Args","members":{"hash":{"cairo_type":"felt","offset":0},"signature":{"cairo_type":"felt*","offset":2},"signature_len":{"cairo_type":"felt","offset":1}},"size":3,"type":"struct"},"openzeppelin.account.library.Account.is_valid_signature.ImplicitArgs":{"full_name":"openzeppelin.account.library.Account.is_valid_signature.ImplicitArgs","members":{"ecdsa_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.SignatureBuiltin*","offset":2},"pedersen_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.HashBuiltin*","offset":1},"range_check_ptr":{"cairo_type":"felt","offset":3},"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":4,"type":"struct"},"openzeppelin.account.library.Account.is_valid_signature.Return":{"cairo_type":"(is_valid: felt)","type":"type_definition"},"openzeppelin.account.library.Account.is_valid_signature.SIZEOF_LOCALS":{"type":"const","value":0},"openzeppelin.account.library.Account.set_public_key":{"decorators":[],"pc":226,"type":"function"},"openzeppelin.account.library.Account.set_public_key.Args":{"full_name":"openzeppelin.account.library.Account.set_public_key.Args","members":{"new_public_key":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"openzeppelin.account.library.Account.set_public_key.ImplicitArgs":{"full_name":"openzeppelin.account.library.Account.set_public_key.ImplicitArgs","members":{"pedersen_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.HashBuiltin*","offset":1},"range_check_ptr":{"cairo_type":"felt","offset":2},"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":3,"type":"struct"},"openzeppelin.account.library.Account.set_public_key.Return":{"cairo_type":"()","type":"type_definition"},"openzeppelin.account.library.Account.set_public_key.SIZEOF_LOCALS":{"type":"const","value":0},"openzeppelin.account.library.Account.supports_interface":{"decorators":[],"pc":200,"type":"function"},"openzeppelin.account.library.Account.supports_interface.Args":{"full_name":"openzeppelin.account.library.Account.supports_interface.Args","members":{"interface_id":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"openzeppelin.account.library.Account.supports_interface.ImplicitArgs":{"full_name":"openzeppelin.account.library.Account.supports_interface.ImplicitArgs","members":{"pedersen_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.HashBuiltin*","offset":1},"range_check_ptr":{"cairo_type":"felt","offset":2},"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":3,"type":"struct"},"openzeppelin.account.library.Account.supports_interface.Return":{"cairo_type":"(success: felt)","type":"type_definition"},"openzeppelin.account.library.Account.supports_interface.SIZEOF_LOCALS":{"type":"const","value":0},"openzeppelin.account.library.AccountCallArray":{"full_name":"openzeppelin.account.library.AccountCallArray","members":{"data_len":{"cairo_type":"felt","offset":3},"data_offset":{"cairo_type":"felt","offset":2},"selector":{"cairo_type":"felt","offset":1},"to":{"cairo_type":"felt","offset":0}},"size":4,"type":"struct"},"openzeppelin.account.library.Account_public_key":{"type":"namespace"},"openzeppelin.account.library.Account_public_key.Args":{"full_name":"openzeppelin.account.library.Account_public_key.Args","members":{},"size":0,"type":"struct"},"openzeppelin.account.library.Account_public_key.HashBuiltin":{"destination":"starkware.cairo.common.cairo_builtins.HashBuiltin","type":"alias"},"openzeppelin.account.library.Account_public_key.ImplicitArgs":{"full_name":"openzeppelin.account.library.Account_public_key.ImplicitArgs","members":{},"size":0,"type":"struct"},"openzeppelin.account.library.Account_public_key.Return":{"cairo_type":"()","type":"type_definition"},"openzeppelin.account.library.Account_public_key.SIZEOF_LOCALS":{"type":"const","value":0},"openzeppelin.account.library.Account_public_key.addr":{"decorators":[],"pc":148,"type":"function"},"openzeppelin.account.library.Account_public_key.addr.Args":{"full_name":"openzeppelin.account.library.Account_public_key.addr.Args","members":{},"size":0,"type":"struct"},"openzeppelin.account.library.Account_public_key.addr.ImplicitArgs":{"full_name":"openzeppelin.account.library.Account_public_key.addr.ImplicitArgs","members":{"pedersen_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.HashBuiltin*","offset":0},"range_check_ptr":{"cairo_type":"felt","offset":1}},"size":2,"type":"struct"},"openzeppelin.account.library.Account_public_key.addr.Return":{"cairo_type":"(res: felt)","type":"type_definition"},"openzeppelin.account.library.Account_public_key.addr.SIZEOF_LOCALS":{"type":"const","value":0},"openzeppelin.account.library.Account_public_key.hash2":{"destination":"starkware.cairo.common.hash.hash2","type":"alias"},"openzeppelin.account.library.Account_public_key.normalize_address":{"destination":"starkware.starknet.common.storage.normalize_address","type":"alias"},"openzeppelin.account.library.Account_public_key.read":{"decorators":[],"pc":153,"type":"function"},"openzeppelin.account.library.Account_public_key.read.Args":{"full_name":"openzeppelin.account.library.Account_public_key.read.Args","members":{},"size":0,"type":"struct"},"openzeppelin.account.library.Account_public_key.read.ImplicitArgs":{"full_name":"openzeppelin.account.library.Account_public_key.read.ImplicitArgs","members":{"pedersen_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.HashBuiltin*","offset":1},"range_check_ptr":{"cairo_type":"felt","offset":2},"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":3,"type":"struct"},"openzeppelin.account.library.Account_public_key.read.Return":{"cairo_type":"(public_key: felt)","type":"type_definition"},"openzeppelin.account.library.Account_public_key.read.SIZEOF_LOCALS":{"type":"const","value":0},"openzeppelin.account.library.Account_public_key.storage_read":{"destination":"starkware.starknet.common.syscalls.storage_read","type":"alias"},"openzeppelin.account.library.Account_public_key.storage_write":{"destination":"starkware.starknet.common.syscalls.storage_write","type":"alias"},"openzeppelin.account.library.Account_public_key.write":{"decorators":[],"pc":166,"type":"function"},"openzeppelin.account.library.Account_public_key.write.Args":{"full_name":"openzeppelin.account.library.Account_public_key.write.Args","members":{"value":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"openzeppelin.account.library.Account_public_key.write.ImplicitArgs":{"full_name":"openzeppelin.account.library.Account_public_key.write.ImplicitArgs","members":{"pedersen_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.HashBuiltin*","offset":1},"range_check_ptr":{"cairo_type":"felt","offset":2},"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":3,"type":"struct"},"openzeppelin.account.library.Account_public_key.write.Return":{"cairo_type":"()","type":"type_definition"},"openzeppelin.account.library.Account_public_key.write.SIZEOF_LOCALS":{"type":"const","value":0},"openzeppelin.account.library.BitwiseBuiltin":{"destination":"starkware.cairo.common.cairo_builtins.BitwiseBuiltin","type":"alias"},"openzeppelin.account.library.Call":{"full_name":"openzeppelin.account.library.Call","members":{"calldata":{"cairo_type":"felt*","offset":3},"calldata_len":{"cairo_type":"felt","offset":2},"selector":{"cairo_type":"felt","offset":1},"to":{"cairo_type":"felt","offset":0}},"size":4,"type":"struct"},"openzeppelin.account.library.FALSE":{"destination":"starkware.cairo.common.bool.FALSE","type":"alias"},"openzeppelin.account.library.HashBuiltin":{"destination":"starkware.cairo.common.cairo_builtins.HashBuiltin","type":"alias"},"openzeppelin.account.library.IACCOUNT_ID":{"destination":"openzeppelin.utils.constants.library.IACCOUNT_ID","type":"alias"},"openzeppelin.account.library.IERC165_ID":{"destination":"openzeppelin.utils.constants.library.IERC165_ID","type":"alias"},"openzeppelin.account.library.SignatureBuiltin":{"destination":"starkware.cairo.common.cairo_builtins.SignatureBuiltin","type":"alias"},"openzeppelin.account.library.TRANSACTION_VERSION":{"destination":"openzeppelin.utils.constants.library.TRANSACTION_VERSION","type":"alias"},"openzeppelin.account.library.TRUE":{"destination":"starkware.cairo.common.bool.TRUE","type":"alias"},"openzeppelin.account.library.Uint256":{"destination":"starkware.cairo.common.uint256.Uint256","type":"alias"},"openzeppelin.account.library.alloc":{"destination":"starkware.cairo.common.alloc.alloc","type":"alias"},"openzeppelin.account.library.call_contract":{"destination":"starkware.starknet.common.syscalls.call_contract","type":"alias"},"openzeppelin.account.library.get_caller_address":{"destination":"starkware.starknet.common.syscalls.get_caller_address","type":"alias"},"openzeppelin.account.library.get_contract_address":{"destination":"starkware.starknet.common.syscalls.get_contract_address","type":"alias"},"openzeppelin.account.library.get_fp_and_pc":{"destination":"starkware.cairo.common.registers.get_fp_and_pc","type":"alias"},"openzeppelin.account.library.get_tx_info":{"destination":"starkware.starknet.common.syscalls.get_tx_info","type":"alias"},"openzeppelin.account.library.is_le_felt":{"destination":"starkware.cairo.common.math_cmp.is_le_felt","type":"alias"},"openzeppelin.account.library.memcpy":{"destination":"starkware.cairo.common.memcpy.memcpy","type":"alias"},"openzeppelin.account.library.split_felt":{"destination":"starkware.cairo.common.math.split_felt","type":"alias"},"openzeppelin.account.library.verify_ecdsa_signature":{"destination":"starkware.cairo.common.signature.verify_ecdsa_signature","type":"alias"},"openzeppelin.account.library.verify_eth_signature_uint256":{"destination":"starkware.cairo.common.cairo_secp.signature.verify_eth_signature_uint256","type":"alias"},"openzeppelin.utils.constants.library.DEFAULT_ADMIN_ROLE":{"type":"const","value":0},"openzeppelin.utils.constants.library.IACCESSCONTROL_ID":{"type":"const","value":2036718347},"openzeppelin.utils.constants.library.IACCOUNT_ID":{"type":"const","value":2792084853},"openzeppelin.utils.constants.library.IERC165_ID":{"type":"const","value":33540519},"openzeppelin.utils.constants.library.IERC721_ENUMERABLE_ID":{"type":"const","value":2014223715},"openzeppelin.utils.constants.library.IERC721_ID":{"type":"const","value":2158778573},"openzeppelin.utils.constants.library.IERC721_METADATA_ID":{"type":"const","value":1532892063},"openzeppelin.utils.constants.library.IERC721_RECEIVER_ID":{"type":"const","value":353073666},"openzeppelin.utils.constants.library.INVALID_ID":{"type":"const","value":4294967295},"openzeppelin.utils.constants.library.TRANSACTION_VERSION":{"type":"const","value":1},"openzeppelin.utils.constants.library.UINT8_MAX":{"type":"const","value":255},"starkware.cairo.common.alloc.alloc":{"decorators":[],"pc":0,"type":"function"},"starkware.cairo.common.alloc.alloc.Args":{"full_name":"starkware.cairo.common.alloc.alloc.Args","members":{},"size":0,"type":"struct"},"starkware.cairo.common.alloc.alloc.ImplicitArgs":{"full_name":"starkware.cairo.common.alloc.alloc.ImplicitArgs","members":{},"size":0,"type":"struct"},"starkware.cairo.common.alloc.alloc.Return":{"cairo_type":"(ptr: felt*)","type":"type_definition"},"starkware.cairo.common.alloc.alloc.SIZEOF_LOCALS":{"type":"const","value":0},"starkware.cairo.common.bitwise.ALL_ONES":{"type":"const","value":-106710729501573572985208420194530329073740042555888586719234},"starkware.cairo.common.bitwise.BitwiseBuiltin":{"destination":"starkware.cairo.common.cairo_builtins.BitwiseBuiltin","type":"alias"},"starkware.cairo.common.bool.FALSE":{"type":"const","value":0},"starkware.cairo.common.bool.TRUE":{"type":"const","value":1},"starkware.cairo.common.cairo_builtins.BitwiseBuiltin":{"full_name":"starkware.cairo.common.cairo_builtins.BitwiseBuiltin","members":{"x":{"cairo_type":"felt","offset":0},"x_and_y":{"cairo_type":"felt","offset":2},"x_or_y":{"cairo_type":"felt","offset":4},"x_xor_y":{"cairo_type":"felt","offset":3},"y":{"cairo_type":"felt","offset":1}},"size":5,"type":"struct"},"starkware.cairo.common.cairo_builtins.EcOpBuiltin":{"full_name":"starkware.cairo.common.cairo_builtins.EcOpBuiltin","members":{"m":{"cairo_type":"felt","offset":4},"p":{"cairo_type":"starkware.cairo.common.ec_point.EcPoint","offset":0},"q":{"cairo_type":"starkware.cairo.common.ec_point.EcPoint","offset":2},"r":{"cairo_type":"starkware.cairo.common.ec_point.EcPoint","offset":5}},"size":7,"type":"struct"},"starkware.cairo.common.cairo_builtins.EcPoint":{"destination":"starkware.cairo.common.ec_point.EcPoint","type":"alias"},"starkware.cairo.common.cairo_builtins.HashBuiltin":{"full_name":"starkware.cairo.common.cairo_builtins.HashBuiltin","members":{"result":{"cairo_type":"felt","offset":2},"x":{"cairo_type":"felt","offset":0},"y":{"cairo_type":"felt","offset":1}},"size":3,"type":"struct"},"starkware.cairo.common.cairo_builtins.KeccakBuiltin":{"full_name":"starkware.cairo.common.cairo_builtins.KeccakBuiltin","members":{"input":{"cairo_type":"starkware.cairo.common.keccak_state.KeccakBuiltinState","offset":0},"output":{"cairo_type":"starkware.cairo.common.keccak_state.KeccakBuiltinState","offset":8}},"size":16,"type":"struct"},"starkware.cairo.common.cairo_builtins.KeccakBuiltinState":{"destination":"starkware.cairo.common.keccak_state.KeccakBuiltinState","type":"alias"},"starkware.cairo.common.cairo_builtins.SignatureBuiltin":{"full_name":"starkware.cairo.common.cairo_builtins.SignatureBuiltin","members":{"message":{"cairo_type":"felt","offset":1},"pub_key":{"cairo_type":"felt","offset":0}},"size":2,"type":"struct"},"starkware.cairo.common.cairo_keccak.keccak.BLOCK_SIZE":{"destination":"starkware.cairo.common.cairo_keccak.packed_keccak.BLOCK_SIZE","type":"alias"},"starkware.cairo.common.cairo_keccak.keccak.BYTES_IN_WORD":{"type":"const","value":8},"starkware.cairo.common.cairo_keccak.keccak.BitwiseBuiltin":{"destination":"starkware.cairo.common.cairo_builtins.BitwiseBuiltin","type":"alias"},"starkware.cairo.common.cairo_keccak.keccak.KECCAK_CAPACITY_IN_WORDS":{"type":"const","value":8},"starkware.cairo.common.cairo_keccak.keccak.KECCAK_FULL_RATE_IN_BYTES":{"type":"const","value":136},"starkware.cairo.common.cairo_keccak.keccak.KECCAK_FULL_RATE_IN_WORDS":{"type":"const","value":17},"starkware.cairo.common.cairo_keccak.keccak.KECCAK_STATE_SIZE_FELTS":{"type":"const","value":25},"starkware.cairo.common.cairo_keccak.keccak.Uint256":{"destination":"starkware.cairo.common.uint256.Uint256","type":"alias"},"starkware.cairo.common.cairo_keccak.keccak.alloc":{"destination":"starkware.cairo.common.alloc.alloc","type":"alias"},"starkware.cairo.common.cairo_keccak.keccak.assert_lt":{"destination":"starkware.cairo.common.math.assert_lt","type":"alias"},"starkware.cairo.common.cairo_keccak.keccak.assert_nn":{"destination":"starkware.cairo.common.math.assert_nn","type":"alias"},"starkware.cairo.common.cairo_keccak.keccak.assert_nn_le":{"destination":"starkware.cairo.common.math.assert_nn_le","type":"alias"},"starkware.cairo.common.cairo_keccak.keccak.assert_not_zero":{"destination":"starkware.cairo.common.math.assert_not_zero","type":"alias"},"starkware.cairo.common.cairo_keccak.keccak.bitwise_and":{"destination":"starkware.cairo.common.bitwise.bitwise_and","type":"alias"},"starkware.cairo.common.cairo_keccak.keccak.bitwise_or":{"destination":"starkware.cairo.common.bitwise.bitwise_or","type":"alias"},"starkware.cairo.common.cairo_keccak.keccak.bitwise_xor":{"destination":"starkware.cairo.common.bitwise.bitwise_xor","type":"alias"},"starkware.cairo.common.cairo_keccak.keccak.memcpy":{"destination":"starkware.cairo.common.memcpy.memcpy","type":"alias"},"starkware.cairo.common.cairo_keccak.keccak.memset":{"destination":"starkware.cairo.common.memset.memset","type":"alias"},"starkware.cairo.common.cairo_keccak.keccak.packed_keccak_func":{"destination":"starkware.cairo.common.cairo_keccak.packed_keccak.packed_keccak_func","type":"alias"},"starkware.cairo.common.cairo_keccak.keccak.pow":{"destination":"starkware.cairo.common.pow.pow","type":"alias"},"starkware.cairo.common.cairo_keccak.keccak.split_felt":{"destination":"starkware.cairo.common.math.split_felt","type":"alias"},"starkware.cairo.common.cairo_keccak.keccak.uint256_reverse_endian":{"destination":"starkware.cairo.common.uint256.uint256_reverse_endian","type":"alias"},"starkware.cairo.common.cairo_keccak.keccak.unsigned_div_rem":{"destination":"starkware.cairo.common.math.unsigned_div_rem","type":"alias"},"starkware.cairo.common.cairo_keccak.packed_keccak.ALL_ONES":{"type":"const","value":-106710729501573572985208420194530329073740042555888586719234},"starkware.cairo.common.cairo_keccak.packed_keccak.BLOCK_SIZE":{"type":"const","value":3},"starkware.cairo.common.cairo_keccak.packed_keccak.BitwiseBuiltin":{"destination":"starkware.cairo.common.cairo_builtins.BitwiseBuiltin","type":"alias"},"starkware.cairo.common.cairo_keccak.packed_keccak.SHIFTS":{"type":"const","value":340282366920938463481821351505477763073},"starkware.cairo.common.cairo_keccak.packed_keccak.alloc":{"destination":"starkware.cairo.common.alloc.alloc","type":"alias"},"starkware.cairo.common.cairo_keccak.packed_keccak.get_fp_and_pc":{"destination":"starkware.cairo.common.registers.get_fp_and_pc","type":"alias"},"starkware.cairo.common.cairo_secp.bigint.BASE":{"destination":"starkware.cairo.common.cairo_secp.constants.BASE","type":"alias"},"starkware.cairo.common.cairo_secp.bigint.BigInt3":{"full_name":"starkware.cairo.common.cairo_secp.bigint.BigInt3","members":{"d0":{"cairo_type":"felt","offset":0},"d1":{"cairo_type":"felt","offset":1},"d2":{"cairo_type":"felt","offset":2}},"size":3,"type":"struct"},"starkware.cairo.common.cairo_secp.bigint.RC_BOUND":{"destination":"starkware.cairo.common.math_cmp.RC_BOUND","type":"alias"},"starkware.cairo.common.cairo_secp.bigint.Uint256":{"destination":"starkware.cairo.common.uint256.Uint256","type":"alias"},"starkware.cairo.common.cairo_secp.bigint.UnreducedBigInt3":{"full_name":"starkware.cairo.common.cairo_secp.bigint.UnreducedBigInt3","members":{"d0":{"cairo_type":"felt","offset":0},"d1":{"cairo_type":"felt","offset":1},"d2":{"cairo_type":"felt","offset":2}},"size":3,"type":"struct"},"starkware.cairo.common.cairo_secp.bigint.UnreducedBigInt5":{"full_name":"starkware.cairo.common.cairo_secp.bigint.UnreducedBigInt5","members":{"d0":{"cairo_type":"felt","offset":0},"d1":{"cairo_type":"felt","offset":1},"d2":{"cairo_type":"felt","offset":2},"d3":{"cairo_type":"felt","offset":3},"d4":{"cairo_type":"felt","offset":4}},"size":5,"type":"struct"},"starkware.cairo.common.cairo_secp.bigint.assert_nn":{"destination":"starkware.cairo.common.math.assert_nn","type":"alias"},"starkware.cairo.common.cairo_secp.bigint.assert_nn_le":{"destination":"starkware.cairo.common.math.assert_nn_le","type":"alias"},"starkware.cairo.common.cairo_secp.bigint.unsigned_div_rem":{"destination":"starkware.cairo.common.math.unsigned_div_rem","type":"alias"},"starkware.cairo.common.cairo_secp.constants.BASE":{"type":"const","value":77371252455336267181195264},"starkware.cairo.common.cairo_secp.constants.BETA":{"type":"const","value":7},"starkware.cairo.common.cairo_secp.constants.N0":{"type":"const","value":10428087374290690730508609},"starkware.cairo.common.cairo_secp.constants.N1":{"type":"const","value":77371252455330678278691517},"starkware.cairo.common.cairo_secp.constants.N2":{"type":"const","value":19342813113834066795298815},"starkware.cairo.common.cairo_secp.constants.P0":{"type":"const","value":77371252455336262886226991},"starkware.cairo.common.cairo_secp.constants.P1":{"type":"const","value":77371252455336267181195263},"starkware.cairo.common.cairo_secp.constants.P2":{"type":"const","value":19342813113834066795298815},"starkware.cairo.common.cairo_secp.constants.SECP_REM":{"type":"const","value":4294968273},"starkware.cairo.common.cairo_secp.ec.BigInt3":{"destination":"starkware.cairo.common.cairo_secp.bigint.BigInt3","type":"alias"},"starkware.cairo.common.cairo_secp.ec.EcPoint":{"full_name":"starkware.cairo.common.cairo_secp.ec.EcPoint","members":{"x":{"cairo_type":"starkware.cairo.common.cairo_secp.bigint.BigInt3","offset":0},"y":{"cairo_type":"starkware.cairo.common.cairo_secp.bigint.BigInt3","offset":3}},"size":6,"type":"struct"},"starkware.cairo.common.cairo_secp.ec.UnreducedBigInt3":{"destination":"starkware.cairo.common.cairo_secp.bigint.UnreducedBigInt3","type":"alias"},"starkware.cairo.common.cairo_secp.ec.is_zero":{"destination":"starkware.cairo.common.cairo_secp.field.is_zero","type":"alias"},"starkware.cairo.common.cairo_secp.ec.nondet_bigint3":{"destination":"starkware.cairo.common.cairo_secp.bigint.nondet_bigint3","type":"alias"},"starkware.cairo.common.cairo_secp.ec.unreduced_mul":{"destination":"starkware.cairo.common.cairo_secp.field.unreduced_mul","type":"alias"},"starkware.cairo.common.cairo_secp.ec.unreduced_sqr":{"destination":"starkware.cairo.common.cairo_secp.field.unreduced_sqr","type":"alias"},"starkware.cairo.common.cairo_secp.ec.verify_zero":{"destination":"starkware.cairo.common.cairo_secp.field.verify_zero","type":"alias"},"starkware.cairo.common.cairo_secp.field.BASE":{"destination":"starkware.cairo.common.cairo_secp.constants.BASE","type":"alias"},"starkware.cairo.common.cairo_secp.field.BigInt3":{"destination":"starkware.cairo.common.cairo_secp.bigint.BigInt3","type":"alias"},"starkware.cairo.common.cairo_secp.field.P0":{"destination":"starkware.cairo.common.cairo_secp.constants.P0","type":"alias"},"starkware.cairo.common.cairo_secp.field.P1":{"destination":"starkware.cairo.common.cairo_secp.constants.P1","type":"alias"},"starkware.cairo.common.cairo_secp.field.P2":{"destination":"starkware.cairo.common.cairo_secp.constants.P2","type":"alias"},"starkware.cairo.common.cairo_secp.field.SECP_REM":{"destination":"starkware.cairo.common.cairo_secp.constants.SECP_REM","type":"alias"},"starkware.cairo.common.cairo_secp.field.UnreducedBigInt3":{"destination":"starkware.cairo.common.cairo_secp.bigint.UnreducedBigInt3","type":"alias"},"starkware.cairo.common.cairo_secp.field.assert_nn_le":{"destination":"starkware.cairo.common.math.assert_nn_le","type":"alias"},"starkware.cairo.common.cairo_secp.field.nondet_bigint3":{"destination":"starkware.cairo.common.cairo_secp.bigint.nondet_bigint3","type":"alias"},"starkware.cairo.common.cairo_secp.signature.BASE":{"destination":"starkware.cairo.common.cairo_secp.bigint.BASE","type":"alias"},"starkware.cairo.common.cairo_secp.signature.BETA":{"destination":"starkware.cairo.common.cairo_secp.constants.BETA","type":"alias"},"starkware.cairo.common.cairo_secp.signature.BigInt3":{"destination":"starkware.cairo.common.cairo_secp.bigint.BigInt3","type":"alias"},"starkware.cairo.common.cairo_secp.signature.BitwiseBuiltin":{"destination":"starkware.cairo.common.cairo_builtins.BitwiseBuiltin","type":"alias"},"starkware.cairo.common.cairo_secp.signature.EcPoint":{"destination":"starkware.cairo.common.cairo_secp.ec.EcPoint","type":"alias"},"starkware.cairo.common.cairo_secp.signature.N0":{"destination":"starkware.cairo.common.cairo_secp.constants.N0","type":"alias"},"starkware.cairo.common.cairo_secp.signature.N1":{"destination":"starkware.cairo.common.cairo_secp.constants.N1","type":"alias"},"starkware.cairo.common.cairo_secp.signature.N2":{"destination":"starkware.cairo.common.cairo_secp.constants.N2","type":"alias"},"starkware.cairo.common.cairo_secp.signature.RC_BOUND":{"destination":"starkware.cairo.common.math_cmp.RC_BOUND","type":"alias"},"starkware.cairo.common.cairo_secp.signature.Uint256":{"destination":"starkware.cairo.common.uint256.Uint256","type":"alias"},"starkware.cairo.common.cairo_secp.signature.UnreducedBigInt3":{"destination":"starkware.cairo.common.cairo_secp.bigint.UnreducedBigInt3","type":"alias"},"starkware.cairo.common.cairo_secp.signature.alloc":{"destination":"starkware.cairo.common.alloc.alloc","type":"alias"},"starkware.cairo.common.cairo_secp.signature.assert_nn":{"destination":"starkware.cairo.common.math.assert_nn","type":"alias"},"starkware.cairo.common.cairo_secp.signature.assert_nn_le":{"destination":"starkware.cairo.common.math.assert_nn_le","type":"alias"},"starkware.cairo.common.cairo_secp.signature.assert_not_zero":{"destination":"starkware.cairo.common.math.assert_not_zero","type":"alias"},"starkware.cairo.common.cairo_secp.signature.bigint_mul":{"destination":"starkware.cairo.common.cairo_secp.bigint.bigint_mul","type":"alias"},"starkware.cairo.common.cairo_secp.signature.bigint_to_uint256":{"destination":"starkware.cairo.common.cairo_secp.bigint.bigint_to_uint256","type":"alias"},"starkware.cairo.common.cairo_secp.signature.ec_add":{"destination":"starkware.cairo.common.cairo_secp.ec.ec_add","type":"alias"},"starkware.cairo.common.cairo_secp.signature.ec_mul":{"destination":"starkware.cairo.common.cairo_secp.ec.ec_mul","type":"alias"},"starkware.cairo.common.cairo_secp.signature.ec_negate":{"destination":"starkware.cairo.common.cairo_secp.ec.ec_negate","type":"alias"},"starkware.cairo.common.cairo_secp.signature.finalize_keccak":{"destination":"starkware.cairo.common.cairo_keccak.keccak.finalize_keccak","type":"alias"},"starkware.cairo.common.cairo_secp.signature.keccak_uint256s_bigend":{"destination":"starkware.cairo.common.cairo_keccak.keccak.keccak_uint256s_bigend","type":"alias"},"starkware.cairo.common.cairo_secp.signature.nondet_bigint3":{"destination":"starkware.cairo.common.cairo_secp.bigint.nondet_bigint3","type":"alias"},"starkware.cairo.common.cairo_secp.signature.reduce":{"destination":"starkware.cairo.common.cairo_secp.field.reduce","type":"alias"},"starkware.cairo.common.cairo_secp.signature.uint256_to_bigint":{"destination":"starkware.cairo.common.cairo_secp.bigint.uint256_to_bigint","type":"alias"},"starkware.cairo.common.cairo_secp.signature.unreduced_mul":{"destination":"starkware.cairo.common.cairo_secp.field.unreduced_mul","type":"alias"},"starkware.cairo.common.cairo_secp.signature.unreduced_sqr":{"destination":"starkware.cairo.common.cairo_secp.field.unreduced_sqr","type":"alias"},"starkware.cairo.common.cairo_secp.signature.unsigned_div_rem":{"destination":"starkware.cairo.common.math.unsigned_div_rem","type":"alias"},"starkware.cairo.common.cairo_secp.signature.validate_reduced_field_element":{"destination":"starkware.cairo.common.cairo_secp.field.validate_reduced_field_element","type":"alias"},"starkware.cairo.common.cairo_secp.signature.verify_zero":{"destination":"starkware.cairo.common.cairo_secp.field.verify_zero","type":"alias"},"starkware.cairo.common.dict_access.DictAccess":{"full_name":"starkware.cairo.common.dict_access.DictAccess","members":{"key":{"cairo_type":"felt","offset":0},"new_value":{"cairo_type":"felt","offset":2},"prev_value":{"cairo_type":"felt","offset":1}},"size":3,"type":"struct"},"starkware.cairo.common.ec.EcOpBuiltin":{"destination":"starkware.cairo.common.cairo_builtins.EcOpBuiltin","type":"alias"},"starkware.cairo.common.ec.EcPoint":{"destination":"starkware.cairo.common.ec_point.EcPoint","type":"alias"},"starkware.cairo.common.ec.StarkCurve":{"type":"namespace"},"starkware.cairo.common.ec.StarkCurve.ALPHA":{"type":"const","value":1},"starkware.cairo.common.ec.StarkCurve.Args":{"full_name":"starkware.cairo.common.ec.StarkCurve.Args","members":{},"size":0,"type":"struct"},"starkware.cairo.common.ec.StarkCurve.BETA":{"type":"const","value":-476910135076337975234679399815567221425937815956490878998147463828055613816},"starkware.cairo.common.ec.StarkCurve.GEN_X":{"type":"const","value":874739451078007766457464989774322083649278607533249481151382481072868806602},"starkware.cairo.common.ec.StarkCurve.GEN_Y":{"type":"const","value":152666792071518830868575557812948353041420400780739481342941381225525861407},"starkware.cairo.common.ec.StarkCurve.ImplicitArgs":{"full_name":"starkware.cairo.common.ec.StarkCurve.ImplicitArgs","members":{},"size":0,"type":"struct"},"starkware.cairo.common.ec.StarkCurve.ORDER":{"type":"const","value":-96363463615509210819012598251359154898},"starkware.cairo.common.ec.StarkCurve.Return":{"cairo_type":"()","type":"type_definition"},"starkware.cairo.common.ec.StarkCurve.SIZEOF_LOCALS":{"type":"const","value":0},"starkware.cairo.common.ec.is_quad_residue":{"destination":"starkware.cairo.common.math.is_quad_residue","type":"alias"},"starkware.cairo.common.ec_point.EcPoint":{"full_name":"starkware.cairo.common.ec_point.EcPoint","members":{"x":{"cairo_type":"felt","offset":0},"y":{"cairo_type":"felt","offset":1}},"size":2,"type":"struct"},"starkware.cairo.common.hash.HashBuiltin":{"destination":"starkware.cairo.common.cairo_builtins.HashBuiltin","type":"alias"},"starkware.cairo.common.keccak_state.KeccakBuiltinState":{"full_name":"starkware.cairo.common.keccak_state.KeccakBuiltinState","members":{"s0":{"cairo_type":"felt","offset":0},"s1":{"cairo_type":"felt","offset":1},"s2":{"cairo_type":"felt","offset":2},"s3":{"cairo_type":"felt","offset":3},"s4":{"cairo_type":"felt","offset":4},"s5":{"cairo_type":"felt","offset":5},"s6":{"cairo_type":"felt","offset":6},"s7":{"cairo_type":"felt","offset":7}},"size":8,"type":"struct"},"starkware.cairo.common.math.FALSE":{"destination":"starkware.cairo.common.bool.FALSE","type":"alias"},"starkware.cairo.common.math.TRUE":{"destination":"starkware.cairo.common.bool.TRUE","type":"alias"},"starkware.cairo.common.math.assert_le_felt":{"decorators":["known_ap_change"],"pc":18,"type":"function"},"starkware.cairo.common.math.assert_le_felt.Args":{"full_name":"starkware.cairo.common.math.assert_le_felt.Args","members":{"a":{"cairo_type":"felt","offset":0},"b":{"cairo_type":"felt","offset":1}},"size":2,"type":"struct"},"starkware.cairo.common.math.assert_le_felt.ImplicitArgs":{"full_name":"starkware.cairo.common.math.assert_le_felt.ImplicitArgs","members":{"range_check_ptr":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"starkware.cairo.common.math.assert_le_felt.PRIME_OVER_2_HIGH":{"type":"const","value":5316911983139663648412552867652567041},"starkware.cairo.common.math.assert_le_felt.PRIME_OVER_3_HIGH":{"type":"const","value":3544607988759775765608368578435044694},"starkware.cairo.common.math.assert_le_felt.Return":{"cairo_type":"()","type":"type_definition"},"starkware.cairo.common.math.assert_le_felt.SIZEOF_LOCALS":{"type":"const","value":0},"starkware.cairo.common.math.assert_le_felt.a":{"cairo_type":"felt","full_name":"starkware.cairo.common.math.assert_le_felt.a","references":[{"ap_tracking_data":{"group":2,"offset":0},"pc":18,"value":"[cast(fp + (-4), felt*)]"}],"type":"reference"},"starkware.cairo.common.math.assert_le_felt.b":{"cairo_type":"felt","full_name":"starkware.cairo.common.math.assert_le_felt.b","references":[{"ap_tracking_data":{"group":2,"offset":0},"pc":18,"value":"[cast(fp + (-3), felt*)]"}],"type":"reference"},"starkware.cairo.common.math.assert_le_felt.range_check_ptr":{"cairo_type":"felt","full_name":"starkware.cairo.common.math.assert_le_felt.range_check_ptr","references":[{"ap_tracking_data":{"group":2,"offset":0},"pc":18,"value":"[cast(fp + (-5), felt*)]"},{"ap_tracking_data":{"group":2,"offset":8},"pc":28,"value":"cast([fp + (-5)] + 4, felt)"}],"type":"reference"},"starkware.cairo.common.math.assert_le_felt.skip_exclude_a":{"pc":42,"type":"label"},"starkware.cairo.common.math.assert_le_felt.skip_exclude_b_minus_a":{"pc":54,"type":"label"},"starkware.cairo.common.math.assert_lt_felt":{"decorators":["known_ap_change"],"pc":63,"type":"function"},"starkware.cairo.common.math.assert_lt_felt.Args":{"full_name":"starkware.cairo.common.math.assert_lt_felt.Args","members":{"a":{"cairo_type":"felt","offset":0},"b":{"cairo_type":"felt","offset":1}},"size":2,"type":"struct"},"starkware.cairo.common.math.assert_lt_felt.ImplicitArgs":{"full_name":"starkware.cairo.common.math.assert_lt_felt.ImplicitArgs","members":{"range_check_ptr":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"starkware.cairo.common.math.assert_lt_felt.Return":{"cairo_type":"()","type":"type_definition"},"starkware.cairo.common.math.assert_lt_felt.SIZEOF_LOCALS":{"type":"const","value":0},"starkware.cairo.common.math.assert_lt_felt.a":{"cairo_type":"felt","full_name":"starkware.cairo.common.math.assert_lt_felt.a","references":[{"ap_tracking_data":{"group":3,"offset":0},"pc":63,"value":"[cast(fp + (-4), felt*)]"}],"type":"reference"},"starkware.cairo.common.math.assert_lt_felt.b":{"cairo_type":"felt","full_name":"starkware.cairo.common.math.assert_lt_felt.b","references":[{"ap_tracking_data":{"group":3,"offset":0},"pc":63,"value":"[cast(fp + (-3), felt*)]"}],"type":"reference"},"starkware.cairo.common.math_cmp.RC_BOUND":{"type":"const","value":340282366920938463463374607431768211456},"starkware.cairo.common.math_cmp.assert_le_felt":{"destination":"starkware.cairo.common.math.assert_le_felt","type":"alias"},"starkware.cairo.common.math_cmp.assert_lt_felt":{"destination":"starkware.cairo.common.math.assert_lt_felt","type":"alias"},"starkware.cairo.common.math_cmp.is_le_felt":{"decorators":["known_ap_change"],"pc":128,"type":"function"},"starkware.cairo.common.math_cmp.is_le_felt.Args":{"full_name":"starkware.cairo.common.math_cmp.is_le_felt.Args","members":{"a":{"cairo_type":"felt","offset":0},"b":{"cairo_type":"felt","offset":1}},"size":2,"type":"struct"},"starkware.cairo.common.math_cmp.is_le_felt.ImplicitArgs":{"full_name":"starkware.cairo.common.math_cmp.is_le_felt.ImplicitArgs","members":{"range_check_ptr":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"starkware.cairo.common.math_cmp.is_le_felt.Return":{"cairo_type":"felt","type":"type_definition"},"starkware.cairo.common.math_cmp.is_le_felt.SIZEOF_LOCALS":{"type":"const","value":0},"starkware.cairo.common.math_cmp.is_le_felt.a":{"cairo_type":"felt","full_name":"starkware.cairo.common.math_cmp.is_le_felt.a","references":[{"ap_tracking_data":{"group":11,"offset":0},"pc":128,"value":"[cast(fp + (-4), felt*)]"}],"type":"reference"},"starkware.cairo.common.math_cmp.is_le_felt.b":{"cairo_type":"felt","full_name":"starkware.cairo.common.math_cmp.is_le_felt.b","references":[{"ap_tracking_data":{"group":11,"offset":0},"pc":128,"value":"[cast(fp + (-3), felt*)]"}],"type":"reference"},"starkware.cairo.common.math_cmp.is_le_felt.not_le":{"pc":140,"type":"label"},"starkware.cairo.common.memcpy.memcpy":{"decorators":[],"pc":3,"type":"function"},"starkware.cairo.common.memcpy.memcpy.Args":{"full_name":"starkware.cairo.common.memcpy.memcpy.Args","members":{"dst":{"cairo_type":"felt*","offset":0},"len":{"cairo_type":"felt","offset":2},"src":{"cairo_type":"felt*","offset":1}},"size":3,"type":"struct"},"starkware.cairo.common.memcpy.memcpy.ImplicitArgs":{"full_name":"starkware.cairo.common.memcpy.memcpy.ImplicitArgs","members":{},"size":0,"type":"struct"},"starkware.cairo.common.memcpy.memcpy.LoopFrame":{"full_name":"starkware.cairo.common.memcpy.memcpy.LoopFrame","members":{"dst":{"cairo_type":"felt*","offset":0},"src":{"cairo_type":"felt*","offset":1}},"size":2,"type":"struct"},"starkware.cairo.common.memcpy.memcpy.Return":{"cairo_type":"()","type":"type_definition"},"starkware.cairo.common.memcpy.memcpy.SIZEOF_LOCALS":{"type":"const","value":0},"starkware.cairo.common.memcpy.memcpy.continue_copying":{"cairo_type":"felt","full_name":"starkware.cairo.common.memcpy.memcpy.continue_copying","references":[{"ap_tracking_data":{"group":1,"offset":3},"pc":10,"value":"[cast(ap, felt*)]"}],"type":"reference"},"starkware.cairo.common.memcpy.memcpy.len":{"cairo_type":"felt","full_name":"starkware.cairo.common.memcpy.memcpy.len","references":[{"ap_tracking_data":{"group":1,"offset":0},"pc":3,"value":"[cast(fp + (-3), felt*)]"}],"type":"reference"},"starkware.cairo.common.memcpy.memcpy.loop":{"pc":8,"type":"label"},"starkware.cairo.common.pow.assert_le":{"destination":"starkware.cairo.common.math.assert_le","type":"alias"},"starkware.cairo.common.pow.get_ap":{"destination":"starkware.cairo.common.registers.get_ap","type":"alias"},"starkware.cairo.common.pow.get_fp_and_pc":{"destination":"starkware.cairo.common.registers.get_fp_and_pc","type":"alias"},"starkware.cairo.common.registers.get_ap":{"destination":"starkware.cairo.lang.compiler.lib.registers.get_ap","type":"alias"},"starkware.cairo.common.registers.get_fp_and_pc":{"destination":"starkware.cairo.lang.compiler.lib.registers.get_fp_and_pc","type":"alias"},"starkware.cairo.common.signature.EcOpBuiltin":{"destination":"starkware.cairo.common.cairo_builtins.EcOpBuiltin","type":"alias"},"starkware.cairo.common.signature.EcPoint":{"destination":"starkware.cairo.common.ec_point.EcPoint","type":"alias"},"starkware.cairo.common.signature.FALSE":{"destination":"starkware.cairo.common.bool.FALSE","type":"alias"},"starkware.cairo.common.signature.SignatureBuiltin":{"destination":"starkware.cairo.common.cairo_builtins.SignatureBuiltin","type":"alias"},"starkware.cairo.common.signature.StarkCurve":{"destination":"starkware.cairo.common.ec.StarkCurve","type":"alias"},"starkware.cairo.common.signature.TRUE":{"destination":"starkware.cairo.common.bool.TRUE","type":"alias"},"starkware.cairo.common.signature.ec_add":{"destination":"starkware.cairo.common.ec.ec_add","type":"alias"},"starkware.cairo.common.signature.ec_mul":{"destination":"starkware.cairo.common.ec.ec_mul","type":"alias"},"starkware.cairo.common.signature.ec_sub":{"destination":"starkware.cairo.common.ec.ec_sub","type":"alias"},"starkware.cairo.common.signature.is_x_on_curve":{"destination":"starkware.cairo.common.ec.is_x_on_curve","type":"alias"},"starkware.cairo.common.signature.recover_y":{"destination":"starkware.cairo.common.ec.recover_y","type":"alias"},"starkware.cairo.common.signature.verify_ecdsa_signature":{"decorators":[],"pc":123,"type":"function"},"starkware.cairo.common.signature.verify_ecdsa_signature.Args":{"full_name":"starkware.cairo.common.signature.verify_ecdsa_signature.Args","members":{"message":{"cairo_type":"felt","offset":0},"public_key":{"cairo_type":"felt","offset":1},"signature_r":{"cairo_type":"felt","offset":2},"signature_s":{"cairo_type":"felt","offset":3}},"size":4,"type":"struct"},"starkware.cairo.common.signature.verify_ecdsa_signature.ImplicitArgs":{"full_name":"starkware.cairo.common.signature.verify_ecdsa_signature.ImplicitArgs","members":{"ecdsa_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.SignatureBuiltin*","offset":0}},"size":1,"type":"struct"},"starkware.cairo.common.signature.verify_ecdsa_signature.Return":{"cairo_type":"()","type":"type_definition"},"starkware.cairo.common.signature.verify_ecdsa_signature.SIZEOF_LOCALS":{"type":"const","value":0},"starkware.cairo.common.signature.verify_ecdsa_signature.ecdsa_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.SignatureBuiltin*","full_name":"starkware.cairo.common.signature.verify_ecdsa_signature.ecdsa_ptr","references":[{"ap_tracking_data":{"group":10,"offset":0},"pc":123,"value":"[cast(fp + (-7), starkware.cairo.common.cairo_builtins.SignatureBuiltin**)]"},{"ap_tracking_data":{"group":10,"offset":0},"pc":125,"value":"cast([fp + (-7)] + 2, starkware.cairo.common.cairo_builtins.SignatureBuiltin*)"}],"type":"reference"},"starkware.cairo.common.signature.verify_ecdsa_signature.signature_r":{"cairo_type":"felt","full_name":"starkware.cairo.common.signature.verify_ecdsa_signature.signature_r","references":[{"ap_tracking_data":{"group":10,"offset":0},"pc":123,"value":"[cast(fp + (-4), felt*)]"}],"type":"reference"},"starkware.cairo.common.signature.verify_ecdsa_signature.signature_s":{"cairo_type":"felt","full_name":"starkware.cairo.common.signature.verify_ecdsa_signature.signature_s","references":[{"ap_tracking_data":{"group":10,"offset":0},"pc":123,"value":"[cast(fp + (-3), felt*)]"}],"type":"reference"},"starkware.cairo.common.uint256.ALL_ONES":{"type":"const","value":340282366920938463463374607431768211455},"starkware.cairo.common.uint256.BitwiseBuiltin":{"destination":"starkware.cairo.common.cairo_builtins.BitwiseBuiltin","type":"alias"},"starkware.cairo.common.uint256.HALF_SHIFT":{"type":"const","value":18446744073709551616},"starkware.cairo.common.uint256.SHIFT":{"type":"const","value":340282366920938463463374607431768211456},"starkware.cairo.common.uint256.Uint256":{"full_name":"starkware.cairo.common.uint256.Uint256","members":{"high":{"cairo_type":"felt","offset":1},"low":{"cairo_type":"felt","offset":0}},"size":2,"type":"struct"},"starkware.cairo.common.uint256.assert_in_range":{"destination":"starkware.cairo.common.math.assert_in_range","type":"alias"},"starkware.cairo.common.uint256.assert_le":{"destination":"starkware.cairo.common.math.assert_le","type":"alias"},"starkware.cairo.common.uint256.assert_nn_le":{"destination":"starkware.cairo.common.math.assert_nn_le","type":"alias"},"starkware.cairo.common.uint256.assert_not_zero":{"destination":"starkware.cairo.common.math.assert_not_zero","type":"alias"},"starkware.cairo.common.uint256.bitwise_and":{"destination":"starkware.cairo.common.bitwise.bitwise_and","type":"alias"},"starkware.cairo.common.uint256.bitwise_or":{"destination":"starkware.cairo.common.bitwise.bitwise_or","type":"alias"},"starkware.cairo.common.uint256.bitwise_xor":{"destination":"starkware.cairo.common.bitwise.bitwise_xor","type":"alias"},"starkware.cairo.common.uint256.get_ap":{"destination":"starkware.cairo.common.registers.get_ap","type":"alias"},"starkware.cairo.common.uint256.get_fp_and_pc":{"destination":"starkware.cairo.common.registers.get_fp_and_pc","type":"alias"},"starkware.cairo.common.uint256.is_le":{"destination":"starkware.cairo.common.math_cmp.is_le","type":"alias"},"starkware.cairo.common.uint256.pow":{"destination":"starkware.cairo.common.pow.pow","type":"alias"},"starkware.starknet.common.storage.ADDR_BOUND":{"type":"const","value":-106710729501573572985208420194530329073740042555888586719489},"starkware.starknet.common.storage.MAX_STORAGE_ITEM_SIZE":{"type":"const","value":256},"starkware.starknet.common.storage.assert_250_bit":{"destination":"starkware.cairo.common.math.assert_250_bit","type":"alias"},"starkware.starknet.common.syscalls.CALL_CONTRACT_SELECTOR":{"type":"const","value":20853273475220472486191784820},"starkware.starknet.common.syscalls.CallContract":{"full_name":"starkware.starknet.common.syscalls.CallContract","members":{"request":{"cairo_type":"starkware.starknet.common.syscalls.CallContractRequest","offset":0},"response":{"cairo_type":"starkware.starknet.common.syscalls.CallContractResponse","offset":5}},"size":7,"type":"struct"},"starkware.starknet.common.syscalls.CallContractRequest":{"full_name":"starkware.starknet.common.syscalls.CallContractRequest","members":{"calldata":{"cairo_type":"felt*","offset":4},"calldata_size":{"cairo_type":"felt","offset":3},"contract_address":{"cairo_type":"felt","offset":1},"function_selector":{"cairo_type":"felt","offset":2},"selector":{"cairo_type":"felt","offset":0}},"size":5,"type":"struct"},"starkware.starknet.common.syscalls.CallContractResponse":{"full_name":"starkware.starknet.common.syscalls.CallContractResponse","members":{"retdata":{"cairo_type":"felt*","offset":1},"retdata_size":{"cairo_type":"felt","offset":0}},"size":2,"type":"struct"},"starkware.starknet.common.syscalls.DELEGATE_CALL_SELECTOR":{"type":"const","value":21167594061783206823196716140},"starkware.starknet.common.syscalls.DELEGATE_L1_HANDLER_SELECTOR":{"type":"const","value":23274015802972845247556842986379118667122},"starkware.starknet.common.syscalls.DEPLOY_SELECTOR":{"type":"const","value":75202468540281},"starkware.starknet.common.syscalls.Deploy":{"full_name":"starkware.starknet.common.syscalls.Deploy","members":{"request":{"cairo_type":"starkware.starknet.common.syscalls.DeployRequest","offset":0},"response":{"cairo_type":"starkware.starknet.common.syscalls.DeployResponse","offset":6}},"size":9,"type":"struct"},"starkware.starknet.common.syscalls.DeployRequest":{"full_name":"starkware.starknet.common.syscalls.DeployRequest","members":{"class_hash":{"cairo_type":"felt","offset":1},"constructor_calldata":{"cairo_type":"felt*","offset":4},"constructor_calldata_size":{"cairo_type":"felt","offset":3},"contract_address_salt":{"cairo_type":"felt","offset":2},"deploy_from_zero":{"cairo_type":"felt","offset":5},"selector":{"cairo_type":"felt","offset":0}},"size":6,"type":"struct"},"starkware.starknet.common.syscalls.DeployResponse":{"full_name":"starkware.starknet.common.syscalls.DeployResponse","members":{"constructor_retdata":{"cairo_type":"felt*","offset":2},"constructor_retdata_size":{"cairo_type":"felt","offset":1},"contract_address":{"cairo_type":"felt","offset":0}},"size":3,"type":"struct"},"starkware.starknet.common.syscalls.DictAccess":{"destination":"starkware.cairo.common.dict_access.DictAccess","type":"alias"},"starkware.starknet.common.syscalls.EMIT_EVENT_SELECTOR":{"type":"const","value":1280709301550335749748},"starkware.starknet.common.syscalls.EmitEvent":{"full_name":"starkware.starknet.common.syscalls.EmitEvent","members":{"data":{"cairo_type":"felt*","offset":4},"data_len":{"cairo_type":"felt","offset":3},"keys":{"cairo_type":"felt*","offset":2},"keys_len":{"cairo_type":"felt","offset":1},"selector":{"cairo_type":"felt","offset":0}},"size":5,"type":"struct"},"starkware.starknet.common.syscalls.GET_BLOCK_NUMBER_SELECTOR":{"type":"const","value":1448089106835523001438702345020786},"starkware.starknet.common.syscalls.GET_BLOCK_TIMESTAMP_SELECTOR":{"type":"const","value":24294903732626645868215235778792757751152},"starkware.starknet.common.syscalls.GET_CALLER_ADDRESS_SELECTOR":{"type":"const","value":94901967781393078444254803017658102643},"starkware.starknet.common.syscalls.GET_CONTRACT_ADDRESS_SELECTOR":{"type":"const","value":6219495360805491471215297013070624192820083},"starkware.starknet.common.syscalls.GET_SEQUENCER_ADDRESS_SELECTOR":{"type":"const","value":1592190833581991703053805829594610833820054387},"starkware.starknet.common.syscalls.GET_TX_INFO_SELECTOR":{"type":"const","value":1317029390204112103023},"starkware.starknet.common.syscalls.GET_TX_SIGNATURE_SELECTOR":{"type":"const","value":1448089128652340074717162277007973},"starkware.starknet.common.syscalls.GetBlockNumber":{"full_name":"starkware.starknet.common.syscalls.GetBlockNumber","members":{"request":{"cairo_type":"starkware.starknet.common.syscalls.GetBlockNumberRequest","offset":0},"response":{"cairo_type":"starkware.starknet.common.syscalls.GetBlockNumberResponse","offset":1}},"size":2,"type":"struct"},"starkware.starknet.common.syscalls.GetBlockNumberRequest":{"full_name":"starkware.starknet.common.syscalls.GetBlockNumberRequest","members":{"selector":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"starkware.starknet.common.syscalls.GetBlockNumberResponse":{"full_name":"starkware.starknet.common.syscalls.GetBlockNumberResponse","members":{"block_number":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"starkware.starknet.common.syscalls.GetBlockTimestamp":{"full_name":"starkware.starknet.common.syscalls.GetBlockTimestamp","members":{"request":{"cairo_type":"starkware.starknet.common.syscalls.GetBlockTimestampRequest","offset":0},"response":{"cairo_type":"starkware.starknet.common.syscalls.GetBlockTimestampResponse","offset":1}},"size":2,"type":"struct"},"starkware.starknet.common.syscalls.GetBlockTimestampRequest":{"full_name":"starkware.starknet.common.syscalls.GetBlockTimestampRequest","members":{"selector":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"starkware.starknet.common.syscalls.GetBlockTimestampResponse":{"full_name":"starkware.starknet.common.syscalls.GetBlockTimestampResponse","members":{"block_timestamp":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"starkware.starknet.common.syscalls.GetCallerAddress":{"full_name":"starkware.starknet.common.syscalls.GetCallerAddress","members":{"request":{"cairo_type":"starkware.starknet.common.syscalls.GetCallerAddressRequest","offset":0},"response":{"cairo_type":"starkware.starknet.common.syscalls.GetCallerAddressResponse","offset":1}},"size":2,"type":"struct"},"starkware.starknet.common.syscalls.GetCallerAddressRequest":{"full_name":"starkware.starknet.common.syscalls.GetCallerAddressRequest","members":{"selector":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"starkware.starknet.common.syscalls.GetCallerAddressResponse":{"full_name":"starkware.starknet.common.syscalls.GetCallerAddressResponse","members":{"caller_address":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"starkware.starknet.common.syscalls.GetContractAddress":{"full_name":"starkware.starknet.common.syscalls.GetContractAddress","members":{"request":{"cairo_type":"starkware.starknet.common.syscalls.GetContractAddressRequest","offset":0},"response":{"cairo_type":"starkware.starknet.common.syscalls.GetContractAddressResponse","offset":1}},"size":2,"type":"struct"},"starkware.starknet.common.syscalls.GetContractAddressRequest":{"full_name":"starkware.starknet.common.syscalls.GetContractAddressRequest","members":{"selector":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"starkware.starknet.common.syscalls.GetContractAddressResponse":{"full_name":"starkware.starknet.common.syscalls.GetContractAddressResponse","members":{"contract_address":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"starkware.starknet.common.syscalls.GetSequencerAddress":{"full_name":"starkware.starknet.common.syscalls.GetSequencerAddress","members":{"request":{"cairo_type":"starkware.starknet.common.syscalls.GetSequencerAddressRequest","offset":0},"response":{"cairo_type":"starkware.starknet.common.syscalls.GetSequencerAddressResponse","offset":1}},"size":2,"type":"struct"},"starkware.starknet.common.syscalls.GetSequencerAddressRequest":{"full_name":"starkware.starknet.common.syscalls.GetSequencerAddressRequest","members":{"selector":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"starkware.starknet.common.syscalls.GetSequencerAddressResponse":{"full_name":"starkware.starknet.common.syscalls.GetSequencerAddressResponse","members":{"sequencer_address":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"starkware.starknet.common.syscalls.GetTxInfo":{"full_name":"starkware.starknet.common.syscalls.GetTxInfo","members":{"request":{"cairo_type":"starkware.starknet.common.syscalls.GetTxInfoRequest","offset":0},"response":{"cairo_type":"starkware.starknet.common.syscalls.GetTxInfoResponse","offset":1}},"size":2,"type":"struct"},"starkware.starknet.common.syscalls.GetTxInfoRequest":{"full_name":"starkware.starknet.common.syscalls.GetTxInfoRequest","members":{"selector":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"starkware.starknet.common.syscalls.GetTxInfoResponse":{"full_name":"starkware.starknet.common.syscalls.GetTxInfoResponse","members":{"tx_info":{"cairo_type":"starkware.starknet.common.syscalls.TxInfo*","offset":0}},"size":1,"type":"struct"},"starkware.starknet.common.syscalls.GetTxSignature":{"full_name":"starkware.starknet.common.syscalls.GetTxSignature","members":{"request":{"cairo_type":"starkware.starknet.common.syscalls.GetTxSignatureRequest","offset":0},"response":{"cairo_type":"starkware.starknet.common.syscalls.GetTxSignatureResponse","offset":1}},"size":3,"type":"struct"},"starkware.starknet.common.syscalls.GetTxSignatureRequest":{"full_name":"starkware.starknet.common.syscalls.GetTxSignatureRequest","members":{"selector":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"starkware.starknet.common.syscalls.GetTxSignatureResponse":{"full_name":"starkware.starknet.common.syscalls.GetTxSignatureResponse","members":{"signature":{"cairo_type":"felt*","offset":1},"signature_len":{"cairo_type":"felt","offset":0}},"size":2,"type":"struct"},"starkware.starknet.common.syscalls.LIBRARY_CALL_L1_HANDLER_SELECTOR":{"type":"const","value":436233452754198157705746250789557519228244616562},"starkware.starknet.common.syscalls.LIBRARY_CALL_SELECTOR":{"type":"const","value":92376026794327011772951660},"starkware.starknet.common.syscalls.LibraryCall":{"full_name":"starkware.starknet.common.syscalls.LibraryCall","members":{"request":{"cairo_type":"starkware.starknet.common.syscalls.LibraryCallRequest","offset":0},"response":{"cairo_type":"starkware.starknet.common.syscalls.CallContractResponse","offset":5}},"size":7,"type":"struct"},"starkware.starknet.common.syscalls.LibraryCallRequest":{"full_name":"starkware.starknet.common.syscalls.LibraryCallRequest","members":{"calldata":{"cairo_type":"felt*","offset":4},"calldata_size":{"cairo_type":"felt","offset":3},"class_hash":{"cairo_type":"felt","offset":1},"function_selector":{"cairo_type":"felt","offset":2},"selector":{"cairo_type":"felt","offset":0}},"size":5,"type":"struct"},"starkware.starknet.common.syscalls.SEND_MESSAGE_TO_L1_SELECTOR":{"type":"const","value":433017908768303439907196859243777073},"starkware.starknet.common.syscalls.STORAGE_READ_SELECTOR":{"type":"const","value":100890693370601760042082660},"starkware.starknet.common.syscalls.STORAGE_WRITE_SELECTOR":{"type":"const","value":25828017502874050592466629733},"starkware.starknet.common.syscalls.SendMessageToL1SysCall":{"full_name":"starkware.starknet.common.syscalls.SendMessageToL1SysCall","members":{"payload_ptr":{"cairo_type":"felt*","offset":3},"payload_size":{"cairo_type":"felt","offset":2},"selector":{"cairo_type":"felt","offset":0},"to_address":{"cairo_type":"felt","offset":1}},"size":4,"type":"struct"},"starkware.starknet.common.syscalls.StorageRead":{"full_name":"starkware.starknet.common.syscalls.StorageRead","members":{"request":{"cairo_type":"starkware.starknet.common.syscalls.StorageReadRequest","offset":0},"response":{"cairo_type":"starkware.starknet.common.syscalls.StorageReadResponse","offset":2}},"size":3,"type":"struct"},"starkware.starknet.common.syscalls.StorageReadRequest":{"full_name":"starkware.starknet.common.syscalls.StorageReadRequest","members":{"address":{"cairo_type":"felt","offset":1},"selector":{"cairo_type":"felt","offset":0}},"size":2,"type":"struct"},"starkware.starknet.common.syscalls.StorageReadResponse":{"full_name":"starkware.starknet.common.syscalls.StorageReadResponse","members":{"value":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"starkware.starknet.common.syscalls.StorageWrite":{"full_name":"starkware.starknet.common.syscalls.StorageWrite","members":{"address":{"cairo_type":"felt","offset":1},"selector":{"cairo_type":"felt","offset":0},"value":{"cairo_type":"felt","offset":2}},"size":3,"type":"struct"},"starkware.starknet.common.syscalls.TxInfo":{"full_name":"starkware.starknet.common.syscalls.TxInfo","members":{"account_contract_address":{"cairo_type":"felt","offset":1},"chain_id":{"cairo_type":"felt","offset":6},"max_fee":{"cairo_type":"felt","offset":2},"nonce":{"cairo_type":"felt","offset":7},"signature":{"cairo_type":"felt*","offset":4},"signature_len":{"cairo_type":"felt","offset":3},"transaction_hash":{"cairo_type":"felt","offset":5},"version":{"cairo_type":"felt","offset":0}},"size":8,"type":"struct"},"starkware.starknet.common.syscalls.call_contract":{"decorators":[],"pc":74,"type":"function"},"starkware.starknet.common.syscalls.call_contract.Args":{"full_name":"starkware.starknet.common.syscalls.call_contract.Args","members":{"calldata":{"cairo_type":"felt*","offset":3},"calldata_size":{"cairo_type":"felt","offset":2},"contract_address":{"cairo_type":"felt","offset":0},"function_selector":{"cairo_type":"felt","offset":1}},"size":4,"type":"struct"},"starkware.starknet.common.syscalls.call_contract.ImplicitArgs":{"full_name":"starkware.starknet.common.syscalls.call_contract.ImplicitArgs","members":{"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":1,"type":"struct"},"starkware.starknet.common.syscalls.call_contract.Return":{"cairo_type":"(retdata_size: felt, retdata: felt*)","type":"type_definition"},"starkware.starknet.common.syscalls.call_contract.SIZEOF_LOCALS":{"type":"const","value":0},"starkware.starknet.common.syscalls.call_contract.syscall_ptr":{"cairo_type":"felt*","full_name":"starkware.starknet.common.syscalls.call_contract.syscall_ptr","references":[{"ap_tracking_data":{"group":4,"offset":0},"pc":74,"value":"[cast(fp + (-7), felt**)]"},{"ap_tracking_data":{"group":4,"offset":1},"pc":81,"value":"cast([fp + (-7)] + 7, felt*)"}],"type":"reference"},"starkware.starknet.common.syscalls.get_caller_address":{"decorators":[],"pc":86,"type":"function"},"starkware.starknet.common.syscalls.get_caller_address.Args":{"full_name":"starkware.starknet.common.syscalls.get_caller_address.Args","members":{},"size":0,"type":"struct"},"starkware.starknet.common.syscalls.get_caller_address.ImplicitArgs":{"full_name":"starkware.starknet.common.syscalls.get_caller_address.ImplicitArgs","members":{"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":1,"type":"struct"},"starkware.starknet.common.syscalls.get_caller_address.Return":{"cairo_type":"(caller_address: felt)","type":"type_definition"},"starkware.starknet.common.syscalls.get_caller_address.SIZEOF_LOCALS":{"type":"const","value":0},"starkware.starknet.common.syscalls.get_caller_address.syscall_ptr":{"cairo_type":"felt*","full_name":"starkware.starknet.common.syscalls.get_caller_address.syscall_ptr","references":[{"ap_tracking_data":{"group":5,"offset":0},"pc":86,"value":"[cast(fp + (-3), felt**)]"},{"ap_tracking_data":{"group":5,"offset":1},"pc":89,"value":"cast([fp + (-3)] + 2, felt*)"}],"type":"reference"},"starkware.starknet.common.syscalls.get_contract_address":{"decorators":[],"pc":93,"type":"function"},"starkware.starknet.common.syscalls.get_contract_address.Args":{"full_name":"starkware.starknet.common.syscalls.get_contract_address.Args","members":{},"size":0,"type":"struct"},"starkware.starknet.common.syscalls.get_contract_address.ImplicitArgs":{"full_name":"starkware.starknet.common.syscalls.get_contract_address.ImplicitArgs","members":{"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":1,"type":"struct"},"starkware.starknet.common.syscalls.get_contract_address.Return":{"cairo_type":"(contract_address: felt)","type":"type_definition"},"starkware.starknet.common.syscalls.get_contract_address.SIZEOF_LOCALS":{"type":"const","value":0},"starkware.starknet.common.syscalls.get_contract_address.syscall_ptr":{"cairo_type":"felt*","full_name":"starkware.starknet.common.syscalls.get_contract_address.syscall_ptr","references":[{"ap_tracking_data":{"group":6,"offset":0},"pc":93,"value":"[cast(fp + (-3), felt**)]"},{"ap_tracking_data":{"group":6,"offset":1},"pc":96,"value":"cast([fp + (-3)] + 2, felt*)"}],"type":"reference"},"starkware.starknet.common.syscalls.get_tx_info":{"decorators":[],"pc":116,"type":"function"},"starkware.starknet.common.syscalls.get_tx_info.Args":{"full_name":"starkware.starknet.common.syscalls.get_tx_info.Args","members":{},"size":0,"type":"struct"},"starkware.starknet.common.syscalls.get_tx_info.ImplicitArgs":{"full_name":"starkware.starknet.common.syscalls.get_tx_info.ImplicitArgs","members":{"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":1,"type":"struct"},"starkware.starknet.common.syscalls.get_tx_info.Return":{"cairo_type":"(tx_info: starkware.starknet.common.syscalls.TxInfo*)","type":"type_definition"},"starkware.starknet.common.syscalls.get_tx_info.SIZEOF_LOCALS":{"type":"const","value":0},"starkware.starknet.common.syscalls.get_tx_info.syscall_ptr":{"cairo_type":"felt*","full_name":"starkware.starknet.common.syscalls.get_tx_info.syscall_ptr","references":[{"ap_tracking_data":{"group":9,"offset":0},"pc":116,"value":"[cast(fp + (-3), felt**)]"},{"ap_tracking_data":{"group":9,"offset":1},"pc":119,"value":"cast([fp + (-3)] + 2, felt*)"}],"type":"reference"},"starkware.starknet.common.syscalls.storage_read":{"decorators":[],"pc":100,"type":"function"},"starkware.starknet.common.syscalls.storage_read.Args":{"full_name":"starkware.starknet.common.syscalls.storage_read.Args","members":{"address":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"starkware.starknet.common.syscalls.storage_read.ImplicitArgs":{"full_name":"starkware.starknet.common.syscalls.storage_read.ImplicitArgs","members":{"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":1,"type":"struct"},"starkware.starknet.common.syscalls.storage_read.Return":{"cairo_type":"(value: felt)","type":"type_definition"},"starkware.starknet.common.syscalls.storage_read.SIZEOF_LOCALS":{"type":"const","value":0},"starkware.starknet.common.syscalls.storage_read.syscall_ptr":{"cairo_type":"felt*","full_name":"starkware.starknet.common.syscalls.storage_read.syscall_ptr","references":[{"ap_tracking_data":{"group":7,"offset":0},"pc":100,"value":"[cast(fp + (-4), felt**)]"},{"ap_tracking_data":{"group":7,"offset":1},"pc":104,"value":"cast([fp + (-4)] + 3, felt*)"}],"type":"reference"},"starkware.starknet.common.syscalls.storage_write":{"decorators":[],"pc":108,"type":"function"},"starkware.starknet.common.syscalls.storage_write.Args":{"full_name":"starkware.starknet.common.syscalls.storage_write.Args","members":{"address":{"cairo_type":"felt","offset":0},"value":{"cairo_type":"felt","offset":1}},"size":2,"type":"struct"},"starkware.starknet.common.syscalls.storage_write.ImplicitArgs":{"full_name":"starkware.starknet.common.syscalls.storage_write.ImplicitArgs","members":{"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":1,"type":"struct"},"starkware.starknet.common.syscalls.storage_write.Return":{"cairo_type":"()","type":"type_definition"},"starkware.starknet.common.syscalls.storage_write.SIZEOF_LOCALS":{"type":"const","value":0},"starkware.starknet.common.syscalls.storage_write.syscall_ptr":{"cairo_type":"felt*","full_name":"starkware.starknet.common.syscalls.storage_write.syscall_ptr","references":[{"ap_tracking_data":{"group":8,"offset":0},"pc":108,"value":"[cast(fp + (-5), felt**)]"},{"ap_tracking_data":{"group":8,"offset":1},"pc":113,"value":"cast([fp + (-5)] + 3, felt*)"}],"type":"reference"}},"main_scope":"__main__","prime":"0x800000000000011000000000000000000000000000000000000000000000001","reference_manager":{"references":[{"ap_tracking_data":{"group":1,"offset":0},"pc":3,"value":"[cast(fp + (-3), felt*)]"},{"ap_tracking_data":{"group":1,"offset":3},"pc":10,"value":"[cast(ap, felt*)]"},{"ap_tracking_data":{"group":2,"offset":0},"pc":18,"value":"[cast(fp + (-4), felt*)]"},{"ap_tracking_data":{"group":2,"offset":0},"pc":18,"value":"[cast(fp + (-3), felt*)]"},{"ap_tracking_data":{"group":2,"offset":0},"pc":18,"value":"[cast(fp + (-5), felt*)]"},{"ap_tracking_data":{"group":3,"offset":0},"pc":63,"value":"[cast(fp + (-4), felt*)]"},{"ap_tracking_data":{"group":3,"offset":0},"pc":63,"value":"[cast(fp + (-3), felt*)]"},{"ap_tracking_data":{"group":4,"offset":0},"pc":74,"value":"[cast(fp + (-7), felt**)]"},{"ap_tracking_data":{"group":5,"offset":0},"pc":86,"value":"[cast(fp + (-3), felt**)]"},{"ap_tracking_data":{"group":6,"offset":0},"pc":93,"value":"[cast(fp + (-3), felt**)]"},{"ap_tracking_data":{"group":7,"offset":0},"pc":100,"value":"[cast(fp + (-4), felt**)]"},{"ap_tracking_data":{"group":8,"offset":0},"pc":108,"value":"[cast(fp + (-5), felt**)]"},{"ap_tracking_data":{"group":9,"offset":0},"pc":116,"value":"[cast(fp + (-3), felt**)]"},{"ap_tracking_data":{"group":10,"offset":0},"pc":123,"value":"[cast(fp + (-4), felt*)]"},{"ap_tracking_data":{"group":10,"offset":0},"pc":123,"value":"[cast(fp + (-3), felt*)]"},{"ap_tracking_data":{"group":10,"offset":0},"pc":123,"value":"[cast(fp + (-7), starkware.cairo.common.cairo_builtins.SignatureBuiltin**)]"},{"ap_tracking_data":{"group":11,"offset":0},"pc":128,"value":"[cast(fp + (-4), felt*)]"},{"ap_tracking_data":{"group":11,"offset":0},"pc":128,"value":"[cast(fp + (-3), felt*)]"}]}}} ================================================ FILE: contract-artifacts/OpenZeppelinAccount/0.5.1/Account.cairo/Account_abi.json ================================================ [{"members":[{"name":"to","offset":0,"type":"felt"},{"name":"selector","offset":1,"type":"felt"},{"name":"data_offset","offset":2,"type":"felt"},{"name":"data_len","offset":3,"type":"felt"}],"name":"AccountCallArray","size":4,"type":"struct"},{"inputs":[{"name":"publicKey","type":"felt"}],"name":"constructor","outputs":[],"type":"constructor"},{"inputs":[],"name":"getPublicKey","outputs":[{"name":"publicKey","type":"felt"}],"stateMutability":"view","type":"function"},{"inputs":[{"name":"interfaceId","type":"felt"}],"name":"supportsInterface","outputs":[{"name":"success","type":"felt"}],"stateMutability":"view","type":"function"},{"inputs":[{"name":"newPublicKey","type":"felt"}],"name":"setPublicKey","outputs":[],"type":"function"},{"inputs":[{"name":"hash","type":"felt"},{"name":"signature_len","type":"felt"},{"name":"signature","type":"felt*"}],"name":"isValidSignature","outputs":[{"name":"isValid","type":"felt"}],"stateMutability":"view","type":"function"},{"inputs":[{"name":"call_array_len","type":"felt"},{"name":"call_array","type":"AccountCallArray*"},{"name":"calldata_len","type":"felt"},{"name":"calldata","type":"felt*"}],"name":"__validate__","outputs":[],"type":"function"},{"inputs":[{"name":"class_hash","type":"felt"}],"name":"__validate_declare__","outputs":[],"type":"function"},{"inputs":[{"name":"class_hash","type":"felt"},{"name":"salt","type":"felt"},{"name":"publicKey","type":"felt"}],"name":"__validate_deploy__","outputs":[],"type":"function"},{"inputs":[{"name":"call_array_len","type":"felt"},{"name":"call_array","type":"AccountCallArray*"},{"name":"calldata_len","type":"felt"},{"name":"calldata","type":"felt*"}],"name":"__execute__","outputs":[{"name":"response_len","type":"felt"},{"name":"response","type":"felt*"}],"type":"function"}] ================================================ FILE: contract-artifacts/OpenZeppelinUDC/0.5.0/UDC.cairo/UDC.json ================================================ {"abi":[{"data":[{"name":"address","type":"felt"},{"name":"deployer","type":"felt"},{"name":"unique","type":"felt"},{"name":"classHash","type":"felt"},{"name":"calldata_len","type":"felt"},{"name":"calldata","type":"felt*"},{"name":"salt","type":"felt"}],"keys":[],"name":"ContractDeployed","type":"event"},{"inputs":[{"name":"classHash","type":"felt"},{"name":"salt","type":"felt"},{"name":"unique","type":"felt"},{"name":"calldata_len","type":"felt"},{"name":"calldata","type":"felt*"}],"name":"deployContract","outputs":[{"name":"address","type":"felt"}],"type":"function"}],"entry_points_by_type":{"CONSTRUCTOR":[],"EXTERNAL":[{"offset":"0x9b","selector":"0x1987cbd17808b9a23693d4de7e246a443cfe37e6e7fbaeabd7d7e6532b07c3d"}],"L1_HANDLER":[]},"program":{"attributes":[],"builtins":["pedersen","range_check"],"compiler_version":"0.10.0","data":["0x40780017fff7fff","0x1","0x208b7fff7fff7ffe","0x400380007ffb7ffc","0x400380017ffb7ffd","0x482680017ffb8000","0x3","0x480280027ffb8000","0x208b7fff7fff7ffe","0x20780017fff7ffd","0x3","0x208b7fff7fff7ffe","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x480080007fff8000","0x400080007ffd7fff","0x482480017ffd8001","0x1","0x482480017ffd8001","0x1","0xa0680017fff7ffe","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffffb","0x402a7ffc7ffd7fff","0x208b7fff7fff7ffe","0x480680017fff8000","0x4465706c6f79","0x400280007ff87fff","0x400380017ff87ff9","0x400380027ff87ffa","0x400380037ff87ffb","0x400380047ff87ffc","0x400380057ff87ffd","0x482680017ff88000","0x9","0x480280067ff88000","0x208b7fff7fff7ffe","0x480680017fff8000","0x47657443616c6c657241646472657373","0x400280007ffd7fff","0x482680017ffd8000","0x2","0x480280017ffd8000","0x208b7fff7fff7ffe","0x480680017fff8000","0x456d69744576656e74","0x400280007ff97fff","0x400380017ff97ffa","0x400380027ff97ffb","0x400380037ff97ffc","0x400380047ff97ffd","0x482680017ff98000","0x5","0x208b7fff7fff7ffe","0x40780017fff7fff","0x4","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffca","0x40137fff7fff8000","0x480680017fff8000","0x26b160f10156dea0639bec90696772c640b9706a47f5b8c52ea1abe5858b34d","0x4002800080007fff","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffc4","0x40137fff7fff8001","0x4003800080017ff7","0x4003800180017ff8","0x4003800280017ff9","0x4003800380017ffa","0x4003800480017ffb","0x400380007ff67ffb","0x402780017ff68002","0x1","0x4826800180018000","0x5","0x40297ffb7fff8003","0x4826800180018000","0x5","0x480a7ffc7fff8000","0x480a7ffb7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffbb","0x4003800080037ffd","0x4826800180038000","0x1","0x480a7ff57fff8000","0x480680017fff8000","0x1","0x480a80007fff8000","0x4828800180007ffc","0x480a80017fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffd2","0x480a80027fff8000","0x208b7fff7fff7ffe","0x40780017fff7fff","0x6","0x480a7ff67fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffc4","0x40137ffe7fff8000","0x40137fff7fff8001","0x482680017ffb8000","0x800000000000011000000000000000000000000000000000000000000000000","0x20680017fff7fff","0xd","0x480a7ff77fff8000","0x480a80017fff8000","0x480a7ffa7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff98","0x40137fff7fff8002","0x400780017fff8003","0x0","0x48127ffe7fff8000","0x10780017fff7fff","0x6","0x400b7ffa7fff8002","0x400780017fff8003","0x1","0x480a7ff77fff8000","0x40137fff7fff8004","0x480a80007fff8000","0x480a7ff97fff8000","0x480a80027fff8000","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x480a80037fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff9a","0x40137fff7fff8005","0x48127ffe7fff8000","0x480a7ff87fff8000","0x480a80057fff8000","0x480a80017fff8000","0x480a7ffb7fff8000","0x480a7ff97fff8000","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x480a7ffa7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffab","0x48127ffe7fff8000","0x480a80047fff8000","0x48127ffd7fff8000","0x480a80057fff8000","0x208b7fff7fff7ffe","0x40780017fff7fff","0x1","0x4003800080007ffc","0x4826800180008000","0x1","0x480a7ffd7fff8000","0x4828800080007ffe","0x480a80007fff8000","0x208b7fff7fff7ffe","0x480280027ffb8000","0x480280037ffd8000","0x400080007ffe7fff","0x482680017ffd8000","0x4","0x480280037ffd8000","0x48307fff7ffe8000","0x402a7ffd7ffc7fff","0x480280027ffb8000","0x480280007ffb8000","0x480280017ffb8000","0x482480017ffd8000","0x1","0x480280007ffd8000","0x480280017ffd8000","0x480280027ffd8000","0x480280037ffd8000","0x482680017ffd8000","0x4","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffb1","0x48127ffe7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffe2","0x48127ff47fff8000","0x48127ff47fff8000","0x48127ffb7fff8000","0x48127ffb7fff8000","0x48127ffb7fff8000","0x208b7fff7fff7ffe"],"hints":{"0":[{"accessible_scopes":["starkware.cairo.common.alloc","starkware.cairo.common.alloc.alloc"],"code":"memory[ap] = segments.add()","flow_tracking_data":{"ap_tracking":{"group":0,"offset":0},"reference_ids":{}}}],"12":[{"accessible_scopes":["starkware.cairo.common.memcpy","starkware.cairo.common.memcpy.memcpy"],"code":"vm_enter_scope({'n': ids.len})","flow_tracking_data":{"ap_tracking":{"group":2,"offset":0},"reference_ids":{"starkware.cairo.common.memcpy.memcpy.len":0}}}],"20":[{"accessible_scopes":["starkware.cairo.common.memcpy","starkware.cairo.common.memcpy.memcpy"],"code":"n -= 1\nids.continue_copying = 1 if n > 0 else 0","flow_tracking_data":{"ap_tracking":{"group":2,"offset":5},"reference_ids":{"starkware.cairo.common.memcpy.memcpy.continue_copying":1}}}],"23":[{"accessible_scopes":["starkware.cairo.common.memcpy","starkware.cairo.common.memcpy.memcpy"],"code":"vm_exit_scope()","flow_tracking_data":{"ap_tracking":{"group":2,"offset":6},"reference_ids":{}}}],"32":[{"accessible_scopes":["starkware.starknet.common.syscalls","starkware.starknet.common.syscalls.deploy"],"code":"syscall_handler.deploy(segments=segments, syscall_ptr=ids.syscall_ptr)","flow_tracking_data":{"ap_tracking":{"group":3,"offset":1},"reference_ids":{"starkware.starknet.common.syscalls.deploy.syscall_ptr":2}}}],"39":[{"accessible_scopes":["starkware.starknet.common.syscalls","starkware.starknet.common.syscalls.get_caller_address"],"code":"syscall_handler.get_caller_address(segments=segments, syscall_ptr=ids.syscall_ptr)","flow_tracking_data":{"ap_tracking":{"group":4,"offset":1},"reference_ids":{"starkware.starknet.common.syscalls.get_caller_address.syscall_ptr":3}}}],"50":[{"accessible_scopes":["starkware.starknet.common.syscalls","starkware.starknet.common.syscalls.emit_event"],"code":"syscall_handler.emit_event(segments=segments, syscall_ptr=ids.syscall_ptr)","flow_tracking_data":{"ap_tracking":{"group":5,"offset":1},"reference_ids":{"starkware.starknet.common.syscalls.emit_event.syscall_ptr":4}}}],"146":[{"accessible_scopes":["__main__","__main__","__wrappers__","__wrappers__.deployContract_encode_return"],"code":"memory[ap] = segments.add()","flow_tracking_data":{"ap_tracking":{"group":11,"offset":0},"reference_ids":{}}}]},"identifiers":{"__main__.ContractDeployed":{"type":"namespace"},"__main__.ContractDeployed.Args":{"full_name":"__main__.ContractDeployed.Args","members":{},"size":0,"type":"struct"},"__main__.ContractDeployed.ImplicitArgs":{"full_name":"__main__.ContractDeployed.ImplicitArgs","members":{},"size":0,"type":"struct"},"__main__.ContractDeployed.Return":{"cairo_type":"()","type":"type_definition"},"__main__.ContractDeployed.SELECTOR":{"type":"const","value":1093830577610461490539113735431936179703456330374563419579920790156759053133},"__main__.ContractDeployed.SIZEOF_LOCALS":{"type":"const","value":0},"__main__.ContractDeployed.alloc":{"destination":"starkware.cairo.common.alloc.alloc","type":"alias"},"__main__.ContractDeployed.emit":{"decorators":[],"pc":53,"type":"function"},"__main__.ContractDeployed.emit.Args":{"full_name":"__main__.ContractDeployed.emit.Args","members":{"address":{"cairo_type":"felt","offset":0},"calldata":{"cairo_type":"felt*","offset":5},"calldata_len":{"cairo_type":"felt","offset":4},"classHash":{"cairo_type":"felt","offset":3},"deployer":{"cairo_type":"felt","offset":1},"salt":{"cairo_type":"felt","offset":6},"unique":{"cairo_type":"felt","offset":2}},"size":7,"type":"struct"},"__main__.ContractDeployed.emit.ImplicitArgs":{"full_name":"__main__.ContractDeployed.emit.ImplicitArgs","members":{"range_check_ptr":{"cairo_type":"felt","offset":1},"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":2,"type":"struct"},"__main__.ContractDeployed.emit.Return":{"cairo_type":"()","type":"type_definition"},"__main__.ContractDeployed.emit.SIZEOF_LOCALS":{"type":"const","value":4},"__main__.ContractDeployed.emit_event":{"destination":"starkware.starknet.common.syscalls.emit_event","type":"alias"},"__main__.ContractDeployed.memcpy":{"destination":"starkware.cairo.common.memcpy.memcpy","type":"alias"},"__main__.FALSE":{"destination":"starkware.cairo.common.bool.FALSE","type":"alias"},"__main__.HashBuiltin":{"destination":"starkware.cairo.common.cairo_builtins.HashBuiltin","type":"alias"},"__main__.TRUE":{"destination":"starkware.cairo.common.bool.TRUE","type":"alias"},"__main__.deploy":{"destination":"starkware.starknet.common.syscalls.deploy","type":"alias"},"__main__.deployContract":{"decorators":["external"],"pc":94,"type":"function"},"__main__.deployContract.Args":{"full_name":"__main__.deployContract.Args","members":{"calldata":{"cairo_type":"felt*","offset":4},"calldata_len":{"cairo_type":"felt","offset":3},"classHash":{"cairo_type":"felt","offset":0},"salt":{"cairo_type":"felt","offset":1},"unique":{"cairo_type":"felt","offset":2}},"size":5,"type":"struct"},"__main__.deployContract.ImplicitArgs":{"full_name":"__main__.deployContract.ImplicitArgs","members":{"pedersen_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.HashBuiltin*","offset":1},"range_check_ptr":{"cairo_type":"felt","offset":2},"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":3,"type":"struct"},"__main__.deployContract.Return":{"cairo_type":"(address: felt)","type":"type_definition"},"__main__.deployContract.SIZEOF_LOCALS":{"type":"const","value":6},"__main__.get_caller_address":{"destination":"starkware.starknet.common.syscalls.get_caller_address","type":"alias"},"__main__.hash2":{"destination":"starkware.cairo.common.hash.hash2","type":"alias"},"__wrappers__.deployContract":{"decorators":["external"],"pc":155,"type":"function"},"__wrappers__.deployContract.Args":{"full_name":"__wrappers__.deployContract.Args","members":{},"size":0,"type":"struct"},"__wrappers__.deployContract.ImplicitArgs":{"full_name":"__wrappers__.deployContract.ImplicitArgs","members":{},"size":0,"type":"struct"},"__wrappers__.deployContract.Return":{"cairo_type":"(syscall_ptr: felt*, pedersen_ptr: starkware.cairo.common.cairo_builtins.HashBuiltin*, range_check_ptr: felt, size: felt, retdata: felt*)","type":"type_definition"},"__wrappers__.deployContract.SIZEOF_LOCALS":{"type":"const","value":0},"__wrappers__.deployContract.__wrapped_func":{"destination":"__main__.deployContract","type":"alias"},"__wrappers__.deployContract_encode_return":{"decorators":[],"pc":146,"type":"function"},"__wrappers__.deployContract_encode_return.Args":{"full_name":"__wrappers__.deployContract_encode_return.Args","members":{"range_check_ptr":{"cairo_type":"felt","offset":1},"ret_value":{"cairo_type":"(address: felt)","offset":0}},"size":2,"type":"struct"},"__wrappers__.deployContract_encode_return.ImplicitArgs":{"full_name":"__wrappers__.deployContract_encode_return.ImplicitArgs","members":{},"size":0,"type":"struct"},"__wrappers__.deployContract_encode_return.Return":{"cairo_type":"(range_check_ptr: felt, data_len: felt, data: felt*)","type":"type_definition"},"__wrappers__.deployContract_encode_return.SIZEOF_LOCALS":{"type":"const","value":1},"__wrappers__.deployContract_encode_return.memcpy":{"destination":"starkware.cairo.common.memcpy.memcpy","type":"alias"},"starkware.cairo.common.alloc.alloc":{"decorators":[],"pc":0,"type":"function"},"starkware.cairo.common.alloc.alloc.Args":{"full_name":"starkware.cairo.common.alloc.alloc.Args","members":{},"size":0,"type":"struct"},"starkware.cairo.common.alloc.alloc.ImplicitArgs":{"full_name":"starkware.cairo.common.alloc.alloc.ImplicitArgs","members":{},"size":0,"type":"struct"},"starkware.cairo.common.alloc.alloc.Return":{"cairo_type":"(ptr: felt*)","type":"type_definition"},"starkware.cairo.common.alloc.alloc.SIZEOF_LOCALS":{"type":"const","value":0},"starkware.cairo.common.bool.FALSE":{"type":"const","value":0},"starkware.cairo.common.bool.TRUE":{"type":"const","value":1},"starkware.cairo.common.cairo_builtins.BitwiseBuiltin":{"full_name":"starkware.cairo.common.cairo_builtins.BitwiseBuiltin","members":{"x":{"cairo_type":"felt","offset":0},"x_and_y":{"cairo_type":"felt","offset":2},"x_or_y":{"cairo_type":"felt","offset":4},"x_xor_y":{"cairo_type":"felt","offset":3},"y":{"cairo_type":"felt","offset":1}},"size":5,"type":"struct"},"starkware.cairo.common.cairo_builtins.EcOpBuiltin":{"full_name":"starkware.cairo.common.cairo_builtins.EcOpBuiltin","members":{"m":{"cairo_type":"felt","offset":4},"p":{"cairo_type":"starkware.cairo.common.ec_point.EcPoint","offset":0},"q":{"cairo_type":"starkware.cairo.common.ec_point.EcPoint","offset":2},"r":{"cairo_type":"starkware.cairo.common.ec_point.EcPoint","offset":5}},"size":7,"type":"struct"},"starkware.cairo.common.cairo_builtins.EcPoint":{"destination":"starkware.cairo.common.ec_point.EcPoint","type":"alias"},"starkware.cairo.common.cairo_builtins.HashBuiltin":{"full_name":"starkware.cairo.common.cairo_builtins.HashBuiltin","members":{"result":{"cairo_type":"felt","offset":2},"x":{"cairo_type":"felt","offset":0},"y":{"cairo_type":"felt","offset":1}},"size":3,"type":"struct"},"starkware.cairo.common.cairo_builtins.KeccakBuiltin":{"full_name":"starkware.cairo.common.cairo_builtins.KeccakBuiltin","members":{"input":{"cairo_type":"starkware.cairo.common.keccak_state.KeccakBuiltinState","offset":0},"output":{"cairo_type":"starkware.cairo.common.keccak_state.KeccakBuiltinState","offset":8}},"size":16,"type":"struct"},"starkware.cairo.common.cairo_builtins.KeccakBuiltinState":{"destination":"starkware.cairo.common.keccak_state.KeccakBuiltinState","type":"alias"},"starkware.cairo.common.cairo_builtins.SignatureBuiltin":{"full_name":"starkware.cairo.common.cairo_builtins.SignatureBuiltin","members":{"message":{"cairo_type":"felt","offset":1},"pub_key":{"cairo_type":"felt","offset":0}},"size":2,"type":"struct"},"starkware.cairo.common.dict_access.DictAccess":{"full_name":"starkware.cairo.common.dict_access.DictAccess","members":{"key":{"cairo_type":"felt","offset":0},"new_value":{"cairo_type":"felt","offset":2},"prev_value":{"cairo_type":"felt","offset":1}},"size":3,"type":"struct"},"starkware.cairo.common.ec_point.EcPoint":{"full_name":"starkware.cairo.common.ec_point.EcPoint","members":{"x":{"cairo_type":"felt","offset":0},"y":{"cairo_type":"felt","offset":1}},"size":2,"type":"struct"},"starkware.cairo.common.hash.HashBuiltin":{"destination":"starkware.cairo.common.cairo_builtins.HashBuiltin","type":"alias"},"starkware.cairo.common.hash.hash2":{"decorators":[],"pc":3,"type":"function"},"starkware.cairo.common.hash.hash2.Args":{"full_name":"starkware.cairo.common.hash.hash2.Args","members":{"x":{"cairo_type":"felt","offset":0},"y":{"cairo_type":"felt","offset":1}},"size":2,"type":"struct"},"starkware.cairo.common.hash.hash2.ImplicitArgs":{"full_name":"starkware.cairo.common.hash.hash2.ImplicitArgs","members":{"hash_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.HashBuiltin*","offset":0}},"size":1,"type":"struct"},"starkware.cairo.common.hash.hash2.Return":{"cairo_type":"(result: felt)","type":"type_definition"},"starkware.cairo.common.hash.hash2.SIZEOF_LOCALS":{"type":"const","value":0},"starkware.cairo.common.keccak_state.KeccakBuiltinState":{"full_name":"starkware.cairo.common.keccak_state.KeccakBuiltinState","members":{"s0":{"cairo_type":"felt","offset":0},"s1":{"cairo_type":"felt","offset":1},"s2":{"cairo_type":"felt","offset":2},"s3":{"cairo_type":"felt","offset":3},"s4":{"cairo_type":"felt","offset":4},"s5":{"cairo_type":"felt","offset":5},"s6":{"cairo_type":"felt","offset":6},"s7":{"cairo_type":"felt","offset":7}},"size":8,"type":"struct"},"starkware.cairo.common.math.FALSE":{"destination":"starkware.cairo.common.bool.FALSE","type":"alias"},"starkware.cairo.common.math.TRUE":{"destination":"starkware.cairo.common.bool.TRUE","type":"alias"},"starkware.cairo.common.memcpy.memcpy":{"decorators":[],"pc":9,"type":"function"},"starkware.cairo.common.memcpy.memcpy.Args":{"full_name":"starkware.cairo.common.memcpy.memcpy.Args","members":{"dst":{"cairo_type":"felt*","offset":0},"len":{"cairo_type":"felt","offset":2},"src":{"cairo_type":"felt*","offset":1}},"size":3,"type":"struct"},"starkware.cairo.common.memcpy.memcpy.ImplicitArgs":{"full_name":"starkware.cairo.common.memcpy.memcpy.ImplicitArgs","members":{},"size":0,"type":"struct"},"starkware.cairo.common.memcpy.memcpy.LoopFrame":{"full_name":"starkware.cairo.common.memcpy.memcpy.LoopFrame","members":{"dst":{"cairo_type":"felt*","offset":0},"src":{"cairo_type":"felt*","offset":1}},"size":2,"type":"struct"},"starkware.cairo.common.memcpy.memcpy.Return":{"cairo_type":"()","type":"type_definition"},"starkware.cairo.common.memcpy.memcpy.SIZEOF_LOCALS":{"type":"const","value":0},"starkware.cairo.common.memcpy.memcpy.continue_copying":{"cairo_type":"felt","full_name":"starkware.cairo.common.memcpy.memcpy.continue_copying","references":[{"ap_tracking_data":{"group":2,"offset":3},"pc":16,"value":"[cast(ap, felt*)]"}],"type":"reference"},"starkware.cairo.common.memcpy.memcpy.len":{"cairo_type":"felt","full_name":"starkware.cairo.common.memcpy.memcpy.len","references":[{"ap_tracking_data":{"group":2,"offset":0},"pc":9,"value":"[cast(fp + (-3), felt*)]"}],"type":"reference"},"starkware.cairo.common.memcpy.memcpy.loop":{"pc":14,"type":"label"},"starkware.starknet.common.storage.ADDR_BOUND":{"type":"const","value":-106710729501573572985208420194530329073740042555888586719489},"starkware.starknet.common.storage.MAX_STORAGE_ITEM_SIZE":{"type":"const","value":256},"starkware.starknet.common.storage.assert_250_bit":{"destination":"starkware.cairo.common.math.assert_250_bit","type":"alias"},"starkware.starknet.common.syscalls.CALL_CONTRACT_SELECTOR":{"type":"const","value":20853273475220472486191784820},"starkware.starknet.common.syscalls.CallContract":{"full_name":"starkware.starknet.common.syscalls.CallContract","members":{"request":{"cairo_type":"starkware.starknet.common.syscalls.CallContractRequest","offset":0},"response":{"cairo_type":"starkware.starknet.common.syscalls.CallContractResponse","offset":5}},"size":7,"type":"struct"},"starkware.starknet.common.syscalls.CallContractRequest":{"full_name":"starkware.starknet.common.syscalls.CallContractRequest","members":{"calldata":{"cairo_type":"felt*","offset":4},"calldata_size":{"cairo_type":"felt","offset":3},"contract_address":{"cairo_type":"felt","offset":1},"function_selector":{"cairo_type":"felt","offset":2},"selector":{"cairo_type":"felt","offset":0}},"size":5,"type":"struct"},"starkware.starknet.common.syscalls.CallContractResponse":{"full_name":"starkware.starknet.common.syscalls.CallContractResponse","members":{"retdata":{"cairo_type":"felt*","offset":1},"retdata_size":{"cairo_type":"felt","offset":0}},"size":2,"type":"struct"},"starkware.starknet.common.syscalls.DELEGATE_CALL_SELECTOR":{"type":"const","value":21167594061783206823196716140},"starkware.starknet.common.syscalls.DELEGATE_L1_HANDLER_SELECTOR":{"type":"const","value":23274015802972845247556842986379118667122},"starkware.starknet.common.syscalls.DEPLOY_SELECTOR":{"type":"const","value":75202468540281},"starkware.starknet.common.syscalls.Deploy":{"full_name":"starkware.starknet.common.syscalls.Deploy","members":{"request":{"cairo_type":"starkware.starknet.common.syscalls.DeployRequest","offset":0},"response":{"cairo_type":"starkware.starknet.common.syscalls.DeployResponse","offset":6}},"size":9,"type":"struct"},"starkware.starknet.common.syscalls.DeployRequest":{"full_name":"starkware.starknet.common.syscalls.DeployRequest","members":{"class_hash":{"cairo_type":"felt","offset":1},"constructor_calldata":{"cairo_type":"felt*","offset":4},"constructor_calldata_size":{"cairo_type":"felt","offset":3},"contract_address_salt":{"cairo_type":"felt","offset":2},"deploy_from_zero":{"cairo_type":"felt","offset":5},"selector":{"cairo_type":"felt","offset":0}},"size":6,"type":"struct"},"starkware.starknet.common.syscalls.DeployResponse":{"full_name":"starkware.starknet.common.syscalls.DeployResponse","members":{"constructor_retdata":{"cairo_type":"felt*","offset":2},"constructor_retdata_size":{"cairo_type":"felt","offset":1},"contract_address":{"cairo_type":"felt","offset":0}},"size":3,"type":"struct"},"starkware.starknet.common.syscalls.DictAccess":{"destination":"starkware.cairo.common.dict_access.DictAccess","type":"alias"},"starkware.starknet.common.syscalls.EMIT_EVENT_SELECTOR":{"type":"const","value":1280709301550335749748},"starkware.starknet.common.syscalls.EmitEvent":{"full_name":"starkware.starknet.common.syscalls.EmitEvent","members":{"data":{"cairo_type":"felt*","offset":4},"data_len":{"cairo_type":"felt","offset":3},"keys":{"cairo_type":"felt*","offset":2},"keys_len":{"cairo_type":"felt","offset":1},"selector":{"cairo_type":"felt","offset":0}},"size":5,"type":"struct"},"starkware.starknet.common.syscalls.GET_BLOCK_NUMBER_SELECTOR":{"type":"const","value":1448089106835523001438702345020786},"starkware.starknet.common.syscalls.GET_BLOCK_TIMESTAMP_SELECTOR":{"type":"const","value":24294903732626645868215235778792757751152},"starkware.starknet.common.syscalls.GET_CALLER_ADDRESS_SELECTOR":{"type":"const","value":94901967781393078444254803017658102643},"starkware.starknet.common.syscalls.GET_CONTRACT_ADDRESS_SELECTOR":{"type":"const","value":6219495360805491471215297013070624192820083},"starkware.starknet.common.syscalls.GET_SEQUENCER_ADDRESS_SELECTOR":{"type":"const","value":1592190833581991703053805829594610833820054387},"starkware.starknet.common.syscalls.GET_TX_INFO_SELECTOR":{"type":"const","value":1317029390204112103023},"starkware.starknet.common.syscalls.GET_TX_SIGNATURE_SELECTOR":{"type":"const","value":1448089128652340074717162277007973},"starkware.starknet.common.syscalls.GetBlockNumber":{"full_name":"starkware.starknet.common.syscalls.GetBlockNumber","members":{"request":{"cairo_type":"starkware.starknet.common.syscalls.GetBlockNumberRequest","offset":0},"response":{"cairo_type":"starkware.starknet.common.syscalls.GetBlockNumberResponse","offset":1}},"size":2,"type":"struct"},"starkware.starknet.common.syscalls.GetBlockNumberRequest":{"full_name":"starkware.starknet.common.syscalls.GetBlockNumberRequest","members":{"selector":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"starkware.starknet.common.syscalls.GetBlockNumberResponse":{"full_name":"starkware.starknet.common.syscalls.GetBlockNumberResponse","members":{"block_number":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"starkware.starknet.common.syscalls.GetBlockTimestamp":{"full_name":"starkware.starknet.common.syscalls.GetBlockTimestamp","members":{"request":{"cairo_type":"starkware.starknet.common.syscalls.GetBlockTimestampRequest","offset":0},"response":{"cairo_type":"starkware.starknet.common.syscalls.GetBlockTimestampResponse","offset":1}},"size":2,"type":"struct"},"starkware.starknet.common.syscalls.GetBlockTimestampRequest":{"full_name":"starkware.starknet.common.syscalls.GetBlockTimestampRequest","members":{"selector":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"starkware.starknet.common.syscalls.GetBlockTimestampResponse":{"full_name":"starkware.starknet.common.syscalls.GetBlockTimestampResponse","members":{"block_timestamp":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"starkware.starknet.common.syscalls.GetCallerAddress":{"full_name":"starkware.starknet.common.syscalls.GetCallerAddress","members":{"request":{"cairo_type":"starkware.starknet.common.syscalls.GetCallerAddressRequest","offset":0},"response":{"cairo_type":"starkware.starknet.common.syscalls.GetCallerAddressResponse","offset":1}},"size":2,"type":"struct"},"starkware.starknet.common.syscalls.GetCallerAddressRequest":{"full_name":"starkware.starknet.common.syscalls.GetCallerAddressRequest","members":{"selector":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"starkware.starknet.common.syscalls.GetCallerAddressResponse":{"full_name":"starkware.starknet.common.syscalls.GetCallerAddressResponse","members":{"caller_address":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"starkware.starknet.common.syscalls.GetContractAddress":{"full_name":"starkware.starknet.common.syscalls.GetContractAddress","members":{"request":{"cairo_type":"starkware.starknet.common.syscalls.GetContractAddressRequest","offset":0},"response":{"cairo_type":"starkware.starknet.common.syscalls.GetContractAddressResponse","offset":1}},"size":2,"type":"struct"},"starkware.starknet.common.syscalls.GetContractAddressRequest":{"full_name":"starkware.starknet.common.syscalls.GetContractAddressRequest","members":{"selector":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"starkware.starknet.common.syscalls.GetContractAddressResponse":{"full_name":"starkware.starknet.common.syscalls.GetContractAddressResponse","members":{"contract_address":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"starkware.starknet.common.syscalls.GetSequencerAddress":{"full_name":"starkware.starknet.common.syscalls.GetSequencerAddress","members":{"request":{"cairo_type":"starkware.starknet.common.syscalls.GetSequencerAddressRequest","offset":0},"response":{"cairo_type":"starkware.starknet.common.syscalls.GetSequencerAddressResponse","offset":1}},"size":2,"type":"struct"},"starkware.starknet.common.syscalls.GetSequencerAddressRequest":{"full_name":"starkware.starknet.common.syscalls.GetSequencerAddressRequest","members":{"selector":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"starkware.starknet.common.syscalls.GetSequencerAddressResponse":{"full_name":"starkware.starknet.common.syscalls.GetSequencerAddressResponse","members":{"sequencer_address":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"starkware.starknet.common.syscalls.GetTxInfo":{"full_name":"starkware.starknet.common.syscalls.GetTxInfo","members":{"request":{"cairo_type":"starkware.starknet.common.syscalls.GetTxInfoRequest","offset":0},"response":{"cairo_type":"starkware.starknet.common.syscalls.GetTxInfoResponse","offset":1}},"size":2,"type":"struct"},"starkware.starknet.common.syscalls.GetTxInfoRequest":{"full_name":"starkware.starknet.common.syscalls.GetTxInfoRequest","members":{"selector":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"starkware.starknet.common.syscalls.GetTxInfoResponse":{"full_name":"starkware.starknet.common.syscalls.GetTxInfoResponse","members":{"tx_info":{"cairo_type":"starkware.starknet.common.syscalls.TxInfo*","offset":0}},"size":1,"type":"struct"},"starkware.starknet.common.syscalls.GetTxSignature":{"full_name":"starkware.starknet.common.syscalls.GetTxSignature","members":{"request":{"cairo_type":"starkware.starknet.common.syscalls.GetTxSignatureRequest","offset":0},"response":{"cairo_type":"starkware.starknet.common.syscalls.GetTxSignatureResponse","offset":1}},"size":3,"type":"struct"},"starkware.starknet.common.syscalls.GetTxSignatureRequest":{"full_name":"starkware.starknet.common.syscalls.GetTxSignatureRequest","members":{"selector":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"starkware.starknet.common.syscalls.GetTxSignatureResponse":{"full_name":"starkware.starknet.common.syscalls.GetTxSignatureResponse","members":{"signature":{"cairo_type":"felt*","offset":1},"signature_len":{"cairo_type":"felt","offset":0}},"size":2,"type":"struct"},"starkware.starknet.common.syscalls.LIBRARY_CALL_L1_HANDLER_SELECTOR":{"type":"const","value":436233452754198157705746250789557519228244616562},"starkware.starknet.common.syscalls.LIBRARY_CALL_SELECTOR":{"type":"const","value":92376026794327011772951660},"starkware.starknet.common.syscalls.LibraryCall":{"full_name":"starkware.starknet.common.syscalls.LibraryCall","members":{"request":{"cairo_type":"starkware.starknet.common.syscalls.LibraryCallRequest","offset":0},"response":{"cairo_type":"starkware.starknet.common.syscalls.CallContractResponse","offset":5}},"size":7,"type":"struct"},"starkware.starknet.common.syscalls.LibraryCallRequest":{"full_name":"starkware.starknet.common.syscalls.LibraryCallRequest","members":{"calldata":{"cairo_type":"felt*","offset":4},"calldata_size":{"cairo_type":"felt","offset":3},"class_hash":{"cairo_type":"felt","offset":1},"function_selector":{"cairo_type":"felt","offset":2},"selector":{"cairo_type":"felt","offset":0}},"size":5,"type":"struct"},"starkware.starknet.common.syscalls.SEND_MESSAGE_TO_L1_SELECTOR":{"type":"const","value":433017908768303439907196859243777073},"starkware.starknet.common.syscalls.STORAGE_READ_SELECTOR":{"type":"const","value":100890693370601760042082660},"starkware.starknet.common.syscalls.STORAGE_WRITE_SELECTOR":{"type":"const","value":25828017502874050592466629733},"starkware.starknet.common.syscalls.SendMessageToL1SysCall":{"full_name":"starkware.starknet.common.syscalls.SendMessageToL1SysCall","members":{"payload_ptr":{"cairo_type":"felt*","offset":3},"payload_size":{"cairo_type":"felt","offset":2},"selector":{"cairo_type":"felt","offset":0},"to_address":{"cairo_type":"felt","offset":1}},"size":4,"type":"struct"},"starkware.starknet.common.syscalls.StorageRead":{"full_name":"starkware.starknet.common.syscalls.StorageRead","members":{"request":{"cairo_type":"starkware.starknet.common.syscalls.StorageReadRequest","offset":0},"response":{"cairo_type":"starkware.starknet.common.syscalls.StorageReadResponse","offset":2}},"size":3,"type":"struct"},"starkware.starknet.common.syscalls.StorageReadRequest":{"full_name":"starkware.starknet.common.syscalls.StorageReadRequest","members":{"address":{"cairo_type":"felt","offset":1},"selector":{"cairo_type":"felt","offset":0}},"size":2,"type":"struct"},"starkware.starknet.common.syscalls.StorageReadResponse":{"full_name":"starkware.starknet.common.syscalls.StorageReadResponse","members":{"value":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"starkware.starknet.common.syscalls.StorageWrite":{"full_name":"starkware.starknet.common.syscalls.StorageWrite","members":{"address":{"cairo_type":"felt","offset":1},"selector":{"cairo_type":"felt","offset":0},"value":{"cairo_type":"felt","offset":2}},"size":3,"type":"struct"},"starkware.starknet.common.syscalls.TxInfo":{"full_name":"starkware.starknet.common.syscalls.TxInfo","members":{"account_contract_address":{"cairo_type":"felt","offset":1},"chain_id":{"cairo_type":"felt","offset":6},"max_fee":{"cairo_type":"felt","offset":2},"nonce":{"cairo_type":"felt","offset":7},"signature":{"cairo_type":"felt*","offset":4},"signature_len":{"cairo_type":"felt","offset":3},"transaction_hash":{"cairo_type":"felt","offset":5},"version":{"cairo_type":"felt","offset":0}},"size":8,"type":"struct"},"starkware.starknet.common.syscalls.deploy":{"decorators":[],"pc":24,"type":"function"},"starkware.starknet.common.syscalls.deploy.Args":{"full_name":"starkware.starknet.common.syscalls.deploy.Args","members":{"class_hash":{"cairo_type":"felt","offset":0},"constructor_calldata":{"cairo_type":"felt*","offset":3},"constructor_calldata_size":{"cairo_type":"felt","offset":2},"contract_address_salt":{"cairo_type":"felt","offset":1},"deploy_from_zero":{"cairo_type":"felt","offset":4}},"size":5,"type":"struct"},"starkware.starknet.common.syscalls.deploy.ImplicitArgs":{"full_name":"starkware.starknet.common.syscalls.deploy.ImplicitArgs","members":{"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":1,"type":"struct"},"starkware.starknet.common.syscalls.deploy.Return":{"cairo_type":"(contract_address: felt)","type":"type_definition"},"starkware.starknet.common.syscalls.deploy.SIZEOF_LOCALS":{"type":"const","value":0},"starkware.starknet.common.syscalls.deploy.syscall_ptr":{"cairo_type":"felt*","full_name":"starkware.starknet.common.syscalls.deploy.syscall_ptr","references":[{"ap_tracking_data":{"group":3,"offset":0},"pc":24,"value":"[cast(fp + (-8), felt**)]"},{"ap_tracking_data":{"group":3,"offset":1},"pc":32,"value":"cast([fp + (-8)] + 9, felt*)"}],"type":"reference"},"starkware.starknet.common.syscalls.emit_event":{"decorators":[],"pc":43,"type":"function"},"starkware.starknet.common.syscalls.emit_event.Args":{"full_name":"starkware.starknet.common.syscalls.emit_event.Args","members":{"data":{"cairo_type":"felt*","offset":3},"data_len":{"cairo_type":"felt","offset":2},"keys":{"cairo_type":"felt*","offset":1},"keys_len":{"cairo_type":"felt","offset":0}},"size":4,"type":"struct"},"starkware.starknet.common.syscalls.emit_event.ImplicitArgs":{"full_name":"starkware.starknet.common.syscalls.emit_event.ImplicitArgs","members":{"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":1,"type":"struct"},"starkware.starknet.common.syscalls.emit_event.Return":{"cairo_type":"()","type":"type_definition"},"starkware.starknet.common.syscalls.emit_event.SIZEOF_LOCALS":{"type":"const","value":0},"starkware.starknet.common.syscalls.emit_event.syscall_ptr":{"cairo_type":"felt*","full_name":"starkware.starknet.common.syscalls.emit_event.syscall_ptr","references":[{"ap_tracking_data":{"group":5,"offset":0},"pc":43,"value":"[cast(fp + (-7), felt**)]"},{"ap_tracking_data":{"group":5,"offset":1},"pc":50,"value":"cast([fp + (-7)] + 5, felt*)"}],"type":"reference"},"starkware.starknet.common.syscalls.get_caller_address":{"decorators":[],"pc":36,"type":"function"},"starkware.starknet.common.syscalls.get_caller_address.Args":{"full_name":"starkware.starknet.common.syscalls.get_caller_address.Args","members":{},"size":0,"type":"struct"},"starkware.starknet.common.syscalls.get_caller_address.ImplicitArgs":{"full_name":"starkware.starknet.common.syscalls.get_caller_address.ImplicitArgs","members":{"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":1,"type":"struct"},"starkware.starknet.common.syscalls.get_caller_address.Return":{"cairo_type":"(caller_address: felt)","type":"type_definition"},"starkware.starknet.common.syscalls.get_caller_address.SIZEOF_LOCALS":{"type":"const","value":0},"starkware.starknet.common.syscalls.get_caller_address.syscall_ptr":{"cairo_type":"felt*","full_name":"starkware.starknet.common.syscalls.get_caller_address.syscall_ptr","references":[{"ap_tracking_data":{"group":4,"offset":0},"pc":36,"value":"[cast(fp + (-3), felt**)]"},{"ap_tracking_data":{"group":4,"offset":1},"pc":39,"value":"cast([fp + (-3)] + 2, felt*)"}],"type":"reference"}},"main_scope":"__main__","prime":"0x800000000000011000000000000000000000000000000000000000000000001","reference_manager":{"references":[{"ap_tracking_data":{"group":2,"offset":0},"pc":9,"value":"[cast(fp + (-3), felt*)]"},{"ap_tracking_data":{"group":2,"offset":3},"pc":16,"value":"[cast(ap, felt*)]"},{"ap_tracking_data":{"group":3,"offset":0},"pc":24,"value":"[cast(fp + (-8), felt**)]"},{"ap_tracking_data":{"group":4,"offset":0},"pc":36,"value":"[cast(fp + (-3), felt**)]"},{"ap_tracking_data":{"group":5,"offset":0},"pc":43,"value":"[cast(fp + (-7), felt**)]"}]}}} ================================================ FILE: contract-artifacts/OpenZeppelinUDC/0.5.0/UDC.cairo/UDC_abi.json ================================================ [{"data":[{"name":"address","type":"felt"},{"name":"deployer","type":"felt"},{"name":"unique","type":"felt"},{"name":"classHash","type":"felt"},{"name":"calldata_len","type":"felt"},{"name":"calldata","type":"felt*"},{"name":"salt","type":"felt"}],"keys":[],"name":"ContractDeployed","type":"event"},{"inputs":[{"name":"classHash","type":"felt"},{"name":"salt","type":"felt"},{"name":"unique","type":"felt"},{"name":"calldata_len","type":"felt"},{"name":"calldata","type":"felt*"}],"name":"deployContract","outputs":[{"name":"address","type":"felt"}],"type":"function"}] ================================================ FILE: contract-artifacts/Token/ERC20.cairo/ERC20.json ================================================ {"abi":[{"inputs":[],"name":"finalized","outputs":[{"name":"res","type":"felt"}],"stateMutability":"view","type":"function"},{"data":[{"name":"new_governor_nominee","type":"felt"},{"name":"nominated_by","type":"felt"}],"keys":[],"name":"governor_nominated","type":"event"},{"data":[{"name":"cancelled_nominee","type":"felt"},{"name":"cancelled_by","type":"felt"}],"keys":[],"name":"nomination_cancelled","type":"event"},{"data":[{"name":"removed_governor","type":"felt"},{"name":"removed_by","type":"felt"}],"keys":[],"name":"governor_removed","type":"event"},{"data":[{"name":"new_governor","type":"felt"}],"keys":[],"name":"governance_accepted","type":"event"},{"inputs":[{"name":"account","type":"felt"}],"name":"is_governor","outputs":[{"name":"is_governor_","type":"felt"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"init_governance","outputs":[],"type":"function"},{"inputs":[{"name":"nominee","type":"felt"}],"name":"nominate_new_governor","outputs":[],"type":"function"},{"inputs":[{"name":"cancelee","type":"felt"}],"name":"cancel_nomination","outputs":[],"type":"function"},{"inputs":[{"name":"removee","type":"felt"}],"name":"remove_governor","outputs":[],"type":"function"},{"inputs":[],"name":"accept_governance","outputs":[],"type":"function"},{"data":[{"name":"implementation","type":"felt"},{"name":"eic_address","type":"felt"},{"name":"init_vector_len","type":"felt"},{"name":"init_vector","type":"felt*"},{"name":"final","type":"felt"}],"keys":[],"name":"implementation_added","type":"event"},{"data":[{"name":"implementation","type":"felt"},{"name":"eic_address","type":"felt"},{"name":"init_vector_len","type":"felt"},{"name":"init_vector","type":"felt*"},{"name":"final","type":"felt"}],"keys":[],"name":"implementation_removed","type":"event"},{"data":[{"name":"implementation","type":"felt"},{"name":"eic_address","type":"felt"},{"name":"init_vector_len","type":"felt"},{"name":"init_vector","type":"felt*"}],"keys":[],"name":"implementation_upgraded","type":"event"},{"data":[{"name":"implementation","type":"felt"}],"keys":[],"name":"implementation_finalized","type":"event"},{"inputs":[],"name":"implementation","outputs":[{"name":"address","type":"felt"}],"stateMutability":"view","type":"function"},{"inputs":[{"name":"implementation_","type":"felt"},{"name":"eic_address","type":"felt"},{"name":"init_vector_len","type":"felt"},{"name":"init_vector","type":"felt*"},{"name":"final","type":"felt"}],"name":"implementation_time","outputs":[{"name":"time","type":"felt"}],"stateMutability":"view","type":"function"},{"inputs":[{"name":"implementation_","type":"felt"},{"name":"eic_address","type":"felt"},{"name":"init_vector_len","type":"felt"},{"name":"init_vector","type":"felt*"},{"name":"final","type":"felt"}],"name":"add_implementation","outputs":[],"type":"function"},{"inputs":[{"name":"implementation_","type":"felt"},{"name":"eic_address","type":"felt"},{"name":"init_vector_len","type":"felt"},{"name":"init_vector","type":"felt*"},{"name":"final","type":"felt"}],"name":"remove_implementation","outputs":[],"type":"function"},{"inputs":[{"name":"implementation_","type":"felt"},{"name":"eic_address","type":"felt"},{"name":"init_vector_len","type":"felt"},{"name":"init_vector","type":"felt*"},{"name":"final","type":"felt"}],"name":"upgrade_to","outputs":[],"type":"function"},{"inputs":[{"name":"init_vector_len","type":"felt"},{"name":"init_vector","type":"felt*"}],"name":"initialize","outputs":[],"type":"function"},{"inputs":[{"name":"upgrade_delay_seconds","type":"felt"}],"name":"constructor","outputs":[],"type":"constructor"},{"inputs":[{"name":"selector","type":"felt"},{"name":"calldata_size","type":"felt"},{"name":"calldata","type":"felt*"}],"name":"__default__","outputs":[{"name":"retdata_size","type":"felt"},{"name":"retdata","type":"felt*"}],"type":"function"},{"inputs":[{"name":"selector","type":"felt"},{"name":"calldata_size","type":"felt"},{"name":"calldata","type":"felt*"}],"name":"__l1_default__","outputs":[],"type":"l1_handler"}],"bytecode":["0x40780017fff7fff","0x1","0x208b7fff7fff7ffe","0x400380007ffb7ffc","0x400380017ffb7ffd","0x482680017ffb8000","0x3","0x480280027ffb8000","0x208b7fff7fff7ffe","0x20780017fff7ffd","0x3","0x208b7fff7fff7ffe","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x480080007fff8000","0x400080007ffd7fff","0x482480017ffd8001","0x1","0x482480017ffd8001","0x1","0xa0680017fff7ffe","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffffb","0x402a7ffc7ffd7fff","0x208b7fff7fff7ffe","0x20780017fff7ffd","0x4","0x400780017fff7ffd","0x1","0x208b7fff7fff7ffe","0x48297ffd80007ffc","0x20680017fff7fff","0x4","0x402780017ffc7ffc","0x1","0x208b7fff7fff7ffe","0x400380007ffc7ffd","0x482680017ffc8000","0x1","0x208b7fff7fff7ffe","0x480a7ffb7fff8000","0x48297ffc80007ffd","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffffb","0x208b7fff7fff7ffe","0x480680017fff8000","0x3ffffffffffffffffffffffffffffff","0x480280017ffc8000","0x48307fff80007ffe","0x400280027ffc7fff","0x480280017ffc8000","0x484480017fff8000","0x100000000000000000000000000000000","0x480280007ffc8000","0x40317fff7ffe7ffd","0x482680017ffc8000","0x3","0x208b7fff7fff7ffe","0x40780017fff7fff","0x1","0x20680017fff7fff","0x10","0x480a7ffc7fff8000","0x482680017ffd8000","0x11000000000000000000000000000000000000000000000101","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffed","0x480680017fff8000","0x800000000000011000000000000000000000000000000000000000000000000","0x48127ffe7fff8000","0x48287ffd80007ffe","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffe7","0x482680017ffd8000","0x11000000000000000000000000000000000000000000000101","0x208b7fff7fff7ffe","0x40780017fff7fff","0x1","0x20680017fff7fff","0xc","0x40780017fff7fff","0xa","0x480680017fff8000","0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeff","0x480a7ffc7fff8000","0x48287ffd80007ffe","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffd8","0x10780017fff7fff","0x8","0x40780017fff7fff","0xb","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffd0","0x480a7ffd7fff8000","0x208b7fff7fff7ffe","0x480680017fff8000","0x44656c656761746543616c6c","0x400280007ff97fff","0x400380017ff97ffa","0x400380027ff97ffb","0x400380037ff97ffc","0x400380047ff97ffd","0x482680017ff98000","0x7","0x480280057ff98000","0x480280067ff98000","0x208b7fff7fff7ffe","0x480680017fff8000","0x44656c65676174654c3148616e646c6572","0x400280007ff97fff","0x400380017ff97ffa","0x400380027ff97ffb","0x400380037ff97ffc","0x400380047ff97ffd","0x482680017ff98000","0x7","0x480280057ff98000","0x480280067ff98000","0x208b7fff7fff7ffe","0x480680017fff8000","0x47657443616c6c657241646472657373","0x400280007ffd7fff","0x482680017ffd8000","0x2","0x480280017ffd8000","0x208b7fff7fff7ffe","0x480680017fff8000","0x476574426c6f636b54696d657374616d70","0x400280007ffd7fff","0x482680017ffd8000","0x2","0x480280017ffd8000","0x208b7fff7fff7ffe","0x480680017fff8000","0x53746f7261676552656164","0x400280007ffc7fff","0x400380017ffc7ffd","0x482680017ffc8000","0x3","0x480280027ffc8000","0x208b7fff7fff7ffe","0x480680017fff8000","0x53746f726167655772697465","0x400280007ffb7fff","0x400380017ffb7ffc","0x400380027ffb7ffd","0x482680017ffb8000","0x3","0x208b7fff7fff7ffe","0x480680017fff8000","0x456d69744576656e74","0x400280007ff97fff","0x400380017ff97ffa","0x400380027ff97ffb","0x400380037ff97ffc","0x400380047ff97ffd","0x482680017ff98000","0x5","0x208b7fff7fff7ffe","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x480680017fff8000","0x3deed800708b45e9b8d2fb1c674394761dfb20b8c89d199e6c4cdb0974dd906","0x208b7fff7fff7ffe","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffffa","0x480a7ffb7fff8000","0x48127ffe7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffdc","0x48127ffe7fff8000","0x48127ff57fff8000","0x48127ff57fff8000","0x48127ffc7fff8000","0x208b7fff7fff7ffe","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffed","0x480a7ffa7fff8000","0x48127ffe7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffd6","0x48127ff67fff8000","0x48127ff67fff8000","0x208b7fff7fff7ffe","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffe5","0x208b7fff7fff7ffe","0x40780017fff7fff","0x1","0x4003800080007ffc","0x4826800180008000","0x1","0x480a7ffd7fff8000","0x4828800080007ffe","0x480a80007fff8000","0x208b7fff7fff7ffe","0x402b7ffd7ffc7ffd","0x480280007ffb8000","0x480280017ffb8000","0x480280027ffb8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffee","0x48127ffe7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffff1","0x48127ff47fff8000","0x48127ff47fff8000","0x48127ffb7fff8000","0x48127ffb7fff8000","0x48127ffb7fff8000","0x208b7fff7fff7ffe","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffe0","0x400680017fff7fff","0x0","0x48127ffc7fff8000","0x48127ffc7fff8000","0x48127ffc7fff8000","0x208b7fff7fff7ffe","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffff3","0x480680017fff8000","0x1","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffc5","0x208b7fff7fff7ffe","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x480680017fff8000","0xe8fc4f1b6b3dc661208f9a8a5017a6c059098327e31518722e0a5c3a5a7e86","0x208b7fff7fff7ffe","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffffa","0x480a7ffb7fff8000","0x48127ffe7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff8b","0x48127ffe7fff8000","0x48127ff57fff8000","0x48127ff57fff8000","0x48127ffc7fff8000","0x208b7fff7fff7ffe","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffed","0x480a7ffa7fff8000","0x48127ffe7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff85","0x48127ff67fff8000","0x48127ff67fff8000","0x208b7fff7fff7ffe","0x480a7ffb7fff8000","0x480680017fff8000","0x10bce98963d2e4d3c96d1d25422c3d2a989cdbb9fb71db6f95dcbfba8c4b3c8","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffef0","0x480a7ffc7fff8000","0x48127ffe7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff22","0x48127fe17fff8000","0x48127ffd7fff8000","0x48127ffd7fff8000","0x208b7fff7fff7ffe","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffff0","0x480a7ffa7fff8000","0x48127ffe7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff63","0x48127ffe7fff8000","0x48127ff57fff8000","0x48127ff57fff8000","0x48127ffc7fff8000","0x208b7fff7fff7ffe","0x480a7ffa7fff8000","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffe2","0x480a7ff97fff8000","0x48127ffe7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff5c","0x48127ff67fff8000","0x48127ff67fff8000","0x208b7fff7fff7ffe","0x480a7ffb7fff8000","0x480680017fff8000","0x222d6589b56d0ac1912a58387989f966f458b8de84e71844d58a394dafbd671","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffec7","0x480a7ffc7fff8000","0x48127ffe7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffef9","0x48127fe17fff8000","0x48127ffd7fff8000","0x48127ffd7fff8000","0x208b7fff7fff7ffe","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffff0","0x480a7ffa7fff8000","0x48127ffe7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff3a","0x48127ffe7fff8000","0x48127ff57fff8000","0x48127ff57fff8000","0x48127ffc7fff8000","0x208b7fff7fff7ffe","0x480a7ffa7fff8000","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffe2","0x480a7ff97fff8000","0x48127ffe7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff33","0x48127ff67fff8000","0x48127ff67fff8000","0x208b7fff7fff7ffe","0x40780017fff7fff","0x2","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffe9d","0x40137fff7fff8000","0x480680017fff8000","0x3774b0545aabb37c45c1eddc6a7dae57de498aae6d5e3589e362d4b4323a533","0x4002800080007fff","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffe97","0x40137fff7fff8001","0x4003800080017ffc","0x4003800180017ffd","0x4826800180018000","0x2","0x480a7ffa7fff8000","0x480680017fff8000","0x1","0x480a80007fff8000","0x4828800180007ffc","0x480a80017fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff21","0x480a7ffb7fff8000","0x208b7fff7fff7ffe","0x40780017fff7fff","0x2","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffe84","0x40137fff7fff8000","0x480680017fff8000","0x19b0b96cb0e0029733092527bca81129db5f327c064199b31ed8a9f857fdee3","0x4002800080007fff","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffe7e","0x40137fff7fff8001","0x4003800080017ffc","0x4003800180017ffd","0x4826800180018000","0x2","0x480a7ffa7fff8000","0x480680017fff8000","0x1","0x480a80007fff8000","0x4828800180007ffc","0x480a80017fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff08","0x480a7ffb7fff8000","0x208b7fff7fff7ffe","0x40780017fff7fff","0x2","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffe6b","0x40137fff7fff8000","0x480680017fff8000","0x3b7aa6f257721ed65dae25f8a1ee350b92d02cd59a9dcfb1fc4e8887be194ec","0x4002800080007fff","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffe65","0x40137fff7fff8001","0x4003800080017ffc","0x4003800180017ffd","0x4826800180018000","0x2","0x480a7ffa7fff8000","0x480680017fff8000","0x1","0x480a80007fff8000","0x4828800180007ffc","0x480a80017fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffeef","0x480a7ffb7fff8000","0x208b7fff7fff7ffe","0x40780017fff7fff","0x2","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffe52","0x40137fff7fff8000","0x480680017fff8000","0x4595132f9b33b7077ebf2e7f3eb746a8e0a6d5c337c71cd8f9bf46cac3cfd7","0x4002800080007fff","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffe4c","0x40137fff7fff8001","0x4003800080017ffd","0x4826800180018000","0x1","0x480a7ffb7fff8000","0x480680017fff8000","0x1","0x480a80007fff8000","0x4828800180007ffc","0x480a80017fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffed7","0x480a7ffc7fff8000","0x208b7fff7fff7ffe","0x480a7ffa7fff8000","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff56","0x208b7fff7fff7ffe","0x40780017fff7fff","0x1","0x4003800080007ffc","0x4826800180008000","0x1","0x480a7ffd7fff8000","0x4828800080007ffe","0x480a80007fff8000","0x208b7fff7fff7ffe","0x482680017ffd8000","0x1","0x402a7ffd7ffc7fff","0x480280007ffb8000","0x480280017ffb8000","0x480280027ffb8000","0x480280007ffd8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffea","0x48127ffe7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffee","0x48127ff47fff8000","0x48127ff47fff8000","0x48127ffb7fff8000","0x48127ffb7fff8000","0x48127ffb7fff8000","0x208b7fff7fff7ffe","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff0e","0x400680017fff7fff","0x0","0x48127ffc7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffe8b","0x48127ffe7fff8000","0x48127ff67fff8000","0x48127ff67fff8000","0x480680017fff8000","0x1","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff0f","0x48127fe97fff8000","0x480680017fff8000","0x1","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff32","0x48127ffd7fff8000","0x48127ffe7fff8000","0x48127fae7fff8000","0x48127fad7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff62","0x48127f967fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffaa","0x48127ffe7fff8000","0x48127fcc7fff8000","0x48127ffd7fff8000","0x208b7fff7fff7ffe","0x402b7ffd7ffc7ffd","0x480280007ffb8000","0x480280017ffb8000","0x480280027ffb8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffda","0x40780017fff7fff","0x1","0x48127ffc7fff8000","0x48127ffc7fff8000","0x48127ffc7fff8000","0x480680017fff8000","0x0","0x48127ffb7fff8000","0x208b7fff7fff7ffe","0x480a7ffa7fff8000","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x1104800180018000","0xc7","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffa7","0x400680017fff7fff","0x0","0x48127ffc7fff8000","0x48127ffc7fff8000","0x48127ffc7fff8000","0x480a7ffd7fff8000","0x480680017fff8000","0x1","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff2d","0x48127ffd7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffe4e","0x48127ffe7fff8000","0x48127ff87fff8000","0x480a7ffd7fff8000","0x48127ffc7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff31","0x48127ffe7fff8000","0x48127fdd7fff8000","0x48127ffd7fff8000","0x208b7fff7fff7ffe","0x482680017ffd8000","0x1","0x402a7ffd7ffc7fff","0x480280007ffb8000","0x480280017ffb8000","0x480280027ffb8000","0x480280007ffd8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffdb","0x40780017fff7fff","0x1","0x48127ffc7fff8000","0x48127ffc7fff8000","0x48127ffc7fff8000","0x480680017fff8000","0x0","0x48127ffb7fff8000","0x208b7fff7fff7ffe","0x480a7ffa7fff8000","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x1104800180018000","0x96","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffef8","0x20680017fff7fff","0x6","0x48127ffc7fff8000","0x48127ffc7fff8000","0x48127ffc7fff8000","0x208b7fff7fff7ffe","0x48127ffc7fff8000","0x48127ffc7fff8000","0x48127ffc7fff8000","0x480a7ffd7fff8000","0x480680017fff8000","0x0","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffef8","0x48127ffd7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffe19","0x48127ffe7fff8000","0x48127ff87fff8000","0x480a7ffd7fff8000","0x48127ffc7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff15","0x48127ffe7fff8000","0x48127fdd7fff8000","0x48127ffd7fff8000","0x208b7fff7fff7ffe","0x482680017ffd8000","0x1","0x402a7ffd7ffc7fff","0x480280007ffb8000","0x480280017ffb8000","0x480280027ffb8000","0x480280007ffd8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffd7","0x40780017fff7fff","0x1","0x48127ffc7fff8000","0x48127ffc7fff8000","0x48127ffc7fff8000","0x480680017fff8000","0x0","0x48127ffb7fff8000","0x208b7fff7fff7ffe","0x480a7ffa7fff8000","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x1104800180018000","0x61","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff41","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffd92","0x48127ffa7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffdf0","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffd91","0x48127ffa7fff8000","0x48127ff07fff8000","0x48127ff07fff8000","0x480a7ffd7fff8000","0x480680017fff8000","0x0","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffe98","0x48127ffd7fff8000","0x48127ffe7fff8000","0x480a7ffd7fff8000","0x48127fbc7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffefa","0x48127ffe7fff8000","0x48127fe37fff8000","0x48127ffd7fff8000","0x208b7fff7fff7ffe","0x482680017ffd8000","0x1","0x402a7ffd7ffc7fff","0x480280007ffb8000","0x480280017ffb8000","0x480280027ffb8000","0x480280007ffd8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffd8","0x40780017fff7fff","0x1","0x48127ffc7fff8000","0x48127ffc7fff8000","0x48127ffc7fff8000","0x480680017fff8000","0x0","0x48127ffb7fff8000","0x208b7fff7fff7ffe","0x480a7ffb7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffdc6","0x48127ffe7fff8000","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x48127ffc7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffe8e","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffd5d","0x48127ffa7fff8000","0x48127ffa7fff8000","0x48127ffa7fff8000","0x48127fbd7fff8000","0x480680017fff8000","0x0","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffe92","0x48127f847fff8000","0x480680017fff8000","0x1","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffe64","0x48127ffd7fff8000","0x48127ffe7fff8000","0x48127f497fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffee0","0x48127ffe7fff8000","0x48127fe47fff8000","0x48127ffd7fff8000","0x208b7fff7fff7ffe","0x402b7ffd7ffc7ffd","0x480280007ffb8000","0x480280017ffb8000","0x480280027ffb8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffdc","0x40780017fff7fff","0x1","0x48127ffc7fff8000","0x48127ffc7fff8000","0x48127ffc7fff8000","0x480680017fff8000","0x0","0x48127ffb7fff8000","0x208b7fff7fff7ffe","0x480a7ffb7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffd96","0x48127ffe7fff8000","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x48127ffc7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffedc","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffd2d","0x48127ffa7fff8000","0x48127ffa7fff8000","0x48127ffa7fff8000","0x208b7fff7fff7ffe","0x208b7fff7fff7ffe","0x40780017fff7fff","0x2","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffffe","0x400780017fff8000","0x0","0x400780017fff8001","0x0","0x48127ffe7fff8000","0x208b7fff7fff7ffe","0x20780017fff7ffc","0x5","0x480a7ffa7fff8000","0x480a7ffd7fff8000","0x208b7fff7fff7ffe","0x40780017fff7fff","0x1","0x482680017ffc8000","0x800000000000011000000000000000000000000000000000000000000000000","0x40337fff7ffb8000","0x480a7ffb7fff8000","0x480a7ffa7fff8000","0x480a7ffd7fff8000","0x48317ffd80008000","0x400080007ffd7ffe","0x480080007ffc8000","0x400080017ffc7fff","0x482480017ffb8000","0x1","0x482480017ffb8000","0x3","0x480080027ffa8000","0x20680017fff7ffb","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffff8","0x208b7fff7fff7ffe","0x40780017fff7fff","0x2","0x480a7ffa7fff8000","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x480280007ffb8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffe2","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffd5","0x40137ffd7fff8000","0x480280017ffb8000","0x40297ffd7fff8001","0x48127ffb7fff8000","0x48127ffc7fff8000","0x208b7fff7fff7ffe","0x40780017fff7fff","0x2","0x480a7ffb7fff8000","0x480280007ffc8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffcd9","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffc6","0x40137ffd7fff8000","0x480280017ffc8000","0x402580017fff8001","0x1","0x48127ffb7fff8000","0x48127ffc7fff8000","0x208b7fff7fff7ffe","0x480a7ffc7fff8000","0x480280007ffd8000","0x480280017ffd8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffccb","0x208b7fff7fff7ffe","0x40780017fff7fff","0x1","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffcc3","0x40137fff7fff8000","0x480a7ffb7fff8000","0x480a7ffd7fff8000","0x480680017fff8000","0x3c0ba99f1a18bcdc81fcbcb6b4f15a9a6725f937075aed6fac107ffcb147068","0x4829800080008000","0x480a80007fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffd1b","0x482480017fff8000","0x1","0x40307ffe7ffd7fff","0x48127ffc7fff8000","0x480a7ffc7fff8000","0x480080007ffc8000","0x208b7fff7fff7ffe","0x40780017fff7fff","0x3","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffcaf","0x40137fff7fff8000","0x4003800080007ffc","0x400380007ffa7ffc","0x402780017ffa8001","0x1","0x4826800180008000","0x1","0x40297ffc7fff8002","0x4826800180008000","0x1","0x480a7ffd7fff8000","0x480a7ffc7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffcaa","0x480a7ff97fff8000","0x480a7ffb7fff8000","0x480680017fff8000","0x79dc0da7c54b95f10aa182ad0a46400db63156920adb65eca2654c0945a463","0x4829800080008002","0x480a80007fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffcfa","0x48127ffd7fff8000","0x480a80017fff8000","0x208b7fff7fff7ffe","0x40780017fff7fff","0x3","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffc92","0x40137fff7fff8000","0x4003800080007ffc","0x400380007ffa7ffc","0x402780017ffa8001","0x1","0x4826800180008000","0x1","0x40297ffc7fff8002","0x4826800180008000","0x1","0x480a7ffd7fff8000","0x480a7ffc7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffc8d","0x480a7ff97fff8000","0x480a7ffb7fff8000","0x480680017fff8000","0x3ea3b9a8522d36784cb325f9c7e2ec3c9f3e6d63031a6c6b8743cc22412f604","0x4829800080008002","0x480a80007fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffcdd","0x48127ffd7fff8000","0x480a80017fff8000","0x208b7fff7fff7ffe","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x480680017fff8000","0x3fc801c47df4de8d5835f8bfd4d0b8823ba63e5a3f278086901402d680abfc","0x208b7fff7fff7ffe","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffffa","0x480a7ffb7fff8000","0x48127ffe7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffcf3","0x48127ffe7fff8000","0x48127ff57fff8000","0x48127ff57fff8000","0x48127ffc7fff8000","0x208b7fff7fff7ffe","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffed","0x480a7ffa7fff8000","0x48127ffe7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffced","0x48127ff67fff8000","0x48127ff67fff8000","0x208b7fff7fff7ffe","0x480a7ffb7fff8000","0x480680017fff8000","0x1ac8d354f2e793629cb233a16f10d13cf15b9c45bbc620577c8e1df95ede545","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffc58","0x480a7ffc7fff8000","0x48127ffe7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffc8a","0x48127fe17fff8000","0x48127ffd7fff8000","0x48127ffd7fff8000","0x208b7fff7fff7ffe","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffff0","0x480a7ffa7fff8000","0x48127ffe7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffccb","0x48127ffe7fff8000","0x48127ff57fff8000","0x48127ff57fff8000","0x48127ffc7fff8000","0x208b7fff7fff7ffe","0x480a7ffa7fff8000","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffe2","0x480a7ff97fff8000","0x48127ffe7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffcc4","0x48127ff67fff8000","0x48127ff67fff8000","0x208b7fff7fff7ffe","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x480680017fff8000","0x5d2e9527cbeb1a51aa084b0de7501f343b7b1bf24a0c427d6204a7b7988970","0x208b7fff7fff7ffe","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffffa","0x480a7ffb7fff8000","0x48127ffe7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffcac","0x48127ffe7fff8000","0x48127ff57fff8000","0x48127ff57fff8000","0x48127ffc7fff8000","0x208b7fff7fff7ffe","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffed","0x480a7ffa7fff8000","0x48127ffe7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffca6","0x48127ff67fff8000","0x48127ff67fff8000","0x208b7fff7fff7ffe","0x40780017fff7fff","0x4","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffc10","0x40137fff7fff8000","0x480680017fff8000","0x2e8a4ec40a36a027111fafdb6a46746ff1b0125d5067fbaebd8b5f227185a1e","0x4002800080007fff","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffc0a","0x40137fff7fff8001","0x4003800080017ff9","0x4003800180017ffa","0x4003800280017ffb","0x400380007ff87ffb","0x402780017ff88002","0x1","0x4826800180018000","0x3","0x40297ffb7fff8003","0x4826800180018000","0x3","0x480a7ffc7fff8000","0x480a7ffb7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffc03","0x4003800080037ffd","0x4826800180038000","0x1","0x480a7ff77fff8000","0x480680017fff8000","0x1","0x480a80007fff8000","0x4828800180007ffc","0x480a80017fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffc86","0x480a80027fff8000","0x208b7fff7fff7ffe","0x40780017fff7fff","0x4","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffbe9","0x40137fff7fff8000","0x480680017fff8000","0x3ef46b1f8c5c94765c1d63fb24422442ea26f49289a18ba89c4138ebf450f6c","0x4002800080007fff","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffbe3","0x40137fff7fff8001","0x4003800080017ff9","0x4003800180017ffa","0x4003800280017ffb","0x400380007ff87ffb","0x402780017ff88002","0x1","0x4826800180018000","0x3","0x40297ffb7fff8003","0x4826800180018000","0x3","0x480a7ffc7fff8000","0x480a7ffb7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffbdc","0x4003800080037ffd","0x4826800180038000","0x1","0x480a7ff77fff8000","0x480680017fff8000","0x1","0x480a80007fff8000","0x4828800180007ffc","0x480a80017fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffc5f","0x480a80027fff8000","0x208b7fff7fff7ffe","0x40780017fff7fff","0x4","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffbc2","0x40137fff7fff8000","0x480680017fff8000","0x1205ec81562fc65c367136bd2fe1c0fff2d1986f70e4ba365e5dd747bd08753","0x4002800080007fff","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffbbc","0x40137fff7fff8001","0x4003800080017ffa","0x4003800180017ffb","0x4003800280017ffc","0x400380007ff97ffc","0x402780017ff98002","0x1","0x4826800180018000","0x3","0x40297ffc7fff8003","0x4826800180018000","0x3","0x480a7ffd7fff8000","0x480a7ffc7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffbb5","0x480a7ff87fff8000","0x480680017fff8000","0x1","0x480a80007fff8000","0x4829800180008003","0x480a80017fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffc3b","0x480a80027fff8000","0x208b7fff7fff7ffe","0x40780017fff7fff","0x2","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffb9e","0x40137fff7fff8000","0x480680017fff8000","0x2c6e1be7705f64cd4ec61d51a0c8e64ceed5e787198bd3291469fb870578922","0x4002800080007fff","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffb98","0x40137fff7fff8001","0x4003800080017ffd","0x4826800180018000","0x1","0x480a7ffb7fff8000","0x480680017fff8000","0x1","0x480a80007fff8000","0x4828800180007ffc","0x480a80017fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffc23","0x480a7ffc7fff8000","0x208b7fff7fff7ffe","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff5b","0x208b7fff7fff7ffe","0x40780017fff7fff","0x1","0x4003800080007ffc","0x4826800180008000","0x1","0x480a7ffd7fff8000","0x4828800080007ffe","0x480a80007fff8000","0x208b7fff7fff7ffe","0x402b7ffd7ffc7ffd","0x480280007ffb8000","0x480280017ffb8000","0x480280027ffb8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffee","0x48127ffe7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffff1","0x48127ff47fff8000","0x48127ff47fff8000","0x48127ffb7fff8000","0x48127ffb7fff8000","0x48127ffb7fff8000","0x208b7fff7fff7ffe","0x480a7ff77fff8000","0x480a7ff97fff8000","0x480a7ffa7fff8000","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x1a7","0x480a7ff67fff8000","0x48127ffd7fff8000","0x480a7ff87fff8000","0x48127ffc7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff14","0x208b7fff7fff7ffe","0x40780017fff7fff","0x1","0x4003800080007ffc","0x4826800180008000","0x1","0x480a7ffd7fff8000","0x4828800080007ffe","0x480a80007fff8000","0x208b7fff7fff7ffe","0x480280027ffb8000","0x480280027ffd8000","0x400080007ffe7fff","0x482680017ffd8000","0x3","0x480280027ffd8000","0x48307fff7ffe8000","0x482480017fff8000","0x1","0x402a7ffd7ffc7fff","0x480280027ffb8000","0x480280007ffb8000","0x480280017ffb8000","0x482480017ffd8000","0x1","0x480280007ffd8000","0x480280017ffd8000","0x480280027ffd8000","0x482680017ffd8000","0x3","0x480080007ff68000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffd4","0x48127ffe7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffe0","0x48127ff47fff8000","0x48127ff47fff8000","0x48127ffb7fff8000","0x48127ffb7fff8000","0x48127ffb7fff8000","0x208b7fff7fff7ffe","0x40780017fff7fff","0x5","0x480a7ff67fff8000","0x480a7ff77fff8000","0x480a7ff87fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffe10","0x480a7ff97fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffb42","0x48127ffa7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffba7","0x40137fff7fff8000","0x48127ffe7fff8000","0x48127ff47fff8000","0x48127ff47fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffeb0","0x40137fff7fff8001","0x40137ffc7fff8002","0x40137ffe7fff8003","0x48127ffd7fff8000","0x480a7ff97fff8000","0x480a7ffa7fff8000","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x159","0x480a80027fff8000","0x48127ffd7fff8000","0x480a80037fff8000","0x48127ffc7fff8000","0x482a800180008000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffed3","0x40137ffe7fff8004","0x48127ffd7fff8000","0x48127ffe7fff8000","0x480a7ff97fff8000","0x480a7ffa7fff8000","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffef4","0x48127ffe7fff8000","0x480a80047fff8000","0x48127ffd7fff8000","0x208b7fff7fff7ffe","0x480280027ffb8000","0x480280027ffd8000","0x400080007ffe7fff","0x482680017ffd8000","0x3","0x480280027ffd8000","0x48307fff7ffe8000","0x482480017fff8000","0x1","0x402a7ffd7ffc7fff","0x480280027ffb8000","0x480280007ffb8000","0x480280017ffb8000","0x482480017ffd8000","0x1","0x480280007ffd8000","0x480280017ffd8000","0x480280027ffd8000","0x482680017ffd8000","0x3","0x480080007ff68000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffb9","0x40780017fff7fff","0x1","0x48127ffc7fff8000","0x48127ffc7fff8000","0x48127ffc7fff8000","0x480680017fff8000","0x0","0x48127ffb7fff8000","0x208b7fff7fff7ffe","0x40780017fff7fff","0x3","0x480a7ff67fff8000","0x480a7ff77fff8000","0x480a7ff87fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffdbd","0x40137ffd7fff8000","0x40137fff7fff8001","0x48127ffe7fff8000","0x480a7ff97fff8000","0x480a7ffa7fff8000","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x113","0x480a80007fff8000","0x48127ffd7fff8000","0x480a80017fff8000","0x48127ffc7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffe80","0x20680017fff7fff","0x6","0x48127ffc7fff8000","0x48127ffc7fff8000","0x48127ffc7fff8000","0x208b7fff7fff7ffe","0x48127ffc7fff8000","0x48127ffc7fff8000","0x48127ffc7fff8000","0x48127fbf7fff8000","0x480680017fff8000","0x0","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffe80","0x40137ffe7fff8002","0x48127ffd7fff8000","0x48127ffe7fff8000","0x480a7ff97fff8000","0x480a7ffa7fff8000","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffec8","0x48127ffe7fff8000","0x480a80027fff8000","0x48127ffd7fff8000","0x208b7fff7fff7ffe","0x480280027ffb8000","0x480280027ffd8000","0x400080007ffe7fff","0x482680017ffd8000","0x3","0x480280027ffd8000","0x48307fff7ffe8000","0x482480017fff8000","0x1","0x402a7ffd7ffc7fff","0x480280027ffb8000","0x480280007ffb8000","0x480280017ffb8000","0x482480017ffd8000","0x1","0x480280007ffd8000","0x480280017ffd8000","0x480280027ffd8000","0x482680017ffd8000","0x3","0x480080007ff68000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffb9","0x40780017fff7fff","0x1","0x48127ffc7fff8000","0x48127ffc7fff8000","0x48127ffc7fff8000","0x480680017fff8000","0x0","0x48127ffb7fff8000","0x208b7fff7fff7ffe","0x40780017fff7fff","0x9","0x480a7ff67fff8000","0x480a7ff77fff8000","0x480a7ff87fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffd6a","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffb62","0x40137fff7fff8000","0x48127ffd7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffb01","0x40137fff7fff8001","0x40137ffe7fff8002","0x48127ff87fff8000","0x480a7ff97fff8000","0x480a7ffa7fff8000","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0xba","0x480a80027fff8000","0x48127ffd7fff8000","0x480a80007fff8000","0x48127ffc7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffe27","0x40137fff7fff8003","0x480a80037fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffa85","0x48127ff97fff8000","0x48127ff97fff8000","0x48127ff97fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffee1","0x40137fff7fff8004","0x40137ffc7fff8005","0x40137ffd7fff8006","0x20780017fff8004","0x5","0x48127ffe7fff8000","0x10780017fff7fff","0x7","0x48127ffe7fff8000","0x480a80037fff8000","0x480a80017fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffa82","0x480a80057fff8000","0x480a80067fff8000","0x48127ffd7fff8000","0x480a7ff97fff8000","0x1104800180018000","0x8f","0x40137ffe7fff8007","0x48127ffd7fff8000","0x48127ffe7fff8000","0x480a7ff97fff8000","0x480a7ffa7fff8000","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffe89","0x48127ffe7fff8000","0x480a80077fff8000","0x48127ffd7fff8000","0x480a7ffd7fff8000","0x480a7ff97fff8000","0x1104800180018000","0x6b","0x40137ffe7fff8008","0x20780017fff7ffa","0x4","0x10780017fff7fff","0xd","0x48127ffd7fff8000","0x48127ffe7fff8000","0x480a7ffa7fff8000","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffda6","0x48127ffe7fff8000","0x480a80087fff8000","0x48127ffd7fff8000","0x208b7fff7fff7ffe","0x48127ffd7fff8000","0x48127ffe7fff8000","0x480a7ff97fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffd6c","0x20680017fff7fff","0xd","0x48127ffd7fff8000","0x48127ffd7fff8000","0x480a7ff97fff8000","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffd77","0x48127ffe7fff8000","0x480a80087fff8000","0x48127ffd7fff8000","0x208b7fff7fff7ffe","0x48127ffd7fff8000","0x480a80087fff8000","0x48127ffc7fff8000","0x208b7fff7fff7ffe","0x480280027ffb8000","0x480280027ffd8000","0x400080007ffe7fff","0x482680017ffd8000","0x3","0x480280027ffd8000","0x48307fff7ffe8000","0x482480017fff8000","0x1","0x402a7ffd7ffc7fff","0x480280027ffb8000","0x480280007ffb8000","0x480280017ffb8000","0x482480017ffd8000","0x1","0x480280007ffd8000","0x480280017ffd8000","0x480280027ffd8000","0x482680017ffd8000","0x3","0x480080007ff68000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff7d","0x40780017fff7fff","0x1","0x48127ffc7fff8000","0x48127ffc7fff8000","0x48127ffc7fff8000","0x480680017fff8000","0x0","0x48127ffb7fff8000","0x208b7fff7fff7ffe","0x480680017fff8000","0x1","0x400680017fff7fff","0x0","0x480a7ff97fff8000","0x480a7ffa7fff8000","0x480a7ffb7fff8000","0x208b7fff7fff7ffe","0x480280027ffb8000","0x480280007ffd8000","0x400080007ffe7fff","0x482680017ffd8000","0x1","0x480280007ffd8000","0x48307fff7ffe8000","0x402a7ffd7ffc7fff","0x480280027ffb8000","0x480280007ffb8000","0x480280017ffb8000","0x482480017ffd8000","0x1","0x480280007ffd8000","0x482680017ffd8000","0x1","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffe9","0x40780017fff7fff","0x1","0x48127ffc7fff8000","0x48127ffc7fff8000","0x48127ffc7fff8000","0x480680017fff8000","0x0","0x48127ffb7fff8000","0x208b7fff7fff7ffe","0x20780017fff7ffc","0x6","0x480a7ff97fff8000","0x480a7ffa7fff8000","0x480a7ffb7fff8000","0x208b7fff7fff7ffe","0x480a7ff97fff8000","0x480a7ffa7fff8000","0x480a7ffb7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffab9","0x48127ffd7fff8000","0x48127ffe7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffe2d","0x48127ffe7fff8000","0x48127fe47fff8000","0x48127ffd7fff8000","0x208b7fff7fff7ffe","0x480a7ffa7fff8000","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffca6","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffda3","0x208b7fff7fff7ffe","0x40780017fff7fff","0x0","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffcae","0x480a7ff87fff8000","0x48127ffe7fff8000","0x480a7ff97fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffcdc","0x480a7ffa7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffcd9","0x480a7ffb7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffcd6","0x480a7ffc7fff8000","0x480a7ffb7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffcc2","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffccf","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffcdd","0x208b7fff7fff7ffe","0x480a7ffa7fff8000","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffd3c","0x208b7fff7fff7ffe","0x482680017ffd8000","0x1","0x402a7ffd7ffc7fff","0x480280007ffb8000","0x480280017ffb8000","0x480280027ffb8000","0x480280007ffd8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffff3","0x40780017fff7fff","0x1","0x48127ffc7fff8000","0x48127ffc7fff8000","0x48127ffc7fff8000","0x480680017fff8000","0x0","0x48127ffb7fff8000","0x208b7fff7fff7ffe","0x480a7ff87fff8000","0x480a7ff97fff8000","0x480a7ffa7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffe01","0x48127ffc7fff8000","0x48127ffe7fff8000","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff9e2","0x48127ffd7fff8000","0x48127ff17fff8000","0x48127ff17fff8000","0x48127ffb7fff8000","0x48127ffb7fff8000","0x208b7fff7fff7ffe","0x480280007ffb8000","0x480280017ffb8000","0x480280027ffb8000","0x480a7ffa7fff8000","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffe9","0x208b7fff7fff7ffe","0x480a7ff87fff8000","0x480a7ff97fff8000","0x480a7ffa7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffde6","0x48127ffc7fff8000","0x48127ffe7fff8000","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff9d3","0x48127ffd7fff8000","0x48127ff17fff8000","0x48127ff17fff8000","0x208b7fff7fff7ffe","0x480280007ffb8000","0x480280017ffb8000","0x480280027ffb8000","0x480a7ffa7fff8000","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffeb","0x40780017fff7fff","0x1","0x48127ffc7fff8000","0x48127ffc7fff8000","0x48127ffc7fff8000","0x480680017fff8000","0x0","0x48127ffb7fff8000","0x208b7fff7fff7ffe"]} ================================================ FILE: contract-artifacts/Token/ERC20.cairo/ERC20_abi.json ================================================ [{"members":[{"name":"low","offset":0,"type":"felt"},{"name":"high","offset":1,"type":"felt"}],"name":"Uint256","size":2,"type":"struct"},{"inputs":[{"name":"name","type":"felt"},{"name":"symbol","type":"felt"},{"name":"recipient","type":"felt"}],"name":"constructor","outputs":[],"type":"constructor"},{"inputs":[],"name":"name","outputs":[{"name":"name","type":"felt"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"name":"symbol","type":"felt"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"name":"totalSupply","type":"Uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"name":"decimals","type":"felt"}],"stateMutability":"view","type":"function"},{"inputs":[{"name":"account","type":"felt"}],"name":"balanceOf","outputs":[{"name":"balance","type":"Uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"name":"owner","type":"felt"},{"name":"spender","type":"felt"}],"name":"allowance","outputs":[{"name":"remaining","type":"Uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"name":"recipient","type":"felt"},{"name":"amount","type":"Uint256"}],"name":"transfer","outputs":[{"name":"success","type":"felt"}],"type":"function"},{"inputs":[{"name":"sender","type":"felt"},{"name":"recipient","type":"felt"},{"name":"amount","type":"Uint256"}],"name":"transferFrom","outputs":[{"name":"success","type":"felt"}],"type":"function"},{"inputs":[{"name":"spender","type":"felt"},{"name":"amount","type":"Uint256"}],"name":"approve","outputs":[{"name":"success","type":"felt"}],"type":"function"},{"inputs":[{"name":"spender","type":"felt"},{"name":"added_value","type":"Uint256"}],"name":"increaseAllowance","outputs":[{"name":"success","type":"felt"}],"type":"function"},{"inputs":[{"name":"spender","type":"felt"},{"name":"subtracted_value","type":"Uint256"}],"name":"decreaseAllowance","outputs":[{"name":"success","type":"felt"}],"type":"function"},{"inputs":[{"name":"recipient","type":"felt"},{"name":"amount","type":"Uint256"}],"name":"mint","outputs":[],"type":"function"},{"inputs":[{"name":"user","type":"felt"},{"name":"amount","type":"Uint256"}],"name":"burn","outputs":[],"type":"function"}] ================================================ FILE: hardhat.config.ts ================================================ /* This config file is used for running mocha tests in this repository, and not on the example repository */ import "./dist/src/index"; module.exports = {}; ================================================ FILE: package.json ================================================ { "name": "@shardlabs/starknet-hardhat-plugin", "version": "0.8.0-alpha.5", "description": "Plugin for using Starknet tools within Hardhat projects", "main": "dist/src/index.js", "files": [ "dist" ], "keywords": [ "starknet", "hardhat", "plugin", "starkware", "cairo", "compile", "deploy", "test" ], "repository": { "type": "git", "url": "https://github.com/0xSpaceShard/starknet-hardhat-plugin.git" }, "scripts": { "test-configuration-tests": "TEST_SUBDIR=configuration-tests ./scripts/test.sh", "test-general-tests": "TEST_SUBDIR=general-tests ./scripts/test.sh", "test-venv-tests": "TEST_SUBDIR=venv-tests ./scripts/test.sh", "test-integrated-devnet-tests": "TEST_SUBDIR=integrated-devnet-tests ./scripts/test.sh", "test-recompilation-tests": "TEST_SUBDIR=recompilation-tests ./scripts/test.sh", "test-dev": "./scripts/test-dev.sh", "build": "rm -rf dist && tsc && npm run copy-files", "copy-files": "cp src/*.py dist/src/", "lint": "eslint $(git ls-files '*.ts')", "format": "prettier-eslint --list-different --write $(git ls-files '*.ts' '*.js')" }, "author": "SpaceShard", "license": "MIT", "dependencies": { "@iarna/toml": "^2.2.5", "@nomiclabs/hardhat-docker": "^2.0.2", "axios": "^1.6.5", "axios-retry": "^3.9.1", "exit-hook": "2.2.1", "form-data": "^4.0.0", "glob": "^10.3.10", "shelljs": "^0.8.5", "starknet": "~5.19.3", "tar-fs": "^3.0.4" }, "peerDependencies": { "hardhat": "^2.14.0" }, "devDependencies": { "@types/chai": "^4.3.0", "@types/elliptic": "^6.4.14", "@types/glob": "^8.0.0", "@types/mocha": "^10.0.0", "@types/node": "^18.0.0", "@types/shelljs": "^0.8.11", "@types/tar-fs": "^2.0.1", "@typescript-eslint/eslint-plugin": "^5.8.1", "@typescript-eslint/parser": "^5.8.1", "chai": "^4.3.7", "eslint": "^8.5.0", "hardhat": "^2.19.4", "mocha": "^10.0.0", "prettier-eslint-cli": "^7.0.0", "ts-node": "^10.4.0", "typescript": "^5.0.0" } } ================================================ FILE: scripts/devnet-restart.sh ================================================ #!/bin/bash HOST=127.0.0.1 PORT=5050 echo "Emptying state on Devnet at $HOST:$PORT" curl -X POST "http://$HOST:$PORT/restart" ================================================ FILE: scripts/devnet-run.sh ================================================ #!/bin/bash # This script starts devnet in background and checks until it is responsive. # Outputs the PID of the bg process. set -eu HOST=127.0.0.1 PORT=5050 if [[ -n "${STARKNET_HARDHAT_DEV:-}" ]]; then echo "Running dockerized Devnet..." # Get default from config.json file # We may be inside example dir or main plugin dir # This script needs to be generic and work in both cases if [[ -e "./config.json" ]]; then STARKNET_DEVNET_DEFAULT=$(node -e "console.log(require('./config.json').STARKNET_DEVNET)") else STARKNET_DEVNET_DEFAULT=$(node -e "console.log(require('../config.json').STARKNET_DEVNET)") fi STARKNET_DEVNET="${STARKNET_DEVNET:=$STARKNET_DEVNET_DEFAULT}" docker pull -q shardlabs/starknet-devnet:$STARKNET_DEVNET container_id=$(docker run --rm --name starknet_hardhat_devnet -d -p 0.0.0.0:$PORT:$PORT shardlabs/starknet-devnet --seed 42) echo "Running devnet in container starknet_hardhat_devnet $container_id" else starknet-devnet --host $HOST --port $PORT --seed 42 >/dev/null 2>&1 & echo "Spawned devnet with PID $!" fi # Display the fact that devnet is loading by rotating a straight line | loading_chars=("|" "/" "-" "\\") total_loading_chars=${#loading_chars[@]} sleep 1 MAX_WAIT=35 # seconds for ((i = 0; i < $MAX_WAIT; i++)); do loading_char_i=$((i % total_loading_chars)) loading_char=${loading_chars[$loading_char_i]}"" echo -ne "\r Spawning Devnet $loading_char" if is_alive=$(curl -s -w "\n" "http://$HOST:$PORT/is_alive"); then echo "" echo "$is_alive" break else sleep 1 fi done if [[ $i -ge "$MAX_WAIT" ]]; then echo "Failed to run devnet :(" exit 1 fi ================================================ FILE: scripts/devnet-stop.sh ================================================ #!/bin/bash if [[ -n "${STARKNET_HARDHAT_DEV:-}" ]]; then # Stop docker devnet container docker rm -f starknet_hardhat_devnet else # Kill devnet process # specifying signal for pkill fails on mac pkill -f starknet-devnet fi ================================================ FILE: scripts/ensure-python.sh ================================================ #!/bin/bash # Ensures that pyenv uses the desired Python version (on Linux). set -eu PY_VERSION=3.9.10 if [[ "$OSTYPE" == "linux-gnu"* ]]; then which "/opt/circleci/.pyenv/versions/$PY_VERSION/bin/python" || pyenv install "$PY_VERSION" pyenv global "$PY_VERSION" fi if [[ "$OSTYPE" == "darwin"* ]]; then which "/Users/distiller/.pyenv/versions/$PY_VERSION/bin/python" || pyenv install "$PY_VERSION" pyenv global "$PY_VERSION" fi ================================================ FILE: scripts/install-devnet.sh ================================================ #!/bin/bash set -eu pip3 install "starknet-devnet==$STARKNET_DEVNET" STARKNET_DEVNET_PATH=$(which starknet-devnet) echo "starknet-devnet at: $STARKNET_DEVNET_PATH" ================================================ FILE: scripts/npm-publish.sh ================================================ #!/bin/bash set -eu LOCAL_VERSION=$(jq -r ".version" package.json) NPM_VERSION=$(npm view @shardlabs/starknet-hardhat-plugin dist-tags.latest) if [ $LOCAL_VERSION = $NPM_VERSION ]; then echo "Latest npm version is equal to current package version. Up the version to publish to npm." else npm ci npm run build # NPM access token: https://docs.npmjs.com/creating-and-viewing-access-tokens npm config set //registry.npmjs.org/:_authToken=${NPM_TOKEN} npm publish --verbose --access=public # publish docs cd www && npm ci git config --global user.email "$GIT_USER@users.noreply.github.com" git config --global user.name "$GIT_USER" echo "machine github.com login $GIT_USER password $GITHUB_TOKEN" >~/.netrc # skip ci to avoid gh-pages erroring on circleci LATEST_COMMIT_HASH=$(git rev-parse HEAD) CUSTOM_COMMIT_MESSAGE="Deploy website - based on $LATEST_COMMIT_HASH [skip ci]" \ npm run deploy fi ================================================ FILE: scripts/set-alpha-vars.sh ================================================ #!/bin/bash set -u export OZ_ACCOUNT_ADDRESS=$OZ_ACCOUNT_ADDRESS_ALPHA export OZ_ACCOUNT_PRIVATE_KEY=$OZ_ACCOUNT_PRIVATE_KEY_ALPHA export ARGENT_ACCOUNT_ADDRESS=$ARGENT_ACCOUNT_ADDRESS_ALPHA export ARGENT_ACCOUNT_PRIVATE_KEY=$ARGENT_ACCOUNT_PRIVATE_KEY_ALPHA ================================================ FILE: scripts/set-devnet-vars.sh ================================================ #!/bin/bash set -u export OZ_ACCOUNT_ADDRESS=0x347be35996a21f6bf0623e75dbce52baba918ad5ae8d83b6f416045ab22961a export OZ_ACCOUNT_PRIVATE_KEY=0xbdd640fb06671ad11c80317fa3b1799d ================================================ FILE: scripts/setup-compiler.sh ================================================ #!/bin/bash set -eu CAIRO_COMPILER_TARGET_TAG=$CAIRO_COMPILER echo "Installing cairo compiler $CAIRO_COMPILER_TARGET_TAG" CAIRO_COMPILER_ASSET_NAME="release-x86_64-unknown-linux-musl.tar.gz" if [[ "$OSTYPE" == "darwin"* ]]; then CAIRO_COMPILER_ASSET_NAME="release-aarch64-apple-darwin.tar" fi # Download compiler asset COMPILER_BINARY_URL="https://github.com/starkware-libs/cairo/releases/download/v$CAIRO_COMPILER_TARGET_TAG/$CAIRO_COMPILER_ASSET_NAME" echo "Downloading $COMPILER_BINARY_URL" curl --location -O "$COMPILER_BINARY_URL" # Unpack and remove archive tar -zxvf "$CAIRO_COMPILER_ASSET_NAME" rm -rf "$CAIRO_COMPILER_ASSET_NAME" # For verification and future use # Using absolute path to make it usable everywhere export CAIRO_1_COMPILER_DIR=$(readlink -f "cairo/bin") # Verify echo "Verifying compiler binaries" $CAIRO_1_COMPILER_DIR/starknet-compile --version $CAIRO_1_COMPILER_DIR/starknet-sierra-compile --version ================================================ FILE: scripts/setup-venv.sh ================================================ #!/bin/bash set -eu VENV=../my-venv echo "Creating venv $(pwd)/$VENV" python3 -m venv "$VENV" source "$VENV/bin/activate" echo "python at: $(which python)" echo "python version: $(python --version)" if [[ "$OSTYPE" == "darwin"* ]]; then export HOMEBREW_NO_INSTALL_CLEANUP=1 brew ls --versions gmp || brew install gmp GMP_VERSION=$(brew ls --versions gmp) GMP_VERSION=(${GMP_VERSION// / }) # Splitting by space from "gmp 6.2.1_1" GMP_VERSION=${GMP_VERSION[1]} # Take only the version GMP_DIR=$(brew --prefix gmp)/$GMP_VERSION echo "$GMP_DIR" CFLAGS=-I$GMP_DIR/include LDFLAGS=-L$GMP_DIR/lib pip3 install fastecdsa fi if [ "$TEST_SUBDIR" == "venv-tests" ]; then which "$VENV/bin/starknet" || pip3 install cairo-lang=="$(cat /tmp/cairo-lang-version)" echo "starknet at: $(which starknet)" echo "starknet version: $(starknet --version)" fi ================================================ FILE: scripts/test-dev.sh ================================================ #!/bin/bash DEVNET_CONTAINER_NAME="starknet_hardhat_devnet" # shut down container on exit trap " echo 'Stopping Devnet' docker rm -f $DEVNET_CONTAINER_NAME " EXIT # Flag: dev mode for testing (and not usual CI) export STARKNET_HARDHAT_DEV=1 export STARKNET_HARDHAT_DEV_NETWORK="integrated-devnet" cd test # Loops until a suitable TEST_SUBDIR is provided TEST_SUBDIR_PENDING="true" while [[ -n $TEST_SUBDIR_PENDING ]]; do echo "(Tab to autocomplete)" read -e -p "Test suite: " TEST_SUBDIR TEST_SUBDIR="${TEST_SUBDIR%/}" if [[ -d $TEST_SUBDIR ]]; then if [[ $TEST_SUBDIR != "${TEST_SUBDIR%-tests}" ]]; then TEST_SUBDIR_PENDING="" fi else echo "" echo "Please pick from," ls | grep '\-tests' | awk '{print " - "$1}' echo "" fi done TEST_SUBDIR="${TEST_SUBDIR%/}" # remove trailing slash cd $TEST_SUBDIR # Loops until a suitable test_name is provided TEST_NAME_PENDING="true" while [[ -n $TEST_NAME_PENDING ]]; do echo "" echo "(Tab to autocomplete)" read -e -p "Test: " test_name test_name="${test_name%/}" if [[ -d $test_name ]]; then echo "Running test $test_name from $TEST_SUBDIR" TEST_NAME_PENDING="" else echo "Please pick from," ls | awk '{print " - "$1}' echo "" fi done cd ../.. test_name="${test_name%/}" # remove trailing slash RUN_SETUP="y" CONFIG_FILE_NAME="hardhat.config.ts" if [[ -d starknet-hardhat-example/ ]]; then echo "" read -e -p "Example repo found, y to force run setup: " RUN_SETUP fi if [[ "y" == "$RUN_SETUP" ]]; then echo "" source ./scripts/setup-compilers.sh rm -rf starknet-hardhat-example git clone -b "${EXAMPLE_REPO_BRANCH:=plugin}" --single-branch https://github.com/0xSpaceShard/starknet-hardhat-example.git cd starknet-hardhat-example npm ci npm install ../ # install plugin from source (parent dir) cd .. else echo "Skipped setup." fi pwd echo "" echo "If your test needs devnet (and not integrated-devnet)," read -e -p "y to run devnet: " RUN_DEVNET if [[ "y" == "$RUN_DEVNET" ]]; then export STARKNET_HARDHAT_DEV_NETWORK="devnet" ./scripts/devnet-run.sh echo "" echo "Devnet running, to stop devnet use:" echo "+--------------------------------------+" echo "| docker rm -f $DEVNET_CONTAINER_NAME |" echo "+--------------------------------------+" fi while [[ "y" = "${CONTINUE_TESTING:-y}" ]]; do echo "" echo "Loading your latest code changes" cd starknet-hardhat-example npm install ../ # install plugin from source (parent dir) cd .. echo "" TEST_SUBDIR=$TEST_SUBDIR ./scripts/test.sh $test_name echo "" echo "----------------------------------------------" echo "" read -e -p "Re-run the test? (Y/n) " CONTINUE_TESTING done ================================================ FILE: scripts/test-setup.sh ================================================ #!/bin/bash set -eu set -o pipefail trap 'for killable in $(jobs -p); do kill -9 $killable; done' EXIT # log versions ./scripts/versions.sh ./scripts/ensure-python.sh # setup example repo rm -rf starknet-hardhat-example EXAMPLE_REPO_BRANCH="plugin" if [[ "$CIRCLE_BRANCH" == "master" ]] && [[ "$EXAMPLE_REPO_BRANCH" != "plugin" ]]; then # prevents using starknet-hardhat-example branch other than "plugin" when starknet-hardhat-plugin PRs are merged echo "Invalid example repo branch: $EXAMPLE_REPO_BRANCH" exit 1 fi git clone -b "$EXAMPLE_REPO_BRANCH" --single-branch git@github.com:0xSpaceShard/starknet-hardhat-example.git cd starknet-hardhat-example git log -n 1 npm ci npm install ../ # install plugin from source (parent dir) # if docker is available on the system pull docker image CAIRO_CLI_DOCKER_REPOSITORY_WITH_TAG=$(node -e "console.log(require('../dist/src/constants.js').CAIRO_CLI_DOCKER_REPOSITORY_WITH_TAG)") if docker --version >/dev/null 2>&1; then docker pull "$CAIRO_CLI_DOCKER_REPOSITORY_WITH_TAG" fi # used by some cases ../scripts/setup-venv.sh # install scarb SCARB_VERSION=$(jq -r ".SCARB_VERSION" ../config.json) curl --proto '=https' --tlsv1.2 -sSf https://docs.swmansion.com/scarb/install.sh | bash -s -- -v "$SCARB_VERSION" ================================================ FILE: scripts/test.sh ================================================ #!/bin/bash set -eu CONFIG_FILE_NAME="hardhat.config.ts" if [[ -z "${STARKNET_HARDHAT_DEV:-}" ]]; then ./scripts/test-setup.sh ./scripts/install-devnet.sh fi source ./scripts/setup-compiler.sh cd ./starknet-hardhat-example total=0 success=0 test_dir="../test/$TEST_SUBDIR" test_name_specified=${1:-} if [ ! -d "$test_dir" ]; then echo "Invalid test directory: $test_dir" exit -1 fi function run_test() { test_case="$1" network="$2" test_name=$(basename $test_case) network_file="$test_case/network.json" [ "$network" == "devnet" ] && ../scripts/devnet-restart.sh if [[ ! -f "$network_file" ]]; then echo "Test failed! Error: No network file provided!" total=$((total + 1)) return 0 fi # Skip if the network file doesn't specify to run the test on the current network if [[ $(jq .[\""$network"\"] "$network_file") != true ]]; then echo "Skipping $network test for $test_name" return 0 fi total=$((total + 1)) echo "Test $total) $test_name" config_file_path="$test_case/$CONFIG_FILE_NAME" if [ ! -f "$config_file_path" ]; then echo "Test failed! Error: No config file provided!" return 0 fi # replace the dummy config (CONFIG_FILE_NAME) with the one used by this test /bin/cp "$config_file_path" "$CONFIG_FILE_NAME" # Validate config file if npx hardhat --typecheck --config "$CONFIG_FILE_NAME" 1>/dev/null; then echo "Config file is valid" else echo "Invalid config! Test failed!" # Clean up the temporary config file rm "$CONFIG_FILE_NAME" return 0 fi # check if test_case/check.ts exists if [ -f "$test_case/check.ts" ]; then # run the test NETWORK="$network" npx ts-node "$test_case/check.ts" && success=$((success + 1)) || echo "Test failed!" else echo "Error: $test_case/check.ts not found" fi rm -rf starknet-artifacts git checkout --force git clean -fd echo "----------------------------------------------" echo } function iterate_dir() { network="$1" echo "Starting tests on $network" [ "$network" == "devnet" ] && ../scripts/devnet-run.sh if [[ -n $test_name_specified ]]; then test_case_dir="$test_dir/$test_name_specified" if [ ! -d "$test_case_dir" ]; then echo "Invalid directory $test_case_dir for test case $test_name_specified" exit -1 fi run_test $test_case_dir $network else for test_case in "$test_dir"/*; do run_test $test_case $network done fi [ "$network" == "devnet" ] && ../scripts/devnet-stop.sh && sleep 5 echo "Finished tests on $network" } # perform tests on Alpha-goerli testnet only on master branch and in a linux environment # skip testing on testnet if [skip testnet] included in commit message latest_commit_msg=$(git log -1 --pretty=%B) if [[ "${CIRCLE_BRANCH:=}" == "master" ]] && [[ "$OSTYPE" == "linux-gnu"* ]] && [[ "$latest_commit_msg" != *"[skip testnet]"* ]]; then source ../scripts/set-alpha-vars.sh iterate_dir alpha fi source ../scripts/set-devnet-vars.sh if [[ -n "${STARKNET_HARDHAT_DEV:-}" ]]; then test_case_dir="$test_dir/$test_name_specified" if [ ! -d "$test_case_dir" ]; then echo "Invalid directory $test_case_dir for test case $test_name_specified" exit -1 fi # Run test for all networks run_test $test_case_dir $STARKNET_HARDHAT_DEV_NETWORK else # test integrated devnet iterate_dir integrated-devnet iterate_dir devnet fi echo "Tests passing: $success / $total" exit $((total - success)) ================================================ FILE: scripts/update-oz-account.sh ================================================ #!/bin/bash set -eu VERSION="$1" # e.g. 0.5.1 GIT_VERSION="v$VERSION" # create a venv rm -rf tmp-venv python3.9 -m venv tmp-venv source tmp-venv/bin/activate # create a tmp OZ repo TMP_REPO="tmp-cairo-contracts" rm -rf "$TMP_REPO" mkdir "$TMP_REPO" && cd "$TMP_REPO" git clone https://github.com/OpenZeppelin/cairo-contracts/ . git checkout "$GIT_VERSION" # install prerequisite pip install cairo-nile && nile init # compile the contract nile compile src/openzeppelin/account/presets/Account.cairo --cairo_path src # return to project root so that tmp repo can be deleted cd .. cp_target="contract-artifacts/OpenZeppelinAccount/$VERSION/Account.cairo/" mkdir -p "$cp_target" cp "$TMP_REPO/artifacts/Account.json" "$cp_target/Account.json" cp "$TMP_REPO/artifacts/abis/Account.json" "$cp_target/Account_abi.json" rm -rf "$TMP_REPO" deactivate && rm -rf tmp-venv # Remove debug_info from the artifact and minify # Update directory/file names containing the version # Adapt to ABI changes # Update expected test paths and addresses # Update docs ================================================ FILE: scripts/versions.sh ================================================ #!/bin/bash # Logs used versions set -eu echo "node: $(node --version)" echo "npm: $(npm --version)" #these two commands may return different versions (e.g. if using circleci/node and remote docker) echo "docker --version: $(docker --version)" echo "docker version: $(docker version)" echo "python3: $(python3 --version)" echo "pip3: $(pip3 --version)" ================================================ FILE: src/account-utils.ts ================================================ import axios, { AxiosError } from "axios"; import { HardhatRuntimeEnvironment } from "hardhat/types"; import fs from "node:fs"; import path from "node:path"; import { ec, hash, stark } from "starknet"; import { ABI_SUFFIX, INTERNAL_ARTIFACTS_DIR, TransactionHashPrefix, TRANSACTION_VERSION, StarknetChainId } from "./constants"; import { StarknetPluginError } from "./starknet-plugin-error"; import * as starknet from "./starknet-types"; import { Cairo1ContractClass, iterativelyCheckStatus, Numeric, StarknetContract, StringMap } from "./types"; import { numericToHexString } from "./utils"; export type CallParameters = { toContract: StarknetContract; functionName: string; calldata?: StringMap; }; type KeysType = { publicKey: string; privateKey: string; }; export function signMultiCall(messageHash: string, privateKey: string): bigint[] { const publicKey = ec.starkCurve.getStarkKey(privateKey); if (publicKey === "0x0") { return [BigInt(0), BigInt(0)]; } const signature = ec.starkCurve.sign(BigInt(messageHash).toString(16), privateKey); return [signature.r, signature.s]; } /** * Move from an internal directory to the user's artifacts. * @param contractDir the subdirectory internally holding the artifact * @returns the new path where the artifacts can be found */ export function handleInternalContractArtifacts( contractDir: string, contractName: string, artifactsVersion: string, hre: HardhatRuntimeEnvironment ): string { // Name of the artifacts' parent folder const artifactsBase = contractName + ".cairo"; const baseArtifactsPath = path.join(hre.config.paths.starknetArtifacts, INTERNAL_ARTIFACTS_DIR); // Full path to where the artifacts will be saved const artifactsTargetPath = path.join( baseArtifactsPath, contractDir, artifactsVersion, artifactsBase ); const jsonArtifact = contractName + ".json"; const abiArtifact = contractName + ABI_SUFFIX; const artifactsSourcePath = path.join( __dirname, "..", // necessary since artifact dir is in the root, not in src INTERNAL_ARTIFACTS_DIR, contractDir, artifactsVersion, artifactsBase ); ensureArtifact(jsonArtifact, artifactsTargetPath, artifactsSourcePath); ensureArtifact(abiArtifact, artifactsTargetPath, artifactsSourcePath); return artifactsTargetPath; } /** * Checks if the provided artifact exists in the project's artifacts folder. * If it doesn't exist, it is downloaded from the GitHub repository. * @param fileName artifact file to download. E.g. "Account.json" or "Account_abi.json" * @param artifactsTargetPath folder to where the artifacts will be downloaded. E.g. "project/starknet-artifacts/Account.cairo" * @param artifactSourcePath path to the folder where the artifacts are stored */ function ensureArtifact(fileName: string, artifactsTargetPath: string, artifactSourcePath: string) { const finalTargetPath = path.join(artifactsTargetPath, fileName); if (!fs.existsSync(finalTargetPath)) { fs.mkdirSync(artifactsTargetPath, { recursive: true }); const finalSourcePath = path.join(artifactSourcePath, fileName); fs.copyFileSync(finalSourcePath, finalTargetPath); } } /** * If no privateKey provided, generates random values, otherwise calculates from the * provided key. * @param providedPrivateKey hex string private key to use for generating the public key * @returns an object with public, private key and key pair */ export function generateKeys(providedPrivateKey?: string): KeysType { const privateKey = providedPrivateKey ?? stark.randomAddress(); const publicKey = ec.starkCurve.getStarkKey(privateKey); return { publicKey, privateKey }; } const INITIAL_NONCE = "0x0"; export function calculateDeployAccountHash( accountAddress: string, constructorCalldata: string[], salt: string, classHash: string, maxFee: string, chainId: StarknetChainId ) { const calldataHash = hash.computeHashOnElements([classHash, salt, ...constructorCalldata]); return hash.computeHashOnElements([ TransactionHashPrefix.DEPLOY_ACCOUNT, numericToHexString(TRANSACTION_VERSION), accountAddress, 0, // entrypoint selector is implied calldataHash, maxFee, chainId, INITIAL_NONCE ]); } export async function sendDeployAccountTx( signatures: string[], classHash: string, constructorCalldata: string[], salt: string, maxFee: string ) { const hre = await import("hardhat"); const resp = await axios .post(`${hre.starknet.networkConfig.url}/gateway/add_transaction`, { max_fee: maxFee, signature: signatures, nonce: INITIAL_NONCE, class_hash: classHash, contract_address_salt: salt, constructor_calldata: constructorCalldata, version: numericToHexString(TRANSACTION_VERSION), type: "DEPLOY_ACCOUNT" }) .catch((error: AxiosError) => { const msg = `Deploying account failed: ${error.response.data.message}`; throw new StarknetPluginError(msg, error); }); return new Promise((resolve, reject) => { iterativelyCheckStatus( resp.data.transaction_hash, hre.starknetWrapper, () => resolve(resp.data.transaction_hash), reject ); }); } export async function sendDeclareV2Tx( signatures: string[], compiledClassHash: string, maxFee: Numeric, senderAddress: string, version: Numeric, nonce: Numeric, contractClass: Cairo1ContractClass ) { const hre = await import("hardhat"); const resp = await axios .post(`${hre.starknet.networkConfig.url}/gateway/add_transaction`, { type: "DECLARE", contract_class: contractClass.getCompiledClass(), signature: signatures, sender_address: senderAddress, compiled_class_hash: compiledClassHash, version: numericToHexString(version), nonce: numericToHexString(nonce), max_fee: numericToHexString(maxFee) }) .catch((error: AxiosError) => { const msg = `Declaring contract failed: ${error.response.data.message}`; throw new StarknetPluginError(msg, error); }); return new Promise((resolve, reject) => { iterativelyCheckStatus( resp.data.transaction_hash, hre.starknetWrapper, () => resolve(resp.data.transaction_hash), reject ); }); } export async function sendEstimateFeeTx(data: unknown) { const hre = await import("hardhat"); // To resolve TypeError: Do not know how to serialize a BigInt // coming from axios (BigInt.prototype as any).toJSON = function () { return this.toString(); }; const resp = await axios .post(`${hre.starknet.networkConfig.url}/feeder_gateway/estimate_fee`, data) .catch((error: AxiosError) => { const msg = `Estimating fees failed: ${error.response.data.message}`; throw new StarknetPluginError(msg, error); }); const { gas_price, gas_usage, overall_fee, unit } = resp.data; return { amount: BigInt(overall_fee), unit, gas_price: BigInt(gas_price), gas_usage: BigInt(gas_usage) } as starknet.FeeEstimation; } ================================================ FILE: src/account.ts ================================================ import { constants, ec, hash, selector, BigNumberish, Call, RawCalldata } from "starknet"; import { calculateDeployAccountHash, CallParameters, generateKeys, handleInternalContractArtifacts, sendDeclareV2Tx, sendDeployAccountTx, sendEstimateFeeTx, signMultiCall } from "./account-utils"; import { QUERY_VERSION, StarknetChainId, TransactionHashPrefix, TRANSACTION_VERSION, UDC_DEPLOY_FUNCTION_NAME } from "./constants"; import { getTransactionReceiptUtil } from "./extend-utils"; import { StarknetPluginError } from "./starknet-plugin-error"; import * as starknet from "./starknet-types"; import { ContractInteractionFunction, DeclareOptions, DeployAccountOptions, DeployOptions, EstimateFeeOptions, InteractChoice, InteractOptions, InvokeOptions, InvokeResponse, Numeric, StarknetContract, StarknetContractFactory, StringMap } from "./types"; import { numericToHexString, copyWithBigint, generateRandomSalt, UDC, readContract, bnToDecimalStringArray, estimatedFeeToMaxFee, readCairo1Contract } from "./utils"; type ExecuteCallParameters = { to: bigint; selector: BigNumberish; data_offset: number; data_len: number; }; /** * Representation of an Account. * Multiple implementations can exist, each will be defined by an extension of this Abstract class */ export abstract class Account { public publicKey: string; protected constructor( public starknetContract: StarknetContract, public privateKey: string, public salt: string, protected deployed: boolean ) { this.publicKey = ec.starkCurve.getStarkKey(privateKey); } /** * Uses the account contract as a proxy to invoke a function on the target contract with a signature * * @param toContract target contract to be called * @param functionName function in the contract to be called * @param calldata calldata to use as input for the contract call */ async invoke( toContract: StarknetContract, functionName: string, calldata?: StringMap, options?: InvokeOptions ): Promise { if (options?.maxFee && options?.overhead) { const msg = "maxFee and overhead cannot be specified together"; throw new StarknetPluginError(msg); } if (options?.maxFee === undefined || options?.maxFee === null) { const maxFee = await this.estimateFee(toContract, functionName, calldata, options); options = { ...options, maxFee: estimatedFeeToMaxFee(maxFee.amount, options?.overhead) }; } return ( await this.interact(InteractChoice.INVOKE, toContract, functionName, calldata, options) ).toString(); } get address() { return this.starknetContract.address; } /** * Deploy another contract using this account * @param contractFactory the factory of the contract to be deployed * @param constructorArguments * @param options extra options * @returns the deployed StarknetContract */ async deploy( contractFactory: StarknetContractFactory, constructorArguments?: StringMap, options: DeployOptions = {} ): Promise { const classHash = await contractFactory.getClassHash(); const udc = await UDC.getInstance(); const adaptedArgs = contractFactory.handleConstructorArguments(constructorArguments); const deployTxHash = await this.invoke( udc, UDC_DEPLOY_FUNCTION_NAME, { classHash, salt: options?.salt ?? generateRandomSalt(), unique: BigInt(options?.unique ?? true), calldata: adaptedArgs }, { maxFee: options?.maxFee, nonce: options?.nonce } ); const hre = await import("hardhat"); const deploymentReceipt = await getTransactionReceiptUtil(deployTxHash, hre); const decodedEvents = udc.decodeEvents(deploymentReceipt.events); // the only event should be ContractDeployed const deployedContractAddress = numericToHexString(decodedEvents[0].data.address); const deployedContract = contractFactory.getContractAt(deployedContractAddress); deployedContract.deployTxHash = deployTxHash; return deployedContract; } protected assertNotDeployed() { if (this.deployed) { const msg = "The account is not expected to be deployed."; throw new StarknetPluginError(msg); } } private assertDeployed() { if (!this.deployed) { const msg = "Prior to usage, the account must be funded and deployed."; throw new StarknetPluginError(msg); } } async estimateFee( toContract: StarknetContract, functionName: string, calldata?: StringMap, options?: EstimateFeeOptions ): Promise { return await this.interact( InteractChoice.ESTIMATE_FEE, toContract, functionName, calldata, options ); } private async estimateDeclareV2Fee( contractFactory: StarknetContractFactory, options: EstimateFeeOptions = {} ): Promise { const maxFee = (options.maxFee || 0).toString(); const version = hash.feeTransactionVersion_2; const nonce = options.nonce == null ? await this.getNonce() : options.nonce; const hre = await import("hardhat"); const chainId = hre.starknet.networkConfig.starknetChainId; const compiledClassHash = await hre.starknetWrapper.getCompiledClassHash( contractFactory.casmPath ); const classHash = await hre.starknetWrapper.getSierraContractClassHash( contractFactory.metadataPath ); const messageHash = hash.calculateDeclareTransactionHash( classHash, this.address, version, maxFee, chainId as unknown as constants.StarknetChainId, nonce, compiledClassHash ); const signatures = this.getSignatures(messageHash); const data = { type: "DECLARE", sender_address: this.address, compiled_class_hash: compiledClassHash, contract_class: readCairo1Contract(contractFactory.metadataPath).getCompiledClass(), signature: bnToDecimalStringArray(signatures || []), version: numericToHexString(version), nonce: numericToHexString(nonce) }; return await sendEstimateFeeTx(data); } async estimateDeclareFee( contractFactory: StarknetContractFactory, options: EstimateFeeOptions = {} ): Promise { if (contractFactory.isCairo1()) { return await this.estimateDeclareV2Fee(contractFactory, options); } const nonce = options.nonce == null ? await this.getNonce() : options.nonce; const maxFee = (options.maxFee || 0).toString(); const hre = await import("hardhat"); const classHash = await hre.starknetWrapper.getClassHash(contractFactory.metadataPath); const chainId = hre.starknet.networkConfig.starknetChainId; const calldata = [classHash]; const calldataHash = hash.computeHashOnElements(calldata); const messageHash = hash.computeHashOnElements([ TransactionHashPrefix.DECLARE, numericToHexString(QUERY_VERSION), this.address, 0, // entrypoint selector is implied calldataHash, maxFee, chainId, numericToHexString(nonce) ]); const signature = this.getSignatures(messageHash); const data = { type: "DECLARE", sender_address: this.address, contract_class: readContract(contractFactory.metadataPath), signature: bnToDecimalStringArray(signature || []), version: numericToHexString(QUERY_VERSION), nonce: numericToHexString(nonce) }; return await sendEstimateFeeTx(data); } async estimateDeployFee( contractFactory: StarknetContractFactory, constructorArguments?: StringMap, options: EstimateFeeOptions = {} ): Promise { const classHash = await contractFactory.getClassHash(); const udc = await UDC.getInstance(); const adaptedArgs = contractFactory.handleConstructorArguments(constructorArguments); const calldata: StringMap = { classHash, salt: options?.salt ?? generateRandomSalt(), unique: BigInt(options?.unique ?? true), calldata: adaptedArgs }; return await this.estimateFee(udc, UDC_DEPLOY_FUNCTION_NAME, calldata, options); } private async interact( choice: InteractChoice, toContract: StarknetContract, functionName: string, calldata?: StringMap, options?: InteractOptions ) { const call: CallParameters = { functionName: functionName, toContract: toContract, calldata: calldata }; return await this.multiInteract(choice, [call], options); } /** * Performs multiple invokes as a single transaction through this account * @param callParameters an array with the parameters for each invoke * @returns the transaction hash of the invoke */ async multiInvoke(callParameters: CallParameters[], options?: InvokeOptions): Promise { // Invoke only returns one transaction hash, as the multiple invokes are done by the account contract, but only one is sent to it. return await this.multiInteract(InteractChoice.INVOKE, callParameters, options); } /** * Estimate the fee of the multicall. * @param callParameters an array with the parameters for each call * @returns the total estimated fee */ async multiEstimateFee( callParameters: CallParameters[], options?: EstimateFeeOptions ): Promise { return await this.multiInteract(InteractChoice.ESTIMATE_FEE, callParameters, options); } private async multiInteract( choice: InteractChoice, callParameters: CallParameters[], options: InteractOptions = {} ) { this.assertDeployed(); options = copyWithBigint(options); options.maxFee = BigInt(options?.maxFee || "0"); const nonce = options.nonce == null ? await this.getNonce() : options.nonce; delete options.nonce; // the options object is incompatible if passed on with nonce const hre = await import("hardhat"); const { messageHash, args } = this.handleMultiInteract( this.address, callParameters, nonce, options.maxFee, choice.transactionVersion, hre.starknet.networkConfig.starknetChainId, options.rawInput ); if (options.signature) { const msg = "Custom signature cannot be specified when using Account (it is calculated automatically)"; throw new StarknetPluginError(msg); } const contractInteractOptions = { signature: this.getSignatures(messageHash), ...options, rawInput: false // rawInput shouldn't affect validating args of __execute__ }; const contractInteractor = (( this.starknetContract[choice.internalCommand] )).bind(this.starknetContract); const executionFunctionName = this.getExecutionFunctionName(); return contractInteractor(executionFunctionName, args, contractInteractOptions); } /** * Prepares the calldata and hashes the message for the multicall execution * * @param accountAddress address of the account contract * @param callParameters array with the call parameters * @param nonce current nonce * @param maxFee the maximum fee amount set for the contract interaction * @param version the transaction version * @param chainId the ID of the chain * @param rawInput if `true`, interprets calldata as already adapted into an array * @returns the message hash for the multicall and the arguments to execute it with */ private handleMultiInteract( accountAddress: string, callParameters: CallParameters[], nonce: Numeric, maxFee: Numeric, version: Numeric, chainId: StarknetChainId, rawInput: boolean ) { const callArray: Call[] = callParameters.map((callParameters) => { const calldata = rawInput ? callParameters.calldata : callParameters.toContract.adaptInput( callParameters.functionName, callParameters.calldata ); return { contractAddress: callParameters.toContract.address, entrypoint: callParameters.functionName, calldata }; }); const executeCallArray: ExecuteCallParameters[] = []; const rawCalldata: RawCalldata = []; // Parse the Call array to create the objects which will be accepted by the contract callArray.forEach((call) => { const calldata = call.calldata as BigNumberish[]; executeCallArray.push({ to: BigInt(call.contractAddress), selector: selector.starknetKeccak(call.entrypoint), data_offset: rawCalldata.length, data_len: calldata.length }); rawCalldata.push(...calldata); }); const adaptedNonce = nonce.toString(); const adaptedMaxFee = numericToHexString(maxFee); const adaptedVersion = numericToHexString(version); const messageHash = this.getMessageHash( TransactionHashPrefix.INVOKE, accountAddress, callArray, adaptedNonce, adaptedMaxFee, adaptedVersion, chainId ); const args = { call_array: executeCallArray, calldata: rawCalldata }; return { messageHash, args }; } protected abstract getMessageHash( transactionHashPrefix: TransactionHashPrefix, accountAddress: string, callArray: Call[], nonce: string, maxFee: string, version: string, chainId: StarknetChainId ): string; protected abstract getSignatures(messageHash: string): bigint[]; protected abstract estimateDeployAccountFee(): Promise; public abstract deployAccount(options?: DeployAccountOptions): Promise; protected getExecutionFunctionName() { return "__execute__"; } private async getNonce(): Promise { const hre = await import("hardhat"); return await hre.starknet.getNonce(this.address); } /** * Declare the contract class corresponding to the `contractFactory` * @param contractFactory * @param options * @returns transaction hash */ public async declare( contractFactory: StarknetContractFactory, options: DeclareOptions = {} ): Promise { if (contractFactory.isCairo1()) { return await this.declareV2(contractFactory, options); } let maxFee = options?.maxFee; if (maxFee && options?.overhead) { const msg = "maxFee and overhead cannot be specified together"; throw new StarknetPluginError(msg); } const nonce = options.nonce == null ? await this.getNonce() : options.nonce; if (maxFee === undefined || maxFee === null) { const estimatedDeclareFee = await this.estimateDeclareFee(contractFactory, options); maxFee = estimatedFeeToMaxFee(estimatedDeclareFee.amount, options?.overhead); } const hre = await import("hardhat"); const classHash = await hre.starknetWrapper.getClassHash(contractFactory.metadataPath); const chainId = hre.starknet.networkConfig.starknetChainId; const calldata = [classHash]; const calldataHash = hash.computeHashOnElements(calldata); const messageHash = hash.computeHashOnElements([ TransactionHashPrefix.DECLARE, TRANSACTION_VERSION.toString(), this.address, 0, // entrypoint selector is implied calldataHash, maxFee.toString(), chainId, nonce.toString() ]); const signature = this.getSignatures(messageHash); return contractFactory.declare({ nonce, signature, token: options.token, sender: this.address, maxFee: BigInt(maxFee) }); } private async declareV2( contractFactory: StarknetContractFactory, options: DeclareOptions = {} ): Promise { let maxFee = options?.maxFee; if (maxFee && options?.overhead) { const msg = "maxFee and overhead cannot be specified together"; throw new StarknetPluginError(msg); } const nonce = options.nonce == null ? await this.getNonce() : options.nonce; if (maxFee === undefined || maxFee === null) { const estimatedDeclareFee = await this.estimateDeclareV2Fee(contractFactory, options); maxFee = estimatedFeeToMaxFee(estimatedDeclareFee.amount, options?.overhead); } const version = hash.transactionVersion_2; const hre = await import("hardhat"); const chainId = hre.starknet.networkConfig.starknetChainId; const compiledClassHash = await hre.starknetWrapper.getCompiledClassHash( contractFactory.casmPath ); const classHash = await hre.starknetWrapper.getSierraContractClassHash( contractFactory.metadataPath ); const messageHash = hash.calculateDeclareTransactionHash( classHash, this.address, version, maxFee, chainId as unknown as constants.StarknetChainId, nonce, compiledClassHash ); const signatures = this.getSignatures(messageHash); return sendDeclareV2Tx( bnToDecimalStringArray(signatures), compiledClassHash, maxFee, this.address, version, nonce, readCairo1Contract(contractFactory.metadataPath) ); } } /** * Wrapper for the OpenZeppelin implementation of an Account */ export class OpenZeppelinAccount extends Account { private static contractFactory: StarknetContractFactory; protected constructor( starknetContract: StarknetContract, privateKey: string, salt: string, deployed: boolean ) { super(starknetContract, privateKey, salt, deployed); } private static async getContractFactory() { const hre = await import("hardhat"); if (!this.contractFactory) { const contractPath = handleInternalContractArtifacts( "OpenZeppelinAccount", "Account", "0.5.1", hre ); this.contractFactory = await hre.starknet.getContractFactory(contractPath); } return this.contractFactory; } /** * Generates a new key pair if none specified. * The created account needs to be deployed using the `deployAccount` method. * @param options * @returns an undeployed instance of account */ public static async createAccount( options: { salt?: string; privateKey?: string; } = {} ): Promise { const signer = generateKeys(options.privateKey); const salt = options.salt || generateRandomSalt(); const contractFactory = await this.getContractFactory(); const address = hash.calculateContractAddressFromHash( salt, await contractFactory.getClassHash(), [signer.publicKey], "0x0" // deployer address ); const contract = contractFactory.getContractAt(address); return new this(contract, signer.privateKey, salt, false); } protected override getMessageHash( transactionHashPrefix: TransactionHashPrefix, accountAddress: string, callArray: Call[], nonce: string, maxFee: string, version: string, chainId: StarknetChainId ): string { const hashable: BigNumberish[] = [callArray.length]; const rawCalldata: RawCalldata = []; callArray.forEach((call) => { const calldata = call.calldata as BigNumberish[]; hashable.push( call.contractAddress, hash.starknetKeccak(call.entrypoint), rawCalldata.length, calldata.length ); rawCalldata.push(...calldata); }); hashable.push(rawCalldata.length, ...rawCalldata); const calldataHash = hash.computeHashOnElements(hashable); return hash.computeHashOnElements([ transactionHashPrefix, version, accountAddress, 0, // entrypoint selector is implied calldataHash, maxFee, chainId, nonce ]); } protected override getSignatures(messageHash: string): bigint[] { return signMultiCall(messageHash, this.privateKey); } public override async estimateDeployAccountFee(): Promise { this.assertNotDeployed(); const hre = await import("hardhat"); const contractFactory = await OpenZeppelinAccount.getContractFactory(); const classHash = await contractFactory.getClassHash(); const constructorCalldata = [BigInt(this.publicKey).toString()]; const maxFee = numericToHexString(0); const nonce = numericToHexString(0); const calldataHash = hash.computeHashOnElements([ classHash, this.salt, ...constructorCalldata ]); const msgHash = hash.computeHashOnElements([ TransactionHashPrefix.DEPLOY_ACCOUNT, numericToHexString(QUERY_VERSION), this.address, 0, // entrypoint selector is implied calldataHash, maxFee, hre.starknet.networkConfig.starknetChainId, nonce ]); const signature = this.getSignatures(msgHash); const data = { type: "DEPLOY_ACCOUNT", class_hash: classHash, constructor_calldata: constructorCalldata, contract_address_salt: this.salt, signature: bnToDecimalStringArray(signature || []), version: numericToHexString(QUERY_VERSION), nonce }; return await sendEstimateFeeTx(data); } public override async deployAccount(options: DeployAccountOptions = {}): Promise { this.assertNotDeployed(); const hre = await import("hardhat"); let maxFee = options?.maxFee; if (maxFee && options?.overhead) { const msg = "maxFee and overhead cannot be specified together"; throw new StarknetPluginError(msg); } if (maxFee === undefined || maxFee === null) { const estimatedDeployFee = await this.estimateDeployAccountFee(); maxFee = estimatedFeeToMaxFee(estimatedDeployFee.amount, options?.overhead); } const contractFactory = await OpenZeppelinAccount.getContractFactory(); const classHash = await contractFactory.getClassHash(); const constructorCalldata = [BigInt(this.publicKey).toString()]; const msgHash = calculateDeployAccountHash( this.address, constructorCalldata, this.salt, classHash, numericToHexString(maxFee), hre.starknet.networkConfig.starknetChainId ); const deploymentTxHash = await sendDeployAccountTx( this.getSignatures(msgHash).map((val) => val.toString()), classHash, constructorCalldata, this.salt, numericToHexString(maxFee) ); this.starknetContract.deployTxHash = deploymentTxHash; this.deployed = true; return deploymentTxHash; } static async getAccountFromAddress( address: string, privateKey: string ): Promise { const contractFactory = await this.getContractFactory(); const contract = contractFactory.getContractAt(address); const { publicKey: expectedPubKey } = await contract.call("getPublicKey"); const publicKey = ec.starkCurve.getStarkKey(privateKey); if (BigInt(publicKey) !== expectedPubKey) { throw new StarknetPluginError( "The provided private key is not compatible with the public key stored in the contract." ); } return new this(contract, privateKey, undefined, true); } } /** * Wrapper for the Argent implementation of Account */ export class ArgentAccount extends Account { private static readonly VERSION: string = "780760e4156afe592bb1feff7e769cf279ae9831"; private static proxyContractFactory: StarknetContractFactory; private static implementationContractFactory: StarknetContractFactory; private static readonly PROXY_CLASS_HASH = "0x25ec026985a3bf9d0cc1fe17326b245dfdc3ff89b8fde106542a3ea56c5a918"; private static readonly IMPLEMENTATION_CLASS_HASH = "0x33434ad846cdd5f23eb73ff09fe6fddd568284a0fb7d1be20ee482f044dabe2"; public guardianPublicKey: string; public guardianPrivateKey: string; protected constructor( starknetContract: StarknetContract, privateKey: string, guardianPrivateKey: string, salt: string, deployed: boolean ) { super(starknetContract, privateKey, salt, deployed); this.guardianPrivateKey = guardianPrivateKey; if (this.guardianPrivateKey) { const guardianSigner = generateKeys(this.guardianPrivateKey); this.guardianPublicKey = guardianSigner.publicKey; } } private static async getImplementationContractFactory() { const hre = await import("hardhat"); if (!this.implementationContractFactory) { const contractPath = handleInternalContractArtifacts( "ArgentAccount", "ArgentAccount", this.VERSION, hre ); this.implementationContractFactory = await hre.starknet.getContractFactory( contractPath ); } return this.implementationContractFactory; } private static async getProxyContractFactory() { const hre = await import("hardhat"); if (!this.proxyContractFactory) { const contractPath = handleInternalContractArtifacts( "ArgentAccount", "Proxy", this.VERSION, hre ); this.proxyContractFactory = await hre.starknet.getContractFactory(contractPath); } return this.proxyContractFactory; } private static generateGuardianPublicKey(guardianPrivateKey: string) { if (!guardianPrivateKey) { return "0x0"; } return generateKeys(guardianPrivateKey).publicKey; } /** * Generates a new key pair if none specified. * Does NOT generate a new guardian key pair if none specified. * If you don't specify a guardian private key, no guardian will be assigned. * The created account needs to be deployed using the `deployAccount` method. * @param options * @returns an undeployed instance of account */ public static async createAccount( options: { salt?: string; privateKey?: string; guardianPrivateKey?: string; } = {} ): Promise { const signer = generateKeys(options.privateKey); const guardianPrivateKey = options?.guardianPrivateKey; const guardianPublicKey = this.generateGuardianPublicKey(guardianPrivateKey); const salt = options.salt || generateRandomSalt(); const constructorCalldata = [ this.IMPLEMENTATION_CLASS_HASH, selector.getSelectorFromName("initialize"), "2", signer.publicKey, guardianPublicKey ]; const address = hash.calculateContractAddressFromHash( salt, this.PROXY_CLASS_HASH, constructorCalldata, "0x0" // deployer address ); const proxyContractFactory = await this.getProxyContractFactory(); const contract = proxyContractFactory.getContractAt(address); return new this(contract, signer.privateKey, guardianPrivateKey, salt, false); } protected getMessageHash( transactionHashPrefix: TransactionHashPrefix, accountAddress: string, callArray: Call[], nonce: string, maxFee: string, version: string, chainId: StarknetChainId ): string { const hashable: BigNumberish[] = [callArray.length]; const rawCalldata: RawCalldata = []; callArray.forEach((call) => { const calldata = call.calldata as BigNumberish[]; hashable.push( call.contractAddress, selector.starknetKeccak(call.entrypoint), rawCalldata.length, calldata.length ); rawCalldata.push(...calldata); }); hashable.push(rawCalldata.length, ...rawCalldata); const calldataHash = hash.computeHashOnElements(hashable); return hash.computeHashOnElements([ transactionHashPrefix, version, accountAddress, 0, // entrypoint selector is implied calldataHash, maxFee, chainId, nonce ]); } protected override getSignatures(messageHash: string): bigint[] { const signatures = signMultiCall(messageHash, this.privateKey); if (this.guardianPrivateKey) { const guardianSignatures = signMultiCall(messageHash, this.guardianPrivateKey); signatures.push(...guardianSignatures); } return signatures; } public override async estimateDeployAccountFee(): Promise { this.assertNotDeployed(); const hre = await import("hardhat"); const nonce = numericToHexString(0); const maxFee = numericToHexString(0); const constructorCalldata: string[] = [ ArgentAccount.IMPLEMENTATION_CLASS_HASH, selector.getSelectorFromName("initialize"), "2", this.publicKey, ArgentAccount.generateGuardianPublicKey(this.guardianPrivateKey) ].map((val) => BigInt(val).toString()); const calldataHash = hash.computeHashOnElements([ ArgentAccount.PROXY_CLASS_HASH, this.salt, ...constructorCalldata ]); const msgHash = hash.computeHashOnElements([ TransactionHashPrefix.DEPLOY_ACCOUNT, numericToHexString(QUERY_VERSION), this.address, 0, // entrypoint selector is implied calldataHash, maxFee, hre.starknet.networkConfig.starknetChainId, nonce ]); const signature = this.getSignatures(msgHash); const data = { type: "DEPLOY_ACCOUNT", class_hash: ArgentAccount.PROXY_CLASS_HASH, constructor_calldata: constructorCalldata, contract_address_salt: this.salt, signature: bnToDecimalStringArray(signature || []), version: numericToHexString(QUERY_VERSION), nonce }; return await sendEstimateFeeTx(data); } /** * Deploys (initializes) the account. * @param options * @returns the tx hash of the deployment */ public override async deployAccount(options: DeployAccountOptions = {}): Promise { this.assertNotDeployed(); const hre = await import("hardhat"); let maxFee = options?.maxFee; if (maxFee && options?.overhead) { const msg = "maxFee and overhead cannot be specified together"; throw new StarknetPluginError(msg); } if (maxFee === undefined || maxFee === null) { const estimatedDeployFee = await this.estimateDeployAccountFee(); maxFee = estimatedFeeToMaxFee(estimatedDeployFee.amount, options?.overhead); } const constructorCalldata: string[] = [ ArgentAccount.IMPLEMENTATION_CLASS_HASH, selector.getSelectorFromName("initialize"), "2", this.publicKey, ArgentAccount.generateGuardianPublicKey(this.guardianPrivateKey) ].map((val) => BigInt(val).toString()); const msgHash = calculateDeployAccountHash( this.address, constructorCalldata, this.salt, ArgentAccount.PROXY_CLASS_HASH, numericToHexString(maxFee), hre.starknet.networkConfig.starknetChainId ); const deploymentTxHash = await sendDeployAccountTx( this.getSignatures(msgHash).map((val) => val.toString()), ArgentAccount.PROXY_CLASS_HASH, constructorCalldata, this.salt, numericToHexString(maxFee) ); const implementationFactory = await ArgentAccount.getImplementationContractFactory(); this.starknetContract.setImplementation(implementationFactory); this.starknetContract.deployTxHash = deploymentTxHash; this.deployed = true; return deploymentTxHash; } /** * Updates the guardian key in the contract. Set it to `undefined` to remove the guardian. * @param newGuardianPrivateKey private key of the guardian to update * @returns hash of the transaction which changes the guardian */ public async setGuardian( newGuardianPrivateKey?: string, invokeOptions?: InvokeOptions ): Promise { let guardianPublicKey: string; if (!BigInt(newGuardianPrivateKey || 0)) { newGuardianPrivateKey = undefined; guardianPublicKey = undefined; } else { guardianPublicKey = ec.starkCurve.getStarkKey(newGuardianPrivateKey); } const call: CallParameters = { functionName: "changeGuardian", toContract: this.starknetContract, calldata: { newGuardian: BigInt(guardianPublicKey || 0) } }; const txHash = await this.multiInvoke([call], invokeOptions); // set after signing this.guardianPrivateKey = newGuardianPrivateKey; this.guardianPublicKey = guardianPublicKey; return txHash; } /** * Returns an account previously deployed to `address`. * A check is performed if the public key stored in the account matches the provided `privateKey`. * No check is done for the optional guardian private key. * @param address * @param privateKey * @param options * @returns the retrieved account */ static async getAccountFromAddress( address: string, privateKey: string, options: { guardianPrivateKey?: string; } = {} ): Promise { const contractFactory = await this.getProxyContractFactory(); const contract = contractFactory.getContractAt(address); const implementationFactory = await this.getImplementationContractFactory(); contract.setImplementation(implementationFactory); const { signer: expectedPubKey } = await contract.call("getSigner"); const publicKey = ec.starkCurve.getStarkKey(privateKey); if (expectedPubKey === BigInt(0)) { // not yet initialized } else if (BigInt(publicKey) !== expectedPubKey) { throw new StarknetPluginError( "The provided private key is not compatible with the public key stored in the contract." ); } return new this(contract, privateKey, options.guardianPrivateKey, undefined, true); } } ================================================ FILE: src/adapt.ts ================================================ import { BigNumberish, num } from "starknet"; import { StarknetPluginError } from "./starknet-plugin-error"; import { HEXADECIMAL_REGEX, LEN_SUFFIX_DEPRECATED } from "./constants"; import * as starknet from "./starknet-types"; import { StringMap } from "./types"; const NAMED_TUPLE_DELIMITER = ": "; const ARGUMENTS_DELIMITER = ", "; const COMMON_NUMERIC_TYPES = [ "felt", "core::felt252", "core::integer::u8", "core::integer::u16", "core::integer::u32", "core::integer::u64", "core::integer::u128", "core::starknet::contract_address::ContractAddress", "core::starknet::class_hash::ClassHash", "core::starknet::eth_address::EthAddress" ]; const ARRAY_TYPE_PREFIX = "core::array::Array::<"; const ARRAY_TYPE_SUFFIX = ">"; function isNumeric(value: { toString: () => string }) { if (value === undefined || value === null) { return false; } const strValue = value.toString(); const decimalRegex = /^-?\d+$/; return decimalRegex.test(strValue) || HEXADECIMAL_REGEX.test(strValue); } const PRIME = BigInt(2) ** BigInt(251) + BigInt(17) * BigInt(2) ** BigInt(192) + BigInt(1); const PRIME_FLOOR = BigInt("0x400000000000008800000000000000000000000000000000000000000000000"); // Math.floor(PRIME / 2) function toNumericString(value: { toString: () => string }) { const num = BigInt(value.toString()); const nonNegativeNum = ((num % PRIME) + PRIME) % PRIME; return nonNegativeNum.toString(); } function isNamedTuple(type: string): boolean { return type.includes(NAMED_TUPLE_DELIMITER); } function isTuple(type: string): boolean { return type[0] === "(" && type[type.length - 1] === ")"; } function isArrayDeprecated(type: string): boolean { return type.endsWith("*"); } function isArray(type: string): boolean { return type.startsWith(ARRAY_TYPE_PREFIX) && type.endsWith(ARRAY_TYPE_SUFFIX); } function isBool(type: string): boolean { return type == "core::bool"; } function isU256(type: string): boolean { return type == "core::integer::u256"; } function validateAndConvertBooleanInput(value: any, errorMsg: string): string { if (typeof value !== "boolean" && typeof value !== "number") { throw new StarknetPluginError(errorMsg); } const numericValue = Number(value); if (numericValue !== 0 && numericValue !== 1) { throw new StarknetPluginError(errorMsg); } return toNumericString(numericValue); } const U128_MAX = (BigInt(1) << BigInt(128)) - BigInt(1); function validateAndConvertU256Input(value: any, errorMsg: string): string[] { if (typeof value !== "number" && typeof value !== "bigint") { throw new StarknetPluginError(errorMsg); } value = BigInt(value); const lo = value & U128_MAX; const hi = value >> BigInt(128); return [toNumericString(lo), toNumericString(hi)]; } function convertOutputToBoolean(type: bigint): boolean { return type ? true : false; } function convertOutputToU256(lo: bigint, hi: bigint): bigint { return (BigInt(hi) << BigInt(128)) | BigInt(lo); } // Can't use String.split since ':' also can be inside type // Ex: x : (y : felt, z: SomeStruct) function parseNamedTuple(namedTuple: string): starknet.Argument { const index = namedTuple.indexOf(NAMED_TUPLE_DELIMITER); const name = namedTuple.substring(0, index); const type = namedTuple.substring(name.length + NAMED_TUPLE_DELIMITER.length); return { name, type }; } // Returns types of tuple function extractMemberTypes(s: string): string[] { // Replace all top-level tuples with '#' const specialSymbol = "#"; let i = 0; let tmp = ""; const replacedSubStrings: string[] = []; while (i < s.length) { if (s[i] === "(") { let counter = 1; const openingBracket = i; // Move to next element after '(' i++; // As invariant we assume that cairo compiler checks // that num of '(' === num of ')' so we will terminate // before i > s.length while (counter) { if (s[i] === ")") { counter--; } if (s[i] === "(") { counter++; } i++; } replacedSubStrings.push(s.substring(openingBracket, i)); // replace tuple with special symbol tmp += specialSymbol; // Move index back on last ')' i--; } else { tmp += s[i]; } i++; } let specialSymbolCounter = 0; // Now can split as all tuples replaced with '#' return tmp.split(ARGUMENTS_DELIMITER).map((type) => { // if type contains '#' then replace it with replaced substring if (type.includes(specialSymbol)) { return type.replace(specialSymbol, replacedSubStrings[specialSymbolCounter++]); } else { return type; } }); } /** * Adapts an object of named input arguments to an array of stringified arguments in the correct order. * * E.g. If your contract has a function * ```text * func double_sum(x: felt, y: felt) -> (res: felt): * return (res=(x + y) * 2) * end * ``` * then running * ```typescript * const abi = readAbi(...); * const funcName = "double_sum"; * const inputSpecs = abi[funcName].inputs; * const adapted = adaptInputUtil(funcName, {x: 1, y: 2}, inputSpecs, abi); * console.log(adapted); * ``` * will yield * ```text * > ["1", "2"] * ``` * @param functionName the name of the function whose input is adapted * @param input the input object containing function arguments under their names * @param inputSpecs ABI specifications extracted from function.inputs * @param abi the ABI artifact of compilation, parsed into an object * @returns array containing stringified function arguments in the correct order */ export function adaptInputUtil( functionName: string, input: any, inputSpecs: starknet.Argument[], abi: starknet.Abi, isCairo1: boolean ): string[] { const adapted: string[] = []; // User won't pass array length as an argument for Cairo 0.x, so subtract the number of array elements to the expected amount of arguments const countDeprecatedArrays = isCairo1 ? 0 : inputSpecs.filter((i) => isArrayDeprecated(i.type)).length; const expectedInputCount = inputSpecs.length - countDeprecatedArrays; // Initialize an array with the user input const inputLen = Object.keys(input || {}).length; if (expectedInputCount != inputLen) { const msg = `${functionName}: Expected ${expectedInputCount} argument${ expectedInputCount === 1 ? "" : "s" }, got ${inputLen}.`; throw new StarknetPluginError(msg); } let lastSpec: starknet.Argument = { type: null, name: null }; for (let i = 0; i < inputSpecs.length; ++i) { const inputSpec = inputSpecs[i]; const currentValue = input[inputSpec.name]; if (COMMON_NUMERIC_TYPES.includes(inputSpec.type)) { const errorMsg = `${functionName}: Expected "${inputSpec.name}" to be a felt (Numeric); ` + `got: ${typeof currentValue}`; if (isNumeric(currentValue)) { adapted.push(toNumericString(currentValue)); } else if (!isCairo1 && inputSpec.name.endsWith(LEN_SUFFIX_DEPRECATED)) { const nextSpec = inputSpecs[i + 1]; const arrayName = inputSpec.name.slice(0, -LEN_SUFFIX_DEPRECATED.length); if ( nextSpec && nextSpec.name === arrayName && isArrayDeprecated(nextSpec.type) && arrayName in input ) { // will add array length in next iteration } else { throw new StarknetPluginError(errorMsg); } } else { throw new StarknetPluginError(errorMsg); } } else if (isBool(inputSpec.type)) { const errorMsg = `${functionName}: Expected "${inputSpec.name}" to be a boolean, or 0/1; got ${currentValue}`; const value = validateAndConvertBooleanInput(currentValue, errorMsg); adapted.push(value); } else if (isU256(inputSpec.type)) { const errorMsg = `${functionName}: Expected "${inputSpec.name}" to be numeric, got ${currentValue}`; const values = validateAndConvertU256Input(currentValue, errorMsg); adapted.push(...values); } else if (isArrayDeprecated(inputSpec.type)) { if (!Array.isArray(currentValue)) { const msg = `${functionName}: Expected ${inputSpec.name} to be a ${inputSpec.type}`; throw new StarknetPluginError(msg); } const lenName = `${inputSpec.name}${LEN_SUFFIX_DEPRECATED}`; if (lastSpec.name !== lenName || lastSpec.type !== "felt") { const msg = `${functionName}: Array size argument ${lenName} (felt) must appear right before ${inputSpec.name} (${inputSpec.type}).`; throw new StarknetPluginError(msg); } // Remove the * from the spec type const inputSpecArrayElement = { name: inputSpec.name, type: inputSpec.type.slice(0, -1) }; adapted.push(currentValue.length.toString()); for (const element of currentValue) { adaptComplexInput(element, inputSpecArrayElement, abi, adapted); } } else if (isArray(inputSpec.type)) { if (!Array.isArray(currentValue)) { const msg = `${functionName}: Expected ${inputSpec.name} to be a ${inputSpec.type}`; throw new StarknetPluginError(msg); } // Strip the core::Array::array prefix and suffix const inputSpecArrayElement = { name: inputSpec.name, type: inputSpec.type.slice( ARRAY_TYPE_PREFIX.length, inputSpec.type.length - ARRAY_TYPE_SUFFIX.length ) }; adapted.push(currentValue.length.toString()); for (const element of currentValue) { adaptComplexInput(element, inputSpecArrayElement, abi, adapted); } } else { const nestedInput = input[inputSpec.name]; adaptComplexInput(nestedInput, inputSpec, abi, adapted); } lastSpec = inputSpec; } return adapted; } /** * Similar to `adaptComplexOutput`, but for input. Collects `input` parts into `adaptedArray`. * @param input object to be adapted; containing either a struct, a tuple * or in the final case that stops the recursion - a number (felt) * @param inputSpec specification on how `input` should be interpreted * @param abi the ABI resulting form contract compilation * @param adaptedArray the array where stringified args are accumulated * @returns nothing; everything is accumulated into `adaptedArray` */ function adaptComplexInput( input: any, inputSpec: starknet.Argument, abi: starknet.Abi, adaptedArray: string[] ): void { const type = inputSpec.type; if (input === undefined || input === null) { throw new StarknetPluginError(`${inputSpec.name} is ${input}`); } if (COMMON_NUMERIC_TYPES.includes(type)) { if (isNumeric(input)) { adaptedArray.push(toNumericString(input)); return; } const msg = `Expected ${inputSpec.name} to be a felt`; throw new StarknetPluginError(msg); } if (isBool(type)) { const msg = `Expected ${inputSpec.name} to be a boolean or 0/1; got ${input}`; const value = validateAndConvertBooleanInput(input, msg); adaptedArray.push(value); return; } if (isU256(type)) { const msg = `Expected ${inputSpec.name} to be numeric; got ${input}`; const values = validateAndConvertU256Input(input, msg); adaptedArray.push(...values); return; } if (isTuple(type)) { const memberTypes = extractMemberTypes(type.slice(1, -1)); if (isNamedTuple(type)) { // Initialize an array with the user input const inputLen = Object.keys(input || {}).length; if (inputLen !== memberTypes.length) { const msg = `"${inputSpec.name}": Expected ${memberTypes.length} member${ memberTypes.length === 1 ? "" : "s" }, got ${inputLen}.`; throw new StarknetPluginError(msg); } for (let i = 0; i < inputLen; i++) { const memberSpec = parseNamedTuple(memberTypes[i]); const nestedInput = input[memberSpec.name]; adaptComplexInput(nestedInput, memberSpec, abi, adaptedArray); } } else { if (!Array.isArray(input)) { const msg = `Expected ${inputSpec.name} to be a tuple`; throw new StarknetPluginError(msg); } if (input.length != memberTypes.length) { const msg = `"${inputSpec.name}": Expected ${memberTypes.length} member${ memberTypes.length === 1 ? "" : "s" }, got ${input.length}.`; throw new StarknetPluginError(msg); } for (let i = 0; i < input.length; ++i) { const memberSpec = { name: `${inputSpec.name}[${i}]`, type: memberTypes[i] }; const nestedInput = input[i]; adaptComplexInput(nestedInput, memberSpec, abi, adaptedArray); } } return; } if (isNamedTuple(type)) { const memberSpec = parseNamedTuple(type); const nestedInput = input[memberSpec.name]; adaptComplexInput(nestedInput, memberSpec, abi, adaptedArray); return; } // otherwise a struct adaptStructInput(input, inputSpec, abi, adaptedArray); } function adaptStructInput( input: any, inputSpec: starknet.Argument, abi: starknet.Abi, adaptedArray: string[] ) { const type = inputSpec.type; if (!(type in abi)) { throw new StarknetPluginError(`Type ${type} not present in ABI.`); } const struct = abi[type]; const countArrays = struct.members.filter((i) => isArrayDeprecated(i.type)).length; const expectedInputCount = struct.members.length - countArrays; // Initialize an array with the user input const inputLen = Object.keys(input || {}).length; if (expectedInputCount != inputLen) { const msg = `"${inputSpec.name}": Expected ${expectedInputCount} member${ expectedInputCount === 1 ? "" : "s" }, got ${inputLen}.`; throw new StarknetPluginError(msg); } for (let i = 0; i < struct.members.length; ++i) { const memberSpec = struct.members[i]; const nestedInput = input[memberSpec.name]; adaptComplexInput(nestedInput, memberSpec, abi, adaptedArray); } } /** * resultIndex initially expected to be at value indicating array length */ function adaptArray(result: bigint[], resultIndex: number, arrayType: string, abi: starknet.Abi) { const elementType = arrayType.slice( ARRAY_TYPE_PREFIX.length, arrayType.length - ARRAY_TYPE_SUFFIX.length ); const adaptedArray = []; // Iterate over the result array, starting with current `resultIndex` const expectedLength = Number(result[resultIndex++]); for (let i = 0; i < expectedLength; i++) { // Generate a struct with each element of the array and push it to `adaptedArray` const ret = generateComplexOutput(result, resultIndex, elementType, abi); adaptedArray.push(ret.generatedComplex); // Next index is the proper raw index returned from generating the struct, which accounts for nested structs resultIndex = ret.newRawIndex; } return { adaptedArray, newResultIndex: resultIndex }; } /** * Adapts the string resulting from a Starknet CLI function call or server purpose of adapting event * This is done according to the actual output type specified by the called function. * * @param rawResult the actual result in the form of an unparsed string * @param outputSpecs array of starknet types in the expected function output * @param abi the ABI of the contract whose function was called */ export function adaptOutputUtil( rawResult: string, outputSpecs: starknet.Argument[], abi: starknet.Abi ): any { const splitStr = rawResult.split(" "); const result: bigint[] = []; for (const num of splitStr) { const parsed = num[0] === "-" ? BigInt(num.substring(1)) * BigInt(-1) : BigInt(num); result.push(parsed); } let resultIndex = 0; let lastSpec: starknet.Argument = { type: null, name: null }; const adapted: StringMap = {}; for (const outputSpec of outputSpecs) { const currentValue = result[resultIndex]; if (COMMON_NUMERIC_TYPES.includes(outputSpec.type)) { adapted[outputSpec.name] = currentValue; resultIndex++; } else if (isBool(outputSpec.type)) { adapted[outputSpec.name] = convertOutputToBoolean(currentValue); resultIndex++; } else if (isU256(outputSpec.type)) { const lo = currentValue; const hi = result[++resultIndex]; adapted[outputSpec.name] = convertOutputToU256(lo, hi); resultIndex++; } else if (isArrayDeprecated(outputSpec.type)) { // Assuming lastSpec refers to the array size argument; not checking its name - done during compilation if (lastSpec.type !== "felt") { const msg = `Array size argument (felt) must appear right before ${outputSpec.name} (${outputSpec.type}).`; throw new StarknetPluginError(msg); } // Remove * from the spec type const outputSpecArrayElementType = outputSpec.type.slice(0, -1); const arrLength = parseInt(adapted[lastSpec.name]); const structArray = []; // Iterate over the struct array, starting with results at `resultIndex` for (let i = 0; i < arrLength; i++) { // Generate a struct with each element of the array and push it to `structArray` const ret = generateComplexOutput( result, resultIndex, outputSpecArrayElementType, abi ); structArray.push(ret.generatedComplex); // Next index is the proper raw index returned from generating the struct, which accounts for nested structs resultIndex = ret.newRawIndex; } // New resultIndex is the raw index generated from the last struct adapted[outputSpec.name] = structArray; } else if (isArray(outputSpec.type)) { const ret = adaptArray(result, resultIndex, outputSpec.type, abi); resultIndex = ret.newResultIndex; adapted[outputSpec.name] = ret.adaptedArray; } else { const ret = generateComplexOutput(result, resultIndex, outputSpec.type, abi); adapted[outputSpec.name] = ret.generatedComplex; resultIndex = ret.newRawIndex; } lastSpec = outputSpec; } // If adapted obj (StringMap) has undefined key then return only the value if (outputSpecs.length === 1 && !outputSpecs[0].name) { return adapted.undefined; } return adapted; } /** * Uses the numbers in the `raw` array to generate a tuple/struct of the provided `type`. * * @param raw array of `felt` instances (numbers) used as material for generating the complex type * @param rawIndex current position within the `raw` array * @param type type to extract from `raw`, beginning at `rawIndex` * @param abi the ABI from which types are taken * @returns an object consisting of the next unused index and the generated tuple/struct itself */ function generateComplexOutput(raw: bigint[], rawIndex: number, type: string, abi: starknet.Abi) { if (COMMON_NUMERIC_TYPES.includes(type)) { return { generatedComplex: raw[rawIndex], newRawIndex: rawIndex + 1 }; } if (isBool(type)) { return { generatedComplex: convertOutputToBoolean(raw[rawIndex]), newRawIndex: rawIndex + 1 }; } if (isU256(type)) { return { generatedComplex: convertOutputToU256(raw[rawIndex], raw[rawIndex + 1]), newRawIndex: rawIndex + 2 }; } let generatedComplex: any = null; if (isTuple(type)) { const members = extractMemberTypes(type.slice(1, -1)); if (isNamedTuple(type)) { generatedComplex = {}; for (const member of members) { const memberSpec = parseNamedTuple(member); const ret = generateComplexOutput(raw, rawIndex, memberSpec.type, abi); generatedComplex[memberSpec.name] = ret.generatedComplex; rawIndex = ret.newRawIndex; } } else { generatedComplex = []; for (const member of members) { const ret = generateComplexOutput(raw, rawIndex, member, abi); generatedComplex.push(ret.generatedComplex); rawIndex = ret.newRawIndex; } } } else if (isArray(type)) { const ret = adaptArray(raw, rawIndex, type, abi); generatedComplex = ret.adaptedArray; rawIndex = ret.newResultIndex; } else { // struct if (!(type in abi)) { throw new StarknetPluginError(`Type ${type} not present in ABI.`); } generatedComplex = {}; const struct = abi[type]; for (const member of struct.members) { const ret = generateComplexOutput(raw, rawIndex, member.type, abi); generatedComplex[member.name] = ret.generatedComplex; rawIndex = ret.newRawIndex; } } return { generatedComplex, newRawIndex: rawIndex }; } /** * Reproduces felt response formating corresponding to the Starknet CLI contract call. * Based on https://github.com/starkware-libs/cairo-lang/blob/v0.12.1a0/src/starkware/cairo/lang/tracer/tracer_data.py#L261. */ export function formatFelt(value: BigNumberish): string { const shiftedValue = ((BigInt(value) + PRIME_FLOOR) % PRIME) - PRIME_FLOOR; const shiftedAbs = shiftedValue < 0n ? -shiftedValue : shiftedValue; if (shiftedAbs < 2 ** 40) return shiftedValue.toString(); if (shiftedAbs < 2 ** 100) return num.toHex(shiftedValue); return num.toHex(value); } ================================================ FILE: src/cairo1-compiler.ts ================================================ import fs from "fs"; import os from "os"; import { ProcessResult } from "@nomiclabs/hardhat-docker"; import shell from "shelljs"; import path from "path"; import axios, { AxiosError } from "axios"; import { StarknetPluginError } from "./starknet-plugin-error"; import { CAIRO_COMPILER_BINARY_URL, HIDDEN_PLUGIN_COMPILER_SUBDIR, HIDDEN_PLUGIN_DIR } from "./constants"; import { StarknetConfig } from "./types/starknet"; import config from "../config.json"; import tar from "tar-fs"; import zlib from "zlib"; import { TaskArguments } from "hardhat/types"; export const exec = (args: string) => { const result = shell.exec(args, { silent: true }); return { statusCode: result.code, stdout: Buffer.from(result.stdout), stderr: Buffer.from(result.stderr) } as ProcessResult; }; interface CompilerAsset { name: string; isGzipped: boolean; } function getCompilerAsset(): CompilerAsset { const platform = os.platform(); const arch = os.arch(); if (platform === "linux" && arch === "x64") { return { name: "release-x86_64-unknown-linux-musl.tar.gz", isGzipped: true }; } else if (platform === "darwin" && arch === "arm64") { return { name: "release-aarch64-apple-darwin.tar", isGzipped: false }; } throw new Error( `Unsupported combination of platform (${platform}) and architecture (${arch}). Consider using a custom compiler (cairo1BinDir in config).` ); } export async function getCairoBinDirPath(cliArgs: TaskArguments, starknetConfig: StarknetConfig) { if (starknetConfig?.cairo1BinDir && starknetConfig?.compilerVersion) { const msg = "Error in config file. Only one of (starknet.cairo1BinDir, starknet.compilerVersion) can be specified."; throw new StarknetPluginError(msg); } // give precedence to CLI specification const customCairo1BinDir = cliArgs?.cairo1BinDir || starknetConfig?.cairo1BinDir; if (customCairo1BinDir) { assertValidCompilerBinary(customCairo1BinDir, "starknet-compile"); assertValidCompilerBinary(customCairo1BinDir, "starknet-sierra-compile"); console.log(`Using cairo compiler at ${customCairo1BinDir}`); return customCairo1BinDir; } // default to downloaded binary const compilerVersion = starknetConfig?.compilerVersion || config.CAIRO_COMPILER; const downloadDistDir = getDownloadDistDir(compilerVersion); console.log(`Using downloaded cairo compiler ${compilerVersion}`); // download if not present const downloadBinDir = path.join(downloadDistDir, "cairo", "bin"); if ( !( isValidCompilerBinary(path.join(downloadBinDir, "starknet-compile")) && isValidCompilerBinary(path.join(downloadBinDir, "starknet-sierra-compile")) ) ) { await downloadAsset(compilerVersion, downloadDistDir); } return downloadBinDir; } function assertValidCompilerBinary(binDirPath: string, command: string): void { const compilerBinaryPath = path.join(binDirPath, command); if (!fs.existsSync(compilerBinaryPath)) { throw new StarknetPluginError(`${compilerBinaryPath} not found`); } if (!isValidCompilerBinary(compilerBinaryPath)) { throw new StarknetPluginError(`${compilerBinaryPath} is not a valid compiler binary`); } } function isValidCompilerBinary(binaryPath: string): boolean { return exec([binaryPath, "--version"].join(" ")).statusCode === 0; } async function downloadAsset(version: string, distDir: string): Promise { const compilerAsset = getCompilerAsset(); const assetUrl = `${CAIRO_COMPILER_BINARY_URL}/v${version}/${compilerAsset.name}`; const resp = await axios .get(assetUrl, { responseType: "stream", onDownloadProgress: (progressEvent) => { // periodically inform the user of download progress (printed on a single line) const percentage = Math.round((progressEvent.loaded / progressEvent.total) * 100); process.stdout.write(`Downloading cairo compiler: ${version} ... ${percentage}%\r`); } }) .catch((error) => { const parent = error instanceof AxiosError && error; if (parent.response?.status === 404) { throw new Error(`\nCould not download cairo ${version}. Make sure that it exists.`); } throw new Error(`\nError downloading cairo ${version} from ${assetUrl}: ${parent}`); }); console.log(`Downloaded cairo compiler ${version}`); let pipeline = resp.data; if (compilerAsset.isGzipped) { pipeline = pipeline.pipe(zlib.createGunzip()); } const extract = tar.extract(distDir); pipeline.pipe(extract); return new Promise((resolve, _reject) => { extract.on("finish", resolve); }); } function getDownloadDistDir(version: string): string { const compilerDownloadPath = path.join( os.homedir(), HIDDEN_PLUGIN_DIR, HIDDEN_PLUGIN_COMPILER_SUBDIR, version ); return compilerDownloadPath; } ================================================ FILE: src/constants.ts ================================================ import config from "../config.json"; export const PLUGIN_NAME = "Starknet"; export const ABI_SUFFIX = "_abi.json"; // Cairo 1 compilation export const CAIRO1_ASSEMBLY_SUFFIX = ".casm"; export const CAIRO1_SIERRA_SUFFIX = ".json"; export const CAIRO1_COMPILE_BIN = "starknet-compile"; export const CAIRO1_SIERRA_COMPILE_BIN = "starknet-sierra-compile"; export const SUPPORTED_SCARB_VERSION = config["SCARB_VERSION"]; export const DEFAULT_STARKNET_SOURCES_PATH = "contracts"; export const DEFAULT_STARKNET_ARTIFACTS_PATH = "starknet-artifacts"; export const DEFAULT_STARKNET_ACCOUNT_PATH = "~/.starknet_accounts"; export const CAIRO_CLI_DOCKER_REPOSITORY = "shardlabs/cairo-cli"; export const CAIRO_CLI_DEFAULT_DOCKER_IMAGE_TAG = config["CAIRO_LANG"]; export const DEVNET_DOCKER_REPOSITORY = "shardlabs/starknet-devnet"; export const DEFAULT_DEVNET_DOCKER_IMAGE_TAG = config["STARKNET_DEVNET"]; export const DEFAULT_DEVNET_CAIRO_VM = "python"; export const AMARNA_DOCKER_REPOSITORY = "shramee/amarna"; export const AMARNA_DOCKER_IMAGE_TAG = "latest"; export const INTEGRATED_DEVNET_URL = "http://127.0.0.1:5050"; export const CAIRO_CLI_DOCKER_REPOSITORY_WITH_TAG = `${CAIRO_CLI_DOCKER_REPOSITORY}:${CAIRO_CLI_DEFAULT_DOCKER_IMAGE_TAG}`; export const INTERNAL_ARTIFACTS_DIR = "contract-artifacts"; export const HIDDEN_PLUGIN_DIR = ".starknet-hardhat-plugin"; export const HIDDEN_PLUGIN_COMPILER_SUBDIR = "cairo-compiler"; export const ALPHA_TESTNET = "alpha-goerli"; export const ALPHA_TESTNET_2 = "alpha-goerli2"; export const ALPHA_TESTNET_INTERNALLY = "alphaGoerli"; export const ALPHA_TESTNET_2_INTERNALLY = "alphaGoerli2"; export const ALPHA_MAINNET = "alpha-mainnet"; export const ALPHA_MAINNET_INTERNALLY = "alphaMainnet"; export const DEFAULT_STARKNET_NETWORK = ALPHA_TESTNET_INTERNALLY; export const ALPHA_URL = "https://alpha4.starknet.io"; export const ALPHA_GOERLI_URL_2 = "https://alpha4-2.starknet.io"; export const ALPHA_MAINNET_URL = "https://alpha-mainnet.starknet.io"; export const INTEGRATED_DEVNET = "integrated-devnet"; export const INTEGRATED_DEVNET_INTERNALLY = "integratedDevnet"; export const VOYAGER_GOERLI_CONTRACT_API_URL = "https://goerli.voyager.online/api/contract/"; export const VOYAGER_GOERLI_VERIFIED_URL = "https://goerli.voyager.online/contract/"; export const VOYAGER_GOERLI_2_CONTRACT_API_URL = "https://goerli-2.voyager.online/api/contract"; export const VOYAGER_GOERLI_2_VERIFIED_URL = "https://goerli-2.voyager.online/contract/"; export const VOYAGER_MAINNET_CONTRACT_API_URL = "https://voyager.online/api/contract/"; export const VOYAGER_MAINNET_VERIFIED_URL = "https://voyager.online/contract/"; export const CAIRO_COMPILER_BINARY_URL = "https://github.com/starkware-libs/cairo/releases/download"; export const CHECK_STATUS_TIMEOUT = 5000; // ms export const CHECK_STATUS_RECOVER_TIMEOUT = 10000; // ms export const LEN_SUFFIX_DEPRECATED = "_len"; export const SHORT_STRING_MAX_CHARACTERS = 31; export enum TransactionHashPrefix { DECLARE = "28258975365558885", // BigInt("0x" + Buffer.from("declare").toString("hex")).toString() DEPLOY = "110386840629113", DEPLOY_ACCOUNT = "2036277798190617858034555652763252", INVOKE = "115923154332517" } export enum StarknetChainId { MAINNET = "0x534e5f4d41494e", TESTNET = "0x534e5f474f45524c49", TESTNET2 = "0x534e5f474f45524c4932" } export const PREFIX_TRANSACTION = "Starknet Transaction"; export const TRANSACTION_VERSION = BigInt(1); export const DECLARE_VERSION = BigInt(2); export const QUERY_VERSION = BigInt(2) ** BigInt(128) + TRANSACTION_VERSION; export const HEXADECIMAL_REGEX = /^0x[0-9a-fA-F]+?$/; export const UDC_ADDRESS = "0x41A78E741E5AF2FEC34B695679BC6891742439F7AFB8484ECD7766661AD02BF"; export const UDC_DEPLOY_FUNCTION_NAME = "deployContract"; export const ETH_ADDRESS = "0x049d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7"; export const DOCKER_HOST = "host.docker.internal"; ================================================ FILE: src/devnet-utils.ts ================================================ import axios, { AxiosResponse, Method } from "axios"; import { Devnet, HardhatRuntimeEnvironment } from "hardhat/types"; import { selector } from "starknet"; import { StarknetPluginError } from "./starknet-plugin-error"; import { MintResponse, L2ToL1Message } from "./starknet-types"; import { Numeric } from "./types"; import { numericToHexString } from "./utils"; interface L1ToL2Message { address: string; args: { from_address: string; nonce: number; payload: Array; selector: string; to_address: string; }; block_hash: string; block_number: number; event: string; log_index: number; transaction_hash: string; transaction_index: number; } export interface FlushResponse { l1_provider: string; consumed_messages: { from_l1: Array; from_l2: Array; }; } export interface LoadL1MessagingContractResponse { address: string; l1_provider: string; } export interface L1ToL2MockTxRequest { l2_contract_address: string; l1_contract_address: string; entry_point_selector: string; payload: Array; nonce: string; paidFeeOnL1: string; } export interface L1ToL2MockTxResponse { transaction_hash: string; } export interface L2ToL1MockTxRequest { l2_contract_address: string; l1_contract_address: string; payload: Array; } export interface L2ToL1MockTxResponse { message_hash: string; } export interface SetTimeResponse { block_timestamp: number; } export interface NewBlockResponse { block_hash: string; } export interface IncreaseTimeResponse { timestamp_increased_by: number; block_hash: string; } export interface PredeployedAccount { initial_balance: number; private_key: string; public_key: string; address: string; } export class DevnetUtils implements Devnet { private axiosInstance = axios.create({ baseURL: this.endpoint, timeout: this.hre.config.starknet.requestTimeout }); constructor(private hre: HardhatRuntimeEnvironment) {} private get endpoint() { return `${this.hre.starknet.networkConfig.url}`; } private async requestHandler( url: string, method: Method, data?: unknown ): Promise { try { // Make the request return this.axiosInstance.request({ url, method, data }); } catch (error) { const parent = error instanceof Error && error; const msg = `Request failed: Could not ${method} ${url}. This is a Devnet-specific functionality. Make sure you really want to interact with Devnet and that it is running and available at ${this.endpoint}`; throw new StarknetPluginError(msg, parent); } } public async restart() { await this.requestHandler("/restart", "POST"); } public async flush() { const response = await this.requestHandler("/postman/flush", "POST"); return response.data; } public async loadL1MessagingContract(networkUrl: string, address?: string, networkId?: string) { const body = { networkId, address, networkUrl }; const response = await this.requestHandler( "/postman/load_l1_messaging_contract", "POST", body ); return response.data; } public async sendMessageToL2( l2ContractAddress: string, functionName: string, l1ContractAddress: string, payload: Numeric[], nonce: Numeric, paidFeeOnL1: Numeric ) { const body = { l2_contract_address: l2ContractAddress, entry_point_selector: selector.getSelectorFromName(functionName), l1_contract_address: l1ContractAddress, payload: payload.map((item) => numericToHexString(item)), nonce: numericToHexString(nonce), paid_fee_on_l1: numericToHexString(paidFeeOnL1) }; const response = await this.requestHandler( "/postman/send_message_to_l2", "POST", body ); return response.data; } public async consumeMessageFromL2( l2ContractAddress: string, l1ContractAddress: string, payload: Numeric[] ) { const body = { l2_contract_address: l2ContractAddress, l1_contract_address: l1ContractAddress, payload: payload.map((item) => numericToHexString(item)) }; const response = await this.requestHandler( "/postman/consume_message_from_l2", "POST", body ); return response.data; } public async increaseTime(seconds: number) { const response = await this.requestHandler("/increase_time", "POST", { time: seconds }); return response.data; } public async setTime(seconds: number) { const response = await this.requestHandler("/set_time", "POST", { time: seconds }); return response.data; } public async getPredeployedAccounts() { const response = await this.requestHandler>( "/predeployed_accounts", "GET" ); return response.data; } public async dump(path: string) { const response = await this.requestHandler("/dump", "POST", { path }); return response.data; } public async load(path: string) { const response = await this.requestHandler("/load", "POST", { path }); return response.data; } public async createBlock() { const response = await this.requestHandler("/create_block", "POST"); return response.data; } public async mint(address: string, amount: number, lite = true) { const response = await this.requestHandler("/mint", "POST", { amount, address, lite }); return response.data; } } ================================================ FILE: src/extend-utils.ts ================================================ import { Block, HardhatRuntimeEnvironment, Transaction } from "hardhat/types"; import path from "path"; import { uint256 } from "starknet"; import { handleInternalContractArtifacts } from "./account-utils"; import { ABI_SUFFIX, CAIRO1_ASSEMBLY_SUFFIX, ETH_ADDRESS, SHORT_STRING_MAX_CHARACTERS } from "./constants"; import { StarknetPluginError } from "./starknet-plugin-error"; import { TransactionReceipt, TransactionTrace } from "./starknet-types"; import { BlockIdentifier, NonceQueryOptions, StarknetContractFactory } from "./types"; import { checkArtifactExists, findPath } from "./utils"; export async function getContractFactoryUtil(hre: HardhatRuntimeEnvironment, contractPath: string) { const artifactsPath = hre.config.paths.starknetArtifacts; checkArtifactExists(artifactsPath); contractPath = contractPath.replace(/\.[^/.]+$/, ""); // remove extension const metadataSearchTarget = path.join( `${contractPath}.cairo`, `${path.basename(contractPath)}.json` ); const metadataPath = await findPath(artifactsPath, metadataSearchTarget); if (!metadataPath) { throw new StarknetPluginError( `Could not find JSON artifact for "${contractPath}.cairo". Consider recompiling your contracts.` ); } const casmSearchTarget = path.join( `${contractPath}.cairo`, `${path.basename(contractPath)}${CAIRO1_ASSEMBLY_SUFFIX}` ); const casmPath = await findPath(artifactsPath, casmSearchTarget); const abiSearchTarget = path.join( `${contractPath}.cairo`, `${path.basename(contractPath)}${ABI_SUFFIX}` ); const abiPath = await findPath(artifactsPath, abiSearchTarget); if (!abiPath) { throw new StarknetPluginError( `Could not find ABI JSON artifact for "${contractPath}.cairo". Consider recompiling your contracts.` ); } return new StarknetContractFactory({ metadataPath, casmPath, abiPath, hre }); } export function shortStringToBigIntUtil(convertibleString: string) { if (!convertibleString) { throw new StarknetPluginError("A non-empty string must be provided"); } if (convertibleString.length > SHORT_STRING_MAX_CHARACTERS) { const msg = `Short strings must have a max of ${SHORT_STRING_MAX_CHARACTERS} characters.`; throw new StarknetPluginError(msg); } const invalidChars: { [key: string]: boolean } = {}; const charArray = []; for (const c of convertibleString.split("")) { const charCode = c.charCodeAt(0); if (charCode > 127) { invalidChars[c] = true; } charArray.push(charCode.toString(16)); } const invalidCharArray = Object.keys(invalidChars); if (invalidCharArray.length) { const msg = `Non-standard-ASCII character${ invalidCharArray.length === 1 ? "" : "s" }: ${invalidCharArray.join(", ")}`; throw new StarknetPluginError(msg); } return BigInt("0x" + charArray.join("")); } export function bigIntToShortStringUtil(convertibleBigInt: bigint) { return Buffer.from(convertibleBigInt.toString(16), "hex").toString(); } export async function getTransactionUtil( txHash: string, hre: HardhatRuntimeEnvironment ): Promise { const executed = await hre.starknetWrapper.getTransaction({ hash: txHash }); if (executed.statusCode) { const msg = `Could not get the transaction. ${executed.stderr.toString()}`; throw new StarknetPluginError(msg); } const txReceipt = JSON.parse(executed.stdout.toString()) as Transaction; return txReceipt; } export async function getTransactionReceiptUtil( txHash: string, hre: HardhatRuntimeEnvironment ): Promise { const executed = await hre.starknetWrapper.getTransactionReceipt({ hash: txHash }); if (executed.statusCode) { const msg = `Could not get the transaction receipt. Error: ${executed.stderr.toString()}`; throw new StarknetPluginError(msg); } const txReceipt = JSON.parse(executed.stdout.toString()) as TransactionReceipt; return txReceipt; } export async function getTransactionTraceUtil( txHash: string, hre: HardhatRuntimeEnvironment ): Promise { const executed = await hre.starknetWrapper.getTransactionTrace({ hash: txHash }); if (executed.statusCode) { const msg = `Could not get the transaction trace. Error: ${executed.stderr.toString()}`; throw new StarknetPluginError(msg); } const txTrace = JSON.parse(executed.stdout.toString()) as TransactionTrace; return txTrace; } export async function getBlockUtil( hre: HardhatRuntimeEnvironment, identifier?: BlockIdentifier ): Promise { const blockOptions = { feederGatewayUrl: hre.starknet.networkConfig.url, gatewayUrl: hre.starknet.networkConfig.url, number: identifier?.blockNumber, hash: identifier?.blockHash }; if (identifier && typeof identifier !== "object") { const msg = `Invalid identifier provided to getBlock: ${identifier}`; throw new StarknetPluginError(msg); } if (blockOptions.number == null && !blockOptions.hash) { blockOptions.number = "latest"; } const executed = await hre.starknetWrapper.getBlock(blockOptions); if (executed.statusCode) { const msg = `Could not get block. Error: ${executed.stderr.toString()}`; throw new StarknetPluginError(msg); } const block = JSON.parse(executed.stdout.toString()) as Block; return block; } export async function getNonceUtil( hre: HardhatRuntimeEnvironment, address: string, options: NonceQueryOptions ): Promise { const executed = await hre.starknetWrapper.getNonce({ address, ...options }); if (executed.statusCode) { const msg = `Could not get nonce. Error: ${executed.stderr.toString()}`; throw new StarknetPluginError(msg); } return parseInt(executed.stdout.toString()); } export async function getBalanceUtil( address: string, hre: HardhatRuntimeEnvironment ): Promise { const contractPath = handleInternalContractArtifacts("Token", "ERC20", "", hre); const contractFactory = await hre.starknet.getContractFactory(contractPath); const ethContract = contractFactory.getContractAt(ETH_ADDRESS); const result = await ethContract.call("balanceOf", { account: address }); return uint256.uint256ToBN(result.balance); } ================================================ FILE: src/external-server/create-devnet-wrapper.ts ================================================ import { HardhatNetworkConfig, HardhatRuntimeEnvironment } from "hardhat/types"; import { StarknetPluginError } from "../starknet-plugin-error"; import { DEFAULT_DEVNET_DOCKER_IMAGE_TAG, DEVNET_DOCKER_REPOSITORY, INTEGRATED_DEVNET, INTEGRATED_DEVNET_URL } from "../constants"; import { getDevnetImageTagByArch, getNetwork } from "../utils"; import { DockerDevnet } from "./docker-devnet"; import { VenvDevnet } from "./venv-devnet"; import { ExternalServer } from "./external-server"; import { Image } from "@nomiclabs/hardhat-docker"; function getDevnetImage(dockerizedVersion: string = DEFAULT_DEVNET_DOCKER_IMAGE_TAG): Image { let repository: string = undefined; let tag: string = undefined; // check if of format : if (dockerizedVersion.includes(":")) { const imageParts = dockerizedVersion.split(":"); if (imageParts.length !== 2) { const msg = `Invalid dockerizedVersion: "${dockerizedVersion}". Expected or :`; throw new StarknetPluginError(msg); } repository = imageParts[0]; tag = imageParts[1]; } else { // treat as a devnet-py tag repository = DEVNET_DOCKER_REPOSITORY; tag = getDevnetImageTagByArch(dockerizedVersion); } return { repository, tag }; } export function createIntegratedDevnet(hre: HardhatRuntimeEnvironment): ExternalServer { const devnetNetwork = getNetwork( INTEGRATED_DEVNET, hre.config.networks, `networks["${INTEGRATED_DEVNET}"]` ); const { hostname, port } = new URL(devnetNetwork.url || INTEGRATED_DEVNET_URL); if (hostname !== "localhost" && hostname !== "127.0.0.1") { throw new StarknetPluginError("Integrated devnet works only with localhost and 127.0.0.1"); } if (devnetNetwork.venv) { return new VenvDevnet( devnetNetwork.venv, hostname, port, devnetNetwork?.args, devnetNetwork?.stdout, devnetNetwork?.stderr, devnetNetwork.vmLang ); } if (hostname === "localhost") { throw new StarknetPluginError( "Dockerized integrated devnet works only with host 127.0.0.1" ); } const image = getDevnetImage(devnetNetwork.dockerizedVersion); return new DockerDevnet( image, hostname, port, devnetNetwork?.args, devnetNetwork?.stdout, devnetNetwork?.stderr, devnetNetwork.vmLang ); } ================================================ FILE: src/external-server/docker-amarna.ts ================================================ import { HardhatDocker, Image } from "@nomiclabs/hardhat-docker"; import { spawnSync } from "child_process"; import * as fs from "fs"; import { HardhatRuntimeEnvironment } from "hardhat/types"; const DEFAULT_OUTPUT = "out.sarif"; export class AmarnaDocker { useShell = false; container: string; docker: HardhatDocker; /** * @param image the Docker image to be used for running the container * @param cairoPaths the paths specified in hardhat config cairoPaths */ constructor( private image: Image, private rootPath: string, private cairoPaths: string[], private hre: HardhatRuntimeEnvironment ) { this.container = "amarna-container-" + Math.random().toString().slice(2); } protected getCommand(): string[] { let cmd = ["amarna", ".", "-o", DEFAULT_OUTPUT]; if (this.useShell) { // Run ./amarna.sh file for custom args if (fs.existsSync(`${this.rootPath}/amarna.sh`)) { cmd = ["./amarna.sh"]; } else { console.warn( "amarna.sh file not found in the project directory.\n", "Add amarna.sh file with amarna command to run in the container.\n", "Running the container with default amarna script.`" ); } } return cmd; } cairoPathBindings(binds: { [x: string]: string }, dockerArgs: string[]) { const { cairoPaths } = this; if (cairoPaths.length) { const cairoPathsEnv: string[] = []; cairoPaths.forEach((path, i) => { const cPath = `/src/cairo-paths-${i}`; binds[path] = cPath; cairoPathsEnv.push(cPath); }); dockerArgs.push("--env"); dockerArgs.push(`CAIRO_PATH=${cairoPathsEnv.join(":")}`); } } private async ensureDockerImage(formattedImage: string): Promise { if (!(await this.docker.hasPulledImage(this.image))) { console.log(`Pulling amarna image ${formattedImage}.`); await this.docker.pullImage(this.image); } } private async prepareDockerArgs(): Promise { const { rootPath, container } = this; const formattedImage = `${this.image.repository}:${this.image.tag}`; const binds = { [rootPath]: "/src" }; const cmd = this.getCommand(); const dockerArgs = ["--rm", "-i", "--name", container]; this.cairoPathBindings(binds, dockerArgs); Object.keys(binds).forEach((k) => { dockerArgs.push("-v"); dockerArgs.push(`${k}:${binds[k]}`); }); const entrypoint = cmd.shift(); await this.ensureDockerImage(formattedImage); return [...dockerArgs, "--entrypoint", entrypoint, formattedImage, ...cmd]; } public async run(args: { script?: boolean }) { if (!this.docker) { this.docker = await HardhatDocker.create(); } this.useShell = !!args.script; const dockerArgs = await this.prepareDockerArgs(); console.log("Running amarna, this may take a while."); const result = spawnSync("docker", ["run", ...dockerArgs]); const defaultOutput = ` at ${this.rootPath}/${DEFAULT_OUTPUT}`; console.log(`Sarif file generated${this.useShell ? "" : defaultOutput}`); // Output the output/error for user to review. result.stdout && console.log(result.stdout.toString()); result.stderr && console.error(result.stderr.toString()); } } ================================================ FILE: src/external-server/docker-devnet.ts ================================================ import { Image } from "@nomiclabs/hardhat-docker"; import { DockerServer } from "./docker-server"; export class DockerDevnet extends DockerServer { private vmLang?: string; constructor( image: Image, host: string, port: string, private devnetArgs?: string[], stdout?: string, stderr?: string, vmLang?: string ) { super(image, host, port, "is_alive", "integrated-devnet", devnetArgs, stdout, stderr); this.vmLang = vmLang; } protected async getDockerArgs(): Promise { return [ "-p", `${this.host}:${this.port}:${this.port}`, "-e", `STARKNET_DEVNET_CAIRO_VM=${this.vmLang}` ]; } protected async getContainerArgs(): Promise { return this.devnetArgs || []; } } ================================================ FILE: src/external-server/docker-server.ts ================================================ import { HardhatDocker, Image } from "@nomiclabs/hardhat-docker"; import { ChildProcess, CommonSpawnOptions, spawn, spawnSync } from "child_process"; import { ExternalServer } from "./external-server"; export abstract class DockerServer extends ExternalServer { private docker: HardhatDocker; protected containerName: string; constructor( protected image: Image, host: string, externalPort: string, isAliveURL: string, containerName: string, protected args?: string[], stdout?: string, stderr?: string ) { // to make name unique and allow multiple simultaneous instances containerName += "-" + Math.random().toString().slice(2); super(host, externalPort, isAliveURL, containerName, stdout, stderr); this.containerName = containerName; } protected async pullImage() { if (!this.docker) { this.docker = await HardhatDocker.create(); } if (!(await this.docker.hasPulledImage(this.image))) { console.log(`Pulling image ${HardhatDocker.imageToRepoTag(this.image)}`); await this.docker.pullImage(this.image); } } protected async spawnChildProcess(options?: CommonSpawnOptions): Promise { await this.pullImage(); const formattedImage = `${this.image.repository}:${this.image.tag}`; const args = [ "run", "--rm", "--name", this.containerName, ...(await this.getDockerArgs()), formattedImage, ...(await this.getContainerArgs()) ]; return spawn("docker", args, options); } /** * CLI arguments passed to the `docker` command. */ protected abstract getDockerArgs(): Promise>; /** * CLI arguments passed to the docker container. */ protected abstract getContainerArgs(): Promise>; protected cleanup(): void { spawnSync("docker", ["kill", this.containerName]); this.childProcess?.kill(); } } ================================================ FILE: src/external-server/external-server.ts ================================================ import axios from "axios"; import net from "net"; import { ChildProcess, spawnSync, CommonSpawnOptions } from "child_process"; import { StarknetPluginError } from "../starknet-plugin-error"; import { IntegratedDevnetLogger } from "./integrated-devnet-logger"; import { StringMap } from "../types"; import { HardhatRuntimeEnvironment } from "hardhat/types"; import axiosRetry from "axios-retry"; function sleep(amountMillis: number): Promise { return new Promise((resolve) => { setTimeout(resolve, amountMillis); }); } function isFreePort(port: number): Promise { return new Promise((accept, reject) => { const sock = net.createConnection(port); sock.once("connect", () => { sock.end(); accept(false); }); sock.once("error", (e: NodeJS.ErrnoException) => { sock.destroy(); if (e.code === "ECONNREFUSED") { accept(true); } else { reject(e); } }); }); } export async function getFreePort(): Promise { const defaultDevnetPort = 5050; // starting here to avoid conflicts const step = 1000; const maxPort = 65535; for (let port = defaultDevnetPort + step; port <= maxPort; port += step) { if (await isFreePort(port)) { return port.toString(); } } throw new StarknetPluginError("Could not find a free port, try rerunning your command!"); } export abstract class ExternalServer { protected childProcess: ChildProcess; private connected = false; private connecting = false; // Flag indicating whether the proxy server is currently in the process of connecting private lastError: string = null; private _isDockerDesktop: boolean = null; constructor( protected host: string, protected port: string | null, private isAliveURL: string, protected processName: string, protected stdout?: string, protected stderr?: string ) { ExternalServer.cleanupFns.push(this.cleanup.bind(this)); } public get isDockerDesktop(): boolean { if (this._isDockerDesktop === null) { this._isDockerDesktop = this.getIsDockerDesktop(); } return this._isDockerDesktop; } /** * Check if docker is Docker Desktop */ private getIsDockerDesktop(): boolean { const res = spawnSync("docker", ["system", "info"], { encoding: "utf8" }); //stdout is null when docker command doesn't exists return res.stdout?.includes("Operating System: Docker Desktop"); } public get url() { return `http://${this.host}:${this.port}`; } protected static cleanupFns: Array<() => void> = []; public static cleanAll(): void { this.cleanupFns.forEach((fn) => fn()); } protected abstract spawnChildProcess(options?: CommonSpawnOptions): Promise; protected abstract cleanup(): void; public async start(): Promise { if (await this.isServerAlive()) { const msg = `Cannot spawn ${this.processName}: ${this.url} already occupied.`; throw new StarknetPluginError(msg); } this.childProcess = await this.spawnChildProcess(); const logger = new IntegratedDevnetLogger(this.stdout, this.stderr); this.childProcess.stdout.on("data", async (chunk) => { chunk = chunk.toString(); await logger.logHandler(this.stdout, chunk); }); // capture the most recent message from stderr this.childProcess.stderr.on("data", async (chunk) => { chunk = chunk.toString(); await logger.logHandler(this.stderr, chunk); this.lastError = chunk; }); return new Promise((resolve, reject) => { // called on successful start of the child process this.childProcess.on("spawn", async () => { const startTime = new Date().getTime(); const maxWaitMillis = 60_000; const oneSleepMillis = 500; // keep checking until process has failed/exited while (this.childProcess) { const elapsedMillis = new Date().getTime() - startTime; if (elapsedMillis >= maxWaitMillis) { const msg = `${this.processName} connection timed out!`; reject(new StarknetPluginError(msg)); break; } else if (await this.isServerAlive()) { this.connected = true; resolve(); break; } else { await sleep(oneSleepMillis); } } }); // this only happens if childProcess completely fails to start this.childProcess.on("error", (error) => { this.childProcess = null; reject(error); }); // handle unexpected close of process this.childProcess.on("close", (code) => { const isAbnormalExit = this.childProcess != null; this.childProcess = null; if (code !== 0 && isAbnormalExit) { const circumstance = this.connected ? "running" : "connecting"; const moreInfo = logger.isFile(this.stderr) ? "More error info in " + this.stderr : ""; const msg = `${this.processName} exited with code=${code} while ${circumstance}. ${this.lastError}\n${moreInfo}`; throw new StarknetPluginError(msg); } }); }); } public stop() { if (!this.childProcess) { return; } this.cleanup(); this.childProcess = null; } private async isServerAlive() { if (this.port === null) return false; try { await axios.get(`${this.url}/${this.isAliveURL}`); return true; } catch (err: unknown) { // cannot connect, so address is not occupied return false; } } public async post(data: StringMap): Promise { await this.ensurePort(); await this.ensureStarted(); // The default value of retries, which is 3, does not work on CircleCI axiosRetry(axios, { retries: 5, retryDelay: axiosRetry.exponentialDelay }); const hre: HardhatRuntimeEnvironment = await import("hardhat"); try { const response = await axios.post(this.url, data, { timeout: hre.config.starknet.requestTimeout }); return response.data; } catch (error) { const parent = error instanceof Error && error; const msg = `Error in interaction with Starknet CLI proxy server\n${error}`; throw new StarknetPluginError(msg, parent); } } private async ensurePort(): Promise { if (this.port) { return; } this.port = await getFreePort(); } private async ensureStarted(): Promise { if (this.connected || this.connecting) { return; } this.connecting = true; await this.start(); this.connecting = false; } } ================================================ FILE: src/external-server/index.ts ================================================ export { ExternalServer } from "./external-server"; export { createIntegratedDevnet } from "./create-devnet-wrapper"; ================================================ FILE: src/external-server/integrated-devnet-logger.ts ================================================ import * as path from "path"; import * as fs from "fs"; export class IntegratedDevnetLogger { constructor(protected stdout?: string, protected stderr?: string) { this.checkFileExists(this.stdout); this.checkFileExists(this.stderr); } // Checks if the file exists private async checkFileExists(filePath: string): Promise { if (!filePath || filePath === "STDOUT" || filePath === "STDERR") return; const file = path.resolve(filePath); // Create the file if it doesn't exist const dir = path.dirname(file); if (!fs.existsSync(dir)) { await fs.promises.mkdir(dir, { recursive: true }); } await fs.promises.writeFile(file, ""); } public async logHandler(logTarget: string, message: string): Promise { if (!logTarget) return; if (logTarget === "STDOUT") { console.log(message); return; } if (logTarget === "STDERR") { console.error(message); return; } // Append the message to the target log file this.appendLogToFile(logTarget, message); } public isFile(file: string): boolean { return fs.existsSync(file); } // Appends the message to the file private async appendLogToFile(file: string, message: string): Promise { await fs.promises.appendFile(file, message); } } ================================================ FILE: src/external-server/venv-devnet.ts ================================================ import { ChildProcess, spawn } from "child_process"; import { getPrefixedCommand, normalizeVenvPath } from "../utils/venv"; import { ExternalServer } from "./external-server"; export class VenvDevnet extends ExternalServer { private command: string; private args?: string[]; private vmLang?: string; constructor( venvPath: string, host: string, port: string, args?: string[], stdout?: string, stderr?: string, vmLang?: string ) { super(host, port, "is_alive", "integrated-devnet", stdout, stderr); this.command = "starknet-devnet"; this.args = args; this.vmLang = vmLang; if (venvPath !== "active") { this.command = getPrefixedCommand(normalizeVenvPath(venvPath), this.command); } } protected async spawnChildProcess(): Promise { const args = ["--host", this.host, "--port", this.port].concat(this.args || []); const options = { env: { PATH: process.env.PATH, STARKNET_DEVNET_CAIRO_VM: this.vmLang } }; return spawn(this.command, args, options); } protected cleanup(): void { this.childProcess?.kill(); } } ================================================ FILE: src/index.ts ================================================ import * as path from "path"; import { task, extendEnvironment, extendConfig } from "hardhat/config"; import { StarknetPluginError } from "./starknet-plugin-error"; import { lazyObject } from "hardhat/plugins"; import { ConfigurableTaskDefinition, HardhatConfig, HardhatNetworkConfig, HardhatRuntimeEnvironment, HardhatUserConfig } from "hardhat/types"; import exitHook from "exit-hook"; import "./type-extensions"; import { DEFAULT_STARKNET_SOURCES_PATH, DEFAULT_STARKNET_ARTIFACTS_PATH, CAIRO_CLI_DOCKER_REPOSITORY, AMARNA_DOCKER_REPOSITORY, AMARNA_DOCKER_IMAGE_TAG, ALPHA_URL, ALPHA_GOERLI_URL_2, ALPHA_MAINNET_URL, VOYAGER_GOERLI_CONTRACT_API_URL, VOYAGER_MAINNET_CONTRACT_API_URL, DEFAULT_STARKNET_NETWORK, INTEGRATED_DEVNET_URL, VOYAGER_GOERLI_VERIFIED_URL, VOYAGER_MAINNET_VERIFIED_URL, VOYAGER_GOERLI_2_CONTRACT_API_URL, VOYAGER_GOERLI_2_VERIFIED_URL, StarknetChainId, SUPPORTED_SCARB_VERSION } from "./constants"; import { adaptPath, getCairoCliImageTagByArch, getDefaultHardhatNetworkConfig, getDefaultHttpNetworkConfig, getNetwork } from "./utils"; import { DockerWrapper, VenvWrapper } from "./starknet-wrappers"; import { amarnaAction, starknetDeprecatedCompileAction, starknetVoyagerAction, starknetTestAction, starknetRunAction, starknetPluginVersionAction, starknetCompileCairo1Action, starknetBuildAction } from "./task-actions"; import { bigIntToShortStringUtil, getContractFactoryUtil, getTransactionUtil, getTransactionReceiptUtil, shortStringToBigIntUtil, getBlockUtil, getNonceUtil, getTransactionTraceUtil, getBalanceUtil } from "./extend-utils"; import { DevnetUtils } from "./devnet-utils"; import { ExternalServer } from "./external-server"; import { ArgentAccount, OpenZeppelinAccount } from "./account"; import { AmarnaDocker } from "./external-server/docker-amarna"; import { StarknetLegacyWrapper } from "./starknet-js-wrapper"; exitHook(() => { ExternalServer.cleanAll(); }); // copy all user-defined cairo settings; other extendConfig calls will overwrite if needed extendConfig((config: HardhatConfig, userConfig: Readonly) => { if (userConfig.starknet) { config.starknet = JSON.parse(JSON.stringify(userConfig.starknet)); } if (!config.starknet) { config.starknet = {}; } if (!config.starknet.requestTimeout) { config.starknet.requestTimeout = 30_000; } }); // add sources path extendConfig((config: HardhatConfig, userConfig: Readonly) => { let newPath: string; if (userConfig.paths && userConfig.paths.starknetSources) { const userPath = userConfig.paths.starknetSources; newPath = adaptPath(config.paths.root, userPath); config.paths.starknetSources = userConfig.paths.starknetSources; } else { const defaultPath = path.join(config.paths.root, DEFAULT_STARKNET_SOURCES_PATH); newPath = defaultPath; } config.paths.starknetSources = newPath; }); // add artifacts path extendConfig((config: HardhatConfig, userConfig: Readonly) => { let newPath: string; if (userConfig.paths && userConfig.paths.starknetArtifacts) { const userPath = userConfig.paths.starknetArtifacts; newPath = adaptPath(config.paths.root, userPath); config.paths.starknetArtifacts = userConfig.paths.starknetArtifacts; } else { const defaultPath = path.join(config.paths.root, DEFAULT_STARKNET_ARTIFACTS_PATH); newPath = defaultPath; } config.paths.starknetArtifacts = newPath; }); // add url to alpha network extendConfig((config: HardhatConfig) => { if (!config.networks.alphaGoerli) { config.networks.alphaGoerli = getDefaultHttpNetworkConfig( ALPHA_URL, VOYAGER_GOERLI_CONTRACT_API_URL, VOYAGER_GOERLI_VERIFIED_URL, StarknetChainId.TESTNET ); } if (!config.networks.alphaGoerli2) { config.networks.alphaGoerli2 = getDefaultHttpNetworkConfig( ALPHA_GOERLI_URL_2, VOYAGER_GOERLI_2_CONTRACT_API_URL, VOYAGER_GOERLI_2_VERIFIED_URL, StarknetChainId.TESTNET2 ); } if (!config.networks.alphaMainnet) { config.networks.alphaMainnet = getDefaultHttpNetworkConfig( ALPHA_MAINNET_URL, VOYAGER_MAINNET_CONTRACT_API_URL, VOYAGER_MAINNET_VERIFIED_URL, StarknetChainId.MAINNET ); } if (!config.networks.integratedDevnet) { config.networks.integratedDevnet = getDefaultHardhatNetworkConfig(INTEGRATED_DEVNET_URL); } }); // set network as specified in userConfig extendConfig((config: HardhatConfig, userConfig: Readonly) => { config.starknet.network = userConfig.starknet?.network || DEFAULT_STARKNET_NETWORK; const networkConfig = getNetwork( config.starknet.network, config.networks, "starknet.network in hardhat.config" ); config.starknet.networkConfig = networkConfig; }); function setVenvWrapper(hre: HardhatRuntimeEnvironment, venvPath: string) { if (hre.config.starknet.dockerizedVersion) { const msg = "Error in config file. Only one of (starknet.dockerizedVersion, starknet.venv) can be specified."; throw new StarknetPluginError(msg); } hre.starknetWrapper = new VenvWrapper(venvPath, hre); } // add venv wrapper or docker wrapper of starknet extendEnvironment((hre) => { hre.starknetJs = new StarknetLegacyWrapper(hre.config.starknet.networkConfig); const venvPath = hre.config.starknet.venv; if (venvPath) { setVenvWrapper(hre, venvPath); } else { const repository = CAIRO_CLI_DOCKER_REPOSITORY; const tag = getCairoCliImageTagByArch(hre.config.starknet.dockerizedVersion); const image = { repository, tag }; const cairoPaths = []; for (const cairoPath of hre.config.paths.cairoPaths || []) { cairoPaths.push(adaptPath(hre.config.paths.root, cairoPath)); } hre.starknetWrapper = new DockerWrapper(image, hre.config.paths.root, cairoPaths, hre); const amarnaImage = { repository: AMARNA_DOCKER_REPOSITORY, tag: AMARNA_DOCKER_IMAGE_TAG }; hre.amarnaDocker = new AmarnaDocker( amarnaImage, hre.config.paths.root, hre.config.paths.cairoPaths || [], hre ); } }); task("starknet-compile-deprecated", "Compiles Starknet (Cairo 0) contracts") .addOptionalVariadicPositionalParam( "paths", "The paths to be used for compilation.\n" + "Each of the provided paths is recursively looked into while searching for source files.\n" + "If no paths are provided, the default contracts directory is traversed." ) .addOptionalParam( "cairoPath", "Allows specifying the locations of imported files, if necessary.\n" + "Separate them with a colon (:), e.g. --cairo-path='path/to/lib1:path/to/lib2'" ) .addFlag("accountContract", "Allows compiling an account contract.") .addFlag("disableHintValidation", "Allows compiling a contract with any python code in hints.") .setAction(starknetDeprecatedCompileAction); task("starknet-compile", "Compiles Starknet (Cairo 1) contracts") .addOptionalVariadicPositionalParam( "paths", "The paths are source files of contracts to be compiled.\n" + "Each of the provided paths is recursively looked into while searching for source files.\n" + "If no paths are provided, the default contracts directory is traversed.\n" + "To build more complex Cairo 1 projects, read about `hardhat starknet-build`" ) .addOptionalParam( "cairo1BinDir", "Allows specifying your local cairo compiler target directory; also configurable via `cairo1BinDir` in hardhat.config.ts file.\n" + "e.g. --cairo1-bin-dir 'path/to/cairo/target/release'" ) .addFlag("replaceIds", "Replaces sierra ids with human-readable ones.") .addOptionalParam( "allowedLibfuncsListName", "The allowed libfuncs list to use (default: most recent audited list)." ) .addOptionalParam("allowedLibfuncsListFile", "A file of the allowed libfuncs list to use.") .addFlag("addPythonicHints", "Add pythonic hints.") .addFlag("singleFile", "Compile single file.") .setAction(starknetCompileCairo1Action); task("starknet-build", "Builds Scarb projects") .addOptionalVariadicPositionalParam( "paths", "The paths are source files of contracts to be compiled.\n" + "Each of the provided paths is recursively looked into while searching for Scarb projects.\n" + "If no paths are provided, the default contracts directory is traversed.\n" + `Each project must be a valid Scarb ${SUPPORTED_SCARB_VERSION} project with lib.cairo and Scarb.toml in its root.\n` + "The toml file must have `sierra` and `casm` set to `true` under [[target.starknet-contract]].\n" + "In code, load the generated contracts with an underscore-separated string:\n" + "\tstarknet.getContractFactory('_')\n" + "E.g. if your toml specifies `name = MyPackage` and there is a contract called FooContract in your source files, you would load it with:\n" + "\tstarknet.getContractFactory('MyPackage_FooContract')\n" + "The name of the file where the contract was defined doesn't play a role.\n" + "The plugin doesn't have a default Scarb command yet (a dockerized wrapper will be supported soon).\n" + "You need to provide a `scarbCommand` (either an exact command or the path to it) under `starknet` in your hardhat config file, " + "or you can override that via `--scarb-command `." ) .addOptionalParam( "scarbCommand", "Your local Scarb command or path to the executable file. Overrides the one set in the hardhat config file" ) .addFlag( "skipValidate", "By default, your TOML config file will be validated to ensure it generates the artifacts required for later contract loading.\n" + "Set this flag to skip the validation." ) .setAction(starknetBuildAction); extendEnvironment((hre) => { hre.starknet = { getContractFactory: async (contractPath) => { const contractFactory = await getContractFactoryUtil(hre, contractPath); return contractFactory; }, shortStringToBigInt: (convertibleString) => { const convertedString = shortStringToBigIntUtil(convertibleString); return convertedString; }, bigIntToShortString: (convertibleBigInt) => { const convertedBigInt = bigIntToShortStringUtil(convertibleBigInt); return convertedBigInt; }, devnet: lazyObject(() => new DevnetUtils(hre)), getTransaction: async (txHash) => { const transaction = await getTransactionUtil(txHash, hre); return transaction; }, getTransactionReceipt: async (txHash) => { const txReceipt = await getTransactionReceiptUtil(txHash, hre); return txReceipt; }, getTransactionTrace: async (txHash) => { const txTrace = await getTransactionTraceUtil(txHash, hre); return txTrace; }, getBlock: async (identifier) => { const block = await getBlockUtil(hre, identifier); return block; }, getNonce: async (address, options) => { const nonce = await getNonceUtil(hre, address, options); return nonce; }, getBalance: async (address) => { const balance = await getBalanceUtil(address, hre); return balance; }, network: hre.config.starknet.network, networkConfig: hre.config.starknet.networkConfig as HardhatNetworkConfig, OpenZeppelinAccount: OpenZeppelinAccount, ArgentAccount: ArgentAccount }; }); task("starknet-verify", "Verifies a contract on a Starknet network.") .addOptionalParam("starknetNetwork", "The network version to be used (e.g. alpha)") .addParam("path", "The path of the main cairo contract (e.g. contracts/contract.cairo)") .addParam("address", "The address where the contract is deployed") .addParam("compilerVersion", "The compiler version used to compile the cairo contract") .addFlag("accountContract", "The contract type which specifies it's an account contract.") .addOptionalParam("license", "The license of the contract (e.g No License (None))") .addOptionalVariadicPositionalParam( "paths", "The paths of the dependencies of the contract specified in --path\n" + "All dependencies should be in the same folder as the contract." + "e.g. path/to/dependency1 path/to/dependency2" ) .setAction(starknetVoyagerAction); function addStarknetNetworkParam(task: ConfigurableTaskDefinition): ConfigurableTaskDefinition { return task.addOptionalParam( "starknetNetwork", "Specify the starknet-network to be used; overrides the value from hardhat.config" ); } addStarknetNetworkParam(task("test")).setAction(starknetTestAction); addStarknetNetworkParam(task("run")).setAction(starknetRunAction); task("starknet-plugin-version", "Prints the version of the starknet plugin.").setAction( starknetPluginVersionAction ); task("amarna", "Runs Amarna, the static-analyzer and linter for Cairo.") .addFlag("script", "Run ./amarna.sh file to use Amarna with custom args.") .setAction(amarnaAction); export * from "./types"; export * from "./starknet-types"; export * from "./starknet-plugin-error"; ================================================ FILE: src/recompiler.ts ================================================ import fs from "fs"; import path from "path"; import { createHash } from "crypto"; import { HardhatRuntimeEnvironment, ProjectPathsConfig, TaskArguments } from "hardhat/types"; import { starknetDeprecatedCompileAction } from "./task-actions"; import { getArtifactPath, traverseFiles } from "./utils"; import { ABI_SUFFIX } from "./constants"; interface ContractData { contentHash: string; outputPath: string; abiPath: string; cairoPath?: string; accountContract?: boolean; disableHintValidation?: boolean; } // Cache file name const CACHE_FILE_NAME = "cairo-files-cache.json"; export class Cache { protected cache: Record = {}; public fsPromises = fs.promises; constructor(protected hre: HardhatRuntimeEnvironment) {} // Returns the contract data from the cache public async getCache(): Promise> { await this.loadCache(); return this.cache; } // Sets the cache public setCache(cacheData: Record): void { this.cache = cacheData; } // Returns the cache file path private getCacheFilePath(): string { return path.join(this.hre.config.paths.cache, CACHE_FILE_NAME); } // Returns the cache directory path private getCacheDirPath(): string { return path.join(this.hre.config.paths.cache); } // Loads the cache from the file public async loadCache(): Promise { const cacheDirPath = this.getCacheDirPath(); // Creates cache directory if it doesn't exist if (!fs.existsSync(cacheDirPath)) { fs.mkdirSync(cacheDirPath, { recursive: true }); } const cacheFilePath = this.getCacheFilePath(); if (fs.existsSync(cacheFilePath)) { const cacheBuffer = await this.fsPromises.readFile(cacheFilePath); this.setCache(JSON.parse(cacheBuffer.toString() || "{}")); } else { await fs.promises.writeFile(cacheFilePath, JSON.stringify({}) + "\n"); this.setCache({}); } } // Saves the cache to the file public async saveCache(): Promise { const cacheFilePath = this.getCacheFilePath(); await this.fsPromises.writeFile( cacheFilePath, JSON.stringify(this.cache, null, " ") + "\n" ); } } export class Recompiler { private cache: Cache; private hre: HardhatRuntimeEnvironment; constructor(hre: HardhatRuntimeEnvironment) { this.cache = new Cache(hre); this.hre = hre; } // Gets hash of each .cairo file inside source private async getContractHash( paths: ProjectPathsConfig ): Promise> { const { starknetSources: defaultSourcesPath } = paths; const sourceRegex = new RegExp("^" + defaultSourcesPath + "/"); const artifactsDir = getArtifactPath(defaultSourcesPath, paths); const newCacheEntry: Record = {}; // Get sources from source path. Check only cairo file extensions const filesList = await traverseFiles(defaultSourcesPath, "*.cairo"); // Select file name for (const cairoContract of filesList) { const data = await this.cache.fsPromises.readFile(cairoContract); const hash = createHash("sha256"); hash.update(data); const suffix = cairoContract.replace(sourceRegex, ""); const fileName = path.basename(suffix, ".cairo"); const abiPath = path.join(artifactsDir, suffix, `${fileName}${ABI_SUFFIX}`); const outputPath = path.join(artifactsDir, suffix, `${fileName}.json`); newCacheEntry[cairoContract] = { contentHash: hash.digest("hex").toString(), outputPath, abiPath }; } return newCacheEntry; } // Gets cache entry of a given cairo file plus artifacts private async getCacheEntry( file: string, output: string, abi: string, cairoPath?: string, args?: TaskArguments ): Promise> { const data = await this.cache.fsPromises.readFile(file); const hash = createHash("sha256"); hash.update(data); const newCacheEntry: Record = {}; newCacheEntry[file] = { contentHash: hash.digest("hex").toString(), outputPath: output, abiPath: abi }; if (args?.disableHintValidation) { newCacheEntry[file].disableHintValidation = true; } if (args?.accountContract) { newCacheEntry[file].accountContract = true; } if (cairoPath) { newCacheEntry[file].cairoPath = args.cairoPath; } return newCacheEntry; } // Updates cache entry with new contracts private getUpdatedCache( oldCache: Record, newCacheEntry: Record ): Record { const updatedCacheEntry: Record = oldCache; for (const contractName in newCacheEntry) { if (oldCache[contractName]?.contentHash !== newCacheEntry[contractName].contentHash) { updatedCacheEntry[contractName] = newCacheEntry[contractName]; } } return updatedCacheEntry; } // Checks artifacts availability private async checkArtifacts( paths: ProjectPathsConfig, newCacheEntry: Record ): Promise> { // Set to save contracts with changed content & unavailable artifacts const changed: Set = new Set(); const { starknetSources: defaultSourcesPath } = paths; const artifactsDir = getArtifactPath(defaultSourcesPath, paths); // Traverse on artifacts directory // Create if it doesn't exist if (!fs.existsSync(artifactsDir)) { fs.mkdirSync(artifactsDir, { recursive: true }); } const artifactsList = await traverseFiles(artifactsDir, "*.json"); for (const name in newCacheEntry) { const outputPath = newCacheEntry[name].outputPath; const abiPath = newCacheEntry[name].abiPath; if (!artifactsList.includes(outputPath) || !artifactsList.includes(abiPath)) { changed.add(name); } } return changed; } // Compile changed contracts private async compileChangedContracts( newCacheEntry: Record, changed: Set ): Promise { for (const changedContract of changed) { const entry = newCacheEntry[changedContract]; const compileArguments: TaskArguments = { paths: [changedContract], disableHintValidation: entry?.disableHintValidation, accountContract: entry?.accountContract, cairoPath: entry?.cairoPath }; await starknetDeprecatedCompileAction(compileArguments, this.hre); } } // Updated set with changed and new contracts private async updateSet( cache: Record, newCacheEntry: Record, changed: Set ): Promise> { for (const contractName in newCacheEntry) { // Add new contracts that are not in cache before if (!cache[contractName]) { changed.add(contractName); continue; } // Add contracts that contain a change in content if (newCacheEntry[contractName].contentHash !== cache[contractName].contentHash) { changed.add(contractName); } } // Remove deleted sources from old cache by overwriting it this.cache.setCache(newCacheEntry); await this.cache.saveCache(); return changed; } // Handles cache on Starknet cli calls public async handleCache(): Promise { // If recompile is not enabled, do nothing if (!this.hre.userConfig?.starknet?.recompile) return; const paths = this.hre.config.paths; try { const oldCache = await this.cache.getCache(); const newCacheEntry = await this.getContractHash(paths); const changedContracts = await this.checkArtifacts(paths, newCacheEntry); const updatedSet = await this.updateSet(oldCache, newCacheEntry, changedContracts); await this.compileChangedContracts(newCacheEntry, updatedSet); } catch (error) { // If there is an error, do not recompile console.error(error); process.exit(1); } } // Updates cache with new contract and artifacts public async updateCache( args: TaskArguments, file: string, output: string, abi: string, cairoPath?: string ): Promise { const oldCache = await this.cache.getCache(); const newCacheEntry = await this.getCacheEntry(file, output, abi, cairoPath, args); const updatedCache = this.getUpdatedCache(oldCache, newCacheEntry); this.cache.setCache(updatedCache); } // Calls save cache after compilation public async saveCache(): Promise { await this.cache.saveCache(); } } ================================================ FILE: src/scarb-wrapper.ts ================================================ import { ProcessResult } from "@nomiclabs/hardhat-docker"; import { spawnSync } from "child_process"; import { HardhatRuntimeEnvironment, TaskArguments } from "hardhat/types"; import { StarknetPluginError } from "./starknet-plugin-error"; import { PLUGIN_NAME } from "./constants"; import path from "path"; import os from "os"; export abstract class ScarbWrapper { private static instance: ScarbWrapper; static getInstance(cliArgs: TaskArguments, hre: HardhatRuntimeEnvironment): ScarbWrapper { if (this.instance) { return this.instance; } else if (cliArgs.scarbCommand) { this.instance = new CustomScarbWrapper(cliArgs.scarbCommand); } else if (hre.config.starknet.scarbCommand) { this.instance = new CustomScarbWrapper(hre.config.starknet.scarbCommand); } else { this.instance = new DockerizedScarbWrapper( hre.config.starknet.dockerizedVersion, hre.config.paths.root ); } return this.instance; } public abstract build(packageConfigPath: string, artifactDirPath: string): ProcessResult; } export class DockerizedScarbWrapper extends ScarbWrapper { private formattedImage: string; constructor(imageTag: string, private projectRootPath: string) { super(); throw new StarknetPluginError( "Dockerized Scarb is not yet supported. " + "If you have Scarb installed on your machine, provide its path via scarbCommand in hardhat config, " + "or via --scarb-command of hardhat starknet-build" ); // UNCOMMENT THIS WHEN DOCKERIZED SCARB SUPPORTED // const repository = CAIRO_CLI_DOCKER_REPOSITORY; // const tag = getCairoCliImageTagByArch(imageTag); // this.formattedImage = `${repository}:${tag}`; // console.log(`${PLUGIN_NAME} plugin using dockerized Scarb (${this.formattedImage})`); } public override build(packageConfigPath: string, artifactDirPath: string): ProcessResult { const packageDir = path.dirname(packageConfigPath); // If not specified, inside the container it tries to write cache to /.cache // which is not allowed for a non-root user. So here we are setting it to the path used by Scarb // in many non-docker environments const globalCacheDir = path.join(os.tmpdir(), ".cache", "scarb"); const execution = spawnSync("docker", [ "run", "--rm", ...["-v", `${packageDir}:${packageDir}`], ...["-v", `${this.projectRootPath}:${this.projectRootPath}`], ...["-v", `${globalCacheDir}:${globalCacheDir}`], // https://unix.stackexchange.com/questions/627027/files-created-by-docker-container-are-owned-by-root ...["-u", `${os.userInfo().uid}:${os.userInfo().gid}`], this.formattedImage, "scarb", ...["--manifest-path", packageConfigPath], ...["--target-dir", artifactDirPath], ...["--global-cache-dir", globalCacheDir], "build" ]); return { statusCode: execution.status, stdout: execution.stdout, stderr: execution.stderr }; } } export class CustomScarbWrapper extends ScarbWrapper { constructor(private scarbCommand: string) { super(); // validate const execution = spawnSync(scarbCommand, ["--version"]); // on mac, properties of spawnSync result can be null if invalid command if (execution.status !== 0) { throw new StarknetPluginError( `Not a legal executable Scarb command: ${scarbCommand}.\n${execution.stderr?.toString()}` ); } // log const versionString = execution.stdout.toString().trim().split("\n").join(", "); console.log(`${PLUGIN_NAME} plugin using custom Scarb (${versionString})`); } public override build(packageConfigPath: string, artifactDirPath: string): ProcessResult { const execution = spawnSync(this.scarbCommand, [ ...["--manifest-path", packageConfigPath], ...["--target-dir", artifactDirPath], "build" ]); return { statusCode: execution.status, stderr: execution.stderr, stdout: execution.stdout }; } } ================================================ FILE: src/starknet-docker-proxy.ts ================================================ import { Image } from "@nomiclabs/hardhat-docker"; import path from "path"; import { DockerServer } from "./external-server/docker-server"; import { getFreePort } from "./external-server/external-server"; const PROXY_SERVER_FILE = "starknet_cli_wrapper.py"; const PROXY_SERVER_HOST_PATH = path.join(__dirname, PROXY_SERVER_FILE); const PROXY_SERVER_CONTAINER_PATH = `/${PROXY_SERVER_FILE}`; const LEGACY_CLI_FILE = "starknet_cli_legacy.py"; const LEGACY_CLI_HOST_PATH = path.join(__dirname, LEGACY_CLI_FILE); const LEGACY_CLI_CONTAINER_PATH = `/${LEGACY_CLI_FILE}`; export class StarknetDockerProxy extends DockerServer { /** * @param image the Docker image to be used for running the container * @param rootPath the hardhat project root * @param cairoPaths the paths specified in hardhat config cairoPaths */ constructor(image: Image, private rootPath: string, private cairoPaths: string[]) { super(image, "127.0.0.1", null, "", "starknet-docker-proxy"); } protected async getDockerArgs(): Promise { // To access the files on host machine from inside the container, proper mounting has to be done. const volumes = ["-v", `${PROXY_SERVER_HOST_PATH}:${PROXY_SERVER_CONTAINER_PATH}`]; volumes.push("-v", `${LEGACY_CLI_HOST_PATH}:${LEGACY_CLI_CONTAINER_PATH}`); for (const mirroredPath of [this.rootPath, ...this.cairoPaths]) { volumes.push("-v", `${mirroredPath}:${mirroredPath}`); } const dockerArgs = [...volumes]; // Check if Docker Desktop if (this.isDockerDesktop) { this.port = await this.getPort(); dockerArgs.push("-p", `${this.port}:${this.port}`); } else { dockerArgs.push("--network", "host"); } return dockerArgs; } protected async getContainerArgs(): Promise { this.port = await this.getPort(); return ["python3", PROXY_SERVER_CONTAINER_PATH, this.port]; } protected async getPort(): Promise { if (!this.port) { this.port = await getFreePort(); } return this.port; } } ================================================ FILE: src/starknet-js-wrapper.ts ================================================ import { ProcessResult } from "@nomiclabs/hardhat-docker"; import { promises as fsp } from "fs"; import { NetworkConfig } from "hardhat/types/config"; import { BigNumberish, BlockIdentifier, json, provider as providerUtil, SequencerProvider } from "starknet"; export class StarknetJsWrapper { public provider: SequencerProvider; constructor(networkConfig: NetworkConfig) { this.setProvider(networkConfig); } public setProvider(networkConfig: NetworkConfig) { this.provider = new SequencerProvider({ baseUrl: networkConfig.url }); } } /** * StarknetLegacyWrapper is meant to facilitate the discontinuation of the Starknet CLI usage within StarknetWrapper */ export class StarknetLegacyWrapper extends StarknetJsWrapper { private async readContract(contractPath: string) { return json.parse((await fsp.readFile(contractPath)).toString("ascii")); } private stringifyResponse(r: unknown) { return typeof r !== "string" ? `${json.stringify(r, undefined, "\n").replace(/\n+/g, "\n")}\n` : r; } private generateProcessResult( statusCode: number, stdout: string, stderr: string ): ProcessResult { return { statusCode, stdout, stderr } as unknown as ProcessResult; } private async wrapProcessResult(p: Promise): Promise { return p .then((a) => this.generateProcessResult(0, this.stringifyResponse(a), "")) .catch((e) => this.generateProcessResult(1, "", this.stringifyResponse(e))); } public async declare( contractPath: string, senderAddress: string, signature: string[], nonce: string, maxFee: string ): Promise { const contractJson = await this.readContract(contractPath); const contract = providerUtil.parseContract(contractJson); return this.wrapProcessResult( this.provider .declareContract( { contract, senderAddress, signature }, { nonce, maxFee } ) .then( ({ class_hash, transaction_hash }) => "DeprecatedDeclare transaction was sent.\n" + `Contract class hash: ${class_hash}\n` + `Transaction hash: ${transaction_hash}\n` ) ); } public async getTxStatus(txHash: BigNumberish): Promise { return this.wrapProcessResult(this.provider.getTransactionStatus(txHash)); } public async getTransactionTrace(txHash: BigNumberish): Promise { return this.wrapProcessResult(this.provider.getTransactionTrace(txHash)); } public async getTransactionReceipt(txHash: BigNumberish): Promise { return this.wrapProcessResult(this.provider.getTransactionReceipt(txHash)); } public async getTransaction(txHash: BigNumberish): Promise { return this.wrapProcessResult(this.provider.getTransaction(txHash)); } public async getBlock(blockIdentifier?: BlockIdentifier): Promise { return this.wrapProcessResult(this.provider.getBlock(blockIdentifier)); } public async getNonce( address: string, blockIdentifier?: BlockIdentifier ): Promise { return this.wrapProcessResult( this.provider.getNonceForAddress(address, blockIdentifier).then(BigInt) ); } } ================================================ FILE: src/starknet-plugin-error.ts ================================================ import { HardhatPluginError } from "hardhat/plugins"; import { PLUGIN_NAME } from "./constants"; export class StarknetPluginError extends HardhatPluginError { constructor(message: string, parentError?: Error) { super(PLUGIN_NAME, message, parentError); Object.setPrototypeOf(this, new.target.prototype); } } ================================================ FILE: src/starknet-types.ts ================================================ /** * Contains typing of Starknet specific objects: ABI related and network response related. */ export interface Member { name: string; offset: number; type: string; } export interface Struct { members: Member[]; name: string; size: number; type: string; } export interface Argument { name?: string; type: string; } export interface CairoFunction { stateMutability?: string; name: string; type: "function" | "constructor"; inputs: Argument[]; outputs: Argument[]; } export interface EventSpecification { data?: Argument[]; // cairo 0 inputs?: Argument[]; // cairo 1 keys: string[]; name: string; type: "event"; } export interface Interface { type: "interface"; name: string; items: AbiEntry[]; } export interface EventAbi { [encodedName: string]: EventSpecification; } export type AbiEntry = CairoFunction | Struct | EventSpecification | Interface; export interface Abi { [name: string]: AbiEntry; } export interface Event { data: string[]; from_address: string; keys: string[]; } export interface BuiltinInstanceCounter { bitwise_builtin: number; ec_op_builtin: number; ecdsa_builtin: number; output_builtin: number; pedersen_builtin: number; range_check_builtin: number; } export interface ExecutionResources { builtin_instance_counter: BuiltinInstanceCounter; n_memory_holes: number; n_steps: number; } export interface TransactionReceipt { block_hash: string; block_number: number; events: Event[]; execution_resources: ExecutionResources; l2_to_l1_messages: L2ToL1Message[]; status: string; transaction_hash: string; transaction_index: number; } export interface L2ToL1Message { from_address: string; payload: string[]; to_address: string; } export interface TransactionData { calldata: string[]; sender_address: string; entry_point_selector: string; entry_point_type: string; max_fee: string; signature: string[]; transaction_hash: string; type: string; } export interface Transaction { block_hash: string; block_number: number; status: string; transaction: TransactionData; transaction_index: number; } export interface OrderedMessage { order: number; to_address: string; payload: number[]; } export interface FunctionInvocation { call_type: string; calldata: string[]; caller_address: string; class_hash: string; contract_address: string; entry_point_type: string; events: Event[]; execution_resources: ExecutionResources; internal_calls: FunctionInvocation[]; messages: OrderedMessage[]; result: string[]; selector: string; } export interface TransactionTrace { function_invocation?: FunctionInvocation; signature: string[]; validate_invocation?: FunctionInvocation; fee_transfer_invocation?: FunctionInvocation; } export interface MintResponse { new_balance: number; unit: string; tx_hash: string; } export type TxFailureReason = { code: string; error_message: string; tx_id: string; }; export type FeeEstimation = { amount: bigint; unit: string; gas_price: bigint; gas_usage: bigint; }; export type StarkError = { code: string; message: string; }; ================================================ FILE: src/starknet-venv-proxy.ts ================================================ import { ChildProcess, spawn } from "child_process"; import { ExternalServer } from "./external-server"; import path from "path"; export class StarknetVenvProxy extends ExternalServer { constructor(private pythonPath: string) { super("127.0.0.1", null, "", "starknet-venv-proxy"); } protected async spawnChildProcess(): Promise { const proxyServerPath = path.join(__dirname, "starknet_cli_wrapper.py"); return spawn(this.pythonPath, [proxyServerPath, this.port]); } protected cleanup(): void { this.childProcess?.kill(); } } ================================================ FILE: src/starknet-wrappers.ts ================================================ import { Image, ProcessResult } from "@nomiclabs/hardhat-docker"; import axios from "axios"; import { HardhatRuntimeEnvironment } from "hardhat/types"; import path from "path"; import { num, selector } from "starknet"; import { exec } from "./cairo1-compiler"; import { CAIRO1_COMPILE_BIN, CAIRO1_SIERRA_COMPILE_BIN, DOCKER_HOST, PLUGIN_NAME } from "./constants"; import { ExternalServer } from "./external-server"; import { StarknetDockerProxy } from "./starknet-docker-proxy"; import { StarknetPluginError } from "./starknet-plugin-error"; import { FeeEstimation } from "./starknet-types"; import { StarknetVenvProxy } from "./starknet-venv-proxy"; import { BlockNumber } from "./types"; import { getPrefixedCommand, normalizeVenvPath } from "./utils/venv"; interface CompileWrapperOptions { file: string; output: string; abi: string; cairoPath: string; accountContract: boolean; disableHintValidation: boolean; } interface CairoToSierraOptions { path: string; output: string; binDirPath?: string; replaceIds?: boolean; allowedLibfuncsListName?: string; allowedLibfuncsListFile?: string; singleFile?: boolean; } interface SierraToCasmOptions { file: string; output: string; binDirPath?: string; allowedLibfuncsListName?: string; allowedLibfuncsListFile?: string; addPythonicHints?: boolean; } interface DeclareWrapperOptions { contract: string; maxFee: string; signature?: string[]; token?: string; sender?: string; nonce?: string; } interface TxHashQueryWrapperOptions { hash: string; } interface BlockQueryWrapperOptions { number?: BlockNumber; hash?: string; } interface NonceQueryWrapperOptions { address: string; blockHash?: string; blockNumber?: BlockNumber; } export abstract class StarknetWrapper { constructor( protected externalServer: ExternalServer, protected hre: HardhatRuntimeEnvironment ) { // this is dangerous since hre get set here, before being fully initialized (e.g. active network not yet set) // it's dangerous because in getters (e.g. get gatewayUrl) we rely on it being initialized } protected get gatewayUrl(): string { const url = this.hre.starknet.networkConfig.url; if (this.externalServer.isDockerDesktop) { for (const protocol of ["http://", "https://", ""]) { for (const host of ["localhost", "127.0.0.1"]) { if (url === `${protocol}${host}`) { return `${protocol}${DOCKER_HOST}`; } const prefix = `${protocol}${host}:`; if (url.startsWith(prefix)) { return url.replace(prefix, `${protocol}${DOCKER_HOST}:`); } } } } return url; } public async execute( command: | "starknet-compile-deprecated" | "get_class_hash" | "get_contract_class" | "get_contract_class_hash" | "get_compiled_class_hash", args: string[] ): Promise { return await this.externalServer.post({ command, args }); } protected prepareDeprecatedCompileOptions(options: CompileWrapperOptions): string[] { const ret = [ options.file, "--abi", options.abi, "--output", options.output, "--cairo_path", options.cairoPath ]; if (options.accountContract) { ret.push("--account_contract"); } if (options.disableHintValidation) { ret.push("--disable_hint_validation"); } return ret; } public async deprecatedCompile(options: CompileWrapperOptions): Promise { const preparedOptions = this.prepareDeprecatedCompileOptions(options); const executed = await this.execute("starknet-compile-deprecated", preparedOptions); return executed; } public async compileCairoToSierra(options: CairoToSierraOptions): Promise { const args = this.prepareCairoToSierraOptions(options); const command = this.getCairo1Command(options.binDirPath, CAIRO1_COMPILE_BIN, args); const executed = exec(command.join(" ")); return executed; } public async compileSierraToCasm(options: SierraToCasmOptions): Promise { const args = this.prepareSierraToCasmOptions(options); const command = this.getCairo1Command(options.binDirPath, CAIRO1_SIERRA_COMPILE_BIN, args); const executed = exec(command.join(" ")); return executed; } protected prepareCairoToSierraOptions(options: CairoToSierraOptions): string[] { const args = []; if (options?.replaceIds === true) { args.push("-r"); } if (options.allowedLibfuncsListName) { args.push("--allowed-libfuncs-list-name", options.allowedLibfuncsListName); } if (options.allowedLibfuncsListFile) { args.push("--allowed-libfuncs-list-file", options.allowedLibfuncsListFile); } if (options?.singleFile === true) { args.push("--single-file"); } args.push(options.path); if (options.output) { args.push(options.output); } return args; } protected prepareSierraToCasmOptions(options: SierraToCasmOptions): string[] { const args = []; if (options.allowedLibfuncsListName) { args.push("--allowed-libfuncs-list-name", options.allowedLibfuncsListName); } if (options.allowedLibfuncsListFile) { args.push("--allowed-libfuncs-list-file", options.allowedLibfuncsListFile); } if (options?.addPythonicHints === true) { args.push("--add-pythonic-hints"); } args.push(options.file); if (options.output) { args.push(options.output); } return args; } protected getCairo1Command(binDirPath: string, binCommand: string, args: string[]): string[] { const cairo1Bin = path.join(binDirPath, binCommand); return [cairo1Bin, ...args]; } public async declare(options: DeclareWrapperOptions): Promise { return this.hre.starknetJs.declare( options.contract, options.sender, options.signature, options.nonce, options.maxFee ); } public async getTxStatus(options: TxHashQueryWrapperOptions): Promise { return this.hre.starknetJs.getTxStatus(options.hash); } public async getTransactionTrace(options: TxHashQueryWrapperOptions): Promise { return this.hre.starknetJs.getTransactionTrace(options.hash); } public async getTransactionReceipt(options: TxHashQueryWrapperOptions): Promise { return this.hre.starknetJs.getTransactionReceipt(options.hash); } public async getTransaction(options: TxHashQueryWrapperOptions): Promise { return await this.hre.starknetJs.getTransaction(options.hash); } public async getBlock(options: BlockQueryWrapperOptions): Promise { return this.hre.starknetJs.getBlock(options.hash ?? options.number); } public async getNonce(options: NonceQueryWrapperOptions): Promise { return this.hre.starknetJs.getNonce( options.address, options.blockHash ?? options.blockNumber ); } public async getClassHash(artifactPath: string): Promise { const executed = await this.execute("get_class_hash", [artifactPath]); if (executed.statusCode) { throw new StarknetPluginError(executed.stderr.toString()); } return executed.stdout.toString().trim(); } public async getCompiledClassHash(casmPath: string): Promise { const executed = await this.execute("get_compiled_class_hash", [casmPath]); if (executed.statusCode) { throw new StarknetPluginError(executed.stderr.toString()); } return executed.stdout.toString().trim(); } public async getSierraContractClassHash(casmPath: string): Promise { const executed = await this.execute("get_contract_class_hash", [casmPath]); if (executed.statusCode) { throw new StarknetPluginError(executed.stderr.toString()); } return executed.stdout.toString().trim(); } public async estimateMessageFee( functionName: string, fromAddress: string, toAddress: string, inputs: string[] ): Promise { const body = { from_address: fromAddress, to_address: toAddress, entry_point_selector: selector.getSelectorFromName(functionName), payload: inputs.map((item) => num.toHex(BigInt(item))) }; const response = await axios.post( `${this.hre.starknet.networkConfig.url}/feeder_gateway/estimate_message_fee`, body ); const { gas_price, gas_usage, overall_fee, unit } = response.data; return { amount: BigInt(overall_fee), unit, gas_price: BigInt(gas_price), gas_usage: BigInt(gas_usage) }; } } function getFullImageName(image: Image): string { return `${image.repository}:${image.tag}`; } export class DockerWrapper extends StarknetWrapper { constructor( private image: Image, private rootPath: string, cairoPaths: string[], hre: HardhatRuntimeEnvironment ) { const externalServer = new StarknetDockerProxy(image, rootPath, cairoPaths); super(externalServer, hre); console.log( `${PLUGIN_NAME} plugin using dockerized environment (${getFullImageName(image)})` ); } } export class VenvWrapper extends StarknetWrapper { constructor(venvPath: string, hre: HardhatRuntimeEnvironment) { let pythonPath: string; if (venvPath === "active") { console.log(`${PLUGIN_NAME} plugin using the active environment.`); pythonPath = "python3"; } else { venvPath = normalizeVenvPath(venvPath); console.log(`${PLUGIN_NAME} plugin using environment at ${venvPath}`); pythonPath = getPrefixedCommand(venvPath, "python3"); } super(new StarknetVenvProxy(pythonPath), hre); } protected override get gatewayUrl(): string { return this.hre.starknet.networkConfig.url; } } ================================================ FILE: src/starknet_cli_wrapper.py ================================================ """Wrapper of Starknet CLI""" import asyncio from contextlib import redirect_stderr, redirect_stdout from http.server import HTTPServer, BaseHTTPRequestHandler import io import json import sys # imports resolvable in the venv specified by user try: from starkware.starknet.cli.starknet_cli import main as starknet_main from starkware.starknet.compiler.compile import main as starknet_compile_main from starkware.starknet.core.os.contract_class.deprecated_class_hash import compute_deprecated_class_hash from starkware.starknet.services.api.contract_class.contract_class import DeprecatedCompiledClass from starkware.starknet.services.api.contract_class.contract_class import CompiledClass from starkware.starknet.services.api.contract_class.contract_class_utils import load_sierra from starkware.starknet.core.os.contract_class.class_hash import compute_class_hash from starkware.starknet.core.os.contract_class.compiled_class_hash import compute_compiled_class_hash except ImportError: sys.exit("Make sure the environment you configured has starknet (cairo-lang) installed!") async def starknet_main_wrapper(args): sys.argv = [sys.argv[0], *args] return await starknet_main() async def starknet_compile_main_wrapper(args): sys.argv = [sys.argv[0], *args] try: return starknet_compile_main() except Exception as err: # stderr was previously redirected to our StringIO print(err, file=sys.stderr) return 1 async def get_compiled_class_hash(args): """Returns compiled_class_hash""" sys.argv = [sys.argv[0], *args] try: casm_path = args[0] with open(casm_path, encoding="utf-8") as casm_file: compiled_class = CompiledClass.loads(casm_file.read()) compiled_class_hash = compute_compiled_class_hash(compiled_class) print(hex(compiled_class_hash)) return 0 except Exception as err: print(err, file=sys.stderr) return 1 def get_contract_class(metadata_path): """Returns contract class""" return load_sierra(metadata_path) async def get_class_hash(args): path ,= args with open(path, encoding="utf-8") as file: raw_class = json.load(file) loaded_class = DeprecatedCompiledClass.load(raw_class) class_hash = compute_deprecated_class_hash(loaded_class) print(hex(class_hash)) return 0 async def get_contract_class_hash(args): path , = args contract_class = get_contract_class(path) print(hex(compute_class_hash(contract_class))) return 0 MAIN_MAP = { "starknet": starknet_main_wrapper, "starknet-compile-deprecated": starknet_compile_main_wrapper, "get_class_hash": get_class_hash, "get_contract_class_hash": get_contract_class_hash, "get_compiled_class_hash": get_compiled_class_hash, } class MyRequestHandler(BaseHTTPRequestHandler): def _set_headers(self): self.send_response(200) self.send_header("Content-type", "application/json") self.end_headers() def _get_json_body(self): content_length = int(self.headers["Content-Length"]) raw_request_body = self.rfile.read(content_length).decode("utf-8") return json.loads(raw_request_body) exit_code = None async def _execute(self): json_body = self._get_json_body() command = json_body["command"] main = MAIN_MAP[command] try: return await main(json_body["args"]) except: return 1 # error exit code def do_GET(self): """Useful for checking if server is alive.""" self._set_headers() def do_POST(self): stdout = io.StringIO() stderr = io.StringIO() with redirect_stdout(stdout), redirect_stderr(stderr): event_loop = asyncio.get_event_loop() self.exit_code = event_loop.run_until_complete(self._execute()) resp = { "statusCode": self.exit_code, "stdout": stdout.getvalue(), "stderr": stderr.getvalue() } self._set_headers() self.wfile.write(json.dumps(resp).encode("utf-8")) try: port = int(sys.argv[1]) except: sys.exit("A numeric port must be specified") def run(server_class=HTTPServer, handler_class=MyRequestHandler): server_address = ("", port) httpd = server_class(server_address, handler_class) print("Listening on port", port) try: httpd.serve_forever() except KeyboardInterrupt: print("Exiting") run() ================================================ FILE: src/task-actions.ts ================================================ import * as path from "path"; import * as fs from "fs"; import axios from "axios"; import FormData = require("form-data"); import { StarknetPluginError } from "./starknet-plugin-error"; import { ABI_SUFFIX, ALPHA_TESTNET, CAIRO1_SIERRA_SUFFIX, CAIRO1_ASSEMBLY_SUFFIX, DEFAULT_STARKNET_NETWORK } from "./constants"; import { ProcessResult } from "@nomiclabs/hardhat-docker"; import { adaptLog, traverseFiles, getNetwork, isStarknetDevnet, adaptPath } from "./utils"; import { HardhatNetworkConfig, HardhatRuntimeEnvironment, HttpNetworkConfig, RunSuperFunction, TaskArguments } from "hardhat/types"; import { createIntegratedDevnet } from "./external-server"; import { Recompiler } from "./recompiler"; import { version } from "../package.json"; import * as toml from "@iarna/toml"; import { ScarbWrapper } from "./scarb-wrapper"; import { ScarbConfig } from "./types"; import { getCairoBinDirPath } from "./cairo1-compiler"; function checkSourceExists(sourcePath: string): void { if (!fs.existsSync(sourcePath)) { const msg = `Source expected to be at ${sourcePath}, but not found.`; throw new StarknetPluginError(msg); } } /** * Transfers logs and generates a return status code. * * @param executed The process result of running the container * @returns 0 if succeeded, 1 otherwise */ function processExecuted(executed: ProcessResult, logStatus: boolean): number { if (executed.stdout.length) { console.log(adaptLog(executed.stdout.toString())); } if (executed.stderr.length) { // synchronize param names reported by actual CLI with param names used by this plugin const err = executed.stderr.toString(); const replacedErr = adaptLog(err); console.error(replacedErr); } if (logStatus) { const finalMsg = executed.statusCode ? "Failed" : "Succeeded ✅"; console.log(`\t${finalMsg}\n`); } return executed.statusCode ? 1 : 0; } /** * First deletes the file if it already exists. Then creates an empty file at the provided path. * Unlinking/deleting is necessary if user switched from docker to venv. * @param filePath the file to be recreated */ function initializeFile(filePath: string) { if (fs.existsSync(filePath)) { fs.unlinkSync(filePath); } fs.closeSync(fs.openSync(filePath, "w")); } function getFileName(filePath: string) { return path.basename(filePath, path.extname(filePath)); } class ScarbConfigValidationError extends StarknetPluginError { constructor(path: string, message: string, parent?: Error) { super( `Invalid config file ${path}: ${message}\n` + "To skip this validation, use the --skip-validate flag in the CLI", parent ); } } function loadScarbTomlFromPath(tomlPath: string, validate: boolean): ScarbConfig { const config = toml.parse( fs.readFileSync(tomlPath, "utf-8").toString() ) as unknown as ScarbConfig; const packageName = config.package.name; if (validate) { // it's an array of possible compilation configs const contractTargetConfigs = config?.target["starknet-contract"] || []; const configCandidates = contractTargetConfigs.filter( (config) => !config.name || config.name === packageName ); if (configCandidates.length === 0) { throw new ScarbConfigValidationError( tomlPath, "Property 'name' of [[target.starknet-contract]] must be left out or equal the [package] name" ); } else if (configCandidates.length > 1) { // this case is handled by Scarb } const contractTargetConfig = configCandidates[0]; // assume length = 1 if (!contractTargetConfig || !contractTargetConfig.sierra || !contractTargetConfig.casm) { throw new ScarbConfigValidationError( tomlPath, "To allow later loading of this project's contracts, " + "your TOML file must set 'sierra' and 'casm' to `true` under [[target.starknet-contract]]" ); } } return config; } function loadScarbMainArtifact(scarbArtifactDirPath: string, packageName: string) { const mainPackageArtifactPath = path.join( scarbArtifactDirPath, `${packageName}.starknet_artifacts.json` ); if (!fs.existsSync(mainPackageArtifactPath)) { const msg = `Error in building ${packageName}, could not find ${mainPackageArtifactPath}`; throw new StarknetPluginError(msg); } return JSON.parse(fs.readFileSync(mainPackageArtifactPath, "utf-8").toString()); } async function findPackageConfigPaths( traversablePaths: string[], root: string, configFileName = "Scarb.toml" ) { // collect all package configs by traversing provided paths const packageConfigPaths: string[] = []; for (let traversablePath of traversablePaths) { traversablePath = adaptPath(root, traversablePath); checkSourceExists(traversablePath); const traversionResult = await traverseFiles(traversablePath, configFileName); packageConfigPaths.push( ...traversionResult.filter((p) => path.basename(p) == configFileName) ); } if (!packageConfigPaths.length) { const msg = `No projects to build. Could not find directories containing ${configFileName}`; throw new StarknetPluginError(msg); } return packageConfigPaths; } export async function starknetCompileCairo1Action( args: TaskArguments, hre: HardhatRuntimeEnvironment ) { const binDirPath = await getCairoBinDirPath(args, hre.config.starknet); const root = hre.config.paths.root; const rootRegex = new RegExp("^" + root); const defaultSourcesPath = hre.config.paths.starknetSources; const sourcesPaths: string[] = args.paths || [defaultSourcesPath]; const artifactsPath = hre.config.paths.starknetArtifacts; let statusCode = 0; for (let sourcesPath of sourcesPaths) { sourcesPath = adaptPath(root, sourcesPath); checkSourceExists(sourcesPath); const recompiler = new Recompiler(hre); const files = await traverseFiles(sourcesPath, "*.cairo"); for (const file of files) { console.log("Compiling", file); const dirSuffix = file.replace(rootRegex, ""); const fileName = getFileName(dirSuffix); const dirPath = path.join(artifactsPath, dirSuffix); const outputPath = path.join(dirPath, `${fileName}${CAIRO1_SIERRA_SUFFIX}`); fs.mkdirSync(dirPath, { recursive: true }); initializeFile(outputPath); // Compile to sierra representation { const executed = await hre.starknetWrapper.compileCairoToSierra({ path: file, output: outputPath, binDirPath, replaceIds: args.replaceIds, allowedLibfuncsListName: args.allowedLibfuncsListName, allowedLibfuncsListFile: args.allowedLibfuncsListFile, singleFile: args.singleFile }); statusCode += processExecuted(executed, true); if (executed.statusCode) { // continue with compiling to casm only if compiling to sierra succeeded continue; } } // Copy abi array from output to abiOutput const abiOutput = path.join(dirPath, `${fileName}${ABI_SUFFIX}`); initializeFile(abiOutput); const outputJson = JSON.parse(fs.readFileSync(outputPath, "utf-8")); fs.writeFileSync(abiOutput, JSON.stringify(outputJson.abi) + "\n"); const casmOutput = path.join(dirPath, `${fileName}${CAIRO1_ASSEMBLY_SUFFIX}`); initializeFile(casmOutput); // Compile sierra to casm representation { const executed = await hre.starknetWrapper.compileSierraToCasm({ file: outputPath, output: casmOutput, binDirPath, addPythonicHints: args.addPythonicHints, allowedLibfuncsListName: args.allowedLibfuncsListName, allowedLibfuncsListFile: args.allowedLibfuncsListFile }); statusCode += processExecuted(executed, true); } // Update cache after compilation await recompiler.updateCache(args, file, outputPath, abiOutput); } await recompiler.saveCache(); } if (statusCode) { const msg = `Failed compilation of ${statusCode} contract${statusCode === 1 ? "" : "s"}.`; throw new StarknetPluginError(msg); } } export async function starknetDeprecatedCompileAction( args: TaskArguments, hre: HardhatRuntimeEnvironment ) { const root = hre.config.paths.root; const rootRegex = new RegExp("^" + root); const defaultSourcesPath = hre.config.paths.starknetSources; const sourcesPaths: string[] = args.paths || [defaultSourcesPath]; const artifactsPath = hre.config.paths.starknetArtifacts; const cairoPaths = [defaultSourcesPath, root]; if (args.cairoPath) { args.cairoPath.split(":").forEach((path: string) => { cairoPaths.push(path); }); } if (hre.config.paths.cairoPaths) { hre.config.paths.cairoPaths.forEach((path: string) => { cairoPaths.push(path); }); } for (let i = 0; i < cairoPaths.length; i++) { if (!path.isAbsolute(cairoPaths[i])) { cairoPaths[i] = adaptPath(root, cairoPaths[i]); } } const cairoPath = cairoPaths.join(":"); let statusCode = 0; for (let sourcesPath of sourcesPaths) { sourcesPath = adaptPath(root, sourcesPath); checkSourceExists(sourcesPath); const files = await traverseFiles(sourcesPath, "*.cairo"); const recompiler = new Recompiler(hre); for (const file of files) { console.log("Compiling", file); const dirSuffix = file.replace(rootRegex, ""); const fileName = getFileName(dirSuffix); const dirPath = path.join(artifactsPath, dirSuffix); const outputPath = path.join(dirPath, `${fileName}.json`); const abiPath = path.join(dirPath, `${fileName}${ABI_SUFFIX}`); fs.mkdirSync(dirPath, { recursive: true }); initializeFile(outputPath); initializeFile(abiPath); const executed = await hre.starknetWrapper.deprecatedCompile({ file, output: outputPath, abi: abiPath, cairoPath, accountContract: args.accountContract, disableHintValidation: args.disableHintValidation }); // Update cache after compilation await recompiler.updateCache(args, file, outputPath, abiPath, cairoPath); statusCode += processExecuted(executed, true); } await recompiler.saveCache(); } if (statusCode) { const msg = `Failed compilation of ${statusCode} contract${statusCode === 1 ? "" : "s"}.`; throw new StarknetPluginError(msg); } } export async function starknetBuildAction(args: TaskArguments, hre: HardhatRuntimeEnvironment) { const root = hre.config.paths.root; const rootRegex = new RegExp("^" + root); const defaultSourcesPath = hre.config.paths.starknetSources; const traversablePaths: string[] = args.paths || [defaultSourcesPath]; const packageConfigPaths = await findPackageConfigPaths(traversablePaths, root); const artifactsPath = hre.config.paths.starknetArtifacts; const scarbWrapper = ScarbWrapper.getInstance(args, hre); let statusCode = 0; for await (const packageConfigPath of packageConfigPaths) { // each config path is assumed to be of format $hardhat_project_root//Scarb.toml let packageConfig = null; try { packageConfig = loadScarbTomlFromPath(packageConfigPath, !args.skipValidate); } catch (error) { console.error(error); statusCode += 1; continue; } const packageName = packageConfig.package.name; // strip "Scarb.toml" from path end to get $hardhat_project_root// const packageDir = path.dirname(packageConfigPath); console.log(`Building package ${packageName} from ${packageDir}`); // not using path.basename(...) because it could be a more complex path than just the directory name const dirSuffix = packageDir.replace(rootRegex, ""); // / const artifactDirPath = path.join(artifactsPath, dirSuffix); // starknet-artifacts// const executed = scarbWrapper.build(packageConfigPath, artifactDirPath); statusCode += processExecuted(executed, true); if (executed.statusCode) { // continue with compiling to casm only if compiling to sierra succeeded continue; } // by default (dev mode, unlike the release mode), scarb stores artifacts in subdir "dev" const scarbArtifactDirPath = path.join(artifactDirPath, "dev"); // load scarb's main build artifact const mainPackageArtifact = loadScarbMainArtifact(scarbArtifactDirPath, packageName); for (const contractEntry of mainPackageArtifact.contracts) { // package_contract (underscore separation) const fileName = `${contractEntry.package_name}_${contractEntry.contract_name}`; // artifact dir created by us, not the one created by scarb const ourArtifactDirPath = path.join(artifactDirPath, `${fileName}.cairo`); fs.mkdirSync(ourArtifactDirPath, { recursive: true }); // We want to create artifacts compatible with our contract loading mechanisms. // To achieve this, we will now copy scarb artifacts // this is false if user skipped validation if (contractEntry.artifacts.sierra) { const scarbSierraPath = path.join( scarbArtifactDirPath, contractEntry.artifacts.sierra ); const ourSierraPath = path.join( ourArtifactDirPath, `${fileName}${CAIRO1_SIERRA_SUFFIX}` ); fs.copyFileSync(scarbSierraPath, ourSierraPath); // Copy abi array from output to abiOutput const abiOutput = path.join(ourArtifactDirPath, `${fileName}${ABI_SUFFIX}`); initializeFile(abiOutput); const outputJson = JSON.parse(fs.readFileSync(scarbSierraPath, "utf-8")); fs.writeFileSync(abiOutput, JSON.stringify(outputJson.abi) + "\n"); } // this is false if user skipped validation if (contractEntry.artifacts.casm) { const scarbCasmPath = path.join(scarbArtifactDirPath, contractEntry.artifacts.casm); const ourCasmPath = path.join( ourArtifactDirPath, `${fileName}${CAIRO1_ASSEMBLY_SUFFIX}` ); fs.copyFileSync(scarbCasmPath, ourCasmPath); } } } if (statusCode) { const msg = `Failed building of ${statusCode} project${statusCode === 1 ? "" : "s"}.`; throw new StarknetPluginError(msg); } } export async function amarnaAction(args: TaskArguments, hre: HardhatRuntimeEnvironment) { await hre.amarnaDocker.run(args); } /** * Extracts the verification URL assigned to the network provided. * If no `networkName` is provided, defaults to Alpha testnet. * If `networkName` is provided, but not supported for verification, an error is thrown. * @param networkName the name of the network * @param hre the runtime environment from which network data is extracted * @param origin short string describing where/how `networkName` was specified */ function getVerificationNetwork( networkName: string, hre: HardhatRuntimeEnvironment, origin: string ) { networkName ||= ALPHA_TESTNET; const network = getNetwork(networkName, hre.config.networks, origin); if (!network.verificationUrl) { throw new StarknetPluginError( `Network ${networkName} does not support Voyager verification.` ); } return network; } export async function starknetVoyagerAction(args: TaskArguments, hre: HardhatRuntimeEnvironment) { const network = getVerificationNetwork(args.starknetNetwork, hre, "--starknet-network"); const voyagerUrl = `${network.verificationUrl}${args.address}/code`; const verifiedUrl = `${network.verifiedUrl}${args.address}#code`; let isVerified = false; try { const resp = await axios.get(voyagerUrl); const data = resp.data; if (data.contract) { if (data.contract.length > 0 || Object.keys(data.contract).length > 0) { isVerified = true; } } } catch (error) { const msg = "Something went wrong while checking if the contract has already been verified."; throw new StarknetPluginError(msg); } if (isVerified) { console.log(`Contract at address ${args.address} has already been verified`); console.log(`Check it out on Voyager: ${verifiedUrl}`); } else { await handleContractVerification(args, voyagerUrl, verifiedUrl, hre); } } function getMainVerificationPath(contractPath: string, root: string) { if (!path.isAbsolute(contractPath)) { contractPath = adaptPath(root, contractPath); if (!fs.existsSync(contractPath)) { throw new StarknetPluginError(`File ${contractPath} does not exist`); } } return contractPath; } async function handleContractVerification( args: TaskArguments, voyagerUrl: string, verifiedUrl: string, hre: HardhatRuntimeEnvironment ) { // Set main contract path const mainPath = getMainVerificationPath(args.path, hre.config.paths.root); const paths = [mainPath]; const bodyFormData = new FormData(); bodyFormData.append("compiler-version", args.compilerVersion); const accountContract = args.accountContract ? "true" : "false"; bodyFormData.append("account-contract", accountContract); bodyFormData.append("license", args.license || "No License (None)"); // Dependencies (non-main contracts) are in args.paths if (args.paths) { paths.push(...args.paths); } const sourceRegex = new RegExp("^" + hre.config.paths.starknetSources + "/"); const contractNameDefault = mainPath.replace(sourceRegex, ""); // If contract name is not provided, use the default bodyFormData.append("contract-name", contractNameDefault); // Appends all contracts to the form data with the name "file" + index handleMultiPartContractVerification(bodyFormData, paths, hre.config.paths.root, sourceRegex); await axios .post(voyagerUrl, bodyFormData.getBuffer(), { headers: bodyFormData.getHeaders() }) .catch((err) => { throw new StarknetPluginError( `\ Could not verify the contract at address ${args.address}. ${ err.response.data.message || `It is hard to tell exactly what happened, but possible reasons include: - Deployment transaction hasn't been accepted or indexed yet (check its tx_status or try in a minute) - Wrong contract address - Wrong files provided - Wrong main contract chosen (first after --path) - Voyager is down` } ` ); }); console.log(`Contract has been successfully verified at address ${args.address}`); console.log(`Check it out on Voyager: ${verifiedUrl}`); } function handleMultiPartContractVerification( bodyFormData: FormData, paths: string[], root: string, sourceRegex: RegExp ) { paths.forEach(function (item: string, index: number) { if (!path.isAbsolute(item)) { paths[index] = adaptPath(root, item); if (!fs.existsSync(paths[index])) { throw new StarknetPluginError(`File ${paths[index]} does not exist`); } } bodyFormData.append("file" + index, fs.readFileSync(paths[index]), { filepath: paths[index].replace(sourceRegex, ""), contentType: "application/octet-stream" }); }); } /** * Used later on for network interaction. * @param args Hardhat CLI args * @param hre HardhatRuntimeEnvironment */ function setRuntimeNetwork(args: TaskArguments, hre: HardhatRuntimeEnvironment) { let networkName; let networkConfig: HardhatNetworkConfig; if (args.starknetNetwork) { networkName = args.starknetNetwork; networkConfig = getNetwork(networkName, hre.config.networks, "--starknet-network"); } else if (hre.config.starknet.network) { networkName = hre.config.starknet.network; networkConfig = getNetwork( networkName, hre.config.networks, "starknet.network in hardhat.config" ); } else { networkName = DEFAULT_STARKNET_NETWORK; networkConfig = getNetwork(networkName, hre.config.networks, "default settings"); } hre.starknet.network = networkName; hre.starknet.networkConfig = networkConfig; hre.starknetJs.setProvider(hre.starknet.networkConfig); console.log(`Using network ${hre.starknet.network} at ${hre.starknet.networkConfig.url}`); } async function runWithDevnet(hre: HardhatRuntimeEnvironment, fn: () => Promise) { if (!isStarknetDevnet(hre.starknet.network)) { await fn(); return; } const devnet = createIntegratedDevnet(hre); await devnet.start(); await fn(); devnet.stop(); } export async function starknetTestAction( args: TaskArguments, hre: HardhatRuntimeEnvironment, runSuper: RunSuperFunction ) { setRuntimeNetwork(args, hre); await new Recompiler(hre).handleCache(); await runWithDevnet(hre, async () => { await runSuper(args); }); } export async function starknetRunAction( args: TaskArguments, hre: HardhatRuntimeEnvironment, runSuper: RunSuperFunction ) { if (args.starknetNetwork) { throw new StarknetPluginError(`Using "--starknet-network" with "hardhat run" currently does not have effect. Use the "network" property of the "starknet" object in your hardhat config file.`); } setRuntimeNetwork(args, hre); await new Recompiler(hre).handleCache(); await runWithDevnet(hre, async () => { await runSuper(args); }); } export async function starknetPluginVersionAction() { console.log(`Version: ${version}`); } ================================================ FILE: src/type-extensions.ts ================================================ import "hardhat/types/config"; import "hardhat/types/runtime"; import { GetBlockResponse } from "starknet"; import { Account } from "./account"; import { StarknetChainId } from "./constants"; import { AmarnaDocker } from "./external-server/docker-amarna"; import { Transaction, TransactionReceipt, TransactionTrace } from "./starknet-types"; import { StarknetLegacyWrapper } from "./starknet-js-wrapper"; import { StarknetWrapper } from "./starknet-wrappers"; import { StarknetContract, StarknetContractFactory, StringMap } from "./types"; import * as DevnetTypes from "./types/devnet"; import * as StarknetTypes from "./types/starknet"; declare module "hardhat/types/config" { export interface ProjectPathsUserConfig { starknetArtifacts?: string; starknetSources?: string; cairoPaths?: string[]; } export interface ProjectPathsConfig { starknetArtifacts: string; starknetSources?: string; cairoPaths?: string[]; } export interface HardhatConfig { starknet: StarknetTypes.StarknetConfig; } export interface HardhatUserConfig { starknet?: StarknetTypes.StarknetConfig; } export interface NetworksConfig { alphaGoerli: HttpNetworkConfig; alphaGoerli2: HttpNetworkConfig; alphaMainnet: HttpNetworkConfig; integratedDevnet: HardhatNetworkConfig; } export interface NetworksUserConfig { integratedDevnet?: HardhatNetworkUserConfig; } export interface HttpNetworkConfig { verificationUrl?: string; verifiedUrl?: string; starknetChainId?: StarknetChainId; vmLang?: VmLang; } export interface HardhatNetworkConfig { url?: string; venv?: string; dockerizedVersion?: string; starknetChainId?: StarknetChainId; args?: string[]; stdout?: string; stderr?: string; vmLang?: VmLang; } export interface HardhatNetworkUserConfig { url?: string; venv?: string; dockerizedVersion?: string; args?: string[]; stdout?: string; stderr?: string; vmLang?: VmLang; } type VmLang = "python" | "rust" | ""; } type StarknetContractType = StarknetContract; type StarknetContractFactoryType = StarknetContractFactory; type StringMapType = StringMap; type AccountType = Account; type TransactionReceiptType = TransactionReceipt; type TransactionTraceType = TransactionTrace; type TransactionType = Transaction; type BlockType = GetBlockResponse; declare module "hardhat/types/runtime" { export interface Devnet extends DevnetTypes.Devnet {} interface HardhatRuntimeEnvironment { starknetWrapper: StarknetWrapper; amarnaDocker: AmarnaDocker; starknet: StarknetTypes.Starknet; starknetJs: StarknetLegacyWrapper; } type StarknetContract = StarknetContractType; type StarknetContractFactory = StarknetContractFactoryType; type StringMap = StringMapType; type Account = AccountType; type Transaction = TransactionType; type TransactionReceipt = TransactionReceiptType; type TransactionTrace = TransactionTraceType; type Block = BlockType; } ================================================ FILE: src/types/devnet.ts ================================================ import { Numeric } from "."; import { FlushResponse, IncreaseTimeResponse, LoadL1MessagingContractResponse, SetTimeResponse, PredeployedAccount, L1ToL2MockTxResponse, L2ToL1MockTxResponse, NewBlockResponse } from "../devnet-utils"; import { MintResponse } from "../starknet-types"; export interface Devnet { /** * Restarts the devnet. * @returns void * @throws {@link StarknetPluginError} */ restart(): Promise; /** * Handles all pending L1 to L2 messages and sends them to the other layer * @returns {Promise} - Metadata for the flushed messages */ flush: () => Promise; /** * Deploys or loads the L1 messaging contract. * @param {string} networkUrl - L1 network url. * @param {string} [address] - Address of the contract to be loaded. * @param {string} [networkId] - Determines if the ganache or testnet should be used/ * @returns */ loadL1MessagingContract: ( networkUrl: string, address?: string, networkId?: string ) => Promise; /** * Sends a mock message from L1 to L2 without running L1. * @param {string} l2ContractAddress - Address of the L2 contract. * @param {string} functionName - Function name for entry point selector. * @param {string} l1ContractAddress - Address of the L1 contract. * @param {Array} payload - Payload to send to the L2 network. * @param {string} nonce - Nonce value * @param {string} paidFeeOnL1 - Paid fee on L1 * @returns Transaction hash */ sendMessageToL2: ( l2ContractAddress: string, functionName: string, l1ContractAddress: string, payload: Array, nonce: Numeric, paidFeeOnL1: Numeric ) => Promise; /** * Sends a mock message from L2 to L1 * @param {string} l2ContractAddress - Address of the L2 contract. * @param {string} l1ContractAddress - Address of the L1 contract. * @param {Array} payload - Payload to send to the L1 network. * @returns Message hash */ consumeMessageFromL2: ( l2ContractAddress: string, l1ContractAddress: string, payload: Array ) => Promise; /** * Increases block time offset * @param seconds the offset increase in seconds * @returns an object containing the increased block time offset */ increaseTime: (seconds: number) => Promise; /** * Sets the timestamp of next block * @param seconds timestamp in seconds * @returns an object containing next block timestamp */ setTime: (seconds: number) => Promise; /** * Fetch the predeployed accounts * @returns an object containing array of account's metadata */ getPredeployedAccounts: () => Promise; /** * Preserves devnet instance to a file * @param path path for the dumping * @return void */ dump: (path: string) => Promise; /** * Loads stored Starknet chain state * @param path path for the dump file * @returns void */ load: (path: string) => Promise; /** * Creates an empty block * @returns NewBlockResponse with block hash */ createBlock: () => Promise; /** * Assumes there is a /mint endpoint on the current starknet network * @param address the address to fund * @param amount the amount to fund * @param lite whether to make it lite or not */ mint: (address: string, amount: number, lite?: boolean) => Promise; } ================================================ FILE: src/types/index.ts ================================================ import { HardhatRuntimeEnvironment } from "hardhat/types"; import fs from "node:fs"; import { CallData, SequencerProvider, events as eventUtil, hash, json, selector } from "starknet"; import { adaptInputUtil, adaptOutputUtil, formatFelt } from "../adapt"; import { CHECK_STATUS_RECOVER_TIMEOUT, QUERY_VERSION, TRANSACTION_VERSION, HEXADECIMAL_REGEX, CHECK_STATUS_TIMEOUT } from "../constants"; import { StarknetPluginError } from "../starknet-plugin-error"; import * as starknet from "../starknet-types"; import { StarknetWrapper } from "../starknet-wrappers"; import { adaptLog, copyWithBigint, findConstructor, sleep, warn } from "../utils"; /** * According to: https://starknet.io/docs/hello_starknet/intro.html#interact-with-the-contract * Not using an enum to avoid code duplication and reverse mapping. */ export type TxStatus = /** The transaction passed the validation and entered the pending block. */ | "PENDING" /** The transaction has not been received yet (i.e., not written to storage). */ | "NOT_RECEIVED" /** The transaction was received by the operator. */ | "RECEIVED" /** The transaction failed validation and thus was skipped. */ | "REJECTED" /** The transaction passed validation but failed execution, and will be (or was) * included in a block (nonce will be incremented and an execution fee will be charged). * This status does not distinguish between accepted on L2 / accepted on L1 blocks. */ | "REVERTED" /** The transaction passed the validation and entered an actual created block. */ | "ACCEPTED_ON_L2" /** The transaction was accepted on-chain. */ | "ACCEPTED_ON_L1"; export type InvokeResponse = string; export type StarknetContractFactoryConfig = { abiPath: string; casmPath?: string; metadataPath: string; hre: HardhatRuntimeEnvironment; }; export interface StarknetContractConfig { abiPath: string; hre: HardhatRuntimeEnvironment; isCairo1: boolean; } export type Numeric = number | bigint; /** * Object whose keys are strings (names) and values are any object. */ export interface StringMap { [key: string]: any; } /** * Object holding the event name and have a property data of type StingMap. */ export interface DecodedEvent { name: string; data: StringMap; } /** * Enumerates the ways of interacting with a contract. */ export class InteractChoice { static readonly INVOKE = new InteractChoice(["invoke"], "invoke", true, TRANSACTION_VERSION); static readonly CALL = new InteractChoice(["call"], "call", false, QUERY_VERSION); static readonly ESTIMATE_FEE = new InteractChoice( ["invoke", "--estimate_fee"], "estimateFee", false, QUERY_VERSION ); private constructor( /** * The way it's supposed to be used passed to CLI commands. */ public readonly cliCommand: string[], /** * The way it's supposed to be used internally in code. */ public readonly internalCommand: keyof StarknetContract, /** * Indicates whether the belonging CLI option allows specifying max_fee. */ public readonly allowsMaxFee: boolean, /** * The version of the transaction. */ public transactionVersion: Numeric ) {} } export function extractClassHash(response: string) { return extractFromResponse(response, /^Contract class hash: (.*)$/m); } function extractTxHash(response: string) { return extractFromResponse(response, /^Transaction hash: (.*)$/m); } function extractFromResponse(response: string, regex: RegExp) { const matched = response.match(regex); if (!matched || !matched[1]) { throw new StarknetPluginError( `Could not parse response. Check that you're using the correct network. Response received: ${response}` ); } return matched[1]; } /** * The object returned by starknet tx_status. */ type StatusObject = { block_hash: string; tx_status: TxStatus; tx_failure_reason?: starknet.TxFailureReason; }; async function checkStatus(hash: string, starknetWrapper: StarknetWrapper): Promise { const executed = await starknetWrapper.getTxStatus({ hash }); if (executed.statusCode) { throw new StarknetPluginError(executed.stderr.toString()); } const response = executed.stdout.toString(); try { const responseParsed = JSON.parse(response); return responseParsed; } catch (err) { throw new StarknetPluginError(`Cannot interpret the following: ${response}`); } } const ACCEPTABLE_STATUSES: TxStatus[] = ["PENDING", "ACCEPTED_ON_L2", "ACCEPTED_ON_L1"]; export function isTxAccepted(statusObject: StatusObject): boolean { return ACCEPTABLE_STATUSES.includes(statusObject.tx_status); } const UNACCEPTABLE_STATUSES: TxStatus[] = ["REJECTED", "REVERTED"]; function isTxRejected(statusObject: StatusObject): boolean { return UNACCEPTABLE_STATUSES.includes(statusObject.tx_status); } export async function iterativelyCheckStatus( txHash: string, starknetWrapper: StarknetWrapper, resolve: (status: string) => void, reject: (reason: Error) => void, retryCount = 10 ) { // eslint-disable-next-line no-constant-condition while (true) { let count = retryCount; let statusObject: StatusObject; let error; while (count > 0) { // This promise is rejected usually if the network is unavailable statusObject = await checkStatus(txHash, starknetWrapper).catch((reason) => { error = reason; return undefined; }); // Check count at 1 to avoid unnecessary waiting(sleep) in the last iteration if (statusObject || count === 1) { break; } await sleep(CHECK_STATUS_RECOVER_TIMEOUT); warn("Retrying transaction status check..."); count--; } if (!statusObject) { warn("Checking transaction status failed."); return reject(error); } else if (isTxAccepted(statusObject)) { return resolve(statusObject.tx_status); } else if (isTxRejected(statusObject)) { const adaptedError = adaptLog(JSON.stringify(statusObject, null, 4)); return reject(new Error(adaptedError)); } await sleep(CHECK_STATUS_TIMEOUT); } } /** * Reads the ABI from `abiPath` */ function readAbi(abiPath: string): string { return hash.formatSpaces(fs.readFileSync(abiPath).toString("ascii").trim()); } /** * Converts `rawAbi` to an object for lookup by name */ function mapAbi(rawAbi: string): starknet.Abi { const abiArray = json.parse(rawAbi); const abi: starknet.Abi = {}; extractAbiEntries(abiArray, abi); return abi; } /** * Recursively extract abi entries and populate the provided `abi` object. */ function extractAbiEntries(abiArray: starknet.AbiEntry[], abi: starknet.Abi) { for (const abiEntry of abiArray) { if ("items" in abiEntry) { extractAbiEntries(abiEntry.items, abi); } else { if (!abiEntry.name) { const msg = `Abi entry has no name: ${abiEntry}`; throw new StarknetPluginError(msg); } abi[abiEntry.name] = abiEntry; } } } /** * Add `signature` elements to to `starknetArgs`, if there are any. * @param signature array of transaction signature elements */ function handleSignature(signature: Array): string[] { if (signature) { return signature.map((s) => s.toString()); } return []; } /** * Extract events from the ABI. * @param abi the path where ABI is stored on disk. * @returns an object mapping ABI entry names with their values. */ function extractEventSpecifications(abi: starknet.Abi) { const events: starknet.EventAbi = {}; for (const abiEntryName in abi) { if (abi[abiEntryName].type === "event") { const event = abi[abiEntryName]; const encodedEventName = selector.getSelectorFromName(event.name); events[encodedEventName] = event; } } return events; } export function parseFeeEstimation(raw: string): starknet.FeeEstimation { const matchedAmount = raw.match(/^The estimated fee is: (\d*) WEI \(.* ETH\)\./m); const matchedGasUsage = raw.match(/^Gas usage: (\d*)/m); const matchedGasPrice = raw.match(/^Gas price: (\d*) WEI/m); if (matchedAmount && matchedGasUsage && matchedGasPrice) { return { amount: BigInt(matchedAmount[1]), unit: "wei", gas_price: BigInt(matchedGasPrice[1]), gas_usage: BigInt(matchedGasUsage[1]) }; } throw new StarknetPluginError(`Cannot parse fee estimation response:\n${raw}`); } /** * Returns a modified copy of the provided object with its blockNumber set to pending. * @param options the options object with a blockNumber key */ function defaultToPendingBlock(options: T): T { const adaptedOptions = copyWithBigint(options); if (adaptedOptions.blockNumber === undefined) { // using || operator would not handle the zero case correctly adaptedOptions.blockNumber = "pending"; } return adaptedOptions; } export interface DeclareOptions { token?: string; signature?: Array; sender?: string; // address nonce?: Numeric; maxFee?: Numeric; overhead?: number; version?: number; } export interface DeployOptions { salt?: string; unique?: boolean; maxFee?: Numeric; nonce?: Numeric; } export interface DeployAccountOptions { maxFee?: Numeric; overhead?: number; } export interface InvokeOptions { signature?: Array; nonce?: Numeric; maxFee?: Numeric; rawInput?: boolean; overhead?: number; } export interface CallOptions { signature?: Array; blockNumber?: BlockNumber; nonce?: Numeric; maxFee?: Numeric; rawInput?: boolean; rawOutput?: boolean; token?: string; salt?: string; unique?: boolean; sender?: string; // address } export type EstimateFeeOptions = CallOptions; export type InteractOptions = InvokeOptions | CallOptions | EstimateFeeOptions; export type ContractInteractionFunction = ( functionName: string, args?: StringMap, options?: InteractOptions ) => Promise; export type BlockNumber = number | "pending" | "latest"; export interface BlockIdentifier { blockNumber?: BlockNumber; blockHash?: string; } export type SierraEntryPointsByType = { CONSTRUCTOR: SierraContractEntryPointFields[]; EXTERNAL: SierraContractEntryPointFields[]; L1_HANDLER: SierraContractEntryPointFields[]; }; export type SierraContractEntryPointFields = { selector: string; function_idx: number; }; export type NonceQueryOptions = BlockIdentifier; export class StarknetContractFactory { private hre: HardhatRuntimeEnvironment; public abi: starknet.Abi; public abiPath: string; public abiRaw: string; private constructorAbi: starknet.CairoFunction; public metadataPath: string; public casmPath: string; private classHash: string; constructor(config: StarknetContractFactoryConfig) { this.hre = config.hre; this.abiPath = config.abiPath; this.abiRaw = readAbi(this.abiPath); this.abi = mapAbi(this.abiRaw); this.metadataPath = config.metadataPath; this.casmPath = config.casmPath; const constructorPredicate = this.resolveConstructorPredicate(); this.constructorAbi = findConstructor(this.abi, constructorPredicate); } private resolveConstructorPredicate(): (abiEntry: starknet.AbiEntry) => boolean { if (!this.isCairo1()) { return (abiEntry: starknet.AbiEntry): boolean => { return abiEntry.type === "constructor"; }; } const casmJson = JSON.parse(fs.readFileSync(this.casmPath, "utf-8")); if (casmJson?.compiler_version.split(".")[0] === "0") { const msg = ".CASM json should have been generated with a compiler version >= 1"; throw new StarknetPluginError(msg); } const constructors = casmJson?.entry_points_by_type?.CONSTRUCTOR; if (!constructors || constructors.length === 0) { return () => false; } // Can be removed after new cairo release. if (constructors.length > 1) { const msg = "There can be at most 1 constructor."; throw new StarknetPluginError(msg); } // Can be simplified once starkware fixes multiple constructor issue. // Precomputed selector can be used if only 'constructor' name allowed const constructorSelector = constructors[0].selector; return (abiEntry: starknet.AbiEntry): boolean => { return selector.getSelectorFromName(abiEntry.name) === constructorSelector; }; } /** * Declare a contract class. * @param options optional arguments to class declaration * @returns transaction hash as a hex string */ async declare(options: DeclareOptions = {}): Promise { const executed = await this.hre.starknetWrapper.declare({ contract: this.metadataPath, maxFee: (options.maxFee || 0).toString(), token: options.token, signature: handleSignature(options.signature), sender: options.sender, nonce: options.nonce?.toString() }); if (executed.statusCode) { const msg = `Could not declare class: ${executed.stderr.toString()}`; throw new StarknetPluginError(msg); } const executedOutput = executed.stdout.toString(); const txHash = extractTxHash(executedOutput); return new Promise((resolve, reject) => { iterativelyCheckStatus( txHash, this.hre.starknetWrapper, () => resolve(txHash), (error) => { reject(new StarknetPluginError(`Declare transaction ${txHash}: ${error}`)); } ); }); } handleConstructorArguments(constructorArguments: StringMap): string[] { if (!this.constructorAbi) { const argsProvided = Object.keys(constructorArguments || {}).length; if (argsProvided) { const msg = `No constructor arguments required but ${argsProvided} provided`; throw new StarknetPluginError(msg); } return []; } return adaptInputUtil( this.constructorAbi.name, constructorArguments, this.constructorAbi.inputs, this.abi, this.isCairo1() ); } /** * Returns a contract instance with set address. * No address validity checks are performed. * @param address the address of a previously deployed contract * @returns the contract instance at the provided address */ getContractAt(address: string) { if (!address) { throw new StarknetPluginError("No address provided"); } if (typeof address !== "string" || !HEXADECIMAL_REGEX.test(address)) { throw new StarknetPluginError( `Address must be 0x-prefixed hex string. Got: "${address}".` ); } const contract = new StarknetContract({ abiPath: this.abiPath, hre: this.hre, isCairo1: this.isCairo1() }); contract.address = address; return contract; } getAbiPath() { return this.abiPath; } isCairo1() { return !!this.casmPath; } async getClassHash() { const method = this.isCairo1() ? "getSierraContractClassHash" : "getClassHash"; this.classHash = this.classHash ?? (await this.hre.starknetWrapper[method](this.metadataPath)); return this.classHash; } } export class StarknetContract { private hre: HardhatRuntimeEnvironment; protected abi: starknet.Abi; protected abiPath: string; protected abiRaw: string; private isCairo1: boolean; private eventsSpecifications: starknet.EventAbi; private _address: string; public deployTxHash: string; constructor(config: StarknetContractConfig) { this.hre = config.hre; this.abiPath = config.abiPath; this.abiRaw = readAbi(this.abiPath); this.abi = mapAbi(this.abiRaw); this.isCairo1 = config.isCairo1; this.eventsSpecifications = extractEventSpecifications(this.abi); } get address(): string { return this._address; } set address(address: string) { this._address = address; return; } get provider(): SequencerProvider { return this.hre.starknetJs.provider; } /** * Set a custom abi and abi path to the contract * @param implementation the contract factory of the implementation to be set */ setImplementation(implementation: StarknetContractFactory): void { this.abi = implementation.abi; this.abiPath = implementation.abiPath; } /** * Invoke the function by name and optionally provide arguments in an array. * For a usage example @see {@link call} * @param functionName * @param args arguments to Starknet contract function * @options optional additions to invoking * @returns a Promise that resolves when the status of the transaction is at least `PENDING` */ async invoke( functionName: string, args?: StringMap, options: InvokeOptions = {} ): Promise { try { const adaptedInput = options.rawInput ? args : this.adaptInput(functionName, args); const { transaction_hash: txHash } = await this.provider.invokeFunction( { contractAddress: this.address, entrypoint: functionName, calldata: adaptedInput, signature: options.signature.map(String) }, { nonce: options.nonce ?? (await this.provider.getNonceForAddress(this.address)), maxFee: options.maxFee, version: InteractChoice.INVOKE.transactionVersion } ); return new Promise((resolve, reject) => { iterativelyCheckStatus( txHash, this.hre.starknetWrapper, () => resolve(txHash), (error) => { reject(new StarknetPluginError(`Invoke transaction ${txHash}: ${error}`)); } ); }); } catch (error) { if (!(error instanceof Error)) throw error; throw new StarknetPluginError(error.message, error); } } /** * Call the function by name and optionally provide arguments in an array. * * E.g. If your contract has a function * ```text * func double_sum(x: felt, y: felt) -> (res: felt): * return (res=(x + y) * 2) * end * ``` * then you would call it like: * ```typescript * const contract = ...; * const { res: sum } = await contract.call("double_sum", { x: 2, y: 3 }); * console.log(sum); * ``` * which would result in: * ```text * > 10n * ``` * * If options.rawOutput, the Promised object holds a property `response` with an array of strings. * * @param functionName * @param args arguments to Starknet contract function * @param options optional additions to calling * @returns a Promise that resolves when the status of the transaction is at least `PENDING` */ async call( functionName: string, args?: StringMap, options: CallOptions = {} ): Promise { try { const adaptedOptions = defaultToPendingBlock(options); const adaptedInput = adaptedOptions.rawInput ? args : this.adaptInput(functionName, args); const { result } = await this.provider.callContract( { contractAddress: this.address, entrypoint: functionName, calldata: adaptedInput }, adaptedOptions.blockNumber ); // align to legacy stdout output const response = result.map(formatFelt).join(" "); if (options.rawOutput) { return { response }; } return this.adaptOutput(functionName, response); } catch (error) { if (!(error instanceof Error)) throw error; throw new StarknetPluginError(error.message, error); } } /** * Computes L1-to-L2 message fee estimation * @param {string} functionName Function name for entry point selector * @param {StringMap} args - Arguments to Starknet contract function * @returns Fee estimation */ async estimateMessageFee(functionName: string, args: StringMap) { // Check if functionName is annotated with @l1_handler const func = this.abi[functionName]; if (!func?.type || func.type.toString() !== "l1_handler") { throw new StarknetPluginError( `Cannot estimate message fee on "${functionName}" - not an @l1_handler` ); } const adaptedInput = this.adaptInput(functionName, args); // Remove value of from_address from the input array const fromAddress = adaptedInput.shift(); return this.hre.starknetWrapper.estimateMessageFee( functionName, fromAddress, this.address, adaptedInput ); } /** * Estimate the gas fee of executing `functionName` with `args`. * @param functionName * @param args arguments to Starknet contract function * @param options optional execution specifications * @returns an object containing the amount and the unit of the estimation */ async estimateFee( functionName: string, args?: StringMap, options: EstimateFeeOptions = {} ): Promise { try { const { nonce, maxFee, signature } = defaultToPendingBlock(options); const result = await this.provider.getInvokeEstimateFee( { contractAddress: this.address, calldata: args, signature: signature.map(String) }, { nonce: nonce ?? (await this.provider.getNonceForAddress(this.address)), maxFee: maxFee, version: InteractChoice.ESTIMATE_FEE.transactionVersion }, options.blockNumber ); return { amount: result.overall_fee, unit: "wei", gas_price: result.gas_price, gas_usage: result.gas_consumed }; } catch (error) { if (!(error instanceof Error)) throw error; throw new StarknetPluginError(error.message, error); } } /** * Returns the ABI of the whole contract. * @returns contract ABI */ getAbi(): starknet.Abi { return this.abi; } /** * Adapt structured `args` to unstructured array expected by e.g. Starknet CLI. * @param functionName the name of the function to adapt * @param args structured args * @returns unstructured args */ adaptInput(functionName: string, args?: StringMap): string[] { const func = this.abi[functionName]; if (!func) { const msg = `Function '${functionName}' doesn't exist on ${this.abiPath}.`; throw new StarknetPluginError(msg); } if (Array.isArray(args)) { throw new StarknetPluginError("Arguments should be passed in the form of an object."); } return adaptInputUtil(functionName, args, func.inputs, this.abi, this.isCairo1); } /** * Adapt unstructured `rawResult` to a structured object. * @param functionName the name of the function that produced the output * @param rawResult the function output as as unparsed space separated string * @returns structured output */ adaptOutput(functionName: string, rawResult: string) { const func = this.abi[functionName]; return adaptOutputUtil(rawResult, func.outputs, this.abi); } /** * Decode the events to a structured object with parameter names. * Only decodes the events originating from this contract. * @param events as received from the server. * @returns structured object with parameter names. * @throws if no events decoded */ decodeEvents(events: starknet.Event[]): DecodedEvent[] { const abi = json.parse(this.abiRaw); const abiEvents = eventUtil.getAbiEvents(abi); const abiStructs = CallData.getAbiStruct(abi); const decodedEvents = eventUtil .parseEvents(events, abiEvents, abiStructs, {}) .map((event) => { const [name, data] = Object.entries(event)[0]; return { name, data }; }); return decodedEvents; } } export interface ContractClassConfig extends StarknetContractConfig { sierraProgram: string; contractClassVersion: string; entryPointsByType: SierraEntryPointsByType; } export class Cairo1ContractClass extends StarknetContract { protected sierraProgram: string; protected contractClassVersion: string; protected entryPointsByType: SierraEntryPointsByType; constructor(config: ContractClassConfig) { super(config); this.sierraProgram = config.sierraProgram; this.contractClassVersion = config.contractClassVersion; this.entryPointsByType = config.entryPointsByType; } /** * Returns the compiled class. * @returns object of a compiled contract class */ getCompiledClass() { return { sierra_program: this.sierraProgram, contract_class_version: this.contractClassVersion, entry_points_by_type: this.entryPointsByType, abi: this.abiRaw }; } } export interface ScarbConfig { package: { name: string; version: string; }; target: { "starknet-contract": { name?: string; sierra?: boolean; casm?: boolean; "casm-add-pythonic-hints"?: boolean; "allowed-libfuncs"?: boolean; "allowed-libfuncs-deny"?: boolean; }[]; }; dependencies: StringMap; } ================================================ FILE: src/types/starknet.ts ================================================ import { Block, HardhatNetworkConfig, NetworkConfig, Transaction } from "hardhat/types"; import { BlockIdentifier, NonceQueryOptions, StarknetContractFactory } from "."; import { Devnet } from "./devnet"; import { ArgentAccount, OpenZeppelinAccount } from "../account"; import { TransactionReceipt, TransactionTrace } from "../starknet-types"; export interface Starknet { /** * Fetches a compiled contract by name. E.g. if the contract is defined in MyContract.cairo, * the provided string should be `MyContract`. * @param name the case-sensitive contract name * @returns a factory for generating instances of the desired contract */ getContractFactory: (name: string) => Promise; /** * Cairo and Starknet source files may contain short string literals, * which are interpreted as numbers (felts) during Starknet runtime. * Use this utility function to provide short string arguments to your contract functions. * * This function converts such a short string (max 31 characters) to its felt representation (wrapped in a `BigInt`). * Only accepts standard ASCII characters, i.e. characters with charcode between 0 and 127, inclusive. * @param input the input short string * @returns the numeric equivalent of the input short string, wrapped in a `BigInt` */ shortStringToBigInt: (convertibleString: string) => bigint; /** * Converts a BigInt to a string. The opposite of {@link shortStringToBigInt}. * @param input the input BigInt * @returns a string which is the result of converting a BigInt's hex value to its ASCII equivalent */ bigIntToShortString: (convertibleBigInt: bigint) => string; /** * The selected starknet-network name. * Present if the called task relies on `--starknet-network` or `starknet["network"]` in the config object. */ network: string; /** * The configuration object of the selected starknet-network. */ networkConfig: HardhatNetworkConfig; devnet: Devnet; getTransaction: (txHash: string) => Promise; getTransactionReceipt: (txHash: string) => Promise; /** * Returns execution information in a nested structure of calls. * @param txHash the transaction hash * @returns the transaction trace */ getTransactionTrace: (txHash: string) => Promise; /** * Returns an entire block and the transactions contained within it. * @param identifier optional block identifier (by block number or hash). To query the latest block, remove the identifier. * @returns a block object */ getBlock: (identifier?: BlockIdentifier) => Promise; /** * Returns the nonce of the contract whose `address` is specified. * @param address the contract address * @param options optional arguments to specify the target * @returns the nonce */ getNonce: (address: string, options?: NonceQueryOptions) => Promise; /** * Return balance of target contract whose `address` is specified. * @param address of target contract * @returns balance of target as BigInt */ getBalance: (address: string) => Promise; OpenZeppelinAccount: typeof OpenZeppelinAccount; ArgentAccount: typeof ArgentAccount; } export type StarknetConfig = { dockerizedVersion?: string; venv?: string; network?: string; networkUrl?: string; networkConfig?: NetworkConfig; recompile?: boolean; scarbCommand?: string; cairo1BinDir?: string; compilerVersion?: string; requestTimeout?: number; }; ================================================ FILE: src/utils/check-command-path.ts ================================================ import { StarknetPluginError } from "../starknet-plugin-error"; import fs from "fs"; export function checkCommandPath(commandPath: string): void { if (!fs.existsSync(commandPath)) { throw new StarknetPluginError(`Command ${commandPath} not found.`); } } ================================================ FILE: src/utils/venv.ts ================================================ import path from "path"; import { checkCommandPath } from "./check-command-path"; export function normalizeVenvPath(venvPath: string): string { if (venvPath[0] === "~") { venvPath = path.join(process.env.HOME, venvPath.slice(1)); } return path.normalize(venvPath); } export function getPrefixedCommand(venvPath: string, command: string): string { const prefixedCommand = path.join(venvPath, "bin", command); checkCommandPath(prefixedCommand); return prefixedCommand; } ================================================ FILE: src/utils.ts ================================================ import fs from "fs"; import { glob } from "glob"; import { HardhatNetworkConfig, HardhatRuntimeEnvironment, HttpNetworkConfig, NetworkConfig, NetworksConfig, ProjectPathsConfig, VmLang } from "hardhat/types"; import path from "path"; import { json, stark, LegacyCompiledContract, hash } from "starknet"; import { handleInternalContractArtifacts } from "./account-utils"; import { ABI_SUFFIX, ALPHA_MAINNET, ALPHA_MAINNET_INTERNALLY, ALPHA_TESTNET, ALPHA_TESTNET_INTERNALLY, ALPHA_TESTNET_2, ALPHA_TESTNET_2_INTERNALLY, DEFAULT_DEVNET_CAIRO_VM, DEFAULT_STARKNET_ACCOUNT_PATH, INTEGRATED_DEVNET, INTEGRATED_DEVNET_INTERNALLY, StarknetChainId, UDC_ADDRESS, CAIRO_CLI_DEFAULT_DOCKER_IMAGE_TAG } from "./constants"; import { getContractFactoryUtil } from "./extend-utils"; import { StarknetPluginError } from "./starknet-plugin-error"; import { Abi, AbiEntry, CairoFunction } from "./starknet-types"; import { Cairo1ContractClass, ContractClassConfig, Numeric, StarknetContract } from "./types"; /** * Replaces Starknet specific terminology with the terminology used in this plugin. * * @param msg the log message to be adapted * @returns the log message with adaptation replacements */ export function adaptLog(msg: string): string { return msg .replace("--network", "--starknet-network") .replace("gateway_url", "gateway-url") .replace("--account_contract", "--account-contract") .split(".\nTraceback (most recent call last)")[0] // remove duplicated log .replace(/\\n/g, "\n"); // use newlines from json response for formatting } export function getDefaultHttpNetworkConfig( url: string, verificationUrl: string, verifiedUrl: string, starknetChainId: StarknetChainId ): HttpNetworkConfig { return { url, verificationUrl, verifiedUrl, starknetChainId, accounts: undefined, gas: undefined, gasMultiplier: undefined, gasPrice: undefined, httpHeaders: undefined, timeout: undefined }; } export function getDefaultHardhatNetworkConfig(url: string): HardhatNetworkConfig { return { url, chainId: undefined, gas: undefined, gasPrice: undefined, gasMultiplier: undefined, hardfork: undefined, mining: undefined, accounts: undefined, blockGasLimit: undefined, minGasPrice: undefined, throwOnTransactionFailures: undefined, throwOnCallFailures: undefined, allowUnlimitedContractSize: undefined, initialDate: undefined, loggingEnabled: undefined, chains: undefined }; } export async function traverseFiles(traversable: string, fileCriteria = "*") { let paths: string[] = []; if (fs.lstatSync(traversable).isDirectory()) { paths = await glob(path.join(traversable, "**", fileCriteria)); } else { paths.push(traversable); } const files = paths.filter((file) => fs.lstatSync(file).isFile()); return files; } export function getArtifactPath(sourcePath: string, paths: ProjectPathsConfig): string { const rootRegex = new RegExp("^" + paths.root); const suffix = sourcePath.replace(rootRegex, ""); return path.join(paths.starknetArtifacts, suffix); } /** * Adapts path relative to the root of the project and * tilde will be resolved to homedir * @param root string representing the root path set on hre or config * @param newPath string representing the path provided by the user * @returns adapted path */ export function adaptPath(root: string, newPath: string): string { let adaptedPath = newPath; if (newPath[0] === "~") { adaptedPath = path.normalize(path.join(process.env.HOME, newPath.slice(1))); } else if (!path.isAbsolute(newPath)) { adaptedPath = path.normalize(path.join(root, newPath)); } return adaptedPath; } export function checkArtifactExists(artifactsPath: string): void { if (!fs.existsSync(artifactsPath)) { const msg = `Artifact expected to be at ${artifactsPath}, but not found. Consider recompiling your contracts.`; throw new StarknetPluginError(msg); } } /** * Extracts the network config from `hre.config.networks` according to `networkName`. * @param networkName The name of the network * @param networks Object holding network configs * @param origin Short string describing where/how `networkName` was specified * @returns Network config corresponding to `networkName` */ export function getNetwork( networkName: string, networks: NetworksConfig, origin: string ): N { if (isMainnet(networkName)) { networkName = ALPHA_MAINNET_INTERNALLY; } else if (isTestnet(networkName)) { networkName = ALPHA_TESTNET_INTERNALLY; } else if (isTestnetTwo(networkName)) { networkName = ALPHA_TESTNET_2_INTERNALLY; } else if (isStarknetDevnet(networkName)) { networkName = INTEGRATED_DEVNET_INTERNALLY; } const network = networks[networkName]; if (!network) { const available = Object.keys(networks).join(", "); const msg = `Invalid network provided in ${origin}: ${networkName}.\nValid hardhat networks: ${available}`; throw new StarknetPluginError(msg); } if (!network.url) { throw new StarknetPluginError(`Cannot use network ${networkName}. No "url" specified.`); } network.starknetChainId ||= StarknetChainId.TESTNET; network.vmLang ||= DEFAULT_DEVNET_CAIRO_VM as VmLang; return network; } function isTestnet(networkName: string): boolean { return networkName === ALPHA_TESTNET || networkName === ALPHA_TESTNET_INTERNALLY; } function isTestnetTwo(networkName: string): boolean { return networkName === ALPHA_TESTNET_2 || networkName === ALPHA_TESTNET_2_INTERNALLY; } function isMainnet(networkName: string): boolean { return networkName === ALPHA_MAINNET || networkName === ALPHA_MAINNET_INTERNALLY; } export function isStarknetDevnet(networkName: string): boolean { return networkName === INTEGRATED_DEVNET || networkName === INTEGRATED_DEVNET_INTERNALLY; } export async function findPath(traversable: string, pathSegment: string) { // Relative path to artifacts can be resolved now const resolvedPath = path.resolve(path.join(traversable, pathSegment)); if (fs.existsSync(resolvedPath) && fs.lstatSync(resolvedPath).isFile()) { return resolvedPath; } let files = await traverseFiles(traversable); files = files.filter((f) => f.endsWith(pathSegment)); if (files.length == 0) { return null; } else if (files.length == 1) { return files[0]; } else { const msg = "More than one file was found because the path provided is ambiguous, please specify a relative path"; throw new StarknetPluginError(msg); } } /** * * @param accountPath Path where the account file is saved * @param hre The HardhatRuntimeEnvironment * @returns Absolute path where the account file is saved */ export function getAccountPath(accountPath: string, hre: HardhatRuntimeEnvironment) { let accountDir = accountPath || DEFAULT_STARKNET_ACCOUNT_PATH; // Adapt path to be absolute if (accountDir[0] === "~") { accountDir = path.normalize(path.join(process.env.HOME, accountDir.slice(1))); } else if (!path.isAbsolute(accountDir)) { const root = hre.config.paths.root; accountDir = path.normalize(path.join(root, accountDir)); } return accountDir; } export function copyWithBigint(object: unknown): T { return JSON.parse( JSON.stringify(object, (_key, value) => typeof value === "bigint" ? value.toString() : value ) ); } function getImageTagByArch(tag: string): string { // Check CPU architecture const arch = process.arch; if (arch === "arm64" && !tag.endsWith("-arm") && !tag.endsWith("-arm-seed0")) { tag = `${tag}-arm`; } return tag; } export function getCairoCliImageTagByArch(tag = CAIRO_CLI_DEFAULT_DOCKER_IMAGE_TAG): string { return getImageTagByArch(tag); } export function getDevnetImageTagByArch(tag: string): string { return getImageTagByArch(tag); } export function sleep(ms: number) { return new Promise((resolve) => setTimeout(resolve, ms)); } /** * Log a yellow message to STDERR. * @param message */ export function warn(message: string): void { console.warn("\x1b[33m%s\x1b[0m", message); } /** * Converts BigInt to 0x-prefixed hex string * @param numeric */ export function numericToHexString(numeric: Numeric): string { return "0x" + BigInt(numeric).toString(16); } /** * @returns random salt */ export function generateRandomSalt(): string { return stark.randomAddress(); } /** * Global handler of UDC */ export class UDC { private static instance: StarknetContract; /** * Returns the UDC singleton. */ static async getInstance() { if (!UDC.instance) { const hre = await import("hardhat"); const contractPath = handleInternalContractArtifacts( "OpenZeppelinUDC", // dir name "UDC", // file name "0.5.0", // version hre ); const udcContractFactory = await getContractFactoryUtil(hre, contractPath); UDC.instance = udcContractFactory.getContractAt(UDC_ADDRESS); } return UDC.instance; } } export function readContract(contractPath: string) { const parsedContract = json.parse( fs.readFileSync(contractPath).toString("ascii") ) as LegacyCompiledContract; return { ...parsedContract, program: stark.compressProgram(parsedContract.program) }; } export function readCairo1Contract(contractPath: string) { const parsedContract = json.parse(fs.readFileSync(contractPath).toString("ascii")); const { contract_class_version, entry_points_by_type, sierra_program } = parsedContract; const contract = new Cairo1ContractClass({ abiPath: path.join( path.dirname(contractPath), `${path.parse(contractPath).name}${ABI_SUFFIX}` ), sierraProgram: stark.compressProgram(hash.formatSpaces(json.stringify(sierra_program))), entryPointsByType: entry_points_by_type, contractClassVersion: contract_class_version } as ContractClassConfig); return contract; } export function bnToDecimalStringArray(rawCalldata: bigint[]) { return rawCalldata.map((x) => x.toString(10)); } export function estimatedFeeToMaxFee(amount?: bigint, overhead = 0.5) { overhead = Math.round((1 + overhead) * 100); return (amount * BigInt(overhead)) / BigInt(100); } export function findConstructor(abi: Abi, predicate: (entry: AbiEntry) => boolean): CairoFunction { for (const abiEntryName in abi) { const abiEntry = abi[abiEntryName]; if (predicate(abiEntry)) { return abiEntry; } } return undefined; } ================================================ FILE: test/configuration-tests/with-account-compilation-option/check.ts ================================================ import { copyFileSync } from "fs"; import path from "path"; import { hardhatStarknetCompileDeprecated } from "../../utils/cli-functions"; import { assertContains } from "../../utils/utils"; const contractName = "dummy_account.cairo"; const contractPath = path.join("contracts", contractName); const expected = "Use the --account-contract flag to compile an account contract."; console.log("Testing rejection of compilation without the account flag"); copyFileSync(path.join(__dirname, contractName), contractPath); const execution = hardhatStarknetCompileDeprecated(contractPath.split(" "), true); assertContains(execution.stderr, expected); console.log("Success"); hardhatStarknetCompileDeprecated(`${contractPath} --account-contract`.split(" ")); ================================================ FILE: test/configuration-tests/with-account-compilation-option/dummy_account.cairo ================================================ %lang starknet @external func __execute__() { return (); } @external func __validate_declare__(class_hash: felt) { return (); } @external func __validate__() { return (); } ================================================ FILE: test/configuration-tests/with-account-compilation-option/hardhat.config.ts ================================================ import "@shardlabs/starknet-hardhat-plugin"; module.exports = { starknet: { network: process.env.NETWORK }, networks: { devnet: { url: "http://127.0.0.1:5050" } } }; ================================================ FILE: test/configuration-tests/with-account-compilation-option/network.json ================================================ { "$schema": "../../network.schema", "devnet": true } ================================================ FILE: test/configuration-tests/with-artifacts-path/check.ts ================================================ import { hardhatStarknetCompileDeprecated, hardhatStarknetTest } from "../../utils/cli-functions"; import { assertExistence, rmrfSync } from "../../utils/utils"; hardhatStarknetCompileDeprecated(["contracts/contract.cairo"]); assertExistence("my-starknet-artifacts/contracts/contract.cairo/"); assertExistence("starknet-artifacts", false); hardhatStarknetTest(["test/contract-factory-creation.test.ts", "--no-compile"]); rmrfSync("my-starknet-artifacts"); ================================================ FILE: test/configuration-tests/with-artifacts-path/hardhat.config.ts ================================================ import "@shardlabs/starknet-hardhat-plugin"; module.exports = { paths: { starknetArtifacts: "my-starknet-artifacts" }, networks: { devnet: { url: "http://127.0.0.1:5050" } } }; ================================================ FILE: test/configuration-tests/with-artifacts-path/network.json ================================================ { "$schema": "../../network.schema", "devnet": true } ================================================ FILE: test/configuration-tests/with-cairo-path/check.ts ================================================ import { hardhatStarknetCompileDeprecated } from "../../utils/cli-functions"; hardhatStarknetCompileDeprecated("contracts/contract.cairo".split(" ")); ================================================ FILE: test/configuration-tests/with-cairo-path/hardhat.config.ts ================================================ import "@shardlabs/starknet-hardhat-plugin"; module.exports = { starknet: { network: process.env.NETWORK }, paths: { cairoPaths: ["./new-sources", "~/another-source"] }, networks: { devnet: { url: "http://127.0.0.1:5050" } } }; ================================================ FILE: test/configuration-tests/with-cairo-path/network.json ================================================ { "$schema": "../../network.schema", "devnet": true } ================================================ FILE: test/configuration-tests/with-cairo-version/check.ts ================================================ import { hardhatStarknetCompileDeprecated, hardhatStarknetTest } from "../../utils/cli-functions"; hardhatStarknetCompileDeprecated("contracts/contract.cairo".split(" ")); hardhatStarknetTest(["test/contract-factory-creation.test.ts", "--no-compile"]); ================================================ FILE: test/configuration-tests/with-cairo-version/hardhat.config.ts ================================================ import "@shardlabs/starknet-hardhat-plugin"; module.exports = { starknet: { dockerizedVersion: process.env.CAIRO_LANG, network: process.env.NETWORK }, networks: { devnet: { url: "http://127.0.0.1:5050" } } }; ================================================ FILE: test/configuration-tests/with-cairo-version/network.json ================================================ { "$schema": "../../network.schema", "devnet": true } ================================================ FILE: test/configuration-tests/with-cairo1-compiler-dir/check.ts ================================================ import { hardhatStarknetCompile } from "../../utils/cli-functions"; import { assertContains, assertCompilationArtifactsExist, ensureEnvVar } from "../../utils/utils"; ensureEnvVar("CAIRO_1_COMPILER_DIR"); hardhatStarknetCompile(["cairo1-contracts/contract1.cairo", "--single-file"]); assertCompilationArtifactsExist("starknet-artifacts/cairo1-contracts/contract1.cairo", "contract1"); // Assert cairo0 compilation failure const execution = hardhatStarknetCompile(["contracts/contract.cairo", "--single-file"], true); assertContains(execution.stderr, "error: Skipped tokens."); ================================================ FILE: test/configuration-tests/with-cairo1-compiler-dir/hardhat.config.ts ================================================ import "@shardlabs/starknet-hardhat-plugin"; module.exports = { starknet: { venv: "active", network: process.env.NETWORK, cairo1BinDir: process.env.CAIRO_1_COMPILER_DIR }, networks: { devnet: { url: "http://127.0.0.1:5050" } } }; ================================================ FILE: test/configuration-tests/with-cairo1-compiler-dir/network.json ================================================ { "$schema": "../../network.schema", "devnet": true } ================================================ FILE: test/configuration-tests/with-cairo1-compiler-dir-omitted/check.ts ================================================ import { hardhatStarknetCompile } from "../../utils/cli-functions"; import { assertCompilationArtifactsExist } from "../../utils/utils"; hardhatStarknetCompile(["cairo1-contracts/contract1.cairo", "--single-file"]); assertCompilationArtifactsExist("starknet-artifacts/cairo1-contracts/contract1.cairo", "contract1"); ================================================ FILE: test/configuration-tests/with-cairo1-compiler-dir-omitted/hardhat.config.ts ================================================ import "@shardlabs/starknet-hardhat-plugin"; module.exports = { starknet: { venv: "active", network: process.env.NETWORK }, networks: { devnet: { url: "http://127.0.0.1:5050" } } }; ================================================ FILE: test/configuration-tests/with-cairo1-compiler-dir-omitted/network.json ================================================ { "$schema": "../../network.schema", "devnet": true } ================================================ FILE: test/configuration-tests/with-cli-network/check.ts ================================================ import { hardhatStarknetRun, hardhatStarknetTest } from "../../utils/cli-functions"; import { assertContains } from "../../utils/utils"; // Test how --starknet-network can be specified through CLI while at the same time // overriding hardhat.config specification. // It would be sufficient to run this test just once and not for both alpha and devnet. // Only tests if --starknet-network is accepted, not if the correct network is targeted. // currently not supported for hardhat run const runWithCliNetwork = hardhatStarknetRun( "--no-compile --starknet-network devnet scripts/compile-contract.ts".split(" "), true ); assertContains( runWithCliNetwork.stderr, "\"--starknet-network\" with \"hardhat run\" currently does not have effect" ); // compile to have artifacts for hardhat test hardhatStarknetRun("--no-compile scripts/compile-contract.ts".split(" ")); hardhatStarknetTest("--no-compile --starknet-network devnet test/quick-test.ts".split(" ")); ================================================ FILE: test/configuration-tests/with-cli-network/hardhat.config.ts ================================================ import "@shardlabs/starknet-hardhat-plugin"; module.exports = { starknet: { venv: "active", cairo1BinDir: process.env.CAIRO_1_COMPILER_DIR, network: "alphaGoerli2" }, networks: { devnet: { url: "http://127.0.0.1:5050" } } }; ================================================ FILE: test/configuration-tests/with-cli-network/network.json ================================================ { "$schema": "../../network.schema", "devnet": true } ================================================ FILE: test/configuration-tests/with-compiler-version/check.ts ================================================ import fs from "fs"; import path from "path"; import { hardhatStarknetCompile } from "../../utils/cli-functions"; import { assertCompilationArtifactsExist, assertContains, assertEqual, assertGreater, ensureEnvVar, rmrfSync } from "../../utils/utils"; import { HIDDEN_PLUGIN_COMPILER_SUBDIR, HIDDEN_PLUGIN_DIR } from "../../../src/constants"; import { CAIRO_COMPILER as validCompilerVersion } from "../../../config.json"; /* Helper functions and constants */ function compile() { hardhatStarknetCompile(["cairo1-contracts/contract1.cairo", "--single-file"]); } function assertArtifacts() { assertCompilationArtifactsExist( "starknet-artifacts/cairo1-contracts/contract1.cairo", "contract1" ); } function invalidate(invalidablePath: string) { fs.writeFileSync(invalidablePath, "garbage"); } const EXPECTED_COMPILER_BIN = path.join( ensureEnvVar("HOME"), HIDDEN_PLUGIN_DIR, HIDDEN_PLUGIN_COMPILER_SUBDIR, validCompilerVersion, "cairo", "bin" ); const EXPECTED_COMPILER_PATH = path.join(EXPECTED_COMPILER_BIN, "starknet-compile"); const EXPECTED_SIERRA_COMPILER_PATH = path.join(EXPECTED_COMPILER_BIN, "starknet-sierra-compile"); /* Testing procedure */ // clear before any tests, just in case rmrfSync(EXPECTED_COMPILER_BIN); // Test case - invalid compiler version const nonExistentVersion = "1.123.1"; // doesn't exist and shouldn't ever exist process.env.CAIRO_COMPILER = nonExistentVersion; const invalidExecution = hardhatStarknetCompile( ["cairo1-contracts/contract1.cairo", "--single-file"], true // expectFailure ); assertContains( invalidExecution.stderr, `Could not download cairo ${nonExistentVersion}. Make sure that it exists.` ); // Test case - implicitly download compiler and compile process.env.CAIRO_COMPILER = validCompilerVersion; compile(); // assert compiler downloaded and artifacts present const compilerStatInitial = fs.statSync(EXPECTED_COMPILER_PATH); assertArtifacts(); // Test case - invalidate compiler to cause redownload invalidate(EXPECTED_COMPILER_PATH); compile(); // assert compiler redownloaded and artifacts present const compilerStatRedownloaded = fs.statSync(EXPECTED_COMPILER_PATH); assertGreater(compilerStatRedownloaded.ctime, compilerStatInitial.ctime); assertArtifacts(); // Test case - invalidate sierra compiler to cause redownload invalidate(EXPECTED_SIERRA_COMPILER_PATH); compile(); // assert compiler redownloaded and artifacts present const compilerStatRedownloaded2 = fs.statSync(EXPECTED_COMPILER_PATH); assertGreater(compilerStatRedownloaded2.ctime, compilerStatRedownloaded.ctime); assertArtifacts(); // Test case - compile again - no compiler change expected compile(); // we make no assertions about the age of contract artifacts as that is related to // the recompilation functionality (not the responsibility of this test) const compilerStatFinal = fs.statSync(EXPECTED_COMPILER_PATH); assertEqual(compilerStatFinal.ctime.getTime(), compilerStatRedownloaded2.ctime.getTime()); assertArtifacts(); ================================================ FILE: test/configuration-tests/with-compiler-version/hardhat.config.ts ================================================ import "@shardlabs/starknet-hardhat-plugin"; module.exports = { starknet: { venv: "active", compilerVersion: process.env.CAIRO_COMPILER } }; ================================================ FILE: test/configuration-tests/with-compiler-version/network.json ================================================ { "$schema": "../../network.schema", "devnet": true } ================================================ FILE: test/configuration-tests/with-disable-hint-compilation-option/check.ts ================================================ import { copyFileSync } from "fs"; import path from "path"; import { hardhatStarknetCompileDeprecated } from "../../utils/cli-functions"; import { assertContains } from "../../utils/utils"; const contractName = "contract_with_unwhitelisted_hints.cairo"; const contractPath = path.join("contracts", contractName); copyFileSync(path.join(__dirname, contractName), contractPath); const expected = `Hint is not whitelisted. This may indicate that this library function cannot be used in StarkNet contracts.`; console.log("Testing rejection of compilation without the --disable-hint-validation flag"); const execution = hardhatStarknetCompileDeprecated([contractPath], true); assertContains(execution.stderr, expected); console.log("Success"); hardhatStarknetCompileDeprecated(`${contractPath} --disable-hint-validation`.split(" ")); ================================================ FILE: test/configuration-tests/with-disable-hint-compilation-option/contract_with_unwhitelisted_hints.cairo ================================================ // Declare this file as a Starknet contract. %lang starknet from starkware.cairo.common.cairo_builtins import HashBuiltin from starkware.cairo.common.uint256 import Uint256, uint256_sub, uint256_signed_nn // Define a storage variable. @storage_var func balance() -> (res: felt) { } // Increases the balance by the given amount. @external func increase_balance{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr}() { let a = Uint256(1, 0); let b = Uint256(2, 0); let (c) = uint256_sub(a, b); let (d) = uint256_signed_nn(c); %{ print(f"{ids.d=}") %} return (); } // Returns the current balance. @view func get_balance{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr}() -> (res: felt) { let (res) = balance.read(); return (res,); } ================================================ FILE: test/configuration-tests/with-disable-hint-compilation-option/hardhat.config.ts ================================================ import "@shardlabs/starknet-hardhat-plugin"; module.exports = { starknet: { network: process.env.NETWORK }, networks: { devnet: { url: "http://127.0.0.1:5050" } } }; ================================================ FILE: test/configuration-tests/with-disable-hint-compilation-option/network.json ================================================ { "$schema": "../../network.schema", "devnet": true } ================================================ FILE: test/configuration-tests/with-networks/check.ts ================================================ import { assertContains } from "../../utils/utils"; import path from "path"; import { readFileSync } from "fs"; import { hardhatStarknetCompileDeprecated, hardhatStarknetTest } from "../../utils/cli-functions"; hardhatStarknetCompileDeprecated(["contracts/contract.cairo"]); const invalidNetwork = "foo"; const expected = `Error in plugin Starknet: Invalid network provided in starknet.network in hardhat.config: ${invalidNetwork}.`; const prefix = __dirname; console.log("Testing invalid CLI network"); let execution = hardhatStarknetTest( [ "test/contract-factory-creation.test.ts", "--no-compile", "--starknet-network", invalidNetwork ], true ); assertContains( execution.stderr, readFileSync(path.join(prefix, "invalid-cli-network.txt")).toString() ); console.log("Success"); console.log("Testing no mocha network"); process.env.NETWORK = ""; hardhatStarknetTest(["--no-compile", "test/contract-factory-creation.test.ts"]); console.log("Success"); console.log("Testing invalid config network"); process.env.NETWORK = invalidNetwork; execution = hardhatStarknetTest(["--no-compile", "test/contract-factory-creation.test.ts"], true); assertContains(execution.stderr, expected); console.log("Success"); console.log("Testing deployment with alpha-goerli2 config network is temporarily disabled."); // console.log("Testing with alpha-goerli2 config network"); // process.env.NETWORK = "alpha-goerli2"; // execution = hardhatStarknetTest( // ["test/contract-factory-creation.test.ts", "--no-compile", "--starknet-network", "alpha-goerli2"] // ); ================================================ FILE: test/configuration-tests/with-networks/hardhat.config.ts ================================================ import "@shardlabs/starknet-hardhat-plugin"; module.exports = { starknet: { network: process.env.NETWORK }, networks: { devnet: { url: "http://127.0.0.1:5050" }, hardhat: {} } }; ================================================ FILE: test/configuration-tests/with-networks/invalid-cli-network.txt ================================================ Error in plugin Starknet: Invalid network provided in --starknet-network: foo. Valid hardhat networks: hardhat, localhost, devnet, alphaGoerli, alphaGoerli2, alphaMainnet, integratedDevnet ================================================ FILE: test/configuration-tests/with-networks/invalid-config-network.txt ================================================ Error in plugin Starknet: Invalid network provided in starknet.network in hardhat.config: foo. Valid hardhat networks: hardhat, localhost, devnet, alphaGoerli, alphaGoerli2, alphaMainnet, integratedDevnet For more info run Hardhat with --show-stack-traces ================================================ FILE: test/configuration-tests/with-networks/network.json ================================================ { "$schema": "../../network.schema", "devnet": true } ================================================ FILE: test/configuration-tests/with-networks/without-starknet-network.txt ================================================ Error in plugin Starknet: No starknet-network or gateway-url provided. ================================================ FILE: test/configuration-tests/with-request-timeout-1ms/check.ts ================================================ import { hardhatStarknetTest } from "../../utils/cli-functions"; import { assertContains } from "../../utils/utils"; const execution = hardhatStarknetTest("--no-compile test/get-balance.test.ts".split(" "), true); assertContains(execution.stdout, "AxiosError: timeout of 1ms exceeded"); ================================================ FILE: test/configuration-tests/with-request-timeout-1ms/hardhat.config.ts ================================================ import "@shardlabs/starknet-hardhat-plugin"; module.exports = { starknet: { network: process.env.NETWORK, requestTimeout: 1 }, networks: { devnet: { url: "http://127.0.0.1:5050", stdout: "STDOUT" } } }; ================================================ FILE: test/configuration-tests/with-request-timeout-1ms/network.json ================================================ { "$schema": "../../network.schema", "devnet": true } ================================================ FILE: test/configuration-tests/with-request-timeout-default/check.ts ================================================ import { hardhatStarknetTest } from "../../utils/cli-functions"; hardhatStarknetTest("--no-compile test/get-balance.test.ts".split(" ")); ================================================ FILE: test/configuration-tests/with-request-timeout-default/hardhat.config.ts ================================================ import "@shardlabs/starknet-hardhat-plugin"; module.exports = { starknet: { network: process.env.NETWORK }, networks: { devnet: { url: "http://127.0.0.1:5050" } } }; ================================================ FILE: test/configuration-tests/with-request-timeout-default/network.json ================================================ { "$schema": "../../network.schema", "devnet": true } ================================================ FILE: test/configuration-tests/with-scarb-custom/check.ts ================================================ import { hardhatStarknetBuild } from "../../utils/cli-functions"; import { scarbAssertions } from "../../utils/scarb-utils"; import { assertContains } from "../../utils/utils"; const projectName = "cairo1_sample_project"; const buildResult = hardhatStarknetBuild([projectName]); assertContains(buildResult.stdout, "Starknet plugin using custom Scarb"); scarbAssertions(projectName); ================================================ FILE: test/configuration-tests/with-scarb-custom/hardhat.config.ts ================================================ import "@shardlabs/starknet-hardhat-plugin"; module.exports = { starknet: { network: process.env.NETWORK, scarbCommand: `${process.env.HOME}/.local/bin/scarb` }, networks: { devnet: { url: "http://127.0.0.1:5050" } } }; ================================================ FILE: test/configuration-tests/with-scarb-custom/network.json ================================================ { "$schema": "../../network.schema", "devnet": true } ================================================ FILE: test/configuration-tests/with-scarb-custom-cli/check.ts ================================================ import { hardhatStarknetBuild } from "../../utils/cli-functions"; import { scarbAssertions } from "../../utils/scarb-utils"; import { assertContains } from "../../utils/utils"; const projectName = "cairo1_sample_project"; // override the default const customCommand = `${process.env.HOME}/.local/bin/scarb`; const buildResult = hardhatStarknetBuild([projectName, "--scarb-command", customCommand]); assertContains(buildResult.stdout, "Starknet plugin using custom Scarb"); scarbAssertions(projectName); ================================================ FILE: test/configuration-tests/with-scarb-custom-cli/hardhat.config.ts ================================================ import "@shardlabs/starknet-hardhat-plugin"; module.exports = { starknet: { network: process.env.NETWORK, scarbCommand: `${process.env.HOME}/.local/bin/scarb` }, networks: { devnet: { url: "http://127.0.0.1:5050" } } }; ================================================ FILE: test/configuration-tests/with-scarb-custom-cli/network.json ================================================ { "$schema": "../../network.schema", "devnet": true } ================================================ FILE: test/configuration-tests/with-scarb-custom-invalid-cairo/check.ts ================================================ import { hardhatStarknetBuild } from "../../utils/cli-functions"; import { assertContains } from "../../utils/utils"; import * as fs from "fs"; import * as path from "path"; const projectName = "cairo1_sample_project"; // override a cairo source file with an invalid one const invalidConfigFilePath = path.join(__dirname, "multiple_contracts_invalid.cairo"); fs.copyFileSync(invalidConfigFilePath, path.join(projectName, "src", "multiple_contracts.cairo")); // expect failure console.log("Expecting rejection if invalid cairo source file"); const buildResult = hardhatStarknetBuild([projectName], true); assertContains(buildResult.stderr, "Failed building of 1 project"); ================================================ FILE: test/configuration-tests/with-scarb-custom-invalid-cairo/hardhat.config.ts ================================================ import "@shardlabs/starknet-hardhat-plugin"; module.exports = { starknet: { network: process.env.NETWORK, scarbCommand: `${process.env.HOME}/.local/bin/scarb` }, networks: { devnet: { url: "http://127.0.0.1:5050" } } }; ================================================ FILE: test/configuration-tests/with-scarb-custom-invalid-cairo/multiple_contracts_invalid.cairo ================================================ // an invalid contract by virtue of invalid spaces in the mod name #[contract] mod First Contract { #[view] fn greet() -> felt252 { return 'Hello from First'; } } #[contract] mod AnotherContract { #[view] fn get_balance() -> felt252 { return 'Hello from Another'; } } ================================================ FILE: test/configuration-tests/with-scarb-custom-invalid-cairo/network.json ================================================ { "$schema": "../../network.schema", "devnet": true } ================================================ FILE: test/configuration-tests/with-scarb-custom-invalid-config/Scarb-invalid.toml ================================================ [package] name = "sample_package_name" version = "0.1.0" [[target.starknet-contract]] # Enable Sierra codegen. sierra = true # Enable CASM codegen. casm = false [dependencies] starknet = ">=1.1.0" ================================================ FILE: test/configuration-tests/with-scarb-custom-invalid-config/check.ts ================================================ import { hardhatStarknetBuild } from "../../utils/cli-functions"; import { scarbArtifactsAssertion } from "../../utils/scarb-utils"; import { assertContains } from "../../utils/utils"; import * as fs from "fs"; import * as path from "path"; const projectName = "cairo1_sample_project"; // override the config file with an invalid one - doesn't specify casm generation const invalidConfigFilePath = path.join(__dirname, "Scarb-invalid.toml"); fs.copyFileSync(invalidConfigFilePath, path.join(projectName, "Scarb.toml")); // expect failure console.log("Expecting rejection if invalid config file"); const buildResult = hardhatStarknetBuild([projectName], true); assertContains(buildResult.stderr, "Invalid config file"); // expect to pass if skipping validation console.log("Expecting success if skipping validation"); hardhatStarknetBuild([projectName, "--skip-validate"], false); scarbArtifactsAssertion(projectName, undefined, undefined, [".json", "_abi.json"]); ================================================ FILE: test/configuration-tests/with-scarb-custom-invalid-config/hardhat.config.ts ================================================ import "@shardlabs/starknet-hardhat-plugin"; module.exports = { starknet: { network: process.env.NETWORK, scarbCommand: `${process.env.HOME}/.local/bin/scarb` }, networks: { devnet: { url: "http://127.0.0.1:5050" } } }; ================================================ FILE: test/configuration-tests/with-scarb-custom-invalid-config/network.json ================================================ { "$schema": "../../network.schema", "devnet": true } ================================================ FILE: test/configuration-tests/with-scarb-custom-multiple-projects/check.ts ================================================ import { hardhatStarknetBuild } from "../../utils/cli-functions"; import { scarbArtifactsAssertion } from "../../utils/scarb-utils"; import { assertContains } from "../../utils/utils"; import * as fs from "fs"; // generate another project - a copy of the sample one const projectName = "cairo1_sample_project"; const copiedProjectName = "cairo1_copied_project"; fs.cpSync(projectName, copiedProjectName, { recursive: true }); const buildResult = hardhatStarknetBuild([projectName, copiedProjectName]); assertContains(buildResult.stdout, "Starknet plugin using custom Scarb"); scarbArtifactsAssertion(projectName); scarbArtifactsAssertion(copiedProjectName); ================================================ FILE: test/configuration-tests/with-scarb-custom-multiple-projects/hardhat.config.ts ================================================ import "@shardlabs/starknet-hardhat-plugin"; module.exports = { starknet: { network: process.env.NETWORK, scarbCommand: `${process.env.HOME}/.local/bin/scarb` }, networks: { devnet: { url: "http://127.0.0.1:5050" } } }; ================================================ FILE: test/configuration-tests/with-scarb-custom-multiple-projects/network.json ================================================ { "$schema": "../../network.schema", "devnet": true } ================================================ FILE: test/configuration-tests/with-scarb-dockerized/check.ts ================================================ import { hardhatStarknetBuild } from "../../utils/cli-functions"; import { assertContains } from "../../utils/utils"; const projectName = "cairo1_sample_project"; const buildResult = hardhatStarknetBuild([projectName], true); console.log("Temporarily expecting that dockerized scarb cannot be used"); assertContains(buildResult.stderr, "Dockerized Scarb is not yet supported"); ================================================ FILE: test/configuration-tests/with-scarb-dockerized/hardhat.config.ts ================================================ import "@shardlabs/starknet-hardhat-plugin"; module.exports = { starknet: { network: process.env.NETWORK }, networks: { devnet: { url: "http://127.0.0.1:5050" } } }; ================================================ FILE: test/configuration-tests/with-scarb-dockerized/network.json ================================================ { "$schema": "../../network.schema", "devnet": true } ================================================ FILE: test/configuration-tests/with-sources-path/check.ts ================================================ import { renameSync } from "fs"; import { hardhatStarknetCompileDeprecated, hardhatStarknetTest } from "../../utils/cli-functions"; import { assertExistence } from "../../utils/utils"; renameSync("contracts", "my-starknet-sources"); // compile without specifying the path to see if the default path is updated to the new value hardhatStarknetCompileDeprecated([]); assertExistence("starknet-artifacts/my-starknet-sources"); assertExistence("starknet-artifacts/contracts", false); hardhatStarknetTest(["test/contract-factory-creation.test.ts", "--no-compile"]); ================================================ FILE: test/configuration-tests/with-sources-path/hardhat.config.ts ================================================ import "@shardlabs/starknet-hardhat-plugin"; module.exports = { starknet: { network: process.env.NETWORK }, paths: { starknetSources: "my-starknet-sources" }, networks: { devnet: { url: "http://127.0.0.1:5050" } } }; ================================================ FILE: test/configuration-tests/with-sources-path/network.json ================================================ { "$schema": "../../network.schema", "devnet": true } ================================================ FILE: test/constants/constants.ts ================================================ export const HOST = "127.0.0.1"; export const PORT = "5050"; export const NODE_PORT = "8545"; export const DEVNET_URL = `http://${HOST}:${PORT}`; ================================================ FILE: test/general-tests/account-test/check.ts ================================================ import { hardhatStarknetCompileDeprecated, hardhatStarknetTest } from "../../utils/cli-functions"; hardhatStarknetCompileDeprecated("contracts/contract.cairo contracts/util.cairo".split(" ")); hardhatStarknetTest("--no-compile test/oz-account-test.ts".split(" ")); // _TODO: skipped because required setup is not supported, see ./hardhat.config.ts // hardhatStarknetTest("--no-compile test/argent-account-test.ts".split(" ")); ================================================ FILE: test/general-tests/account-test/hardhat.config.ts ================================================ import "@shardlabs/starknet-hardhat-plugin"; module.exports = { starknet: { network: process.env.NETWORK }, networks: { integratedDevnet: { url: "http://127.0.0.1:5050", // testing with fork because alpha-goerli has the needed argent account contracts declared // using integrated-devnet (in network.json) because spawning devnet is currently out of reach for individual tests // args: ["--seed", "42", "--fork-network", "alpha-goerli"] // _TODO: forking is currently not supported because testnet is at cairo-lang v0.12.2 args: ["--seed", "42"] } } }; ================================================ FILE: test/general-tests/account-test/network.json ================================================ { "$schema": "../../network.schema", "integrated-devnet": true } ================================================ FILE: test/general-tests/amarna/check.ts ================================================ import * as fs from "fs"; import { spawnSync } from "child_process"; import { assertExistence } from "../../utils/utils"; // Cleanup old sarif file if exists fs.existsSync("./out.sarif") && fs.unlinkSync("./out.sarif"); console.log("Running amarna"); const output = spawnSync("npx", ["hardhat", "amarna"], { encoding: "utf-8" }); output.stdout && console.log(output.stdout); output.stderr && console.warn(output.stderr); assertExistence("./out.sarif"); fs.unlinkSync("./out.sarif"); // Cleanup out.sarif after the test ================================================ FILE: test/general-tests/amarna/hardhat.config.ts ================================================ import "@shardlabs/starknet-hardhat-plugin"; module.exports = { starknet: { network: process.env.NETWORK }, networks: { devnet: { url: "http://127.0.0.1:5050" } } }; ================================================ FILE: test/general-tests/amarna/network.json ================================================ { "$schema": "../../network.schema", "devnet": true } ================================================ FILE: test/general-tests/cairo0-constructor-test/check.ts ================================================ import { hardhatStarknetCompileDeprecated, hardhatStarknetTest } from "../../utils/cli-functions"; hardhatStarknetCompileDeprecated( "contracts/contract.cairo contracts/simple_storage.cairo contracts/empty_constructor.cairo".split( " " ) ); hardhatStarknetTest("--no-compile test/cairo0-constructor.test.ts".split(" ")); ================================================ FILE: test/general-tests/cairo0-constructor-test/hardhat.config.ts ================================================ import "@shardlabs/starknet-hardhat-plugin"; module.exports = { starknet: { network: "devnet" }, networks: { devnet: { url: "http://127.0.0.1:5050" } } }; ================================================ FILE: test/general-tests/cairo0-constructor-test/network.json ================================================ { "$schema": "../../network.schema", "devnet": true } ================================================ FILE: test/general-tests/contract-test/check.ts ================================================ import { hardhatStarknetCompileDeprecated, hardhatStarknetTest } from "../../utils/cli-functions"; hardhatStarknetCompileDeprecated("contracts/contract.cairo contracts/util.cairo".split(" ")); hardhatStarknetTest("--no-compile test/contract.test.ts".split(" ")); hardhatStarknetTest("--no-compile test/contract-factory.test.ts".split(" ")); ================================================ FILE: test/general-tests/contract-test/hardhat.config.ts ================================================ import "@shardlabs/starknet-hardhat-plugin"; module.exports = { starknet: { network: process.env.NETWORK }, networks: { integratedDevnet: { url: "http://127.0.0.1:5050", args: ["--seed", "42"] } } }; ================================================ FILE: test/general-tests/contract-test/network.json ================================================ { "$schema": "../../network.schema", "integrated-devnet": true } ================================================ FILE: test/general-tests/declare-test/check.ts ================================================ import { hardhatStarknetCompileDeprecated, hardhatStarknetTest } from "../../utils/cli-functions"; hardhatStarknetCompileDeprecated("contracts/contract.cairo contracts/deployer.cairo".split(" ")); hardhatStarknetTest("--no-compile test/declare-deploy.test.ts".split(" ")); ================================================ FILE: test/general-tests/declare-test/hardhat.config.ts ================================================ import "@shardlabs/starknet-hardhat-plugin"; module.exports = { starknet: { network: process.env.NETWORK }, networks: { devnet: { url: "http://127.0.0.1:5050" } } }; ================================================ FILE: test/general-tests/declare-test/network.json ================================================ { "$schema": "../../network.schema", "alphaGoerli2": true, "devnet": true } ================================================ FILE: test/general-tests/declare-v2-test/check.ts ================================================ import { hardhatStarknetCompile, hardhatStarknetTest } from "../../utils/cli-functions"; import { ensureEnvVar } from "../../utils/utils"; ensureEnvVar("CAIRO_1_COMPILER_DIR"); hardhatStarknetCompile([ "cairo1-contracts/contract1.cairo", "--add-pythonic-hints", "--single-file" ]); hardhatStarknetTest(["--no-compile test/cairo1/declare-v2.test.ts"]); ================================================ FILE: test/general-tests/declare-v2-test/hardhat.config.ts ================================================ import "@shardlabs/starknet-hardhat-plugin"; module.exports = { starknet: { venv: "active", network: process.env.NETWORK, cairo1BinDir: process.env.CAIRO_1_COMPILER_DIR }, networks: { devnet: { url: "http://127.0.0.1:5050" } } }; ================================================ FILE: test/general-tests/declare-v2-test/network.json ================================================ { "$schema": "../../network.schema", "devnet": true } ================================================ FILE: test/general-tests/decode-event-test/check.ts ================================================ import { hardhatStarknetCompileDeprecated, hardhatStarknetTest } from "../../utils/cli-functions"; hardhatStarknetCompileDeprecated(["contracts/events.cairo"]); hardhatStarknetTest("--no-compile test/decode-events.test.ts".split(" ")); ================================================ FILE: test/general-tests/decode-event-test/hardhat.config.ts ================================================ import "@shardlabs/starknet-hardhat-plugin"; module.exports = { starknet: { network: process.env.NETWORK }, networks: { devnet: { url: "http://127.0.0.1:5050" } } }; ================================================ FILE: test/general-tests/decode-event-test/network.json ================================================ { "$schema": "../../network.schema", "devnet": true } ================================================ FILE: test/general-tests/decode-event-v2-test/check.ts ================================================ import { hardhatStarknetCompile, hardhatStarknetTest } from "../../utils/cli-functions"; import { ensureEnvVar } from "../../utils/utils"; ensureEnvVar("CAIRO_1_COMPILER_DIR"); hardhatStarknetCompile(["cairo1-contracts/events.cairo", "--add-pythonic-hints", "--single-file"]); hardhatStarknetTest(["--no-compile test/cairo1/decode-events.test.ts"]); ================================================ FILE: test/general-tests/decode-event-v2-test/hardhat.config.ts ================================================ import "@shardlabs/starknet-hardhat-plugin"; module.exports = { starknet: { venv: "active", network: process.env.NETWORK, cairo1BinDir: process.env.CAIRO_1_COMPILER_DIR }, networks: { devnet: { url: "http://127.0.0.1:5050" } } }; ================================================ FILE: test/general-tests/decode-event-v2-test/network.json ================================================ { "$schema": "../../network.schema", "devnet": true } ================================================ FILE: test/general-tests/devnet-block-time/check.ts ================================================ import { hardhatStarknetTest } from "../../utils/cli-functions"; hardhatStarknetTest("--no-compile test/devnet-time-test.ts".split(" ")); ================================================ FILE: test/general-tests/devnet-block-time/hardhat.config.ts ================================================ import "@shardlabs/starknet-hardhat-plugin"; module.exports = { starknet: { network: process.env.NETWORK }, networks: { devnet: { url: "http://127.0.0.1:5050" } } }; ================================================ FILE: test/general-tests/devnet-block-time/network.json ================================================ { "$schema": "../../network.schema", "devnet": true } ================================================ FILE: test/general-tests/devnet-create-block/check.ts ================================================ import { hardhatStarknetTest } from "../../utils/cli-functions"; hardhatStarknetTest("--no-compile test/devnet-create-block.test.ts".split(" ")); ================================================ FILE: test/general-tests/devnet-create-block/hardhat.config.ts ================================================ import "@shardlabs/starknet-hardhat-plugin"; module.exports = { starknet: { network: process.env.NETWORK }, networks: { devnet: { url: "http://127.0.0.1:5050" } } }; ================================================ FILE: test/general-tests/devnet-create-block/network.json ================================================ { "$schema": "../../network.schema", "devnet": true } ================================================ FILE: test/general-tests/devnet-dump-and-load/check.ts ================================================ import { hardhatStarknetCompileDeprecated, hardhatStarknetTest } from "../../utils/cli-functions"; hardhatStarknetCompileDeprecated(["contracts/contract.cairo"]); hardhatStarknetTest("--no-compile test/devnet-dump-and-load.test.ts".split(" ")); ================================================ FILE: test/general-tests/devnet-dump-and-load/hardhat.config.ts ================================================ import "@shardlabs/starknet-hardhat-plugin"; module.exports = { starknet: { network: process.env.NETWORK }, networks: { devnet: { url: "http://127.0.0.1:5050" } } }; ================================================ FILE: test/general-tests/devnet-dump-and-load/network.json ================================================ { "$schema": "../../network.schema", "devnet": true } ================================================ FILE: test/general-tests/devnet-mint/check.ts ================================================ import { hardhatStarknetTest } from "../../utils/cli-functions"; hardhatStarknetTest("--no-compile test/devnet-mint.test.ts".split(" ")); ================================================ FILE: test/general-tests/devnet-mint/hardhat.config.ts ================================================ import "@shardlabs/starknet-hardhat-plugin"; module.exports = { starknet: { network: process.env.NETWORK }, networks: { devnet: { url: "http://127.0.0.1:5050" } } }; ================================================ FILE: test/general-tests/devnet-mint/network.json ================================================ { "$schema": "../../network.schema", "devnet": true } ================================================ FILE: test/general-tests/devnet-restart/check.ts ================================================ import { hardhatStarknetCompileDeprecated, hardhatStarknetTest } from "../../utils/cli-functions"; hardhatStarknetCompileDeprecated(["contracts/contract.cairo"]); hardhatStarknetTest("--no-compile test/devnet-restart.test.ts".split(" ")); ================================================ FILE: test/general-tests/devnet-restart/hardhat.config.ts ================================================ import "@shardlabs/starknet-hardhat-plugin"; module.exports = { starknet: { network: process.env.NETWORK }, networks: { devnet: { url: "http://127.0.0.1:5050" } } }; ================================================ FILE: test/general-tests/devnet-restart/network.json ================================================ { "$schema": "../../network.schema", "devnet": true } ================================================ FILE: test/general-tests/expect-error-on-compile/check.ts ================================================ import { copyFileSync } from "fs"; import path from "path"; import { hardhatStarknetCompileDeprecated } from "../../utils/cli-functions"; import { assertContains } from "../../utils/utils"; const contractName = "invalid_contract.cairo"; const contractPath = path.join("contracts", contractName); copyFileSync(path.join(__dirname, contractName), contractPath); console.log("Testing rejection of compilation with correct message"); const compileResult = hardhatStarknetCompileDeprecated([contractPath], true); assertContains( compileResult.stderr, "Unknown identifier 'openzeppelin.token.erc721.library.ERC721.nonexistent_method'" ); console.log("Success"); ================================================ FILE: test/general-tests/expect-error-on-compile/hardhat.config.ts ================================================ import "@shardlabs/starknet-hardhat-plugin"; module.exports = { starknet: { network: process.env.NETWORK }, networks: { devnet: { url: "http://127.0.0.1:5050" } } }; ================================================ FILE: test/general-tests/expect-error-on-compile/invalid_contract.cairo ================================================ // unknown identifier %lang starknet %builtins pedersen range_check from starkware.cairo.common.cairo_builtins import HashBuiltin from openzeppelin.token.erc721.library import ERC721 @constructor func constructor{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr}( ) { ERC721.nonexistent_method(); return (); } ================================================ FILE: test/general-tests/expect-error-on-compile/network.json ================================================ { "$schema": "../../network.schema", "devnet": true } ================================================ FILE: test/general-tests/function-argument-number/check.ts ================================================ import { hardhatStarknetCompileDeprecated, hardhatStarknetTest } from "../../utils/cli-functions"; hardhatStarknetCompileDeprecated(["contracts/contract.cairo"]); hardhatStarknetTest("--no-compile test/function-args-test.ts".split(" ")); ================================================ FILE: test/general-tests/function-argument-number/hardhat.config.ts ================================================ import "@shardlabs/starknet-hardhat-plugin"; module.exports = { starknet: { network: process.env.NETWORK }, networks: { devnet: { url: "http://127.0.0.1:5050" } } }; ================================================ FILE: test/general-tests/function-argument-number/network.json ================================================ { "$schema": "../../network.schema", "devnet": true } ================================================ FILE: test/general-tests/getBalance/check.ts ================================================ import { hardhatStarknetTest } from "../../utils/cli-functions"; hardhatStarknetTest("--no-compile test/get-balance.test.ts".split(" ")); ================================================ FILE: test/general-tests/getBalance/hardhat.config.ts ================================================ import "@shardlabs/starknet-hardhat-plugin"; module.exports = { starknet: { network: process.env.NETWORK }, networks: { devnet: { url: "http://127.0.0.1:5050" } } }; ================================================ FILE: test/general-tests/getBalance/network.json ================================================ { "$schema": "../../network.schema", "devnet": true } ================================================ FILE: test/general-tests/getContractFactory/check.ts ================================================ import { hardhatStarknetCompileDeprecated, hardhatStarknetTest } from "../../utils/cli-functions"; hardhatStarknetCompileDeprecated([]); hardhatStarknetTest("--no-compile test/path-test.ts".split(" ")); ================================================ FILE: test/general-tests/getContractFactory/hardhat.config.ts ================================================ import "@shardlabs/starknet-hardhat-plugin"; module.exports = {}; ================================================ FILE: test/general-tests/getContractFactory/network.json ================================================ { "$schema": "../../network.schema", "devnet": true } ================================================ FILE: test/general-tests/hardhat-run/check.ts ================================================ // import { hardhatStarknetCompileDeprecated, hardhatStarknetRun } from "../../utils/cli-functions"; // import { ensureEnvVar } from "../../utils/utils"; console.log("Testing hh run with --starknet-network is currently disabled"); // const network = ensureEnvVar("NETWORK"); // hardhatStarknetCompileDeprecated(["contracts/contract.cairo"]); // hardhatStarknetRun(`--no-compile scripts/quick-script.ts --starknet-network ${network}`.split(" ")); ================================================ FILE: test/general-tests/hardhat-run/hardhat.config.ts ================================================ import "@shardlabs/starknet-hardhat-plugin"; module.exports = { starknet: { network: process.env.NETWORK }, networks: { devnet: { url: "http://127.0.0.1:5050" } } }; ================================================ FILE: test/general-tests/hardhat-run/network.json ================================================ { "$schema": "../../network.schema", "devnet": true } ================================================ FILE: test/general-tests/plain/check.ts ================================================ import { hardhatStarknetCompileDeprecated, hardhatStarknetTest } from "../../utils/cli-functions"; hardhatStarknetCompileDeprecated([]); hardhatStarknetTest(["test/sample-test.ts", "--no-compile"]); ================================================ FILE: test/general-tests/plain/hardhat.config.ts ================================================ import "@shardlabs/starknet-hardhat-plugin"; module.exports = { starknet: { network: process.env.NETWORK }, networks: { devnet: { url: "http://127.0.0.1:5050" } } }; ================================================ FILE: test/general-tests/plain/network.json ================================================ { "$schema": "../../network.schema", "alphaGoerli2": true, "devnet": true } ================================================ FILE: test/general-tests/postman/check.ts ================================================ import { exec } from "../../utils/utils"; import { spawn } from "child_process"; import { hardhatStarknetCompileDeprecated, hardhatStarknetTest } from "../../utils/cli-functions"; import { NODE_PORT } from "../../constants/constants"; hardhatStarknetCompileDeprecated(["contracts/l1l2.cairo"]); spawn("npx", ["hardhat", "node", "--port", NODE_PORT], { detached: true }); exec("sleep 1"); hardhatStarknetTest("--network localhost test/postman.test.ts".split(" ")); exec(`kill -9 $(lsof -t -i:${NODE_PORT})`); ================================================ FILE: test/general-tests/postman/hardhat.config.ts ================================================ import "@nomiclabs/hardhat-ethers"; import "@shardlabs/starknet-hardhat-plugin"; module.exports = { solidity: "0.6.12", starknet: { network: process.env.NETWORK }, networks: { devnet: { url: "http://127.0.0.1:5050" } } }; ================================================ FILE: test/general-tests/postman/network.json ================================================ { "$schema": "../../network.schema", "devnet": true } ================================================ FILE: test/general-tests/predeployed-accounts-test/check.ts ================================================ import { hardhatStarknetTest } from "../../utils/cli-functions"; hardhatStarknetTest("--no-compile test/get-predeployed-accounts.test.ts".split(" ")); ================================================ FILE: test/general-tests/predeployed-accounts-test/hardhat.config.ts ================================================ import "@shardlabs/starknet-hardhat-plugin"; module.exports = { starknet: { network: process.env.NETWORK }, networks: { devnet: { url: "http://127.0.0.1:5050" } } }; ================================================ FILE: test/general-tests/predeployed-accounts-test/network.json ================================================ { "$schema": "../../network.schema", "devnet": true } ================================================ FILE: test/general-tests/proxy-call/check.ts ================================================ import { hardhatStarknetTest } from "../../utils/cli-functions"; hardhatStarknetTest("--no-compile scripts/delegate-proxy.ts".split(" ")); ================================================ FILE: test/general-tests/proxy-call/hardhat.config.ts ================================================ import "@shardlabs/starknet-hardhat-plugin"; module.exports = { starknet: { network: process.env.NETWORK, recompile: true }, networks: { devnet: { url: "http://127.0.0.1:5050" } } }; ================================================ FILE: test/general-tests/proxy-call/network.json ================================================ { "$schema": "../../network.schema", "devnet": true } ================================================ FILE: test/general-tests/relative-artifact-test/check.ts ================================================ import { hardhatStarknetCompileDeprecated, hardhatStarknetTest } from "../../utils/cli-functions"; import * as fs from "fs"; hardhatStarknetCompileDeprecated("contracts/contract.cairo contracts/util.cairo".split(" ")); fs.cpSync("starknet-artifacts/contracts", "test/test-artifacts", { recursive: true }); hardhatStarknetTest("--no-compile test/relative-artifacts.test.ts".split(" ")); ================================================ FILE: test/general-tests/relative-artifact-test/hardhat.config.ts ================================================ import "@shardlabs/starknet-hardhat-plugin"; module.exports = { starknet: { network: process.env.NETWORK }, networks: { devnet: { url: "http://127.0.0.1:5050" } } }; ================================================ FILE: test/general-tests/relative-artifact-test/network.json ================================================ { "$schema": "../../network.schema", "devnet": true } ================================================ FILE: test/general-tests/short-string-test/check.ts ================================================ import { hardhatStarknetTest } from "../../utils/cli-functions"; process.chdir(".."); // The config file used for running mocha tests is the one in root hardhatStarknetTest( "--no-compile test/general-tests/short-string-test/short-string-test.ts".split(" ") ); ================================================ FILE: test/general-tests/short-string-test/hardhat.config.ts ================================================ /* This file is empty because the config file used is at the project root, however it is still needed for the test script to run. */ ================================================ FILE: test/general-tests/short-string-test/network.json ================================================ { "$schema": "../../network.schema", "devnet": true } ================================================ FILE: test/general-tests/short-string-test/short-string-test.ts ================================================ import { expect } from "chai"; import { starknet } from "hardhat"; describe("Starknet", function () { this.timeout(300_000); const inputString = "hello"; const convertedString = BigInt("448378203247"); const invalidLengthString = "string with more than 31 characters"; const exactString = "string of exactly 31 characters"; const convertedExactString = BigInt( "203991099562869677216504074689167276267761996859264679054038991384575570547" ); const largeString = "string for exactly 32 characters"; const invalidCharacterString = "invalid char ÿ"; const multipleInvalidCharactersString = "invaliđ čarđ"; it("should convert a valid string to a BigInt", async function () { const convertedInput = starknet.shortStringToBigInt(inputString); expect(convertedInput).to.deep.equal(convertedString); }); it("should convert a string with exactly 31 characters to a BigInt", async function () { const convertedInput = starknet.shortStringToBigInt(exactString); expect(convertedInput).to.deep.equal(convertedExactString); }); it("should convert a BigInt to a string", async function () { const convertedOutput = starknet.bigIntToShortString(convertedString); expect(convertedOutput).to.deep.equal(inputString); }); it("should fail when a string has exactly 32 characters", async function () { try { starknet.shortStringToBigInt(largeString); expect.fail("Should have failed on converting a string with more than 31 characters."); } catch (err: any) { expect(err.message).to.deep.equal("Short strings must have a max of 31 characters."); } }); it("should fail when a string has over 31 characters", async function () { try { starknet.shortStringToBigInt(invalidLengthString); expect.fail("Should have failed on converting a string with more than 31 characters."); } catch (err: any) { expect(err.message).to.deep.equal("Short strings must have a max of 31 characters."); } }); it("should fail when a string has a non-standard-ASCII character", async function () { try { starknet.shortStringToBigInt(invalidCharacterString); expect.fail("Should have failed on converting a string with an invalid character."); } catch (err: any) { expect(err.message).to.deep.equal("Non-standard-ASCII character: ÿ"); } }); it("should fail when a string has multiple non-standard-ASCII characters", async function () { try { starknet.shortStringToBigInt(multipleInvalidCharactersString); expect.fail("Should have failed on converting a string with invalid characters."); } catch (err: any) { expect(err.message).to.deep.equal("Non-standard-ASCII characters: đ, č"); } }); }); ================================================ FILE: test/general-tests/starknet-plugin-version/check.ts ================================================ import { hardhatStarknetPluginVersion } from "../../utils/cli-functions"; hardhatStarknetPluginVersion(); ================================================ FILE: test/general-tests/starknet-plugin-version/hardhat.config.ts ================================================ import "@shardlabs/starknet-hardhat-plugin"; module.exports = { starknet: { network: process.env.NETWORK }, networks: { devnet: { url: "http://127.0.0.1:5050" } } }; ================================================ FILE: test/general-tests/starknet-plugin-version/network.json ================================================ { "$schema": "../../network.schema", "devnet": true } ================================================ FILE: test/general-tests/starknet-verify/check.ts ================================================ import { assertEqual, ensureEnvVar, exec } from "../../utils/utils"; import { hardhatStarknetCompileDeprecated, hardhatStarknetVerify } from "../../utils/cli-functions"; import axios from "axios"; console.log( "The starknet-verify test is too flaky so it is temporarily suspended. Make sure it's working!" ); process.exit(0); const network = ensureEnvVar("NETWORK"); const mainContract = "contracts/contract.cairo"; const utilContract = "contracts/util.cairo"; hardhatStarknetCompileDeprecated(`${mainContract} ${utilContract}`.split(" ")); throw new Error("Missing code: Deploy with salt and extract address"); const address = ""; console.log("Sleeping to allow Voyager to index the deployment"); exec("sleep 1m"); hardhatStarknetVerify( `--starknet-network ${network} --path ${mainContract} ${utilContract} --address ${address} --compiler-version 0.9.0 --license "No License (None)"`.split( " " ) ); console.log("Sleeping to allow Voyager to register the verification"); exec("sleep 15s"); (async () => { const { data } = await axios.get( `https://goerli-2.voyager.online/api/contract/${address}/code` ); assertEqual(data.abiVerified, "true", "Contract is not verified"); })(); ================================================ FILE: test/general-tests/starknet-verify/hardhat.config.ts ================================================ import "@shardlabs/starknet-hardhat-plugin"; module.exports = { starknet: { dockerizedVersion: "0.9.0", network: process.env.NETWORK }, networks: { devnet: { url: "http://127.0.0.1:5050" } } }; ================================================ FILE: test/general-tests/starknet-verify/network.json ================================================ { "$schema": "../../network.schema", "alphaGoerli2": true } ================================================ FILE: test/general-tests/transaction-trace/check.ts ================================================ import { hardhatStarknetCompileDeprecated, hardhatStarknetTest } from "../../utils/cli-functions"; hardhatStarknetCompileDeprecated(["contracts/contract.cairo"]); hardhatStarknetTest("--no-compile test/transaction-trace-test.ts".split(" ")); ================================================ FILE: test/general-tests/transaction-trace/hardhat.config.ts ================================================ import "@shardlabs/starknet-hardhat-plugin"; module.exports = { solidity: "0.6.12", starknet: { network: process.env.NETWORK }, networks: { devnet: { url: "http://127.0.0.1:5050" } } }; ================================================ FILE: test/general-tests/transaction-trace/network.json ================================================ { "$schema": "../../network.schema", "devnet": true } ================================================ FILE: test/integrated-devnet-tests/predeployed-accounts-test/check.ts ================================================ import { hardhatStarknetTest } from "../../utils/cli-functions"; import { checkDevnetIsNotRunning } from "../../utils/utils"; // Tests race condition on proxy server by making multiple calls to the // function getAccountFromAddress and that the proxy server // handles simultaneous requests correctly and that the port assignment // on the integrated-devnet environment is implemented correctly (async () => { await checkDevnetIsNotRunning(); hardhatStarknetTest("--no-compile test/get-predeployed-accounts.test.ts".split(" ")); await checkDevnetIsNotRunning(); })(); ================================================ FILE: test/integrated-devnet-tests/predeployed-accounts-test/hardhat.config.ts ================================================ import "@shardlabs/starknet-hardhat-plugin"; module.exports = { starknet: { network: process.env.NETWORK }, networks: { integratedDevnet: { venv: "active", url: "http://127.0.0.1:5050" } } }; ================================================ FILE: test/integrated-devnet-tests/predeployed-accounts-test/network.json ================================================ { "$schema": "../../network.schema", "integrated-devnet": true } ================================================ FILE: test/integrated-devnet-tests/with-active-venv/check.ts ================================================ import { hardhatStarknetCompileDeprecated, hardhatStarknetTest } from "../../utils/cli-functions"; import { checkDevnetIsNotRunning } from "../../utils/utils"; (async () => { await checkDevnetIsNotRunning(); hardhatStarknetCompileDeprecated(["contracts/contract.cairo"]); hardhatStarknetTest("--no-compile test/integrated-devnet.test.ts".split(" ")); await checkDevnetIsNotRunning(); })(); ================================================ FILE: test/integrated-devnet-tests/with-active-venv/hardhat.config.ts ================================================ import "@shardlabs/starknet-hardhat-plugin"; module.exports = { starknet: { network: process.env.NETWORK }, networks: { integratedDevnet: { venv: "active", url: "http://127.0.0.1:5050", args: ["--seed", "42"] } } }; ================================================ FILE: test/integrated-devnet-tests/with-active-venv/network.json ================================================ { "$schema": "../../network.schema", "integrated-devnet": true } ================================================ FILE: test/integrated-devnet-tests/with-active-venv-args/check.ts ================================================ import { hardhatStarknetCompileDeprecated, hardhatStarknetTest } from "../../utils/cli-functions"; import { checkDevnetIsNotRunning } from "../../utils/utils"; (async () => { await checkDevnetIsNotRunning(); hardhatStarknetCompileDeprecated(["contracts/contract.cairo"]); process.env.EXPECTED_GAS_PRICE = "2000000000"; hardhatStarknetTest("--no-compile test/integrated-devnet-args.test.ts".split(" ")); await checkDevnetIsNotRunning(); })(); ================================================ FILE: test/integrated-devnet-tests/with-active-venv-args/hardhat.config.ts ================================================ import "@shardlabs/starknet-hardhat-plugin"; module.exports = { starknet: { network: process.env.NETWORK }, networks: { integratedDevnet: { venv: "active", url: "http://127.0.0.1:5050", args: ["--lite-mode", "--gas-price", process.env.EXPECTED_GAS_PRICE, "--seed", "42"] } } }; ================================================ FILE: test/integrated-devnet-tests/with-active-venv-args/network.json ================================================ { "$schema": "../../network.schema", "integrated-devnet": true } ================================================ FILE: test/integrated-devnet-tests/with-default/check.ts ================================================ import { hardhatStarknetCompileDeprecated, hardhatStarknetTest } from "../../utils/cli-functions"; import { checkDevnetIsNotRunning } from "../../utils/utils"; (async () => { await checkDevnetIsNotRunning(); hardhatStarknetCompileDeprecated(["contracts/contract.cairo"]); hardhatStarknetTest("--no-compile test/integrated-devnet.test.ts".split(" ")); await checkDevnetIsNotRunning(); })(); ================================================ FILE: test/integrated-devnet-tests/with-default/hardhat.config.ts ================================================ import "@shardlabs/starknet-hardhat-plugin"; module.exports = { starknet: { network: process.env.NETWORK }, networks: { integratedDevnet: { // using the default runner // neither venv nor dockerized version is specified url: "http://127.0.0.1:5050", args: ["--seed", "42"] } } }; ================================================ FILE: test/integrated-devnet-tests/with-default/network.json ================================================ { "$schema": "../../network.schema", "integrated-devnet": true } ================================================ FILE: test/integrated-devnet-tests/with-docker/check.ts ================================================ import { hardhatStarknetCompileDeprecated, hardhatStarknetTest } from "../../utils/cli-functions"; import { checkDevnetIsNotRunning } from "../../utils/utils"; (async () => { await checkDevnetIsNotRunning(); hardhatStarknetCompileDeprecated(["contracts/contract.cairo"]); hardhatStarknetTest("--no-compile test/integrated-devnet.test.ts".split(" ")); await checkDevnetIsNotRunning(); })(); ================================================ FILE: test/integrated-devnet-tests/with-docker/hardhat.config.ts ================================================ import "@shardlabs/starknet-hardhat-plugin"; module.exports = { starknet: { network: process.env.NETWORK }, networks: { integratedDevnet: { dockerizedVersion: process.env.STARKNET_DEVNET, url: "http://127.0.0.1:5050", args: ["--seed", "42"] } } }; ================================================ FILE: test/integrated-devnet-tests/with-docker/network.json ================================================ { "$schema": "../../network.schema", "integrated-devnet": true } ================================================ FILE: test/integrated-devnet-tests/with-docker-address-occupied/check.ts ================================================ import { spawn } from "child_process"; import { checkDevnetIsNotRunning, assertContains } from "../../utils/utils"; import { hardhatStarknetCompileDeprecated, hardhatStarknetTest } from "../../utils/cli-functions"; (async () => { await checkDevnetIsNotRunning(); // run devnet which will cause integrated-devnet to fail const result = spawn( "starknet-devnet", "--host 127.0.0.1 --port 5050 --accounts 0".split(" "), { detached: true } ); hardhatStarknetCompileDeprecated(["contracts/contract.cairo"]); const execution = hardhatStarknetTest( "--no-compile test/integrated-devnet.test.ts".split(" "), true ); assertContains(execution.stderr, "127.0.0.1:5050 already occupied."); result.kill(); await checkDevnetIsNotRunning(); })(); ================================================ FILE: test/integrated-devnet-tests/with-docker-address-occupied/hardhat.config.ts ================================================ import "@shardlabs/starknet-hardhat-plugin"; module.exports = { starknet: { network: process.env.NETWORK }, networks: { integratedDevnet: { dockerizedVersion: process.env.STARKNET_DEVNET, url: "http://127.0.0.1:5050", args: ["--seed", "42"] } } }; ================================================ FILE: test/integrated-devnet-tests/with-docker-address-occupied/network.json ================================================ { "$schema": "../../network.schema", "integrated-devnet": true } ================================================ FILE: test/integrated-devnet-tests/with-docker-args/check.ts ================================================ import { hardhatStarknetCompileDeprecated, hardhatStarknetTest } from "../../utils/cli-functions"; import { checkDevnetIsNotRunning } from "../../utils/utils"; (async () => { await checkDevnetIsNotRunning(); hardhatStarknetCompileDeprecated(["contracts/contract.cairo"]); process.env.EXPECTED_GAS_PRICE = "2000000000"; hardhatStarknetTest("--no-compile test/integrated-devnet-args.test.ts".split(" ")); await checkDevnetIsNotRunning(); })(); ================================================ FILE: test/integrated-devnet-tests/with-docker-args/hardhat.config.ts ================================================ import "@shardlabs/starknet-hardhat-plugin"; module.exports = { starknet: { network: process.env.NETWORK }, networks: { integratedDevnet: { dockerizedVersion: process.env.STARKNET_DEVNET, url: "http://127.0.0.1:5050", args: ["--lite-mode", "--gas-price", process.env.EXPECTED_GAS_PRICE, "--seed", "42"] } } }; ================================================ FILE: test/integrated-devnet-tests/with-docker-args/network.json ================================================ { "$schema": "../../network.schema", "integrated-devnet": true } ================================================ FILE: test/integrated-devnet-tests/with-docker-full-image/check.ts ================================================ import { hardhatStarknetTest } from "../../utils/cli-functions"; import { checkDevnetIsNotRunning } from "../../utils/utils"; // Test how full image specification is handled (async () => { // no danger in using a devnet to whose API we are not adapted (latest) // as this test only relies on /is_alive for (const devnetVersion of [ "shardlabs/starknet-devnet:latest", "shardlabs/starknet-devnet-rs:latest" ]) { await checkDevnetIsNotRunning(); process.env.STARKNET_DEVNET = devnetVersion; hardhatStarknetTest([ "--no-compile", "test/integrated-devnet.test.ts", // run just the one test from the file "--grep", "\"should have devnet endpoint alive\"" ]); } await checkDevnetIsNotRunning(); })(); ================================================ FILE: test/integrated-devnet-tests/with-docker-full-image/hardhat.config.ts ================================================ import "@shardlabs/starknet-hardhat-plugin"; module.exports = { starknet: { network: process.env.NETWORK }, networks: { integratedDevnet: { dockerizedVersion: process.env.STARKNET_DEVNET, url: "http://127.0.0.1:5050" } } }; ================================================ FILE: test/integrated-devnet-tests/with-docker-full-image/network.json ================================================ { "$schema": "../../network.schema", "integrated-devnet": true } ================================================ FILE: test/integrated-devnet-tests/with-docker-vmlang-rust/check.ts ================================================ import { hardhatStarknetCompileDeprecated, hardhatStarknetTest } from "../../utils/cli-functions"; import { checkDevnetIsNotRunning, assertContains } from "../../utils/utils"; (async () => { await checkDevnetIsNotRunning(); hardhatStarknetCompileDeprecated(["contracts/contract.cairo"]); const execution = hardhatStarknetTest("--no-compile test/integrated-devnet.test.ts".split(" ")); assertContains(execution.stderr, "Using Cairo VM: Rust"); await checkDevnetIsNotRunning(); })(); ================================================ FILE: test/integrated-devnet-tests/with-docker-vmlang-rust/hardhat.config.ts ================================================ import "@shardlabs/starknet-hardhat-plugin"; module.exports = { starknet: { network: process.env.NETWORK }, networks: { integratedDevnet: { dockerizedVersion: process.env.STARKNET_DEVNET, vmLang: "rust", url: "http://127.0.0.1:5050", args: ["--seed", "42"], stderr: "STDERR" } } }; ================================================ FILE: test/integrated-devnet-tests/with-docker-vmlang-rust/network.json ================================================ { "$schema": "../../network.schema", "integrated-devnet": true } ================================================ FILE: test/integrated-devnet-tests/with-docker-wrong-cli/check.ts ================================================ import { hardhatStarknetCompileDeprecated, hardhatStarknetTest } from "../../utils/cli-functions"; import { checkDevnetIsNotRunning, assertContains } from "../../utils/utils"; (async () => { await checkDevnetIsNotRunning(); hardhatStarknetCompileDeprecated(["contracts/contract.cairo"]); const execution = hardhatStarknetTest( "--no-compile test/integrated-devnet.test.ts".split(" "), true ); assertContains( execution.stderr, "starknet-devnet: error: --accounts must be a positive integer; got: invalid_value." ); await checkDevnetIsNotRunning(); })(); ================================================ FILE: test/integrated-devnet-tests/with-docker-wrong-cli/hardhat.config.ts ================================================ import "@shardlabs/starknet-hardhat-plugin"; module.exports = { starknet: { network: process.env.NETWORK }, networks: { integratedDevnet: { dockerizedVersion: process.env.STARKNET_DEVNET, url: "http://127.0.0.1:5050", args: ["--accounts", "invalid_value", "--seed", "42"] } } }; ================================================ FILE: test/integrated-devnet-tests/with-docker-wrong-cli/network.json ================================================ { "$schema": "../../network.schema", "integrated-devnet": true } ================================================ FILE: test/integrated-devnet-tests/with-stderr-to-STDERR/check.ts ================================================ import { readFileSync } from "fs"; import { assertExistence, checkDevnetIsNotRunning, assertContains } from "../../utils/utils"; import { hardhatStarknetCompileDeprecated, hardhatStarknetTest } from "../../utils/cli-functions"; (async () => { await checkDevnetIsNotRunning(); const expectedStdout = "Account #0"; const expectedWarning = "WARNING: Use these accounts and their keys ONLY for local testing. DO NOT use them on mainnet or other live networks because you will LOSE FUNDS."; hardhatStarknetCompileDeprecated(["contracts/contract.cairo"]); const execution = hardhatStarknetTest("--no-compile test/integrated-devnet.test.ts".split(" ")); assertContains(execution.stderr, expectedWarning); // Checks if file logs/stderr.log exists and contains the expected warning string assertExistence("logs/stdout.log"); const stdout = readFileSync("logs/stdout.log", "utf-8"); assertContains(stdout, expectedStdout); console.log("Success"); await checkDevnetIsNotRunning(); })(); ================================================ FILE: test/integrated-devnet-tests/with-stderr-to-STDERR/hardhat.config.ts ================================================ import "@shardlabs/starknet-hardhat-plugin"; module.exports = { starknet: { network: process.env.NETWORK }, networks: { integratedDevnet: { venv: process.env.STARKNET_DEVNET_PATH, url: "http://127.0.0.1:5050", stdout: "logs/stdout.log", stderr: "STDERR", args: ["--seed", "42"] } } }; ================================================ FILE: test/integrated-devnet-tests/with-stderr-to-STDERR/network.json ================================================ { "$schema": "../../network.schema", "integrated-devnet": true } ================================================ FILE: test/integrated-devnet-tests/with-stderr-to-STDOUT/check.ts ================================================ import { hardhatStarknetCompileDeprecated, hardhatStarknetTest } from "../../utils/cli-functions"; import { checkDevnetIsNotRunning, assertContains } from "../../utils/utils"; (async () => { await checkDevnetIsNotRunning(); hardhatStarknetCompileDeprecated(["contracts/contract.cairo"]); const execution = hardhatStarknetTest( "--no-compile test/integrated-devnet.test.ts".split(" "), true ); assertContains( execution.stderr, "starknet-devnet: error: --accounts must be a positive integer; got: invalid_value." ); await checkDevnetIsNotRunning(); })(); ================================================ FILE: test/integrated-devnet-tests/with-stderr-to-STDOUT/hardhat.config.ts ================================================ import "@shardlabs/starknet-hardhat-plugin"; module.exports = { starknet: { network: process.env.NETWORK }, networks: { integratedDevnet: { venv: process.env.STARKNET_DEVNET_PATH, url: "http://127.0.0.1:5050", args: ["--accounts", "invalid_value"], stderr: "STDOUT" } } }; ================================================ FILE: test/integrated-devnet-tests/with-stderr-to-STDOUT/network.json ================================================ { "$schema": "../../network.schema", "integrated-devnet": true } ================================================ FILE: test/integrated-devnet-tests/with-stderr-to-file/check.ts ================================================ import { readFileSync } from "fs"; import { assertExistence, checkDevnetIsNotRunning, assertContains } from "../../utils/utils"; import { hardhatStarknetCompileDeprecated, hardhatStarknetTest } from "../../utils/cli-functions"; (async () => { await checkDevnetIsNotRunning(); hardhatStarknetCompileDeprecated(["contracts/contract.cairo"]); const expectedStdout = "Account #0"; const expectedWarning = "WARNING: Use these accounts and their keys ONLY for local testing. DO NOT use them on mainnet or other live networks because you will LOSE FUNDS."; const output = hardhatStarknetTest("--no-compile test/integrated-devnet.test.ts".split(" ")); // Checks if output contains the expected string from stdout assertContains(output.stdout, expectedStdout); // Checks if file logs/stderr.log exists and contains the expected warning string assertExistence("logs/stderr.log"); const stderr = readFileSync("logs/stderr.log", "utf-8"); assertContains(stderr, expectedWarning); console.log("Success"); await checkDevnetIsNotRunning(); })(); ================================================ FILE: test/integrated-devnet-tests/with-stderr-to-file/hardhat.config.ts ================================================ import "@shardlabs/starknet-hardhat-plugin"; module.exports = { starknet: { network: process.env.NETWORK }, networks: { integratedDevnet: { venv: process.env.STARKNET_DEVNET_PATH, url: "http://127.0.0.1:5050", stdout: "STDOUT", stderr: "logs/stderr.log", args: ["--seed", "42"] } } }; ================================================ FILE: test/integrated-devnet-tests/with-stderr-to-file/network.json ================================================ { "$schema": "../../network.schema", "integrated-devnet": true } ================================================ FILE: test/integrated-devnet-tests/with-venv/check.ts ================================================ import { hardhatStarknetCompileDeprecated, hardhatStarknetTest } from "../../utils/cli-functions"; import { checkDevnetIsNotRunning } from "../../utils/utils"; (async () => { await checkDevnetIsNotRunning(); hardhatStarknetCompileDeprecated(["contracts/contract.cairo"]); hardhatStarknetTest("--no-compile test/integrated-devnet.test.ts".split(" ")); await checkDevnetIsNotRunning(); })(); ================================================ FILE: test/integrated-devnet-tests/with-venv/hardhat.config.ts ================================================ import "@shardlabs/starknet-hardhat-plugin"; module.exports = { starknet: { network: process.env.NETWORK }, networks: { integratedDevnet: { venv: process.env.STARKNET_DEVNET_PATH, url: "http://127.0.0.1:5050", args: ["--seed", "42"] } } }; ================================================ FILE: test/integrated-devnet-tests/with-venv/network.json ================================================ { "$schema": "../../network.schema", "integrated-devnet": true } ================================================ FILE: test/integrated-devnet-tests/with-venv-address-occupied/check.ts ================================================ import { spawn } from "child_process"; import { checkDevnetIsNotRunning, assertContains } from "../../utils/utils"; import { hardhatStarknetCompileDeprecated, hardhatStarknetTest } from "../../utils/cli-functions"; (async () => { await checkDevnetIsNotRunning(); const result = spawn( "starknet-devnet", "--host 127.0.0.1 --port 5050 --accounts 0".split(" "), { detached: true } ); hardhatStarknetCompileDeprecated(["contracts/contract.cairo"]); const execution = hardhatStarknetTest( "--no-compile test/integrated-devnet.test.ts".split(" "), true ); assertContains(execution.stderr, "127.0.0.1:5050 already occupied."); result.kill(); await checkDevnetIsNotRunning(); })(); ================================================ FILE: test/integrated-devnet-tests/with-venv-address-occupied/hardhat.config.ts ================================================ import "@shardlabs/starknet-hardhat-plugin"; module.exports = { starknet: { network: process.env.NETWORK }, networks: { integratedDevnet: { venv: process.env.STARKNET_DEVNET_PATH, url: "http://127.0.0.1:5050", args: ["--seed", "42"] } } }; ================================================ FILE: test/integrated-devnet-tests/with-venv-address-occupied/network.json ================================================ { "$schema": "../../network.schema", "integrated-devnet": true } ================================================ FILE: test/integrated-devnet-tests/with-venv-wrong-cli/check.ts ================================================ import { hardhatStarknetCompileDeprecated, hardhatStarknetTest } from "../../utils/cli-functions"; import { checkDevnetIsNotRunning, assertContains } from "../../utils/utils"; (async () => { await checkDevnetIsNotRunning(); hardhatStarknetCompileDeprecated(["contracts/contract.cairo"]); const execution = hardhatStarknetTest( "--no-compile test/integrated-devnet.test.ts".split(" "), true ); assertContains( execution.stderr, "starknet-devnet: error: --accounts must be a positive integer; got: invalid_value." ); await checkDevnetIsNotRunning(); })(); ================================================ FILE: test/integrated-devnet-tests/with-venv-wrong-cli/hardhat.config.ts ================================================ import "@shardlabs/starknet-hardhat-plugin"; module.exports = { starknet: { network: process.env.NETWORK }, networks: { integratedDevnet: { venv: process.env.STARKNET_DEVNET_PATH, url: "http://127.0.0.1:5050", args: ["--accounts", "invalid_value", "--seed", "42"] } } }; ================================================ FILE: test/integrated-devnet-tests/with-venv-wrong-cli/network.json ================================================ { "$schema": "../../network.schema", "integrated-devnet": true } ================================================ FILE: test/network.schema ================================================ { "$schema": "https://json-schema.org/draft-07/schema", "type": "object", "properties": { "devnet": { "type": "boolean" }, "alphaGoerli2": { "type": "boolean" }, "integrated-devnet": { "type": "boolean" } } } ================================================ FILE: test/recompilation-tests/hardhat-run/check.ts ================================================ import { hardhatStarknetRun } from "../../utils/cli-functions"; import { rmrfSync } from "../../utils/utils"; // Hardhat run command console.log("should recompile with deleted artifact on hardhat run"); rmrfSync("starknet-artifacts/contracts/contract.cairo"); hardhatStarknetRun("--no-compile scripts/deploy.ts".split(" ")); console.log("should recompile with cache file deleted on hardhat run"); rmrfSync("cache/cairo-files-cache.json"); hardhatStarknetRun("--no-compile scripts/deploy.ts".split(" ")); ================================================ FILE: test/recompilation-tests/hardhat-run/hardhat.config.ts ================================================ import "@shardlabs/starknet-hardhat-plugin"; module.exports = { starknet: { network: process.env.NETWORK, recompile: true }, networks: { devnet: { url: "http://127.0.0.1:5050" } } }; ================================================ FILE: test/recompilation-tests/hardhat-run/network.json ================================================ { "$schema": "../../network.schema", "devnet": true } ================================================ FILE: test/recompilation-tests/hardhat-test/check.ts ================================================ import { copyFileSync, readFileSync, appendFileSync } from "fs"; import path from "path"; import { hardhatStarknetTest } from "../../utils/cli-functions"; import { assertNotEqual, rmrfSync } from "../../utils/utils"; const prefix = path.join(__dirname); const contractName = "contract_test_cache.cairo"; const contractPath = path.join("contracts", contractName); const dependencyName = "dependency.cairo"; const dependencyPath = path.join("contracts", dependencyName); rmrfSync(dependencyPath); rmrfSync(contractPath); // Hardhat test command console.log("Testing Recompilation with new contract added"); copyFileSync(path.join(prefix, contractName), contractPath); copyFileSync(path.join(prefix, dependencyName), dependencyPath); hardhatStarknetTest("--no-compile test/recompilation/recompilation-main-test.ts".split(" ")); console.log("Testing Recompilation with artifacts deleted"); rmrfSync("starknet-artifacts/contracts/contract.cairo"); hardhatStarknetTest("--no-compile test/recompilation/recompilation-main-test.ts".split(" ")); console.log("Testing Recompilation with updated contract"); // Appending a new function to the contract appendFileSync( "contracts/contract_test_cache.cairo", readFileSync(path.join(prefix, "get_balance.cairo")).toString() ); hardhatStarknetTest("--no-compile test/recompilation/recompilation-update-test.ts".split(" ")); console.log("Testing Recompilation with cache file deleted"); rmrfSync("cache/cairo-files-cache.json"); hardhatStarknetTest("--no-compile test/recompilation/recompilation-main-test.ts".split(" ")); console.log("Testing Recompilation with dependency changed"); appendFileSync(dependencyPath, "//"); hardhatStarknetTest("--no-compile test/recompilation/recompilation-dependency-test.ts".split(" ")); console.log("Testing Recompilation with source deleted"); copyFileSync("cache/cairo-files-cache.json", "cache-content-before.json"); rmrfSync("contracts/contract_test_cache.cairo"); hardhatStarknetTest("--no-compile test/recompilation/recompilation-main-test.ts".split(" ")); // Check that the cache file was updated using diff const cacheContentAfter = readFileSync("cache/cairo-files-cache.json"); const cacheContentBefore = readFileSync("cache-content-before.json"); assertNotEqual(cacheContentAfter, cacheContentBefore, "Cache file was not updated."); console.log("Testing Recompilation one contract added another deleted"); rmrfSync("contracts/contract_test_cache.cairo"); rmrfSync("contracts/dependency.cairo"); const contractWithNoDependency = "contract_test_cache_no_dependency.cairo"; copyFileSync(path.join(prefix, contractWithNoDependency), contractPath); hardhatStarknetTest("--no-compile test/recompilation/recompilation-main-test.ts".split(" ")); ================================================ FILE: test/recompilation-tests/hardhat-test/contract_test_cache.cairo ================================================ // Declare this file as a Starknet contract. %lang starknet from starkware.cairo.common.cairo_builtins import HashBuiltin from dependency import almost_equal as aeq // Define a storage variable. @storage_var func balance() -> (res: felt) { } // Increases the balance by the given amount. @external func increase_balance{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr}( amount: felt ) { let (res) = balance.read(); balance.write(res + amount); return (); } @view func use_almost_equal(a, b) -> (res: felt) { let (res) = aeq(a=a, b=b); return (res,); } ================================================ FILE: test/recompilation-tests/hardhat-test/contract_test_cache_no_dependency.cairo ================================================ // Declare this file as a Starknet contract. %lang starknet from starkware.cairo.common.cairo_builtins import HashBuiltin // Define a storage variable. @storage_var func balance() -> (res: felt) { } // Increases the balance by the given amount. @external func increase_balance{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr}( amount: felt ) { let (res) = balance.read(); balance.write(res + amount); return (); } ================================================ FILE: test/recompilation-tests/hardhat-test/dependency.cairo ================================================ %lang starknet @view func almost_equal(a, b) -> (res: felt) { if ((a - b) * (a - b - 1) * (a - b + 1) == 0) { return (res=1); } return (res=0); } ================================================ FILE: test/recompilation-tests/hardhat-test/get_balance.cairo ================================================ // Returns the current balance. @view func get_balance{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr}() -> (res: felt) { let (res) = balance.read(); return (res,); } ================================================ FILE: test/recompilation-tests/hardhat-test/hardhat.config.ts ================================================ import "@shardlabs/starknet-hardhat-plugin"; module.exports = { starknet: { network: process.env.NETWORK, recompile: true }, networks: { devnet: { url: "http://127.0.0.1:5050" } } }; ================================================ FILE: test/recompilation-tests/hardhat-test/network.json ================================================ { "$schema": "../../network.schema", "devnet": true } ================================================ FILE: test/recompilation-tests/recompiler-default/check.ts ================================================ import { hardhatStarknetRun } from "../../utils/cli-functions"; import { assertContains, rmrfSync } from "../../utils/utils"; const expected = "StarknetPluginError: Could not find JSON artifact for"; console.log("Testing with deleted artifact on recompiler option set to default (off)"); rmrfSync("starknet-artifacts/contracts/contract.cairo"); const execution = hardhatStarknetRun("--no-compile scripts/deploy.ts".split(" "), true); assertContains(execution.stderr, expected); console.log("Success"); ================================================ FILE: test/recompilation-tests/recompiler-default/hardhat.config.ts ================================================ import "@shardlabs/starknet-hardhat-plugin"; module.exports = { starknet: { network: process.env.NETWORK }, networks: { devnet: { url: "http://127.0.0.1:5050" } } }; ================================================ FILE: test/recompilation-tests/recompiler-default/network.json ================================================ { "$schema": "../../network.schema", "devnet": true } ================================================ FILE: test/recompilation-tests/recompiler-off/check.ts ================================================ import { hardhatStarknetRun } from "../../utils/cli-functions"; import { assertContains, rmrfSync } from "../../utils/utils"; const expected = "StarknetPluginError: Could not find JSON artifact for"; console.log("Testing with deleted artifact on recompiler option set to default (off)"); rmrfSync("starknet-artifacts/contracts/contract.cairo"); const execution = hardhatStarknetRun("--no-compile scripts/deploy.ts".split(" "), true); assertContains(execution.stderr, expected); console.log("Success"); ================================================ FILE: test/recompilation-tests/recompiler-off/hardhat.config.ts ================================================ import "@shardlabs/starknet-hardhat-plugin"; module.exports = { starknet: { network: process.env.NETWORK, recompile: false }, networks: { devnet: { url: "http://127.0.0.1:5050" } } }; ================================================ FILE: test/recompilation-tests/recompiler-off/network.json ================================================ { "$schema": "../../network.schema", "devnet": true } ================================================ FILE: test/utils/cli-functions.ts ================================================ import shell from "shelljs"; import { assertEqual, assertNotEqual } from "./utils"; export function exec(cmd: string, expectFailure = false) { const result = shell.exec(cmd, { silent: expectFailure }); const msg = `Command ${cmd} failed.\n${result.stderr}`; if (!expectFailure) { assertEqual(result.code, 0, msg); } else { assertNotEqual(result.code, 0, msg); } return result; } export const hardhatStarknetCompileDeprecated = (args: Array, expectFailure = false) => { return exec(`npx hardhat starknet-compile-deprecated ${args.join(" ")}`, expectFailure); }; export const hardhatStarknetCompile = (args: Array, expectFailure = false) => { return exec(`npx hardhat starknet-compile ${args.join(" ")}`, expectFailure); }; export const hardhatStarknetRun = (args: Array, expectFailure = false) => { return exec(`npx hardhat run ${args.join(" ")}`, expectFailure); }; export const hardhatStarknetTest = (args: Array, expectFailure = false) => { return exec(`npx hardhat test ${args.join(" ")}`, expectFailure); }; export const hardhatStarknetVerify = (args: Array, expectFailure = false) => { return exec(`npx hardhat starknet-verify ${args.join(" ")}`, expectFailure); }; export const hardhatStarknetPluginVersion = () => { return exec("npx hardhat starknet-plugin-version"); }; export const hardhatStarknetBuild = (args: Array, expectFailure = false) => { return exec(`npx hardhat starknet-build ${args.join(" ")}`, expectFailure); }; ================================================ FILE: test/utils/scarb-utils.ts ================================================ import path from "path"; import { assertExistence, assertNotEmpty } from "./utils"; import { hardhatStarknetRun, hardhatStarknetTest } from "./cli-functions"; const DEFAULT_PACKAGE_NAME = "sample_package_name"; /** * Assert that artifacts of a project exist * @param projectName the name of the project */ export function scarbArtifactsAssertion( projectName: string, packageName = DEFAULT_PACKAGE_NAME, contractNames = ["FirstContract", "AnotherContract", "FibContract"], extensions = [".json", "_abi.json", ".casm"] ) { const projectPath = path.join("starknet-artifacts", projectName); for (const contractName of contractNames) { const compoundContractName = `${packageName}_${contractName}`; const contractDirPath = path.join(projectPath, `${compoundContractName}.cairo`); for (const extension of extensions) { const artifactPath = path.join(contractDirPath, `${compoundContractName}${extension}`); assertExistence(artifactPath); assertNotEmpty(artifactPath); } } } function assertDeclarable( packageName = DEFAULT_PACKAGE_NAME, contractNames = ["FirstContract", "AnotherContract"] ) { // attempt declaration for all contracts except FibContract for (const contractName of contractNames) { const compoundContractName = `${packageName}_${contractName}`; // the script requires the environment variable, but let's store it just in case const oldEnvVarValue = process.env.DECLARABLE_CONTRACT; process.env.DECLARABLE_CONTRACT = compoundContractName; try { hardhatStarknetRun(["scripts/declare.ts", "--no-compile"]); } finally { // restore process.env.DECLARABLE_CONTRACT = oldEnvVarValue; } } } /** * Asserts existence, non-emptiness, declarableness, interactivity of the contracts * from a project built by Scarb. * @param projectName the name of the built project */ export function scarbAssertions(projectName: string, packageName = DEFAULT_PACKAGE_NAME) { scarbArtifactsAssertion(projectName); assertDeclarable(packageName); // attempt full declare+deploy+call on FibContract // if it was declared earlier with the rest, this script would fail hardhatStarknetTest(["test/cairo1/fib-contract.test.ts", "--no-compile"]); } ================================================ FILE: test/utils/utils.ts ================================================ import axios from "axios"; import assert, { AssertionError } from "assert"; import { existsSync, rmSync, statSync } from "fs"; import path from "path"; import shell from "shelljs"; import { DEVNET_URL } from "../constants/constants"; export function exec(cmd: string) { const result = shell.exec(cmd); assertEqual(result.code, 0, `Command ${cmd} failed.\n${result.stderr}`); return result; } export function assertContains(output: string, pattern: string) { if (!output.includes(pattern)) { throw new AssertionError({ message: `Pattern not in input\nPattern: ${pattern}\nInput: ${output}` }); } } export function extractAddress(source: string, pattern: string) { // Replaces all line breaks with a space source = source.replace(/(\r\n|\n|\r)/gm, " "); // Take the first word in source after the pattern const res = source.split(pattern)[1].split(" ")[0]; return res; } export async function checkDevnetIsNotRunning(url = DEVNET_URL): Promise { try { const res = await axios.get(`${url}/is_alive`); throw new AssertionError({ message: `Devnet is running and responded with status ${res.status}` }); } catch (err) { console.log("Devnet is not running!"); } } export function ensureEnvVar(varName: string): string { if (!process.env[varName]) { throw new Error(`Env var ${varName} not set or empty`); } return process.env[varName] as string; } export function rmrfSync(path: string) { rmSync(path, { recursive: true, force: true }); } export function assertEqual(val1: unknown, val2: unknown, msg?: string) { assert.strictEqual(val1, val2, msg); } export function assertNotEqual(val1: unknown, val2: unknown, msg?: string) { assert.notEqual(val1, val2, msg); } export function assertExistence(path: string, expected = true) { if (existsSync(path) !== expected) { const message = `Expected ${path} to ${expected ? "" : "not "}exist`; throw new AssertionError({ message }); } } export function assertNotEmpty(path: string) { const stat = statSync(path); if (stat.size <= 0) { const message = `Size of ${path} expected to be > 0`; throw new AssertionError({ message }); } } export function assertCompilationArtifactsExist(artifactDir: string, contractName: string) { for (const suffix of [".json", ".casm", "_abi.json"]) { assertExistence(path.join(artifactDir, contractName + suffix)); } } export function assertGreater(value1: T, value2: T) { if (!(value1 > value2)) { const message = `${value1} expected to be greater than ${value2}`; throw new AssertionError({ message }); } } ================================================ FILE: test/venv-tests/with-venv/check.ts ================================================ import { hardhatStarknetCompileDeprecated, hardhatStarknetRun, hardhatStarknetTest } from "../../utils/cli-functions"; hardhatStarknetCompileDeprecated([]); // assert successful interaction with contracts on the file system hardhatStarknetTest(["test/contract-factory-creation.test.ts", "--no-compile"]); // assert successful interaction with the network hardhatStarknetRun(["scripts/deploy.ts", "--no-compile"]); ================================================ FILE: test/venv-tests/with-venv/hardhat.config.ts ================================================ import "@shardlabs/starknet-hardhat-plugin"; module.exports = { starknet: { venv: "../my-venv", network: process.env.NETWORK }, networks: { devnet: { url: "http://127.0.0.1:5050" } } }; ================================================ FILE: test/venv-tests/with-venv/network.json ================================================ { "$schema": "../../network.schema", "alphaGoerli2": true, "devnet": true } ================================================ FILE: test/venv-tests/with-venv-active/check.ts ================================================ import { hardhatStarknetCompileDeprecated, hardhatStarknetRun, hardhatStarknetTest } from "../../utils/cli-functions"; hardhatStarknetCompileDeprecated([]); // assert successful interaction with contracts on the file system hardhatStarknetTest(["test/contract-factory-creation.test.ts", "--no-compile"]); // assert successful interaction with the network hardhatStarknetRun(["scripts/deploy.ts", "--no-compile"]); ================================================ FILE: test/venv-tests/with-venv-active/hardhat.config.ts ================================================ import "@shardlabs/starknet-hardhat-plugin"; module.exports = { starknet: { venv: "active", network: process.env.NETWORK }, networks: { devnet: { url: "http://127.0.0.1:5050" } } }; ================================================ FILE: test/venv-tests/with-venv-active/network.json ================================================ { "$schema": "../../network.schema", "alphaGoerli2": true, "devnet": true } ================================================ FILE: tsconfig.json ================================================ { "compilerOptions": { "allowJs": true, "target": "es2020", "sourceMap": true, "esModuleInterop": true, "strict": true, "outDir": "dist", "resolveJsonModule": true, "strictNullChecks": false, "declaration": true, "module": "commonjs", "noImplicitOverride": true, "typeRoots": ["./node_modules/@types"] }, "include": ["./src", "config.json", "contract-artifacts/**/*.json"] } ================================================ FILE: www/.gitignore ================================================ # Dependencies /node_modules # Production /build # Generated files .docusaurus .cache-loader # Misc .DS_Store .env.local .env.development.local .env.test.local .env.production.local npm-debug.log* yarn-debug.log* yarn-error.log* ================================================ FILE: www/README.md ================================================ # Website This website is built using [Docusaurus 2](https://docusaurus.io/), a modern static website generator. ### Installation ``` $ npm ci ``` ### Local Development ``` $ npm start ``` This command starts a local development server and opens up a browser window. Most changes are reflected live without having to restart the server. ### Build ``` $ npm run build ``` This command generates static content into the `build` directory and can be served using any static contents hosting service. ### Deployment Using SSH: ``` $ USE_SSH=true npm run deploy ``` Not using SSH: ``` $ GIT_USER= npm run deploy ``` If you are using GitHub pages for hosting, this command is a convenient way to build the website and push to the `gh-pages` branch. ================================================ FILE: www/babel.config.js ================================================ module.exports = { presets: [require.resolve("@docusaurus/core/lib/babel/preset")] }; ================================================ FILE: www/blog/authors.yml ================================================ # No blog posts yet # Ref: https://docusaurus.io/docs/blog # Use this as template to add author metadata shramee: name: Shramee title: Contributor url: https://github.com/shramee image_url: https://github.com/shramee.png ================================================ FILE: www/docs/dev.md ================================================ # Contribute ## Set up development environment ### Clone the repository ``` $ git clone git@github.com:0xSpaceShard/starknet-hardhat-plugin.git $ cd starknet-hardhat-plugin ``` ### Install dependencies ``` $ npm ci ``` ### Compile ``` $ npm run build ``` ### Set up the example repository The `starknet-hardhat-example` repository is used to showcase and test this plugin's functionality. Set it up following [its readme](https://github.com/0xSpaceShard/starknet-hardhat-example#get-started), but after installing it, link it to use your local plugin repository: ``` $ cd $ npm link $ cd $ npm link @shardlabs/starknet-hardhat-plugin ``` If your IDE is reporting Typescript issues after compiling the plugin, you may want to restart the Typescript language server (e.g. in VS Code on Linux: Ctrl+Shift+P) ## Testing A test case is added by creating a directory in a subdirectory of a test group in the `test` directory. E.g. `declare-test` is a test case in the `general-tests` test group. A test case should contain: - a `check.ts` script which does the testing logic - a `network.json` file which specifies on which networks should the test case be run - a `hardhat.config.ts` file will be used The main testing script is `scripts/test.ts`. It iterates over the test cases the test group specified by the `TEST_SUBDIR` environment variable. ### Executing tests locally When running tests locally, you probably don't want to run the whole `test.sh` script as it may alter your development environment. However, you can run individual tests by: - positioning yourself in your example repository - configuring the `hardhat.config.ts` - executing the `check.ts` script (potentially modifying it to address path differences) To run all tests, you can use the `test-` scripts defined in `package.json`. For the tests to work, you may need to set the values from `config.json` as environment variables. You should also have the [`jq` CLI tool](https://stedolan.github.io/jq/) installed. ### Executing individual tests To run a specific test case in the test group you can pass in the name of directory inside test group. E.g. to run `declare-test` test case in `general-tests` test group, you can use the script `test-general-tests` and pass in the name of the test after a `--` like this, ```sh $ npm run test-general-tests -- declare-test ``` ### Executing individual tests with dockerized environnement If you are only running Devnet in dockerized mode, you don't need to install all the dev tools locally. With a properly set up `starknet-hardhat-example` (read more [here](#Set-up-the-example-repository)), you can position yourself in that repository and to execute the `declare-test` case of the `general-tests` group, you can run: ```sh $ npx ts-node STARKNET_HARDHAT_PLUGIN_PATH/test/general-tests/declare-test/check.ts ``` Using this command will use the starknet-hardhat-example hardhat.config.ts. You can make modifications to make it match the config file in the test directory `STARKNET_HARDHAT_PLUGIN_PATH/test/general-tests/declare-test/hardhat.config.ts` ### Running tests in dev mode To run tests locally with test-dev. This is designed to run same tests repeatedly while developing. ```sh $ npm run test-dev ``` ### Executing tests on CircleCI If you're a member of the organization and you do a push to origin, you trigger CI/CD workflow on CircleCI. Track the progress on [the dashboard](https://circleci.com/gh/0xSpaceShard/workflows/starknet-hardhat-plugin). Sometimes the tests fail because of internal CircleCI or Starknet issues; in that case, you can try restarting the workflow. Bear in mind that each workflow consumes credits. Track the spending [here](https://app.circleci.com/settings/plan/github/0xSpaceShard/overview). The whole workflow is defined in `.circleci/config.yml` - you may find it somewhat chaotic as it uses dependency caching (we kind of sacrificed config clarity for performance). Script `scripts/set-alpha-vars.sh` expects account information to be set through environment variables. These variables are defined in [spaceshard CircleCI context](https://app.circleci.com/settings/organization/github/0xSpaceShard/contexts/c36fa213-2511-465b-b303-0d35d76b42eb). If you upload a new account (with new keys), you cannot modify existing variables but have to delete old ones and create new ones. To skip running tests on CircleCI, add `[skip ci]` in the first 250 characters of the commit message. ### Testing network The script `test.sh` runs tests on Devnet and Testnet (alpha-goerli). To skip running tests on Testnet, add `[skip testnet]` to the commit message. ### Creating a PR When adding new functionality to the plugin, you will probably also have to create a PR to the `plugin` branch of `starknet-hardhat-example`. You can then modify the `test.sh` script to use your branch instead of the `plugin` branch. If your reviewer makes an observation that requires a fix, after you push the commit with the fix, find the commit link on the PR conversation page, and reply to the reviewer by providing that link. In [this example](https://github.com/0xSpaceShard/starknet-hardhat-plugin/pull/130#discussion_r913581807) the contributor even linked to the specific change of the commit - you don't have to do that if you made multiple smaller commits. When the PR is ready to be merged, do `Squash and merge` and delete the branch. ## Adapting to a new Starknet / cairo-lang version Since the plugin relies on [Devnet](https://github.com/0xSpaceShard/starknet-devnet) in its tests, first an adapted version of Devnet might need to be released. Current versions of Devnet and cairo-lang used in tests are specified in `config.json`. ### In cairo-cli repo When a new Starknet / cairo-lang version is released, a new `cairo-cli` Docker image can be released (probably without any adaptation). This is done through the CI/CD pipeline of [the cairo-cli-docker repository](https://github.com/0xSpaceShard/cairo-cli-docker#build-a-new-image). Likely places where the old version has to be replaced with the new version are `README.md` and `constants.ts`. ### In starknet-hardhat-example repo Change the version in `hardhat.config.ts`. Recompile the contracts (only important for local usage). ## Architecture ### Wrapper This plugin was created as a wrapper for Starknet CLI (tool installed with cairo-lang) along with some compilation and hashing utilities. E.g. running `hardhat starknet-compile-deprecated` in a shell would create a subprocess that uses the corresponding compilation utility, while running `contractFactory.deploy()` in a Hardhat JS/TS script would create a subprocess that executes Starknet CLI's `starknet deploy`. With the Starknet CLI deprecation for Starknet v0.13.0 the plugin's usages of the CLI core commands were replaced with near analogs utilizing `starknet.js`. For the earlier `contractFactory.deploy()` example the plugin no longer executes Starknet CLI's `starknet deploy` itself, instead it executes the equivalent HTTP requests that the CLI command would do internally. Two wrapper implementations are used that are defined in [starknet-wrapper.ts](https://github.com/0xSpaceShard/starknet-hardhat-plugin/blob/master/src/starknet-wrappers.ts). Both rely on a [proxy server](https://github.com/0xSpaceShard/starknet-hardhat-plugin/blob/master/src/starknet_cli_wrapper.py) that imports `main` methods of `starknet` and `starknet-compile-deprecated` and uses them to execute commands (this is a speedup since a subprocess importing the whole Starknet doesn't have to be spawned for each request). - Docker wrapper: - runs Starknet CLI in a Docker container - the default option - Venv wrapper: - for users that already have `cairo-lang` installed - faster than Docker wrapper - not necessarily true since Docker wrapper also started using a proxy server ### Accessing HardhatRuntimeEnvironment (hre) Before v0.7.0 we didn't know how to export classes to users, since every class needed to have access to `hre`, which was passed on in `extendEnvironment`. After introducing dynamic `hre` importing, exporting classes has become a possibility: ```typescript const hre = await import("hardhat"); ``` In `types/starknet.ts`, classes are specified using `typeof`, e.g. `OpenZeppelinAccount: typeof OpenZeppelinAccount`. However, exporting classes this way doesn't export their type. ## Version management When a push is done to the `master` branch and the version in `package.json` differs from the one published on `npm`, the release process is triggered. The updating of `package.json` doesn't have to be done directly, but can be done by running ``` $ npm version ``` `NEW_VERSION` can be anything documented [here](https://docs.npmjs.com/cli/v8/commands/npm-version), but will most commonly be `patch`. This will also update `package-lock.json`, create a new commit, and create a new git tag. You may want your version-bumping commit to contain the `[skip testnet]` string (documented [here](#testing-network)) to avoid testing on alpha-goerli (testing on testnet may postpone the version release significantly, if it will ever pass at all). If for whatever reason the publishing workflow in CI/CD cannot be executed, the version can be released manually via `scripts/npm-publish.sh`, just be sure to have an NPM access token and that you have the rights to publish. Apart from [npm](https://www.npmjs.com/package/@shardlabs/starknet-hardhat-plugin?activeTab=versions), releases are also tracked on [GitHub](https://github.com/0xSpaceShard/starknet-hardhat-plugin/releases) with [git tags](https://github.com/0xSpaceShard/starknet-hardhat-plugin/tags). Notice the prepended `v` in tag names. After the npm package is released and the tag is pushed with: ```bash $ git push origin ``` the release can be made public [on GitHub](https://github.com/0xSpaceShard/starknet-hardhat-plugin/releases/new). Automatic note generation can be used, augmented with usage and development changes (see past releases for reference). Users should be notified about the usage related changes. This can be done on Telegram, [Discord](https://discord.com/channels/793094838509764618/912735106899275856), [Shamans](https://community.starknet.io/t/starknet-hardhat-plugin/67) etc. ### Docs New documentation is **automatically** deployed after publishing a new version with `scripts/npm-publish.sh` (also part of CI/CD). To manually deploy new documentation, run: ```bash $ cd www $ npm ci $ npm run deploy ``` ### Example repo after a new version After releasing a new plugin version, the `plugin` branch of the example repo should be updated and pushed: - `package.json` should be updated by running `npm install --save-exact @shardlabs/starknet-hardhat-plugin@` - The `master` branch, which serves as reference to the users, should be synchronized with the `plugin` branch. This can probably be done by doing `git reset plugin` while on `master`. - Since you did `npm install`, you may need to link again, as described [initially](#set-up-the-example-repository). ================================================ FILE: www/docs/intro.md ================================================ # Starknet Hardhat Plugin [![npm package](https://img.shields.io/npm/v/@shardlabs/starknet-hardhat-plugin?color=blue)](https://www.npmjs.com/package/@shardlabs/starknet-hardhat-plugin) If you've used Hardhat 👷‍♀️👷‍♂️ and want to develop for Starknet starknet, this plugin might come in hand. If you've never set up a Hardhat project, check out [this guide](https://hardhat.org/tutorial/creating-a-new-hardhat-project.html). ## Contents - [Install](#install) - [CLI commands](#cli-commands) - [API](#api) - [Testing](#testing) - [Important notes](#important-notes) - [Examples](#test-examples) - [Devnet examples](#devnet-examples) - [Debugging contracts](#debugging-contracts) - [Configure the plugin](#configure-the-plugin) - [Account support](#account) - [More examples](#more-examples) - [Contribute](#contribute) ## Install ``` npm i @shardlabs/starknet-hardhat-plugin --save-dev ``` For the latest unstable version, use ``` npm i @shardlabs/starknet-hardhat-plugin@alpha --save-dev ``` Add the following line to the top of your `hardhat.config.ts` (or `hardhat.config.js`): ```typescript import "@shardlabs/starknet-hardhat-plugin"; // or require("@shardlabs/starknet-hardhat-plugin"); ``` ### Requirements This plugin was tested with: - Node.js v14.17.3 - npm/npx v7.19.1 - Docker v20.10.8 (optional): - Since plugin version 0.3.4, Docker is no longer necessary if you opt for a Python environment (more info in [Config](#cairo-0-compilation)). - If you opt for the containerized version, make sure you have a running Docker daemon. - If you're experiencing Docker access issues, check [this](https://stackoverflow.com/questions/52364905/after-executing-following-code-of-dockerode-npm-getting-error-connect-eacces-v). - Linux / macOS: - On Windows, we recommend using [WSL 2](https://learn.microsoft.com/en-us/windows/wsl/install) with Docker instance installed on [WSL 2](https://learn.microsoft.com/en-us/windows/wsl/install) instead of using Docker Desktop on your windows. Example installation for Ubuntu can be found [here](https://docs.docker.com/engine/install/ubuntu/). ## CLI commands This plugin defines the following Hardhat commands (also called tasks): ### `starknet-compile-deprecated` ``` $ npx hardhat starknet-compile-deprecated [PATH...] [--cairo-path "::..."] [--account-contract] [--disable-hint-validation] ``` Compiles Starknet Cairo 0 contracts. If no paths are provided, all Starknet contracts in the default contracts directory are compiled. Paths can be files and directories. `--cairo-path` allows specifying the locations of imported files, if necessary. Separate them with a colon (:), e.g. `--cairo-path='path/to/lib1:path/to/lib2'` `--account-contract` allows compiling an account contract. `--disable-hint-validation` allows compiling a contract without hint validation (any python code is allowed in hints, ex: print ...). ### `starknet-compile` ``` $ npx hardhat starknet-compile [PATH...] [--add-pythonic-hints] [--single-file] [--replace-ids] [--allowed-libfuncs-list-file] [--allowed-libfuncs-list-name] [--cairo1-bin-dir ] ``` Compiles Starknet Cairo 1 contracts in the provided path. Paths can be files and directories. Currently, contracts importing other contracts are not supported (until this is supported, you may try to use [Scarb](https://github.com/software-mansion/scarb) and modifying its artifacts to be compatible with this plugin). Custom local compiler can be specified by providing the path of the directory holding compiler binaries (`starknet-compile` and `starknet-sierra-compile`) to `--cairo1-bin-dir` or to the `cairo1BinDir` option in your config file. E.g. if your cairo compiler repository is in `/path/to/cairo` and you built the compiler with `cargo build --bin starknet-compile --bin starknet-sierra-compile --release`, the path would be `/path/to/cairo/target/release`. If neither `--cairo1-bin-dir` nor `cairo1BinDir` is set, the plugin will automatically download a compiler version it is adapted to. To download a specific version, set `compilerVersion` in `hardhat.config.ts` to a semver string matching one of the [official releases](https://github.com/starkware-libs/cairo/releases). ```typescript module.exports = { starknet: { // Only one of these properties can be specified. cairo1BinDir: "/path/to/cairo/target/release/", compilerVersion: "1.1.1" ... } ... }; ``` Other CLI options are the same as in the [native Cairo compiler](https://github.com/starkware-libs/cairo). To build more complex Cairo 1 projects, read about [`hardhat starknet-build`](#starknet-build). ### `starknet-build` ``` $ npx hardhat starknet-build [PATH...] [--scarb-command ] [--skip-validate] ``` Builds Scarb projects. Each of the provided paths is recursively looked into while searching for Scarb projects. If no paths are provided, the default contracts directory is traversed. Each project must be a valid Scarb project with lib.cairo and Scarb.toml in its root. The toml file must have `sierra` and `casm` set to `true` under `[[target.starknet-contract]]`. If you know what you are doing, you can skip the validation by providing `--skip-validate`. In code, load the generated contracts with an underscore-separated string: ```typescript starknet.getContractFactory("_"); ``` E.g. if your toml specifies `name = MyPackage` and there is a contract called FooContract in your source files, you would load it with: ```typescript // alternatively prepend the directory name to avoid ambiguity, but be sure to apply the underscore syntax starknet.getContractFactory("MyPackage_FooContract"); ``` The name of the file where the contract was defined doesn't play a role. The plugin doesn't have a default Scarb command yet. You need to provide a `scarbCommand` (either an exact command or the path to it) under `starknet` in your hardhat config file, or you can override that via `--scarb-command `. ### `starknet-verify` ``` $ npx hardhat starknet-verify [--starknet-network ] [--path ] [ ...] [--address ] [--compiler-version ] [--license ] [--contract-name ] [--account-contract] ``` Queries [Voyager](https://voyager.online/) to [verify the contract](https://voyager.online/verifyContract) deployed at `` using the source files at `` and any number of ``. Like in the previous command, this plugin relies on `--starknet-network`, but will default to 'alphaGoerli' network in case this parameter is not passed. The verifier expects `` to be passed on request. Supported compiler versions are listed [here](https://voyager.online/verifyContract) in the dropdown menu. We pass `--account-contract` to tell the verifier that the contract is of type account. For `` the command takes [_No License (None)_](https://github.com/github/choosealicense.com/blob/a40ef42140d137770161addf4fefc715709d8ccd/no-permission.md) as default license scheme. [Here](https://goerli.voyager.online/cairo-licenses) is a list of available options. ### `starknet-plugin-version` ``` $ npx hardhat starknet-plugin-version ``` Prints the version of the plugin. ### `run` Using `--starknet-network` with `hardhat run` currently does not have effect. Use the `network` property of the `starknet` object in your hardhat config file. ### `amarna` ```sh $ npx hardhat amarna ``` Runs [Amarna](https://github.com/crytic/amarna), the static-analyzer and linter for Cairo, in a Docker container. The output from amarna goes in `out.sarif` file. Use flag `--script` to run custom `./amarna.sh` file to use Amarna with custom rules and args. You need to have Docker installed and running to use `hardhat amarna`. ### `test` Introduces the `--starknet-network` option to the existing `hardhat test` task. ## API Adding this plugin to your project expands Hardhat's runtime with a `starknet` object. It can be imported with: ```typescript import { starknet } from "hardhat"; // or const starknet = require("hardhat").starknet; ``` To see all the utilities introduced by the `starknet` object, check [this](https://github.com/0xSpaceShard/starknet-hardhat-plugin/blob/master/src/types/starknet.ts) out. ## Testing Relying on the above described API makes it easier to interact with your contracts and test them. To test Starknet contracts with Mocha, use the regular Hardhat `test` task which expects test files in your designated test directory: ``` $ npx hardhat test ``` Read more about the network used in tests in the [Runtime network](#runtime-network) section. These examples are inspired by the official [Starknet Python tutorial](https://www.cairo-lang.org/docs/hello_starknet/unit_tests.html). ### Important notes - `BigInt` is used because `felt` may be too big for javascript. Use it like `BigInt("10")` or, since ES2020, like `10n`. - All function names, argument names and return value names should be referred to by the names specified in contract source files. - The argument of `getContractFactory` is the **name** or the **path** of the source of the target contract: - if providing a path, it should be relative to the project root or the contracts directory: - `getContractFactory("contracts/subdir/MyContract.cairo")` - `getContractFactory("subdir/MyContract.cairo")` - the extension can be omitted: - `getContractFactory("subdir/MyContract")` - `getContractFactory("MyContract")` - Nested arrays are currently not supported (eg. `core::array::Array::>`) ### Test examples #### Setup ```typescript import { expect } from "chai"; import { starknet } from "hardhat"; // or const expect = require("chai").expect; const starknet = require("hardhat").starknet; describe("My Test", function () { this.timeout(...); // Recommended to use a big value if interacting with Alpha Goerli ``` #### Deploy / load contract ```typescript /** * Assumes there is a file MyContract.cairo whose compilation artifacts have been generated. * The contract is assumed to have: * - constructor function constructor(initial_balance: felt) * - external function increase_balance(amount: felt) -> (res: felt) * - view function get_balance() -> (res: felt) */ it("should load a previously deployed contract", async function () { const contractFactory = await starknet.getContractFactory("MyContract"); const contract = contractFactory.getContractAt("0x123..."); // address of a previously deployed contract }); it("should declare class and deploy", async function() { // not compatible with accounts deployed with Starknet CLI const account = await starknet.OpenZeppelinAccount.getAccountFromAddress(...); const contractFactory = await starknet.getContractFactory("MyContract"); // will call declare version 2 if contract is cairo 1 const txHash = await account.declare(contractFactory); // class declaration const classHash = await contractFactory.getClassHash(); const constructorArgs = { initial_balance: 0 }; const options = { maxFee: ... }; // implicitly invokes UDC const contract = await account.deploy(contractFactory, constructorArgs, options); }); ``` #### Arrays ```typescript /** * The contract is assumed to have: * - view function sum_array(a_len: felt, a: felt*) -> (res: felt) */ it("should work with arrays", async function () { const contract = ...; // you don't have to specify the array length separately const { res } = await contract.call("sum_array", { a: [1, 2, 3] }); expect(res).to.deep.equal(BigInt(6)); }); ``` #### Tuples ```typescript /** * The contract is assumed to have: * - view function sum_pair(pair: (felt, felt)) -> (res : felt) * - view func sum_named_pair(pair : (x : felt, y : felt) -> (res : felt) * - using PairAlias = (x : felt, y : felt) * - view func sum_type_alias(pair : PairAlias) -> (res : felt) */ it("should work with tuples", async function () { const contract = ...; // notice how the pair tuple is passed as javascript array const { res } = await contract.call("sum_pair", { pair: [10, 20] }); ... = await contract.call("sum_named_pair", { pair: { x: 10, y: 20 } }); ... = await contract.call("sum_type_alias", { pair: { x: 10, y: 20 } }); expect(res).to.deep.equal(BigInt(30)); }); ``` #### Fee estimation ```typescript it("should estimate fee", async function () { const account = await starknet.OpenZeppelinAccount.createAccount({ salt: "0x42", privateKey: OZ_ACCOUNT_PRIVATE_KEY }); const estimatedFee = await account.estimateDeployAccountFee(); await account.deployAccount(); // computes max fee implicitly // Every fee estimation returns an object with gas information const contractFactory = await starknet.getContractFactory("contract"); const declareFee = await account.estimateDeclareFee(contractFactory); await account.declare(contractFactory); // computes max fee implicitly const deployFee = await account.estimateDeployFee(contractFactory); const contract = await account.deploy(contractFactory); // computes max fee implicitly const invokeFee = await account.estimateFee(contract, "method", { arg1: 10n }); await account.invoke(contract, "method", { arg1: 10n }); // computes max fee implicitly // computes message estimate fee const estimatedMessageFee = await l2contract.estimateMessageFee("deposit", { from_address: L1_CONTRACT_ADDRESS, amount: 123, user: 1 }); }); ``` #### Delegate Proxy ```typescript it("should forward to the implementation contract", async function () { const implementationFactory = await starknet.getContractFactory("contract"); const account = ...; const txHash = await account.declare(implementationFactory); const implementationClassHash = await implementationFactory.getClassHash(); const proxyFactory = await starknet.getContractFactory("delegate_proxy"); await account.declare(proxyFactory); const proxy = await account.deploy(proxyFactory, { implementation_hash_: implementationClassHash }); proxy.setImplementation(implementationFactory); const { res: initialProxyBalance } = await proxy.call("get_balance"); }); ``` #### Transaction information and receipt with events ```typescript it("should return transaction data and transaction receipt", async function () { const contract: StarknetContract = ...; console.log("Deployment transaction hash:", contract.deployTxHash); const transaction = await starknet.getTransaction(contract.deployTxHash); console.log(transaction); const account = ...; const txHash = await account.invoke(contract, "increase_balance", { amount: 10 }); const receipt = await starknet.getTransactionReceipt(txHash); const decodedEvents = contract.decodeEvents(receipt.events); const txTrace = await starknet.getTransactionTrace(txHash); // decodedEvents contains hex data array converted to a structured object // { name: "increase_balance_called", data: { current_balance: 0n, amount: 10n } } }); ``` For more usage examples, including tuple, array and struct support check [sample-test.ts](https://github.com/0xSpaceShard/starknet-hardhat-example/blob/master/test/sample-test.ts) of [starknet-hardhat-example](https://github.com/0xSpaceShard/starknet-hardhat-example). ### Devnet examples #### L1-L2 communication (Postman message exchange with Devnet) Exchanging messages between L1 ([Ganache](https://www.npmjs.com/package/ganache), [Hardhat node](https://hardhat.org/hardhat-network/#running-stand-alone-in-order-to-support-wallets-and-other-software), Ethereum testnet) and L2 (only supported for [starknet-devnet](https://github.com/0xSpaceShard/starknet-devnet)) can be done using this plugin: - Ensure there is an available L1 network and that you know its RPC endpoint URL. - Load an L1 Messaging contract using `starknet.devnet.loadL1MessagingContract`. - Call `starknet.devnet.flush` after you `invoke` your contract and want to propagate your message. - When running a hardhat test or script which relies on `network["config"]`, specify the name of an L1 network you defined in `hardhat.config`. Use `npx hardhat test --network `. Network `localhost` is predefined in hardhat so `--network localhost` should work if you're using e.g. `npx hardhat node` as the L1 network. - Check [this example](https://github.com/0xSpaceShard/starknet-hardhat-example/blob/master/test/postman.test.ts#L98) for more info. ```typescript it("should exchange messages with Devnet", async function() { await starknet.devnet.loadL1MessagingContract(...); // Exact syntax may vary depending on your L1 contract interaction library const l1contract = ...; const l2contract = ...; // If the L1 function is expected to send a message to L2, // it needs to be paid for by providing some value to the transaction await l1contract.send(..., { value: 1000 // pay for L1->L2 message }); await starknet.devnet.flush(); const account = ...; await account.invoke(l2contract, ...); await starknet.devnet.flush(); }); ``` #### Mock message between L1 and L2 To send mock messages between L1 and L2 the following two functions can be used. Detailed example can be found [here](https://github.com/0xSpaceShard/starknet-hardhat-example/blob/master/test/postman.test.ts#170). ```typescript starknet.devnet.sendMessageToL2(...); // Sends message to L2 starknet.devnet.consumeMessageFromL2(...); // Sends message from L2 to L1 ``` #### Restart Devnet can be restarted by calling `starknet.devnet.restart()`. All of the deployed contracts, blocks and storage updates will be restarted to the empty state. ```typescript await starknet.devnet.restart(); ``` #### Dumping Use `starknet.devnet.dump()` to maintain the Devnet instance from the plugin. ```typescript await starknet.devnet.dump(path); // path to dump file (eg. dump.pkl) ``` #### Loading Dumped Devnet instance can be loaded using `starknet.devnet.load()`. ```typescript await starknet.devnet.load(path); // path for dump file (eg. dump.pkl) ``` #### Advancing time The plugin comes with support for [Devnet's timestamp management](https://0xspaceshard.github.io/starknet-devnet/docs/guide/advancing-time). The time offset for each generated block can be increased by calling `starknet.devnet.increaseTime()`. The time for the next block can be set by calling `starknet.devnet.setTime()`, with subsequent blocks keeping the set offset. Warning: _block time can be set in the past and lead to unexpected behaviour!_ ```typescript await starknet.devnet.setTime(1000); // time in seconds await starknet.devnet.increaseTime(1000); // time in seconds ``` #### Creating an empty block Devnet offers [empty block creation](https://0xspaceshard.github.io/starknet-devnet/docs/guide/blocks#create-an-empty-block). It can be useful to make available those changes that take effect with the next block. ```typescript const emptyBlock = await starknet.devnet.createBlock(); ``` #### Mint tokens to an account Devnet allows [minting token](https://0xspaceshard.github.io/starknet-devnet/docs/guide/mint-token#mint-with-a-transaction). You can call `starknet.devnet.mint` like this ```typescript const lite_mode = true; // Optional, Default true await starknet.devnet.mint(account_address, 2e12, lite_mode); ``` ## Debugging contracts To debug Starknet contracts, you can use `print()` in cairo hints in your contract, and the printed lines will appear in Devnet's log. Compile with `--disable-hint-validation` flag to allow hints. ``` hardhat starknet-compile-deprecated --disable-hint-validation ``` For example, when calling the following `increase_balance` with input `25`. ```cairo @external func increase_balance{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr}( amount: felt ) { let (res) = balance.read(); %{ print( "Adding balance..." ) %} %{ print( ids.res ) %} balance.write(res + amount); let (afterUpdate) = balance.read(); %{ print( ids.afterUpdate ) %} return (); } ``` Devnet logs look like this, ``` Adding balance... 0 25 ``` If you want to have your debug lines printed in the same terminal as your hardhat script/test, use `integrated-devnet` with `stdout` set to `"STDOUT"` as documented in [runtime network](#runtime-network---integrated-devnet) section. ## Configure the plugin Specify custom configuration by editing your project's `hardhat.config.ts` (or `hardhat.config.js`). ### Cairo 0 compilation Cairo 0 compilation is by default done using the latest stable Dockerized compiler. If you want to use an older Cairo 0 compiler, specify the full semver string ([available versions](https://hub.docker.com/r/shardlabs/cairo-cli/tags)): ```javascript module.exports = { starknet: { // Docker image tailored to the machine is pulled. If not applied, the `-arm` suffix is applied to the version name if on an arm64 machine. dockerizedVersion: "0.11.2" } ... }; ``` If you cannot use Docker (e.g. on Mac), you'll need to have the `cairo-lang` Python package installed locally and `python3` command runnable. Use one of the following: ```typescript module.exports = { starknet: { // venv: "active" <- for the active virtual environment or global environment // venv: "path/to/my-venv" <- for env created with e.g. `python -m venv path/to/my-venv` // Python virtual environment can be created with: pyenv, poetry, conda, miniconda, ... venv: "" } }; ``` ### Building Cairo 1 projects This plugin comes with a Scarb wrapper. Read about how to use it in [this section](#starknet-build). If not via CLI, you may specify the Scarb command via: ```typescript module.exports = { starknet: { scarbCommand: "scarb" // or alternatively an exact path to the desired command } }; ``` ### Request Timeout Default requestTimeout is 30s. It can be changed using the following configuration. You may need to increase the timeout value in some situation (declaring large smart contract). ```typescript module.exports = { starknet: { requestTimeout: 90_000 // 90s } }; ``` ### Paths Prefer providing absolute paths when using the plugin. If a relative path is provided, it will be resolved relative to the root of the project. ```typescript module.exports = { paths: { // Defaults to "contracts" (the same as `paths.sources`). starknetSources: "my-own-starknet-path", // Defaults to "starknet-artifacts". // Has to be different from the value set in `paths.artifacts` (which is used by core Hardhat and has a default value of `artifacts`). starknetArtifacts: "also-my-own-starknet-path", // Same purpose as the `--cairo-path` argument of the `starknet-compile-deprecated` command // Allows specifying the locations of imported files, if necessary. cairoPaths: ["my/own/cairo-path1", "also/my/own/cairo-path2"] } ... }; ``` ### Runtime network To set the network used in your Hardhat scripts/tests, use `starknet["network"]` or the `--starknet-network` CLI option. Not specifying one will default to using alpha-goerli. Do not confuse this network with Hardhat's default `--network` option which refers to the L1 network. A faster approach is to use [starknet-devnet](https://github.com/0xSpaceShard/starknet-devnet), a Ganache-like local testnet. ```javascript module.exports = { starknet: { network: "myNetwork" }, networks: { devnet: { // this way you can also specify it with `--starknet-network devnet` url: "http://127.0.0.1:5050" } } ... }; ``` Predefined networks include `alpha-goerli`, `alpha-goerli2`, `alpha-mainnet` and `integrated-devnet`. ### Runtime network - Integrated Devnet [starknet-devnet](https://github.com/0xSpaceShard/starknet-devnet) is available out of the box as a starknet network called `integrated-devnet`. By default, it will spawn Devnet using its Docker image and listening on `http://127.0.0.1:5050`. Target it via the hardhat config file or `--starknet-network integrated-devnet`. Using `integrated-devnet` makes [forking of existing blockchains](https://0xspaceshard.github.io/starknet-devnet/docs/guide/fork/) very easy. By defining/modifying `networks["integratedDevnet"]` in your hardhat config file, you can specify: - the version of dockerized Devnet to use - a Python environment with installed starknet-devnet (can be active environment); this will avoid using the dockerized version - CLI arguments to be used on Devnet startup: [options](https://0xspaceshard.github.io/starknet-devnet/docs/guide/run) - where output should be flushed _(either to the terminal or to a file)_. #### Dockerized Integrated Devnet Dockerized integrated-devnet is the default mode, but can be specified via the `dockerizedVersion` property of `integratedDevnet`: - the full image can be provided: - `shardlabs/starknet-devnet:` (Pythonic Devnet) - [Docker image info](https://0xspaceshard.github.io/starknet-devnet/docs/guide/run/#run-with-docker) - `shardlabs/starknet-devnet-rs:` (Rust Devnet) - [Docker image info](https://github.com/0xSpaceShard/starknet-devnet-rs#run-with-docker) - if just `` is provided, it defaults to Pythonic Devnet #### Integrated Devnet config example ```javascript module.exports = { starknet: { network: "integrated-devnet" }, networks: { integratedDevnet: { url: "http://127.0.0.1:5050", // venv: "active" <- for the active virtual environment with installed starknet-devnet // venv: "path/to/venv" <- for env with installed starknet-devnet (created with e.g. `python -m venv path/to/venv`) venv: "", // This section covers the VM selection in Pythonic Devnet (starknet-devnet): Python VM or Rust VM // This is distinct from selecting between Pythonic Devnet and Rust Devnet, which can be done via `dockerizedVersion` // vmLang: "python" <- use python vm (default value) // vmLang: "rust" <- use rust vm // (rust vm is available out of the box using dockerized integrated-devnet) // (rustc and cairo-rs-py required using installed devnet) // read more here : https://0xspaceshard.github.io/starknet-devnet/docs/guide/run/#run-with-the-rust-implementation-of-cairo-vm vmLang: "", // or use dockerized Devnet by specifying [IMAGE:] (if IMAGE omitted - defaults to "shardlabs/starknet-devnet") dockerizedVersion: "", // dockerizedVersion: "shardlabs/starknet-devnet:", // dockerizedVersion: "shardlabs/starknet-devnet-rs:", // optional devnet CLI arguments, read more here: https://0xspaceshard.github.io/starknet-devnet/docs/guide/run args: ["--gas-price", "2000000000", "--fork-network", "alpha-goerli"], // stdout: "logs/stdout.log" <- dumps stdout to the file stdout: "STDOUT", // <- logs stdout to the terminal // stderr: "logs/stderr.log" <- dumps stderr to the file stderr: "STDERR" // <- logs stderr to the terminal } } ... }; ``` ### Installing third-party libraries If you want to install a third-party Cairo library and be able to import it in your Cairo files, use the following pattern: #### With npm packages: 1. Install (example package: `influenceth__cairo_math_64x61@npm:@influenceth/cairo-math-64x61`) ``` npm install --save-dev influenceth__cairo_math_64x61@npm:@influenceth/cairo-math-64x61 ``` 2. Edit the `paths.cairoPaths` section of your `hardhat.config` file ([docs](#paths)): ```typescript paths: { cairoPaths: ["./node_modules"]; } ``` 3. Import ``` from influenceth__cairo_math_64x61.contracts.Math64x61 import Math64x61_ONE, Math64x61_mul ``` #### With pip packages: 1. Install (example package: `openzeppelin-cairo-contracts`) ``` pip install openzeppelin-cairo-contracts ``` 2. If you are installing in a virtual environment, edit the `paths.cairoPaths` section of your `hardhat.config` file ([docs](#paths)) as: ```typescript paths: { // this directory contains the openzeppelin directory cairoPaths: ["path/to/cairo_venv/lib/python3.9/site-packages"], } ``` 3. Import ``` from openzeppelin.token.erc20.library import ERC20 ``` #### With non-npm git repositories: If you want to install directly from a git repo that doesn't contain `package.json`, you cannot use `npm i`. However, `yarn` supports this. 1. Install (example package: `https://github.com/OpenZeppelin/cairo-contracts`) ``` yarn add openzeppelin__cairo_contracts@git+https://git@github.com/OpenZeppelin/cairo-contracts.git ``` ### Using `starknet.getContractFactory` with third-party libraries This paragraph assumes you've read and run [3rd party library installation](#Installing-third-party-libraries). The example package used is `https://github.com/OpenZeppelin/cairo-contracts` so you may want to check [non-npm git repos](#With-non-npm-git-repositories). 1. Compile ``` $ npx hardhat starknet-compile-deprecated node_modules/openzeppelin__cairo_contracts/src/openzeppelin/token/erc20/presets/ERC20.cairo ``` 2. Get contract factory ```typescript const contractFactory = await starknet.getContractFactory( "node_modules/openzeppelin__cairo_contracts/src/openzeppelin/token/erc20/presets/ERC20" ); ``` ## Recompilation Recompilation is performed when contracts are updated or when artifacts are missing. A file will be created with the name `cairo-files-cache.json` to handle caching. Recompilation is handled before the following [CLI commands](#cli-commands) are executed. This feature is **only** guaranteed to work with Cairo 0 contracts. - `npx hardhat run` - `npx hardhat test` This feature is turned off by default and is specified in the `hardhat.config.ts` file. ```typescript module.exports = { starknet: { recompile: true // <- to switch recompilation on } }; ``` ## Account In Starknet, an account is a contract through which you interact with other contracts. Its usage is exemplified [earlier in the docs](#accounts) and [in the example repo](https://github.com/0xSpaceShard/starknet-hardhat-example/blob/plugin/test/oz-account-test.ts). There are several Starknet account implementations; this plugin supports the following as properties of `hre.starknet`: - `OpenZeppelinAccount` - [v0.5.1](https://github.com/OpenZeppelin/cairo-contracts/releases/tag/v0.5.1) - `ArgentAccount` - Commit [780760e](https://github.com/argentlabs/argent-contracts-starknet/tree/780760e4156afe592bb1feff7e769cf279ae9831) of branch develop. ### Create account ```typescript import { starknet } from "hardhat"; const account = await starknet.OpenZeppelinAccount.createAccount(); const accountFromOptions = await starknet.OpenZeppelinAccount.createAccount({ salt: "0x123", // salt to always deploy to an expected address privateKey: process.env.MY_KEY // the key only known to you, the public key will be inferred }); console.log(account.address); ``` ### Fund account After creating the account, you need to fund it (give it some ETH): - On alpha-goerli use [this faucet](https://faucet.goerli.starknet.io/). - On alpha-goerli2 use [this](https://www.newton.so/view/636d020159c30b8efc8d1d86) - On starknet-devnet call [`starknet.devnet.mint()`](#mint-tokens-to-an-account) which uses [devnet faucet](https://0xspaceshard.github.io/starknet-devnet/docs/guide/mint-token/). - Alternatively transfer some amount from an already funded account to the newly deployed account. If you're facing issues loading the account you've just funded, check out [this issue](https://github.com/0xSpaceShard/starknet-hardhat-plugin/issues/281#issuecomment-1354588817). ### Get balance To find out the balance of your account on the current Starknet network, you can use `starknet.getBalance`: ```typescript import { starknet } from "hardhat"; const someBalance = starknet.getBalance("0x123...def") const myAccount = ...; const myAccountBalance = starknet.getBalance(myAccount.address); ``` ### Deploy account After funding the account, you need to deploy it (in case of `ArgentAccount`, this will also take care of initialization): ```typescript await account.deployAccount({ maxFee: ... }); ``` Alternatively deploy your account by running [this script](https://github.com/0xSpaceShard/starknet-hardhat-example/blob/master/scripts/deploy-account.ts). To successfully deploy `ArgentAccount`, the chain you are interacting with is expected to have `ArgentAccount` contracts declared. Alpha Goerli and Alpha Mainnet satisfy this criterion, but if you're working with Devnet, this is most easily achievable by running Devnet [forked](https://0xspaceshard.github.io/starknet-devnet/docs/guide/fork) from e.g. Alpha Goerli. ### Reuse account To retrieve an already deployed Account, use the `getAccountFromAddress` method. Do not use this method for accounts deployed by e.g. Starknet CLI (those are modified OZ accounts that are not compatible with the OZ version supported by this plugin). What may be especially useful are [predeployed+predefined accounts](https://0xspaceshard.github.io/starknet-devnet/docs/guide/Predeployed-accounts) that come with Devnet (retrieve them with `starknet.devnet.getPredeployedAccounts()`). ```typescript const account = await starknet.OpenZeppelinAccount.getAccountFromAddress( accountAddress, process.env.PRIVATE_KEY ); ``` ### Interact through account Use the `invoke` method of `Account` to invoke (change the state), but `call` method of `StarknetContract` to call (read the state). ```typescript await account.invoke(contract, "increase_balance", { amount }); const { res: amount } = await contract.call("get_balance"); ``` Once your account is funded and deployed, you can specify a max fee greater than zero: ```typescript await account.invoke(contract, "foo", { arg1: ... }, { maxFee: BigInt(...) }); ``` If you don't specify a `maxFee`, one will be calculated for you by applying an overhead of 50% to the result of fee estimation. You can also customize the overhead by providing a value for `overhead`: ```typescript // maxFee will be 40% of estimated fee; if overhead not provided, the default value is used. await account.invoke(contract, "foo", { arg1: ... }, { overhead: 0.4 }); ``` Set the `rawInput` option to `true` to suppress validation of the args passed to the contract function: ```typescript // pass a direct array await account.invoke(contract, "foo", ["10", "20"], { rawInput: true }); await contract.call("bar", ["30", "40"], { rawInput: true }); ``` ### Multicalls You can also use the Account object to perform multi{invokes, fee estimations}. ```typescript const interactionArray = [ { toContract: contract1, functionName: "increase_balance", calldata: { amount: 10n } }, { toContract: contract2, functionName: "increase_balance", calldata: { amount: 20n } } ]; const fee = await account.multiEstimateFee(interactionArray); const txHash = await account.multiInvoke(interactionArray); ``` ### Guardian Unlike OpenZeppelin account, Argent account offers [guardian functionality](https://support.argent.xyz/hc/en-us/articles/360022631992-About-guardians). The guardian is by default not set (the guardian key is undefined), but if you want to change it, cast the `account` to `ArgentAccount` and execute `setGuardian`. ```typescript await argentAccount.setGuardian(process.env.GUARDIAN_PRIVATE_KEY, { maxFee: 1e18 }); // to unset it, use an undefined key await argentAccount.setGuardian(undefined, { maxFee: 1e18 }); ``` ## More examples An example Hardhat project using this plugin can be found [here](https://github.com/0xSpaceShard/starknet-hardhat-example). ================================================ FILE: www/docusaurus.config.js ================================================ // @ts-check // Note: type annotations allow type checking and IDEs autocompletion const lightCodeTheme = require("prism-react-renderer/themes/github"); const darkCodeTheme = require("prism-react-renderer/themes/dracula"); /** @type {import('@docusaurus/types').Config} */ const config = { title: "Starknet Hardhat Plugin", tagline: "A plugin for integrating Starknet tools into Hardhat projects", url: "https://0xspaceshard.github.io", // baseUrl: "/", baseUrl: "/starknet-hardhat-plugin/", onBrokenLinks: "throw", onBrokenMarkdownLinks: "warn", favicon: "img/logo.svg", // GitHub pages deployment config. // If you aren't using GitHub pages, you don't need these. organizationName: "0xSpaceShard", // Usually your GitHub org/user name. projectName: "starknet-hardhat-plugin", // Usually your repo name. // Even if you don't use internalization, you can use this field to set useful // metadata like html lang. For example, if your site is Chinese, you may want // to replace "en" with "zh-Hans". i18n: { defaultLocale: "en", locales: ["en"] }, presets: [ [ "classic", /** @type {import('@docusaurus/preset-classic').Options} */ ({ docs: { sidebarPath: require.resolve("./sidebars.js"), editUrl: "https://github.com/0xSpaceShard/starknet-hardhat-plugin/tree/master/docs" }, blog: { showReadingTime: true, // Please change this to your repo. // Remove this to remove the "edit this page" links. editUrl: "https://github.com/0xSpaceShard/starknet-hardhat-plugin/tree/master/docs" }, theme: { customCss: require.resolve("./src/css/custom.css") } }) ] ], themeConfig: /** @type {import('@docusaurus/preset-classic').ThemeConfig} */ ({ navbar: { title: "Starknet Hardhat Plugin", logo: { alt: "Starknet Hardhat Plugin Logo", src: "img/logo.svg" }, items: [ { type: "doc", docId: "intro", position: "left", label: "Intro" }, { type: "doc", docId: "dev", position: "left", label: "Dev" }, { href: "https://github.com/0xSpaceShard/starknet-hardhat-plugin", label: "GitHub", position: "right" } ] }, footer: { style: "dark", links: [ { title: "Docs", items: [ { label: "Intro", to: "/docs/intro" }, { label: "Starknet Hardhat example", href: "https://github.com/0xSpaceShard/starknet-hardhat-example" } ] }, { title: "Community", items: [ { label: "Twitter", href: "https://twitter.com/0xSpaceShard" } ] }, { title: "More", items: [ { label: "GitHub", href: "https://github.com/0xSpaceShard/starknet-hardhat-plugin" } ] } ], copyright: `Copyright © ${new Date().getFullYear()} SpaceShard` }, prism: { theme: lightCodeTheme, darkTheme: darkCodeTheme } }) }; module.exports = config; ================================================ FILE: www/package.json ================================================ { "name": "docusaurus", "version": "0.0.0", "private": true, "scripts": { "docusaurus": "docusaurus", "start": "docusaurus start", "build": "docusaurus build", "swizzle": "docusaurus swizzle", "deploy": "docusaurus deploy", "clear": "docusaurus clear", "serve": "docusaurus serve", "write-translations": "docusaurus write-translations", "write-heading-ids": "docusaurus write-heading-ids" }, "dependencies": { "@docusaurus/core": "2.2.0", "@docusaurus/preset-classic": "2.2.0", "@mdx-js/react": "^1.6.22", "clsx": "^1.2.1", "prism-react-renderer": "^1.3.5", "react": "^17.0.2", "react-dom": "^17.0.2" }, "devDependencies": { "@docusaurus/module-type-aliases": "2.2.0" }, "browserslist": { "production": [ ">0.5%", "not dead", "not op_mini all" ], "development": [ "last 1 chrome version", "last 1 firefox version", "last 1 safari version" ] }, "engines": { "node": ">=16.14" } } ================================================ FILE: www/sidebars.js ================================================ /** * Creating a sidebar enables you to: - create an ordered group of docs - render a sidebar for each doc of that group - provide next/previous navigation The sidebars can be generated from the filesystem, or explicitly defined here. Create as many sidebars as you want. */ // @ts-check /** @type {import('@docusaurus/plugin-content-docs').SidebarsConfig} */ const sidebars = { // By default, Docusaurus generates a sidebar from the docs folder structure // tutorialSidebar: [{ type: "autogenerated", dirName: "." }] // But you can create a sidebar manually /* tutorialSidebar: [ 'intro', 'hello', { type: 'category', label: 'Tutorial', items: ['tutorial-basics/create-a-document'], }, ], */ }; module.exports = sidebars; ================================================ FILE: www/src/components/HomepageFeatures/index.js ================================================ import React from "react"; import clsx from "clsx"; import styles from "./styles.module.css"; const FeatureList = [ { title: "Test with JavaScript", Svg: require("@site/static/img/undraw_test.svg").default, description: ( <> Write your tests in JS. Example,
{"contract.call('entrypoint', {... });"}
) }, { title: "Test composability", Svg: require("@site/static/img/undraw_composability.svg").default, description: ( <> Declare, deploy with construtor args and call to test systems composed of multiple smart contracts. ) }, { title: "JavaScript/TypeScript", Svg: require("@site/static/img/undraw_at_home.svg").default, description: ( <> Convenience of JS/TS and Hardhat. Check out{" "} Setting up a Hardhat project . ) } ]; function Feature({ Svg, title, description }) { return (

{title}

{description}

); } export default function HomepageFeatures() { return (
{FeatureList.map((props, idx) => ( ))}
); } ================================================ FILE: www/src/components/HomepageFeatures/styles.module.css ================================================ .features { display: flex; align-items: center; padding: 2rem 0; width: 100%; } .featureSvg { height: 200px; width: 200px; } ================================================ FILE: www/src/css/custom.css ================================================ /** * Any CSS included here will be global. The classic template * bundles Infima by default. Infima is a CSS framework designed to * work well for content-centric websites. */ /* You can override the default Infima variables here. */ :root { --ifm-color-custom-yellow: #cd9801; --ifm-color-custom-blue: #29296e; --ifm-color-primary: #29296e; --ifm-color-primary-dark: #252563; --ifm-color-primary-darker: #23235e; --ifm-color-primary-darkest: #1d1d4d; --ifm-color-primary-light: #2d2d79; --ifm-color-primary-lighter: #2f2f7f; --ifm-color-primary-lightest: #35358f; /* --bg-circle-color: #cd9801; */ --ifm-code-font-size: 95%; --docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.1); --ifm-footer-background-color: var(--ifm-color-primary-lightest); } /* For readability concerns, you should choose a lighter palette in dark mode. */ [data-theme="dark"] { --ifm-color-primary: #cd9801; --ifm-color-primary-dark: #c39001; --ifm-color-primary-darker: #b98901; --ifm-color-primary-darkest: #aa7e01; --ifm-color-primary-light: #e2a701; --ifm-color-primary-lighter: #ecaf01; --ifm-color-primary-lightest: #fec00e; /* --bg-circle-color: #35358f; */ --docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.3); } .footer--dark a:hover { color: var(--ifm-color-custom-yellow, #eee); } .background-circle { position: relative; } .background-circle:before { content: ""; display: block; position: absolute; background: var(--bg-circle-color, #f6643c); border-radius: 50%; transform: translate(-50%, -50%); top: 50%; left: 50%; z-index: -1; width: 209px; height: 212px; box-sizing: border-box; } h1 { font-weight: 300; } h2 { font-weight: 400; } h3, h4 { font-weight: 500; } ================================================ FILE: www/src/pages/index.js ================================================ import React from "react"; import clsx from "clsx"; import Link from "@docusaurus/Link"; import useDocusaurusContext from "@docusaurus/useDocusaurusContext"; import Layout from "@theme/Layout"; import HomepageFeatures from "@site/src/components/HomepageFeatures"; import styles from "./index.module.css"; function HomepageHeader() { const { siteConfig } = useDocusaurusContext(); return (

{siteConfig.title}

{siteConfig.tagline}

CLI commands JS utilities - API Example repo
); } export default function Home() { const { siteConfig } = useDocusaurusContext(); return (

Ethereum Starknet Development environment for professionals

); } ================================================ FILE: www/src/pages/index.module.css ================================================ /** * CSS files with the .module.css suffix will be treated as CSS modules * and scoped locally. */ .heroBanner { padding: 4rem 0; text-align: center; position: relative; overflow: hidden; } @media screen and (max-width: 996px) { .heroBanner { padding: 2rem; } } .buttons { display: flex; align-items: center; justify-content: center; } ================================================ FILE: www/src/pages/markdown-page.md ================================================ --- title: Markdown page example --- # Markdown page example You don't need React to write simple standalone pages. ================================================ FILE: www/static/.nojekyll ================================================