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
================================================
Starknet Hardhat Plugin
[](https://www.npmjs.com/package/@shardlabs/starknet-hardhat-plugin)
If you've used Hardhat 👷♀️👷♂️ and want to develop for 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
[](https://www.npmjs.com/package/@shardlabs/starknet-hardhat-plugin)
If you've used Hardhat 👷♀️👷♂️ and want to develop for 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 (
);
}
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}
);
}
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
================================================