diff --git a/.github/workflows/release-tag-from.js b/.github/workflows/release-tag-from.js new file mode 100644 index 0000000000..b796824e50 --- /dev/null +++ b/.github/workflows/release-tag-from.js @@ -0,0 +1,37 @@ +const semver = require("semver"); + +const previousVersion = (currentVersion, releaseType) => { + const parsedVersion = semver.parse(currentVersion); + + switch (releaseType) { + case "major": { + return `v${parsedVersion.major - 1}.0.0`; + } + case "minor": { + return `v${parsedVersion.major}.${parsedVersion.minor - 1}.0`; + } + case "patch": { + return `v${parsedVersion.major}.${parsedVersion.minor}.${ + parsedVersion.patch - 1 + }`; + } + case "alpha": { + return `v${parsedVersion.major}.${parsedVersion.minor}.${ + parsedVersion.patch + }-alpha.${parsedVersion.prerelease[1] - 1}`; + } + case "beta": { + return `v${parsedVersion.major}.${parsedVersion.minor}.${ + parsedVersion.patch + }-beta.${parsedVersion.prerelease[1] - 1}`; + } + case "rc": { + return `v${parsedVersion.major}.${parsedVersion.minor}.${ + parsedVersion.patch + }-rc.${parsedVersion.prerelease[1] - 1}`; + } + } +}; + +const [currentVersion, releaseType] = process.argv.slice(-2); +console.log(previousVersion(currentVersion, releaseType)); diff --git a/.github/workflows/releases.yml b/.github/workflows/releases.yml new file mode 100644 index 0000000000..6dc4ad0a5c --- /dev/null +++ b/.github/workflows/releases.yml @@ -0,0 +1,99 @@ +name: Release + +on: + schedule: + - cron: "0 0 * * 0" + + workflow_dispatch: + inputs: + release_type: + type: choice + description: Release type + options: + - major + - minor + - patch + - rc + - beta + - alpha + +permissions: + contents: write + +jobs: + release: + runs-on: ubuntu-latest + env: + CARGO_TOKEN: ${{ secrets.CARGO_TOKEN }} + RELEASE_TYPE: ${{ github.event.inputs.release_type }} + steps: + - name: Checkout sources + uses: actions/checkout@v3 + with: + fetch-depth: 0 + - name: Configure git + run: | + git config user.name github-actions + git config user.email github-actions@github.com + - name: Rust stable + uses: actions-rs/toolchain@v1 + with: + profile: minimal + toolchain: stable + - uses: Swatinem/rust-cache@v1 + with: + cache-on-failure: true + - name: Install cargo-release + uses: actions-rs/install@v0.1 + with: + crate: cargo-release + version: latest + - name: Cargo login + run: | + cargo login $CARGO_TOKEN + - name: Dry-run cargo release + run: | + cargo release --workspace ${RELEASE_TYPE:-alpha} --exclude ethers-wasm + - name: Publish release + run: | + cargo release --workspace ${RELEASE_TYPE:-alpha} --exclude ethers-wasm --execute --no-confirm + - name: Setup node + uses: actions/setup-node@v3 + with: + node-version: 14 + - run: | + npm i semver + - name: Install git-cliff + uses: actions-rs/install@v0.1 + with: + crate: git-cliff + version: latest + - name: Publish changelog + id: changelog + run: | + current_version=$(git tag --contains HEAD -l "v*" | head -1) + from_version=$(node .github/workflows/release-tag-from.js $current_version $RELEASE_TYPE) + echo from $from_version to $current_version + + echo "::set-output name=release_version::$(echo $current_version)" + + if git rev-parse "$from_version" >/dev/null 2>&1; then + echo "tag exists, can generate changelog"; + else + echo "tag does not exist, cannot generate changelog, publish github release manually" + exit 0 + fi + + git cliff $from_version..$current_version > GENERATED_CHANGELOG.md + cat GENERATED_CHANGELOG.md + - name: Create GitHub release + id: release + uses: actions/create-release@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + RELEASE_VERSION: ${{ steps.changelog.outputs.release_version }} + with: + tag_name: ${{ env.RELEASE_VERSION }} + release_name: ${{ env.RELEASE_VERSION }} + body_path: GENERATED_CHANGELOG.md + prerelease: ${{ env.RELEASE_TYPE == 'alpha' }} diff --git a/.gitignore b/.gitignore index 3668f4ec39..252650b6c8 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ /target .vscode /.envrc +.idea \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index feec0cf64a..e15b3a61b6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,13 @@ ### Unreleased +- Added Cronos testnet to etherscan options [1276](https://github.com/gakonst/ethers-rs/pull/1276) +- Fix parsing of a pending block + [1272](https://github.com/gakonst/ethers-rs/pull/1272) +- Removed Cronos mainnet beta from `is_legacy` [1246](https://github.com/gakonst/ethers-rs/pull/1246) +- Fix RLP decoding of `from` field for `Eip1559TransactionRequest` and + `Eip2930TransactionRequest`, remove `Eip1559TransactionRequest` `sighash` + method [1180](https://github.com/gakonst/ethers-rs/pull/1180) - Fix RLP encoding of absent access list in `Transaction` [1137](https://github.com/gakonst/ethers-rs/pull/1137) - Pass compilation time as additional argument to `Reporter::on_solc_success` [1098](https://github.com/gakonst/ethers-rs/pull/1098) - Fix aws signer bug which maps un-normalized signature to error if no normalization occurs (in `aws::utils::decode_signature`) @@ -57,11 +64,18 @@ - Add Yul compilation [994](https://github.com/gakonst/ethers-rs/pull/994) - Enforce commutativity of ENS reverse resolution [#996](https://github.com/gakonst/ethers-rs/pull/996) +- Add `TransactionReceipt::to` and `TransactionReceipt::from` + [#1184](https://github.com/gakonst/ethers-rs/pull/1184) +- Add `From` and From> traits to `ValueOrArray` [#1199](https://github.com/gakonst/ethers-rs/pull/1200) ## ethers-contract-abigen ### Unreleased +- Support overloaded events + [#1233](https://github.com/gakonst/ethers-rs/pull/1233) +- Relax Clone requirements when Arc is used + [#1183](https://github.com/gakonst/ethers-rs/pull/1183) - Generate a deploy function if bytecode is provided in the abigen! input (json artifact) [#1030](https://github.com/gakonst/ethers-rs/pull/1030). - Generate correct bindings of struct's field names that are reserved words @@ -109,6 +123,9 @@ - Add support for library linking and make `Bytecode`'s `object` filed an `enum BytecodeObject` [#656](https://github.com/gakonst/ethers-rs/pull/656). - Nit: remove accidentally doubled double-quotes in an error message +- Fix when compiler-out metadata is empty and there's no internalType [#1182](https://github.com/gakonst/ethers-rs/pull/1182) +- Add basic `solc` model checker options. + [#1258](https://github.com/gakonst/ethers-rs/pull/1258) ### 0.6.0 @@ -144,6 +161,10 @@ ### Unreleased +- Load previous logs before subscribing to new logs in case fromBlock is set + [1264](https://github.com/gakonst/ethers-rs/pull/1264) +- Add retries to the pending transaction future + [1221](https://github.com/gakonst/ethers-rs/pull/1221) - Add support for basic and bearer authentication in http and non-wasm websockets. [829](https://github.com/gakonst/ethers-rs/pull/829) - Export `ethers_providers::IpcError` and `ethers_providers::QuorumError` @@ -192,6 +213,8 @@ ### Unreleased +- Relax Clone requirements when Arc is used + [#1183](https://github.com/gakonst/ethers-rs/pull/1183) - Add `EventStream::select` to combine streams with different event types [#725](https://github.com/gakonst/ethers-rs/pull/725) - Substitute output tuples with rust struct types for function calls @@ -235,8 +258,11 @@ ### Unreleased +- Relax Clone requirements when Arc is used + [#1183](https://github.com/gakonst/ethers-rs/pull/1183) - Ensure a consistent chain ID between a Signer and Provider in SignerMiddleware [#1095](https://gakonst/ethers-rs/pull/1095) +- Add BlockNative gas oracle [#1175](https://github.com/gakonst/ethers-rs/pull/1175) ### 0.6.0 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 425255372d..233aa78efe 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -189,7 +189,7 @@ of `ethers-rs` will create an instance of `Provider` is by using `Provider::::try_from`, this is how the documentation test is structured. Lines that start with `/// #` are removed when the documentation is generated. -They are only there to get the test to run. +They are only there to get the test to run. ### Commits @@ -370,58 +370,28 @@ _Adapted from the [Tokio contributing guide](https://github.com/tokio-rs/tokio/b Since the ethers-rs project consists of a number of crates, many of which depend on each other, releasing new versions to crates.io can involve some complexities. -When releasing a new version of a crate, follow these steps: - -1. **Ensure that the release crate has no path dependencies.** When the HEAD - version of a ethers-rs crate requires unreleased changes in another ethers-rs crate, - the crates.io dependency on the second crate will be replaced with a path - dependency. Crates with path dependencies cannot be published, so before - publishing the dependent crate, any path dependencies must also be published. - This should be done through a form of depth-first tree traversal: - - 1. Starting with the first path dependency in the crate to be released, - inspect the `Cargo.toml` for the dependency. If the dependency has any - path dependencies of its own, repeat this step with the first such - dependency. - 2. Begin the release process for the path dependency. - 3. Once the path dependency has been published to crates.io, update the - dependent crate to depend on the crates.io version. - 4. When all path dependencies have been published, the dependent crate may - be published. - - To verify that a crate is ready to publish, run: +We use [`cargo-release`](https://github.com/crate-ci/cargo-release) to manage these +complexities and the whole release process. - ```bash - bin/publish --dry-run - ``` +When releasing the workspace: -2. **Update Cargo metadata.** After releasing any path dependencies, update the - `version` field in `Cargo.toml` to the new version, and the `documentation` - field to the docs.rs URL of the new version. -3. **Update other documentation links.** Update the `#![doc(html_root_url)]` - attribute in the crate's `lib.rs` and the "Documentation" link in the crate's - `README.md` to point to the docs.rs URL of the new version. -4. **Update the changelog for the crate.** Each crate in the ethers-rs repository - has its own `CHANGELOG.md` in that crate's subdirectory. Any changes to that - crate since the last release should be added to the changelog. Change - descriptions may be taken from the Git history, but should be edited to - ensure a consistent format, based on [Keep A Changelog][keep-a-changelog]. - Other entries in that crate's changelog may also be used for reference. -5. **Perform a final audit for breaking changes.** Compare the HEAD version of +1. **Perform a final audit for breaking changes.** Compare the HEAD version of crate with the Git tag for the most recent release version. If there are any breaking API changes, determine if those changes can be made without breaking - existing APIs. If so, resolve those issues. Otherwise, if it is necessary to - make a breaking release, update the version numbers to reflect this. -6. **Open a pull request with your changes.** Once that pull request has been - approved by a maintainer and the pull request has been merged, continue to - the next step. -7. **Release the crate.** Run the following command: + existing APIs. If so, resolve those issues and make a `minor` change + release. Otherwise, if it is necessary to make a breaking release, make a + `major` change release. +2. **Dry run the release** by running `cargo release --workspace ` +3. **Update the changelog for the crate.** Changelog for all crates go in + [`CHANGELOG.md`](./CHANGELOG.md). Any unreleased changes changelogs should + be moved to respective crates released changelogs. Change descriptions + may be taken from the Git history, but should be edited to ensure a consistent + format, based on [Keep A Changelog][keep-a-changelog]. Other entries in that + crate's changelog may also be used for reference. +4. **Release the crate.** Run the following command: ```bash - bin/publish + cargo release --workspace --execute ``` - Your editor and prompt you to edit a message for the tag. Copy the changelog - entry for that release version into your editor and close the window. - [keep-a-changelog]: https://github.com/olivierlacan/keep-a-changelog/blob/master/CHANGELOG.md diff --git a/Cargo.lock b/Cargo.lock index cd255bced6..68ce13171f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -648,6 +648,12 @@ version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e4c78c047431fee22c1a7bb92e00ad095a02a983affe4d8a72e2a2c62c1b94f3" +[[package]] +name = "const-oid" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "722e23542a15cea1f65d4a1419c4cfd7a26706c70871a13a04238ca3f40f1661" + [[package]] name = "constant_time_eq" version = "0.1.5" @@ -894,7 +900,16 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6919815d73839e7ad218de758883aae3a257ba6759ce7a9992501efbb53d705c" dependencies = [ - "const-oid", + "const-oid 0.7.1", +] + +[[package]] +name = "der" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13dd2ae565c0a381dde7fade45fce95984c568bdcb4700a4fdbe3175e0380b2f" +dependencies = [ + "const-oid 0.9.0", ] [[package]] @@ -977,7 +992,7 @@ version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d0d69ae62e0ce582d56380743515fefaf1a8c70cec685d9677636d7e30ae9dc9" dependencies = [ - "der", + "der 0.5.1", "elliptic-curve", "rfc6979", "signature", @@ -1020,7 +1035,7 @@ checksum = "25b477563c2bfed38a3b7a60964c49e058b2510ad3f12ba3483fd8f62c2306d6" dependencies = [ "base16ct", "crypto-bigint", - "der", + "der 0.5.1", "ff", "generic-array 0.14.5", "group", @@ -1135,7 +1150,7 @@ dependencies = [ [[package]] name = "ethers" -version = "0.6.0" +version = "0.6.2" dependencies = [ "bytes", "ethers-addressbook", @@ -1166,7 +1181,7 @@ dependencies = [ [[package]] name = "ethers-contract" -version = "0.6.0" +version = "0.6.2" dependencies = [ "ethers-contract-abigen", "ethers-contract-derive", @@ -1188,7 +1203,7 @@ dependencies = [ [[package]] name = "ethers-contract-abigen" -version = "0.6.0" +version = "0.6.3" dependencies = [ "Inflector", "cfg-if 1.0.0", @@ -1211,7 +1226,7 @@ dependencies = [ [[package]] name = "ethers-contract-derive" -version = "0.6.0" +version = "0.6.3" dependencies = [ "ethers-contract-abigen", "ethers-core", @@ -1224,12 +1239,13 @@ dependencies = [ [[package]] name = "ethers-core" -version = "0.6.0" +version = "0.6.3" dependencies = [ "arrayvec 0.7.2", "bincode", "bytes", "cargo_metadata", + "chrono", "convert_case", "elliptic-curve", "ethabi", @@ -1244,14 +1260,16 @@ dependencies = [ "rlp-derive", "serde", "serde_json", + "strum", "syn", "thiserror", "tiny-keccak", + "unicode-xid", ] [[package]] name = "ethers-derive-eip712" -version = "0.2.0" +version = "0.2.2" dependencies = [ "ethers-contract", "ethers-contract-derive", @@ -1265,11 +1283,12 @@ dependencies = [ [[package]] name = "ethers-etherscan" -version = "0.2.0" +version = "0.2.2" dependencies = [ "ethers-core", "ethers-solc", "reqwest", + "semver", "serde", "serde-aux", "serde_json", @@ -1277,11 +1296,13 @@ dependencies = [ "tempfile", "thiserror", "tokio", + "tracing", + "tracing-subscriber", ] [[package]] name = "ethers-middleware" -version = "0.6.0" +version = "0.6.2" dependencies = [ "async-trait", "ethers-contract", @@ -1290,6 +1311,7 @@ dependencies = [ "ethers-providers", "ethers-signers", "ethers-solc", + "futures-locks", "futures-util", "hex", "instant", @@ -1308,7 +1330,7 @@ dependencies = [ [[package]] name = "ethers-providers" -version = "0.6.0" +version = "0.6.2" dependencies = [ "async-trait", "auto_impl", @@ -1319,6 +1341,7 @@ dependencies = [ "futures-core", "futures-timer", "futures-util", + "hashers", "hex", "http", "once_cell", @@ -1331,7 +1354,7 @@ dependencies = [ "thiserror", "tokio", "tokio-tungstenite", - "tokio-util 0.7.1", + "tokio-util 0.7.2", "tracing", "tracing-futures", "url", @@ -1344,7 +1367,7 @@ dependencies = [ [[package]] name = "ethers-signers" -version = "0.6.0" +version = "0.6.2" dependencies = [ "async-trait", "coins-bip32", @@ -1365,7 +1388,7 @@ dependencies = [ "semver", "serde_json", "sha2 0.9.9", - "spki", + "spki 0.6.0", "tempfile", "thiserror", "tokio", @@ -1379,6 +1402,7 @@ dependencies = [ name = "ethers-solc" version = "0.3.0" dependencies = [ + "cfg-if 1.0.0", "colored", "criterion", "dunce", @@ -1393,6 +1417,7 @@ dependencies = [ "md-5 0.10.1", "num_cpus", "once_cell", + "path-slash", "pretty_assertions", "rand 0.8.5", "rayon", @@ -1584,6 +1609,17 @@ version = "0.3.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc4045962a5a5e935ee2fdedaa4e08284547402885ab326734432bed5d12966b" +[[package]] +name = "futures-locks" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3eb42d4fb72227be5778429f9ef5240a38a358925a49f05b5cf702ce7c7e558a" +dependencies = [ + "futures-channel", + "futures-task", + "tokio", +] + [[package]] name = "futures-macro" version = "0.3.21" @@ -1631,6 +1667,15 @@ dependencies = [ "slab", ] +[[package]] +name = "fxhash" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" +dependencies = [ + "byteorder", +] + [[package]] name = "generic-array" version = "0.12.4" @@ -1722,6 +1767,15 @@ version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" +[[package]] +name = "hashers" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2bca93b15ea5a746f220e56587f71e73c6165eab783df9e26590069953e3c30" +dependencies = [ + "fxhash", +] + [[package]] name = "heck" version = "0.4.0" @@ -1791,9 +1845,9 @@ dependencies = [ [[package]] name = "http" -version = "0.2.6" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31f4c6746584866f0feabcc69893c5b51beef3831656a968ed7ae254cdc4fd03" +checksum = "ff8670570af52249509a86f5e3e18a08c60b177071826898fde8997cf5f6bfbb" dependencies = [ "bytes", "fnv", @@ -2228,17 +2282,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "num-bigint" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f93ab6289c7b344a8a9f60f88d80aa20032336fe78da341afc91c8a2341fc75f" -dependencies = [ - "autocfg", - "num-integer", - "num-traits", -] - [[package]] name = "num-integer" version = "0.1.44" @@ -2249,18 +2292,6 @@ dependencies = [ "num-traits", ] -[[package]] -name = "num-rational" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d41702bd167c2df5520b384281bc111a4b5efcf7fbc4c9c222c815b07e0a6a6a" -dependencies = [ - "autocfg", - "num-bigint", - "num-integer", - "num-traits", -] - [[package]] name = "num-traits" version = "0.2.14" @@ -2466,6 +2497,12 @@ dependencies = [ "subtle", ] +[[package]] +name = "path-slash" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3cacbb3c4ff353b534a67fb8d7524d00229da4cb1dc8c79f4db96e375ab5b619" + [[package]] name = "pbkdf2" version = "0.8.0" @@ -2623,8 +2660,8 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7cabda3fb821068a9a4fab19a683eac3af12edf0f34b94a8be53c4972b8149d0" dependencies = [ - "der", - "spki", + "der 0.5.1", + "spki 0.5.4", "zeroize", ] @@ -2741,11 +2778,11 @@ checksum = "dbf0c48bc1d91375ae5c3cd81e3722dff1abcf81a30960240640d223f59fe0e5" [[package]] name = "proc-macro2" -version = "1.0.37" +version = "1.0.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec757218438d5fda206afc041538b2f6d889286160d649a86a24d37e1235afd1" +checksum = "c54b25569025b7fc9651de43004ae593a75ad88543b17178aa5e1b9c4f15f56f" dependencies = [ - "unicode-xid", + "unicode-ident", ] [[package]] @@ -2848,9 +2885,9 @@ dependencies = [ [[package]] name = "rayon" -version = "1.5.2" +version = "1.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd249e82c21598a9a426a4e00dd7adc1d640b22445ec8545feef801d1a74c221" +checksum = "bd99e5772ead8baa5215278c9b15bf92087709e9c1b2d1f97cdb5a183c933a7d" dependencies = [ "autocfg", "crossbeam-deque", @@ -3035,9 +3072,9 @@ dependencies = [ [[package]] name = "rusoto_core" -version = "0.47.0" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b4f000e8934c1b4f70adde180056812e7ea6b1a247952db8ee98c94cd3116cc" +checksum = "1db30db44ea73551326269adcf7a2169428a054f14faf9e1768f2163494f2fa2" dependencies = [ "async-trait", "base64 0.13.0", @@ -3060,9 +3097,9 @@ dependencies = [ [[package]] name = "rusoto_credential" -version = "0.47.0" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a46b67db7bb66f5541e44db22b0a02fed59c9603e146db3a9e633272d3bac2f" +checksum = "ee0a6c13db5aad6047b6a44ef023dbbc21a056b6dab5be3b79ce4283d5c02d05" dependencies = [ "async-trait", "chrono", @@ -3078,9 +3115,9 @@ dependencies = [ [[package]] name = "rusoto_kms" -version = "0.47.0" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7892cd2cca7644d33bd6fafdb2236efd3659162fd7b73ca68d3877f0528399c" +checksum = "3e1fc19cfcfd9f6b2f96e36d5b0dddda9004d2cbfc2d17543e3b9f10cc38fce8" dependencies = [ "async-trait", "bytes", @@ -3092,9 +3129,9 @@ dependencies = [ [[package]] name = "rusoto_signature" -version = "0.47.0" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6264e93384b90a747758bcc82079711eacf2e755c3a8b5091687b5349d870bcc" +checksum = "a5ae95491c8b4847931e291b151127eccd6ff8ca13f33603eb3d0035ecb05272" dependencies = [ "base64 0.13.0", "bytes", @@ -3233,7 +3270,7 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08da66b8b0965a5555b6bd6639e68ccba85e1e2506f5fbb089e93f8a04e1a2d1" dependencies = [ - "der", + "der 0.5.1", "generic-array 0.14.5", "pkcs8", "subtle", @@ -3265,9 +3302,9 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.7" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d65bd28f48be7196d222d95b9243287f48d27aca604e08497513019ff0502cc4" +checksum = "8cb243bdfdb5936c8dc3c45762a19d12ab4550cdc753bc247637d4ec35a040fd" dependencies = [ "serde", ] @@ -3521,15 +3558,13 @@ dependencies = [ [[package]] name = "solang-parser" -version = "0.1.12" +version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6b2ad9c159bd02219a59368133301e6195fdaa2b5d55c628ccdcd611d49235f" +checksum = "395b6e1ec5af117bd08f963c7cd80f8efd4eed51c5a332aed42b13e3f9bc860b" dependencies = [ + "itertools", "lalrpop", "lalrpop-util", - "num-bigint", - "num-rational", - "num-traits", "phf", "unicode-xid", ] @@ -3547,7 +3582,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "44d01ac02a6ccf3e07db148d2be087da624fea0221a16152ed01f0496a6b0a27" dependencies = [ "base64ct", - "der", + "der 0.5.1", +] + +[[package]] +name = "spki" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67cf02bbac7a337dc36e4f5a693db6c21e7863f45070f7064577eb4367a3212b" +dependencies = [ + "der 0.6.0", ] [[package]] @@ -3575,6 +3619,28 @@ version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" +[[package]] +name = "strum" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e96acfc1b70604b8b2f1ffa4c57e59176c7dbb05d556c71ecd2f5498a1dee7f8" +dependencies = [ + "strum_macros", +] + +[[package]] +name = "strum_macros" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6878079b17446e4d3eba6192bb0a2950d5b14f0ed8424b852310e5a94345d0ef" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "rustversion", + "syn", +] + [[package]] name = "subtle" version = "2.4.1" @@ -3624,13 +3690,13 @@ dependencies = [ [[package]] name = "syn" -version = "1.0.91" +version = "1.0.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b683b2b825c8eef438b77c36a06dc262294da3d5a5813fac20da149241dcd44d" +checksum = "fbaf6116ab8924f39d52792136fb74fd60a80194cf1b1c6ffa6453eef1c3f942" dependencies = [ "proc-macro2", "quote", - "unicode-xid", + "unicode-ident", ] [[package]] @@ -3712,18 +3778,18 @@ checksum = "0066c8d12af8b5acd21e00547c3797fde4e8677254a7ee429176ccebbe93dd80" [[package]] name = "thiserror" -version = "1.0.30" +version = "1.0.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "854babe52e4df1653706b98fcfc05843010039b406875930a70e4d9644e5c417" +checksum = "bd829fe32373d27f76265620b5309d0340cb8550f523c1dda251d6298069069a" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.30" +version = "1.0.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa32fd3f627f367fe16f893e2597ae3c05020f8bba2666a4e6ea73d377e5714b" +checksum = "0396bc89e626244658bef819e22d0cc459e795a5ebe878e6ec336d1674a8d79a" dependencies = [ "proc-macro2", "quote", @@ -3869,9 +3935,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.1" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0edfdeb067411dba2044da6d1cb2df793dd35add7888d73c16e3381ded401764" +checksum = "f988a1a1adc2fb21f9c12aa96441da33a1728193ae0b95d2be22dbd17fcb4e5c" dependencies = [ "bytes", "futures-core", @@ -4034,6 +4100,12 @@ version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1a01404663e3db436ed2746d9fefef640d868edae3cceb81c3b8d5732fda678f" +[[package]] +name = "unicode-ident" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d22af068fba1eb5edcb4aea19d382b2a3deb4c8f9d475c589b6ada9e0fd493ee" + [[package]] name = "unicode-normalization" version = "0.1.19" @@ -4051,9 +4123,9 @@ checksum = "3ed742d4ea2bd1176e236172c8429aaf54486e7ac098db29ffe6529e0ce50973" [[package]] name = "unicode-xid" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" +checksum = "957e51f3646910546462e67d5f7599b9e4fb8acdd304b087a6494730f9eebf04" [[package]] name = "untrusted" diff --git a/Cargo.toml b/Cargo.toml index d63af71e5d..de7a3807a9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "ethers" -version = "0.6.0" +version = "0.6.2" authors = ["Georgios Konstantopoulos "] license = "MIT OR Apache-2.0" edition = "2021" @@ -150,4 +150,4 @@ required-features = ["trezor"] [[example]] name = "yubi" path = "examples/yubi.rs" -required-features = ["yubi"] \ No newline at end of file +required-features = ["yubi"] diff --git a/README.md b/README.md index 5309b18e2c..2d4fdcde43 100644 --- a/README.md +++ b/README.md @@ -31,11 +31,12 @@ ethers = { git = "https://github.com/gakonst/ethers-rs" } Tests require the following installed: -1. [`solc`](https://solidity.readthedocs.io/en/latest/installing-solidity.html). We also recommend using [solc-select](https://github.com/crytic/solc-select) for more flexibility. +1. [`solc`](https://solidity.readthedocs.io/en/latest/installing-solidity.html) (>=0.8.10). We also recommend using [solc-select](https://github.com/crytic/solc-select) for more flexibility. 2. [`ganache-cli`](https://github.com/trufflesuite/ganache-cli#installation) +3. [`geth`](https://github.com/ethereum/go-ethereum) In addition, it is recommended that you set the `ETHERSCAN_API_KEY` environment variable -for [the abigen via Etherscan](https://github.com/gakonst/ethers-rs/blob/master/ethers/tests/major_contracts.rs) tests. +for [the abigen via Etherscan](https://github.com/gakonst/ethers-rs/blob/master/ethers-contract/tests/abigen.rs) tests. You can get one [here](https://etherscan.io/apis). ### EVM-compatible chains support diff --git a/ethers-addressbook/Cargo.toml b/ethers-addressbook/Cargo.toml index 73a8d47ad0..15ec1b64cf 100644 --- a/ethers-addressbook/Cargo.toml +++ b/ethers-addressbook/Cargo.toml @@ -2,10 +2,16 @@ name = "ethers-addressbook" version = "0.1.0" edition = "2021" +license = "MIT OR Apache-2.0" +authors = ["Georgios Konstantopoulos "] +description = "Common Ethereum name to address mappings" +homepage = "https://docs.rs/ethers" +repository = "https://github.com/gakonst/ethers-rs" +keywords = ["ethereum", "web3", "celo", "ethers"] [dependencies] once_cell = "1.10.0" serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" -ethers-core = { path = "../ethers-core" } +ethers-core = { path = "../ethers-core", version = "^0.6.0" } diff --git a/ethers-contract/Cargo.toml b/ethers-contract/Cargo.toml index f66bd160ac..1f0cd464c5 100644 --- a/ethers-contract/Cargo.toml +++ b/ethers-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "ethers-contract" license = "MIT OR Apache-2.0" -version = "0.6.0" +version = "0.6.2" authors = ["Georgios Konstantopoulos "] edition = "2018" description = "Smart contract bindings for the ethers-rs crate" @@ -18,7 +18,7 @@ ethers-derive-eip712 = { version = "^0.2.0", path = "../ethers-core/ethers-deriv serde = { version = "1.0.124", default-features = false } serde_json = { version = "1.0.64", default-features = false } -thiserror = { version = "1.0.30", default-features = false } +thiserror = { version = "1.0.31", default-features = false } once_cell = { version = "1.10.0" } pin-project = {version = "1.0.7", default-features = false } futures-util = { version = "^0.3" } diff --git a/ethers-contract/ethers-contract-abigen/Cargo.toml b/ethers-contract/ethers-contract-abigen/Cargo.toml index dbe63ad5af..759a535aed 100644 --- a/ethers-contract/ethers-contract-abigen/Cargo.toml +++ b/ethers-contract/ethers-contract-abigen/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "ethers-contract-abigen" -version = "0.6.0" +version = "0.6.3" authors = ["Nicholas Rodrigues Lordello ", "Georgios Konstantopoulos "] edition = "2018" license = "MIT OR Apache-2.0" @@ -41,4 +41,4 @@ rustls = ["reqwest/rustls-tls"] [dev-dependencies] tempfile = "3.2.0" -ethers-solc = { path = "../../ethers-solc", default-features = false, features = ["project-util"] } +ethers-solc = { version = "^0.3.0", path = "../../ethers-solc", default-features = false, features = ["project-util"] } diff --git a/ethers-contract/ethers-contract-abigen/src/contract.rs b/ethers-contract/ethers-contract-abigen/src/contract.rs index 2dd4a4faea..ad4306d672 100644 --- a/ethers-contract/ethers-contract-abigen/src/contract.rs +++ b/ethers-contract/ethers-contract-abigen/src/contract.rs @@ -16,7 +16,7 @@ use eyre::{eyre, Context as _, Result}; use crate::contract::methods::MethodAlias; use crate::rawabi::JsonAbi; -use ethers_core::types::Bytes; +use ethers_core::{abi::EventExt, types::Bytes}; use proc_macro2::{Ident, Literal, TokenStream}; use quote::quote; use serde::Deserialize; @@ -133,7 +133,7 @@ impl Context { let contract = quote! { #struct_decl - impl<'a, M: #ethers_providers::Middleware> #name { + impl #name { /// Creates a new contract instance with the specified `ethers` /// client at the given `Address`. The contract derefs to a `ethers::Contract` /// object @@ -227,6 +227,22 @@ impl Context { event_aliases.insert(signature, alias); } + // also check for overloaded functions not covered by aliases, in which case we simply + // numerate them + for events in abi.events.values() { + let not_aliased = + events.iter().filter(|ev| !event_aliases.contains_key(&ev.abi_signature())); + if not_aliased.clone().count() > 1 { + let mut aliases = Vec::new(); + // overloaded events + for (idx, event) in not_aliased.enumerate() { + let event_name = format!("{}{}", event.name, idx + 1); + aliases.push((event.abi_signature(), events::event_struct_alias(&event_name))); + } + event_aliases.extend(aliases); + } + } + let event_derives = args .event_derives .iter() diff --git a/ethers-contract/ethers-contract-abigen/src/contract/common.rs b/ethers-contract/ethers-contract-abigen/src/contract/common.rs index 818c4ab9e6..a4bfb4b7f7 100644 --- a/ethers-contract/ethers-contract-abigen/src/contract/common.rs +++ b/ethers-contract/ethers-contract-abigen/src/contract/common.rs @@ -71,9 +71,13 @@ pub(crate) fn struct_declaration(cx: &Context) -> TokenStream { #bytecode // Struct declaration - #[derive(Clone)] pub struct #name(#ethers_contract::Contract); + impl Clone for #name { + fn clone(&self) -> Self { + #name(self.0.clone()) + } + } // Deref to the inner contract in order to access more specific functions functions impl std::ops::Deref for #name { diff --git a/ethers-contract/ethers-contract-abigen/src/contract/events.rs b/ethers-contract/ethers-contract-abigen/src/contract/events.rs index 96946af854..d7fb7b5e73 100644 --- a/ethers-contract/ethers-contract-abigen/src/contract/events.rs +++ b/ethers-contract/ethers-contract-abigen/src/contract/events.rs @@ -58,7 +58,9 @@ impl Context { .events .values() .flatten() - .map(|e| expand_struct_name(e, self.event_aliases.get(&e.abi_signature()).cloned())) + .map(|e| { + event_struct_name(&e.name, self.event_aliases.get(&e.abi_signature()).cloned()) + }) .collect::>(); let ethers_core = ethers_core_crate(); @@ -116,7 +118,10 @@ impl Context { let ty = if iter.next().is_some() { self.expand_event_enum_name() } else { - expand_struct_name(event, self.event_aliases.get(&event.abi_signature()).cloned()) + event_struct_name( + &event.name, + self.event_aliases.get(&event.abi_signature()).cloned(), + ) }; quote! { @@ -218,7 +223,7 @@ impl Context { // append `filter` to disambiguate with potentially conflicting // function names - let result = expand_struct_name(event, alias); + let result = event_struct_name(&event.name, alias); let doc = util::expand_doc(&format!("Gets the contract's `{}` event", event.name)); quote! { @@ -237,7 +242,7 @@ impl Context { let abi_signature = event.abi_signature(); let event_abi_name = event.name.clone(); - let event_name = expand_struct_name(event, sig); + let event_name = event_struct_name(&event.name, sig); let params = self.expand_event_params(event)?; // expand as a tuple if all fields are anonymous @@ -261,17 +266,22 @@ impl Context { } /// Expands an ABI event into an identifier for its event data type. -fn expand_struct_name(event: &Event, alias: Option) -> Ident { +fn event_struct_name(event_name: &str, alias: Option) -> Ident { // TODO: get rid of `Filter` suffix? let name = if let Some(id) = alias { format!("{}Filter", id.to_string().to_pascal_case()) } else { - format!("{}Filter", event.name.to_pascal_case()) + format!("{}Filter", event_name.to_pascal_case()) }; util::ident(&name) } +/// Returns the alias name for an event +pub(crate) fn event_struct_alias(event_name: &str) -> Ident { + util::ident(&event_name.to_pascal_case()) +} + /// Expands an event data structure from its name-type parameter pairs. Returns /// a tuple with the type definition (i.e. the struct declaration) and /// construction (i.e. code for creating an instance of the event data). @@ -406,7 +416,7 @@ mod tests { let cx = test_context(); let params = cx.expand_event_params(&event).unwrap(); - let name = expand_struct_name(&event, None); + let name = event_struct_name(&event.name, None); let definition = expand_data_struct(&name, ¶ms); assert_quote!(definition, { @@ -431,7 +441,7 @@ mod tests { let cx = test_context_with_alias("Foo(bool,address)", "FooAliased"); let params = cx.expand_event_params(&event).unwrap(); let alias = Some(util::ident("FooAliased")); - let name = expand_struct_name(&event, alias); + let name = event_struct_name(&event.name, alias); let definition = expand_data_struct(&name, ¶ms); assert_quote!(definition, { @@ -455,7 +465,7 @@ mod tests { let cx = test_context(); let params = cx.expand_event_params(&event).unwrap(); - let name = expand_struct_name(&event, None); + let name = event_struct_name(&event.name, None); let definition = expand_data_tuple(&name, ¶ms); assert_quote!(definition, { @@ -477,7 +487,7 @@ mod tests { let cx = test_context_with_alias("Foo(bool,address)", "FooAliased"); let params = cx.expand_event_params(&event).unwrap(); let alias = Some(util::ident("FooAliased")); - let name = expand_struct_name(&event, alias); + let name = event_struct_name(&event.name, alias); let definition = expand_data_tuple(&name, ¶ms); assert_quote!(definition, { diff --git a/ethers-contract/ethers-contract-abigen/src/contract/methods.rs b/ethers-contract/ethers-contract-abigen/src/contract/methods.rs index a9ca643a13..bf782967fa 100644 --- a/ethers-contract/ethers-contract-abigen/src/contract/methods.rs +++ b/ethers-contract/ethers-contract-abigen/src/contract/methods.rs @@ -44,57 +44,57 @@ impl Context { /// Returns all deploy (constructor) implementations pub(crate) fn deployment_methods(&self) -> TokenStream { - if self.contract_bytecode.is_some() { - let ethers_core = ethers_core_crate(); - let ethers_contract = ethers_contract_crate(); - - let abi_name = self.inline_abi_ident(); - let get_abi = quote! { - #abi_name.clone() - }; + if self.contract_bytecode.is_none() { + // don't generate deploy if no bytecode + return quote! {} + } + let ethers_core = ethers_core_crate(); + let ethers_contract = ethers_contract_crate(); - let bytecode_name = self.inline_bytecode_ident(); - let get_bytecode = quote! { - #bytecode_name.clone().into() - }; + let abi_name = self.inline_abi_ident(); + let get_abi = quote! { + #abi_name.clone() + }; - let deploy = quote! { - /// Constructs the general purpose `Deployer` instance based on the provided constructor arguments and sends it. - /// Returns a new instance of a deployer that returns an instance of this contract after sending the transaction - /// - /// Notes: - /// 1. If there are no constructor arguments, you should pass `()` as the argument. - /// 1. The default poll duration is 7 seconds. - /// 1. The default number of confirmations is 1 block. - /// - /// - /// # Example - /// - /// Generate contract bindings with `abigen!` and deploy a new contract instance. - /// - /// *Note*: this requires a `bytecode` and `abi` object in the `greeter.json` artifact. - /// - /// ```ignore - /// # async fn deploy(client: ::std::sync::Arc) { - /// abigen!(Greeter,"../greeter.json"); - /// - /// let greeter_contract = Greeter::deploy(client, "Hello world!".to_string()).unwrap().send().await.unwrap(); - /// let msg = greeter_contract.greet().call().await.unwrap(); - /// # } - /// ``` - pub fn deploy(client: ::std::sync::Arc, constructor_args: T) -> Result<#ethers_contract::builders::ContractDeployer, #ethers_contract::ContractError> { - let factory = #ethers_contract::ContractFactory::new(#get_abi, #get_bytecode, client); - let deployer = factory.deploy(constructor_args)?; - let deployer = #ethers_contract::ContractDeployer::new(deployer); - Ok(deployer) - } + let bytecode_name = self.inline_bytecode_ident(); + let get_bytecode = quote! { + #bytecode_name.clone().into() + }; - }; + let deploy = quote! { + /// Constructs the general purpose `Deployer` instance based on the provided constructor arguments and sends it. + /// Returns a new instance of a deployer that returns an instance of this contract after sending the transaction + /// + /// Notes: + /// 1. If there are no constructor arguments, you should pass `()` as the argument. + /// 1. The default poll duration is 7 seconds. + /// 1. The default number of confirmations is 1 block. + /// + /// + /// # Example + /// + /// Generate contract bindings with `abigen!` and deploy a new contract instance. + /// + /// *Note*: this requires a `bytecode` and `abi` object in the `greeter.json` artifact. + /// + /// ```ignore + /// # async fn deploy(client: ::std::sync::Arc) { + /// abigen!(Greeter,"../greeter.json"); + /// + /// let greeter_contract = Greeter::deploy(client, "Hello world!".to_string()).unwrap().send().await.unwrap(); + /// let msg = greeter_contract.greet().call().await.unwrap(); + /// # } + /// ``` + pub fn deploy(client: ::std::sync::Arc, constructor_args: T) -> Result<#ethers_contract::builders::ContractDeployer, #ethers_contract::ContractError> { + let factory = #ethers_contract::ContractFactory::new(#get_abi, #get_bytecode, client); + let deployer = factory.deploy(constructor_args)?; + let deployer = #ethers_contract::ContractDeployer::new(deployer); + Ok(deployer) + } - return deploy - } + }; - quote! {} + deploy } /// Expands to the corresponding struct type based on the inputs of the given function diff --git a/ethers-contract/ethers-contract-abigen/src/rawabi.rs b/ethers-contract/ethers-contract-abigen/src/rawabi.rs index 501ecc8a76..086bec4c32 100644 --- a/ethers-contract/ethers-contract-abigen/src/rawabi.rs +++ b/ethers-contract/ethers-contract-abigen/src/rawabi.rs @@ -168,10 +168,18 @@ impl<'de> Visitor<'de> for AbiObjectVisitor { abi = Some(RawAbi(map.next_value::>()?)); } "bytecode" | "byteCode" => { - bytecode = map.next_value::().ok().map(|obj| obj.object); + bytecode = map + .next_value::() + .ok() + .map(|obj| obj.object) + .filter(|bytecode| !bytecode.0.is_empty()); } "bin" => { - bytecode = map.next_value::().ok().map(|b| b.0); + bytecode = map + .next_value::() + .ok() + .map(|b| b.0) + .filter(|b| !b.0.is_empty()); } _ => { map.next_value::()?; @@ -185,7 +193,7 @@ impl<'de> Visitor<'de> for AbiObjectVisitor { } impl<'de> Deserialize<'de> for AbiObject { - fn deserialize(deserializer: D) -> std::result::Result + fn deserialize(deserializer: D) -> Result where D: Deserializer<'de>, { @@ -269,4 +277,30 @@ mod tests { let artifact = include_str!("../../tests/solidity-contracts/greeter.json"); assert_has_bytecode(artifact); } + + #[test] + fn ignores_empty_bytecode() { + let abi_str = r#"[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint64","name":"number","type":"uint64"}],"name":"MyEvent","type":"event"},{"inputs":[],"name":"greet","outputs":[],"stateMutability":"nonpayable","type":"function"}]"#; + let s = format!(r#"{{"abi": {}, "bin" : "0x" }}"#, abi_str); + + match serde_json::from_str::(&s).unwrap() { + JsonAbi::Object(abi) => { + assert!(abi.bytecode.is_none()); + } + _ => { + panic!("expected abi object") + } + } + + let s = format!(r#"{{"abi": {}, "bytecode" : {{ "object": "0x" }} }}"#, abi_str); + + match serde_json::from_str::(&s).unwrap() { + JsonAbi::Object(abi) => { + assert!(abi.bytecode.is_none()); + } + _ => { + panic!("expected abi object") + } + } + } } diff --git a/ethers-contract/ethers-contract-derive/Cargo.toml b/ethers-contract/ethers-contract-derive/Cargo.toml index a431109007..251e98f570 100644 --- a/ethers-contract/ethers-contract-derive/Cargo.toml +++ b/ethers-contract/ethers-contract-derive/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "ethers-contract-derive" -version = "0.6.0" +version = "0.6.3" authors = ["Nicholas Rodrigues Lordello ", "Georgios Konstantopoulos "] edition = "2018" license = "MIT OR Apache-2.0" diff --git a/ethers-contract/src/call.rs b/ethers-contract/src/call.rs index dd72301cac..2e34a6b7d1 100644 --- a/ethers-contract/src/call.rs +++ b/ethers-contract/src/call.rs @@ -63,7 +63,7 @@ pub enum ContractError { ContractNotDeployed, } -#[derive(Debug, Clone)] +#[derive(Debug)] #[must_use = "contract calls do nothing unless you `send` or `call` them"] /// Helper for managing a transaction before submitting it to a node pub struct ContractCall { @@ -79,6 +79,18 @@ pub struct ContractCall { pub(crate) datatype: PhantomData, } +impl Clone for ContractCall { + fn clone(&self) -> Self { + ContractCall { + tx: self.tx.clone(), + function: self.function.clone(), + block: self.block, + client: self.client.clone(), + datatype: self.datatype, + } + } +} + impl ContractCall { /// Sets the `from` field in the transaction to the provided value pub fn from>(mut self, from: T) -> Self { diff --git a/ethers-contract/src/contract.rs b/ethers-contract/src/contract.rs index f6ebbaa502..ee7567a30c 100644 --- a/ethers-contract/src/contract.rs +++ b/ethers-contract/src/contract.rs @@ -150,13 +150,23 @@ use std::{fmt::Debug, marker::PhantomData, sync::Arc}; /// [`Abigen` builder]: crate::Abigen /// [`event`]: method@crate::Contract::event /// [`method`]: method@crate::Contract::method -#[derive(Debug, Clone)] +#[derive(Debug)] pub struct Contract { base_contract: BaseContract, client: Arc, address: Address, } +impl Clone for Contract { + fn clone(&self) -> Self { + Contract { + base_contract: self.base_contract.clone(), + client: self.client.clone(), + address: self.address, + } + } +} + impl Contract { /// Creates a new contract from the provided client, abi and address pub fn new(address: Address, abi: impl Into, client: impl Into>) -> Self { @@ -262,13 +272,11 @@ impl Contract { /// /// Clones `self` internally #[must_use] - pub fn connect(&self, client: Arc) -> Self + pub fn connect(&self, client: Arc) -> Contract where - M: Clone, + N: Clone, { - let mut this = self.clone(); - this.client = client; - this + Contract { base_contract: self.base_contract.clone(), client, address: self.address } } /// Returns the contract's address diff --git a/ethers-contract/src/event.rs b/ethers-contract/src/event.rs index 370bcd7007..d2b7fcf7bd 100644 --- a/ethers-contract/src/event.rs +++ b/ethers-contract/src/event.rs @@ -186,7 +186,7 @@ where Ok(events) } - fn parse_log(&self, log: Log) -> Result> { + pub fn parse_log(&self, log: Log) -> Result> { D::decode_log(&RawLog { topics: log.topics, data: log.data.to_vec() }).map_err(From::from) } } diff --git a/ethers-contract/src/factory.rs b/ethers-contract/src/factory.rs index 90aa6d3c56..6ee857e6b6 100644 --- a/ethers-contract/src/factory.rs +++ b/ethers-contract/src/factory.rs @@ -19,7 +19,7 @@ use std::sync::Arc; /// /// This is just a wrapper type for [Deployer] with an additional type to convert the [Contract] /// that the deployer returns when sending the transaction. -#[derive(Debug, Clone)] +#[derive(Debug)] #[must_use = "Deployer does nothing unless you `send` it"] pub struct ContractDeployer { /// the actual deployer, exposed for overriding the defaults @@ -30,6 +30,12 @@ pub struct ContractDeployer { _contract: PhantomData, } +impl Clone for ContractDeployer { + fn clone(&self) -> Self { + ContractDeployer { deployer: self.deployer.clone(), _contract: self._contract } + } +} + impl>> ContractDeployer { /// Create a new instance of this [ContractDeployer] pub fn new(deployer: Deployer) -> Self { @@ -89,7 +95,7 @@ impl>> ContractDeployer { } /// Helper which manages the deployment transaction of a smart contract -#[derive(Debug, Clone)] +#[derive(Debug)] #[must_use = "Deployer does nothing unless you `send` it"] pub struct Deployer { /// The deployer's transaction, exposed for overriding the defaults @@ -100,6 +106,18 @@ pub struct Deployer { block: BlockNumber, } +impl Clone for Deployer { + fn clone(&self) -> Self { + Deployer { + tx: self.tx.clone(), + abi: self.abi.clone(), + client: self.client.clone(), + confs: self.confs, + block: self.block, + } + } +} + impl Deployer { /// Sets the number of confirmations to wait for the contract deployment transaction pub fn confirmations>(mut self, confirmations: T) -> Self { @@ -222,13 +240,23 @@ impl Deployer { /// println!("{}", contract.address()); /// # Ok(()) /// # } -#[derive(Debug, Clone)] +#[derive(Debug)] pub struct ContractFactory { client: Arc, abi: Abi, bytecode: Bytes, } +impl Clone for ContractFactory { + fn clone(&self) -> Self { + ContractFactory { + client: self.client.clone(), + abi: self.abi.clone(), + bytecode: self.bytecode.clone(), + } + } +} + impl ContractFactory { /// Creates a factory for deployment of the Contract with bytecode, and the /// constructor defined in the abi. The client will be used to send any deployment diff --git a/ethers-contract/src/lib.rs b/ethers-contract/src/lib.rs index 21b14b5c95..25bcf8d5f1 100644 --- a/ethers-contract/src/lib.rs +++ b/ethers-contract/src/lib.rs @@ -20,7 +20,7 @@ pub use event::EthEvent; mod log; pub use log::{decode_logs, EthLogDecode, LogMeta}; -mod stream; +pub mod stream; mod multicall; pub use multicall::Multicall; diff --git a/ethers-contract/src/multicall/mod.rs b/ethers-contract/src/multicall/mod.rs index 2055b13354..275b441614 100644 --- a/ethers-contract/src/multicall/mod.rs +++ b/ethers-contract/src/multicall/mod.rs @@ -120,7 +120,6 @@ pub static ADDRESS_BOOK: Lazy> = Lazy::new(|| { /// [`new`]: method@crate::Multicall::new /// [`block`]: method@crate::Multicall::block /// [`add_call`]: method@crate::Multicall::add_call -#[derive(Clone)] pub struct Multicall { calls: Vec, block: Option, @@ -128,6 +127,17 @@ pub struct Multicall { legacy: bool, } +impl Clone for Multicall { + fn clone(&self) -> Self { + Multicall { + calls: self.calls.clone(), + block: self.block, + contract: self.contract.clone(), + legacy: self.legacy, + } + } +} + #[derive(Clone)] /// Helper struct for managing calls to be made to the `function` in smart contract `target` /// with `data` diff --git a/ethers-contract/src/multicall/multicall_contract.rs b/ethers-contract/src/multicall/multicall_contract.rs index 5706736f67..33ccc6254c 100644 --- a/ethers-contract/src/multicall/multicall_contract.rs +++ b/ethers-contract/src/multicall/multicall_contract.rs @@ -16,8 +16,12 @@ mod multicallcontract_mod { pub static MULTICALLCONTRACT_ABI: Lazy = Lazy::new(|| { serde_json :: from_str ( "[{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"}],\"internalType\":\"struct MulticallContract.Call[]\",\"name\":\"calls\",\"type\":\"tuple[]\"}],\"name\":\"aggregate\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"bytes[]\",\"name\":\"returnData\",\"type\":\"bytes[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"}],\"name\":\"getBlockHash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"blockHash\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCurrentBlockCoinbase\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"coinbase\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCurrentBlockDifficulty\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"difficulty\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCurrentBlockGasLimit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"gaslimit\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCurrentBlockTimestamp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"}],\"name\":\"getEthBalance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLastBlockHash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"blockHash\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]" ) . expect ( "invalid abi" ) }); - #[derive(Clone)] pub struct MulticallContract(Contract); + impl Clone for MulticallContract { + fn clone(&self) -> Self { + MulticallContract(self.0.clone()) + } + } impl std::ops::Deref for MulticallContract { type Target = Contract; fn deref(&self) -> &Self::Target { @@ -29,7 +33,7 @@ mod multicallcontract_mod { f.debug_tuple(stringify!(MulticallContract)).field(&self.address()).finish() } } - impl<'a, M: Middleware> MulticallContract { + impl MulticallContract { #[doc = r" Creates a new contract instance with the specified `ethers`"] #[doc = r" client at the given `Address`. The contract derefs to a `ethers::Contract`"] #[doc = r" object"] diff --git a/ethers-contract/tests/abigen.rs b/ethers-contract/tests/abigen.rs index d69592d6b6..44d0c767a6 100644 --- a/ethers-contract/tests/abigen.rs +++ b/ethers-contract/tests/abigen.rs @@ -4,8 +4,11 @@ use ethers_contract::{abigen, EthCall, EthEvent}; use ethers_core::{ abi::{AbiDecode, AbiEncode, Address, Tokenizable}, types::{transaction::eip2718::TypedTransaction, Eip1559TransactionRequest, U256}, + utils::Ganache, }; +use ethers_middleware::SignerMiddleware; use ethers_providers::{MockProvider, Provider}; +use ethers_signers::{LocalWallet, Signer}; use ethers_solc::Solc; use std::{convert::TryFrom, sync::Arc}; @@ -548,3 +551,42 @@ fn can_gen_reserved_word_field_names() { let _foo = Foo { ref_: U256::default() }; } + +#[test] +fn can_handle_overloaded_events() { + abigen!( + SimpleContract, + r#"[ + event ActionPaused(string cToken, string action, bool pauseState) + event ActionPaused(string action, bool pauseState) + ]"# + ); + + let _ev1 = ActionPaused1Filter { + c_token: "ctoken".to_string(), + action: "action".to_string(), + pause_state: false, + }; + let _ev2 = ActionPaused2Filter { action: "action".to_string(), pause_state: false }; +} + +#[tokio::test] +#[cfg(not(feature = "celo"))] +async fn can_send_struct_param() { + abigen!(StructContract, "./tests/solidity-contracts/StructContract.json"); + + let server = Ganache::default().spawn(); + let wallet: LocalWallet = server.keys()[0].clone().into(); + let provider = Provider::try_from(server.endpoint()).unwrap(); + let client = Arc::new(SignerMiddleware::new(provider, wallet.with_chain_id(1337u64))); + + let contract = StructContract::deploy(client, ()).unwrap().legacy().send().await.unwrap(); + + let point = Point { x: 1337u64.into(), y: 0u64.into() }; + let tx = contract.submit_point(point).legacy(); + let tx = tx.send().await.unwrap().await.unwrap().unwrap(); + assert_eq!(tx.logs.len(), 1); + + let logs: Vec = contract.event().from_block(0u64).query().await.unwrap(); + assert_eq!(logs.len(), 1); +} diff --git a/ethers-contract/tests/common/derive.rs b/ethers-contract/tests/common/derive.rs index 25dd7aaf8e..95fe53c360 100644 --- a/ethers-contract/tests/common/derive.rs +++ b/ethers-contract/tests/common/derive.rs @@ -584,6 +584,15 @@ fn can_derive_array_tuples() { } } +#[test] +fn can_handle_abigen_tuples() { + #[derive(Clone, Debug, Default, Eq, PartialEq, EthCall, EthDisplay)] + #[ethcall(name = "swap", abi = "swap((uint8,uint8)[])")] + pub struct SwapCall { + pub pairs_to_swap: ::std::vec::Vec<(u8, u8)>, + } +} + #[test] fn eth_display_works_on_ethers_bytes() { #[derive(Clone, Debug, Default, Eq, PartialEq, EthCall, EthDisplay)] diff --git a/ethers-contract/tests/solidity-contracts/StructContract.json b/ethers-contract/tests/solidity-contracts/StructContract.json new file mode 100644 index 0000000000..23679f81db --- /dev/null +++ b/ethers-contract/tests/solidity-contracts/StructContract.json @@ -0,0 +1,55 @@ +{ + "abi": [ + { + "anonymous": false, + "inputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "indexed": false, + "internalType": "struct MyContract.Point", + "name": "x", + "type": "tuple" + } + ], + "name": "NewPoint", + "type": "event" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "x", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "y", + "type": "uint256" + } + ], + "internalType": "struct MyContract.Point", + "name": "_point", + "type": "tuple" + } + ], + "name": "submitPoint", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bin": "608060405234801561001057600080fd5b50610268806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063b3c67bb814610030575b600080fd5b61004a600480360381019061004591906101ac565b61004c565b005b7f0a10caaea7ac3c68834bca5fb5f42a10cb68bc3866ed86e6379d62bea6d591668160405161007b9190610217565b60405180910390a150565b6000604051905090565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6100e38261009a565b810181811067ffffffffffffffff82111715610102576101016100ab565b5b80604052505050565b6000610115610086565b905061012182826100da565b919050565b6000819050919050565b61013981610126565b811461014457600080fd5b50565b60008135905061015681610130565b92915050565b60006040828403121561017257610171610095565b5b61017c604061010b565b9050600061018c84828501610147565b60008301525060206101a084828501610147565b60208301525092915050565b6000604082840312156101c2576101c1610090565b5b60006101d08482850161015c565b91505092915050565b6101e281610126565b82525050565b6040820160008201516101fe60008501826101d9565b50602082015161021160208501826101d9565b50505050565b600060408201905061022c60008301846101e8565b9291505056fea2646970667358221220ca9c95aa57bcabfe8405dcd5d993ab0920ed1e768884cae607c1b47d5c127f9564736f6c634300080a0033" +} diff --git a/ethers-contract/tests/solidity-contracts/StructContract.sol b/ethers-contract/tests/solidity-contracts/StructContract.sol new file mode 100644 index 0000000000..2a617991bc --- /dev/null +++ b/ethers-contract/tests/solidity-contracts/StructContract.sol @@ -0,0 +1,15 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity >=0.8.10; + +contract MyContract { + struct Point { + uint256 x; + uint256 y; + } + + event NewPoint(Point x); + + function submitPoint(Point memory _point) public { + emit NewPoint(_point); + } +} \ No newline at end of file diff --git a/ethers-core/Cargo.toml b/ethers-core/Cargo.toml index bd11e44e7e..8bdafe8760 100644 --- a/ethers-core/Cargo.toml +++ b/ethers-core/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "ethers-core" license = "MIT OR Apache-2.0" -version = "0.6.0" +version = "0.6.3" authors = ["Georgios Konstantopoulos "] edition = "2018" description = "Core structures for the ethers-rs crate" @@ -23,20 +23,23 @@ rand = { version = "0.8.5", default-features = false } tiny-keccak = { version = "2.0.2", default-features = false } # misc +chrono = { version = "0.4", default-features = false } serde = { version = "1.0.124", default-features = false, features = ["derive"] } serde_json = { version = "1.0.64", default-features = false } -thiserror = { version = "1.0.30", default-features = false } +thiserror = { version = "1.0.31", default-features = false } bytes = { version = "1.1.0", features = ["serde"] } hex = { version = "0.4.3", default-features = false, features = ["std"] } once_cell = { version = "1.10.0", optional = true } +unicode-xid = "0.2.3" +strum = { version = "0.24", features = ["derive"] } # macros feature enabled dependencies cargo_metadata = { version = "0.14.2", optional = true } # eip712 feature enabled dependencies convert_case = { version = "0.5.0", optional = true } -syn = { version = "1.0.91", optional = true } -proc-macro2 = { version = "1.0.37", optional = true } +syn = { version = "1.0.95", optional = true } +proc-macro2 = { version = "1.0.39", optional = true } [dev-dependencies] serde_json = { version = "1.0.64", default-features = false } diff --git a/ethers-core/ethers-derive-eip712/Cargo.toml b/ethers-core/ethers-derive-eip712/Cargo.toml index 8215539703..3194fc6a07 100644 --- a/ethers-core/ethers-derive-eip712/Cargo.toml +++ b/ethers-core/ethers-derive-eip712/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "ethers-derive-eip712" -version = "0.2.0" +version = "0.2.2" edition = "2018" description = "Custom derive macro for EIP-712 typed data" license = "MIT OR Apache-2.0" diff --git a/ethers-core/src/abi/error.rs b/ethers-core/src/abi/error.rs index 48a3dcd2e8..bd54c0a786 100644 --- a/ethers-core/src/abi/error.rs +++ b/ethers-core/src/abi/error.rs @@ -1,5 +1,5 @@ //! Boilerplate error definitions. -use crate::abi::InvalidOutputType; +use crate::abi::{human_readable, InvalidOutputType}; use thiserror::Error; /// A type alias for std's Result with the Error as our error type. @@ -10,8 +10,12 @@ pub type Result = std::result::Result; pub enum ParseError { #[error("{0}")] Message(String), + // ethabi parser error #[error(transparent)] - ParseError(#[from] super::Error), + ParseError(#[from] ethabi::Error), + // errors from human readable lexer + #[error(transparent)] + LexerError(#[from] human_readable::lexer::LexerError), } macro_rules! _format_err { @@ -32,7 +36,7 @@ pub(crate) use _bail as bail; pub enum AbiError { /// Thrown when the ABI decoding fails #[error(transparent)] - DecodingError(#[from] crate::abi::Error), + DecodingError(#[from] ethabi::Error), /// Thrown when detokenizing an argument #[error(transparent)] diff --git a/ethers-core/src/abi/human_readable/lexer.rs b/ethers-core/src/abi/human_readable/lexer.rs new file mode 100644 index 0000000000..907f39e317 --- /dev/null +++ b/ethers-core/src/abi/human_readable/lexer.rs @@ -0,0 +1,849 @@ +use ethabi::{Event, EventParam, ParamType}; +use std::{fmt, iter::Peekable, str::CharIndices}; +use unicode_xid::UnicodeXID; + +pub type Spanned = Result<(Loc, Token, Loc), Error>; + +macro_rules! unrecognised { + ($l:ident,$r:ident,$t:expr) => { + return Err(LexerError::UnrecognisedToken($l, $r, $t)) + }; +} + +#[derive(Copy, Clone, PartialEq, Debug)] +pub enum Token<'input> { + Identifier(&'input str), + Number(&'input str), + HexNumber(&'input str), + // Punctuation + OpenParenthesis, + CloseParenthesis, + Comma, + OpenBracket, + CloseBracket, + Semicolon, + Point, + + Struct, + Event, + Error, + Enum, + Function, + Tuple, + + Memory, + Storage, + Calldata, + + Public, + Private, + Internal, + External, + + Constant, + + Type, + Pure, + View, + Payable, + Returns, + Anonymous, + Receive, + Fallback, + Abstract, + Virtual, + Override, + + Constructor, + Indexed, + + Uint(usize), + Int(usize), + Bytes(usize), + // prior to 0.8.0 `byte` used to be an alias for `bytes1` + Byte, + DynamicBytes, + Bool, + Address, + String, +} + +// === impl Token === + +impl<'input> Token<'input> { + fn into_param_type(self) -> Option { + let param = match self { + Token::Uint(size) => ParamType::Uint(size), + Token::Int(size) => ParamType::Int(size), + Token::Bytes(size) => ParamType::FixedBytes(size), + Token::Byte => ParamType::FixedBytes(1), + Token::DynamicBytes => ParamType::Bytes, + Token::Bool => ParamType::Bool, + Token::Address => ParamType::Address, + Token::String => ParamType::String, + _ => return None, + }; + + Some(param) + } +} + +impl<'input> fmt::Display for Token<'input> { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + Token::Identifier(id) => write!(f, "{}", id), + Token::Number(num) => write!(f, "{}", num), + Token::HexNumber(num) => write!(f, "0x{}", num), + Token::Uint(w) => write!(f, "uint{}", w), + Token::Int(w) => write!(f, "int{}", w), + Token::Bytes(w) => write!(f, "bytes{}", w), + Token::Byte => write!(f, "byte"), + Token::DynamicBytes => write!(f, "bytes"), + Token::Semicolon => write!(f, ";"), + Token::Comma => write!(f, ","), + Token::OpenParenthesis => write!(f, "("), + Token::CloseParenthesis => write!(f, ")"), + Token::OpenBracket => write!(f, "["), + Token::CloseBracket => write!(f, "]"), + Token::Point => write!(f, "."), + Token::Tuple => write!(f, "tuple"), + Token::Bool => write!(f, "bool"), + Token::Address => write!(f, "address"), + Token::String => write!(f, "string"), + Token::Function => write!(f, "function"), + Token::Struct => write!(f, "struct"), + Token::Event => write!(f, "event"), + Token::Error => write!(f, "error"), + Token::Enum => write!(f, "enum"), + Token::Type => write!(f, "type"), + Token::Memory => write!(f, "memory"), + Token::Storage => write!(f, "storage"), + Token::Calldata => write!(f, "calldata"), + Token::Public => write!(f, "public"), + Token::Private => write!(f, "private"), + Token::Internal => write!(f, "internal"), + Token::External => write!(f, "external"), + Token::Constant => write!(f, "constant"), + Token::Pure => write!(f, "pure"), + Token::View => write!(f, "view"), + Token::Payable => write!(f, "payable"), + Token::Returns => write!(f, "returns"), + Token::Anonymous => write!(f, "anonymous"), + Token::Constructor => write!(f, "constructor"), + Token::Indexed => write!(f, "indexed"), + Token::Receive => write!(f, "receive"), + Token::Fallback => write!(f, "fallback"), + Token::Abstract => write!(f, "abstract"), + Token::Virtual => write!(f, "virtual"), + Token::Override => write!(f, "override"), + } + } +} + +#[derive(Debug, PartialEq, Clone, thiserror::Error)] +pub enum LexerError { + #[error("UnrecognisedToken {0}:{1} `{2}`")] + UnrecognisedToken(usize, usize, String), + #[error("Expected token `{2}` at {0}:{1} ")] + ExpectedToken(usize, usize, String), + #[error("EndofFileInHex {0}:{1}")] + EndofFileInHex(usize, usize), + #[error("MissingNumber {0}:{1}")] + MissingNumber(usize, usize), + #[error("end of file but expected `{0}`")] + EndOfFileExpectedToken(String), + #[error("end of file")] + EndOfFile, +} + +#[derive(Clone, Debug)] +pub(crate) struct HumanReadableLexer<'input> { + input: &'input str, + chars: Peekable>, +} + +// === impl HumanReadableLexer === + +impl<'input> HumanReadableLexer<'input> { + /// Creates a new instance of the lexer + pub fn new(input: &'input str) -> Self { + Self { chars: input.char_indices().peekable(), input } + } + + fn next_token(&mut self) -> Option, usize, LexerError>> { + loop { + match self.chars.next() { + Some((start, ch)) if UnicodeXID::is_xid_start(ch) || ch == '_' => { + let end; + loop { + if let Some((i, ch)) = self.chars.peek() { + if !UnicodeXID::is_xid_continue(*ch) && *ch != '$' { + end = *i; + break + } + self.chars.next(); + } else { + end = self.input.len(); + break + } + } + let id = &self.input[start..end]; + + return if let Some(w) = keyword(id) { + Some(Ok((start, w, end))) + } else { + Some(Ok((start, Token::Identifier(id), end))) + } + } + Some((start, ch)) if ch.is_ascii_digit() => { + let mut end = start + 1; + if ch == '0' { + if let Some((_, 'x')) = self.chars.peek() { + // hex number + self.chars.next(); + + let mut end = match self.chars.next() { + Some((end, ch)) if ch.is_ascii_hexdigit() => end, + Some((_, _)) => { + return Some(Err(LexerError::MissingNumber(start, start + 1))) + } + None => { + return Some(Err(LexerError::EndofFileInHex( + start, + self.input.len(), + ))) + } + }; + + while let Some((i, ch)) = self.chars.peek() { + if !ch.is_ascii_hexdigit() && *ch != '_' { + break + } + end = *i; + self.chars.next(); + } + + return Some(Ok(( + start, + Token::HexNumber(&self.input[start..=end]), + end + 1, + ))) + } + } + + loop { + if let Some((i, ch)) = self.chars.peek().cloned() { + if !ch.is_ascii_digit() { + break + } + self.chars.next(); + end = i + 1; + } else { + end = self.input.len(); + break + } + } + return Some(Ok((start, Token::Number(&self.input[start..end]), end + 1))) + } + Some((i, '(')) => return Some(Ok((i, Token::OpenParenthesis, i + 1))), + Some((i, ')')) => return Some(Ok((i, Token::CloseParenthesis, i + 1))), + Some((i, ';')) => return Some(Ok((i, Token::Semicolon, i + 1))), + Some((i, ',')) => return Some(Ok((i, Token::Comma, i + 1))), + Some((i, '.')) => return Some(Ok((i, Token::Point, i + 1))), + Some((i, '[')) => return Some(Ok((i, Token::OpenBracket, i + 1))), + Some((i, ']')) => return Some(Ok((i, Token::CloseBracket, i + 1))), + Some((_, ch)) if ch.is_whitespace() => (), + Some((start, _)) => { + let mut end; + loop { + if let Some((i, ch)) = self.chars.next() { + end = i; + if ch.is_whitespace() { + break + } + } else { + end = self.input.len(); + break + } + } + + return Some(Err(LexerError::UnrecognisedToken( + start, + end, + self.input[start..end].to_owned(), + ))) + } + None => return None, + } + } + } +} + +impl<'input> Iterator for HumanReadableLexer<'input> { + type Item = Spanned, usize, LexerError>; + + /// Return the next token + fn next(&mut self) -> Option { + self.next_token() + } +} + +#[derive(Clone, Debug)] +pub struct HumanReadableParser<'input> { + lexer: Peekable>, +} + +// === impl HumanReadableParser === + +impl<'input> HumanReadableParser<'input> { + /// Creates a new instance of the lexer + pub fn new(input: &'input str) -> Self { + let lexer = HumanReadableLexer::new(input); + Self { lexer: lexer.peekable() } + } + + /// Parses the input into a [ParamType] + pub fn parse_type(input: &'input str) -> Result { + Self::new(input).take_param() + } + + /// Parses an [Event] from a human readable form + /// + /// # Example + /// + /// ``` + /// use ethers_core::abi::HumanReadableParser; + /// let mut event = HumanReadableParser::parse_event("event ValueChanged(address indexed author, string oldValue, string newValue)").unwrap(); + /// ``` + pub fn parse_event(input: &'input str) -> Result { + Self::new(input).take_event() + } + + pub fn take_event(&mut self) -> Result { + let (l, token, r) = self.next_spanned()?; + let name = match token { + Token::Event => { + let (_, next, _) = self.lexer.peek().cloned().ok_or(LexerError::EndOfFile)??; + if let Token::Identifier(name) = next { + self.next(); + name + } else { + "" + } + } + Token::Identifier(name) => name, + t => unrecognised!(l, r, t.to_string()), + }; + + self.take_open_parenthesis()?; + let inputs = self.take_event_params()?; + self.take_close_parenthesis()?; + let event = Event { name: name.to_string(), inputs, anonymous: self.take_anonymous() }; + + Ok(event) + } + + fn take_anonymous(&mut self) -> bool { + if self.peek_next(Token::Anonymous) { + self.next(); + true + } else { + false + } + } + + /// Parses all event params + fn take_event_params(&mut self) -> Result, LexerError> { + let mut params = Vec::new(); + + if self.peek_next(Token::CloseParenthesis) { + return Ok(params) + } + + loop { + params.push(self.take_event_param()?); + + let (l, next, r) = match self.peek() { + Some(next) => next?, + _ => break, + }; + + match next { + Token::Comma => { + self.next_spanned()?; + } + Token::CloseParenthesis => break, + t => unrecognised!(l, r, t.to_string()), + } + } + Ok(params) + } + + fn take_event_param(&mut self) -> Result { + let kind = self.take_param()?; + let mut name = ""; + let mut indexed = false; + + loop { + let (_, token, _) = self.peek_some()?; + match token { + Token::Indexed => { + indexed = true; + self.next(); + } + Token::Identifier(id) => { + name = id; + self.next(); + break + } + _ => break, + }; + } + Ok(EventParam { name: name.to_string(), kind, indexed }) + } + + /// Parses a list of parameter types + fn take_params(&mut self) -> Result, LexerError> { + let mut params = Vec::new(); + + if self.peek_next(Token::CloseParenthesis) { + return Ok(params) + } + loop { + params.push(self.take_param()?); + + let (l, next, r) = match self.peek() { + Some(next) => next?, + _ => break, + }; + match next { + Token::Comma => { + self.next_spanned()?; + } + Token::CloseParenthesis => break, + t => unrecognised!(l, r, t.to_string()), + } + } + + Ok(params) + } + + fn take_param(&mut self) -> Result { + let (l, token, r) = self.next_spanned()?; + let kind = match token { + Token::OpenParenthesis => { + let ty = self.take_params()?; + self.take_next_exact(Token::CloseParenthesis)?; + ParamType::Tuple(ty) + } + t => t + .into_param_type() + .ok_or_else(|| LexerError::UnrecognisedToken(l, r, t.to_string()))?, + }; + self.take_array_tail(kind) + } + + fn take_array_tail(&mut self, kind: ParamType) -> Result { + let (_, token, _) = match self.peek() { + Some(next) => next?, + _ => return Ok(kind), + }; + + match token { + Token::OpenBracket => { + self.next_spanned()?; + let (_, token, _) = self.peek_some()?; + let kind = if let Token::Number(size) = token { + self.next_spanned()?; + ParamType::FixedArray(Box::new(kind), size.parse().unwrap()) + } else { + ParamType::Array(Box::new(kind)) + }; + self.take_next_exact(Token::CloseBracket)?; + self.take_array_tail(kind) + } + _ => Ok(kind), + } + } + + fn take_open_parenthesis(&mut self) -> Result<(), LexerError> { + self.take_next_exact(Token::OpenParenthesis) + } + + fn take_close_parenthesis(&mut self) -> Result<(), LexerError> { + self.take_next_exact(Token::CloseParenthesis) + } + + fn take_next_exact(&mut self, token: Token) -> Result<(), LexerError> { + let (l, next, r) = self.next_spanned().map_err(|err| match err { + LexerError::UnrecognisedToken(l, r, _) => { + LexerError::ExpectedToken(l, r, token.to_string()) + } + LexerError::EndOfFile => LexerError::EndOfFileExpectedToken(token.to_string()), + err => err, + })?; + if next != token { + unrecognised!(l, r, next.to_string()) + } + Ok(()) + } + + /// Returns true if the next token is the given `token` + fn peek_next(&mut self, token: Token) -> bool { + if let Some(Ok(next)) = self.lexer.peek() { + next.1 == token + } else { + false + } + } + + fn next_spanned(&mut self) -> Spanned, usize, LexerError> { + self.next().ok_or(LexerError::EndOfFile)? + } + + fn next(&mut self) -> Option, usize, LexerError>> { + self.lexer.next() + } + + fn peek(&mut self) -> Option, usize, LexerError>> { + self.lexer.peek().cloned() + } + + fn peek_some(&mut self) -> Spanned, usize, LexerError> { + self.lexer.peek().cloned().ok_or(LexerError::EndOfFile)? + } +} + +fn keyword(id: &str) -> Option { + let token = match id { + "address" => Token::Address, + "anonymous" => Token::Anonymous, + "bool" => Token::Bool, + "bytes1" => Token::Bytes(1), + "bytes2" => Token::Bytes(2), + "bytes3" => Token::Bytes(3), + "bytes4" => Token::Bytes(4), + "bytes5" => Token::Bytes(5), + "bytes6" => Token::Bytes(6), + "bytes7" => Token::Bytes(7), + "bytes8" => Token::Bytes(8), + "bytes9" => Token::Bytes(9), + "bytes10" => Token::Bytes(10), + "bytes11" => Token::Bytes(11), + "bytes12" => Token::Bytes(12), + "bytes13" => Token::Bytes(13), + "bytes14" => Token::Bytes(14), + "bytes15" => Token::Bytes(15), + "bytes16" => Token::Bytes(16), + "bytes17" => Token::Bytes(17), + "bytes18" => Token::Bytes(18), + "bytes19" => Token::Bytes(19), + "bytes20" => Token::Bytes(20), + "bytes21" => Token::Bytes(21), + "bytes22" => Token::Bytes(22), + "bytes23" => Token::Bytes(23), + "bytes24" => Token::Bytes(24), + "bytes25" => Token::Bytes(25), + "bytes26" => Token::Bytes(26), + "bytes27" => Token::Bytes(27), + "bytes28" => Token::Bytes(28), + "bytes29" => Token::Bytes(29), + "bytes30" => Token::Bytes(30), + "bytes31" => Token::Bytes(31), + "bytes32" => Token::Bytes(32), + "bytes" => Token::DynamicBytes, + "byte" => Token::Byte, + "calldata" => Token::Calldata, + "constant" => Token::Constant, + "constructor" => Token::Constructor, + "enum" => Token::Enum, + "event" => Token::Event, + "error" => Token::Error, + "external" => Token::External, + "function" => Token::Function, + "indexed" => Token::Indexed, + "tuple" => Token::Tuple, + "int8" => Token::Int(8), + "int16" => Token::Int(16), + "int24" => Token::Int(24), + "int32" => Token::Int(32), + "int40" => Token::Int(40), + "int48" => Token::Int(48), + "int56" => Token::Int(56), + "int64" => Token::Int(64), + "int72" => Token::Int(72), + "int80" => Token::Int(80), + "int88" => Token::Int(88), + "int96" => Token::Int(96), + "int104" => Token::Int(104), + "int112" => Token::Int(112), + "int120" => Token::Int(120), + "int128" => Token::Int(128), + "int136" => Token::Int(136), + "int144" => Token::Int(144), + "int152" => Token::Int(152), + "int160" => Token::Int(160), + "int168" => Token::Int(168), + "int176" => Token::Int(176), + "int184" => Token::Int(184), + "int192" => Token::Int(192), + "int200" => Token::Int(200), + "int208" => Token::Int(208), + "int216" => Token::Int(216), + "int224" => Token::Int(224), + "int232" => Token::Int(232), + "int240" => Token::Int(240), + "int248" => Token::Int(248), + "int256" => Token::Int(256), + "internal" => Token::Internal, + "int" => Token::Int(256), + "memory" => Token::Memory, + "payable" => Token::Payable, + "private" => Token::Private, + "public" => Token::Public, + "pure" => Token::Pure, + "returns" => Token::Returns, + "storage" => Token::Storage, + "string" => Token::String, + "struct" => Token::Struct, + "type" => Token::Type, + "uint8" => Token::Uint(8), + "uint16" => Token::Uint(16), + "uint24" => Token::Uint(24), + "uint32" => Token::Uint(32), + "uint40" => Token::Uint(40), + "uint48" => Token::Uint(48), + "uint56" => Token::Uint(56), + "uint64" => Token::Uint(64), + "uint72" => Token::Uint(72), + "uint80" => Token::Uint(80), + "uint88" => Token::Uint(88), + "uint96" => Token::Uint(96), + "uint104" => Token::Uint(104), + "uint112" => Token::Uint(112), + "uint120" => Token::Uint(120), + "uint128" => Token::Uint(128), + "uint136" => Token::Uint(136), + "uint144" => Token::Uint(144), + "uint152" => Token::Uint(152), + "uint160" => Token::Uint(160), + "uint168" => Token::Uint(168), + "uint176" => Token::Uint(176), + "uint184" => Token::Uint(184), + "uint192" => Token::Uint(192), + "uint200" => Token::Uint(200), + "uint208" => Token::Uint(208), + "uint216" => Token::Uint(216), + "uint224" => Token::Uint(224), + "uint232" => Token::Uint(232), + "uint240" => Token::Uint(240), + "uint248" => Token::Uint(248), + "uint256" => Token::Uint(256), + "uint" => Token::Uint(256), + "view" => Token::View, + "receive" => Token::Receive, + "fallback" => Token::Fallback, + "abstract" => Token::Abstract, + "virtual" => Token::Virtual, + "override" => Token::Override, + _ => return None, + }; + Some(token) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_parse_param() { + assert_eq!(HumanReadableParser::parse_type("address").unwrap(), ParamType::Address); + assert_eq!(HumanReadableParser::parse_type("bytes").unwrap(), ParamType::Bytes); + assert_eq!(HumanReadableParser::parse_type("bytes32").unwrap(), ParamType::FixedBytes(32)); + assert_eq!(HumanReadableParser::parse_type("bool").unwrap(), ParamType::Bool); + assert_eq!(HumanReadableParser::parse_type("string").unwrap(), ParamType::String); + assert_eq!(HumanReadableParser::parse_type("int").unwrap(), ParamType::Int(256)); + assert_eq!(HumanReadableParser::parse_type("uint").unwrap(), ParamType::Uint(256)); + assert_eq!( + HumanReadableParser::parse_type( + " + int32" + ) + .unwrap(), + ParamType::Int(32) + ); + assert_eq!(HumanReadableParser::parse_type("uint32").unwrap(), ParamType::Uint(32)); + } + + #[test] + fn test_parse_array_param() { + assert_eq!( + HumanReadableParser::parse_type("address[]").unwrap(), + ParamType::Array(Box::new(ParamType::Address)) + ); + assert_eq!( + HumanReadableParser::parse_type("uint[]").unwrap(), + ParamType::Array(Box::new(ParamType::Uint(256))) + ); + assert_eq!( + HumanReadableParser::parse_type("bytes[]").unwrap(), + ParamType::Array(Box::new(ParamType::Bytes)) + ); + assert_eq!( + HumanReadableParser::parse_type("bool[][]").unwrap(), + ParamType::Array(Box::new(ParamType::Array(Box::new(ParamType::Bool)))) + ); + } + + #[test] + fn test_parse_fixed_array_param() { + assert_eq!( + HumanReadableParser::parse_type("address[2]").unwrap(), + ParamType::FixedArray(Box::new(ParamType::Address), 2) + ); + assert_eq!( + HumanReadableParser::parse_type("bool[17]").unwrap(), + ParamType::FixedArray(Box::new(ParamType::Bool), 17) + ); + assert_eq!( + HumanReadableParser::parse_type("bytes[45][3]").unwrap(), + ParamType::FixedArray( + Box::new(ParamType::FixedArray(Box::new(ParamType::Bytes), 45)), + 3 + ) + ); + } + + #[test] + fn test_parse_mixed_arrays() { + assert_eq!( + HumanReadableParser::parse_type("bool[][3]").unwrap(), + ParamType::FixedArray(Box::new(ParamType::Array(Box::new(ParamType::Bool))), 3) + ); + assert_eq!( + HumanReadableParser::parse_type("bool[3][]").unwrap(), + ParamType::Array(Box::new(ParamType::FixedArray(Box::new(ParamType::Bool), 3))) + ); + } + + #[test] + fn test_parse_struct_param() { + assert_eq!( + HumanReadableParser::parse_type("(address,bool)").unwrap(), + ParamType::Tuple(vec![ParamType::Address, ParamType::Bool]) + ); + assert_eq!( + HumanReadableParser::parse_type("(bool[3],uint256)").unwrap(), + ParamType::Tuple(vec![ + ParamType::FixedArray(Box::new(ParamType::Bool), 3), + ParamType::Uint(256) + ]) + ); + } + + #[test] + fn test_parse_nested_struct_param() { + assert_eq!( + HumanReadableParser::parse_type("(address,bool,(bool,uint256))").unwrap(), + ParamType::Tuple(vec![ + ParamType::Address, + ParamType::Bool, + ParamType::Tuple(vec![ParamType::Bool, ParamType::Uint(256)]) + ]) + ); + } + + #[test] + fn test_parse_complex_nested_struct_param() { + assert_eq!( + HumanReadableParser::parse_type( + "(address,bool,(bool,uint256,(bool,uint256)),(bool,uint256))" + ) + .unwrap(), + ParamType::Tuple(vec![ + ParamType::Address, + ParamType::Bool, + ParamType::Tuple(vec![ + ParamType::Bool, + ParamType::Uint(256), + ParamType::Tuple(vec![ParamType::Bool, ParamType::Uint(256)]) + ]), + ParamType::Tuple(vec![ParamType::Bool, ParamType::Uint(256)]) + ]) + ); + } + + #[test] + fn test_parse_nested_tuple_array_param() { + assert_eq!( + HumanReadableParser::parse_type("(uint256,bytes32)[]").unwrap(), + ParamType::Array(Box::new(ParamType::Tuple(vec![ + ParamType::Uint(256), + ParamType::FixedBytes(32) + ]))) + ) + } + + #[test] + fn test_parse_inner_tuple_array_param() { + let abi = "((uint256,bytes32)[],address)"; + let read = HumanReadableParser::parse_type(abi).unwrap(); + + let param = ParamType::Tuple(vec![ + ParamType::Array(Box::new(ParamType::Tuple(vec![ + ParamType::Uint(256), + ParamType::FixedBytes(32), + ]))), + ParamType::Address, + ]); + assert_eq!(read, param); + } + + #[test] + fn test_parse_complex_tuple_array_param() { + let abi = "((uint256,uint256)[],(uint256,(uint256,uint256))[])"; + let read = HumanReadableParser::parse_type(abi).unwrap(); + let param = ParamType::Tuple(vec![ + ParamType::Array(Box::new(ParamType::Tuple(vec![ + ParamType::Uint(256), + ParamType::Uint(256), + ]))), + ParamType::Array(Box::new(ParamType::Tuple(vec![ + ParamType::Uint(256), + ParamType::Tuple(vec![ParamType::Uint(256), ParamType::Uint(256)]), + ]))), + ]); + assert_eq!(read, param); + } + + #[test] + fn test_parse_event() { + let abi = "event ValueChanged(address indexed author, string oldValue, string newValue)"; + let event = HumanReadableParser::parse_event(abi).unwrap(); + + assert_eq!( + Event { + name: "ValueChanged".to_string(), + inputs: vec![ + EventParam { + name: "author".to_string(), + kind: ParamType::Address, + indexed: true + }, + EventParam { + name: "oldValue".to_string(), + kind: ParamType::String, + indexed: false + }, + EventParam { + name: "newValue".to_string(), + kind: ParamType::String, + indexed: false + } + ], + anonymous: false + }, + event + ); + } +} diff --git a/ethers-core/src/abi/human_readable.rs b/ethers-core/src/abi/human_readable/mod.rs similarity index 99% rename from ethers-core/src/abi/human_readable.rs rename to ethers-core/src/abi/human_readable/mod.rs index 349b520b4b..65af6f655b 100644 --- a/ethers-core/src/abi/human_readable.rs +++ b/ethers-core/src/abi/human_readable/mod.rs @@ -6,6 +6,7 @@ use crate::abi::{ struct_def::{FieldType, StructFieldType}, Abi, Constructor, Event, EventParam, Function, Param, ParamType, SolStruct, StateMutability, }; +pub mod lexer; /// A parser that turns a "human readable abi" into a `Abi` pub struct AbiParser { diff --git a/ethers-core/src/abi/mod.rs b/ethers-core/src/abi/mod.rs index b4db858a20..196b20a024 100644 --- a/ethers-core/src/abi/mod.rs +++ b/ethers-core/src/abi/mod.rs @@ -20,7 +20,9 @@ mod error; pub use error::{AbiError, ParseError}; mod human_readable; -pub use human_readable::{parse as parse_abi, parse_str as parse_abi_str, AbiParser}; +pub use human_readable::{ + lexer::HumanReadableParser, parse as parse_abi, parse_str as parse_abi_str, AbiParser, +}; use crate::types::{H256, H512, I256, U128, U256, U64}; diff --git a/ethers-core/src/types/block.rs b/ethers-core/src/types/block.rs index cfe9d17993..4a24de838e 100644 --- a/ethers-core/src/types/block.rs +++ b/ethers-core/src/types/block.rs @@ -1,9 +1,16 @@ // Taken from -use crate::types::{Address, Bloom, Bytes, H256, U256, U64}; +use crate::types::{Address, Bloom, Bytes, Transaction, TxHash, H256, U256, U64}; +use chrono::{DateTime, TimeZone, Utc}; #[cfg(not(feature = "celo"))] use core::cmp::Ordering; -use serde::{ser::SerializeStruct, Deserialize, Deserializer, Serialize, Serializer}; -use std::str::FromStr; + +use serde::{ + de::{MapAccess, Visitor}, + ser::SerializeStruct, + Deserialize, Deserializer, Serialize, Serializer, +}; +use std::{fmt::Formatter, str::FromStr}; +use thiserror::Error; /// The block type returned from RPC calls. /// This is generic over a `TX` type which will be either the hash or the full transaction, @@ -19,9 +26,9 @@ pub struct Block { #[cfg(not(feature = "celo"))] #[serde(default, rename = "sha3Uncles")] pub uncles_hash: H256, - /// Miner/author's address. + /// Miner/author's address. None if pending. #[serde(default, rename = "miner")] - pub author: Address, + pub author: Option
, /// State root hash #[serde(default, rename = "stateRoot")] pub state_root: H256, @@ -91,6 +98,18 @@ pub struct Block { pub epoch_snark_data: Option, } +/// Error returned by [`Block::time`]. +#[derive(Clone, Copy, Debug, Error)] +pub enum TimeError { + /// Timestamp is zero. + #[error("timestamp is zero")] + TimestampZero, + + /// Timestamp is too large for [`DateTime`]. + #[error("timestamp is too large")] + TimestampOverflow, +} + // ref #[cfg(not(feature = "celo"))] pub const ELASTICITY_MULTIPLIER: U256 = U256([2u64, 0, 0, 0]); @@ -135,6 +154,229 @@ impl Block { Ordering::Equal => self.base_fee_per_gas, } } + + /// Parse [`Self::timestamp`] into a [`DateTime`]. + /// + /// # Errors + /// + /// * [`TimeError::TimestampZero`] if the timestamp is zero, or + /// * [`TimeError::TimestampOverflow`] if the timestamp is too large to be represented as a + /// [`DateTime`]. + pub fn time(&self) -> Result, TimeError> { + if self.timestamp.is_zero() { + return Err(TimeError::TimestampZero) + } + if self.timestamp.bits() > 63 { + return Err(TimeError::TimestampOverflow) + } + // Casting to i64 is safe because the timestamp is guaranteed to be less than 2^63. + // TODO: It would be nice if there was `TryInto for U256`. + let secs = self.timestamp.as_u64() as i64; + Ok(Utc.timestamp(secs, 0)) + } +} + +impl Block { + /// Converts this block that only holds transaction hashes into a full block with `Transaction` + pub fn into_full_block(self, transactions: Vec) -> Block { + #[cfg(not(feature = "celo"))] + { + let Block { + hash, + parent_hash, + uncles_hash, + author, + state_root, + transactions_root, + receipts_root, + number, + gas_used, + gas_limit, + extra_data, + logs_bloom, + timestamp, + difficulty, + total_difficulty, + seal_fields, + uncles, + size, + mix_hash, + nonce, + base_fee_per_gas, + .. + } = self; + Block { + hash, + parent_hash, + uncles_hash, + author, + state_root, + transactions_root, + receipts_root, + number, + gas_used, + gas_limit, + extra_data, + logs_bloom, + timestamp, + difficulty, + total_difficulty, + seal_fields, + uncles, + size, + mix_hash, + nonce, + base_fee_per_gas, + transactions, + } + } + + #[cfg(feature = "celo")] + { + let Block { + hash, + parent_hash, + author, + state_root, + transactions_root, + receipts_root, + number, + gas_used, + extra_data, + logs_bloom, + timestamp, + total_difficulty, + seal_fields, + size, + base_fee_per_gas, + randomness, + epoch_snark_data, + .. + } = self; + + Block { + hash, + parent_hash, + author, + state_root, + transactions_root, + receipts_root, + number, + gas_used, + extra_data, + logs_bloom, + timestamp, + total_difficulty, + seal_fields, + size, + base_fee_per_gas, + randomness, + epoch_snark_data, + transactions, + } + } + } +} + +impl From> for Block { + fn from(full: Block) -> Self { + #[cfg(not(feature = "celo"))] + { + let Block { + hash, + parent_hash, + uncles_hash, + author, + state_root, + transactions_root, + receipts_root, + number, + gas_used, + gas_limit, + extra_data, + logs_bloom, + timestamp, + difficulty, + total_difficulty, + seal_fields, + uncles, + transactions, + size, + mix_hash, + nonce, + base_fee_per_gas, + } = full; + Block { + hash, + parent_hash, + uncles_hash, + author, + state_root, + transactions_root, + receipts_root, + number, + gas_used, + gas_limit, + extra_data, + logs_bloom, + timestamp, + difficulty, + total_difficulty, + seal_fields, + uncles, + size, + mix_hash, + nonce, + base_fee_per_gas, + transactions: transactions.iter().map(|tx| tx.hash).collect(), + } + } + + #[cfg(feature = "celo")] + { + let Block { + hash, + parent_hash, + author, + state_root, + transactions_root, + receipts_root, + number, + gas_used, + extra_data, + logs_bloom, + timestamp, + total_difficulty, + seal_fields, + transactions, + size, + base_fee_per_gas, + randomness, + epoch_snark_data, + } = full; + + Block { + hash, + parent_hash, + author, + state_root, + transactions_root, + receipts_root, + number, + gas_used, + extra_data, + logs_bloom, + timestamp, + total_difficulty, + seal_fields, + size, + base_fee_per_gas, + randomness, + epoch_snark_data, + transactions: transactions.iter().map(|tx| tx.hash).collect(), + } + } + } } #[derive(Debug, Default, Clone, PartialEq, Deserialize, Serialize)] @@ -209,6 +451,67 @@ impl Serialize for BlockId { } } +impl<'de> Deserialize<'de> for BlockId { + fn deserialize(deserializer: D) -> Result + where + D: Deserializer<'de>, + { + struct BlockIdVisitor; + + impl<'de> Visitor<'de> for BlockIdVisitor { + type Value = BlockId; + + fn expecting(&self, formatter: &mut Formatter) -> std::fmt::Result { + formatter.write_str("Block identifier following EIP-1898") + } + + fn visit_str(self, v: &str) -> Result + where + E: serde::de::Error, + { + Ok(BlockId::Number(v.parse().map_err(serde::de::Error::custom)?)) + } + + fn visit_map(self, mut map: A) -> Result + where + A: MapAccess<'de>, + { + let mut number = None; + let mut hash = None; + + while let Some(key) = map.next_key::()? { + match key.as_str() { + "blockNumber" => { + if number.is_some() || hash.is_some() { + return Err(serde::de::Error::duplicate_field("blockNumber")) + } + number = Some(BlockId::Number(map.next_value::()?)) + } + "blockHash" => { + if number.is_some() || hash.is_some() { + return Err(serde::de::Error::duplicate_field("blockHash")) + } + hash = Some(BlockId::Hash(map.next_value::()?)) + } + key => { + return Err(serde::de::Error::unknown_field( + key, + &["blockNumber", "blockHash"], + )) + } + } + } + + number.or(hash).ok_or_else(|| { + serde::de::Error::custom("Expected `blockNumber` or `blockHash`") + }) + } + } + + deserializer.deserialize_any(BlockIdVisitor) + } +} + /// A block Number (or tag - "latest", "earliest", "pending") #[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)] pub enum BlockNumber { @@ -258,12 +561,21 @@ impl<'de> Deserialize<'de> for BlockNumber { D: Deserializer<'de>, { let s = String::deserialize(deserializer)?.to_lowercase(); - Ok(match s.as_str() { + s.parse().map_err(serde::de::Error::custom) + } +} + +impl FromStr for BlockNumber { + type Err = String; + + fn from_str(s: &str) -> Result { + let block = match s { "latest" => Self::Latest, "earliest" => Self::Earliest, "pending" => Self::Pending, - n => BlockNumber::Number(U64::from_str(n).map_err(serde::de::Error::custom)?), - }) + n => BlockNumber::Number(n.parse::().map_err(|err| err.to_string())?), + }; + Ok(block) } } @@ -273,6 +585,62 @@ mod tests { use super::*; use crate::types::{Transaction, TxHash}; + #[test] + fn can_parse_eip1898_block_ids() { + let num = serde_json::json!( + { "blockNumber": "0x0" } + ); + let id = serde_json::from_value::(num).unwrap(); + assert_eq!(id, BlockId::Number(BlockNumber::Number(0u64.into()))); + + let num = serde_json::json!( + { "blockNumber": "pending" } + ); + let id = serde_json::from_value::(num).unwrap(); + assert_eq!(id, BlockId::Number(BlockNumber::Pending)); + + let num = serde_json::json!( + { "blockNumber": "latest" } + ); + let id = serde_json::from_value::(num).unwrap(); + assert_eq!(id, BlockId::Number(BlockNumber::Latest)); + + let num = serde_json::json!( + { "blockNumber": "earliest" } + ); + let id = serde_json::from_value::(num).unwrap(); + assert_eq!(id, BlockId::Number(BlockNumber::Earliest)); + + let num = serde_json::json!("0x0"); + let id = serde_json::from_value::(num).unwrap(); + assert_eq!(id, BlockId::Number(BlockNumber::Number(0u64.into()))); + + let num = serde_json::json!("pending"); + let id = serde_json::from_value::(num).unwrap(); + assert_eq!(id, BlockId::Number(BlockNumber::Pending)); + + let num = serde_json::json!("latest"); + let id = serde_json::from_value::(num).unwrap(); + assert_eq!(id, BlockId::Number(BlockNumber::Latest)); + + let num = serde_json::json!("earliest"); + let id = serde_json::from_value::(num).unwrap(); + assert_eq!(id, BlockId::Number(BlockNumber::Earliest)); + + let num = serde_json::json!( + { "blockHash": "0xd4e56740f876aef8c010b86a40d5f56745a118d0906a34e69aec8c0db1cb8fa3" } + ); + let id = serde_json::from_value::(num).unwrap(); + assert_eq!( + id, + BlockId::Hash( + "0xd4e56740f876aef8c010b86a40d5f56745a118d0906a34e69aec8c0db1cb8fa3" + .parse() + .unwrap() + ) + ); + } + #[test] fn serde_block_number() { for b in &[BlockNumber::Latest, BlockNumber::Earliest, BlockNumber::Pending] { @@ -364,6 +732,39 @@ mod tests { // next block increasing base fee https://etherscan.io/block/14402713 assert_eq!(block_14402712.next_block_base_fee(), Some(U256::from(27_978_655_303u128))); } + + #[test] + fn pending_block() { + let json = serde_json::json!( + { + "baseFeePerGas": "0x3a460775a", + "difficulty": "0x329b1f81605a4a", + "extraData": "0xd983010a0d846765746889676f312e31362e3130856c696e7578", + "gasLimit": "0x1c950d9", + "gasUsed": "0x1386f81", + "hash": null, + "logsBloom": "0x5a3fc3425505bf83b1ebe6ffead1bbfdfcd6f9cfbd1e5fb7fbc9c96b1bbc2f2f6bfef959b511e4f0c7d3fbc60194fbff8bcff8e7b8f6ba9a9a956fe36473ed4deec3f1bc67f7dabe48f71afb377bdaa47f8f9bb1cd56930c7dfcbfddf283f9697fb1db7f3bedfa3e4dfd9fae4fb59df8ac5d9c369bff14efcee59997df8bb16d47d22f0bfbafb29fbfff6e1e41bca61e37e7bdfde1fe27b9fd3a7adfcb74fe98e6dbcc5f5bb3bd4d4bb6ccd29fd3bd446c7f38dcaf7ff78fb3f3aa668cbffe56291d7fbbebd2549fdfd9f223b3ba61dee9e92ebeb5dc967f711d039ff1cb3c3a8fb3b7cbdb29e6d1e79e6b95c596dfe2be36fd65a4f6fdeebe7efbe6e38037d7", + "miner": null, + "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "nonce": null, + "number": "0xe1a6ee", + "parentHash": "0xff1a940068dfe1f9e3f5514e6b7ff5092098d21d706396a9b19602f0f2b11d44", + "receiptsRoot": "0xe7df36675953a2d2dd22ec0e44ff59818891170875ebfba5a39f6c85084a6f10", + "sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", + "size": "0xd8d6", + "stateRoot": "0x2ed13b153d1467deb397a789aabccb287590579cf231bf4f1ff34ac3b4905ce2", + "timestamp": "0x6282b31e", + "totalDifficulty": null, + "transactions": [ + "0xaad0d53ae350dd06481b42cd097e3f3a4a31e0ac980fac4663b7dd913af20d9b" + ], + "transactionsRoot": "0xfc5c28cb82d5878172cd1b97429d44980d1cee03c782950ee73e83f1fa8bfb49", + "uncles": [] + } + ); + let block: Block = serde_json::from_value(json).unwrap(); + assert!(block.author.is_none()); + } } #[cfg(test)] diff --git a/ethers-core/src/types/chain.rs b/ethers-core/src/types/chain.rs index 5397e78fb7..1c8aa41d29 100644 --- a/ethers-core/src/types/chain.rs +++ b/ethers-core/src/types/chain.rs @@ -2,23 +2,26 @@ use serde::Deserialize; use thiserror::Error; use core::convert::TryFrom; -use std::{default, fmt, str::FromStr}; +use std::{convert::TryInto, default, fmt, str::FromStr}; use crate::types::U256; +use strum::EnumVariantNames; #[derive(Debug, Clone, Error)] #[error("Failed to parse chain: {0}")] pub struct ParseChainError(String); #[repr(u64)] -#[derive(Debug, Clone, Copy, Eq, PartialEq, Hash, Deserialize)] +#[derive(Debug, Clone, Copy, Eq, PartialEq, Hash, Deserialize, EnumVariantNames)] #[serde(rename_all = "snake_case")] +#[strum(serialize_all = "kebab-case")] pub enum Chain { Mainnet = 1, Ropsten = 3, Rinkeby = 4, Goerli = 5, Kovan = 42, + #[strum(serialize = "xdai")] XDai = 100, Polygon = 137, Fantom = 250, @@ -33,12 +36,14 @@ pub enum Chain { Moonriver = 1285, Optimism = 10, OptimismKovan = 69, - BinanceSmartChain = 56, - BinanceSmartChainTestnet = 97, Arbitrum = 42161, ArbitrumTestnet = 421611, Cronos = 25, CronosTestnet = 338, + #[strum(serialize = "bsc")] + BinanceSmartChain = 56, + #[strum(serialize = "bsc-testnet")] + BinanceSmartChainTestnet = 97, } impl fmt::Display for Chain { @@ -128,6 +133,17 @@ impl TryFrom for Chain { } } +impl TryFrom for Chain { + type Error = ParseChainError; + + fn try_from(chain: U256) -> Result { + if chain.bits() > 64 { + return Err(ParseChainError(chain.to_string())) + } + chain.as_u64().try_into() + } +} + impl FromStr for Chain { type Err = ParseChainError; fn from_str(chain: &str) -> Result { @@ -176,8 +192,7 @@ impl Chain { Chain::BinanceSmartChain | Chain::BinanceSmartChainTestnet | Chain::Arbitrum | - Chain::ArbitrumTestnet | - Chain::Cronos, + Chain::ArbitrumTestnet, ) } } diff --git a/ethers-core/src/types/log.rs b/ethers-core/src/types/log.rs index dd70fa7935..897584348f 100644 --- a/ethers-core/src/types/log.rs +++ b/ethers-core/src/types/log.rs @@ -1,6 +1,6 @@ // Adapted from https://github.com/tomusdrw/rust-web3/blob/master/src/types/log.rs use crate::{ - types::{Address, BlockNumber, Bytes, H256, U256, U64}, + types::{Address, BlockNumber, Bytes, H160, H256, U256, U64}, utils::keccak256, }; use serde::{ @@ -9,7 +9,7 @@ use serde::{ use std::ops::{Range, RangeFrom, RangeTo}; /// A log produced by a transaction. -#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)] pub struct Log { /// H160. the contract that emitted the log pub address: Address, @@ -306,7 +306,31 @@ impl Filter { self.block_option = self.block_option.set_hash(hash.into()); self } - + /// Sets the inner filter object + /// + /// *NOTE:* ranges are always inclusive + /// + /// # Examples + /// + /// Match only a specific address `("0xAc4b3DacB91461209Ae9d41EC517c2B9Cb1B7DAF")` + /// + /// ```rust + /// # use ethers_core::types::{Filter, Address}; + /// # fn main() { + /// let filter = Filter::new().address("0xAc4b3DacB91461209Ae9d41EC517c2B9Cb1B7DAF".parse::
().unwrap()); + /// # } + /// ``` + /// + /// Match all addresses in array `(vec!["0xAc4b3DacB91461209Ae9d41EC517c2B9Cb1B7DAF", + /// "0x8ad599c3A0ff1De082011EFDDc58f1908eb6e6D8"])` + /// + /// ```rust + /// # use ethers_core::types::{Filter, Address, ValueOrArray}; + /// # fn main() { + /// let addresses = vec!["0xAc4b3DacB91461209Ae9d41EC517c2B9Cb1B7DAF".parse::
().unwrap(),"0x8ad599c3A0ff1De082011EFDDc58f1908eb6e6D8".parse::
().unwrap()]; + /// let filter = Filter::new().address(addresses); + /// # } + /// ``` #[must_use] pub fn address>>(mut self, address: T) -> Self { self.address = Some(address.into()); @@ -360,6 +384,18 @@ pub enum ValueOrArray { // TODO: Implement more common types - or adjust this to work with all Tokenizable items +impl From for ValueOrArray { + fn from(src: H160) -> Self { + ValueOrArray::Value(src) + } +} + +impl From> for ValueOrArray { + fn from(src: Vec) -> Self { + ValueOrArray::Array(src) + } +} + impl From for ValueOrArray { fn from(src: H256) -> Self { ValueOrArray::Value(src) diff --git a/ethers-core/src/types/mod.rs b/ethers-core/src/types/mod.rs index 34dbbe36e1..b67ee2afb2 100644 --- a/ethers-core/src/types/mod.rs +++ b/ethers-core/src/types/mod.rs @@ -21,6 +21,9 @@ pub use address_or_bytes::AddressOrBytes; mod path_or_string; pub use path_or_string::PathOrString; +mod u256; +pub use u256::*; + mod i256; pub use i256::{Sign, I256}; @@ -28,7 +31,7 @@ mod bytes; pub use self::bytes::{deserialize_bytes, serialize_bytes, Bytes, ParseBytesError}; mod block; -pub use block::{Block, BlockId, BlockNumber}; +pub use block::{Block, BlockId, BlockNumber, TimeError}; #[cfg(feature = "celo")] pub use block::Randomness; diff --git a/ethers-core/src/types/transaction/eip1559.rs b/ethers-core/src/types/transaction/eip1559.rs index 2634ff1dfa..396e88da18 100644 --- a/ethers-core/src/types/transaction/eip1559.rs +++ b/ethers-core/src/types/transaction/eip1559.rs @@ -1,9 +1,6 @@ -use super::{decode_to, eip2930::AccessList, normalize_v, rlp_opt}; -use crate::{ - types::{ - Address, Bytes, NameOrAddress, Signature, SignatureError, Transaction, H256, U256, U64, - }, - utils::keccak256, +use super::{decode_to, eip2718::TypedTransaction, eip2930::AccessList, normalize_v, rlp_opt}; +use crate::types::{ + Address, Bytes, NameOrAddress, Signature, SignatureError, Transaction, U256, U64, }; use rlp::{Decodable, DecoderError, RlpStream}; use thiserror::Error; @@ -157,11 +154,6 @@ impl Eip1559TransactionRequest { self } - /// Hashes the transaction's data with the provided chain id - pub fn sighash(&self) -> H256 { - keccak256(self.rlp().as_ref()).into() - } - /// Gets the unsigned transaction's RLP encoding pub fn rlp(&self) -> Bytes { let mut rlp = RlpStream::new(); @@ -234,14 +226,14 @@ impl Eip1559TransactionRequest { let mut offset = 0; let mut txn = Self::decode_base_rlp(rlp, &mut offset)?; - let v = rlp.at(offset)?.as_val()?; + let v = rlp.val_at(offset)?; offset += 1; - let r = rlp.at(offset)?.as_val()?; + let r = rlp.val_at(offset)?; offset += 1; - let s = rlp.at(offset)?.as_val()?; + let s = rlp.val_at(offset)?; let sig = Signature { r, s, v }; - txn.from = Some(sig.recover(txn.sighash())?); + txn.from = Some(sig.recover(TypedTransaction::Eip1559(txn.clone()).sighash())?); Ok((txn, sig)) } diff --git a/ethers-core/src/types/transaction/eip2718.rs b/ethers-core/src/types/transaction/eip2718.rs index 92e08f1048..56fcfafae1 100644 --- a/ethers-core/src/types/transaction/eip2718.rs +++ b/ethers-core/src/types/transaction/eip2718.rs @@ -1,6 +1,6 @@ use super::{ eip1559::{Eip1559RequestError, Eip1559TransactionRequest}, - eip2930::{AccessList, Eip2930TransactionRequest}, + eip2930::{AccessList, Eip2930RequestError, Eip2930TransactionRequest}, request::RequestError, }; use crate::{ @@ -48,6 +48,9 @@ pub enum TypedTransactionError { /// When decoding a signed Eip1559 transaction #[error(transparent)] Eip1559Error(#[from] Eip1559RequestError), + /// When decoding a signed Eip2930 transaction + #[error(transparent)] + Eip2930Error(#[from] Eip2930RequestError), /// Error decoding the transaction type from the transaction's RLP encoding #[error(transparent)] TypeDecodingError(#[from] rlp::DecoderError), @@ -395,8 +398,128 @@ impl From<&Transaction> for TypedTransaction { } } +impl TypedTransaction { + pub fn as_legacy_ref(&self) -> Option<&TransactionRequest> { + match self { + Legacy(tx) => Some(tx), + _ => None, + } + } + pub fn as_eip2930_ref(&self) -> Option<&Eip2930TransactionRequest> { + match self { + Eip2930(tx) => Some(tx), + _ => None, + } + } + pub fn as_eip1559_ref(&self) -> Option<&Eip1559TransactionRequest> { + match self { + Eip1559(tx) => Some(tx), + _ => None, + } + } +} + +impl TypedTransaction { + fn into_eip1559(self) -> Eip1559TransactionRequest { + match self { + Eip1559(tx) => tx, + _ => Eip1559TransactionRequest { + from: self.from().copied(), + to: self.to().cloned(), + nonce: self.nonce().copied(), + value: self.value().copied(), + gas: self.gas().copied(), + chain_id: self.chain_id(), + data: self.data().cloned(), + access_list: self.access_list().cloned().unwrap_or_default(), + ..Default::default() + }, + } + } +} + +impl From for Eip1559TransactionRequest { + fn from(src: TypedTransaction) -> Eip1559TransactionRequest { + src.into_eip1559() + } +} + +impl TypedTransaction { + fn into_legacy(self) -> TransactionRequest { + match self { + Legacy(tx) => tx, + Eip2930(tx) => tx.tx, + Eip1559(_) => TransactionRequest { + from: self.from().copied(), + to: self.to().cloned(), + nonce: self.nonce().copied(), + value: self.value().copied(), + gas: self.gas().copied(), + gas_price: self.gas_price(), + chain_id: self.chain_id(), + data: self.data().cloned(), + #[cfg(feature = "celo")] + #[cfg_attr(docsrs, doc(cfg(feature = "celo")))] + fee_currency: None, + #[cfg(feature = "celo")] + #[cfg_attr(docsrs, doc(cfg(feature = "celo")))] + gateway_fee_recipient: None, + #[cfg(feature = "celo")] + #[cfg_attr(docsrs, doc(cfg(feature = "celo")))] + gateway_fee: None, + }, + } + } +} + +impl From for TransactionRequest { + fn from(src: TypedTransaction) -> TransactionRequest { + src.into_legacy() + } +} + +impl TypedTransaction { + fn into_eip2930(self) -> Eip2930TransactionRequest { + let access_list = self.access_list().cloned().unwrap_or_default(); + + match self { + Eip2930(tx) => tx, + Legacy(tx) => Eip2930TransactionRequest { tx, access_list }, + Eip1559(_) => Eip2930TransactionRequest { + tx: TransactionRequest { + from: self.from().copied(), + to: self.to().cloned(), + nonce: self.nonce().copied(), + value: self.value().copied(), + gas: self.gas().copied(), + gas_price: self.gas_price(), + chain_id: self.chain_id(), + data: self.data().cloned(), + #[cfg(feature = "celo")] + #[cfg_attr(docsrs, doc(cfg(feature = "celo")))] + fee_currency: None, + #[cfg(feature = "celo")] + #[cfg_attr(docsrs, doc(cfg(feature = "celo")))] + gateway_fee_recipient: None, + #[cfg(feature = "celo")] + #[cfg_attr(docsrs, doc(cfg(feature = "celo")))] + gateway_fee: None, + }, + access_list, + }, + } + } +} + +impl From for Eip2930TransactionRequest { + fn from(src: TypedTransaction) -> Eip2930TransactionRequest { + src.into_eip2930() + } +} + #[cfg(test)] mod tests { + use hex::ToHex; use rlp::Decodable; use super::*; @@ -501,7 +624,7 @@ mod tests { #[test] fn test_signed_tx_decode() { let expected_tx = Eip1559TransactionRequest::new() - .from(Address::from_str("0x27519a1d088898e04b12f9fb9733267a5e61481e").unwrap()) + .from(Address::from_str("0x1acadd971da208d25122b645b2ef879868a83e21").unwrap()) .chain_id(1u64) .nonce(0u64) .max_priority_fee_per_gas(413047990155u64) @@ -553,4 +676,98 @@ mod tests { let tx_rlp = rlp::Rlp::new(typed_tx_hex.as_slice()); TypedTransaction::decode(&tx_rlp).unwrap(); } + + #[test] + fn test_signed_tx_decode_all_fields() { + let typed_tx_hex = hex::decode("02f90188052b85012a05f20085012a05f2148301b3cd8080b9012d608060405234801561001057600080fd5b5061010d806100206000396000f3fe6080604052348015600f57600080fd5b506004361060325760003560e01c8063cfae3217146037578063f8a8fd6d146066575b600080fd5b604080518082019091526003815262676d2160e81b60208201525b604051605d91906085565b60405180910390f35b6040805180820190915260048152636f6f662160e01b60208201526052565b600060208083528351808285015260005b8181101560b0578581018301518582016040015282016096565b8181111560c1576000604083870101525b50601f01601f191692909201604001939250505056fea2646970667358221220f89093a9819ba5d2a3384305511d0945ea94f36a8aa162ab62921b3841fe3afd64736f6c634300080c0033c080a08085850e935fd6af9ace1b0343b9e21d2dcc7e914c36cce61a4e32756c785980a04c57c184d5096263df981cb8a2f2c7f81640792856909dbf3295a2b7a1dc4a55").unwrap(); + let tx_rlp = rlp::Rlp::new(typed_tx_hex.as_slice()); + let (tx, sig) = TypedTransaction::decode_signed(&tx_rlp).unwrap(); + + let tx = match tx { + TypedTransaction::Eip1559(tx) => tx, + _ => panic!("The raw bytes should decode to an EIP1559 tranaction"), + }; + + // pre-sighash fields - if a value here is incorrect it will show up before the sighash + // and from asserts fail + let data = Bytes::from_str("0x608060405234801561001057600080fd5b5061010d806100206000396000f3fe6080604052348015600f57600080fd5b506004361060325760003560e01c8063cfae3217146037578063f8a8fd6d146066575b600080fd5b604080518082019091526003815262676d2160e81b60208201525b604051605d91906085565b60405180910390f35b6040805180820190915260048152636f6f662160e01b60208201526052565b600060208083528351808285015260005b8181101560b0578581018301518582016040015282016096565b8181111560c1576000604083870101525b50601f01601f191692909201604001939250505056fea2646970667358221220f89093a9819ba5d2a3384305511d0945ea94f36a8aa162ab62921b3841fe3afd64736f6c634300080c0033").unwrap(); + assert_eq!(&data, tx.data.as_ref().unwrap()); + + let chain_id = U64::from(5u64); + assert_eq!(chain_id, tx.chain_id.unwrap()); + + let nonce = Some(43u64.into()); + assert_eq!(nonce, tx.nonce); + + let max_fee_per_gas = Some(5000000020u64.into()); + assert_eq!(max_fee_per_gas, tx.max_fee_per_gas); + + let max_priority_fee_per_gas = Some(5000000000u64.into()); + assert_eq!(max_priority_fee_per_gas, tx.max_priority_fee_per_gas); + + let gas = Some(111565u64.into()); + assert_eq!(gas, tx.gas); + + // empty fields + assert_eq!(None, tx.to); + assert_eq!(AccessList(vec![]), tx.access_list); + + // compare rlp - sighash should then be the same + let tx_expected_rlp = "f90145052b85012a05f20085012a05f2148301b3cd8080b9012d608060405234801561001057600080fd5b5061010d806100206000396000f3fe6080604052348015600f57600080fd5b506004361060325760003560e01c8063cfae3217146037578063f8a8fd6d146066575b600080fd5b604080518082019091526003815262676d2160e81b60208201525b604051605d91906085565b60405180910390f35b6040805180820190915260048152636f6f662160e01b60208201526052565b600060208083528351808285015260005b8181101560b0578581018301518582016040015282016096565b8181111560c1576000604083870101525b50601f01601f191692909201604001939250505056fea2646970667358221220f89093a9819ba5d2a3384305511d0945ea94f36a8aa162ab62921b3841fe3afd64736f6c634300080c0033c0"; + let tx_real_rlp_vec = tx.rlp().to_vec(); + let tx_real_rlp: String = tx_real_rlp_vec.encode_hex(); + assert_eq!(tx_expected_rlp, tx_real_rlp); + + let r = + U256::from_str("0x8085850e935fd6af9ace1b0343b9e21d2dcc7e914c36cce61a4e32756c785980") + .unwrap(); + let s = + U256::from_str("0x4c57c184d5096263df981cb8a2f2c7f81640792856909dbf3295a2b7a1dc4a55") + .unwrap(); + let v = 0; + assert_eq!(r, sig.r); + assert_eq!(s, sig.s); + assert_eq!(v, sig.v); + + // finally check from + let addr = Address::from_str("0x216b32eCEbAe6aF164921D3943cd7A9634FcB199").unwrap(); + assert_eq!(addr, tx.from.unwrap()); + } + + #[test] + fn test_tx_casts() { + // eip1559 tx + let typed_tx_hex = hex::decode("02f86b8205390284773594008477359400830186a09496216849c49358b10257cb55b28ea603c874b05e865af3107a4000825544f838f7940000000000000000000000000000000000000001e1a00100000000000000000000000000000000000000000000000000000000000000").unwrap(); + let tx_rlp = rlp::Rlp::new(typed_tx_hex.as_slice()); + let tx = TypedTransaction::decode(&tx_rlp).unwrap(); + + { + let typed_tx: TypedTransaction = tx.clone().into(); + + let tx0: TransactionRequest = typed_tx.clone().into(); + assert!(typed_tx.as_legacy_ref().is_none()); + + let tx1 = typed_tx.into_legacy(); + + assert_eq!(tx0, tx1); + } + { + let typed_tx: TypedTransaction = tx.clone().into(); + let tx0: Eip1559TransactionRequest = typed_tx.clone().into(); + assert_eq!(tx.as_eip1559_ref().unwrap(), &tx0); + + let tx1 = typed_tx.into_eip1559(); + + assert_eq!(tx0, tx1); + } + { + let typed_tx: TypedTransaction = tx.clone().into(); + let tx0: Eip2930TransactionRequest = typed_tx.clone().into(); + assert!(typed_tx.as_eip2930_ref().is_none()); + + let tx1 = typed_tx.into_eip2930(); + + assert_eq!(tx0, tx1); + } + } } diff --git a/ethers-core/src/types/transaction/eip2930.rs b/ethers-core/src/types/transaction/eip2930.rs index 31581826ad..3defdad65b 100644 --- a/ethers-core/src/types/transaction/eip2930.rs +++ b/ethers-core/src/types/transaction/eip2930.rs @@ -1,8 +1,11 @@ -use super::{extract_chain_id, normalize_v}; -use crate::types::{Address, Bytes, Signature, Transaction, TransactionRequest, H256, U256, U64}; -use rlp::{Decodable, DecoderError, RlpStream}; +use super::{eip2718::TypedTransaction, normalize_v}; +use crate::types::{ + Address, Bytes, Signature, SignatureError, Transaction, TransactionRequest, H256, U256, U64, +}; +use rlp::{Decodable, RlpStream}; use rlp_derive::{RlpDecodable, RlpDecodableWrapper, RlpEncodable, RlpEncodableWrapper}; use serde::{Deserialize, Serialize}; +use thiserror::Error; const NUM_EIP2930_FIELDS: usize = 8; @@ -58,6 +61,17 @@ pub struct AccessListItem { pub storage_keys: Vec, } +/// An error involving an EIP2930 transaction request. +#[derive(Debug, Error)] +pub enum Eip2930RequestError { + /// When decoding a transaction request from RLP + #[error(transparent)] + DecodingError(#[from] rlp::DecoderError), + /// When recovering the address from a signature + #[error(transparent)] + RecoveryError(#[from] SignatureError), +} + /// An EIP-2930 transaction is a legacy transaction including an [`AccessList`]. #[derive(Clone, Serialize, Deserialize, PartialEq, Debug)] pub struct Eip2930TransactionRequest { @@ -104,28 +118,36 @@ impl Eip2930TransactionRequest { } /// Decodes fields based on the RLP offset passed. - fn decode_base_rlp(rlp: &rlp::Rlp, offset: &mut usize) -> Result { - let request = TransactionRequest::decode_unsigned_rlp_base(rlp, offset)?; - let access_list = rlp.val_at(*offset)?; + fn decode_base_rlp(rlp: &rlp::Rlp, offset: &mut usize) -> Result { + let chain_id: u64 = rlp.val_at(*offset)?; + *offset += 1; + + let mut request = TransactionRequest::decode_unsigned_rlp_base(rlp, offset)?; + request.chain_id = Some(U64::from(chain_id)); + + let al = rlp::Rlp::new(rlp.at(*offset)?.as_raw()).data()?; + let access_list = match al.len() { + 0 => AccessList(vec![]), + _ => rlp.val_at(*offset)?, + }; *offset += 1; Ok(Self { tx: request, access_list }) } /// Decodes the given RLP into a transaction, attempting to decode its signature as well. - pub fn decode_signed_rlp(rlp: &rlp::Rlp) -> Result<(Self, Signature), rlp::DecoderError> { + pub fn decode_signed_rlp(rlp: &rlp::Rlp) -> Result<(Self, Signature), Eip2930RequestError> { let mut offset = 0; let mut txn = Self::decode_base_rlp(rlp, &mut offset)?; - let v = rlp.at(offset)?.as_val()?; - // populate chainid from v - txn.tx.chain_id = extract_chain_id(v); + let v = rlp.val_at(offset)?; offset += 1; - let r = rlp.at(offset)?.as_val()?; + let r = rlp.val_at(offset)?; offset += 1; - let s = rlp.at(offset)?.as_val()?; + let s = rlp.val_at(offset)?; let sig = Signature { r, s, v }; + txn.tx.from = Some(sig.recover(TypedTransaction::Eip2930(txn.clone()).sighash())?); Ok((txn, sig)) } } @@ -151,6 +173,7 @@ mod tests { use super::*; use crate::types::{transaction::eip2718::TypedTransaction, U256}; + use std::str::FromStr; #[test] #[cfg_attr(feature = "celo", ignore)] @@ -198,4 +221,84 @@ mod tests { let de: Eip2930TransactionRequest = serde_json::from_str(&serialized).unwrap(); assert_eq!(tx, TypedTransaction::Eip2930(de)); } + + #[test] + #[cfg_attr(feature = "celo", ignore)] + fn decoding_eip2930_signed() { + let raw_tx = hex::decode("01f901ef018209068508d8f9fc0083124f8094f5b4f13bdbe12709bd3ea280ebf4b936e99b20f280b90184c5d404940000000000000000000000000000000000000000000000000c4d67a76e15d8190000000000000000000000000000000000000000000000000029d9d8fb7440000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000020000000000000000000000007b73644935b8e68019ac6356c40661e1bc315860000000000000000000000000761d38e5ddf6ccf6cf7c55759d5210750b5d60f30000000000000000000000000000000000000000000000000000000000000000000000000000000000000000381fe4eb128db1621647ca00965da3f9e09f4fac000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000000000000000000000000000000000000000000ac001a0881e7f5298290794bcaa0294986db5c375cbf135dd3c21456b159c470568b687a061fc5f52abab723053fbedf29e1c60b89006416d6c86e1c54ef85a3e84f2dc6e").unwrap(); + let expected_tx = TransactionRequest::new() + .chain_id(1u64) + .nonce(2310u64) + .gas_price(38_000_000_000u64) + .gas(1_200_000u64) + .to(Address::from_str("0xf5b4f13bdbe12709bd3ea280ebf4b936e99b20f2").unwrap()) + .value(0u64) + .data(hex::decode("c5d404940000000000000000000000000000000000000000000000000c4d67a76e15d8190000000000000000000000000000000000000000000000000029d9d8fb7440000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000020000000000000000000000007b73644935b8e68019ac6356c40661e1bc315860000000000000000000000000761d38e5ddf6ccf6cf7c55759d5210750b5d60f30000000000000000000000000000000000000000000000000000000000000000000000000000000000000000381fe4eb128db1621647ca00965da3f9e09f4fac000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000000000000000000000000000000000000000000a").unwrap()) + .from(Address::from_str("0x82a33964706683db62b85a59128ce2fc07c91658").unwrap()) + .with_access_list(AccessList(vec![])); + let r = + U256::from_str("0x881e7f5298290794bcaa0294986db5c375cbf135dd3c21456b159c470568b687") + .unwrap(); + let s = + U256::from_str("0x61fc5f52abab723053fbedf29e1c60b89006416d6c86e1c54ef85a3e84f2dc6e") + .unwrap(); + let v = 1; + let expected_sig = Signature { r, s, v }; + + let raw_tx_rlp = rlp::Rlp::new(&raw_tx[..]); + + let (real_tx, real_sig) = TypedTransaction::decode_signed(&raw_tx_rlp).unwrap(); + let real_tx = match real_tx { + TypedTransaction::Eip2930(tx) => tx, + _ => panic!("The raw bytes should decode to an EIP2930 tranaction"), + }; + + assert_eq!(expected_tx, real_tx); + assert_eq!(expected_sig, real_sig); + } + + #[test] + #[cfg_attr(feature = "celo", ignore)] + fn decoding_eip2930_with_access_list() { + let raw_tx = hex::decode("01f90126018223ff850a02ffee00830f4240940000000000a8fb09af944ab3baf7a9b3e1ab29d880b876200200001525000000000b69ffb300000000557b933a7c2c45672b610f8954a3deb39a51a8cae53ec727dbdeb9e2d5456c3be40cff031ab40a55724d5c9c618a2152e99a45649a3b8cf198321f46720b722f4ec38f99ba3bb1303258d2e816e6a95b25647e01bd0967c1b9599fa3521939871d1d0888f845d694724d5c9c618a2152e99a45649a3b8cf198321f46c0d694720b722f4ec38f99ba3bb1303258d2e816e6a95bc0d69425647e01bd0967c1b9599fa3521939871d1d0888c001a08323efae7b9993bd31a58da7924359d24b5504aa2b33194fcc5ae206e65d2e62a054ce201e3b4b5cd38eb17c56ee2f9111b2e164efcd57b3e70fa308a0a51f7014").unwrap(); + let expected_tx = TransactionRequest::new() + .chain_id(1u64) + .nonce(9215u64) + .gas_price(43_000_000_000u64) + .gas(1_000_000) + .to(Address::from_str("0x0000000000a8fb09af944ab3baf7a9b3e1ab29d8").unwrap()) + .value(0) + .data(Bytes::from_str("0x200200001525000000000b69ffb300000000557b933a7c2c45672b610f8954a3deb39a51a8cae53ec727dbdeb9e2d5456c3be40cff031ab40a55724d5c9c618a2152e99a45649a3b8cf198321f46720b722f4ec38f99ba3bb1303258d2e816e6a95b25647e01bd0967c1b9599fa3521939871d1d0888").unwrap()) + .from(Address::from_str("0xe9c790e8fde820ded558a4771b72eec916c04763").unwrap()) + .with_access_list(AccessList(vec![ + AccessListItem { + address: Address::from_str("0x724d5c9c618a2152e99a45649a3b8cf198321f46").unwrap(), + storage_keys: vec![], + }, + AccessListItem { + address: Address::from_str("0x720b722f4ec38f99ba3bb1303258d2e816e6a95b").unwrap(), + storage_keys: vec![], + }, + AccessListItem { + address: Address::from_str("0x25647e01bd0967c1b9599fa3521939871d1d0888").unwrap(), + storage_keys: vec![], + }, + ])); + let expected_sig = Signature { + r: "0x8323efae7b9993bd31a58da7924359d24b5504aa2b33194fcc5ae206e65d2e62".into(), + s: "0x54ce201e3b4b5cd38eb17c56ee2f9111b2e164efcd57b3e70fa308a0a51f7014".into(), + v: 1u64, + }; + + let raw_tx_rlp = rlp::Rlp::new(&raw_tx[..]); + + let (real_tx, real_sig) = TypedTransaction::decode_signed(&raw_tx_rlp).unwrap(); + let real_tx = match real_tx { + TypedTransaction::Eip2930(tx) => tx, + _ => panic!("The raw bytes should decode to an EIP2930 tranaction"), + }; + + assert_eq!(expected_tx, real_tx); + assert_eq!(expected_sig, real_sig); + } } diff --git a/ethers-core/src/types/transaction/request.rs b/ethers-core/src/types/transaction/request.rs index fd0a1359d3..03712b844f 100644 --- a/ethers-core/src/types/transaction/request.rs +++ b/ethers-core/src/types/transaction/request.rs @@ -250,15 +250,14 @@ impl TransactionRequest { let mut offset = 0; let mut txn = Self::decode_unsigned_rlp_base(rlp, &mut offset)?; - // If a signed transaction is passed to this method, the chainid would be set to the v value - // of the signature. - if let Ok(chainid) = rlp.at(offset)?.as_val() { + // If the transaction includes more info, like the chainid, as we serialize in `rlp`, this + // will decode that value. + if let Ok(chainid) = rlp.val_at(offset) { + // If a signed transaction is passed to this method, the chainid would be set to the v + // value of the signature. txn.chain_id = Some(chainid); } - // parse the last two elements so we return an error if a signed transaction is passed - let _first_zero: u8 = rlp.at(offset + 1)?.as_val()?; - let _second_zero: u8 = rlp.at(offset + 2)?.as_val()?; Ok(txn) } @@ -351,7 +350,7 @@ impl TransactionRequest { #[cfg(test)] #[cfg(not(feature = "celo"))] mod tests { - use crate::types::{NameOrAddress, Signature}; + use crate::types::{Bytes, NameOrAddress, Signature}; use rlp::{Decodable, Rlp}; use super::{Address, TransactionRequest, U256, U64}; @@ -429,6 +428,31 @@ mod tests { assert_eq!(got_tx.sighash(), tx.sighash()); } + #[test] + fn decode_unsigned_rlp_no_chainid() { + // unlike the corresponding transaction + // 0x02c563d96acaf8c157d08db2228c84836faaf3dd513fc959a54ed4ca6c72573e, this doesn't have a + // `from` field because the `from` field is only obtained via signature recovery + let expected_tx = TransactionRequest::new() + .to(Address::from_str("0xc7696b27830dd8aa4823a1cba8440c27c36adec4").unwrap()) + .gas(3_000_000) + .gas_price(20_000_000_000u64) + .value(0) + .nonce(6306u64) + .data( + Bytes::from_str( + "0x91b7f5ed0000000000000000000000000000000000000000000000000000000000000372", + ) + .unwrap(), + ); + + // manually stripped the signature off the end and modified length + let expected_rlp = hex::decode("f8488218a28504a817c800832dc6c094c7696b27830dd8aa4823a1cba8440c27c36adec480a491b7f5ed0000000000000000000000000000000000000000000000000000000000000372").unwrap(); + let real_tx = TransactionRequest::decode(&Rlp::new(&expected_rlp)).unwrap(); + + assert_eq!(real_tx, expected_tx); + } + #[test] fn test_eip155_encode() { let tx = TransactionRequest::new() diff --git a/ethers-core/src/types/transaction/response.rs b/ethers-core/src/types/transaction/response.rs index 2968dc713e..b30e89b3d1 100644 --- a/ethers-core/src/types/transaction/response.rs +++ b/ethers-core/src/types/transaction/response.rs @@ -384,6 +384,10 @@ pub struct TransactionReceipt { /// Number of the block this transaction was included within. #[serde(rename = "blockNumber")] pub block_number: Option, + /// address of the sender. + pub from: Address, + // address of the receiver. null when its a contract creation transaction. + pub to: Option
, /// Cumulative gas used within the block after this was executed. #[serde(rename = "cumulativeGasUsed")] pub cumulative_gas_used: U256, @@ -752,4 +756,56 @@ mod tests { assert_eq!(tx.hash, tx.hash()); assert_eq!(tx.from, tx.recover_from().unwrap()); } + + #[test] + fn decode_transaction_receipt() { + let _res: TransactionReceipt = serde_json::from_str( + r#"{ + "transactionHash": "0xa3ece39ae137617669c6933b7578b94e705e765683f260fcfe30eaa41932610f", + "blockHash": "0xf6084155ff2022773b22df3217d16e9df53cbc42689b27ca4789e06b6339beb2", + "blockNumber": "0x52a975", + "contractAddress": null, + "cumulativeGasUsed": "0x797db0", + "from": "0xd907941c8b3b966546fc408b8c942eb10a4f98df", + "gasUsed": "0x1308c", + "logs": [ + { + "blockHash": "0xf6084155ff2022773b22df3217d16e9df53cbc42689b27ca4789e06b6339beb2", + "address": "0xd6df5935cd03a768b7b9e92637a01b25e24cb709", + "logIndex": "0x119", + "data": "0x0000000000000000000000000000000000000000000000000000008bb2c97000", + "removed": false, + "topics": [ + "0x8940c4b8e215f8822c5c8f0056c12652c746cbc57eedbd2a440b175971d47a77", + "0x000000000000000000000000d907941c8b3b966546fc408b8c942eb10a4f98df" + ], + "blockNumber": "0x52a975", + "transactionIndex": "0x29", + "transactionHash": "0xa3ece39ae137617669c6933b7578b94e705e765683f260fcfe30eaa41932610f" + }, + { + "blockHash": "0xf6084155ff2022773b22df3217d16e9df53cbc42689b27ca4789e06b6339beb2", + "address": "0xd6df5935cd03a768b7b9e92637a01b25e24cb709", + "logIndex": "0x11a", + "data": "0x0000000000000000000000000000000000000000000000000000008bb2c97000", + "removed": false, + "topics": [ + "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000d907941c8b3b966546fc408b8c942eb10a4f98df" + ], + "blockNumber": "0x52a975", + "transactionIndex": "0x29", + "transactionHash": "0xa3ece39ae137617669c6933b7578b94e705e765683f260fcfe30eaa41932610f" + } + ], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000020000000000000000000800000000000000004010000010100000000000000000000000000000000000000000000000000040000080000000000000080000000000000000000000000000000000000000000020000000000000000000000002000000000000000000000000000000000000000000000000000020000000010000000000000000000000000000000000000000000000000000000000", + "root": null, + "status": "0x1", + "to": "0xd6df5935cd03a768b7b9e92637a01b25e24cb709", + "transactionIndex": "0x29" + }"#, + ) + .unwrap(); + } } diff --git a/ethers-core/src/types/u256.rs b/ethers-core/src/types/u256.rs new file mode 100644 index 0000000000..6d3187ffa2 --- /dev/null +++ b/ethers-core/src/types/u256.rs @@ -0,0 +1,121 @@ +use ethabi::ethereum_types::U256; + +/// Convert a floating point value to its nearest f64 integer. +/// +/// It is saturating, so values $\ge 2^{256}$ will be rounded +/// to [`U256::max_value()`] and values $< 0$ to zero. This includes +/// positive and negative infinity. +/// +/// TODO: Move to ethabi::ethereum_types::U256. +/// TODO: Add [`super::I256`] version. +/// +/// # Panics +/// +/// Panics if `f` is NaN. +pub fn u256_from_f64_saturating(mut f: f64) -> U256 { + if f.is_nan() { + panic!("NaN is not a valid value for U256"); + } + if f < 0.5 { + return U256::zero() + } + if f >= 1.157_920_892_373_162e77_f64 { + return U256::max_value() + } + // All non-normal cases should have been handled above + assert!(f.is_normal()); + // Turn nearest rounding into truncated rounding + f += 0.5; + + // Parse IEEE-754 double into U256 + // Sign should be zero, exponent should be >= 0. + let bits = f.to_bits(); + let sign = bits >> 63; + assert!(sign == 0); + let biased_exponent = (bits >> 52) & 0x7ff; + assert!(biased_exponent >= 1023); + let exponent = biased_exponent - 1023; + let fraction = bits & 0xfffffffffffff; + let mantissa = 0x10000000000000 | fraction; + if exponent > 255 { + U256::max_value() + } else if exponent < 52 { + // Truncate mantissa + U256([mantissa, 0, 0, 0]) >> (52 - exponent) + } else { + U256([mantissa, 0, 0, 0]) << (exponent - 52) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use std::f64; + + #[test] + fn test_small_integers() { + for i in 0..=255 { + let f = i as f64; + let u = u256_from_f64_saturating(f); + assert_eq!(u, U256::from(i)); + } + } + + #[test] + fn test_small_integers_round_down() { + for i in 0..=255 { + let f = (i as f64) + 0.499; + let u = u256_from_f64_saturating(f); + assert_eq!(u, U256::from(i)); + } + } + + #[test] + fn test_small_integers_round_up() { + for i in 0..=255 { + let f = (i as f64) - 0.5; + let u = u256_from_f64_saturating(f); + assert_eq!(u, U256::from(i)); + } + } + + #[test] + fn test_infinities() { + assert_eq!(u256_from_f64_saturating(f64::INFINITY), U256::max_value()); + assert_eq!(u256_from_f64_saturating(f64::NEG_INFINITY), U256::zero()); + } + + #[test] + fn test_saturating() { + assert_eq!(u256_from_f64_saturating(-1.0), U256::zero()); + assert_eq!(u256_from_f64_saturating(1e90_f64), U256::max_value()); + } + + #[test] + fn test_large() { + // Check with e.g. `python3 -c 'print(int(1.0e36))'` + assert_eq!( + u256_from_f64_saturating(1.0e36_f64), + U256::from_dec_str("1000000000000000042420637374017961984").unwrap() + ); + assert_eq!( + u256_from_f64_saturating(f64::consts::PI * 2.0e60_f64), + U256::from_dec_str("6283185307179586084560863929317662625677330590403879287914496") + .unwrap() + ); + assert_eq!( + u256_from_f64_saturating(5.78960446186581e76_f64), + U256::from_dec_str( + "57896044618658097711785492504343953926634992332820282019728792003956564819968" + ) + .unwrap() + ); + assert_eq!( + u256_from_f64_saturating(1.157920892373161e77_f64), + U256::from_dec_str( + "115792089237316105435040506505232477503392813560534822796089932171514352762880" + ) + .unwrap() + ); + } +} diff --git a/ethers-core/src/utils/anvil.rs b/ethers-core/src/utils/anvil.rs new file mode 100644 index 0000000000..37a15ebd4b --- /dev/null +++ b/ethers-core/src/utils/anvil.rs @@ -0,0 +1,217 @@ +use crate::{ + types::Address, + utils::{secret_key_to_address, unused_port}, +}; +use k256::{ecdsa::SigningKey, SecretKey as K256SecretKey}; +use std::{ + io::{BufRead, BufReader}, + process::{Child, Command}, + time::{Duration, Instant}, +}; + +/// How long we will wait for anvil to indicate that it is ready. +const ANVIL_STARTUP_TIMEOUT_MILLIS: u64 = 5_000; + +/// An anvil CLI instance. Will close the instance when dropped. +/// +/// Construct this using [`Anvil`](crate::utils::Anvil) +pub struct AnvilInstance { + pid: Child, + private_keys: Vec, + addresses: Vec
, + port: u16, +} + +impl AnvilInstance { + /// Returns the private keys used to instantiate this instance + pub fn keys(&self) -> &[K256SecretKey] { + &self.private_keys + } + + /// Returns the addresses used to instantiate this instance + pub fn addresses(&self) -> &[Address] { + &self.addresses + } + + /// Returns the port of this instance + pub fn port(&self) -> u16 { + self.port + } + + /// Returns the HTTP endpoint of this instance + pub fn endpoint(&self) -> String { + format!("http://localhost:{}", self.port) + } + + /// Returns the Websocket endpoint of this instance + pub fn ws_endpoint(&self) -> String { + format!("ws://localhost:{}", self.port) + } +} + +impl Drop for AnvilInstance { + fn drop(&mut self) { + self.pid.kill().expect("could not kill anvil"); + } +} + +/// Builder for launching `anvil`. +/// +/// # Panics +/// +/// If `spawn` is called without `anvil` being available in the user's $PATH +/// +/// # Example +/// +/// ```no_run +/// use ethers_core::utils::Anvil; +/// +/// let port = 8545u16; +/// let url = format!("http://localhost:{}", port).to_string(); +/// +/// let anvil = Anvil::new() +/// .port(port) +/// .mnemonic("abstract vacuum mammal awkward pudding scene penalty purchase dinner depart evoke puzzle") +/// .spawn(); +/// +/// drop(anvil); // this will kill the instance +/// ``` +#[derive(Debug, Clone, Default)] +pub struct Anvil { + port: Option, + block_time: Option, + mnemonic: Option, + fork: Option, + args: Vec, +} + +impl Anvil { + /// Creates an empty Anvil builder. + /// The default port is 8545. The mnemonic is chosen randomly. + pub fn new() -> Self { + Self::default() + } + + /// Sets the port which will be used when the `anvil` instance is launched. + #[must_use] + pub fn port>(mut self, port: T) -> Self { + self.port = Some(port.into()); + self + } + + /// Sets the mnemonic which will be used when the `anvil` instance is launched. + #[must_use] + pub fn mnemonic>(mut self, mnemonic: T) -> Self { + self.mnemonic = Some(mnemonic.into()); + self + } + + /// Sets the block-time which will be used when the `anvil` instance is launched. + #[must_use] + pub fn block_time>(mut self, block_time: T) -> Self { + self.block_time = Some(block_time.into()); + self + } + + /// Sets the `fork` argument to fork from another currently running Ethereum client + /// at a given block. Input should be the HTTP location and port of the other client, + /// e.g. `http://localhost:8545`. You can optionally specify the block to fork from + /// using an @ sign: `http://localhost:8545@1599200` + #[must_use] + pub fn fork>(mut self, fork: T) -> Self { + self.fork = Some(fork.into()); + self + } + + /// Adds an argument to pass to the `anvil`. + #[must_use] + pub fn arg>(mut self, arg: T) -> Self { + self.args.push(arg.into()); + self + } + + /// Adds multiple arguments to pass to the `anvil`. + #[must_use] + pub fn args(mut self, args: I) -> Self + where + I: IntoIterator, + S: Into, + { + for arg in args { + self = self.arg(arg); + } + self + } + + /// Consumes the builder and spawns `anvil` with stdout redirected + /// to /dev/null. + pub fn spawn(self) -> AnvilInstance { + let mut cmd = Command::new("anvil"); + cmd.stdout(std::process::Stdio::piped()); + let port = if let Some(port) = self.port { port } else { unused_port() }; + cmd.arg("-p").arg(port.to_string()); + + if let Some(mnemonic) = self.mnemonic { + cmd.arg("-m").arg(mnemonic); + } + + if let Some(block_time) = self.block_time { + cmd.arg("-b").arg(block_time.to_string()); + } + + if let Some(fork) = self.fork { + cmd.arg("-f").arg(fork); + } + + cmd.args(self.args); + + let mut child = cmd.spawn().expect("couldnt start anvil"); + + let stdout = child.stdout.expect("Unable to get stdout for anvil child process"); + + let start = Instant::now(); + let mut reader = BufReader::new(stdout); + + let mut private_keys = Vec::new(); + let mut addresses = Vec::new(); + let mut is_private_key = false; + loop { + if start + Duration::from_millis(ANVIL_STARTUP_TIMEOUT_MILLIS) <= Instant::now() { + panic!("Timed out waiting for anvil to start. Is anvil installed?") + } + + let mut line = String::new(); + reader.read_line(&mut line).expect("Failed to read line from anvil process"); + if line.contains("Listening on") { + break + } + + if line.starts_with("Private Keys") { + is_private_key = true; + } + + if is_private_key && line.starts_with('(') { + let key_str = &line[6..line.len() - 1]; + let key_hex = hex::decode(key_str).expect("could not parse as hex"); + let key = K256SecretKey::from_be_bytes(&key_hex).expect("did not get private key"); + addresses.push(secret_key_to_address(&SigningKey::from(&key))); + private_keys.push(key); + } + } + + child.stdout = Some(reader.into_inner()); + + AnvilInstance { pid: child, private_keys, addresses, port } + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + #[ignore] + fn can_launch_anvil() { + let _ = Anvil::new().spawn(); + } +} diff --git a/ethers-core/src/utils/ganache.rs b/ethers-core/src/utils/ganache.rs index dfea101743..d591ee49c3 100644 --- a/ethers-core/src/utils/ganache.rs +++ b/ethers-core/src/utils/ganache.rs @@ -9,7 +9,7 @@ use std::{ time::{Duration, Instant}, }; -/// How long we will wait for ganache to indicate that it is ready. +/// Default amount of time we will wait for ganache to indicate that it is ready. const GANACHE_STARTUP_TIMEOUT_MILLIS: u64 = 10_000; /// A ganache CLI instance. Will close the instance when dropped. @@ -51,7 +51,7 @@ impl GanacheInstance { impl Drop for GanacheInstance { fn drop(&mut self) { - let _ = self.pid.kill().expect("could not kill ganache"); + self.pid.kill().expect("could not kill ganache"); } } @@ -83,6 +83,7 @@ pub struct Ganache { mnemonic: Option, fork: Option, args: Vec, + startup_timeout: Option, } impl Ganache { @@ -92,6 +93,13 @@ impl Ganache { Self::default() } + /// Sets the startup timeout which will be used when the `ganache-cli` instance is launched in + /// miliseconds. 10_000 miliseconds by default). + pub fn startup_timeout_millis>(mut self, timeout: T) -> Self { + self.startup_timeout = Some(timeout.into()); + self + } + /// Sets the port which will be used when the `ganache-cli` instance is launched. #[must_use] pub fn port>(mut self, port: T) -> Self { @@ -176,8 +184,11 @@ impl Ganache { let mut private_keys = Vec::new(); let mut addresses = Vec::new(); let mut is_private_key = false; + + let startup_timeout = + Duration::from_millis(self.startup_timeout.unwrap_or(GANACHE_STARTUP_TIMEOUT_MILLIS)); loop { - if start + Duration::from_millis(GANACHE_STARTUP_TIMEOUT_MILLIS) <= Instant::now() { + if start + startup_timeout <= Instant::now() { panic!("Timed out waiting for ganache to start. Is ganache-cli installed?") } @@ -205,3 +216,18 @@ impl Ganache { GanacheInstance { pid: child, private_keys, addresses, port } } } + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn configurable_startup_timeout() { + Ganache::new().startup_timeout_millis(100000_u64).spawn(); + } + + #[test] + fn default_startup_works() { + Ganache::new().spawn(); + } +} diff --git a/ethers-core/src/utils/geth.rs b/ethers-core/src/utils/geth.rs index 9016bc8f34..2a65ab943c 100644 --- a/ethers-core/src/utils/geth.rs +++ b/ethers-core/src/utils/geth.rs @@ -47,7 +47,7 @@ impl GethInstance { impl Drop for GethInstance { fn drop(&mut self) { - let _ = self.pid.kill().expect("could not kill geth"); + self.pid.kill().expect("could not kill geth"); } } diff --git a/ethers-core/src/utils/mod.rs b/ethers-core/src/utils/mod.rs index 6dce364b40..000a533503 100644 --- a/ethers-core/src/utils/mod.rs +++ b/ethers-core/src/utils/mod.rs @@ -10,6 +10,12 @@ mod geth; #[cfg(not(target_arch = "wasm32"))] pub use geth::{Geth, GethInstance}; +/// Utilities for launching an anvil instance +#[cfg(not(target_arch = "wasm32"))] +mod anvil; +#[cfg(not(target_arch = "wasm32"))] +pub use anvil::{Anvil, AnvilInstance}; + /// Moonbeam utils pub mod moonbeam; diff --git a/ethers-core/src/utils/moonbeam.rs b/ethers-core/src/utils/moonbeam.rs index 67af8be758..761a6e4c9a 100644 --- a/ethers-core/src/utils/moonbeam.rs +++ b/ethers-core/src/utils/moonbeam.rs @@ -4,7 +4,7 @@ use std::collections::BTreeMap; use k256::SecretKey; -/// Returns the private developer keys +/// Returns the private developer keys pub fn dev_keys() -> Vec { MoonbeamDev::default().into_keys().collect() } diff --git a/ethers-etherscan/Cargo.toml b/ethers-etherscan/Cargo.toml index 354ff64b0d..e5ee05d025 100644 --- a/ethers-etherscan/Cargo.toml +++ b/ethers-etherscan/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "ethers-etherscan" -version = "0.2.0" +version = "0.2.2" authors = ["Matthias Seitz ", "Georgios Konstantopoulos "] license = "MIT OR Apache-2.0" edition = "2018" @@ -20,12 +20,15 @@ reqwest = { version = "0.11.10", default-features = false, features = ["json"] } serde = { version = "1.0.124", default-features = false, features = ["derive"] } serde_json = { version = "1.0.64", default-features = false } serde-aux = { version = "3.0.1", default-features = false } -thiserror = "1.0.29" +thiserror = "1.0.31" +tracing = "0.1.34" +semver = "1.0.9" [dev-dependencies] tempfile = "3.3.0" tokio = { version = "1.5", features = ["macros", "rt-multi-thread", "time"] } serial_test = "0.6.0" +tracing-subscriber = { version = "0.3", default-features = false, features = ["env-filter", "fmt"] } [package.metadata.docs.rs] all-features = true diff --git a/ethers-etherscan/src/contract.rs b/ethers-etherscan/src/contract.rs index 7ccb5d42a4..b7bb7da799 100644 --- a/ethers-etherscan/src/contract.rs +++ b/ethers-etherscan/src/contract.rs @@ -10,7 +10,7 @@ use crate::{ }; /// Arguments for verifying contracts -#[derive(Debug, Clone, Serialize)] +#[derive(Debug, Clone, Serialize, Deserialize)] pub struct VerifyContract { #[serde(rename = "contractaddress")] pub address: Address, @@ -26,13 +26,15 @@ pub struct VerifyContract { pub compiler_version: String, /// applicable when codeformat=solidity-single-file #[serde(rename = "optimizationUsed", skip_serializing_if = "Option::is_none")] - optimization_used: Option, + pub optimization_used: Option, + /// applicable when codeformat=solidity-single-file #[serde(skip_serializing_if = "Option::is_none")] pub runs: Option, /// NOTE: there is a typo in the etherscan API `constructorArguements` #[serde(rename = "constructorArguements", skip_serializing_if = "Option::is_none")] pub constructor_arguments: Option, - #[serde(rename = "evmversion")] + /// applicable when codeformat=solidity-single-file + #[serde(rename = "evmversion", skip_serializing_if = "Option::is_none")] pub evm_version: Option, #[serde(flatten)] pub other: HashMap, @@ -114,7 +116,7 @@ impl VerifyContract { } } -#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize)] +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] pub enum CodeFormat { #[serde(rename = "solidity-single-file")] SingleFile, @@ -303,14 +305,14 @@ impl Client { } if resp.result.starts_with("Contract source code not verified") { if let Some(ref cache) = self.cache { - let _ = cache.set_abi(address, None); + cache.set_abi(address, None); } return Err(EtherscanError::ContractCodeNotVerified(address)) } let abi = serde_json::from_str(&resp.result)?; if let Some(ref cache) = self.cache { - let _ = cache.set_abi(address, Some(&abi)); + cache.set_abi(address, Some(&abi)); } Ok(abi) @@ -348,14 +350,14 @@ impl Client { let response: Response> = self.get_json(&query).await?; if response.result.iter().any(|item| item.abi == "Contract source code not verified") { if let Some(ref cache) = self.cache { - let _ = cache.set_source(address, None); + cache.set_source(address, None); } return Err(EtherscanError::ContractCodeNotVerified(address)) } let res = ContractMetadata { items: response.result }; if let Some(ref cache) = self.cache { - let _ = cache.set_source(address, Some(&res)); + cache.set_source(address, Some(&res)); } Ok(res) @@ -364,14 +366,34 @@ impl Client { #[cfg(test)] mod tests { + use crate::{contract::VerifyContract, tests::run_at_least_duration, Client, EtherscanError}; + use ethers_core::types::Chain; + use ethers_solc::{Project, ProjectPathsConfig}; + use serial_test::serial; use std::{path::PathBuf, time::Duration}; - use serial_test::serial; + #[allow(unused)] + fn init_tracing() { + tracing_subscriber::fmt() + .with_env_filter(tracing_subscriber::EnvFilter::from_default_env()) + .init(); + } - use ethers_core::types::Chain; - use ethers_solc::{Project, ProjectPathsConfig}; + #[tokio::test] + #[serial] + #[ignore] + async fn can_fetch_ftm_contract_abi() { + init_tracing(); + run_at_least_duration(Duration::from_millis(250), async { + let client = Client::new_from_env(Chain::Fantom).unwrap(); - use crate::{contract::VerifyContract, tests::run_at_least_duration, Client, EtherscanError}; + let _abi = client + .contract_abi("0x80AA7cb0006d5DDD91cce684229Ac6e398864606".parse().unwrap()) + .await + .unwrap(); + }) + .await; + } #[tokio::test] #[serial] diff --git a/ethers-etherscan/src/errors.rs b/ethers-etherscan/src/errors.rs index d70f632c21..c6780ab42a 100644 --- a/ethers-etherscan/src/errors.rs +++ b/ethers-etherscan/src/errors.rs @@ -31,4 +31,8 @@ pub enum EtherscanError { LocalNetworksNotSupported, #[error("Unknown error: {0}")] Unknown(String), + #[error("Missing field: {0}")] + Builder(String), + #[error("Missing solc version: {0}")] + MissingSolcVersion(String), } diff --git a/ethers-etherscan/src/lib.rs b/ethers-etherscan/src/lib.rs index 2a6213ebaa..36531a647c 100644 --- a/ethers-etherscan/src/lib.rs +++ b/ethers-etherscan/src/lib.rs @@ -8,8 +8,9 @@ use std::{ }; use contract::ContractMetadata; -use reqwest::{header, Url}; +use reqwest::{header, IntoUrl, Url}; use serde::{de::DeserializeOwned, Deserialize, Serialize}; +use tracing::trace; use errors::EtherscanError; use ethers_core::{ @@ -23,6 +24,7 @@ pub mod errors; pub mod gas; pub mod source_tree; pub mod transaction; +pub mod utils; pub(crate) type Result = std::result::Result; @@ -41,82 +43,22 @@ pub struct Client { cache: Option, } -/// A wrapper around an Etherscan cache object with an expiry -#[derive(Clone, Debug, Deserialize, Serialize)] -struct CacheEnvelope { - expiry: u64, - data: T, -} - -/// Simple cache for etherscan requests -#[derive(Clone, Debug)] -struct Cache { - root: PathBuf, - ttl: Duration, -} - -impl Cache { - fn new(root: PathBuf, ttl: Duration) -> Self { - Self { root, ttl } - } - - fn get_abi(&self, address: Address) -> Option> { - self.get("abi", address) - } - - fn set_abi(&self, address: Address, abi: Option<&Abi>) { - self.set("abi", address, abi) - } - - fn get_source(&self, address: Address) -> Option> { - self.get("sources", address) - } - - fn set_source(&self, address: Address, source: Option<&ContractMetadata>) { - self.set("sources", address, source) - } - - fn set(&self, prefix: &str, address: Address, item: T) { - let path = self.root.join(prefix).join(format!("{:?}.json", address)); - let writer = std::fs::File::create(path).ok().map(std::io::BufWriter::new); - if let Some(mut writer) = writer { - let _ = serde_json::to_writer( - &mut writer, - &CacheEnvelope { - expiry: SystemTime::now() - .checked_add(self.ttl) - .expect("cache ttl overflowed") - .duration_since(UNIX_EPOCH) - .expect("system time is before unix epoch") - .as_secs(), - data: item, - }, - ); - let _ = writer.flush(); - } - } - - fn get(&self, prefix: &str, address: Address) -> Option { - let path = self.root.join(prefix).join(format!("{:?}.json", address)); - let reader = std::io::BufReader::new(std::fs::File::open(path).ok()?); - if let Ok(inner) = serde_json::from_reader::<_, CacheEnvelope>(reader) { - // If this does not return None then we have passed the expiry - if SystemTime::now() - .duration_since(UNIX_EPOCH) - .expect("system time is before unix epoch") - .checked_sub(Duration::from_secs(inner.expiry)) - .is_some() - { - return None - } - - return Some(inner.data) - } - None +impl Client { + /// Creates a `ClientBuilder` to configure a `Client`. + /// This is the same as `ClientBuilder::default()`. + /// + /// # Example + /// + /// ```rust + /// use ethers_core::types::Chain; + /// use ethers_etherscan::Client; + /// let client = Client::builder().with_api_key("").chain(Chain::Mainnet).unwrap().build().unwrap(); + /// ``` + pub fn builder() -> ClientBuilder { + ClientBuilder::default() } -} -impl Client { + /// Creates a new instance that caches etherscan requests pub fn new_cached( chain: Chain, api_key: impl Into, @@ -130,76 +72,7 @@ impl Client { /// Create a new client with the correct endpoints based on the chain and provided API key pub fn new(chain: Chain, api_key: impl Into) -> Result { - let (etherscan_api_url, etherscan_url) = match chain { - Chain::Mainnet => { - (Url::parse("https://api.etherscan.io/api"), Url::parse("https://etherscan.io")) - } - Chain::Ropsten | Chain::Kovan | Chain::Rinkeby | Chain::Goerli => { - let chain_name = chain.to_string().to_lowercase(); - - ( - Url::parse(&format!("https://api-{}.etherscan.io/api", chain_name)), - Url::parse(&format!("https://{}.etherscan.io", chain_name)), - ) - } - Chain::Polygon => ( - Url::parse("https://api.polygonscan.com/api"), - Url::parse("https://polygonscan.com"), - ), - Chain::PolygonMumbai => ( - Url::parse("https://api-testnet.polygonscan.com/api"), - Url::parse("https://mumbai.polygonscan.com"), - ), - Chain::Avalanche => { - (Url::parse("https://api.snowtrace.io/api"), Url::parse("https://snowtrace.io")) - } - Chain::AvalancheFuji => ( - Url::parse("https://api-testnet.snowtrace.io/api"), - Url::parse("https://testnet.snowtrace.io"), - ), - Chain::Optimism => ( - Url::parse("https://api-optimistic.etherscan.io/api"), - Url::parse("https://optimistic.etherscan.io"), - ), - Chain::OptimismKovan => ( - Url::parse("https://api-kovan-optimistic.etherscan.io/api"), - Url::parse("https://kovan-optimistic.etherscan.io"), - ), - Chain::Fantom => { - (Url::parse("https://api.ftmscan.com"), Url::parse("https://ftmscan.com")) - } - Chain::FantomTestnet => ( - Url::parse("https://api-testnet.ftmscan.com"), - Url::parse("https://testnet.ftmscan.com"), - ), - Chain::BinanceSmartChain => { - (Url::parse("https://api.bscscan.com/api"), Url::parse("https://bscscan.com")) - } - Chain::BinanceSmartChainTestnet => ( - Url::parse("https://api-testnet.bscscan.com/api"), - Url::parse("https://testnet.bscscan.com"), - ), - Chain::Arbitrum => { - (Url::parse("https://api.arbiscan.io/api"), Url::parse("https://arbiscan.io")) - } - Chain::ArbitrumTestnet => ( - Url::parse("https://api-testnet.arbiscan.io/api"), - Url::parse("https://testnet.arbiscan.io"), - ), - Chain::Cronos => { - (Url::parse("https://api.cronoscan.com/api"), Url::parse("https://cronoscan.com")) - } - Chain::Dev => return Err(EtherscanError::LocalNetworksNotSupported), - chain => return Err(EtherscanError::ChainNotSupported(chain)), - }; - - Ok(Self { - client: Default::default(), - api_key: api_key.into(), - etherscan_api_url: etherscan_api_url.expect("is valid http"), - etherscan_url: etherscan_url.expect("is valid http"), - cache: None, - }) + Client::builder().with_api_key(api_key).chain(chain)?.build() } /// Create a new client with the correct endpoints based on the chain and API key @@ -215,19 +88,21 @@ impl Client { Chain::Goerli | Chain::Optimism | Chain::OptimismKovan | - Chain::Fantom | - Chain::FantomTestnet | Chain::BinanceSmartChain | Chain::BinanceSmartChainTestnet | Chain::Arbitrum | Chain::ArbitrumTestnet | - Chain::Cronos => std::env::var("ETHERSCAN_API_KEY")?, + Chain::Cronos | + Chain::CronosTestnet => std::env::var("ETHERSCAN_API_KEY")?, + Chain::Fantom | Chain::FantomTestnet => { + std::env::var("FTMSCAN_API_KEY").or_else(|_| std::env::var("FANTOMSCAN_API_KEY"))? + } - Chain::XDai | Chain::Sepolia | Chain::CronosTestnet => String::default(), + Chain::XDai | Chain::Sepolia => String::default(), Chain::Moonbeam | Chain::MoonbeamDev | Chain::Moonriver => { std::env::var("MOONSCAN_API_KEY")? } - Chain::Dev => return Err(errors::EtherscanError::LocalNetworksNotSupported), + Chain::Dev => return Err(EtherscanError::LocalNetworksNotSupported), }; Self::new(chain, api_key) } @@ -265,6 +140,7 @@ impl Client { &self, form: &Form, ) -> Result> { + trace!(target: "etherscan", "POST FORM {}", self.etherscan_api_url); Ok(self .client .post(self.etherscan_api_url.clone()) @@ -278,6 +154,7 @@ impl Client { /// Execute an API GET request with parameters async fn get_json(&self, query: &Q) -> Result> { + trace!(target: "etherscan", "GET JSON {}", self.etherscan_api_url); let res: ResponseData = self .client .get(self.etherscan_api_url.clone()) @@ -315,6 +192,225 @@ impl Client { } } +#[derive(Clone, Debug, Default)] +pub struct ClientBuilder { + /// Client that executes HTTP requests + client: Option, + /// Etherscan API key + api_key: Option, + /// Etherscan API endpoint like + etherscan_api_url: Option, + /// Etherscan base endpoint like + etherscan_url: Option, + /// Path to where ABI files should be cached + cache: Option, +} + +// === impl ClientBuilder === + +impl ClientBuilder { + /// Configures the etherscan url and api url for the given chain + /// + /// # Errors + /// + /// Fails if the chain is not supported by etherscan + pub fn chain(self, chain: Chain) -> Result { + fn urls( + api: impl IntoUrl, + url: impl IntoUrl, + ) -> (reqwest::Result, reqwest::Result) { + (api.into_url(), url.into_url()) + } + + let (etherscan_api_url, etherscan_url) = match chain { + Chain::Mainnet => urls("https://api.etherscan.io/api", "https://etherscan.io"), + Chain::Ropsten | Chain::Kovan | Chain::Rinkeby | Chain::Goerli => { + let chain_name = chain.to_string().to_lowercase(); + urls( + format!("https://api-{}.etherscan.io/api", chain_name), + format!("https://{}.etherscan.io", chain_name), + ) + } + Chain::Polygon => urls("https://api.polygonscan.com/api", "https://polygonscan.com"), + Chain::PolygonMumbai => { + urls("https://api-testnet.polygonscan.com/api", "https://mumbai.polygonscan.com") + } + Chain::Avalanche => urls("https://api.snowtrace.io/api", "https://snowtrace.io"), + Chain::AvalancheFuji => { + urls("https://api-testnet.snowtrace.io/api", "https://testnet.snowtrace.io") + } + Chain::Optimism => { + urls("https://api-optimistic.etherscan.io/api", "https://optimistic.etherscan.io") + } + Chain::OptimismKovan => urls( + "https://api-kovan-optimistic.etherscan.io/api", + "https://kovan-optimistic.etherscan.io", + ), + Chain::Fantom => urls("https://api.ftmscan.com/api", "https://ftmscan.com"), + Chain::FantomTestnet => { + urls("https://api-testnet.ftmscan.com/api", "https://testnet.ftmscan.com") + } + Chain::BinanceSmartChain => urls("https://api.bscscan.com/api", "https://bscscan.com"), + Chain::BinanceSmartChainTestnet => { + urls("https://api-testnet.bscscan.com/api", "https://testnet.bscscan.com") + } + Chain::Arbitrum => urls("https://api.arbiscan.io/api", "https://arbiscan.io"), + Chain::ArbitrumTestnet => { + urls("https://api-testnet.arbiscan.io/api", "https://testnet.arbiscan.io") + } + Chain::Cronos => urls("https://api.cronoscan.com/api", "https://cronoscan.com"), + Chain::CronosTestnet => { + urls("https://api-testnet.cronoscan.com/api", "https://testnet.cronoscan.com") + } + Chain::Moonbeam => { + urls("https://api-moonbeam.moonscan.io/api", "https://moonbeam.moonscan.io/") + } + Chain::Moonriver => { + urls("https://api-moonriver.moonscan.io/api", "https://moonriver.moonscan.io") + } + Chain::Dev => return Err(EtherscanError::LocalNetworksNotSupported), + chain => return Err(EtherscanError::ChainNotSupported(chain)), + }; + self.with_api_url(etherscan_api_url?)?.with_url(etherscan_url?) + } + + /// Configures the etherscan url + /// + /// # Errors + /// + /// Fails if the `etherscan_url` is not a valid `Url` + pub fn with_url(mut self, etherscan_url: impl IntoUrl) -> Result { + self.etherscan_url = Some(etherscan_url.into_url()?); + Ok(self) + } + + /// Configures the `reqwest::Client` + pub fn with_client(mut self, client: reqwest::Client) -> Self { + self.client = Some(client); + self + } + + /// Configures the etherscan api url + /// + /// # Errors + /// + /// Fails if the `etherscan_api_url` is not a valid `Url` + pub fn with_api_url(mut self, etherscan_api_url: impl IntoUrl) -> Result { + self.etherscan_api_url = Some(etherscan_api_url.into_url()?); + Ok(self) + } + + /// Configures the etherscan api key + pub fn with_api_key(mut self, api_key: impl Into) -> Self { + self.api_key = Some(api_key.into()); + self + } + + /// Configures cache for etherscan request + pub fn with_cache(mut self, cache_root: Option, cache_ttl: Duration) -> Self { + self.cache = cache_root.map(|root| Cache::new(root, cache_ttl)); + self + } + + /// Returns a Client that uses this ClientBuilder configuration. + /// + /// # Errors + /// if required fields are missing: + /// - `api_key` + /// - `etherscan_api_url` + /// - `etherscan_url` + pub fn build(self) -> Result { + let ClientBuilder { client, api_key, etherscan_api_url, etherscan_url, cache } = self; + + let client = Client { + client: client.unwrap_or_default(), + api_key: api_key + .ok_or_else(|| EtherscanError::Builder("etherscan api key".to_string()))?, + etherscan_api_url: etherscan_api_url + .ok_or_else(|| EtherscanError::Builder("etherscan api url".to_string()))?, + etherscan_url: etherscan_url + .ok_or_else(|| EtherscanError::Builder("etherscan url".to_string()))?, + cache, + }; + Ok(client) + } +} + +/// A wrapper around an Etherscan cache object with an expiry +#[derive(Clone, Debug, Deserialize, Serialize)] +struct CacheEnvelope { + expiry: u64, + data: T, +} + +/// Simple cache for etherscan requests +#[derive(Clone, Debug)] +struct Cache { + root: PathBuf, + ttl: Duration, +} + +impl Cache { + fn new(root: PathBuf, ttl: Duration) -> Self { + Self { root, ttl } + } + + fn get_abi(&self, address: Address) -> Option> { + self.get("abi", address) + } + + fn set_abi(&self, address: Address, abi: Option<&Abi>) { + self.set("abi", address, abi) + } + + fn get_source(&self, address: Address) -> Option> { + self.get("sources", address) + } + + fn set_source(&self, address: Address, source: Option<&ContractMetadata>) { + self.set("sources", address, source) + } + + fn set(&self, prefix: &str, address: Address, item: T) { + let path = self.root.join(prefix).join(format!("{:?}.json", address)); + let writer = std::fs::File::create(path).ok().map(std::io::BufWriter::new); + if let Some(mut writer) = writer { + let _ = serde_json::to_writer( + &mut writer, + &CacheEnvelope { + expiry: SystemTime::now() + .checked_add(self.ttl) + .expect("cache ttl overflowed") + .duration_since(UNIX_EPOCH) + .expect("system time is before unix epoch") + .as_secs(), + data: item, + }, + ); + let _ = writer.flush(); + } + } + + fn get(&self, prefix: &str, address: Address) -> Option { + let path = self.root.join(prefix).join(format!("{:?}.json", address)); + let reader = std::io::BufReader::new(std::fs::File::open(path).ok()?); + if let Ok(inner) = serde_json::from_reader::<_, CacheEnvelope>(reader) { + // If this does not return None then we have passed the expiry + if SystemTime::now() + .duration_since(UNIX_EPOCH) + .expect("system time is before unix epoch") + .checked_sub(Duration::from_secs(inner.expiry)) + .is_some() + { + return None + } + + return Some(inner.data) + } + None + } +} + /// The API response type #[derive(Debug, Clone, Deserialize)] pub struct Response { @@ -342,15 +438,13 @@ struct Query<'a, T: Serialize> { #[cfg(test)] mod tests { + use crate::{Client, EtherscanError}; + use ethers_core::types::{Address, Chain, H256}; use std::{ future::Future, time::{Duration, SystemTime}, }; - use ethers_core::types::{Address, Chain, H256}; - - use crate::{Client, EtherscanError}; - #[test] fn chain_not_supported() { let err = Client::new_from_env(Chain::XDai).unwrap_err(); diff --git a/ethers-etherscan/src/utils.rs b/ethers-etherscan/src/utils.rs new file mode 100644 index 0000000000..dc78f8b982 --- /dev/null +++ b/ethers-etherscan/src/utils.rs @@ -0,0 +1,56 @@ +use semver::Version; + +use crate::{EtherscanError, Result}; + +static SOLC_BIN_LIST_URL: &str = + "https://raw.githubusercontent.com/ethereum/solc-bin/gh-pages/bin/list.txt"; + +/// Given the compiler version lookup the build metadata +/// and return full semver +/// i.e. `0.8.13` -> `0.8.13+commit.abaa5c0e` +pub async fn lookup_compiler_version(version: &Version) -> Result { + let response = reqwest::get(SOLC_BIN_LIST_URL).await?.text().await?; + let version = format!("{}", version); + let v = response + .lines() + .find(|l| !l.contains("nightly") && l.contains(&version)) + .map(|l| l.trim_start_matches("soljson-v").trim_end_matches(".js").to_owned()) + .ok_or(EtherscanError::MissingSolcVersion(version))?; + + Ok(v.parse().expect("failed to parse semver")) +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::tests::run_at_least_duration; + use semver::{BuildMetadata, Prerelease}; + use serial_test::serial; + use std::time::Duration; + + #[tokio::test] + #[serial] + async fn can_lookup_compiler_version_build_metadata() { + run_at_least_duration(Duration::from_millis(250), async { + let v = Version::new(0, 8, 13); + let version = lookup_compiler_version(&v).await.unwrap(); + assert_eq!(v.major, version.major); + assert_eq!(v.minor, version.minor); + assert_eq!(v.patch, version.patch); + assert_ne!(version.build, BuildMetadata::EMPTY); + assert_eq!(version.pre, Prerelease::EMPTY); + }) + .await + } + + #[tokio::test] + #[serial] + async fn errors_on_invalid_solc() { + run_at_least_duration(Duration::from_millis(250), async { + let v = Version::new(100, 0, 0); + let err = lookup_compiler_version(&v).await.unwrap_err(); + assert!(matches!(err, EtherscanError::MissingSolcVersion(_))); + }) + .await + } +} diff --git a/ethers-middleware/Cargo.toml b/ethers-middleware/Cargo.toml index 6c0b316706..8da735d71b 100644 --- a/ethers-middleware/Cargo.toml +++ b/ethers-middleware/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "ethers-middleware" license = "MIT OR Apache-2.0" -version = "0.6.0" +version = "0.6.2" authors = ["Georgios Konstantopoulos "] edition = "2018" description = "Middleware implementations for the ethers-rs crate" @@ -22,8 +22,9 @@ ethers-signers = { version = "^0.6.0", path = "../ethers-signers", default-featu async-trait = { version = "0.1.50", default-features = false } serde = { version = "1.0.124", default-features = false, features = ["derive"] } -thiserror = { version = "1.0.30", default-features = false } +thiserror = { version = "1.0.31", default-features = false } futures-util = { version = "^0.3" } +futures-locks = { version = "0.7" } tracing = { version = "0.1.34", default-features = false } tracing-futures = { version = "0.2.5", default-features = false } diff --git a/ethers-middleware/src/gas_escalator/mod.rs b/ethers-middleware/src/gas_escalator/mod.rs index 64919857bc..a71adbf3e3 100644 --- a/ethers-middleware/src/gas_escalator/mod.rs +++ b/ethers-middleware/src/gas_escalator/mod.rs @@ -38,7 +38,7 @@ pub enum Frequency { Duration(u64), } -#[derive(Debug, Clone)] +#[derive(Debug)] /// A Gas escalator allows bumping transactions' gas price to avoid getting them /// stuck in the memory pool. /// @@ -72,6 +72,17 @@ pub struct GasEscalatorMiddleware { frequency: Frequency, } +impl Clone for GasEscalatorMiddleware { + fn clone(&self) -> Self { + GasEscalatorMiddleware { + inner: self.inner.clone(), + escalator: self.escalator.clone(), + txs: self.txs.clone(), + frequency: self.frequency.clone(), + } + } +} + #[cfg_attr(target_arch = "wasm32", async_trait(?Send))] #[cfg_attr(not(target_arch = "wasm32"), async_trait)] impl Middleware for GasEscalatorMiddleware diff --git a/ethers-middleware/src/gas_oracle/blocknative.rs b/ethers-middleware/src/gas_oracle/blocknative.rs new file mode 100644 index 0000000000..11832c5a5f --- /dev/null +++ b/ethers-middleware/src/gas_oracle/blocknative.rs @@ -0,0 +1,139 @@ +use crate::gas_oracle::{GasCategory, GasOracle, GasOracleError, GWEI_TO_WEI}; +use async_trait::async_trait; +use ethers_core::types::U256; +use reqwest::{header::AUTHORIZATION, Client}; +use serde::Deserialize; +use std::{collections::HashMap, convert::TryInto}; +use url::Url; + +const BLOCKNATIVE_GAS_PRICE_ENDPOINT: &str = "https://api.blocknative.com/gasprices/blockprices"; + +fn gas_category_to_confidence(gas_category: &GasCategory) -> u64 { + match gas_category { + GasCategory::SafeLow => 80, + GasCategory::Standard => 90, + GasCategory::Fast => 95, + GasCategory::Fastest => 99, + } +} + +/// A client over HTTP for the [BlockNative](https://www.blocknative.com/gas-estimator) gas tracker API +/// that implements the `GasOracle` trait +#[derive(Clone, Debug)] +pub struct BlockNative { + client: Client, + url: Url, + api_key: String, + gas_category: GasCategory, +} + +#[derive(Debug, Deserialize, PartialEq)] +#[serde(rename_all = "camelCase")] +pub struct BlockNativeGasResponse { + system: Option, + network: Option, + unit: Option, + max_price: Option, + block_prices: Vec, + estimated_base_fees: Vec>>, +} + +impl BlockNativeGasResponse { + pub fn get_estimation_for( + &self, + gas_category: &GasCategory, + ) -> Result { + let confidence = gas_category_to_confidence(gas_category); + Ok(self + .block_prices + .first() + .ok_or(GasOracleError::InvalidResponse)? + .estimated_prices + .iter() + .find(|p| p.confidence == confidence) + .ok_or(GasOracleError::GasCategoryNotSupported)? + .clone()) + } +} + +#[derive(Debug, Deserialize, PartialEq)] +#[serde(rename_all = "camelCase")] +pub struct BlockPrice { + block_number: u64, + estimated_transaction_count: u64, + base_fee_per_gas: f64, + estimated_prices: Vec, +} + +#[derive(Clone, Debug, Deserialize, PartialEq)] +#[serde(rename_all = "camelCase")] +pub struct EstimatedPrice { + confidence: u64, + price: u64, + max_priority_fee_per_gas: f64, + max_fee_per_gas: f64, +} + +#[derive(Debug, Deserialize, PartialEq)] +#[serde(rename_all = "camelCase")] +pub struct BaseFeeEstimate { + confidence: u64, + base_fee: f64, +} + +impl BlockNative { + /// Creates a new [BlockNative](https://www.blocknative.com/gas-estimator) gas oracle. + pub fn new(api_key: String) -> Self { + Self::with_client(Client::new(), api_key) + } + + /// Same as [`Self::new`] but with a custom [`Client`]. + pub fn with_client(client: Client, api_key: String) -> Self { + Self { + client, + api_key, + url: BLOCKNATIVE_GAS_PRICE_ENDPOINT.try_into().unwrap(), + gas_category: GasCategory::Standard, + } + } + + /// Sets the gas price category to be used when fetching the gas price. + #[must_use] + pub fn category(mut self, gas_category: GasCategory) -> Self { + self.gas_category = gas_category; + self + } + + /// Perform request to Blocknative, decode response + pub async fn request(&self) -> Result { + self.client + .get(self.url.as_ref()) + .header(AUTHORIZATION, &self.api_key) + .send() + .await? + .error_for_status()? + .json() + .await + .map_err(GasOracleError::HttpClientError) + } +} + +#[cfg_attr(target_arch = "wasm32", async_trait(?Send))] +#[cfg_attr(not(target_arch = "wasm32"), async_trait)] +impl GasOracle for BlockNative { + async fn fetch(&self) -> Result { + let prices = self.request().await?.get_estimation_for(&self.gas_category)?; + Ok(U256::from(prices.price * 100_u64) * U256::from(GWEI_TO_WEI) / U256::from(100)) + } + + async fn estimate_eip1559_fees(&self) -> Result<(U256, U256), GasOracleError> { + let prices = self.request().await?.get_estimation_for(&self.gas_category)?; + let base_fee = U256::from((prices.max_fee_per_gas * 100.0) as u64) * + U256::from(GWEI_TO_WEI) / + U256::from(100); + let prio_fee = U256::from((prices.max_priority_fee_per_gas * 100.0) as u64) * + U256::from(GWEI_TO_WEI) / + U256::from(100); + Ok((base_fee, prio_fee)) + } +} diff --git a/ethers-middleware/src/gas_oracle/cache.rs b/ethers-middleware/src/gas_oracle/cache.rs new file mode 100644 index 0000000000..6f8b162b6d --- /dev/null +++ b/ethers-middleware/src/gas_oracle/cache.rs @@ -0,0 +1,70 @@ +use crate::gas_oracle::{GasOracle, GasOracleError}; +use async_trait::async_trait; +use ethers_core::types::U256; +use futures_locks::RwLock; +use std::{ + fmt::Debug, + future::Future, + time::{Duration, Instant}, +}; + +#[derive(Debug)] +pub struct Cache { + inner: T, + validity: Duration, + fee: Cached, + eip1559: Cached<(U256, U256)>, +} + +#[derive(Default, Debug)] +struct Cached(RwLock>); + +impl Cached { + async fn get(&self, validity: Duration, fetch: F) -> Result + where + F: FnOnce() -> Fut, + Fut: Future>, + { + // Try with a read lock + { + let lock = self.0.read().await; + if let Some((last_fetch, value)) = lock.as_ref() { + if Instant::now().duration_since(*last_fetch) < validity { + return Ok(value.clone()) + } + } + } + // Acquire a write lock + { + let mut lock = self.0.write().await; + // Check again, a concurrent thread may have raced us to the write. + if let Some((last_fetch, value)) = lock.as_ref() { + if Instant::now().duration_since(*last_fetch) < validity { + return Ok(value.clone()) + } + } + // Set a fresh value + let value = fetch().await?; + *lock = Some((Instant::now(), value.clone())); + Ok(value) + } + } +} + +impl Cache { + pub fn new(validity: Duration, inner: T) -> Self { + Self { inner, validity, fee: Cached::default(), eip1559: Cached::default() } + } +} + +#[cfg_attr(target_arch = "wasm32", async_trait(?Send))] +#[cfg_attr(not(target_arch = "wasm32"), async_trait)] +impl GasOracle for Cache { + async fn fetch(&self) -> Result { + self.fee.get(self.validity, || self.inner.fetch()).await + } + + async fn estimate_eip1559_fees(&self) -> Result<(U256, U256), GasOracleError> { + self.eip1559.get(self.validity, || self.inner.estimate_eip1559_fees()).await + } +} diff --git a/ethers-middleware/src/gas_oracle/eth_gas_station.rs b/ethers-middleware/src/gas_oracle/eth_gas_station.rs index 6e2510c5a2..683caf374b 100644 --- a/ethers-middleware/src/gas_oracle/eth_gas_station.rs +++ b/ethers-middleware/src/gas_oracle/eth_gas_station.rs @@ -61,15 +61,17 @@ pub struct EthGasStationResponse { impl EthGasStation { /// Creates a new [EthGasStation](https://docs.ethgasstation.info/) gas oracle - pub fn new(api_key: Option<&'static str>) -> Self { - let url = match api_key { - Some(key) => format!("{}?api-key={}", ETH_GAS_STATION_URL_PREFIX, key), - None => ETH_GAS_STATION_URL_PREFIX.to_string(), - }; - - let url = Url::parse(&url).expect("invalid url"); + pub fn new(api_key: Option<&str>) -> Self { + Self::with_client(Client::new(), api_key) + } - EthGasStation { client: Client::new(), url, gas_category: GasCategory::Standard } + /// Same as [`Self::new`] but with a custom [`Client`]. + pub fn with_client(client: Client, api_key: Option<&str>) -> Self { + let mut url = Url::parse(ETH_GAS_STATION_URL_PREFIX).expect("invalid url"); + if let Some(key) = api_key { + url.query_pairs_mut().append_pair("api-key", key); + } + EthGasStation { client, url, gas_category: GasCategory::Standard } } /// Sets the gas price category to be used when fetching the gas price. @@ -84,6 +86,12 @@ impl EthGasStation { } } +impl Default for EthGasStation { + fn default() -> Self { + Self::new(None) + } +} + #[cfg_attr(target_arch = "wasm32", async_trait(?Send))] #[cfg_attr(not(target_arch = "wasm32"), async_trait)] impl GasOracle for EthGasStation { diff --git a/ethers-middleware/src/gas_oracle/etherchain.rs b/ethers-middleware/src/gas_oracle/etherchain.rs index f74187a8c0..3fc94e6a6d 100644 --- a/ethers-middleware/src/gas_oracle/etherchain.rs +++ b/ethers-middleware/src/gas_oracle/etherchain.rs @@ -18,12 +18,6 @@ pub struct Etherchain { gas_category: GasCategory, } -impl Default for Etherchain { - fn default() -> Self { - Self::new() - } -} - #[derive(Clone, Debug, Deserialize, PartialEq, PartialOrd)] #[serde(rename_all = "camelCase")] pub struct EtherchainResponse { @@ -38,9 +32,14 @@ pub struct EtherchainResponse { impl Etherchain { /// Creates a new [Etherchain](https://etherchain.org/tools/gasPriceOracle) gas price oracle. pub fn new() -> Self { + Self::with_client(Client::new()) + } + + /// Same as [`Self::new`] but with a custom [`Client`]. + pub fn with_client(client: Client) -> Self { let url = Url::parse(ETHERCHAIN_URL).expect("invalid url"); - Etherchain { client: Client::new(), url, gas_category: GasCategory::Standard } + Etherchain { client, url, gas_category: GasCategory::Standard } } /// Sets the gas price category to be used when fetching the gas price. @@ -55,6 +54,12 @@ impl Etherchain { } } +impl Default for Etherchain { + fn default() -> Self { + Self::new() + } +} + #[cfg_attr(target_arch = "wasm32", async_trait(?Send))] #[cfg_attr(not(target_arch = "wasm32"), async_trait)] impl GasOracle for Etherchain { diff --git a/ethers-middleware/src/gas_oracle/gas_now.rs b/ethers-middleware/src/gas_oracle/gas_now.rs index 77e4b6aaa7..a1444ff100 100644 --- a/ethers-middleware/src/gas_oracle/gas_now.rs +++ b/ethers-middleware/src/gas_oracle/gas_now.rs @@ -7,9 +7,9 @@ use url::Url; use crate::gas_oracle::{GasCategory, GasOracle, GasOracleError}; -const GAS_NOW_URL: &str = "https://www.gasnow.org/api/v3/gas/price"; +const GAS_NOW_URL: &str = "https://etherchain.org/api/gasnow"; -/// A client over HTTP for the [GasNow](https://www.gasnow.org/api/v1/gas/price) gas tracker API +/// A client over HTTP for the [Etherchain GasNow](https://etherchain.org/tools/gasnow) gas tracker API /// that implements the `GasOracle` trait #[derive(Clone, Debug)] pub struct GasNow { @@ -18,12 +18,6 @@ pub struct GasNow { gas_category: GasCategory, } -impl Default for GasNow { - fn default() -> Self { - Self::new() - } -} - #[derive(Deserialize)] struct GasNowResponseWrapper { data: GasNowResponse, @@ -38,11 +32,16 @@ pub struct GasNowResponse { } impl GasNow { - /// Creates a new [GasNow](https://gasnow.org) gas price oracle. + /// Creates a new [Etherchain GasNow](https://etherchain.org/tools/gasnow) gas price oracle. pub fn new() -> Self { + Self::with_client(Client::new()) + } + + /// Same as [`Self::new`] but with a custom [`Client`]. + pub fn with_client(client: Client) -> Self { let url = Url::parse(GAS_NOW_URL).expect("invalid url"); - Self { client: Client::new(), url, gas_category: GasCategory::Standard } + Self { url, gas_category: GasCategory::Standard } } /// Sets the gas price category to be used when fetching the gas price. @@ -63,6 +62,12 @@ impl GasNow { } } +impl Default for GasNow { + fn default() -> Self { + Self::new(Client::new()) + } +} + #[cfg_attr(target_arch = "wasm32", async_trait(?Send))] #[cfg_attr(not(target_arch = "wasm32"), async_trait)] impl GasOracle for GasNow { diff --git a/ethers-middleware/src/gas_oracle/median.rs b/ethers-middleware/src/gas_oracle/median.rs new file mode 100644 index 0000000000..2149ce41ec --- /dev/null +++ b/ethers-middleware/src/gas_oracle/median.rs @@ -0,0 +1,125 @@ +use crate::gas_oracle::{GasOracle, GasOracleError}; +use async_trait::async_trait; +use ethers_core::types::U256; +use futures_util::future::join_all; +use std::{fmt::Debug, future::Future}; +use tracing::warn; + +#[derive(Default, Debug)] +pub struct Median { + oracles: Vec<(f32, Box)>, +} + +/// Computes the median gas price from a selection of oracles. +/// +/// Don't forget to set a timeout on the source oracles. By default +/// the reqwest based oracles will never time out. +impl Median { + pub fn new() -> Self { + Self::default() + } + + pub fn add(&mut self, oracle: T) { + self.add_weighted(1.0, oracle) + } + + pub fn add_weighted(&mut self, weight: f32, oracle: T) { + assert!(weight > 0.0); + self.oracles.push((weight, Box::new(oracle))); + } + + pub async fn query_all<'a, Fn, Fut, O>( + &'a self, + mut f: Fn, + ) -> Result, GasOracleError> + where + Fn: FnMut(&'a dyn GasOracle) -> Fut, + Fut: Future>, + { + // Process the oracles in parallel + let futures = self.oracles.iter().map(|(_, oracle)| f(oracle.as_ref())); + let results = join_all(futures).await; + + // Filter out any errors + let values = + self.oracles.iter().zip(results).filter_map( + |((weight, oracle), result)| match result { + Ok(value) => Some((*weight, value)), + Err(err) => { + warn!("Failed to fetch gas price from {:?}: {}", oracle, err); + None + } + }, + ); + let values = values.collect::>(); + if values.is_empty() { + return Err(GasOracleError::NoValues) + } + Ok(values) + } +} + +#[cfg_attr(target_arch = "wasm32", async_trait(?Send))] +#[cfg_attr(not(target_arch = "wasm32"), async_trait)] +impl GasOracle for Median { + async fn fetch(&self) -> Result { + let mut values = self.query_all(|oracle| oracle.fetch()).await?; + // `query_all` guarantees `values` is not empty + Ok(*weighted_fractile_by_key(0.5, &mut values, |fee| fee).unwrap()) + } + + async fn estimate_eip1559_fees(&self) -> Result<(U256, U256), GasOracleError> { + let mut values = self.query_all(|oracle| oracle.estimate_eip1559_fees()).await?; + // `query_all` guarantees `values` is not empty + Ok(( + weighted_fractile_by_key(0.5, &mut values, |(max_fee, _)| max_fee).unwrap().0, + weighted_fractile_by_key(0.5, &mut values, |(_, priority_fee)| priority_fee).unwrap().1, + )) + } +} + +/// Weighted fractile by key +/// +/// Sort the values in place by key and return the weighted fractile value such +/// that `fractile` fraction of the values by weight are less than or equal to +/// the value. +/// +/// Returns None if the values are empty. +/// +/// Note: it doesn't handle NaNs or other special float values. +/// +/// See +/// +/// # Panics +/// +/// Panics if [`fractile`] is not in the range $[0, 1]$. +fn weighted_fractile_by_key<'a, T, F, K>( + fractile: f32, + values: &'a mut [(f32, T)], + mut key: F, +) -> Option<&'a T> +where + F: for<'b> FnMut(&'b T) -> &'b K, + K: Ord, +{ + assert!((0.0..=1.0).contains(&fractile)); + if values.is_empty() { + return None + } + let weight_rank = fractile * values.iter().map(|(weight, _)| *weight).sum::(); + values.sort_unstable_by(|a, b| key(&a.1).cmp(key(&b.1))); + let mut cumulative_weight = 0.0_f32; + for (weight, value) in values.iter() { + cumulative_weight += *weight; + if cumulative_weight >= weight_rank { + return Some(value) + } + } + // By the last element, cumulative_weight == weight_rank and we should have + // returned already. Assume there is a slight rounding error causing + // cumulative_weight to be slightly less than expected. In this case the last + // element is appropriate. (This is not exactly right, since the last + // elements may have zero weight.) + // `values` is not empty. + Some(&values.last().unwrap().1) +} diff --git a/ethers-middleware/src/gas_oracle/mod.rs b/ethers-middleware/src/gas_oracle/mod.rs index 517de01b23..155c277cb2 100644 --- a/ethers-middleware/src/gas_oracle/mod.rs +++ b/ethers-middleware/src/gas_oracle/mod.rs @@ -1,3 +1,6 @@ +mod blocknative; +pub use blocknative::BlockNative; + mod eth_gas_station; pub use eth_gas_station::EthGasStation; @@ -10,6 +13,15 @@ pub use etherscan::Etherscan; mod middleware; pub use middleware::{GasOracleMiddleware, MiddlewareError}; +mod median; +pub use median::Median; + +mod cache; +pub use cache::Cache; + +mod polygon; +pub use polygon::Polygon; + use ethers_core::types::U256; use async_trait::async_trait; @@ -35,6 +47,14 @@ pub enum GasOracleError { #[error(transparent)] HttpClientError(#[from] ReqwestError), + /// An error decoding JSON response from gas oracle + #[error(transparent)] + SerdeJsonError(#[from] serde_json::Error), + + /// An error with oracle response type + #[error("invalid oracle response")] + InvalidResponse, + /// An internal error in the Etherscan client request made from the underlying /// gas oracle #[error(transparent)] @@ -47,6 +67,12 @@ pub enum GasOracleError { #[error("EIP-1559 gas estimation not supported")] Eip1559EstimationNotSupported, + + #[error("None of the oracles returned a value")] + NoValues, + + #[error("Chain is not supported by the oracle")] + UnsupportedChain, } /// `GasOracle` is a trait that an underlying gas oracle needs to implement. diff --git a/ethers-middleware/src/gas_oracle/polygon.rs b/ethers-middleware/src/gas_oracle/polygon.rs new file mode 100644 index 0000000000..a450a3ab9e --- /dev/null +++ b/ethers-middleware/src/gas_oracle/polygon.rs @@ -0,0 +1,91 @@ +use crate::gas_oracle::{GasCategory, GasOracle, GasOracleError}; +use async_trait::async_trait; +use ethers_core::types::{u256_from_f64_saturating, Chain, U256}; +use reqwest::Client; +use serde::Deserialize; +use url::Url; + +const GAS_PRICE_ENDPOINT: &str = "https://gasstation-mainnet.matic.network/v2"; +const MUMBAI_GAS_PRICE_ENDPOINT: &str = "https://gasstation-mumbai.matic.today/v2"; + +/// The [Polygon](https://docs.polygon.technology/docs/develop/tools/polygon-gas-station/) gas station API +/// Queries over HTTP and implements the `GasOracle` trait +#[derive(Clone, Debug)] +pub struct Polygon { + client: Client, + url: Url, + gas_category: GasCategory, +} + +/// The response from the Polygon gas station API. +/// Gas prices are in Gwei. +#[derive(Debug, Deserialize, PartialEq)] +#[serde(rename_all = "camelCase")] +pub struct Response { + estimated_base_fee: f64, + safe_low: GasEstimate, + standard: GasEstimate, + fast: GasEstimate, +} + +#[derive(Clone, Copy, Debug, Deserialize, PartialEq)] +#[serde(rename_all = "camelCase")] +pub struct GasEstimate { + max_priority_fee: f64, + max_fee: f64, +} + +impl Polygon { + pub fn new(chain: Chain) -> Result { + Self::with_client(Client::new(), chain) + } + + pub fn with_client(client: Client, chain: Chain) -> Result { + // TODO: Sniff chain from chain id. + let url = match chain { + Chain::Polygon => Url::parse(GAS_PRICE_ENDPOINT).unwrap(), + Chain::PolygonMumbai => Url::parse(MUMBAI_GAS_PRICE_ENDPOINT).unwrap(), + _ => return Err(GasOracleError::UnsupportedChain), + }; + Ok(Self { client, url, gas_category: GasCategory::Standard }) + } + + /// Sets the gas price category to be used when fetching the gas price. + #[must_use] + pub fn category(mut self, gas_category: GasCategory) -> Self { + self.gas_category = gas_category; + self + } + + /// Perform request to Blocknative, decode response + pub async fn request(&self) -> Result<(f64, GasEstimate), GasOracleError> { + let response: Response = + self.client.get(self.url.as_ref()).send().await?.error_for_status()?.json().await?; + let estimate = match self.gas_category { + GasCategory::SafeLow => response.safe_low, + GasCategory::Standard => response.standard, + GasCategory::Fast => response.fast, + GasCategory::Fastest => response.fast, + }; + Ok((response.estimated_base_fee, estimate)) + } +} + +#[cfg_attr(target_arch = "wasm32", async_trait(?Send))] +#[cfg_attr(not(target_arch = "wasm32"), async_trait)] +impl GasOracle for Polygon { + async fn fetch(&self) -> Result { + let (base_fee, estimate) = self.request().await?; + let fee = base_fee + estimate.max_priority_fee; + Ok(from_gwei(fee)) + } + + async fn estimate_eip1559_fees(&self) -> Result<(U256, U256), GasOracleError> { + let (_, estimate) = self.request().await?; + Ok((from_gwei(estimate.max_fee), from_gwei(estimate.max_priority_fee))) + } +} + +fn from_gwei(gwei: f64) -> U256 { + u256_from_f64_saturating(gwei * 1.0e18_f64) +} diff --git a/ethers-middleware/src/transformer/ds_proxy/factory.rs b/ethers-middleware/src/transformer/ds_proxy/factory.rs index c51225aad5..8de0c88fd7 100644 --- a/ethers-middleware/src/transformer/ds_proxy/factory.rs +++ b/ethers-middleware/src/transformer/ds_proxy/factory.rs @@ -46,8 +46,12 @@ mod dsproxyfactory_mod { pub static DSPROXYFACTORY_ABI: Lazy = Lazy::new(|| { serde_json :: from_str ("[{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"}],\"name\":\"isProxy\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"cache\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"build\",\"outputs\":[{\"name\":\"proxy\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"build\",\"outputs\":[{\"name\":\"proxy\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"proxy\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"cache\",\"type\":\"address\"}],\"name\":\"Created\",\"type\":\"event\"}]\n") . expect ("invalid abi") }); - #[derive(Clone)] pub struct DsProxyFactory(Contract); + impl Clone for DsProxyFactory { + fn clone(&self) -> Self { + DsProxyFactory(self.0.clone()) + } + } impl std::ops::Deref for DsProxyFactory { type Target = Contract; fn deref(&self) -> &Self::Target { @@ -59,7 +63,7 @@ mod dsproxyfactory_mod { f.debug_tuple(stringify!(DsProxyFactory)).field(&self.address()).finish() } } - impl<'a, M: Middleware> DsProxyFactory { + impl DsProxyFactory { #[doc = r" Creates a new contract instance with the specified `ethers`"] #[doc = r" client at the given `Address`. The contract derefs to a `ethers::Contract`"] #[doc = r" object"] diff --git a/ethers-middleware/tests/gas_oracle.rs b/ethers-middleware/tests/gas_oracle.rs index c58f9e2826..5967fa2d9f 100644 --- a/ethers-middleware/tests/gas_oracle.rs +++ b/ethers-middleware/tests/gas_oracle.rs @@ -57,7 +57,7 @@ async fn using_gas_oracle() { #[tokio::test] async fn eth_gas_station() { // initialize and fetch gas estimates from EthGasStation - let eth_gas_station_oracle = EthGasStation::new(None); + let eth_gas_station_oracle = EthGasStation::default(); let data = eth_gas_station_oracle.fetch().await; assert!(data.is_ok()); } @@ -83,7 +83,7 @@ async fn etherscan() { #[tokio::test] async fn etherchain() { // initialize and fetch gas estimates from Etherchain - let etherchain_oracle = Etherchain::new().category(GasCategory::Fast); + let etherchain_oracle = Etherchain::default().category(GasCategory::Fast); let data = etherchain_oracle.fetch().await; assert!(data.is_ok()); } diff --git a/ethers-providers/Cargo.toml b/ethers-providers/Cargo.toml index 0e9eb75c9d..abbb3fa726 100644 --- a/ethers-providers/Cargo.toml +++ b/ethers-providers/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "ethers-providers" license = "MIT OR Apache-2.0" -version = "0.6.0" +version = "0.6.2" authors = ["Georgios Konstantopoulos "] edition = "2018" description = "Provider implementations for the ethers-rs crate" @@ -21,7 +21,7 @@ hex = { version = "0.4.3", default-features = false, features = ["std"] } reqwest = { version = "0.11.10", default-features = false, features = ["json"] } serde = { version = "1.0.124", default-features = false, features = ["derive"] } serde_json = { version = "1.0.64", default-features = false, features = ["raw_value"] } -thiserror = { version = "1.0.30", default-features = false } +thiserror = { version = "1.0.31", default-features = false } url = { version = "2.2.2", default-features = false } auto_impl = { version = "0.5.0", default-features = false } http = { version = "0.2" } @@ -40,10 +40,11 @@ tracing-futures = { version = "0.2.5", default-features = false, features = ["st bytes = { version = "1.1.0", default-features = false, optional = true } once_cell = "1.10.0" +hashers = "1.0.1" [target.'cfg(not(target_arch = "wasm32"))'.dependencies] # tokio -tokio-util = { version = "0.7.1", default-features = false, features = ["io"], optional = true } +tokio-util = { version = "0.7.2", default-features = false, features = ["io"], optional = true } tokio = { version = "1.5", default-features = false, optional = true } tokio-tungstenite = { version = "0.17.1", default-features = false, features = ["connect"], optional = true } diff --git a/ethers-providers/README.md b/ethers-providers/README.md index be18a8c7bd..7e0a38fe14 100644 --- a/ethers-providers/README.md +++ b/ethers-providers/README.md @@ -10,6 +10,7 @@ For more documentation on the available calls, refer to the # Examples ```no_run +use ethers_core::types::Address; use ethers_providers::{Provider, Http, Middleware}; use std::convert::TryFrom; @@ -21,7 +22,8 @@ let provider = Provider::::try_from( let block = provider.get_block(100u64).await?; println!("Got block: {}", serde_json::to_string(&block)?); -let code = provider.get_code("0x89d24a6b4ccb1b6faa2625fe562bdd9a23260359", None).await?; +let addr = "0x89d24a6b4ccb1b6faa2625fe562bdd9a23260359".parse::
()?; +let code = provider.get_code(addr, None).await?; println!("Got code: {}", serde_json::to_string(&code)?); # Ok(()) # } @@ -29,7 +31,7 @@ println!("Got code: {}", serde_json::to_string(&code)?); # Websockets -The crate has support for WebSockets via Tokio. +The crate has support for WebSockets via Tokio. Please ensure that you have the "ws" and "rustls" / "openssl" features enabled if you wish to use WebSockets. ``` # async fn foo() -> Result<(), Box> { diff --git a/ethers-providers/src/lib.rs b/ethers-providers/src/lib.rs index 05efefd0cf..b73e596129 100644 --- a/ethers-providers/src/lib.rs +++ b/ethers-providers/src/lib.rs @@ -708,13 +708,16 @@ pub mod test_provider { Self { keys: Mutex::new(keys.iter().cycle()), network: network.to_owned() } } - pub fn provider(&self) -> Provider { - let url = format!( + pub fn url(&self) -> String { + format!( "https://{}.infura.io/v3/{}", self.network, self.keys.lock().unwrap().next().unwrap() - ); - Provider::try_from(url.as_str()).unwrap() + ) + } + + pub fn provider(&self) -> Provider { + Provider::try_from(self.url().as_str()).unwrap() } #[cfg(feature = "ws")] diff --git a/ethers-providers/src/pending_escalator.rs b/ethers-providers/src/pending_escalator.rs index b813f98658..3dca65fb34 100644 --- a/ethers-providers/src/pending_escalator.rs +++ b/ethers-providers/src/pending_escalator.rs @@ -190,7 +190,7 @@ where poll_broadcast_fut!(cx, this, fut); } Sleeping(delay) => { - let _ready = futures_util::ready!(delay.as_mut().poll(cx)); + futures_util::ready!(delay.as_mut().poll(cx)); // if broadcast timer has elapsed and if we have a TX to // broadcast, broadcast it if this.last.elapsed() > *this.broadcast_interval { diff --git a/ethers-providers/src/pending_transaction.rs b/ethers-providers/src/pending_transaction.rs index 0e1a8bef32..68757aa844 100644 --- a/ethers-providers/src/pending_transaction.rs +++ b/ethers-providers/src/pending_transaction.rs @@ -62,8 +62,11 @@ pub struct PendingTransaction<'a, P> { provider: &'a Provider

, state: PendingTxState<'a>, interval: Box + Send + Unpin>, + retries_remaining: usize, } +const DEFAULT_RETRIES: usize = 3; + impl<'a, P: JsonRpcClient> PendingTransaction<'a, P> { /// Creates a new pending transaction poller from a hash and a provider pub fn new(tx_hash: TxHash, provider: &'a Provider

) -> Self { @@ -74,6 +77,7 @@ impl<'a, P: JsonRpcClient> PendingTransaction<'a, P> { provider, state: PendingTxState::InitialDelay(delay), interval: Box::new(interval(DEFAULT_POLL_INTERVAL)), + retries_remaining: DEFAULT_RETRIES, } } @@ -111,6 +115,13 @@ impl<'a, P: JsonRpcClient> PendingTransaction<'a, P> { self } + + /// Set retries + #[must_use] + pub fn retries(mut self, retries: usize) -> Self { + self.retries_remaining = retries; + self + } } impl<'a, P> PendingTransaction<'a, P> { @@ -161,7 +172,7 @@ impl<'a, P: JsonRpcClient> Future for PendingTransaction<'a, P> { match this.state { PendingTxState::InitialDelay(fut) => { - let _ready = futures_util::ready!(fut.as_mut().poll(ctx)); + futures_util::ready!(fut.as_mut().poll(ctx)); tracing::debug!("Starting to poll pending tx {:?}", *this.tx_hash); let fut = Box::pin(this.provider.get_transaction(*this.tx_hash)); rewake_with_new_state!(ctx, this, PendingTxState::GettingTx(fut)); @@ -188,9 +199,14 @@ impl<'a, P: JsonRpcClient> Future for PendingTransaction<'a, P> { let tx_opt = tx_res.unwrap(); // If the tx is no longer in the mempool, return Ok(None) if tx_opt.is_none() { - tracing::debug!("Dropped from mempool, pending tx {:?}", *this.tx_hash); - *this.state = PendingTxState::Completed; - return Poll::Ready(Ok(None)) + if *this.retries_remaining == 0 { + tracing::debug!("Dropped from mempool, pending tx {:?}", *this.tx_hash); + *this.state = PendingTxState::Completed; + return Poll::Ready(Ok(None)) + } + + *this.retries_remaining -= 1; + rewake_with_new_state!(ctx, this, PendingTxState::PausedGettingTx); } // If it hasn't confirmed yet, poll again later diff --git a/ethers-providers/src/provider.rs b/ethers-providers/src/provider.rs index 7eece910e3..9b05c9d5d7 100644 --- a/ethers-providers/src/provider.rs +++ b/ethers-providers/src/provider.rs @@ -16,9 +16,9 @@ use ethers_core::{ types::{ transaction::{eip2718::TypedTransaction, eip2930::AccessListWithGasUsed}, Address, Block, BlockId, BlockNumber, BlockTrace, Bytes, EIP1186ProofResponse, FeeHistory, - Filter, Log, NameOrAddress, Selector, Signature, StateOverride, Trace, TraceFilter, - TraceType, Transaction, TransactionReceipt, TransactionRequest, TxHash, TxpoolContent, - TxpoolInspect, TxpoolStatus, H256, U256, U64, + Filter, FilterBlockOption, Log, NameOrAddress, Selector, Signature, StateOverride, Trace, + TraceFilter, TraceType, Transaction, TransactionReceipt, TransactionRequest, TxHash, + TxpoolContent, TxpoolInspect, TxpoolStatus, H256, U256, U64, }, utils, }; @@ -28,7 +28,9 @@ use thiserror::Error; use url::{ParseError, Url}; use futures_util::{lock::Mutex, try_join}; -use std::{convert::TryFrom, fmt::Debug, str::FromStr, sync::Arc, time::Duration}; +use std::{ + collections::VecDeque, convert::TryFrom, fmt::Debug, str::FromStr, sync::Arc, time::Duration, +}; use tracing::trace; use tracing_futures::Instrument; @@ -728,12 +730,15 @@ impl Middleware for Provider

{ NameOrAddress::Address(addr) => addr, }; + // position is a QUANTITY according to the [spec](https://eth.wiki/json-rpc/API#eth_getstorageat): integer of the position in the storage, converting this to a U256 + // will make sure the number is formatted correctly as [quantity](https://eips.ethereum.org/EIPS/eip-1474#quantity) + let position = U256::from_big_endian(location.as_bytes()); + let position = utils::serialize(&position); let from = utils::serialize(&from); - let location = utils::serialize(&location); let block = utils::serialize(&block.unwrap_or_else(|| BlockNumber::Latest.into())); // get the hex encoded value. - let value: String = self.request("eth_getStorageAt", [from, location, block]).await?; + let value: String = self.request("eth_getStorageAt", [from, position, block]).await?; // get rid of the 0x prefix and left pad it with zeroes. let value = format!("{:0>64}", value.replace("0x", "")); Ok(H256::from_slice(&Vec::from_hex(value)?)) @@ -1113,9 +1118,24 @@ impl Middleware for Provider

{ where P: PubsubClient, { + let loaded_logs = match filter.block_option { + FilterBlockOption::Range { from_block, to_block: _ } => { + if from_block.is_none() { + vec![] + } else { + self.get_logs(filter).await? + } + } + FilterBlockOption::AtBlockHash(_block_hash) => self.get_logs(filter).await?, + }; + let loaded_logs = VecDeque::from(loaded_logs); + let logs = utils::serialize(&"logs"); // TODO: Make this a static let filter = utils::serialize(filter); - self.subscribe([logs, filter]).await + self.subscribe([logs, filter]).await.map(|mut stream| { + stream.set_loaded_elements(loaded_logs); + stream + }) } async fn fee_history + Send + Sync>( @@ -1181,7 +1201,11 @@ impl Provider

{ // resolve let data = self - .call(&ens::resolve(resolver_address, selector, ens_name, parameters).into(), None, None) + .call( + &ens::resolve(resolver_address, selector, ens_name, parameters).into(), + None, + None, + ) .await?; Ok(decode_bytes(param, data)) @@ -1520,6 +1544,22 @@ mod tests { }; use futures_util::StreamExt; + #[test] + fn convert_h256_u256_quantity() { + let hash: H256 = H256::zero(); + let quantity = U256::from_big_endian(hash.as_bytes()); + assert_eq!(format!("{quantity:#x}"), "0x0"); + assert_eq!(utils::serialize(&quantity).to_string(), "\"0x0\""); + + let address: Address = "0x295a70b2de5e3953354a6a8344e616ed314d7251".parse().unwrap(); + let block = BlockNumber::Latest; + let params = + [utils::serialize(&address), utils::serialize(&quantity), utils::serialize(&block)]; + + let params = serde_json::to_string(¶ms).unwrap(); + assert_eq!(params, r#"["0x295a70b2de5e3953354a6a8344e616ed314d7251","0x0","latest"]"#); + } + #[tokio::test] // Test vector from: https://docs.ethers.io/ethers.js/v5-beta/api-providers.html#id2 async fn mainnet_resolve_name() { diff --git a/ethers-providers/src/pubsub.rs b/ethers-providers/src/pubsub.rs index 9aed8252ce..63339437df 100644 --- a/ethers-providers/src/pubsub.rs +++ b/ethers-providers/src/pubsub.rs @@ -7,6 +7,7 @@ use pin_project::{pin_project, pinned_drop}; use serde::de::DeserializeOwned; use serde_json::value::RawValue; use std::{ + collections::VecDeque, marker::PhantomData, pin::Pin, task::{Context, Poll}, @@ -31,6 +32,8 @@ pub struct SubscriptionStream<'a, P: PubsubClient, R: DeserializeOwned> { /// The subscription's installed id on the ethereum node pub id: U256, + loaded_elements: VecDeque, + provider: &'a Provider

, #[pin] @@ -54,13 +57,17 @@ where pub fn new(id: U256, provider: &'a Provider

) -> Result { // Call the underlying PubsubClient's subscribe let rx = provider.as_ref().subscribe(id)?; - Ok(Self { id, provider, rx, ret: PhantomData }) + Ok(Self { id, provider, rx, ret: PhantomData, loaded_elements: VecDeque::new() }) } /// Unsubscribes from the subscription. pub async fn unsubscribe(&self) -> Result { self.provider.unsubscribe(self.id).await } + + pub fn set_loaded_elements(&mut self, loaded_elements: VecDeque) { + self.loaded_elements = loaded_elements; + } } // Each subscription item is a serde_json::Value which must be decoded to the @@ -74,6 +81,11 @@ where type Item = R; fn poll_next(self: Pin<&mut Self>, ctx: &mut Context) -> Poll> { + if !self.loaded_elements.is_empty() { + let next_element = self.get_mut().loaded_elements.pop_front(); + return Poll::Ready(next_element) + } + let this = self.project(); match futures_util::ready!(this.rx.poll_next(ctx)) { Some(item) => match serde_json::from_str(item.get()) { diff --git a/ethers-providers/src/transports/common.rs b/ethers-providers/src/transports/common.rs index 840d40207c..ad8fa66555 100644 --- a/ethers-providers/src/transports/common.rs +++ b/ethers-providers/src/transports/common.rs @@ -48,53 +48,21 @@ impl<'a, T> Request<'a, T> { } } -/// A JSON-RPC Notifcation -#[allow(unused)] -#[derive(Deserialize, Debug)] -pub struct Notification<'a> { - #[serde(alias = "JSONRPC")] - jsonrpc: &'a str, - method: &'a str, - #[serde(borrow)] - pub params: Subscription<'a>, +/// A JSON-RPC response +#[derive(Debug)] +pub enum Response<'a> { + Success { id: u64, result: &'a RawValue }, + Error { id: u64, error: JsonRpcError }, + Notification { method: &'a str, params: Params<'a> }, } #[derive(Deserialize, Debug)] -pub struct Subscription<'a> { +pub struct Params<'a> { pub subscription: U256, #[serde(borrow)] pub result: &'a RawValue, } -#[derive(Debug)] -pub enum Response<'a> { - Success { id: u64, jsonrpc: &'a str, result: &'a RawValue }, - Error { id: u64, jsonrpc: &'a str, error: JsonRpcError }, -} - -impl Response<'_> { - pub fn id(&self) -> u64 { - match self { - Self::Success { id, .. } => *id, - Self::Error { id, .. } => *id, - } - } - - pub fn as_result(&self) -> Result<&RawValue, &JsonRpcError> { - match self { - Self::Success { result, .. } => Ok(*result), - Self::Error { error, .. } => Err(error), - } - } - - pub fn into_result(self) -> Result, JsonRpcError> { - match self { - Self::Success { result, .. } => Ok(result.to_owned()), - Self::Error { error, .. } => Err(error), - } - } -} - // FIXME: ideally, this could be auto-derived as an untagged enum, but due to // https://github.com/serde-rs/serde/issues/1183 this currently fails impl<'de: 'a, 'a> Deserialize<'de> for Response<'a> { @@ -114,62 +82,96 @@ impl<'de: 'a, 'a> Deserialize<'de> for Response<'a> { where A: MapAccess<'de>, { + let mut jsonrpc = false; + + // response & error let mut id = None; - let mut jsonrpc = None; + // only response let mut result = None; + // only error let mut error = None; + // only notification + let mut method = None; + let mut params = None; while let Some(key) = map.next_key()? { match key { - "id" => { - let value: u64 = map.next_value()?; - let prev = id.replace(value); - if prev.is_some() { - return Err(de::Error::duplicate_field("id")) - } - } "jsonrpc" => { - let value: &'de str = map.next_value()?; + if jsonrpc { + return Err(de::Error::duplicate_field("jsonrpc")) + } + + let value = map.next_value()?; if value != "2.0" { return Err(de::Error::invalid_value(Unexpected::Str(value), &"2.0")) } - let prev = jsonrpc.replace(value); - if prev.is_some() { - return Err(de::Error::duplicate_field("jsonrpc")) + jsonrpc = true; + } + "id" => { + if id.is_some() { + return Err(de::Error::duplicate_field("id")) } + + let value: u64 = map.next_value()?; + id = Some(value); } "result" => { - let value: &RawValue = map.next_value()?; - let prev = result.replace(value); - if prev.is_some() { + if result.is_some() { return Err(de::Error::duplicate_field("result")) } + + let value: &RawValue = map.next_value()?; + result = Some(value); } "error" => { - let value: JsonRpcError = map.next_value()?; - let prev = error.replace(value); - if prev.is_some() { + if error.is_some() { return Err(de::Error::duplicate_field("error")) } + + let value: JsonRpcError = map.next_value()?; + error = Some(value); + } + "method" => { + if method.is_some() { + return Err(de::Error::duplicate_field("method")) + } + + let value: &str = map.next_value()?; + method = Some(value); + } + "params" => { + if params.is_some() { + return Err(de::Error::duplicate_field("params")) + } + + let value: Params = map.next_value()?; + params = Some(value); } key => { return Err(de::Error::unknown_field( key, - &["id", "jsonrpc", "result", "error"], + &["id", "jsonrpc", "result", "error", "params", "method"], )) } } } - let id = id.ok_or_else(|| de::Error::missing_field("id"))?; - let jsonrpc = jsonrpc.ok_or_else(|| de::Error::missing_field("jsonrpc"))?; + // jsonrpc version must be present in all responses + if !jsonrpc { + return Err(de::Error::missing_field("jsonrpc")) + } - match (result, error) { - (Some(result), None) => Ok(Response::Success { id, jsonrpc, result }), - (None, Some(error)) => Ok(Response::Error { id, jsonrpc, error }), + match (id, result, error, method, params) { + (Some(id), Some(result), None, None, None) => { + Ok(Response::Success { id, result }) + } + (Some(id), None, Some(error), None, None) => Ok(Response::Error { id, error }), + (None, None, None, Some(method), Some(params)) => { + Ok(Response::Notification { method, params }) + } _ => Err(de::Error::custom( - "response must have either a `result` or `error` field", + "response must be either a success/error or notification object", )), } } @@ -210,6 +212,8 @@ impl fmt::Display for Authorization { #[cfg(test)] mod tests { + use ethers_core::types::U64; + use super::*; #[test] @@ -222,23 +226,51 @@ mod tests { let response: Response<'_> = serde_json::from_str(r#"{"jsonrpc":"2.0","result":19,"id":1}"#).unwrap(); - assert_eq!(response.id(), 1); - let result: u64 = serde_json::from_str(response.into_result().unwrap().get()).unwrap(); - assert_eq!(result, 19); + match response { + Response::Success { id, result } => { + assert_eq!(id, 1); + let result: u64 = serde_json::from_str(result.get()).unwrap(); + assert_eq!(result, 19); + } + _ => panic!("expected `Success` response"), + } let response: Response<'_> = serde_json::from_str( r#"{"jsonrpc":"2.0","error":{"code":-32000,"message":"error occurred"},"id":2}"#, ) .unwrap(); - assert_eq!(response.id(), 2); - let err = response.into_result().unwrap_err(); - assert_eq!(err.code, -32000); - assert_eq!(err.message, "error occurred"); + match response { + Response::Error { id, error } => { + assert_eq!(id, 2); + assert_eq!(error.code, -32000); + assert_eq!(error.message, "error occurred"); + assert!(error.data.is_none()); + } + _ => panic!("expected `Error` response"), + } + + let response: Response<'_> = + serde_json::from_str(r#"{"jsonrpc":"2.0","result":"0xfa","id":0}"#).unwrap(); + + match response { + Response::Success { id, result } => { + assert_eq!(id, 0); + let result: U64 = serde_json::from_str(result.get()).unwrap(); + assert_eq!(result.as_u64(), 250); + } + _ => panic!("expected `Success` response"), + } } #[test] fn ser_request() { + let request: Request<()> = Request::new(0, "eth_chainId", ()); + assert_eq!( + &serde_json::to_string(&request).unwrap(), + r#"{"id":0,"jsonrpc":"2.0","method":"eth_chainId"}"# + ); + let request: Request<()> = Request::new(300, "method_name", ()); assert_eq!( &serde_json::to_string(&request).unwrap(), diff --git a/ethers-providers/src/transports/http.rs b/ethers-providers/src/transports/http.rs index ca77ddf5b3..242126d862 100644 --- a/ethers-providers/src/transports/http.rs +++ b/ethers-providers/src/transports/http.rs @@ -73,12 +73,20 @@ impl JsonRpcClient for Provider { let res = self.client.post(self.url.as_ref()).json(&payload).send().await?; let text = res.text().await?; - let response: Response<'_> = match serde_json::from_str(&text) { - Ok(response) => response, + + let raw = match serde_json::from_str(&text) { + Ok(Response::Success { result, .. }) => result.to_owned(), + Ok(Response::Error { error, .. }) => return Err(error.into()), + Ok(_) => { + let err = ClientError::SerdeJson { + err: serde::de::Error::custom("unexpected notification over HTTP transport"), + text, + }; + return Err(err) + } Err(err) => return Err(ClientError::SerdeJson { err, text }), }; - let raw = response.as_result().map_err(Clone::clone)?; let res = serde_json::from_str(raw.get()) .map_err(|err| ClientError::SerdeJson { err, text: raw.to_string() })?; @@ -141,7 +149,7 @@ impl Provider { /// let provider = Http::new_with_client(url, client); /// ``` pub fn new_with_client(url: impl Into, client: reqwest::Client) -> Self { - Self { id: AtomicU64::new(0), client, url: url.into() } + Self { id: AtomicU64::new(1), client, url: url.into() } } } @@ -156,7 +164,7 @@ impl FromStr for Provider { impl Clone for Provider { fn clone(&self) -> Self { - Self { id: AtomicU64::new(0), client: self.client.clone(), url: self.url.clone() } + Self { id: AtomicU64::new(1), client: self.client.clone(), url: self.url.clone() } } } diff --git a/ethers-providers/src/transports/ipc.rs b/ethers-providers/src/transports/ipc.rs index 6b06508388..61ba86c969 100644 --- a/ethers-providers/src/transports/ipc.rs +++ b/ethers-providers/src/transports/ipc.rs @@ -1,71 +1,75 @@ -use crate::{ - provider::ProviderError, - transports::common::{JsonRpcError, Request, Response}, - JsonRpcClient, PubsubClient, -}; -use ethers_core::types::U256; - -use async_trait::async_trait; -use futures_channel::mpsc; -use futures_util::stream::{Fuse, StreamExt}; -use oneshot::error::RecvError; -use serde::{de::DeserializeOwned, Serialize}; -use serde_json::{value::RawValue, Deserializer, StreamDeserializer}; use std::{ - collections::HashMap, + cell::RefCell, + convert::Infallible, + hash::BuildHasherDefault, path::Path, sync::{ atomic::{AtomicU64, Ordering}, Arc, }, + thread, }; + +use async_trait::async_trait; +use bytes::{Buf as _, BytesMut}; +use ethers_core::types::U256; +use futures_channel::mpsc; +use futures_util::stream::StreamExt as _; +use hashers::fx_hash::FxHasher64; +use serde::{de::DeserializeOwned, Serialize}; +use serde_json::{value::RawValue, Deserializer}; use thiserror::Error; use tokio::{ - io::{AsyncRead, AsyncWrite, AsyncWriteExt, ReadHalf, WriteHalf}, - net::UnixStream, - sync::oneshot, + io::{AsyncReadExt as _, AsyncWriteExt as _, BufReader}, + net::{ + unix::{ReadHalf, WriteHalf}, + UnixStream, + }, + runtime, + sync::oneshot::{self, error::RecvError}, +}; + +use crate::{ + provider::ProviderError, + transports::common::{JsonRpcError, Request, Response}, + JsonRpcClient, PubsubClient, }; -use tokio_util::io::ReaderStream; -use tracing::{error, warn}; -use super::common::Notification; +use super::common::Params; + +type FxHashMap = std::collections::HashMap>; + +type Pending = oneshot::Sender, JsonRpcError>>; +type Subscription = mpsc::UnboundedSender>; /// Unix Domain Sockets (IPC) transport. #[derive(Debug, Clone)] pub struct Ipc { id: Arc, - messages_tx: mpsc::UnboundedSender, + request_tx: mpsc::UnboundedSender, } -type Pending = oneshot::Sender, JsonRpcError>>; -type Subscription = mpsc::UnboundedSender>; - #[derive(Debug)] enum TransportMessage { - Request { id: u64, request: String, sender: Pending }, + Request { id: u64, request: Box<[u8]>, sender: Pending }, Subscribe { id: U256, sink: Subscription }, Unsubscribe { id: U256 }, } impl Ipc { - /// Creates a new IPC transport from a Async Reader / Writer - fn new(stream: S) -> Self { + /// Creates a new IPC transport from a given path using Unix sockets. + pub async fn connect(path: impl AsRef) -> Result { let id = Arc::new(AtomicU64::new(1)); - let (messages_tx, messages_rx) = mpsc::unbounded(); + let (request_tx, request_rx) = mpsc::unbounded(); - IpcServer::new(stream, messages_rx).spawn(); - Self { id, messages_tx } - } + let stream = UnixStream::connect(path).await?; + spawn_ipc_server(stream, request_rx); - /// Creates a new IPC transport from a given path using Unix sockets - #[cfg(unix)] - pub async fn connect>(path: P) -> Result { - let ipc = UnixStream::connect(path).await?; - Ok(Self::new(ipc)) + Ok(Self { id, request_tx }) } fn send(&self, msg: TransportMessage) -> Result<(), IpcError> { - self.messages_tx + self.request_tx .unbounded_send(msg) .map_err(|_| IpcError::ChannelError("IPC server receiver dropped".to_string()))?; @@ -88,7 +92,7 @@ impl JsonRpcClient for Ipc { let (sender, receiver) = oneshot::channel(); let payload = TransportMessage::Request { id: next_id, - request: serde_json::to_string(&Request::new(next_id, method, params))?, + request: serde_json::to_vec(&Request::new(next_id, method, params))?.into_boxed_slice(), sender, }; @@ -117,169 +121,171 @@ impl PubsubClient for Ipc { } } -struct IpcServer { - socket_reader: Fuse>>, - socket_writer: WriteHalf, - requests: Fuse>, - pending: HashMap, - subscriptions: HashMap, +fn spawn_ipc_server(stream: UnixStream, request_rx: mpsc::UnboundedReceiver) { + // 65 KiB should be more than enough for this thread, as all unbounded data + // growth occurs on heap-allocated data structures and buffers and the call + // stack is not going to do anything crazy either + const STACK_SIZE: usize = 1 << 16; + // spawn a light-weight thread with a thread-local async runtime just for + // sending and receiving data over the IPC socket + let _ = thread::Builder::new() + .name("ipc-server-thread".to_string()) + .stack_size(STACK_SIZE) + .spawn(move || { + let rt = runtime::Builder::new_current_thread() + .enable_io() + .build() + .expect("failed to create ipc-server-thread async runtime"); + + rt.block_on(run_ipc_server(stream, request_rx)); + }) + .expect("failed to spawn ipc server thread"); } -impl IpcServer -where - T: AsyncRead + AsyncWrite, -{ - /// Instantiates the Websocket Server - pub fn new(ipc: T, requests: mpsc::UnboundedReceiver) -> Self { - let (socket_reader, socket_writer) = tokio::io::split(ipc); - let socket_reader = ReaderStream::new(socket_reader).fuse(); - Self { - socket_reader, - socket_writer, - requests: requests.fuse(), - pending: HashMap::default(), - subscriptions: HashMap::default(), +async fn run_ipc_server( + mut stream: UnixStream, + request_rx: mpsc::UnboundedReceiver, +) { + // the shared state for both reads & writes + let shared = Shared { + pending: FxHashMap::with_capacity_and_hasher(64, BuildHasherDefault::default()).into(), + subs: FxHashMap::with_capacity_and_hasher(64, BuildHasherDefault::default()).into(), + }; + + // split the stream and run two independent concurrently (local), thereby + // allowing reads and writes to occurr concurrently + let (reader, writer) = stream.split(); + let read = shared.handle_ipc_reads(reader); + let write = shared.handle_ipc_writes(writer, request_rx); + + // run both loops concurrently, until either encounts an error + if let Err(e) = futures_util::try_join!(read, write) { + match e { + IpcError::ServerExit => {} + err => tracing::error!(?err, "exiting IPC server due to error"), } } +} - /// Spawns the event loop - fn spawn(mut self) - where - T: 'static + Send, - { - let f = async move { - let mut read_buffer = Vec::new(); - loop { - let closed = self.process(&mut read_buffer).await.expect("IPC Server panic"); - if closed && self.pending.is_empty() { - break - } - } - }; - - tokio::spawn(f); - } +struct Shared { + pending: RefCell>, + subs: RefCell>, +} - /// Processes 1 item selected from the incoming `requests` or `socket` - #[allow(clippy::single_match)] - async fn process(&mut self, read_buffer: &mut Vec) -> Result { - futures_util::select! { - // Handle requests - msg = self.requests.next() => match msg { - Some(msg) => self.handle_request(msg).await?, - None => return Ok(true), - }, - // Handle socket messages - msg = self.socket_reader.next() => match msg { - Some(Ok(msg)) => self.handle_socket(read_buffer, msg)?, - Some(Err(err)) => { - error!("IPC read error: {:?}", err); - return Err(err.into()); - }, - None => {}, - }, - // finished - complete => {}, - }; +impl Shared { + async fn handle_ipc_reads(&self, reader: ReadHalf<'_>) -> Result { + let mut reader = BufReader::new(reader); + let mut buf = BytesMut::with_capacity(4096); + + loop { + // try to read the next batch of bytes into the buffer + let read = reader.read_buf(&mut buf).await?; + if read == 0 { + // eof, socket was closed + return Err(IpcError::ServerExit) + } - Ok(false) + // parse the received bytes into 0-n jsonrpc messages + let read = self.handle_bytes(&buf)?; + // split off all bytes that were parsed into complete messages + // any remaining bytes that correspond to incomplete messages remain + // in the buffer + buf.advance(read); + } } - async fn handle_request(&mut self, msg: TransportMessage) -> Result<(), IpcError> { - match msg { - TransportMessage::Request { id, request, sender } => { - if self.pending.insert(id, sender).is_some() { - warn!("Replacing a pending request with id {:?}", id); - } - - if let Err(err) = self.socket_writer.write(request.as_bytes()).await { - error!("IPC connection error: {:?}", err); - self.pending.remove(&id); + async fn handle_ipc_writes( + &self, + mut writer: WriteHalf<'_>, + mut request_rx: mpsc::UnboundedReceiver, + ) -> Result { + use TransportMessage::*; + + while let Some(msg) = request_rx.next().await { + match msg { + Request { id, request, sender } => { + let prev = self.pending.borrow_mut().insert(id, sender); + assert!(prev.is_none(), "replaced pending IPC request (id={})", id); + + if let Err(err) = writer.write_all(&request).await { + tracing::error!("IPC connection error: {:?}", err); + self.pending.borrow_mut().remove(&id); + } } - } - TransportMessage::Subscribe { id, sink } => { - if self.subscriptions.insert(id, sink).is_some() { - warn!("Replacing already-registered subscription with id {:?}", id); + Subscribe { id, sink } => { + if self.subs.borrow_mut().insert(id, sink).is_some() { + tracing::warn!( + %id, + "replaced already-registered subscription" + ); + } } - } - TransportMessage::Unsubscribe { id } => { - if self.subscriptions.remove(&id).is_none() { - warn!("Unsubscribing from non-existent subscription with id {:?}", id); + Unsubscribe { id } => { + if self.subs.borrow_mut().remove(&id).is_none() { + tracing::warn!( + %id, + "attempted to unsubscribe from non-existent subscription" + ); + } } } - }; + } - Ok(()) + // the request receiver will only be closed if the sender instance + // located within the transport handle is dropped, this is not truly an + // error but leads to the `try_join` in `run_ipc_server` to cancel the + // read half future + Err(IpcError::ServerExit) } - fn handle_socket( - &mut self, - read_buffer: &mut Vec, - bytes: bytes::Bytes, - ) -> Result<(), IpcError> { - // Extend buffer of previously unread with the new read bytes - read_buffer.extend_from_slice(&bytes); - // Deserialize as many full elements from the stream as exists - let mut de: StreamDeserializer<_, &RawValue> = - Deserializer::from_slice(read_buffer).into_iter(); - // Iterate through these elements, and handle responses/notifications - while let Some(Ok(raw)) = de.next() { - if let Ok(response) = serde_json::from_str(raw.get()) { - // Send notify response if okay. - if let Err(e) = self.respond(response) { - error!(err = %e, "Failed to send IPC response"); - } - } - - if let Ok(notification) = serde_json::from_str(raw.get()) { - // Send notify response if okay. - if let Err(e) = self.notify(notification) { - error!(err = %e, "Failed to send IPC notification"); - } - } - - warn!("JSON from IPC stream is not a response or notification"); + fn handle_bytes(&self, bytes: &BytesMut) -> Result { + // deserialize all complete jsonrpc responses in the buffer + let mut de = Deserializer::from_slice(bytes.as_ref()).into_iter(); + while let Some(Ok(response)) = de.next() { + match response { + Response::Success { id, result } => self.send_response(id, Ok(result.to_owned())), + Response::Error { id, error } => self.send_response(id, Err(error)), + Response::Notification { params, .. } => self.send_notification(params), + }; } - // Get the offset of bytes to handle partial buffer reads - let read_len = de.byte_offset(); + Ok(de.byte_offset()) + } - // Reset buffer to just include the partial value bytes. - read_buffer.copy_within(read_len.., 0); - read_buffer.truncate(read_buffer.len() - read_len); + fn send_response(&self, id: u64, result: Result, JsonRpcError>) { + // retrieve the channel sender for responding to the pending request + let response_tx = match self.pending.borrow_mut().remove(&id) { + Some(tx) => tx, + None => { + tracing::warn!(%id, "no pending request exists for the response ID"); + return + } + }; - Ok(()) + // a failure to send the response indicates that the pending request has + // been dropped in the mean time + let _ = response_tx.send(result.map_err(Into::into)); } /// Sends notification through the channel based on the ID of the subscription. /// This handles streaming responses. - fn notify(&mut self, notification: Notification<'_>) -> Result<(), IpcError> { - let id = notification.params.subscription; - if let Some(tx) = self.subscriptions.get(&id) { - tx.unbounded_send(notification.params.result.to_owned()).map_err(|_| { - IpcError::ChannelError(format!("Subscription receiver {} dropped", id)) - })?; - } - - Ok(()) - } - - /// Sends JSON response through the channel based on the ID in that response. - /// This handles RPC calls with only one response, and the channel entry is dropped after - /// sending. - fn respond(&mut self, response: Response<'_>) -> Result<(), IpcError> { - let id = response.id(); - let res = response.into_result(); - - let response_tx = self.pending.remove(&id).ok_or_else(|| { - IpcError::ChannelError("No response channel exists for the response ID".to_string()) - })?; - - response_tx.send(res).map_err(|_| { - IpcError::ChannelError("Receiver channel for response has been dropped".to_string()) - })?; + fn send_notification(&self, params: Params<'_>) { + // retrieve the channel sender for notifying the subscription stream + let subs = self.subs.borrow(); + let tx = match subs.get(¶ms.subscription) { + Some(tx) => tx, + None => { + tracing::warn!( + id = ?params.subscription, + "no subscription exists for the notification ID" + ); + return + } + }; - Ok(()) + // a failure to send the response indicates that the pending request has + // been dropped in the mean time (and should have been unsubscribed!) + let _ = tx.unbounded_send(params.result.to_owned()); } } @@ -302,7 +308,10 @@ pub enum IpcError { ChannelError(String), #[error(transparent)] - Canceled(#[from] RecvError), + RequestCancelled(#[from] RecvError), + + #[error("The IPC server has exited")] + ServerExit, } impl From for ProviderError { diff --git a/ethers-providers/src/transports/ws.rs b/ethers-providers/src/transports/ws.rs index 10c1f14307..99e4a40604 100644 --- a/ethers-providers/src/transports/ws.rs +++ b/ethers-providers/src/transports/ws.rs @@ -11,10 +11,7 @@ use futures_util::{ sink::{Sink, SinkExt}, stream::{Fuse, Stream, StreamExt}, }; -use serde::{ - de::{DeserializeOwned, Error}, - Serialize, -}; +use serde::{de::DeserializeOwned, Serialize}; use serde_json::value::RawValue; use std::{ collections::{btree_map::Entry, BTreeMap}, @@ -26,7 +23,7 @@ use std::{ }; use thiserror::Error; -use super::common::{Notification, Response}; +use super::common::{Params, Response}; if_wasm! { use wasm_bindgen::prelude::*; @@ -117,7 +114,7 @@ impl Ws { // Spawn the server WsServer::new(ws, stream).spawn(); - Self { id: Arc::new(AtomicU64::new(0)), instructions: sink } + Self { id: Arc::new(AtomicU64::new(1)), instructions: sink } } /// Returns true if the WS connection is active, false otherwise @@ -320,35 +317,34 @@ where } async fn handle_text(&mut self, inner: String) -> Result<(), ClientError> { - if let Ok(response) = serde_json::from_str::>(&inner) { - if let Some(request) = self.pending.remove(&response.id()) { - if !request.is_canceled() { - request.send(response.into_result()).map_err(to_client_error)?; - } - } + let (id, result) = match serde_json::from_str(&inner)? { + Response::Success { id, result } => (id, Ok(result.to_owned())), + Response::Error { id, error } => (id, Err(error)), + Response::Notification { params, .. } => return self.handle_notification(params), + }; - return Ok(()) + if let Some(request) = self.pending.remove(&id) { + if !request.is_canceled() { + request.send(result).map_err(to_client_error)?; + } } - if let Ok(notification) = serde_json::from_str::>(&inner) { - let id = notification.params.subscription; - if let Entry::Occupied(stream) = self.subscriptions.entry(id) { - if let Err(err) = stream.get().unbounded_send(notification.params.result.to_owned()) - { - if err.is_disconnected() { - // subscription channel was closed on the receiver end - stream.remove(); - } - return Err(to_client_error(err)) + Ok(()) + } + + fn handle_notification(&mut self, params: Params<'_>) -> Result<(), ClientError> { + let id = params.subscription; + if let Entry::Occupied(stream) = self.subscriptions.entry(id) { + if let Err(err) = stream.get().unbounded_send(params.result.to_owned()) { + if err.is_disconnected() { + // subscription channel was closed on the receiver end + stream.remove(); } + return Err(to_client_error(err)) } - - return Ok(()) } - Err(ClientError::JsonError(serde_json::Error::custom( - "response is neither a valid jsonrpc response nor notification", - ))) + Ok(()) } #[cfg(target_arch = "wasm32")] diff --git a/ethers-signers/Cargo.toml b/ethers-signers/Cargo.toml index 8714080b96..cbe243835b 100644 --- a/ethers-signers/Cargo.toml +++ b/ethers-signers/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "ethers-signers" license = "MIT OR Apache-2.0" -version = "0.6.0" +version = "0.6.2" authors = ["Georgios Konstantopoulos "] edition = "2018" description = "Signer implementations for the ethers-rs crate" @@ -15,7 +15,7 @@ rustdoc-args = ["--cfg", "docsrs"] [dependencies] ethers-core = { version = "^0.6.0", path = "../ethers-core", features = ["eip712"]} -thiserror = { version = "1.0.30", default-features = false } +thiserror = { version = "1.0.31", default-features = false } coins-bip32 = "0.6.0" coins-bip39 = "0.6.0" coins-ledger = { version = "0.6.0", default-features = false, optional = true } @@ -27,14 +27,14 @@ rand = { version = "0.8.5", default-features = false } yubihsm = { version = "0.40.0", features = ["secp256k1", "http", "usb"], optional = true } futures-util = { version = "^0.3", optional = true } futures-executor = { version = "^0.3", optional = true } -semver = { version = "1.0.7", optional = true } +semver = { version = "1.0.9", optional = true } trezor-client = { version = "0.0.5", optional = true, default-features = false, features = ["f_ethereum"] } # aws -rusoto_core = { version = "0.47.0", optional = true } -rusoto_kms = { version = "0.47.0", optional = true } +rusoto_core = { version = "0.48.0", optional = true } +rusoto_kms = { version = "0.48.0", optional = true } tracing = { version = "0.1.34", optional = true } -spki = { version = "0.5.4", optional = true } +spki = { version = "0.6.0", optional = true } [target.'cfg(not(target_arch = "wasm32"))'.dependencies] eth-keystore = { version = "0.4.1" } @@ -42,7 +42,7 @@ home = { version = "0.5.3", optional = true } [dev-dependencies] ethers-contract = { version = "^0.6.0", path = "../ethers-contract", features = ["eip712", "abigen"]} -ethers-derive-eip712 = { version = "0.2.0", path = "../ethers-core/ethers-derive-eip712" } +ethers-derive-eip712 = { version = "^0.2.0", path = "../ethers-core/ethers-derive-eip712" } serde_json = { version = "1.0.64" } tracing-subscriber = "0.3.11" yubihsm = { version = "0.40.0", features = ["secp256k1", "usb", "mockhsm"] } @@ -58,4 +58,4 @@ celo = ["ethers-core/celo"] ledger = ["coins-ledger", "futures", "semver"] yubi = ["yubihsm"] aws = ["rusoto_core", "rusoto_kms", "tracing", "spki"] -trezor = ["trezor-client", "futures", "semver", "home"] \ No newline at end of file +trezor = ["trezor-client", "futures", "semver", "home"] diff --git a/ethers-signers/src/aws/mod.rs b/ethers-signers/src/aws/mod.rs index 798cb2dbd4..784f59d6fe 100644 --- a/ethers-signers/src/aws/mod.rs +++ b/ethers-signers/src/aws/mod.rs @@ -203,15 +203,19 @@ impl<'a> AwsSigner<'a> { } /// Sign a digest with this signer's key and add the eip155 `v` value - /// corresponding to this signer's chain_id + /// corresponding to the input chain_id #[instrument(err, skip(digest), fields(digest = %hex::encode(&digest)))] - async fn sign_digest_with_eip155(&self, digest: H256) -> Result { + async fn sign_digest_with_eip155( + &self, + digest: H256, + chain_id: u64, + ) -> Result { let sig = self.sign_digest(digest.into()).await?; let sig = utils::rsig_from_digest_bytes_trial_recovery(&sig, digest.into(), &self.pubkey); let mut sig = rsig_to_ethsig(&sig); - apply_eip155(&mut sig, self.chain_id); + apply_eip155(&mut sig, chain_id); Ok(sig) } } @@ -230,13 +234,17 @@ impl<'a> super::Signer for AwsSigner<'a> { trace!("{:?}", message_hash); trace!("{:?}", message); - self.sign_digest_with_eip155(message_hash).await + self.sign_digest_with_eip155(message_hash, self.chain_id).await } #[instrument(err)] async fn sign_transaction(&self, tx: &TypedTransaction) -> Result { + let mut tx_with_chain = tx.clone(); + let chain_id = tx_with_chain.chain_id().map(|id| id.as_u64()).unwrap_or(self.chain_id); + tx_with_chain.set_chain_id(chain_id); + let sighash = tx.sighash(); - self.sign_digest_with_eip155(sighash).await + self.sign_digest_with_eip155(sighash, chain_id).await } async fn sign_typed_data( @@ -245,7 +253,7 @@ impl<'a> super::Signer for AwsSigner<'a> { ) -> Result { let hash = payload.encode_eip712().map_err(|e| Self::Error::Eip712Error(e.to_string()))?; - let digest = self.sign_digest_with_eip155(hash.into()).await?; + let digest = self.sign_digest_with_eip155(hash.into(), self.chain_id).await?; Ok(digest) } diff --git a/ethers-signers/src/ledger/app.rs b/ethers-signers/src/ledger/app.rs index 346231fc0b..59d7bef1f3 100644 --- a/ethers-signers/src/ledger/app.rs +++ b/ethers-signers/src/ledger/app.rs @@ -117,9 +117,41 @@ impl LedgerEthereum { /// Signs an Ethereum transaction (requires confirmation on the ledger) pub async fn sign_tx(&self, tx: &TypedTransaction) -> Result { + let mut tx_with_chain = tx.clone(); + if tx_with_chain.chain_id().is_none() { + // in the case we don't have a chain_id, let's use the signer chain id instead + tx_with_chain.set_chain_id(self.chain_id); + } let mut payload = Self::path_to_bytes(&self.derivation); - payload.extend_from_slice(tx.rlp().as_ref()); - self.sign_payload(INS::SIGN, payload).await + payload.extend_from_slice(tx_with_chain.rlp().as_ref()); + + let mut signature = self.sign_payload(INS::SIGN, payload).await?; + + // modify `v` value of signature to match EIP-155 for chains with large chain ID + // The logic is derived from Ledger's library + // https://github.com/LedgerHQ/ledgerjs/blob/e78aac4327e78301b82ba58d63a72476ecb842fc/packages/hw-app-eth/src/Eth.ts#L300 + let eip155_chain_id = self.chain_id * 2 + 35; + if eip155_chain_id + 1 > 255 { + let one_byte_chain_id = eip155_chain_id % 256; + let ecc_parity = if signature.v > one_byte_chain_id { + signature.v - one_byte_chain_id + } else { + one_byte_chain_id - signature.v + }; + + signature.v = match tx { + TypedTransaction::Eip2930(_) | TypedTransaction::Eip1559(_) => { + if ecc_parity % 2 == 1 { + 0 + } else { + 1 + } + } + TypedTransaction::Legacy(_) => eip155_chain_id + ecc_parity, + }; + } + + Ok(signature) } /// Signs an ethereum personal message diff --git a/ethers-signers/src/ledger/mod.rs b/ethers-signers/src/ledger/mod.rs index 9f24e13b08..817ab1ec1a 100644 --- a/ethers-signers/src/ledger/mod.rs +++ b/ethers-signers/src/ledger/mod.rs @@ -25,7 +25,12 @@ impl Signer for LedgerEthereum { /// Signs the transaction async fn sign_transaction(&self, message: &TypedTransaction) -> Result { - self.sign_tx(message).await + let mut tx_with_chain = message.clone(); + if tx_with_chain.chain_id().is_none() { + // in the case we don't have a chain_id, let's use the signer chain id instead + tx_with_chain.set_chain_id(self.chain_id); + } + self.sign_tx(&tx_with_chain).await } /// Signs a EIP712 derived struct diff --git a/ethers-signers/src/trezor/app.rs b/ethers-signers/src/trezor/app.rs index d67d6b2281..5994c79ad9 100644 --- a/ethers-signers/src/trezor/app.rs +++ b/ethers-signers/src/trezor/app.rs @@ -160,6 +160,8 @@ impl TrezorEthereum { let transaction = TrezorTransaction::load(tx)?; + let chain_id = tx.chain_id().map(|id| id.as_u64()).unwrap_or(self.chain_id); + let signature = match tx { TypedTransaction::Eip2930(_) | TypedTransaction::Legacy(_) => client.ethereum_sign_tx( arr_path, @@ -169,7 +171,7 @@ impl TrezorEthereum { transaction.to, transaction.value, transaction.data, - self.chain_id, + chain_id, )?, TypedTransaction::Eip1559(eip1559_tx) => client.ethereum_sign_eip1559_tx( arr_path, @@ -178,7 +180,7 @@ impl TrezorEthereum { transaction.to, transaction.value, transaction.data, - self.chain_id, + chain_id, transaction.max_fee_per_gas, transaction.max_priority_fee_per_gas, transaction.access_list, diff --git a/ethers-signers/src/trezor/mod.rs b/ethers-signers/src/trezor/mod.rs index 060959b6a1..4bf0e5b57b 100644 --- a/ethers-signers/src/trezor/mod.rs +++ b/ethers-signers/src/trezor/mod.rs @@ -25,7 +25,12 @@ impl Signer for TrezorEthereum { /// Signs the transaction async fn sign_transaction(&self, message: &TypedTransaction) -> Result { - self.sign_tx(message).await + let mut tx_with_chain = message.clone(); + if tx_with_chain.chain_id().is_none() { + // in the case we don't have a chain_id, let's use the signer chain id instead + tx_with_chain.set_chain_id(self.chain_id); + } + self.sign_tx(&tx_with_chain).await } /// Signs a EIP712 derived struct diff --git a/ethers-signers/src/wallet/mod.rs b/ethers-signers/src/wallet/mod.rs index efde9cf2bb..5f44ef6fa7 100644 --- a/ethers-signers/src/wallet/mod.rs +++ b/ethers-signers/src/wallet/mod.rs @@ -18,7 +18,7 @@ use ethers_core::{ }, types::{ transaction::{eip2718::TypedTransaction, eip712::Eip712}, - Address, Signature, H256, U256, U64, + Address, Signature, H256, U256, }, utils::hash_message, }; @@ -79,27 +79,16 @@ impl> Signer fo let message = message.as_ref(); let message_hash = hash_message(message); - Ok(self.sign_hash(message_hash, false)) + Ok(self.sign_hash(message_hash)) } async fn sign_transaction(&self, tx: &TypedTransaction) -> Result { - let chain_id = tx.chain_id(); - match chain_id { - Some(id) => { - if U64::from(self.chain_id) != id { - return Err(WalletError::InvalidTransactionError( - "transaction chain_id does not match the signer".to_string(), - )) - } - Ok(self.sign_transaction_sync(tx)) - } - None => { - // in the case we don't have a chain_id, let's use the signer chain id instead - let mut tx_with_chain = tx.clone(); - tx_with_chain.set_chain_id(self.chain_id); - Ok(self.sign_transaction_sync(&tx_with_chain)) - } + let mut tx_with_chain = tx.clone(); + if tx_with_chain.chain_id() == None { + // in the case we don't have a chain_id, let's use the signer chain id instead + tx_with_chain.set_chain_id(self.chain_id); } + Ok(self.sign_transaction_sync(&tx_with_chain)) } async fn sign_typed_data( @@ -109,7 +98,7 @@ impl> Signer fo let encoded = payload.encode_eip712().map_err(|e| Self::Error::Eip712Error(e.to_string()))?; - Ok(self.sign_hash(H256::from(encoded), false)) + Ok(self.sign_hash(H256::from(encoded))) } fn address(&self) -> Address { @@ -129,23 +118,24 @@ impl> Signer fo } impl> Wallet { - /// Synchronously signs the provided transaction. + /// Synchronously signs the provided transaction, normalizing the signature `v` value with + /// EIP-155 using the transaction's `chain_id`. pub fn sign_transaction_sync(&self, tx: &TypedTransaction) -> Signature { let sighash = tx.sighash(); - self.sign_hash(sighash, true) + let chain_id = tx.chain_id().map(|id| id.as_u64()).unwrap_or(self.chain_id); + let mut sig = self.sign_hash(sighash); + + // sign_hash sets `v` to recid + 27, so we need to subtract 27 before normalizing + sig.v = to_eip155_v(sig.v as u8 - 27, chain_id); + sig } - /// Signs the provided hash and proceeds to normalize the `v` value of the - /// signature with EIP-155 if the flag is set to true. - pub fn sign_hash(&self, hash: H256, eip155: bool) -> Signature { + /// Signs the provided hash. + pub fn sign_hash(&self, hash: H256) -> Signature { let recoverable_sig: RecoverableSignature = self.signer.sign_digest(Sha256Proxy::from(hash)); - let v = if eip155 { - to_eip155_v(recoverable_sig.recovery_id(), self.chain_id) - } else { - u8::from(recoverable_sig.recovery_id()) as u64 + 27 - }; + let v = u8::from(recoverable_sig.recovery_id()) as u64 + 27; let r_bytes: FieldBytes = recoverable_sig.r().into(); let s_bytes: FieldBytes = recoverable_sig.s().into(); diff --git a/ethers-signers/src/wallet/private_key.rs b/ethers-signers/src/wallet/private_key.rs index eb3f2cfb06..d2bd75fa91 100644 --- a/ethers-signers/src/wallet/private_key.rs +++ b/ethers-signers/src/wallet/private_key.rs @@ -46,8 +46,6 @@ pub enum WalletError { /// Error type from Eip712Error message #[error("error encoding eip712 struct: {0:?}")] Eip712Error(String), - #[error("invalid transaction: {0:?}")] - InvalidTransactionError(String), } impl Clone for Wallet { @@ -221,6 +219,39 @@ mod tests { assert!(sig.verify(sighash, wallet.address).is_ok()); } + #[tokio::test] + #[cfg(not(feature = "celo"))] + async fn signs_tx_empty_chain_id() { + use crate::TypedTransaction; + use ethers_core::types::TransactionRequest; + // retrieved test vector from: + // https://web3js.readthedocs.io/en/v1.2.0/web3-eth-accounts.html#eth-accounts-signtransaction + let tx: TypedTransaction = TransactionRequest { + from: None, + to: Some("F0109fC8DF283027b6285cc889F5aA624EaC1F55".parse::

().unwrap().into()), + value: Some(1_000_000_000.into()), + gas: Some(2_000_000.into()), + nonce: Some(0.into()), + gas_price: Some(21_000_000_000u128.into()), + data: None, + chain_id: None, + } + .into(); + let wallet: Wallet = + "4c0883a69102937d6231471b5dbb6204fe5129617082792ae468d01a3f362318".parse().unwrap(); + let wallet = wallet.with_chain_id(1u64); + + // this should populate the tx chain_id as the signer's chain_id (1) before signing + let sig = wallet.sign_transaction(&tx).await.unwrap(); + + // since we initialize with None we need to re-set the chain_id for the sighash to be + // correct + let mut tx = tx; + tx.set_chain_id(1); + let sighash = tx.sighash(); + assert!(sig.verify(sighash, wallet.address).is_ok()); + } + #[test] fn key_to_address() { let wallet: Wallet = diff --git a/ethers-solc/Cargo.toml b/ethers-solc/Cargo.toml index fe62ee729f..4535078939 100644 --- a/ethers-solc/Cargo.toml +++ b/ethers-solc/Cargo.toml @@ -17,14 +17,14 @@ keywords = ["ethereum", "web3", "solc", "solidity", "ethers"] ethers-core = { version = "^0.6.0", path = "../ethers-core", default-features = false } serde_json = "1.0.68" serde = { version = "1.0.130", features = ["derive"] } -semver = { version = "1.0.7", features = ["serde"] } +semver = { version = "1.0.9", features = ["serde"] } walkdir = "2.3.2" -tokio = { version = "1.15.0", default-features = false, features = ["process", "io-util", "fs", "time"], optional = true } +tokio = { version = "1.15.0", default-features = false, features = ["rt"] } futures-util = { version = "^0.3", optional = true } once_cell = "1.10.0" regex = "1.5.5" md-5 = "0.10.1" -thiserror = "1.0.30" +thiserror = "1.0.31" hex = "0.4.3" colored = "2.0.0" glob = "0.3.0" @@ -35,16 +35,18 @@ tempfile = { version = "3.3.0", optional = true } fs_extra = { version = "1.2.0", optional = true } sha2 = { version = "0.9.8", default-features = false, optional = true } dunce = "1.0.2" -solang-parser = { default-features = false, version = "0.1.12" } -rayon = "1.5.2" +solang-parser = { default-features = false, version = "=0.1.13" } +rayon = "1.5.3" rand = { version = "0.8.5", optional = true } +path-slash = "0.1.4" +cfg-if = "1.0.0" [target.'cfg(not(target_arch = "wasm32"))'.dependencies] home = "0.5.3" # SVM is not WASM compatible yet. # svm = { package = "svm-rs", default-features = false, version = "0.2.7", optional = true } -svm = { package = "svm-rs", default-features = false, git = "https://github.com/roynalnaruto/svm-rs", optional = true, features = ["blocking"] } -svm-builds = { package = "svm-rs-builds", git = "https://github.com/roynalnaruto/svm-rs", optional = true} +svm = { package = "svm-rs", version = "0.2.9", default-features = false, git = "https://github.com/roynalnaruto/svm-rs", optional = true, features = ["blocking"] } +svm-builds = { package = "svm-rs-builds", version = "0.1.0", git = "https://github.com/roynalnaruto/svm-rs", optional = true} [target.'cfg(target_arch = "wasm32")'.dependencies] # NOTE: this enables wasm compatibility for getrandom indirectly @@ -79,7 +81,7 @@ required-features = ["full", "project-util"] [features] default = ["rustls"] -async = ["tokio", "futures-util"] +async = ["tokio/process", "tokio/io-util", "tokio/fs", "tokio/time", "futures-util"] full = ["async", "svm-solc"] svm-solc = ["svm/blocking", "svm-builds", "sha2"] # Utilities for creating and testing project workspaces diff --git a/ethers-solc/src/artifact_output/configurable.rs b/ethers-solc/src/artifact_output/configurable.rs index b25e962f62..588d0533c7 100644 --- a/ethers-solc/src/artifact_output/configurable.rs +++ b/ethers-solc/src/artifact_output/configurable.rs @@ -4,9 +4,12 @@ use crate::{ artifacts::{ bytecode::{CompactBytecode, CompactDeployedBytecode}, contract::{CompactContract, CompactContractBytecode, Contract}, - output_selection::{ContractOutputSelection, EvmOutputSelection, EwasmOutputSelection}, - CompactContractBytecodeCow, CompactEvm, DevDoc, Ewasm, GasEstimates, LosslessAbi, Metadata, - Offsets, Settings, StorageLayout, UserDoc, + output_selection::{ + BytecodeOutputSelection, ContractOutputSelection, EvmOutputSelection, + EwasmOutputSelection, + }, + Ast, CompactContractBytecodeCow, DevDoc, Evm, Ewasm, FunctionDebugData, GasEstimates, + GeneratedSource, LosslessAbi, Metadata, Offsets, Settings, StorageLayout, UserDoc, }, ArtifactOutput, SolcConfig, SolcError, SourceFile, }; @@ -26,11 +29,14 @@ pub struct ConfigurableContractArtifact { pub bytecode: Option, #[serde(default, skip_serializing_if = "Option::is_none")] pub deployed_bytecode: Option, - #[serde(default, skip_serializing_if = "Option::is_none")] pub assembly: Option, #[serde(default, skip_serializing_if = "Option::is_none")] pub method_identifiers: Option>, + #[serde(default, skip_serializing_if = "Vec::is_empty")] + pub generated_sources: Vec, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub function_debug_data: Option>, #[serde(default, skip_serializing_if = "Option::is_none")] pub gas_estimates: Option, #[serde(default, skip_serializing_if = "Option::is_none")] @@ -47,8 +53,8 @@ pub struct ConfigurableContractArtifact { pub ir_optimized: Option, #[serde(default, skip_serializing_if = "Option::is_none")] pub ewasm: Option, - #[serde(default, skip_serializing_if = "serde_json::Value::is_null")] - pub ast: serde_json::Value, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub ast: Option, } impl ConfigurableContractArtifact { @@ -107,7 +113,8 @@ impl<'a> From<&'a ConfigurableContractArtifact> for CompactContractBytecodeCow<' /// { /// "abi": [], /// "bytecode": {...}, -/// "deployedBytecode": {...} +/// "deployedBytecode": {...}, +/// "methodIdentifiers": {...}, /// // additional values /// } /// ``` @@ -154,6 +161,7 @@ impl ConfigurableArtifacts { /// Returns the output selection corresponding to this configuration pub fn output_selection(&self) -> Vec { let mut selection = ContractOutputSelection::basic(); + if self.additional_values.ir { selection.push(ContractOutputSelection::Ir); } @@ -181,6 +189,20 @@ impl ConfigurableArtifacts { if self.additional_values.ewasm || self.additional_files.ewasm { selection.push(EwasmOutputSelection::All.into()); } + if self.additional_values.function_debug_data { + selection.push(BytecodeOutputSelection::FunctionDebugData.into()); + } + if self.additional_values.method_identifiers { + selection.push(EvmOutputSelection::MethodIdentifiers.into()); + } + if self.additional_values.generated_sources { + selection.push( + EvmOutputSelection::ByteCode(BytecodeOutputSelection::GeneratedSources).into(), + ); + } + if self.additional_values.source_map { + selection.push(EvmOutputSelection::ByteCode(BytecodeOutputSelection::SourceMap).into()); + } selection } } @@ -208,9 +230,11 @@ impl ArtifactOutput for ConfigurableArtifacts { let mut artifact_bytecode = None; let mut artifact_deployed_bytecode = None; let mut artifact_gas_estimates = None; + let mut artifact_function_debug_data = None; let mut artifact_method_identifiers = None; let mut artifact_assembly = None; let mut artifact_storage_layout = None; + let mut generated_sources = None; let Contract { abi, @@ -247,24 +271,31 @@ impl ArtifactOutput for ConfigurableArtifacts { } if let Some(evm) = evm { - let CompactEvm { + let Evm { assembly, - bytecode, + mut bytecode, deployed_bytecode, method_identifiers, gas_estimates, .. - } = evm.into_compact(); + } = evm; - artifact_bytecode = bytecode; - artifact_deployed_bytecode = deployed_bytecode; + if self.additional_values.function_debug_data { + artifact_function_debug_data = + bytecode.as_ref().map(|b| b.function_debug_data.clone()); + } + if self.additional_values.generated_sources { + generated_sources = + bytecode.as_mut().map(|code| std::mem::take(&mut code.generated_sources)); + } + + artifact_bytecode = bytecode.map(Into::into); + artifact_deployed_bytecode = deployed_bytecode.map(Into::into); + artifact_method_identifiers = Some(method_identifiers); if self.additional_values.gas_estimates { artifact_gas_estimates = gas_estimates; } - if self.additional_values.method_identifiers { - artifact_method_identifiers = Some(method_identifiers); - } if self.additional_values.assembly { artifact_assembly = assembly; } @@ -275,6 +306,7 @@ impl ArtifactOutput for ConfigurableArtifacts { bytecode: artifact_bytecode, deployed_bytecode: artifact_deployed_bytecode, assembly: artifact_assembly, + function_debug_data: artifact_function_debug_data, method_identifiers: artifact_method_identifiers, gas_estimates: artifact_gas_estimates, metadata: artifact_metadata, @@ -284,7 +316,8 @@ impl ArtifactOutput for ConfigurableArtifacts { ir: artifact_ir, ir_optimized: artifact_ir_optimized, ewasm: artifact_ewasm, - ast: source_file.map(|s| s.ast.clone()).unwrap_or_default(), + ast: source_file.and_then(|s| s.ast.clone()), + generated_sources: generated_sources.unwrap_or_default(), } } } @@ -304,6 +337,9 @@ pub struct ExtraOutputValues { pub ir: bool, pub ir_optimized: bool, pub ewasm: bool, + pub function_debug_data: bool, + pub generated_sources: bool, + pub source_map: bool, /// PRIVATE: This structure may grow, As such, constructing this structure should /// _always_ be done using a public constructor or update syntax: @@ -336,6 +372,9 @@ impl ExtraOutputValues { ir: true, ir_optimized: true, ewasm: true, + function_debug_data: true, + generated_sources: true, + source_map: true, __non_exhaustive: (), } } @@ -370,6 +409,8 @@ impl ExtraOutputValues { config.assembly = true; config.gas_estimates = true; config.method_identifiers = true; + config.generated_sources = true; + config.source_map = true; } EvmOutputSelection::Assembly => { config.assembly = true; @@ -380,6 +421,15 @@ impl ExtraOutputValues { EvmOutputSelection::GasEstimates => { config.gas_estimates = true; } + EvmOutputSelection::ByteCode(BytecodeOutputSelection::FunctionDebugData) => { + config.function_debug_data = true; + } + EvmOutputSelection::ByteCode(BytecodeOutputSelection::GeneratedSources) => { + config.generated_sources = true; + } + EvmOutputSelection::ByteCode(BytecodeOutputSelection::SourceMap) => { + config.source_map = true; + } _ => {} }, ContractOutputSelection::Ewasm(_) => { @@ -396,10 +446,13 @@ impl ExtraOutputValues { /// Determines what to emit as additional file #[derive(Debug, Copy, Clone, Eq, PartialEq, Default)] pub struct ExtraOutputFiles { + pub abi: bool, pub metadata: bool, pub ir_optimized: bool, pub ewasm: bool, pub assembly: bool, + pub source_map: bool, + pub generated_sources: bool, /// PRIVATE: This structure may grow, As such, constructing this structure should /// _always_ be done using a public constructor or update syntax: @@ -420,10 +473,13 @@ impl ExtraOutputFiles { /// Returns an instance where all values are set to `true` pub fn all() -> Self { Self { + abi: true, metadata: true, ir_optimized: true, ewasm: true, assembly: true, + source_map: true, + generated_sources: true, __non_exhaustive: (), } } @@ -435,6 +491,9 @@ impl ExtraOutputFiles { let mut config = Self::default(); for value in settings.into_iter() { match value { + ContractOutputSelection::Abi => { + config.abi = true; + } ContractOutputSelection::Metadata => { config.metadata = true; } @@ -444,10 +503,18 @@ impl ExtraOutputFiles { ContractOutputSelection::Evm(evm) => match evm { EvmOutputSelection::All => { config.assembly = true; + config.generated_sources = true; + config.source_map = true; } EvmOutputSelection::Assembly => { config.assembly = true; } + EvmOutputSelection::ByteCode(BytecodeOutputSelection::GeneratedSources) => { + config.generated_sources = true; + } + EvmOutputSelection::ByteCode(BytecodeOutputSelection::SourceMap) => { + config.source_map = true; + } _ => {} }, ContractOutputSelection::Ewasm(_) => { @@ -461,6 +528,14 @@ impl ExtraOutputFiles { /// Write the set values as separate files pub fn write_extras(&self, contract: &Contract, file: &Path) -> Result<(), SolcError> { + if self.abi { + if let Some(ref abi) = contract.abi { + let file = file.with_extension("abi.json"); + fs::write(&file, serde_json::to_string_pretty(abi)?) + .map_err(|err| SolcError::io(err, file))? + } + } + if self.metadata { if let Some(ref metadata) = contract.metadata { let file = file.with_extension("metadata.json"); @@ -500,6 +575,27 @@ impl ExtraOutputFiles { } } + if self.generated_sources { + if let Some(ref evm) = contract.evm { + if let Some(ref bytecode) = evm.bytecode { + let file = file.with_extension("gensources"); + fs::write(&file, serde_json::to_vec_pretty(&bytecode.generated_sources)?) + .map_err(|err| SolcError::io(err, file))?; + } + } + } + + if self.source_map { + if let Some(ref evm) = contract.evm { + if let Some(ref bytecode) = evm.bytecode { + if let Some(ref sourcemap) = bytecode.source_map { + let file = file.with_extension("sourcemap"); + fs::write(&file, sourcemap).map_err(|err| SolcError::io(err, file))? + } + } + } + } + Ok(()) } } diff --git a/ethers-solc/src/artifact_output/mod.rs b/ethers-solc/src/artifact_output/mod.rs index e5bfde6cd6..fa736bc34b 100644 --- a/ethers-solc/src/artifact_output/mod.rs +++ b/ethers-solc/src/artifact_output/mod.rs @@ -1,8 +1,8 @@ //! Output artifact handling use crate::{ - artifacts::FileToContractsMap, contracts::VersionedContracts, error::Result, utils, - HardhatArtifact, ProjectPathsConfig, SolcError, + artifacts::FileToContractsMap, error::Result, utils, HardhatArtifact, ProjectPathsConfig, + SolcError, }; use ethers_core::{abi::Abi, types::Bytes}; use semver::Version; @@ -15,10 +15,14 @@ use std::{ }; mod configurable; -use crate::artifacts::{ - contract::{CompactContract, CompactContractBytecode, Contract}, - BytecodeObject, CompactBytecode, CompactContractBytecodeCow, CompactDeployedBytecode, - SourceFile, +use crate::{ + artifacts::{ + contract::{CompactContract, CompactContractBytecode, Contract}, + BytecodeObject, CompactBytecode, CompactContractBytecodeCow, CompactDeployedBytecode, + SourceFile, + }, + compile::output::{contracts::VersionedContracts, sources::VersionedSourceFiles}, + sourcemap::{SourceMap, SyntaxError}, }; pub use configurable::*; @@ -395,6 +399,22 @@ pub trait Artifact { fn get_abi(&self) -> Option> { self.get_contract_bytecode().abi } + + /// Returns the `sourceMap` of the contract + /// + /// Returns `None` if no `sourceMap` string was included in the compiler output + /// Returns `Some(Err)` if parsing the sourcemap failed + fn get_source_map(&self) -> Option> { + self.get_bytecode()?.source_map() + } + + /// Returns the `sourceMap` as str if it was included in the compiler output + fn get_source_map_str(&self) -> Option> { + match self.get_bytecode()? { + Cow::Borrowed(code) => code.source_map.as_deref().map(Cow::Borrowed), + Cow::Owned(code) => code.source_map.map(Cow::Owned), + } + } } impl Artifact for T @@ -447,7 +467,7 @@ pub trait ArtifactOutput { fn on_output( &self, contracts: &VersionedContracts, - sources: &BTreeMap, + sources: &VersionedSourceFiles, layout: &ProjectPathsConfig, ) -> Result> { let mut artifacts = self.output_to_artifacts(contracts, sources); @@ -609,16 +629,17 @@ pub trait ArtifactOutput { fn output_to_artifacts( &self, contracts: &VersionedContracts, - sources: &BTreeMap, + sources: &VersionedSourceFiles, ) -> Artifacts { let mut artifacts = ArtifactsMap::new(); for (file, contracts) in contracts.as_ref().iter() { - let source_file = sources.get(file); let mut entries = BTreeMap::new(); for (name, versioned_contracts) in contracts { let mut contracts = Vec::with_capacity(versioned_contracts.len()); // check if the same contract compiled with multiple solc versions for contract in versioned_contracts { + let source_file = sources.find_file_and_version(file, &contract.version); + let artifact_path = if versioned_contracts.len() > 1 { Self::output_file_versioned(file, name, &contract.version) } else { @@ -689,7 +710,7 @@ impl ArtifactOutput for MinimalCombinedArtifactsHardhatFallback { fn on_output( &self, output: &VersionedContracts, - sources: &BTreeMap, + sources: &VersionedSourceFiles, layout: &ProjectPathsConfig, ) -> Result> { MinimalCombinedArtifacts::default().on_output(output, sources, layout) diff --git a/ethers-solc/src/artifacts/ast.rs b/ethers-solc/src/artifacts/ast.rs new file mode 100644 index 0000000000..236c3bdb3c --- /dev/null +++ b/ethers-solc/src/artifacts/ast.rs @@ -0,0 +1,217 @@ +//! Bindings for solc's `ast` output field + +use crate::artifacts::serde_helpers; +use serde::{de::DeserializeOwned, Deserialize, Serialize}; +use std::{collections::BTreeMap, fmt, fmt::Write, str::FromStr}; + +/// Represents the AST field in the solc output +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +pub struct Ast { + #[serde(rename = "absolutePath")] + pub absolute_path: String, + pub id: usize, + #[serde(default, rename = "exportedSymbols")] + pub exported_symbols: BTreeMap>, + #[serde(rename = "nodeType")] + pub node_type: NodeType, + #[serde(with = "serde_helpers::display_from_str")] + pub src: SourceLocation, + #[serde(default, skip_serializing_if = "Vec::is_empty")] + pub nodes: Vec, + + /// Node attributes that were not deserialized. + #[serde(flatten)] + pub other: BTreeMap, +} + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +pub struct Node { + /// The node ID. + #[serde(default, skip_serializing_if = "Option::is_none")] + pub id: Option, + + /// The node type. + #[serde(rename = "nodeType")] + pub node_type: NodeType, + + /// The location of the node in the source file. + #[serde(with = "serde_helpers::display_from_str")] + pub src: SourceLocation, + + /// Child nodes for some node types. + #[serde(default, skip_serializing_if = "Vec::is_empty")] + pub nodes: Vec, + + /// Body node for some node types. + #[serde(default, skip_serializing_if = "Option::is_none")] + pub body: Option>, + + /// Node attributes that were not deserialized. + #[serde(flatten)] + pub other: BTreeMap, +} + +impl Node { + /// Deserialize a serialized node attribute. + pub fn attribute(&self, key: impl AsRef) -> Option { + // TODO: Can we avoid this clone? + self.other.get(key.as_ref()).and_then(|v| serde_json::from_value(v.clone()).ok()) + } +} + +/// Represents the source location of a node: `::`. +/// +/// The `length` and `index` can be -1 which is represented as `None` +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +pub struct SourceLocation { + pub start: usize, + pub length: Option, + pub index: Option, +} + +impl FromStr for SourceLocation { + type Err = String; + + fn from_str(s: &str) -> Result { + let invalid_location = move || format!("{} invalid source location", s); + + let mut split = s.split(':'); + let start = split + .next() + .ok_or_else(invalid_location)? + .parse::() + .map_err(|_| invalid_location())?; + let length = split + .next() + .ok_or_else(invalid_location)? + .parse::() + .map_err(|_| invalid_location())?; + let index = split + .next() + .ok_or_else(invalid_location)? + .parse::() + .map_err(|_| invalid_location())?; + + let length = if length < 0 { None } else { Some(length as usize) }; + let index = if index < 0 { None } else { Some(index as usize) }; + + Ok(Self { start, length, index }) + } +} + +impl fmt::Display for SourceLocation { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + self.start.fmt(f)?; + f.write_char(':')?; + if let Some(length) = self.length { + length.fmt(f)?; + } else { + f.write_str("-1")?; + } + f.write_char(':')?; + if let Some(index) = self.index { + index.fmt(f)?; + } else { + f.write_str("-1")?; + } + Ok(()) + } +} + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +pub enum NodeType { + // Expressions + Assignment, + BinaryOperation, + Conditional, + ElementaryTypeNameExpression, + FunctionCall, + FunctionCallOptions, + Identifier, + IndexAccess, + IndexRangeAccess, + Literal, + MemberAccess, + NewExpression, + TupleExpression, + UnaryOperation, + + // Statements + Block, + Break, + Continue, + DoWhileStatement, + EmitStatement, + ExpressionStatement, + ForStatement, + IfStatement, + InlineAssembly, + PlaceholderStatement, + Return, + RevertStatement, + TryStatement, + UncheckedBlock, + VariableDeclarationStatement, + VariableDeclaration, + WhileStatement, + + // Yul statements + YulAssignment, + YulBlock, + YulBreak, + YulContinue, + YulExpressionStatement, + YulLeave, + YulForLoop, + YulFunctionDefinition, + YulIf, + YulSwitch, + YulVariableDeclaration, + + // Yul expressions + YulFunctionCall, + YulIdentifier, + YulLiteral, + + // Yul literals + YulLiteralValue, + YulHexValue, + + // Definitions + ContractDefinition, + FunctionDefinition, + EventDefinition, + ErrorDefinition, + ModifierDefinition, + StructDefinition, + EnumDefinition, + UserDefinedValueTypeDefinition, + + // Directives + PragmaDirective, + ImportDirective, + UsingForDirective, + + // Misc + SourceUnit, + InheritanceSpecifier, + ElementaryTypeName, + FunctionTypeName, + ParameterList, + TryCatchClause, + ModifierInvocation, + + /// An unknown AST node type. + Other(String), +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn can_parse_ast() { + let ast = include_str!("../../test-data/ast/ast-erc4626.json"); + let _ast: Ast = serde_json::from_str(ast).unwrap(); + } +} diff --git a/ethers-solc/src/artifacts/bytecode.rs b/ethers-solc/src/artifacts/bytecode.rs index 6025669c18..8f6837ce51 100644 --- a/ethers-solc/src/artifacts/bytecode.rs +++ b/ethers-solc/src/artifacts/bytecode.rs @@ -46,6 +46,13 @@ pub struct CompactBytecode { } impl CompactBytecode { + /// Returns the parsed source map + /// + /// See also + pub fn source_map(&self) -> Option> { + self.source_map.as_ref().map(|map| sourcemap::parse(map)) + } + /// Tries to link the bytecode object with the `file` and `library` name. /// Replaces all library placeholders with the given address. /// diff --git a/ethers-solc/src/artifacts/mod.rs b/ethers-solc/src/artifacts/mod.rs index c60bd8e31a..497e008af9 100644 --- a/ethers-solc/src/artifacts/mod.rs +++ b/ethers-solc/src/artifacts/mod.rs @@ -11,10 +11,15 @@ use std::{ str::FromStr, }; -use crate::{compile::*, error::SolcIoError, remappings::Remapping, utils}; +use crate::{ + compile::*, error::SolcIoError, remappings::Remapping, utils, ProjectPathsConfig, SolcError, +}; use serde::{de::Visitor, Deserialize, Deserializer, Serialize, Serializer}; +use tracing::warn; +pub mod ast; +pub use ast::*; pub mod bytecode; pub mod contract; pub mod output_selection; @@ -41,10 +46,12 @@ pub type Contracts = FileToContractsMap; pub type Sources = BTreeMap; /// A set of different Solc installations with their version and the sources to be compiled -pub type VersionedSources = BTreeMap; +pub(crate) type VersionedSources = BTreeMap; /// A set of different Solc installations with their version and the sources to be compiled -pub type VersionedFilteredSources = BTreeMap; +pub(crate) type VersionedFilteredSources = BTreeMap; + +const SOLIDITY: &str = "Solidity"; /// Input type `solc` expects #[derive(Clone, Debug, Serialize, Deserialize)] @@ -77,7 +84,7 @@ impl CompilerInput { let mut res = Vec::new(); if !solidity_sources.is_empty() { res.push(Self { - language: "Solidity".to_string(), + language: SOLIDITY.to_string(), sources: solidity_sources, settings: Default::default(), }); @@ -97,6 +104,8 @@ impl CompilerInput { pub fn sanitized(mut self, version: &Version) -> Self { static PRE_V0_6_0: once_cell::sync::Lazy = once_cell::sync::Lazy::new(|| VersionReq::parse("<0.6.0").unwrap()); + static PRE_V0_8_10: once_cell::sync::Lazy = + once_cell::sync::Lazy::new(|| VersionReq::parse("<0.8.10").unwrap()); if PRE_V0_6_0.matches(version) { if let Some(ref mut meta) = self.settings.metadata { @@ -104,7 +113,21 @@ impl CompilerInput { // missing in meta.bytecode_hash.take(); } + // introduced in + let _ = self.settings.debug.take(); + } + + if PRE_V0_8_10.matches(version) { + if let Some(ref mut debug) = self.settings.debug { + // introduced in + // + debug.debug_info.clear(); + } + + // 0.8.10 is the earliest version that has all model checker options. + self.settings.model_checker = None; } + self } @@ -165,6 +188,52 @@ impl CompilerInput { } } +/// A `CompilerInput` representation used for verify +/// +/// This type is an alternative `CompilerInput` but uses non-alphabetic ordering of the `sources` +/// and instead emits the (Path -> Source) path in the same order as the pairs in the `sources` +/// `Vec`. This is used over a map, so we can determine the order in which etherscan will display +/// the verified contracts +#[derive(Clone, Debug, Serialize, Deserialize)] +pub struct StandardJsonCompilerInput { + pub language: String, + #[serde(with = "serde_helpers::tuple_vec_map")] + pub sources: Vec<(PathBuf, Source)>, + pub settings: Settings, +} + +// === impl StandardJsonCompilerInput === + +impl StandardJsonCompilerInput { + pub fn new(sources: Vec<(PathBuf, Source)>, settings: Settings) -> Self { + Self { language: SOLIDITY.to_string(), sources, settings } + } + + /// Normalizes the EVM version used in the settings to be up to the latest one + /// supported by the provided compiler version. + #[must_use] + pub fn normalize_evm_version(mut self, version: &Version) -> Self { + if let Some(ref mut evm_version) = self.settings.evm_version { + self.settings.evm_version = evm_version.normalize_version(version); + } + self + } +} + +impl From for CompilerInput { + fn from(input: StandardJsonCompilerInput) -> Self { + let StandardJsonCompilerInput { language, sources, settings } = input; + CompilerInput { language, sources: sources.into_iter().collect(), settings } + } +} + +impl From for StandardJsonCompilerInput { + fn from(input: CompilerInput) -> Self { + let CompilerInput { language, sources, settings } = input; + StandardJsonCompilerInput { language, sources: sources.into_iter().collect(), settings } + } +} + #[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct Settings { @@ -175,6 +244,9 @@ pub struct Settings { #[serde(default, skip_serializing_if = "Vec::is_empty")] pub remappings: Vec, pub optimizer: Optimizer, + /// Model Checker options. + #[serde(default, skip_serializing_if = "Option::is_none")] + pub model_checker: Option, /// Metadata settings #[serde(default, skip_serializing_if = "Option::is_none")] pub metadata: Option, @@ -194,8 +266,17 @@ pub struct Settings { /// false by default. #[serde(rename = "viaIR", default, skip_serializing_if = "Option::is_none")] pub via_ir: Option, - #[serde(default, skip_serializing_if = "::std::collections::BTreeMap::is_empty")] - pub libraries: BTreeMap>, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub debug: Option, + /// Addresses of the libraries. If not all libraries are given here, + /// it can result in unlinked objects whose output data is different. + /// + /// The top level key is the name of the source file where the library is used. + /// If remappings are used, this source file should match the global path + /// after remappings were applied. + /// If this key is an empty string, that refers to a global level. + #[serde(default, skip_serializing_if = "Libraries::is_empty")] + pub libraries: Libraries, } impl Settings { @@ -308,13 +389,110 @@ impl Default for Settings { output_selection: OutputSelection::default_output_selection(), evm_version: Some(EvmVersion::default()), via_ir: None, + debug: None, libraries: Default::default(), remappings: Default::default(), + model_checker: None, } .with_ast() } } +/// A wrapper type for all libraries in the form of `::` +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Default)] +#[serde(transparent)] +pub struct Libraries { + /// All libraries, `(file path -> (Lib name -> Address)) + pub libs: BTreeMap>, +} + +// === impl Libraries === + +impl Libraries { + /// Parses all libraries in the form of + /// `::` + /// + /// # Example + /// + /// ``` + /// use ethers_solc::artifacts::Libraries; + /// let libs = Libraries::parse(&[ + /// "src/DssSpell.sol:DssExecLib:0xfD88CeE74f7D78697775aBDAE53f9Da1559728E4".to_string(), + /// ]) + /// .unwrap(); + /// ``` + pub fn parse(libs: &[String]) -> Result { + let mut libraries = BTreeMap::default(); + for lib in libs { + let mut items = lib.split(':'); + let file = items.next().ok_or_else(|| { + SolcError::msg(format!("failed to parse path to library file: {}", lib)) + })?; + let lib = items + .next() + .ok_or_else(|| SolcError::msg(format!("failed to parse library name: {}", lib)))?; + let addr = items.next().ok_or_else(|| { + SolcError::msg(format!("failed to parse library address: {}", lib)) + })?; + if items.next().is_some() { + return Err(SolcError::msg(format!( + "failed to parse, too many arguments passed: {}", + lib + ))) + } + libraries + .entry(file.into()) + .or_insert_with(BTreeMap::default) + .insert(lib.to_string(), addr.to_string()); + } + Ok(Self { libs: libraries }) + } + + pub fn is_empty(&self) -> bool { + self.libs.is_empty() + } + + pub fn len(&self) -> usize { + self.libs.len() + } + + /// Solc expects the lib paths to match the global path after remappings were applied + /// + /// See also [ProjectPathsConfig::resolve_import] + pub fn with_applied_remappings(mut self, config: &ProjectPathsConfig) -> Self { + self.libs = self + .libs + .into_iter() + .map(|(file, target)| { + let file = config.resolve_import(&config.root, &file).unwrap_or_else(|err| { + warn!(target: "libs", "Failed to resolve library `{}` for linking: {:?}", file.display(), err); + file + }); + (file, target) + }) + .collect(); + self + } +} + +impl From>> for Libraries { + fn from(libs: BTreeMap>) -> Self { + Self { libs } + } +} + +impl AsRef>> for Libraries { + fn as_ref(&self) -> &BTreeMap> { + &self.libs + } +} + +impl AsMut>> for Libraries { + fn as_mut(&mut self) -> &mut BTreeMap> { + &mut self.libs + } +} + #[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] pub struct Optimizer { #[serde(default, skip_serializing_if = "Option::is_none")] @@ -483,6 +661,80 @@ impl FromStr for EvmVersion { } } } + +/// Debugging settings for solc +#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct DebuggingSettings { + #[serde( + default, + with = "serde_helpers::display_from_str_opt", + skip_serializing_if = "Option::is_none" + )] + pub revert_strings: Option, + ///How much extra debug information to include in comments in the produced EVM assembly and + /// Yul code. + /// Available components are: + // - `location`: Annotations of the form `@src ::` indicating the location of + // the corresponding element in the original Solidity file, where: + // - `` is the file index matching the `@use-src` annotation, + // - `` is the index of the first byte at that location, + // - `` is the index of the first byte after that location. + // - `snippet`: A single-line code snippet from the location indicated by `@src`. The snippet is + // quoted and follows the corresponding `@src` annotation. + // - `*`: Wildcard value that can be used to request everything. + #[serde(default, skip_serializing_if = "Vec::is_empty")] + pub debug_info: Vec, +} + +/// How to treat revert (and require) reason strings. +#[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize)] +pub enum RevertStrings { + /// "default" does not inject compiler-generated revert strings and keeps user-supplied ones. + Default, + /// "strip" removes all revert strings (if possible, i.e. if literals are used) keeping + /// side-effects + Strip, + /// "debug" injects strings for compiler-generated internal reverts, implemented for ABI + /// encoders V1 and V2 for now. + Debug, + /// "verboseDebug" even appends further information to user-supplied revert strings (not yet + /// implemented) + VerboseDebug, +} + +impl fmt::Display for RevertStrings { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + let string = match self { + RevertStrings::Default => "default", + RevertStrings::Strip => "strip", + RevertStrings::Debug => "debug", + RevertStrings::VerboseDebug => "verboseDebug", + }; + write!(f, "{}", string) + } +} + +impl FromStr for RevertStrings { + type Err = String; + + fn from_str(s: &str) -> Result { + match s { + "default" => Ok(RevertStrings::Default), + "strip" => Ok(RevertStrings::Strip), + "debug" => Ok(RevertStrings::Debug), + "verboseDebug" | "verbosedebug" => Ok(RevertStrings::VerboseDebug), + s => Err(format!("Unknown evm version: {}", s)), + } + } +} + +impl Default for RevertStrings { + fn default() -> Self { + RevertStrings::Default + } +} + #[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] pub struct SettingsMetadata { /// Use only literal content and not URLs (false by default) @@ -592,6 +844,112 @@ pub struct MetadataSource { pub license: Option, } +/// Model checker settings for solc +#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] +pub struct ModelCheckerSettings { + #[serde(default, skip_serializing_if = "BTreeMap::is_empty")] + pub contracts: BTreeMap>, + #[serde( + default, + with = "serde_helpers::display_from_str_opt", + skip_serializing_if = "Option::is_none" + )] + pub engine: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub timeout: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub targets: Option>, +} + +/// Which model checker engine to run. +#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] +pub enum ModelCheckerEngine { + Default, + All, + BMC, + CHC, +} + +impl fmt::Display for ModelCheckerEngine { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + let string = match self { + ModelCheckerEngine::Default => "none", + ModelCheckerEngine::All => "all", + ModelCheckerEngine::BMC => "bmc", + ModelCheckerEngine::CHC => "chc", + }; + write!(f, "{}", string) + } +} + +impl FromStr for ModelCheckerEngine { + type Err = String; + + fn from_str(s: &str) -> Result { + match s { + "none" => Ok(ModelCheckerEngine::Default), + "all" => Ok(ModelCheckerEngine::All), + "bmc" => Ok(ModelCheckerEngine::BMC), + "chc" => Ok(ModelCheckerEngine::CHC), + s => Err(format!("Unknown model checker engine: {}", s)), + } + } +} + +impl Default for ModelCheckerEngine { + fn default() -> Self { + ModelCheckerEngine::Default + } +} + +/// Which model checker targets to check. +#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub enum ModelCheckerTarget { + Assert, + Underflow, + Overflow, + DivByZero, + ConstantCondition, + PopEmptyArray, + OutOfBounds, + Balance, +} + +impl fmt::Display for ModelCheckerTarget { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + let string = match self { + ModelCheckerTarget::Assert => "assert", + ModelCheckerTarget::Underflow => "underflow", + ModelCheckerTarget::Overflow => "overflow", + ModelCheckerTarget::DivByZero => "divByZero", + ModelCheckerTarget::ConstantCondition => "constantCondition", + ModelCheckerTarget::PopEmptyArray => "popEmptyArray", + ModelCheckerTarget::OutOfBounds => "outOfBounds", + ModelCheckerTarget::Balance => "balance", + }; + write!(f, "{}", string) + } +} + +impl FromStr for ModelCheckerTarget { + type Err = String; + + fn from_str(s: &str) -> Result { + match s { + "assert" => Ok(ModelCheckerTarget::Assert), + "underflow" => Ok(ModelCheckerTarget::Underflow), + "overflow" => Ok(ModelCheckerTarget::Overflow), + "divByZero" => Ok(ModelCheckerTarget::DivByZero), + "constantCondition" => Ok(ModelCheckerTarget::ConstantCondition), + "popEmptyArray" => Ok(ModelCheckerTarget::PopEmptyArray), + "outOfBounds" => Ok(ModelCheckerTarget::OutOfBounds), + "balance" => Ok(ModelCheckerTarget::Balance), + s => Err(format!("Unknown model checker target: {}", s)), + } + } +} + #[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] pub struct Compiler { pub version: String, @@ -621,7 +979,7 @@ pub struct SolcAbi { #[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] pub struct Item { #[serde(rename = "internalType")] - pub internal_type: String, + pub internal_type: Option, pub name: String, #[serde(rename = "type")] pub put_type: String, @@ -632,13 +990,13 @@ pub struct Doc { #[serde(default, skip_serializing_if = "Option::is_none")] pub kind: Option, #[serde(default, skip_serializing_if = "Option::is_none")] - pub methods: Option, + pub methods: Option, #[serde(default, skip_serializing_if = "Option::is_none")] pub version: Option, } #[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize, Default)] -pub struct Libraries { +pub struct DocLibraries { #[serde(flatten)] pub libs: BTreeMap, } @@ -941,7 +1299,13 @@ pub struct UserDoc { #[serde(default, skip_serializing_if = "Option::is_none")] pub kind: Option, #[serde(default, skip_serializing_if = "::std::collections::BTreeMap::is_empty")] - pub methods: BTreeMap>, + pub methods: BTreeMap, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub notice: Option, +} + +#[derive(Clone, Debug, Default, Serialize, Deserialize, Eq, PartialEq)] +pub struct MethodNotice { #[serde(default, skip_serializing_if = "Option::is_none")] pub notice: Option, } @@ -1143,8 +1507,18 @@ impl fmt::Display for Error { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { if let Some(msg) = &self.formatted_message { match self.severity { - Severity::Error => msg.as_str().red().fmt(f), - Severity::Warning | Severity::Info => msg.as_str().yellow().fmt(f), + Severity::Error => { + if let Some(code) = self.error_code { + format!("error[{}]: ", code).as_str().red().fmt(f)?; + } + msg.as_str().red().fmt(f) + } + Severity::Warning | Severity::Info => { + if let Some(code) = self.error_code { + format!("warning[{}]: ", code).as_str().yellow().fmt(f)?; + } + msg.as_str().yellow().fmt(f) + } } } else { self.severity.fmt(f)?; @@ -1254,8 +1628,8 @@ pub struct SecondarySourceLocation { #[derive(Clone, Debug, Serialize, Deserialize, Eq, PartialEq)] pub struct SourceFile { pub id: u32, - #[serde(default)] - pub ast: serde_json::Value, + #[serde(default, with = "serde_helpers::empty_json_object_opt")] + pub ast: Option, } /// A wrapper type for a list of source files @@ -1396,9 +1770,29 @@ mod tests { for path in fs::read_dir(dir).unwrap() { let path = path.unwrap().path(); - let compiler_output = fs::read_to_string(&path).unwrap(); - serde_json::from_str::(&compiler_output).unwrap_or_else(|err| { - panic!("Failed to read compiler output of {} {}", path.display(), err) + let compiler_input = fs::read_to_string(&path).unwrap(); + serde_json::from_str::(&compiler_input).unwrap_or_else(|err| { + panic!("Failed to read compiler input of {} {}", path.display(), err) + }); + } + } + + #[test] + fn can_parse_standard_json_compiler_input() { + let mut dir = PathBuf::from(env!("CARGO_MANIFEST_DIR")); + dir.push("test-data/in"); + + for path in fs::read_dir(dir).unwrap() { + let path = path.unwrap().path(); + let compiler_input = fs::read_to_string(&path).unwrap(); + let val = serde_json::from_str::(&compiler_input) + .unwrap_or_else(|err| { + panic!("Failed to read compiler output of {} {}", path.display(), err) + }); + + let pretty = serde_json::to_string_pretty(&val).unwrap(); + serde_json::from_str::(&pretty).unwrap_or_else(|err| { + panic!("Failed to read converted compiler input of {} {}", path.display(), err) }); } } @@ -1455,4 +1849,71 @@ mod tests { let i = input.sanitized(&version); assert!(i.settings.metadata.unwrap().bytecode_hash.is_none()); } + + #[test] + fn can_parse_libraries() { + let libraries = ["./src/lib/LibraryContract.sol:Library:0xaddress".to_string()]; + + let libs = Libraries::parse(&libraries[..]).unwrap().libs; + + assert_eq!( + libs, + BTreeMap::from([( + PathBuf::from("./src/lib/LibraryContract.sol"), + BTreeMap::from([("Library".to_string(), "0xaddress".to_string())]) + )]) + ); + } + + #[test] + fn can_parse_many_libraries() { + let libraries= [ + "./src/SizeAuctionDiscount.sol:Chainlink:0xffedba5e171c4f15abaaabc86e8bd01f9b54dae5".to_string(), + "./src/SizeAuction.sol:ChainlinkTWAP:0xffedba5e171c4f15abaaabc86e8bd01f9b54dae5".to_string(), + "./src/SizeAuction.sol:Math:0x902f6cf364b8d9470d5793a9b2b2e86bddd21e0c".to_string(), + "./src/test/ChainlinkTWAP.t.sol:ChainlinkTWAP:0xffedba5e171c4f15abaaabc86e8bd01f9b54dae5".to_string(), + "./src/SizeAuctionDiscount.sol:Math:0x902f6cf364b8d9470d5793a9b2b2e86bddd21e0c".to_string(), + ]; + + let libs = Libraries::parse(&libraries[..]).unwrap().libs; + + pretty_assertions::assert_eq!( + libs, + BTreeMap::from([ + ( + PathBuf::from("./src/SizeAuctionDiscount.sol"), + BTreeMap::from([ + ( + "Chainlink".to_string(), + "0xffedba5e171c4f15abaaabc86e8bd01f9b54dae5".to_string() + ), + ( + "Math".to_string(), + "0x902f6cf364b8d9470d5793a9b2b2e86bddd21e0c".to_string() + ) + ]) + ), + ( + PathBuf::from("./src/SizeAuction.sol"), + BTreeMap::from([ + ( + "ChainlinkTWAP".to_string(), + "0xffedba5e171c4f15abaaabc86e8bd01f9b54dae5".to_string() + ), + ( + "Math".to_string(), + "0x902f6cf364b8d9470d5793a9b2b2e86bddd21e0c".to_string() + ) + ]) + ), + ( + PathBuf::from("./src/test/ChainlinkTWAP.t.sol"), + BTreeMap::from([( + "ChainlinkTWAP".to_string(), + "0xffedba5e171c4f15abaaabc86e8bd01f9b54dae5".to_string() + )]) + ), + ]) + ); + } } diff --git a/ethers-solc/src/artifacts/output_selection.rs b/ethers-solc/src/artifacts/output_selection.rs index 21a169b69d..b554635050 100644 --- a/ethers-solc/src/artifacts/output_selection.rs +++ b/ethers-solc/src/artifacts/output_selection.rs @@ -1,6 +1,6 @@ //! bindings for standard json output selection -use serde::{Deserialize, Deserializer, Serialize, Serializer}; +use serde::{ser::SerializeMap, Deserialize, Deserializer, Serialize, Serializer}; use std::{collections::BTreeMap, fmt, str::FromStr}; /// Represents the desired outputs based on a File `(file -> (contract -> [outputs]))` @@ -68,7 +68,7 @@ pub type FileOutputSelection = BTreeMap>; /// } /// } /// ``` -#[derive(Debug, Clone, Eq, PartialEq, Default, Serialize, Deserialize)] +#[derive(Debug, Clone, Eq, PartialEq, Default, Deserialize)] #[serde(transparent)] pub struct OutputSelection(pub BTreeMap); @@ -121,6 +121,39 @@ impl OutputSelection { } } +// this will make sure that if the `FileOutputSelection` for a certain file is empty will be +// serializes as `"*" : []` because +// > Contract level (needs the contract name or "*") +impl Serialize for OutputSelection { + fn serialize(&self, serializer: S) -> Result + where + S: Serializer, + { + struct EmptyFileOutput; + + impl Serialize for EmptyFileOutput { + fn serialize(&self, serializer: S) -> Result + where + S: Serializer, + { + let mut map = serializer.serialize_map(Some(1))?; + map.serialize_entry("*", &[] as &[String])?; + map.end() + } + } + + let mut map = serializer.serialize_map(Some(self.0.len()))?; + for (file, selection) in self.0.iter() { + if selection.is_empty() { + map.serialize_entry(file, &EmptyFileOutput {})?; + } else { + map.serialize_entry(file, selection)?; + } + } + map.end() + } +} + impl AsRef> for OutputSelection { fn as_ref(&self) -> &BTreeMap { &self.0 @@ -532,4 +565,12 @@ mod tests { assert_eq!(json, serde_json::to_string(&deserde_selection).unwrap()); } + + #[test] + fn empty_outputselection_serde_works() { + let mut empty = OutputSelection::default(); + empty.0.insert("contract.sol".to_string(), OutputSelection::empty_file_output_select()); + let s = serde_json::to_string(&empty).unwrap(); + assert_eq!(s, r#"{"contract.sol":{"*":[]}}"#); + } } diff --git a/ethers-solc/src/artifacts/serde_helpers.rs b/ethers-solc/src/artifacts/serde_helpers.rs index b44a1384e3..7e664df87e 100644 --- a/ethers-solc/src/artifacts/serde_helpers.rs +++ b/ethers-solc/src/artifacts/serde_helpers.rs @@ -3,14 +3,14 @@ use ethers_core::types::Bytes; use serde::{Deserialize, Deserializer}; -pub fn deserialize_bytes<'de, D>(d: D) -> std::result::Result +pub fn deserialize_bytes<'de, D>(d: D) -> Result where D: Deserializer<'de>, { String::deserialize(d)?.parse::().map_err(|e| serde::de::Error::custom(e.to_string())) } -pub fn deserialize_opt_bytes<'de, D>(d: D) -> std::result::Result, D::Error> +pub fn deserialize_opt_bytes<'de, D>(d: D) -> Result, D::Error> where D: Deserializer<'de>, { @@ -63,6 +63,10 @@ pub mod json_string_opt { T: DeserializeOwned, { if let Some(s) = Option::::deserialize(deserializer)? { + if s.is_empty() { + return Ok(None) + } + serde_json::from_str(&s).map_err(de::Error::custom).map(Some) } else { Ok(None) @@ -70,6 +74,43 @@ pub mod json_string_opt { } } +/// deserializes empty json object `{}` as `None` +pub mod empty_json_object_opt { + use serde::{ + de::{self, DeserializeOwned}, + ser, Deserialize, Deserializer, Serialize, Serializer, + }; + + pub fn serialize(value: &Option, serializer: S) -> Result + where + S: Serializer, + T: Serialize, + { + if let Some(value) = value { + let value = serde_json::to_string(value).map_err(ser::Error::custom)?; + serializer.serialize_str(&value) + } else { + let empty = serde_json::Value::Object(Default::default()); + serde_json::Value::serialize(&empty, serializer) + } + } + + pub fn deserialize<'de, T, D>(deserializer: D) -> Result, D::Error> + where + D: Deserializer<'de>, + T: DeserializeOwned, + { + let json = serde_json::Value::deserialize(deserializer)?; + if json.is_null() { + return Ok(None) + } + if json.as_object().map(|obj| obj.is_empty()).unwrap_or_default() { + return Ok(None) + } + serde_json::from_value(json).map_err(de::Error::custom).map(Some) + } +} + /// serde support for string pub mod string_bytes { use serde::{Deserialize, Deserializer, Serializer}; @@ -127,3 +168,93 @@ pub mod display_from_str_opt { } } } + +pub mod display_from_str { + use serde::{de, Deserialize, Deserializer, Serializer}; + use std::{fmt, str::FromStr}; + + pub fn serialize(value: &T, serializer: S) -> Result + where + T: fmt::Display, + S: Serializer, + { + serializer.collect_str(value) + } + + pub fn deserialize<'de, T, D>(deserializer: D) -> Result + where + D: Deserializer<'de>, + T: FromStr, + T::Err: fmt::Display, + { + String::deserialize(deserializer)?.parse().map_err(de::Error::custom) + } +} + +/// (De)serialize vec of tuples as map +pub mod tuple_vec_map { + use serde::{de::DeserializeOwned, Deserialize, Deserializer, Serialize, Serializer}; + + pub fn serialize(data: &[(K, V)], serializer: S) -> Result + where + S: Serializer, + K: Serialize, + V: Serialize, + { + serializer.collect_map(data.iter().map(|x| (&x.0, &x.1))) + } + + pub fn deserialize<'de, K, V, D>(deserializer: D) -> Result, D::Error> + where + D: Deserializer<'de>, + K: DeserializeOwned, + V: DeserializeOwned, + { + use serde::de::{MapAccess, Visitor}; + use std::{fmt, marker::PhantomData}; + + struct TupleVecMapVisitor { + marker: PhantomData>, + } + + impl TupleVecMapVisitor { + pub fn new() -> Self { + TupleVecMapVisitor { marker: PhantomData } + } + } + + impl<'de, K, V> Visitor<'de> for TupleVecMapVisitor + where + K: Deserialize<'de>, + V: Deserialize<'de>, + { + type Value = Vec<(K, V)>; + + fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { + formatter.write_str("a map") + } + + #[inline] + fn visit_unit(self) -> Result, E> { + Ok(Vec::new()) + } + + #[inline] + fn visit_map(self, mut access: T) -> Result, T::Error> + where + T: MapAccess<'de>, + { + let mut values = + Vec::with_capacity(std::cmp::min(access.size_hint().unwrap_or(0), 4096)); + + while let Some((key, value)) = access.next_entry()? { + values.push((key, value)); + } + + Ok(values) + } + } + + deserializer.deserialize_map(TupleVecMapVisitor::new()) + } +} diff --git a/ethers-solc/src/cache.rs b/ethers-solc/src/cache.rs index 7dbfa5ec3e..f9af00e331 100644 --- a/ethers-solc/src/cache.rs +++ b/ethers-solc/src/cache.rs @@ -294,7 +294,7 @@ impl SolFilesCache { I: IntoIterator, V: IntoIterator, { - let mut files: HashMap<_, _> = files.into_iter().map(|(p, v)| (p, v)).collect(); + let mut files: HashMap<_, _> = files.into_iter().collect(); self.files.retain(|file, entry| { if entry.artifacts.is_empty() { @@ -474,7 +474,9 @@ impl CacheEntry { } } - /// Retains only those artifacts that match the provided version. + /// Retains only those artifacts that match the provided versions. + /// + /// Removes an artifact entry if none of its versions is included in the `versions` set. pub fn retain_versions<'a, I>(&mut self, versions: I) where I: IntoIterator, @@ -854,9 +856,10 @@ impl<'a, T: ArtifactOutput> ArtifactsCache<'a, T> { /// compiled and written to disk `written_artifacts`. /// /// Returns all the _cached_ artifacts. - pub fn write_cache( + pub fn consume( self, written_artifacts: &Artifacts, + write_to_disk: bool, ) -> Result> { match self { ArtifactsCache::Ephemeral(_, _) => Ok(Default::default()), @@ -873,35 +876,54 @@ impl<'a, T: ArtifactOutput> ArtifactsCache<'a, T> { // keep only those files that were previously filtered (not dirty, reused) cache.retain(filtered.iter().map(|(p, (_, v))| (p.as_path(), v))); - // add the artifacts to the cache entries, this way we can keep a mapping from - // solidity file to its artifacts + // add the written artifacts to the cache entries, this way we can keep a mapping + // from solidity file to its artifacts // this step is necessary because the concrete artifacts are only known after solc // was invoked and received as output, before that we merely know the file and // the versions, so we add the artifacts on a file by file basis - for (file, artifacts) in written_artifacts.as_ref() { + for (file, written_artifacts) in written_artifacts.as_ref() { let file_path = Path::new(&file); - if let Some((entry, versions)) = dirty_source_files.get_mut(file_path) { - entry.insert_artifacts(artifacts.iter().map(|(name, artifacts)| { - let artifacts = artifacts - .iter() - .filter(|artifact| versions.contains(&artifact.version)) - .collect::>(); - (name, artifacts) - })); + if let Some((cache_entry, versions)) = dirty_source_files.get_mut(file_path) { + cache_entry.insert_artifacts(written_artifacts.iter().map( + |(name, artifacts)| { + let artifacts = artifacts + .iter() + .filter(|artifact| versions.contains(&artifact.version)) + .collect::>(); + (name, artifacts) + }, + )); } // cached artifacts that were overwritten also need to be removed from the // `cached_artifacts` set if let Some((f, mut cached)) = cached_artifacts.0.remove_entry(file) { - cached.retain(|name, files| { - if let Some(written_files) = artifacts.get(name) { - files.retain(|f| { - written_files.iter().all(|other| other.version != f.version) + tracing::trace!("checking {} for obsolete cached artifact entries", file); + cached.retain(|name, cached_artifacts| { + if let Some(written_files) = written_artifacts.get(name) { + // written artifact clashes with a cached artifact, so we need to decide whether to keep or to remove the cached + cached_artifacts.retain(|f| { + // we only keep those artifacts that don't conflict with written artifacts and which version was a compiler target + let retain = written_files + .iter() + .all(|other| other.version != f.version) && filtered.get( + &PathBuf::from(file)).map(|(_, versions)| { + versions.contains(&f.version) + }).unwrap_or_default(); + if !retain { + tracing::trace!( + "purging obsolete cached artifact for contract {} and version {}", + name, + f.version + ); + } + retain }); - return !files.is_empty() + return !cached_artifacts.is_empty() } false }); + if !cached.is_empty() { cached_artifacts.0.insert(f, cached); } @@ -913,8 +935,11 @@ impl<'a, T: ArtifactOutput> ArtifactsCache<'a, T> { .extend(dirty_source_files.into_iter().map(|(file, (entry, _))| (file, entry))); cache.strip_artifact_files_prefixes(project.artifacts_path()); + // write to disk - cache.write(project.cache_path())?; + if write_to_disk { + cache.write(project.cache_path())?; + } Ok(cached_artifacts) } diff --git a/ethers-solc/src/compile/mod.rs b/ethers-solc/src/compile/mod.rs index 6c31a0b9f4..7c3a77fd17 100644 --- a/ethers-solc/src/compile/mod.rs +++ b/ethers-solc/src/compile/mod.rs @@ -5,7 +5,6 @@ use crate::{ }; use semver::{Version, VersionReq}; use serde::{de::DeserializeOwned, Deserialize, Serialize}; - use std::{ fmt, io::BufRead, @@ -13,10 +12,9 @@ use std::{ process::{Command, Output, Stdio}, str::FromStr, }; - -pub mod contracts; pub mod many; pub mod output; +pub use output::{contracts, sources}; pub mod project; /// The name of the `solc` binary on the system @@ -224,7 +222,7 @@ impl Solc { /// Returns the list of all versions that are available to download and marking those which are /// already installed. - #[cfg(all(feature = "svm-solc", feature = "async"))] + #[cfg(all(feature = "svm-solc"))] pub fn all_versions() -> Vec { let mut all_versions = Self::installed_versions(); let mut uniques = all_versions @@ -271,6 +269,29 @@ impl Solc { Ok(Some(Solc::new(solc))) } + /// Returns the path for a [svm](https://github.com/roynalnaruto/svm-rs) installed version. + /// + /// If the version is not installed yet, it will install it. + /// + /// # Example + /// ```no_run + /// # fn main() -> Result<(), Box> { + /// use ethers_solc::Solc; + /// let solc = Solc::find_or_install_svm_version("0.8.9").unwrap(); + /// assert_eq!(solc, Solc::new("~/.svm/0.8.9/solc-0.8.9")); + /// # Ok(()) + /// # } + /// ``` + #[cfg(all(not(target_arch = "wasm32"), all(feature = "svm-solc")))] + pub fn find_or_install_svm_version(version: impl AsRef) -> Result { + let version = version.as_ref(); + if let Some(solc) = Solc::find_svm_installed_version(version)? { + Ok(solc) + } else { + Ok(Solc::blocking_install(&version.parse::()?)?) + } + } + /// Assuming the `versions` array is sorted, it returns the first element which satisfies /// the provided [`VersionReq`] pub fn find_matching_installation( @@ -285,7 +306,7 @@ impl Solc { /// to build it, and returns it. /// /// If the required compiler version is not installed, it also proceeds to install it. - #[cfg(all(feature = "svm-solc", feature = "async"))] + #[cfg(all(feature = "svm-solc"))] pub fn detect_version(source: &Source) -> Result { // detects the required solc version let sol_version = Self::source_version_req(source)?; @@ -296,7 +317,7 @@ impl Solc { /// used to build it, and returns it. /// /// If the required compiler version is not installed, it also proceeds to install it. - #[cfg(all(feature = "svm-solc", feature = "async"))] + #[cfg(all(feature = "svm-solc"))] pub fn ensure_installed(sol_version: &VersionReq) -> Result { #[cfg(any(test, feature = "tests"))] let _lock = take_solc_installer_lock(); @@ -371,11 +392,23 @@ impl Solc { } /// Blocking version of `Self::install` - #[cfg(all(feature = "svm-solc", feature = "async"))] + #[cfg(all(feature = "svm-solc"))] pub fn blocking_install(version: &Version) -> std::result::Result { + use crate::utils::RuntimeOrHandle; + tracing::trace!("blocking installing solc version \"{}\"", version); crate::report::solc_installation_start(version); - match svm::blocking_install(version) { + // the async version `svm::install` is used instead of `svm::blocking_intsall` + // because the underlying `reqwest::blocking::Client` does not behave well + // in tokio rt. see https://github.com/seanmonstar/reqwest/issues/1017 + cfg_if::cfg_if! { + if #[cfg(target_arch = "wasm32")] { + let installation = svm::blocking_install(version); + } else { + let installation = RuntimeOrHandle::new().block_on(svm::install(version)); + } + }; + match installation { Ok(path) => { crate::report::solc_installation_success(version); Ok(Solc::new(path)) @@ -389,7 +422,7 @@ impl Solc { /// Verify that the checksum for this version of solc is correct. We check against the SHA256 /// checksum from the build information published by binaries.soliditylang - #[cfg(all(feature = "svm-solc", feature = "async"))] + #[cfg(all(feature = "svm-solc"))] pub fn verify_checksum(&self) -> Result<()> { let version = self.version_short()?; let mut version_path = svm::version_path(version.to_string().as_str()); @@ -650,7 +683,7 @@ impl> From for Solc { #[cfg(test)] mod tests { use super::*; - use crate::CompilerInput; + use crate::{Artifact, CompilerInput}; fn solc() -> Solc { Solc::default() @@ -692,6 +725,30 @@ mod tests { } } + #[test] + fn can_compile_with_remapped_links() { + let input: CompilerInput = + serde_json::from_str(include_str!("../../test-data/library-remapping-in.json")) + .unwrap(); + let out = solc().compile(&input).unwrap(); + let (_, mut contracts) = out.split(); + let contract = contracts.remove("LinkTest").unwrap(); + let bytecode = &contract.get_bytecode().unwrap().object; + assert!(!bytecode.is_unlinked()); + } + + #[test] + fn can_compile_with_remapped_links_temp_dir() { + let input: CompilerInput = + serde_json::from_str(include_str!("../../test-data/library-remapping-in-2.json")) + .unwrap(); + let out = solc().compile(&input).unwrap(); + let (_, mut contracts) = out.split(); + let contract = contracts.remove("LinkTest").unwrap(); + let bytecode = &contract.get_bytecode().unwrap().object; + assert!(!bytecode.is_unlinked()); + } + #[cfg(feature = "async")] #[tokio::test] async fn async_solc_compile_works() { @@ -701,6 +758,7 @@ mod tests { let other = solc().async_compile(&serde_json::json!(input)).await.unwrap(); assert_eq!(out, other); } + #[cfg(feature = "async")] #[tokio::test] async fn async_solc_compile_works2() { @@ -733,7 +791,7 @@ mod tests { #[test] // This test might be a bit hard to maintain - #[cfg(all(feature = "svm-solc", feature = "async"))] + #[cfg(all(feature = "svm-solc"))] fn test_detect_version() { for (pragma, expected) in [ // pinned @@ -746,7 +804,7 @@ mod tests { // update this test whenever there's a new sol // version. that's ok! good reminder to check the // patch notes. - (">=0.5.0", "0.8.13"), + (">=0.5.0", "0.8.14"), // range (">=0.4.0 <0.5.0", "0.4.26"), ] @@ -777,6 +835,15 @@ mod tests { assert_eq!(res.solc, expected); } + #[test] + #[cfg(feature = "svm-solc")] + fn can_install_solc_in_tokio_rt() { + let version = Version::from_str("0.8.6").unwrap(); + let rt = tokio::runtime::Runtime::new().unwrap(); + let result = rt.block_on(async { Solc::blocking_install(&version) }); + assert!(result.is_ok()); + } + #[test] fn does_not_find_not_installed_version() { let ver = "1.1.1"; diff --git a/ethers-solc/src/compile/contracts.rs b/ethers-solc/src/compile/output/contracts.rs similarity index 83% rename from ethers-solc/src/compile/contracts.rs rename to ethers-solc/src/compile/output/contracts.rs index f90f931b57..2945cd19e0 100644 --- a/ethers-solc/src/compile/contracts.rs +++ b/ethers-solc/src/compile/output/contracts.rs @@ -4,7 +4,7 @@ use crate::artifacts::{ }; use semver::Version; use serde::{Deserialize, Serialize}; -use std::collections::BTreeMap; +use std::{collections::BTreeMap, path::Path}; /// file -> [(contract name -> Contract + solc version)] #[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)] @@ -129,6 +129,36 @@ impl VersionedContracts { .flat_map(|(name, c)| c.into_iter().map(move |c| (name.clone(), c.contract))) }) } + + /// Sets the contract's file paths to `root` adjoined to `self.file`. + pub fn join_all(&mut self, root: impl AsRef) -> &mut Self { + let root = root.as_ref(); + self.0 = std::mem::take(&mut self.0) + .into_iter() + .map(|(contract_path, contracts)| { + (root.join(contract_path).to_string_lossy().to_string(), contracts) + }) + .collect(); + self + } + + /// Removes `base` from all contract paths + pub fn strip_prefix_all(&mut self, base: impl AsRef) -> &mut Self { + let base = base.as_ref(); + self.0 = std::mem::take(&mut self.0) + .into_iter() + .map(|(contract_path, contracts)| { + let p = Path::new(&contract_path); + ( + p.strip_prefix(base) + .map(|p| p.to_string_lossy().to_string()) + .unwrap_or(contract_path), + contracts, + ) + }) + .collect(); + self + } } impl AsRef>> for VersionedContracts { diff --git a/ethers-solc/src/compile/output.rs b/ethers-solc/src/compile/output/mod.rs similarity index 86% rename from ethers-solc/src/compile/output.rs rename to ethers-solc/src/compile/output/mod.rs index 2ff3e08ccf..7730df882d 100644 --- a/ethers-solc/src/compile/output.rs +++ b/ethers-solc/src/compile/output/mod.rs @@ -3,14 +3,18 @@ use crate::{ artifacts::{ contract::{CompactContractBytecode, CompactContractRef, Contract}, - Error, SourceFile, SourceFiles, + Error, }, - contracts::{VersionedContract, VersionedContracts}, + sources::{VersionedSourceFile, VersionedSourceFiles}, ArtifactId, ArtifactOutput, Artifacts, CompilerOutput, ConfigurableArtifacts, }; +use contracts::{VersionedContract, VersionedContracts}; use semver::Version; use std::{collections::BTreeMap, fmt, path::Path}; +pub mod contracts; +pub mod sources; + /// Contains a mixture of already compiled/cached artifacts and the input set of sources that still /// need to be compiled. #[derive(Debug, Clone, PartialEq, Default)] @@ -69,7 +73,9 @@ impl ProjectCompileOutput { } /// All artifacts together with their ID and the sources of the project. - pub fn into_artifacts_with_sources(self) -> (BTreeMap, SourceFiles) { + pub fn into_artifacts_with_sources( + self, + ) -> (BTreeMap, VersionedSourceFiles) { let Self { cached_artifacts, compiled_artifacts, compiler_output, .. } = self; ( @@ -77,7 +83,7 @@ impl ProjectCompileOutput { .into_artifacts::() .chain(compiled_artifacts.into_artifacts::()) .collect(), - SourceFiles(compiler_output.sources), + compiler_output.sources, ) } @@ -86,10 +92,9 @@ impl ProjectCompileOutput { /// /// # Example /// - /// Make all artifact files relative tot the project's root directory + /// Make all artifact files relative to the project's root directory /// /// ```no_run - /// use ethers_solc::artifacts::contract::CompactContractBytecode; /// use ethers_solc::Project; /// /// let project = Project::builder().build().unwrap(); @@ -99,6 +104,7 @@ impl ProjectCompileOutput { let base = base.as_ref(); self.cached_artifacts = self.cached_artifacts.into_stripped_file_prefixes(base); self.compiled_artifacts = self.compiled_artifacts.into_stripped_file_prefixes(base); + self.compiler_output.strip_prefix_all(base); self } @@ -228,8 +234,8 @@ impl fmt::Display for ProjectCompileOutput { pub struct AggregatedCompilerOutput { /// all errors from all `CompilerOutput` pub errors: Vec, - /// All source files - pub sources: BTreeMap, + /// All source files combined with the solc version used to compile them + pub sources: VersionedSourceFiles, /// All compiled contracts combined with the solc version used to compile them pub contracts: VersionedContracts, } @@ -274,10 +280,15 @@ impl AggregatedCompilerOutput { /// adds a new `CompilerOutput` to the aggregated output pub fn extend(&mut self, version: Version, output: CompilerOutput) { - self.errors.extend(output.errors); - self.sources.extend(output.sources); + let CompilerOutput { errors, sources, contracts } = output; + self.errors.extend(errors); - for (file_name, new_contracts) in output.contracts { + for (path, source_file) in sources { + let sources = self.sources.as_mut().entry(path).or_default(); + sources.push(VersionedSourceFile { source_file, version: version.clone() }); + } + + for (file_name, new_contracts) in contracts { let contracts = self.contracts.as_mut().entry(file_name).or_default(); for (contract_name, contract) in new_contracts { let versioned = contracts.entry(contract_name).or_default(); @@ -346,15 +357,47 @@ impl AggregatedCompilerOutput { /// let (sources, contracts) = output.split(); /// # } /// ``` - pub fn split(self) -> (SourceFiles, VersionedContracts) { - (SourceFiles(self.sources), self.contracts) + pub fn split(self) -> (VersionedSourceFiles, VersionedContracts) { + (self.sources, self.contracts) + } + + /// Strips the given prefix from all file paths to make them relative to the given + /// `base` argument. + /// + /// Convenience method for [Self::strip_prefix_all()] that consumes the type. + /// + /// # Example + /// + /// Make all sources and contracts relative to the project's root directory + /// + /// ```no_run + /// use ethers_solc::Project; + /// + /// let project = Project::builder().build().unwrap(); + /// let output = project.compile().unwrap().output().with_stripped_file_prefixes(project.root()); + /// ``` + pub fn with_stripped_file_prefixes(mut self, base: impl AsRef) -> Self { + let base = base.as_ref(); + self.contracts.strip_prefix_all(base); + self.sources.strip_prefix_all(base); + self + } + + /// Removes `base` from all contract paths + pub fn strip_prefix_all(&mut self, base: impl AsRef) -> &mut Self { + let base = base.as_ref(); + self.contracts.strip_prefix_all(base); + self.sources.strip_prefix_all(base); + self } } /// Helper type to implement display for solc errors #[derive(Clone, Debug)] pub struct OutputDiagnostics<'a> { + /// output of the compiled project compiler_output: &'a AggregatedCompilerOutput, + /// the error codes to ignore ignored_error_codes: &'a [u64], } diff --git a/ethers-solc/src/compile/output/sources.rs b/ethers-solc/src/compile/output/sources.rs new file mode 100644 index 0000000000..4a9a556ebb --- /dev/null +++ b/ethers-solc/src/compile/output/sources.rs @@ -0,0 +1,284 @@ +use crate::SourceFile; +use semver::Version; +use serde::{Deserialize, Serialize}; +use std::{collections::BTreeMap, path::Path}; + +/// (source_file path -> `SourceFile` + solc version) +#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)] +#[serde(transparent)] +pub struct VersionedSourceFiles(pub BTreeMap>); + +impl VersionedSourceFiles { + pub fn is_empty(&self) -> bool { + self.0.is_empty() + } + + pub fn len(&self) -> usize { + self.0.len() + } + + /// Returns an iterator over all files + pub fn files(&self) -> impl Iterator + '_ { + self.0.keys() + } + + /// Returns an iterator over the source files' ids and path + /// + /// ``` + /// use std::collections::BTreeMap; + /// use ethers_solc::sources::VersionedSourceFiles; + /// # fn demo(files: VersionedSourceFiles) { + /// let sources: BTreeMap = files.into_ids().collect(); + /// # } + /// ``` + pub fn into_ids(self) -> impl Iterator { + self.into_sources().map(|(path, source)| (source.id, path)) + } + + /// Returns an iterator over the source files' paths and ids + /// + /// ``` + /// use std::collections::BTreeMap; + /// use ethers_solc::artifacts::SourceFiles; + /// # fn demo(files: SourceFiles) { + /// let sources :BTreeMap = files.into_paths().collect(); + /// # } + /// ``` + pub fn into_paths(self) -> impl Iterator { + self.into_ids().map(|(id, path)| (path, id)) + } + + /// Returns an iterator over the source files' ids and path + /// + /// ``` + /// use std::collections::BTreeMap; + /// use semver::Version; + /// use ethers_solc::sources::VersionedSourceFiles; + /// # fn demo(files: VersionedSourceFiles) { + /// let sources: BTreeMap<(u32, Version) ,String> = files.into_ids_with_version().map(|(id, source, version)|((id, version), source)).collect(); + /// # } + /// ``` + pub fn into_ids_with_version(self) -> impl Iterator { + self.into_sources_with_version().map(|(path, source, version)| (source.id, path, version)) + } + + /// Finds the _first_ source file with the given path + /// + /// # Example + /// + /// ``` + /// use ethers_solc::Project; + /// use ethers_solc::artifacts::*; + /// # fn demo(project: Project) { + /// let output = project.compile().unwrap().output(); + /// let source_file = output.sources.find_file("src/Greeter.sol").unwrap(); + /// # } + /// ``` + pub fn find_file(&self, source_file: impl AsRef) -> Option<&SourceFile> { + let source_file_name = source_file.as_ref(); + self.sources().find_map( + |(path, source_file)| { + if path == source_file_name { + Some(source_file) + } else { + None + } + }, + ) + } + + /// Same as [Self::find_file] but also checks for version + pub fn find_file_and_version(&self, path: &str, version: &Version) -> Option<&SourceFile> { + self.0.get(path).and_then(|contracts| { + contracts.iter().find_map(|source| { + if source.version == *version { + Some(&source.source_file) + } else { + None + } + }) + }) + } + + /// Finds the _first_ source file with the given id + /// + /// # Example + /// + /// ``` + /// use ethers_solc::Project; + /// use ethers_solc::artifacts::*; + /// # fn demo(project: Project) { + /// let output = project.compile().unwrap().output(); + /// let source_file = output.sources.find_id(0).unwrap(); + /// # } + /// ``` + pub fn find_id(&self, id: u32) -> Option<&SourceFile> { + self.sources().filter(|(_, source)| source.id == id).map(|(_, source)| source).next() + } + + /// Same as [Self::find_id] but also checks for version + pub fn find_id_and_version(&self, id: u32, version: &Version) -> Option<&SourceFile> { + self.sources_with_version() + .filter(|(_, source, v)| source.id == id && *v == version) + .map(|(_, source, _)| source) + .next() + } + + /// Removes the _first_ source_file with the given path from the set + /// + /// # Example + /// + /// ``` + /// use ethers_solc::Project; + /// use ethers_solc::artifacts::*; + /// # fn demo(project: Project) { + /// let (mut sources, _) = project.compile().unwrap().output().split(); + /// let source_file = sources.remove_by_path("src/Greeter.sol").unwrap(); + /// # } + /// ``` + pub fn remove_by_path(&mut self, source_file: impl AsRef) -> Option { + let source_file_path = source_file.as_ref(); + self.0.get_mut(source_file_path).and_then(|all_sources| { + if !all_sources.is_empty() { + Some(all_sources.remove(0).source_file) + } else { + None + } + }) + } + + /// Removes the _first_ source_file with the given id from the set + /// + /// # Example + /// + /// ``` + /// use ethers_solc::Project; + /// use ethers_solc::artifacts::*; + /// # fn demo(project: Project) { + /// let (mut sources, _) = project.compile().unwrap().output().split(); + /// let source_file = sources.remove_by_id(0).unwrap(); + /// # } + /// ``` + pub fn remove_by_id(&mut self, id: u32) -> Option { + self.0 + .values_mut() + .filter_map(|sources| { + sources + .iter() + .position(|source| source.source_file.id == id) + .map(|pos| sources.remove(pos).source_file) + }) + .next() + } + + /// Iterate over all contracts and their names + pub fn sources(&self) -> impl Iterator { + self.0.iter().flat_map(|(path, sources)| { + sources.iter().map(move |source| (path, &source.source_file)) + }) + } + + /// Returns an iterator over (`file`, `SourceFile`, `Version`) + pub fn sources_with_version(&self) -> impl Iterator { + self.0.iter().flat_map(|(file, sources)| { + sources.iter().map(move |c| (file, &c.source_file, &c.version)) + }) + } + + /// Returns an iterator over all contracts and their source names. + /// + /// ``` + /// use std::collections::BTreeMap; + /// use ethers_solc::{ artifacts::* }; + /// use ethers_solc::sources::VersionedSourceFiles; + /// # fn demo(sources: VersionedSourceFiles) { + /// let sources: BTreeMap = sources + /// .into_sources() + /// .collect(); + /// # } + /// ``` + pub fn into_sources(self) -> impl Iterator { + self.0.into_iter().flat_map(|(path, sources)| { + sources.into_iter().map(move |source| (path.clone(), source.source_file)) + }) + } + + /// Returns an iterator over all contracts and their source names. + /// + /// ``` + /// use std::collections::BTreeMap; + /// use semver::Version; + /// use ethers_solc::{ artifacts::* }; + /// use ethers_solc::sources::VersionedSourceFiles; + /// # fn demo(sources: VersionedSourceFiles) { + /// let sources: BTreeMap<(String,Version), SourceFile> = sources + /// .into_sources_with_version().map(|(path, source, version)|((path,version), source)) + /// .collect(); + /// # } + /// ``` + pub fn into_sources_with_version(self) -> impl Iterator { + self.0.into_iter().flat_map(|(path, sources)| { + sources + .into_iter() + .map(move |source| (path.clone(), source.source_file, source.version)) + }) + } + + /// Sets the sources' file paths to `root` adjoined to `self.file`. + pub fn join_all(&mut self, root: impl AsRef) -> &mut Self { + let root = root.as_ref(); + self.0 = std::mem::take(&mut self.0) + .into_iter() + .map(|(file_path, sources)| { + (root.join(file_path).to_string_lossy().to_string(), sources) + }) + .collect(); + self + } + + /// Removes `base` from all source file paths + pub fn strip_prefix_all(&mut self, base: impl AsRef) -> &mut Self { + let base = base.as_ref(); + self.0 = std::mem::take(&mut self.0) + .into_iter() + .map(|(file_path, sources)| { + let p = Path::new(&file_path); + ( + p.strip_prefix(base) + .map(|p| p.to_string_lossy().to_string()) + .unwrap_or(file_path), + sources, + ) + }) + .collect(); + self + } +} + +impl AsRef>> for VersionedSourceFiles { + fn as_ref(&self) -> &BTreeMap> { + &self.0 + } +} + +impl AsMut>> for VersionedSourceFiles { + fn as_mut(&mut self) -> &mut BTreeMap> { + &mut self.0 + } +} + +impl IntoIterator for VersionedSourceFiles { + type Item = (String, Vec); + type IntoIter = std::collections::btree_map::IntoIter>; + + fn into_iter(self) -> Self::IntoIter { + self.0.into_iter() + } +} + +/// A [SourceFile] and the compiler version used to compile it +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] +pub struct VersionedSourceFile { + pub source_file: SourceFile, + pub version: Version, +} diff --git a/ethers-solc/src/compile/project.rs b/ethers-solc/src/compile/project.rs index 49b5eb37ae..22126ca6d4 100644 --- a/ethers-solc/src/compile/project.rs +++ b/ethers-solc/src/compile/project.rs @@ -140,7 +140,7 @@ impl<'a, T: ArtifactOutput> ProjectCompiler<'a, T> { /// let project = Project::builder().build().unwrap(); /// let output = project.compile().unwrap(); /// ``` - #[cfg(all(feature = "svm-solc", feature = "async"))] + #[cfg(all(feature = "svm-solc"))] pub fn new(project: &'a Project) -> Result { Self::with_sources(project, project.paths.read_input_files()?) } @@ -151,7 +151,7 @@ impl<'a, T: ArtifactOutput> ProjectCompiler<'a, T> { /// /// Multiple (`Solc` -> `Sources`) pairs can be compiled in parallel if the `Project` allows /// multiple `jobs`, see [`crate::Project::set_solc_jobs()`]. - #[cfg(all(feature = "svm-solc", feature = "async"))] + #[cfg(all(feature = "svm-solc"))] pub fn with_sources(project: &'a Project, sources: Sources) -> Result { let graph = Graph::resolve_sources(&project.paths, sources)?; let (versions, edges) = graph.into_sources_by_version(project.offline)?; @@ -304,7 +304,8 @@ impl<'a, T: ArtifactOutput> ArtifactsState<'a, T> { fn write_cache(self) -> Result> { let ArtifactsState { output, cache, compiled_artifacts } = self; let ignored_error_codes = cache.project().ignored_error_codes.clone(); - let cached_artifacts = cache.write_cache(&compiled_artifacts)?; + let skip_write_to_disk = cache.project().no_artifacts || output.has_error(); + let cached_artifacts = cache.consume(&compiled_artifacts, !skip_write_to_disk)?; Ok(ProjectCompileOutput { compiler_output: output, compiled_artifacts, @@ -542,11 +543,20 @@ fn compile_parallel( } } + // need to get the currently installed reporter before installing the pool, otherwise each new + // thread in the pool will get initialized with the default value of the `thread_local!`'s + // localkey. This way we keep access to the reporter in the rayon pool + let scoped_report = report::get_default(|reporter| reporter.clone()); + // start a rayon threadpool that will execute all `Solc::compile()` processes let pool = rayon::ThreadPoolBuilder::new().num_threads(num_jobs).build().unwrap(); + let outputs = pool.install(move || { jobs.into_par_iter() - .map(|(solc, version, input, actually_dirty)| { + .map(move |(solc, version, input, actually_dirty)| { + // set the reporter on this thread + let _guard = report::set_scoped(&scoped_report); + tracing::trace!( "calling solc `{}` {:?} with {} sources: {:?}", version, @@ -690,11 +700,11 @@ mod tests { let state = state.compile().unwrap(); assert_eq!(state.output.sources.len(), 3); - for (f, source) in &state.output.sources { + for (f, source) in state.output.sources.sources() { if f.ends_with("A.sol") { - assert!(source.ast.is_object()); + assert!(source.ast.is_some()); } else { - assert!(source.ast.is_null()); + assert!(source.ast.is_none()); } } diff --git a/ethers-solc/src/config.rs b/ethers-solc/src/config.rs index 3b67de831b..9030781820 100644 --- a/ethers-solc/src/config.rs +++ b/ethers-solc/src/config.rs @@ -3,7 +3,7 @@ use crate::{ cache::SOLIDITY_FILES_CACHE_FILENAME, error::{Result, SolcError, SolcIoError}, remappings::Remapping, - resolver::Graph, + resolver::{Graph, SolImportAlias}, utils, Source, Sources, }; @@ -250,7 +250,9 @@ impl ProjectPathsConfig { pub fn flatten(&self, target: &Path) -> Result { tracing::trace!("flattening file"); let graph = Graph::resolve(self)?; - self.flatten_node(target, &graph, &mut Default::default(), false, false, false) + self.flatten_node(target, &graph, &mut Default::default(), false, false, false).map(|x| { + format!("{}\n", utils::RE_THREE_OR_MORE_NEWLINES.replace_all(&x, "\n\n").trim()) + }) } /// Flattens a single node from the dependency graph @@ -279,49 +281,74 @@ impl ProjectPathsConfig { let target_node = graph.node(*target_index); let mut imports = target_node.imports().clone(); - imports.sort_by_key(|x| x.loc().0); + imports.sort_by_key(|x| x.loc().start); + + let mut content = target_node.content().to_owned(); + + for alias in imports.iter().flat_map(|i| i.data().aliases()) { + let (alias, target) = match alias { + SolImportAlias::Contract(alias, target) => (alias.clone(), target.clone()), + _ => continue, + }; + let name_regex = utils::create_contract_or_lib_name_regex(&alias); + let target_len = target.len() as isize; + let mut replace_offset = 0; + for cap in name_regex.captures_iter(&content.clone()) { + if cap.name("ignore").is_some() { + continue + } + if let Some(name_match) = + vec!["n1", "n2", "n3"].iter().find_map(|name| cap.name(name)) + { + let name_match_range = + utils::range_by_offset(&name_match.range(), replace_offset); + replace_offset += target_len - (name_match_range.len() as isize); + content.replace_range(name_match_range, &target); + } + } + } - let mut content = target_node.content().as_bytes().to_vec(); + let mut content = content.as_bytes().to_vec(); let mut offset = 0_isize; if strip_license { if let Some(license) = target_node.license() { - let (start, end) = license.loc_by_offset(offset); - content.splice(start..end, std::iter::empty()); - offset -= (end - start) as isize; + let license_range = license.loc_by_offset(offset); + offset -= license_range.len() as isize; + content.splice(license_range, std::iter::empty()); } } if strip_version_pragma { if let Some(version) = target_node.version() { - let (start, end) = version.loc_by_offset(offset); - content.splice(start..end, std::iter::empty()); - offset -= (end - start) as isize; + let version_range = version.loc_by_offset(offset); + offset -= version_range.len() as isize; + content.splice(version_range, std::iter::empty()); } } if strip_experimental_pragma { if let Some(experiment) = target_node.experimental() { - let (start, end) = experiment.loc_by_offset(offset); - content.splice(start..end, std::iter::empty()); - offset -= (end - start) as isize; + let experimental_pragma_range = experiment.loc_by_offset(offset); + offset -= experimental_pragma_range.len() as isize; + content.splice(experimental_pragma_range, std::iter::empty()); } } for import in imports.iter() { - let import_path = self.resolve_import(target_dir, import.data())?; + let import_path = self.resolve_import(target_dir, import.data().path())?; let s = self.flatten_node(&import_path, graph, imported, true, true, true)?; + let import_content = s.as_bytes(); let import_content_len = import_content.len() as isize; - let (start, end) = import.loc_by_offset(offset); - content.splice(start..end, import_content.iter().copied()); - offset += import_content_len - ((end - start) as isize); + let import_range = import.loc_by_offset(offset); + offset += import_content_len - (import_range.len() as isize); + content.splice(import_range, import_content.iter().copied()); } let result = String::from_utf8(content).map_err(|err| { SolcError::msg(format!("failed to convert extended bytes to string: {}", err)) })?; - let result = utils::RE_THREE_OR_MORE_NEWLINES.replace_all(&result, "\n\n").into_owned(); Ok(result) } diff --git a/ethers-solc/src/lib.rs b/ethers-solc/src/lib.rs index 0865ad957f..ac0e88275b 100644 --- a/ethers-solc/src/lib.rs +++ b/ethers-solc/src/lib.rs @@ -3,7 +3,7 @@ pub mod artifacts; pub mod sourcemap; pub use artifacts::{CompilerInput, CompilerOutput, EvmVersion}; -use std::collections::BTreeMap; +use std::collections::{BTreeMap, HashSet}; mod artifact_output; pub mod cache; @@ -24,7 +24,7 @@ mod config; pub use config::{AllowedLibPaths, PathStyle, ProjectPathsConfig, SolcConfig}; pub mod remappings; -use crate::artifacts::{Source, SourceFile}; +use crate::artifacts::{Source, SourceFile, StandardJsonCompilerInput}; pub mod error; mod filter; @@ -35,10 +35,11 @@ pub use filter::{FileFilter, TestFileFilter}; use crate::{ artifacts::Sources, cache::SolFilesCache, - contracts::VersionedContracts, error::{SolcError, SolcIoError}, + sources::VersionedSourceFiles, }; use artifacts::contract::Contract; +use compile::output::contracts::VersionedContracts; use error::Result; use semver::Version; use std::path::{Path, PathBuf}; @@ -209,7 +210,7 @@ impl Project { let sources = self.paths.read_input_files()?; tracing::trace!("found {} sources to compile: {:?}", sources.len(), sources.keys()); - #[cfg(all(feature = "svm-solc", feature = "async"))] + #[cfg(all(feature = "svm-solc"))] if self.auto_detect { tracing::trace!("using solc auto detection to compile sources"); return self.svm_compile(sources) @@ -243,7 +244,7 @@ impl Project { /// let output = project.svm_compile(sources).unwrap(); /// # } /// ``` - #[cfg(all(feature = "svm-solc", feature = "async"))] + #[cfg(all(feature = "svm-solc"))] pub fn svm_compile(&self, sources: Sources) -> Result> { project::ProjectCompiler::with_sources(self, sources)?.compile() } @@ -260,7 +261,7 @@ impl Project { /// let output = project.compile_file("example/Greeter.sol").unwrap(); /// # } /// ``` - #[cfg(all(feature = "svm-solc", feature = "async"))] + #[cfg(all(feature = "svm-solc"))] pub fn compile_file(&self, file: impl Into) -> Result> { let file = file.into(); let source = Source::read(&file)?; @@ -282,13 +283,20 @@ impl Project { /// ).unwrap(); /// # } /// ``` - #[cfg(all(feature = "svm-solc", feature = "async"))] pub fn compile_files(&self, files: I) -> Result> where I: IntoIterator, P: Into, { - project::ProjectCompiler::with_sources(self, Source::read_all(files)?)?.compile() + let sources = Source::read_all(files)?; + + #[cfg(all(feature = "svm-solc"))] + if self.auto_detect { + return project::ProjectCompiler::with_sources(self, sources)?.compile() + } + + let solc = self.configure_solc(self.solc.clone()); + self.compile_with_version(&solc, sources) } /// Convenience function to compile only (re)compile files that match the provided [FileFilter]. @@ -321,16 +329,28 @@ impl Project { /// ).unwrap(); /// # } /// ``` - #[cfg(all(feature = "svm-solc", feature = "async"))] pub fn compile_sparse( &self, filter: F, ) -> Result> { let sources = Source::read_all(self.paths.input_files().into_iter().filter(|p| filter.is_match(p)))?; - let filter: Box = Box::new(filter); - project::ProjectCompiler::with_sources(self, sources)?.with_sparse_output(filter).compile() + + #[cfg(all(feature = "svm-solc"))] + if self.auto_detect { + return project::ProjectCompiler::with_sources(self, sources)? + .with_sparse_output(filter) + .compile() + } + + project::ProjectCompiler::with_sources_and_solc( + self, + sources, + self.configure_solc(self.solc.clone()), + )? + .with_sparse_output(filter) + .compile() } /// Compiles the given source files with the exact `Solc` executable @@ -428,26 +448,47 @@ impl Project { } /// Returns standard-json-input to compile the target contract - pub fn standard_json_input(&self, target: impl AsRef) -> Result { + pub fn standard_json_input( + &self, + target: impl AsRef, + ) -> Result { + use path_slash::PathExt; + let target = target.as_ref(); tracing::trace!("Building standard-json-input for {:?}", target); let graph = Graph::resolve(&self.paths)?; let target_index = graph.files().get(target).ok_or_else(|| { SolcError::msg(format!("cannot resolve file at {:?}", target.display())) })?; + let mut sources = Vec::new(); + let mut unique_paths = HashSet::new(); let (path, source) = graph.node(*target_index).unpack(); + unique_paths.insert(path.clone()); sources.push((path, source)); sources.extend( - graph.all_imported_nodes(*target_index).map(|index| graph.node(index).unpack()), - ); - - let compiler_inputs = CompilerInput::with_sources( - sources.into_iter().map(|(s, p)| (s.clone(), p.clone())).collect(), + graph + .all_imported_nodes(*target_index) + .map(|index| graph.node(index).unpack()) + .filter(|(p, _)| unique_paths.insert(p.to_path_buf())), ); + let root = self.root(); + let sources = sources + .into_iter() + .map(|(path, source)| { + let path: PathBuf = if let Ok(stripped) = path.strip_prefix(root) { + stripped.to_slash_lossy().into() + } else { + path.to_slash_lossy().into() + }; + (path, source.clone()) + }) + .collect(); + + let mut settings = self.solc_config.settings.clone(); // strip the path to the project root from all remappings - let remappings = self + settings.remappings = self .paths .remappings .clone() @@ -455,15 +496,9 @@ impl Project { .map(|r| r.into_relative(self.root()).to_relative_remapping()) .collect::>(); - let compiler_input = compiler_inputs - .first() - .ok_or_else(|| SolcError::msg("cannot get the compiler input"))? - .clone() - .settings(self.solc_config.settings.clone()) - .with_remappings(remappings) - .strip_prefix(self.root()); + let input = StandardJsonCompilerInput::new(sources, settings); - Ok(compiler_input) + Ok(input) } } @@ -716,7 +751,7 @@ impl ArtifactOutput for Project { fn on_output( &self, contracts: &VersionedContracts, - sources: &BTreeMap, + sources: &VersionedSourceFiles, layout: &ProjectPathsConfig, ) -> Result> { self.artifacts_handler().on_output(contracts, sources, layout) @@ -791,14 +826,14 @@ impl ArtifactOutput for Project { fn output_to_artifacts( &self, contracts: &VersionedContracts, - sources: &BTreeMap, + sources: &VersionedSourceFiles, ) -> Artifacts { self.artifacts_handler().output_to_artifacts(contracts, sources) } } #[cfg(test)] -#[cfg(all(feature = "svm-solc", feature = "async"))] +#[cfg(all(feature = "svm-solc"))] mod tests { use crate::remappings::Remapping; diff --git a/ethers-solc/src/project_util/mod.rs b/ethers-solc/src/project_util/mod.rs index afa3298f05..e1bf795655 100644 --- a/ethers-solc/src/project_util/mod.rs +++ b/ethers-solc/src/project_util/mod.rs @@ -9,7 +9,7 @@ use crate::{ utils, utils::tempdir, Artifact, ArtifactOutput, Artifacts, ConfigurableArtifacts, ConfigurableContractArtifact, - FileFilter, PathStyle, Project, ProjectCompileOutput, ProjectPathsConfig, SolFilesCache, + FileFilter, PathStyle, Project, ProjectCompileOutput, ProjectPathsConfig, SolFilesCache, Solc, SolcIoError, }; use fs_extra::{dir, file}; @@ -34,8 +34,10 @@ pub struct TempProject { impl TempProject { /// Makes sure all resources are created pub fn create_new(root: TempDir, inner: Project) -> std::result::Result { - let project = Self { _root: root, inner }; + let mut project = Self { _root: root, inner }; project.paths().create_all()?; + // ignore license warnings + project.inner.ignored_error_codes.push(1878); Ok(project) } @@ -64,6 +66,13 @@ impl TempProject { self } + /// Explicitly sets the solc version for the project + pub fn set_solc(&mut self, solc: impl AsRef) -> &mut Self { + self.inner.solc = Solc::find_or_install_svm_version(solc).unwrap(); + self.inner.auto_detect = false; + self + } + pub fn project(&self) -> &Project { &self.inner } diff --git a/ethers-solc/src/remappings.rs b/ethers-solc/src/remappings.rs index e82006ae20..9ca337d5c6 100644 --- a/ethers-solc/src/remappings.rs +++ b/ethers-solc/src/remappings.rs @@ -1,3 +1,4 @@ +use crate::utils; use serde::{Deserialize, Serialize}; use std::{ collections::{hash_map::Entry, HashMap}, @@ -172,13 +173,15 @@ impl Remapping { let dir = dir.as_ref(); let is_inside_node_modules = dir.ends_with("node_modules"); + // iterate over all dirs that are children of the root for dir in walkdir::WalkDir::new(dir) .follow_links(true) .min_depth(1) .max_depth(1) .into_iter() - .filter_map(std::result::Result::ok) + .filter_entry(|e| !is_hidden(e)) + .filter_map(Result::ok) .filter(|e| e.file_type().is_dir()) { let depth1_dir = dir.path(); @@ -487,6 +490,11 @@ fn is_lib_dir(dir: &Path) -> bool { .unwrap_or_default() } +/// Returns true if the file is _hidden_ +fn is_hidden(entry: &walkdir::DirEntry) -> bool { + entry.file_name().to_str().map(|s| s.starts_with('.')).unwrap_or(false) +} + /// Finds all remappings in the directory recursively fn find_remapping_candidates( current_dir: &Path, @@ -506,8 +514,8 @@ fn find_remapping_candidates( .min_depth(1) .max_depth(1) .into_iter() - .filter_map(std::result::Result::ok) - .filter(|entry| !entry.file_name().to_str().map(|s| s.starts_with('.')).unwrap_or(false)) + .filter_entry(|e| !is_hidden(e)) + .filter_map(Result::ok) { let entry: walkdir::DirEntry = entry; @@ -518,6 +526,26 @@ fn find_remapping_candidates( { is_candidate = true; } else if entry.file_type().is_dir() { + // if the dir is a symlink to a parent dir we short circuit here + // `walkdir` will catch symlink loops, but this check prevents that we end up scanning a + // workspace like + // ```text + // my-package/node_modules + // ├── dep/node_modules + // ├── symlink to `my-package` + // ``` + if entry.path_is_symlink() { + if let Ok(target) = utils::canonicalize(entry.path()) { + // the symlink points to a parent dir of the current window + if open.components().count() > target.components().count() && + utils::common_ancestor(open, &target).is_some() + { + // short-circuiting + return Vec::new() + } + } + } + let subdir = entry.path(); // we skip commonly used subdirs that should not be searched for recursively if !(subdir.ends_with("tests") || subdir.ends_with("test") || subdir.ends_with("demo")) diff --git a/ethers-solc/src/report/compiler.rs b/ethers-solc/src/report/compiler.rs index b77f1b6599..b1e74eddf8 100644 --- a/ethers-solc/src/report/compiler.rs +++ b/ethers-solc/src/report/compiler.rs @@ -6,6 +6,7 @@ //! separate json file use crate::{CompilerInput, CompilerOutput}; +use semver::Version; use std::{env, path::PathBuf, str::FromStr}; /// Debug Helper type that can be used to write the [crate::Solc] [CompilerInput] and @@ -14,7 +15,8 @@ use std::{env, path::PathBuf, str::FromStr}; /// # Example /// /// If `ETHERS_SOLC_LOG=in=in.json,out=out.json` is then the reporter will be configured to write -/// the compiler input as pretty formatted json to `in.json` and the compiler output to `out.json` +/// the compiler input as pretty formatted json to `in.{solc version}.json` and the compiler output +/// to `out.{solc version}.json` /// /// ```no_run /// use ethers_solc::report::SolcCompilerIoReporter; @@ -53,16 +55,16 @@ impl SolcCompilerIoReporter { } /// Callback to write the input to disk if target is set - pub fn log_compiler_input(&self, input: &CompilerInput) { + pub fn log_compiler_input(&self, input: &CompilerInput, version: &Version) { if let Some(ref target) = self.target { - target.write_input(input) + target.write_input(input, version) } } /// Callback to write the input to disk if target is set - pub fn log_compiler_output(&self, output: &CompilerOutput) { + pub fn log_compiler_output(&self, output: &CompilerOutput, version: &Version) { if let Some(ref target) = self.target { - target.write_output(output) + target.write_output(output, version) } } } @@ -86,11 +88,11 @@ struct Target { } impl Target { - fn write_input(&self, input: &CompilerInput) { + fn write_input(&self, input: &CompilerInput, version: &Version) { tracing::trace!("logging compiler input to {}", self.dest_input.display()); match serde_json::to_string_pretty(input) { Ok(json) => { - if let Err(err) = std::fs::write(&self.dest_input, json) { + if let Err(err) = std::fs::write(get_file_name(&self.dest_input, version), json) { tracing::error!("Failed to write compiler input: {}", err) } } @@ -100,11 +102,11 @@ impl Target { } } - fn write_output(&self, output: &CompilerOutput) { + fn write_output(&self, output: &CompilerOutput, version: &Version) { tracing::trace!("logging compiler output to {}", self.dest_output.display()); match serde_json::to_string_pretty(output) { Ok(json) => { - if let Err(err) = std::fs::write(&self.dest_output, json) { + if let Err(err) = std::fs::write(get_file_name(&self.dest_output, version), json) { tracing::error!("Failed to write compiler output: {}", err) } } @@ -157,10 +159,30 @@ pub struct BadName { name: String, } +/// Returns the file name for the given version +fn get_file_name(path: impl Into, v: &Version) -> PathBuf { + let mut path = path.into(); + if let Some(stem) = path.file_stem().and_then(|s| s.to_str().map(|s| s.to_string())) { + path.set_file_name(format!("{}.{}.{}.{}.json", stem, v.major, v.minor, v.patch)); + } + path +} + #[cfg(test)] mod tests { use super::*; + #[test] + fn can_set_file_name() { + let s = "/a/b/c/in.json"; + let p = get_file_name(s, &Version::parse("0.8.10").unwrap()); + assert_eq!(PathBuf::from("/a/b/c/in.0.8.10.json"), p); + + let s = "abc.json"; + let p = get_file_name(s, &Version::parse("0.8.10").unwrap()); + assert_eq!(PathBuf::from("abc.0.8.10.json"), p); + } + #[test] fn can_parse_target() { let target: Target = "in=in.json,out=out.json".parse().unwrap(); diff --git a/ethers-solc/src/report/mod.rs b/ethers-solc/src/report/mod.rs index fd549aab2b..e87a586c91 100644 --- a/ethers-solc/src/report/mod.rs +++ b/ethers-solc/src/report/mod.rs @@ -93,7 +93,7 @@ where /// print custom messages to `stdout`. /// /// A `Reporter` is entirely passive and only listens to incoming "events". -pub trait Reporter: 'static { +pub trait Reporter: 'static + std::fmt::Debug { /// Callback invoked right before [`Solc::compile()`] is called /// /// This contains the [Solc] its [Version] the complete [CompilerInput] and all files that @@ -453,6 +453,7 @@ mod tests { #[test] fn scoped_reporter_works() { + #[derive(Debug)] struct TestReporter; impl Reporter for TestReporter {} @@ -468,6 +469,7 @@ mod tests { }); set_global_reporter(Report::new(BasicStdoutReporter::default())).unwrap(); + #[derive(Debug)] struct TestReporter; impl Reporter for TestReporter {} diff --git a/ethers-solc/src/resolver/mod.rs b/ethers-solc/src/resolver/mod.rs index 02debcfb45..9183fd0b39 100644 --- a/ethers-solc/src/resolver/mod.rs +++ b/ethers-solc/src/resolver/mod.rs @@ -52,7 +52,7 @@ use std::{ path::{Path, PathBuf}, }; -use parse::{SolData, SolDataUnit}; +use parse::{SolData, SolDataUnit, SolImport}; use rayon::prelude::*; use semver::VersionReq; @@ -62,6 +62,7 @@ use crate::{error::Result, utils, ProjectPathsConfig, SolcError, Source, Sources mod parse; mod tree; +pub use parse::SolImportAlias; pub use tree::{print, Charset, TreeOptions}; /// The underlying edges of the graph which only contains the raw relationship data. @@ -339,13 +340,14 @@ impl Graph { }; for import in node.data.imports.iter() { - match paths.resolve_import(cwd, import.data()) { + let import_path = import.data().path(); + match paths.resolve_import(cwd, import_path) { Ok(import) => { add_node(&mut unresolved, &mut index, &mut resolved_imports, import)?; } Err(err) => { - if unresolved_paths.insert(import.data().to_path_buf()) { - crate::report::unresolved_import(import.data(), &paths.remappings); + if unresolved_paths.insert(import_path.to_path_buf()) { + crate::report::unresolved_import(import_path, &paths.remappings); } tracing::trace!( "failed to resolve import component \"{:?}\" for {:?}", @@ -380,7 +382,7 @@ impl Graph { } } -#[cfg(all(feature = "svm-solc", feature = "async"))] +#[cfg(all(feature = "svm-solc"))] impl Graph { /// Consumes the nodes of the graph and returns all input files together with their appropriate /// version and the edges of the graph @@ -689,14 +691,14 @@ impl<'a> Iterator for NodesIter<'a> { } /// Container type for solc versions and their compatible sources -#[cfg(all(feature = "svm-solc", feature = "async"))] +#[cfg(all(feature = "svm-solc"))] #[derive(Debug)] pub struct VersionedSources { inner: HashMap, offline: bool, } -#[cfg(all(feature = "svm-solc", feature = "async"))] +#[cfg(all(feature = "svm-solc"))] impl VersionedSources { /// Resolves or installs the corresponding `Solc` installation. pub fn get( @@ -772,7 +774,7 @@ impl Node { &self.source.content } - pub fn imports(&self) -> &Vec> { + pub fn imports(&self) -> &Vec> { &self.data.imports } @@ -854,7 +856,7 @@ mod tests { let dapp_test = graph.node(1); assert_eq!(dapp_test.path, paths.sources.join("Dapp.t.sol")); assert_eq!( - dapp_test.data.imports.iter().map(|i| i.data()).collect::>(), + dapp_test.data.imports.iter().map(|i| i.data().path()).collect::>(), vec![&PathBuf::from("ds-test/test.sol"), &PathBuf::from("./Dapp.sol")] ); assert_eq!(graph.imported_nodes(1).to_vec(), vec![2, 0]); diff --git a/ethers-solc/src/resolver/parse.rs b/ethers-solc/src/resolver/parse.rs index 028856f9db..642b5104c2 100644 --- a/ethers-solc/src/resolver/parse.rs +++ b/ethers-solc/src/resolver/parse.rs @@ -1,11 +1,13 @@ use crate::{utils, Solc}; -use regex::Match; use semver::VersionReq; use solang_parser::pt::{ ContractPart, ContractTy, FunctionAttribute, FunctionDefinition, Import, Loc, SourceUnitPart, Visibility, }; -use std::path::{Path, PathBuf}; +use std::{ + ops::Range, + path::{Path, PathBuf}, +}; /// Represents various information about a solidity file parsed via [solang_parser] #[derive(Debug)] @@ -14,7 +16,7 @@ pub struct SolData { pub license: Option>, pub version: Option>, pub experimental: Option>, - pub imports: Vec>, + pub imports: Vec>, pub version_req: Option, pub libraries: Vec, pub contracts: Vec, @@ -39,7 +41,7 @@ impl SolData { pub fn parse(content: &str, file: &Path) -> Self { let mut version = None; let mut experimental = None; - let mut imports = Vec::>::new(); + let mut imports = Vec::>::new(); let mut libraries = Vec::new(); let mut contracts = Vec::new(); @@ -47,25 +49,33 @@ impl SolData { Ok((units, _)) => { for unit in units.0 { match unit { - SourceUnitPart::PragmaDirective(loc, _, pragma, value) => { + SourceUnitPart::PragmaDirective(loc, pragma, value) => { if pragma.name == "solidity" { // we're only interested in the solidity version pragma - version = Some(SolDataUnit::new(value.string.clone(), loc.into())); + version = Some(SolDataUnit::from_loc(value.string.clone(), loc)); } if pragma.name == "experimental" { experimental = - Some(SolDataUnit::new(value.string.clone(), loc.into())); + Some(SolDataUnit::from_loc(value.string.clone(), loc)); } } - SourceUnitPart::ImportDirective(_, import) => { - let (import, loc) = match import { - Import::Plain(s, l) => (s, l), - Import::GlobalSymbol(s, _, l) => (s, l), - Import::Rename(s, _, l) => (s, l), + SourceUnitPart::ImportDirective(import) => { + let (import, ids, loc) = match import { + Import::Plain(s, l) => (s, vec![], l), + Import::GlobalSymbol(s, i, l) => (s, vec![(i, None)], l), + Import::Rename(s, i, l) => (s, i, l), }; - imports - .push(SolDataUnit::new(PathBuf::from(import.string), loc.into())); + let sol_import = SolImport::new(PathBuf::from(import.string)) + .set_aliases( + ids.into_iter() + .map(|(id, alias)| match alias { + Some(al) => SolImportAlias::Contract(al.name, id.name), + None => SolImportAlias::File(id.name), + }) + .collect(), + ); + imports.push(SolDataUnit::from_loc(sol_import, loc)); } SourceUnitPart::ContractDefinition(def) => { let functions = def @@ -100,16 +110,14 @@ impl SolData { version = capture_outer_and_inner(content, &utils::RE_SOL_PRAGMA_VERSION, &["version"]) .first() - .map(|(cap, name)| { - SolDataUnit::new(name.as_str().to_owned(), cap.to_owned().into()) - }); + .map(|(cap, name)| SolDataUnit::new(name.as_str().to_owned(), cap.range())); imports = capture_imports(content); } }; let license = content.lines().next().and_then(|line| { capture_outer_and_inner(line, &utils::RE_SOL_SDPX_LICENSE_IDENTIFIER, &["license"]) .first() - .map(|(cap, l)| SolDataUnit::new(l.as_str().to_owned(), cap.to_owned().into())) + .map(|(cap, l)| SolDataUnit::new(l.as_str().to_owned(), cap.range())) }); let version_req = version.as_ref().and_then(|v| Solc::version_req(v.data()).ok()); @@ -130,6 +138,37 @@ pub struct SolContract { pub functions: Vec, } +#[derive(Debug, Clone)] +pub struct SolImport { + path: PathBuf, + aliases: Vec, +} + +#[derive(Debug, Clone, PartialEq)] +pub enum SolImportAlias { + File(String), + Contract(String, String), +} + +impl SolImport { + pub fn new(path: PathBuf) -> Self { + Self { path, aliases: vec![] } + } + + pub fn path(&self) -> &PathBuf { + &self.path + } + + pub fn aliases(&self) -> &Vec { + &self.aliases + } + + fn set_aliases(mut self, aliases: Vec) -> Self { + self.aliases = aliases; + self + } +} + /// Minimal representation of a contract inside a solidity file #[derive(Debug)] pub struct SolLibrary { @@ -164,57 +203,41 @@ impl SolLibrary { /// Represents an item in a solidity file with its location in the file #[derive(Debug, Clone)] pub struct SolDataUnit { - loc: Location, + loc: Range, data: T, } -/// Location in a text file buffer -#[derive(Debug, Clone)] -pub struct Location { - pub start: usize, - pub end: usize, -} - /// Solidity Data Unit decorated with its location within the file impl SolDataUnit { - pub fn new(data: T, loc: Location) -> Self { + pub fn new(data: T, loc: Range) -> Self { Self { data, loc } } + pub fn from_loc(data: T, loc: Loc) -> Self { + Self { + data, + loc: match loc { + Loc::File(_, start, end) => Range { start, end: end + 1 }, + _ => Range { start: 0, end: 0 }, + }, + } + } + /// Returns the underlying data for the unit pub fn data(&self) -> &T { &self.data } /// Returns the location of the given data unit - pub fn loc(&self) -> (usize, usize) { - (self.loc.start, self.loc.end) + pub fn loc(&self) -> Range { + self.loc.clone() } /// Returns the location of the given data unit adjusted by an offset. /// Used to determine new position of the unit within the file after /// content manipulation. - pub fn loc_by_offset(&self, offset: isize) -> (usize, usize) { - ( - offset.saturating_add(self.loc.start as isize) as usize, - // make the end location exclusive - offset.saturating_add(self.loc.end as isize + 1) as usize, - ) - } -} - -impl From> for Location { - fn from(src: Match) -> Self { - Location { start: src.start(), end: src.end() } - } -} - -impl From for Location { - fn from(src: Loc) -> Self { - match src { - Loc::File(_, start, end) => Location { start, end }, - _ => Location { start: 0, end: 0 }, - } + pub fn loc_by_offset(&self, offset: isize) -> Range { + utils::range_by_offset(&self.loc, offset) } } @@ -238,12 +261,31 @@ fn capture_outer_and_inner<'a>( }) .collect() } - -pub fn capture_imports(content: &str) -> Vec> { - capture_outer_and_inner(content, &utils::RE_SOL_IMPORT, &["p1", "p2", "p3", "p4"]) - .iter() - .map(|(cap, m)| SolDataUnit::new(PathBuf::from(m.as_str()), cap.to_owned().into())) - .collect() +/// Capture the import statement information together with aliases +pub fn capture_imports(content: &str) -> Vec> { + let mut imports = vec![]; + for cap in utils::RE_SOL_IMPORT.captures_iter(content) { + if let Some(name_match) = + vec!["p1", "p2", "p3", "p4"].iter().find_map(|name| cap.name(name)) + { + let statement_match = cap.get(0).unwrap(); + let mut aliases = vec![]; + for alias_cap in utils::RE_SOL_IMPORT_ALIAS.captures_iter(statement_match.as_str()) { + if let Some(alias) = alias_cap.name("alias") { + let alias = alias.as_str().to_owned(); + let import_alias = match alias_cap.name("target") { + Some(target) => SolImportAlias::Contract(alias, target.as_str().to_owned()), + None => SolImportAlias::File(alias), + }; + aliases.push(import_alias); + } + } + let sol_import = + SolImport::new(PathBuf::from(name_match.as_str())).set_aliases(aliases); + imports.push(SolDataUnit::new(sol_import, statement_match.range())); + } + } + imports } #[cfg(test)] @@ -259,7 +301,7 @@ import {DsTest} from "ds-test/test.sol"; "#; let captured_imports = - capture_imports(content).into_iter().map(|s| s.data).collect::>(); + capture_imports(content).into_iter().map(|s| s.data.path).collect::>(); let expected = utils::find_import_paths(content).map(|m| m.as_str().into()).collect::>(); @@ -275,4 +317,29 @@ import {DsTest} from "ds-test/test.sol"; ] ); } + + #[test] + fn cap_capture_aliases() { + let content = r#" +import * as T from "./Test.sol"; +import { DsTest as Test } from "ds-test/test.sol"; +import "ds-test/test.sol" as Test; +import { FloatMath as Math, Math as FloatMath } from "./Math.sol"; +"#; + + let caputred_imports = + capture_imports(content).into_iter().map(|s| s.data.aliases).collect::>(); + assert_eq!( + caputred_imports, + vec![ + vec![SolImportAlias::File("T".into())], + vec![SolImportAlias::Contract("Test".into(), "DsTest".into())], + vec![SolImportAlias::File("Test".into())], + vec![ + SolImportAlias::Contract("Math".into(), "FloatMath".into()), + SolImportAlias::Contract("FloatMath".into(), "Math".into()), + ], + ] + ); + } } diff --git a/ethers-solc/src/sourcemap.rs b/ethers-solc/src/sourcemap.rs index 6b47c65c5d..e1cf8a622d 100644 --- a/ethers-solc/src/sourcemap.rs +++ b/ethers-solc/src/sourcemap.rs @@ -134,7 +134,7 @@ impl AsRef for Jump { } } -impl<'a> fmt::Display for Jump { +impl fmt::Display for Jump { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { f.write_str(self.as_ref()) } @@ -176,7 +176,7 @@ pub struct SourceElement { pub modifier_depth: usize, } -impl<'a> fmt::Display for SourceElement { +impl fmt::Display for SourceElement { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { write!( f, @@ -199,7 +199,7 @@ struct SourceElementBuilder { pub modifier_depth: Option, } -impl<'a> fmt::Display for SourceElementBuilder { +impl fmt::Display for SourceElementBuilder { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { if self.offset.is_none() && self.length.is_none() && diff --git a/ethers-solc/src/utils.rs b/ethers-solc/src/utils.rs index bd354228ae..eedea95f9b 100644 --- a/ethers-solc/src/utils.rs +++ b/ethers-solc/src/utils.rs @@ -2,6 +2,7 @@ use std::{ collections::HashSet, + ops::Range, path::{Component, Path, PathBuf}, }; @@ -17,9 +18,13 @@ use walkdir::WalkDir; /// statement with the named groups "path", "id". // Adapted from pub static RE_SOL_IMPORT: Lazy = Lazy::new(|| { - Regex::new(r#"import\s+(?:(?:"(?P[^;]*)"|'(?P[^;]*)')(?:;|\s+as\s+(?P[^;]*);)|.+from\s+(?:"(?P.*)"|'(?P.*)');)"#).unwrap() + Regex::new(r#"import\s+(?:(?:"(?P.*)"|'(?P.*)')(?:\s+as\s+\w+)?|(?:(?:\w+(?:\s+as\s+\w+)?|\*\s+as\s+\w+|\{\s*(?:\w+(?:\s+as\s+\w+)?(?:\s*,\s*)?)+\s*\})\s+from\s+(?:"(?P.*)"|'(?P.*)')))\s*;"#).unwrap() }); +/// A regex that matches an alias within an import statement +pub static RE_SOL_IMPORT_ALIAS: Lazy = + Lazy::new(|| Regex::new(r#"(?:(?P\w+)|\*|'|")\s+as\s+(?P\w+)"#).unwrap()); + /// A regex that matches the version part of a solidity pragma /// as follows: `pragma solidity ^0.5.2;` => `^0.5.2` /// statement with the named group "version". @@ -35,6 +40,19 @@ pub static RE_SOL_SDPX_LICENSE_IDENTIFIER: Lazy = /// A regex used to remove extra lines in flatenned files pub static RE_THREE_OR_MORE_NEWLINES: Lazy = Lazy::new(|| Regex::new("\n{3,}").unwrap()); +/// Create a regex that matches any library or contract name inside a file +pub fn create_contract_or_lib_name_regex(name: &str) -> Regex { + Regex::new(&format!(r#"(?:using\s+(?P{name})\s+|is\s+(?:\w+\s*,\s*)*(?P{name})(?:\s*,\s*\w+)*|(?:(?P(?:function|error|as)\s+|\n[^\n]*(?:"([^"\n]|\\")*|'([^'\n]|\\')*))|\W+)(?P{name})(?:\.|\(| ))"#, name = name)).unwrap() +} + +/// Move a range by a specified offset +pub fn range_by_offset(range: &Range, offset: isize) -> Range { + Range { + start: offset.saturating_add(range.start as isize) as usize, + end: offset.saturating_add(range.end as isize) as usize, + } +} + /// Returns all path parts from any solidity import statement in a string, /// `import "./contracts/Contract.sol";` -> `"./contracts/Contract.sol"`. /// @@ -57,6 +75,8 @@ pub fn find_version_pragma(contract: &str) -> Option { /// Returns a list of absolute paths to all the solidity files under the root, or the file itself, /// if the path is a solidity file. /// +/// This also follows symlinks. +/// /// NOTE: this does not resolve imports from other locations /// /// # Example @@ -67,6 +87,7 @@ pub fn find_version_pragma(contract: &str) -> Option { /// ``` pub fn source_files(root: impl AsRef) -> Vec { WalkDir::new(root) + .follow_links(true) .into_iter() .filter_map(Result::ok) .filter(|e| e.file_type().is_file()) @@ -312,6 +333,40 @@ pub(crate) fn find_fave_or_alt_path(root: impl AsRef, fave: &str, alt: &st p } +#[cfg(not(target_arch = "wasm32"))] +use tokio::runtime::{Handle, Runtime}; + +#[cfg(not(target_arch = "wasm32"))] +#[derive(Debug)] +pub enum RuntimeOrHandle { + Runtime(Runtime), + Handle(Handle), +} + +#[cfg(not(target_arch = "wasm32"))] +impl Default for RuntimeOrHandle { + fn default() -> Self { + Self::new() + } +} + +#[cfg(not(target_arch = "wasm32"))] +impl RuntimeOrHandle { + pub fn new() -> RuntimeOrHandle { + match Handle::try_current() { + Ok(handle) => RuntimeOrHandle::Handle(handle), + Err(_) => RuntimeOrHandle::Runtime(Runtime::new().expect("Failed to start runtime")), + } + } + + pub fn block_on(&self, f: F) -> F::Output { + match &self { + RuntimeOrHandle::Runtime(runtime) => runtime.block_on(f), + RuntimeOrHandle::Handle(handle) => tokio::task::block_in_place(|| handle.block_on(f)), + } + } +} + /// Creates a new named tempdir #[cfg(any(test, feature = "project-util"))] pub(crate) fn tempdir(name: &str) -> Result { @@ -397,7 +452,7 @@ mod tests { let (unit, _) = solang_parser::parse(s, 0).unwrap(); assert_eq!(unit.0.len(), 1); match unit.0[0] { - SourceUnitPart::ImportDirective(_, _) => {} + SourceUnitPart::ImportDirective(_) => {} _ => unreachable!("failed to parse import"), } let imports: Vec<_> = find_import_paths(s).map(|m| m.as_str()).collect(); diff --git a/ethers-solc/test-data/ast/ast-erc4626.json b/ethers-solc/test-data/ast/ast-erc4626.json new file mode 100644 index 0000000000..cc733b85f1 --- /dev/null +++ b/ethers-solc/test-data/ast/ast-erc4626.json @@ -0,0 +1,6612 @@ +{ + "absolutePath": "/home/oliver/Projects/github/rari-capital/solmate/src/mixins/ERC4626.sol", + "id": 2954, + "exportedSymbols": { + "ERC20": [ + 31408 + ], + "ERC4626": [ + 2953 + ], + "FixedPointMathLib": [ + 32321 + ], + "SafeTransferLib": [ + 32785 + ] + }, + "nodeType": "SourceUnit", + "src": "42:6474:4", + "nodes": [ + { + "id": 2434, + "nodeType": "PragmaDirective", + "src": "42:24:4", + "literals": [ + "solidity", + ">=", + "0.8", + ".0" + ] + }, + { + "id": 2436, + "nodeType": "ImportDirective", + "src": "68:42:4", + "absolutePath": "/home/oliver/Projects/github/rari-capital/solmate/src/tokens/ERC20.sol", + "file": "../tokens/ERC20.sol", + "nameLocation": "-1:-1:-1", + "scope": 2954, + "sourceUnit": 31409, + "symbolAliases": [ + { + "foreign": { + "id": 2435, + "name": "ERC20", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "src": "76:5:4", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "id": 2438, + "nodeType": "ImportDirective", + "src": "111:61:4", + "absolutePath": "/home/oliver/Projects/github/rari-capital/solmate/src/utils/SafeTransferLib.sol", + "file": "../utils/SafeTransferLib.sol", + "nameLocation": "-1:-1:-1", + "scope": 2954, + "sourceUnit": 32786, + "symbolAliases": [ + { + "foreign": { + "id": 2437, + "name": "SafeTransferLib", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "src": "119:15:4", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "id": 2440, + "nodeType": "ImportDirective", + "src": "173:65:4", + "absolutePath": "/home/oliver/Projects/github/rari-capital/solmate/src/utils/FixedPointMathLib.sol", + "file": "../utils/FixedPointMathLib.sol", + "nameLocation": "-1:-1:-1", + "scope": 2954, + "sourceUnit": 32322, + "symbolAliases": [ + { + "foreign": { + "id": 2439, + "name": "FixedPointMathLib", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "src": "181:17:4", + "typeDescriptions": {} + }, + "nameLocation": "-1:-1:-1" + } + ], + "unitAlias": "" + }, + { + "id": 2953, + "nodeType": "ContractDefinition", + "src": "395:6120:4", + "nodes": [ + { + "id": 2447, + "nodeType": "UsingForDirective", + "src": "436:32:4", + "libraryName": { + "id": 2444, + "name": "SafeTransferLib", + "nodeType": "IdentifierPath", + "referencedDeclaration": 32785, + "src": "442:15:4" + }, + "typeName": { + "id": 2446, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 2445, + "name": "ERC20", + "nodeType": "IdentifierPath", + "referencedDeclaration": 31408, + "src": "462:5:4" + }, + "referencedDeclaration": 31408, + "src": "462:5:4", + "typeDescriptions": { + "typeIdentifier": "t_contract$_ERC20_$31408", + "typeString": "contract ERC20" + } + } + }, + { + "id": 2450, + "nodeType": "UsingForDirective", + "src": "473:36:4", + "libraryName": { + "id": 2448, + "name": "FixedPointMathLib", + "nodeType": "IdentifierPath", + "referencedDeclaration": 32321, + "src": "479:17:4" + }, + "typeName": { + "id": 2449, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "501:7:4", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + }, + { + "id": 2460, + "nodeType": "EventDefinition", + "src": "694:93:4", + "anonymous": false, + "name": "Deposit", + "nameLocation": "700:7:4", + "parameters": { + "id": 2459, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2452, + "indexed": true, + "mutability": "mutable", + "name": "caller", + "nameLocation": "724:6:4", + "nodeType": "VariableDeclaration", + "scope": 2460, + "src": "708:22:4", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 2451, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "708:7:4", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2454, + "indexed": true, + "mutability": "mutable", + "name": "owner", + "nameLocation": "748:5:4", + "nodeType": "VariableDeclaration", + "scope": 2460, + "src": "732:21:4", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 2453, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "732:7:4", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2456, + "indexed": false, + "mutability": "mutable", + "name": "assets", + "nameLocation": "763:6:4", + "nodeType": "VariableDeclaration", + "scope": 2460, + "src": "755:14:4", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2455, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "755:7:4", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2458, + "indexed": false, + "mutability": "mutable", + "name": "shares", + "nameLocation": "779:6:4", + "nodeType": "VariableDeclaration", + "scope": 2460, + "src": "771:14:4", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2457, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "771:7:4", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "707:79:4" + } + }, + { + "id": 2472, + "nodeType": "EventDefinition", + "src": "793:166:4", + "anonymous": false, + "name": "Withdraw", + "nameLocation": "799:8:4", + "parameters": { + "id": 2471, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2462, + "indexed": true, + "mutability": "mutable", + "name": "caller", + "nameLocation": "833:6:4", + "nodeType": "VariableDeclaration", + "scope": 2472, + "src": "817:22:4", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 2461, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "817:7:4", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2464, + "indexed": true, + "mutability": "mutable", + "name": "receiver", + "nameLocation": "865:8:4", + "nodeType": "VariableDeclaration", + "scope": 2472, + "src": "849:24:4", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 2463, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "849:7:4", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2466, + "indexed": true, + "mutability": "mutable", + "name": "owner", + "nameLocation": "899:5:4", + "nodeType": "VariableDeclaration", + "scope": 2472, + "src": "883:21:4", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 2465, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "883:7:4", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2468, + "indexed": false, + "mutability": "mutable", + "name": "assets", + "nameLocation": "922:6:4", + "nodeType": "VariableDeclaration", + "scope": 2472, + "src": "914:14:4", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2467, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "914:7:4", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2470, + "indexed": false, + "mutability": "mutable", + "name": "shares", + "nameLocation": "946:6:4", + "nodeType": "VariableDeclaration", + "scope": 2472, + "src": "938:14:4", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2469, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "938:7:4", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "807:151:4" + } + }, + { + "id": 2475, + "nodeType": "VariableDeclaration", + "src": "1146:28:4", + "constant": false, + "functionSelector": "38d52e0f", + "mutability": "immutable", + "name": "asset", + "nameLocation": "1169:5:4", + "scope": 2953, + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_contract$_ERC20_$31408", + "typeString": "contract ERC20" + }, + "typeName": { + "id": 2474, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 2473, + "name": "ERC20", + "nodeType": "IdentifierPath", + "referencedDeclaration": 31408, + "src": "1146:5:4" + }, + "referencedDeclaration": 31408, + "src": "1146:5:4", + "typeDescriptions": { + "typeIdentifier": "t_contract$_ERC20_$31408", + "typeString": "contract ERC20" + } + }, + "visibility": "public" + }, + { + "id": 2497, + "nodeType": "FunctionDefinition", + "src": "1181:172:4", + "body": { + "id": 2496, + "nodeType": "Block", + "src": "1322:31:4", + "statements": [ + { + "expression": { + "id": 2494, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 2492, + "name": "asset", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2475, + "src": "1332:5:4", + "typeDescriptions": { + "typeIdentifier": "t_contract$_ERC20_$31408", + "typeString": "contract ERC20" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "id": 2493, + "name": "_asset", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2478, + "src": "1340:6:4", + "typeDescriptions": { + "typeIdentifier": "t_contract$_ERC20_$31408", + "typeString": "contract ERC20" + } + }, + "src": "1332:14:4", + "typeDescriptions": { + "typeIdentifier": "t_contract$_ERC20_$31408", + "typeString": "contract ERC20" + } + }, + "id": 2495, + "nodeType": "ExpressionStatement", + "src": "1332:14:4" + } + ] + }, + "implemented": true, + "kind": "constructor", + "modifiers": [ + { + "arguments": [ + { + "id": 2485, + "name": "_name", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2480, + "src": "1287:5:4", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + }, + { + "id": 2486, + "name": "_symbol", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2482, + "src": "1294:7:4", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + }, + { + "arguments": [], + "expression": { + "argumentTypes": [], + "expression": { + "id": 2487, + "name": "_asset", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2478, + "src": "1303:6:4", + "typeDescriptions": { + "typeIdentifier": "t_contract$_ERC20_$31408", + "typeString": "contract ERC20" + } + }, + "id": 2488, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "decimals", + "nodeType": "MemberAccess", + "referencedDeclaration": 31045, + "src": "1303:15:4", + "typeDescriptions": { + "typeIdentifier": "t_function_external_view$__$returns$_t_uint8_$", + "typeString": "function () view external returns (uint8)" + } + }, + "id": 2489, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "1303:17:4", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + } + } + ], + "id": 2490, + "kind": "baseConstructorSpecifier", + "modifierName": { + "id": 2484, + "name": "ERC20", + "nodeType": "IdentifierPath", + "referencedDeclaration": 31408, + "src": "1281:5:4" + }, + "nodeType": "ModifierInvocation", + "src": "1281:40:4" + } + ], + "name": "", + "nameLocation": "-1:-1:-1", + "parameters": { + "id": 2483, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2478, + "mutability": "mutable", + "name": "_asset", + "nameLocation": "1208:6:4", + "nodeType": "VariableDeclaration", + "scope": 2497, + "src": "1202:12:4", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_contract$_ERC20_$31408", + "typeString": "contract ERC20" + }, + "typeName": { + "id": 2477, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 2476, + "name": "ERC20", + "nodeType": "IdentifierPath", + "referencedDeclaration": 31408, + "src": "1202:5:4" + }, + "referencedDeclaration": 31408, + "src": "1202:5:4", + "typeDescriptions": { + "typeIdentifier": "t_contract$_ERC20_$31408", + "typeString": "contract ERC20" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2480, + "mutability": "mutable", + "name": "_name", + "nameLocation": "1238:5:4", + "nodeType": "VariableDeclaration", + "scope": 2497, + "src": "1224:19:4", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string" + }, + "typeName": { + "id": 2479, + "name": "string", + "nodeType": "ElementaryTypeName", + "src": "1224:6:4", + "typeDescriptions": { + "typeIdentifier": "t_string_storage_ptr", + "typeString": "string" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2482, + "mutability": "mutable", + "name": "_symbol", + "nameLocation": "1267:7:4", + "nodeType": "VariableDeclaration", + "scope": 2497, + "src": "1253:21:4", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string" + }, + "typeName": { + "id": 2481, + "name": "string", + "nodeType": "ElementaryTypeName", + "src": "1253:6:4", + "typeDescriptions": { + "typeIdentifier": "t_string_storage_ptr", + "typeString": "string" + } + }, + "visibility": "internal" + } + ], + "src": "1192:88:4" + }, + "returnParameters": { + "id": 2491, + "nodeType": "ParameterList", + "parameters": [], + "src": "1322:0:4" + }, + "scope": 2953, + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "internal" + }, + { + "id": 2549, + "nodeType": "FunctionDefinition", + "src": "1547:516:4", + "body": { + "id": 2548, + "nodeType": "Block", + "src": "1638:425:4", + "statements": [ + { + "expression": { + "arguments": [ + { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 2514, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "components": [ + { + "id": 2511, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 2507, + "name": "shares", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2504, + "src": "1732:6:4", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "arguments": [ + { + "id": 2509, + "name": "assets", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2499, + "src": "1756:6:4", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 2508, + "name": "previewDeposit", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2822, + "src": "1741:14:4", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$_t_uint256_$returns$_t_uint256_$", + "typeString": "function (uint256) view returns (uint256)" + } + }, + "id": 2510, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "1741:22:4", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "1732:31:4", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "id": 2512, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "1731:33:4", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "hexValue": "30", + "id": 2513, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "1768:1:4", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "src": "1731:38:4", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "hexValue": "5a45524f5f534841524553", + "id": 2515, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "1771:13:4", + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_2119bd5d92259e418533f96b824fbd100e3dea453e6ac4c5f7315e6344368f2f", + "typeString": "literal_string \"ZERO_SHARES\"" + }, + "value": "ZERO_SHARES" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_stringliteral_2119bd5d92259e418533f96b824fbd100e3dea453e6ac4c5f7315e6344368f2f", + "typeString": "literal_string \"ZERO_SHARES\"" + } + ], + "id": 2506, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [ + -18, + -18 + ], + "referencedDeclaration": -18, + "src": "1723:7:4", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", + "typeString": "function (bool,string memory) pure" + } + }, + "id": 2516, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "1723:62:4", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 2517, + "nodeType": "ExpressionStatement", + "src": "1723:62:4" + }, + { + "expression": { + "arguments": [ + { + "expression": { + "id": 2521, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -15, + "src": "1888:3:4", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 2522, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "src": "1888:10:4", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "arguments": [ + { + "id": 2525, + "name": "this", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -28, + "src": "1908:4:4", + "typeDescriptions": { + "typeIdentifier": "t_contract$_ERC4626_$2953", + "typeString": "contract ERC4626" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_contract$_ERC4626_$2953", + "typeString": "contract ERC4626" + } + ], + "id": 2524, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "1900:7:4", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 2523, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "1900:7:4", + "typeDescriptions": {} + } + }, + "id": 2526, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "1900:13:4", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 2527, + "name": "assets", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2499, + "src": "1915:6:4", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "id": 2518, + "name": "asset", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2475, + "src": "1865:5:4", + "typeDescriptions": { + "typeIdentifier": "t_contract$_ERC20_$31408", + "typeString": "contract ERC20" + } + }, + "id": 2520, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "safeTransferFrom", + "nodeType": "MemberAccess", + "referencedDeclaration": 32744, + "src": "1865:22:4", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_contract$_ERC20_$31408_$_t_address_$_t_address_$_t_uint256_$returns$__$bound_to$_t_contract$_ERC20_$31408_$", + "typeString": "function (contract ERC20,address,address,uint256)" + } + }, + "id": 2528, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "1865:57:4", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 2529, + "nodeType": "ExpressionStatement", + "src": "1865:57:4" + }, + { + "expression": { + "arguments": [ + { + "id": 2531, + "name": "receiver", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2501, + "src": "1939:8:4", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 2532, + "name": "shares", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2504, + "src": "1949:6:4", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 2530, + "name": "_mint", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 31379, + "src": "1933:5:4", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_uint256_$returns$__$", + "typeString": "function (address,uint256)" + } + }, + "id": 2533, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "1933:23:4", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 2534, + "nodeType": "ExpressionStatement", + "src": "1933:23:4" + }, + { + "eventCall": { + "arguments": [ + { + "expression": { + "id": 2536, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -15, + "src": "1980:3:4", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 2537, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "src": "1980:10:4", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 2538, + "name": "receiver", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2501, + "src": "1992:8:4", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 2539, + "name": "assets", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2499, + "src": "2002:6:4", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 2540, + "name": "shares", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2504, + "src": "2010:6:4", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 2535, + "name": "Deposit", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2460, + "src": "1972:7:4", + "typeDescriptions": { + "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$_t_uint256_$returns$__$", + "typeString": "function (address,address,uint256,uint256)" + } + }, + "id": 2541, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "1972:45:4", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 2542, + "nodeType": "EmitStatement", + "src": "1967:50:4" + }, + { + "expression": { + "arguments": [ + { + "id": 2544, + "name": "assets", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2499, + "src": "2041:6:4", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 2545, + "name": "shares", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2504, + "src": "2049:6:4", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 2543, + "name": "afterDeposit", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2952, + "src": "2028:12:4", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_uint256_$_t_uint256_$returns$__$", + "typeString": "function (uint256,uint256)" + } + }, + "id": 2546, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "2028:28:4", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 2547, + "nodeType": "ExpressionStatement", + "src": "2028:28:4" + } + ] + }, + "functionSelector": "6e553f65", + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "deposit", + "nameLocation": "1556:7:4", + "parameters": { + "id": 2502, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2499, + "mutability": "mutable", + "name": "assets", + "nameLocation": "1572:6:4", + "nodeType": "VariableDeclaration", + "scope": 2549, + "src": "1564:14:4", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2498, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1564:7:4", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2501, + "mutability": "mutable", + "name": "receiver", + "nameLocation": "1588:8:4", + "nodeType": "VariableDeclaration", + "scope": 2549, + "src": "1580:16:4", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 2500, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "1580:7:4", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "1563:34:4" + }, + "returnParameters": { + "id": 2505, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2504, + "mutability": "mutable", + "name": "shares", + "nameLocation": "1630:6:4", + "nodeType": "VariableDeclaration", + "scope": 2549, + "src": "1622:14:4", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2503, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1622:7:4", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "1621:16:4" + }, + "scope": 2953, + "stateMutability": "nonpayable", + "virtual": true, + "visibility": "public" + }, + { + "id": 2595, + "nodeType": "FunctionDefinition", + "src": "2069:467:4", + "body": { + "id": 2594, + "nodeType": "Block", + "src": "2157:379:4", + "statements": [ + { + "expression": { + "id": 2562, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 2558, + "name": "assets", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2556, + "src": "2167:6:4", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "arguments": [ + { + "id": 2560, + "name": "shares", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2551, + "src": "2188:6:4", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 2559, + "name": "previewMint", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2846, + "src": "2176:11:4", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$_t_uint256_$returns$_t_uint256_$", + "typeString": "function (uint256) view returns (uint256)" + } + }, + "id": 2561, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "2176:19:4", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "2167:28:4", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 2563, + "nodeType": "ExpressionStatement", + "src": "2167:28:4" + }, + { + "expression": { + "arguments": [ + { + "expression": { + "id": 2567, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -15, + "src": "2361:3:4", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 2568, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "src": "2361:10:4", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "arguments": [ + { + "id": 2571, + "name": "this", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -28, + "src": "2381:4:4", + "typeDescriptions": { + "typeIdentifier": "t_contract$_ERC4626_$2953", + "typeString": "contract ERC4626" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_contract$_ERC4626_$2953", + "typeString": "contract ERC4626" + } + ], + "id": 2570, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "2373:7:4", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 2569, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "2373:7:4", + "typeDescriptions": {} + } + }, + "id": 2572, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "2373:13:4", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 2573, + "name": "assets", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2556, + "src": "2388:6:4", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "id": 2564, + "name": "asset", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2475, + "src": "2338:5:4", + "typeDescriptions": { + "typeIdentifier": "t_contract$_ERC20_$31408", + "typeString": "contract ERC20" + } + }, + "id": 2566, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "safeTransferFrom", + "nodeType": "MemberAccess", + "referencedDeclaration": 32744, + "src": "2338:22:4", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_contract$_ERC20_$31408_$_t_address_$_t_address_$_t_uint256_$returns$__$bound_to$_t_contract$_ERC20_$31408_$", + "typeString": "function (contract ERC20,address,address,uint256)" + } + }, + "id": 2574, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "2338:57:4", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 2575, + "nodeType": "ExpressionStatement", + "src": "2338:57:4" + }, + { + "expression": { + "arguments": [ + { + "id": 2577, + "name": "receiver", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2553, + "src": "2412:8:4", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 2578, + "name": "shares", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2551, + "src": "2422:6:4", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 2576, + "name": "_mint", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 31379, + "src": "2406:5:4", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_uint256_$returns$__$", + "typeString": "function (address,uint256)" + } + }, + "id": 2579, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "2406:23:4", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 2580, + "nodeType": "ExpressionStatement", + "src": "2406:23:4" + }, + { + "eventCall": { + "arguments": [ + { + "expression": { + "id": 2582, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -15, + "src": "2453:3:4", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 2583, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "src": "2453:10:4", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 2584, + "name": "receiver", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2553, + "src": "2465:8:4", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 2585, + "name": "assets", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2556, + "src": "2475:6:4", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 2586, + "name": "shares", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2551, + "src": "2483:6:4", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 2581, + "name": "Deposit", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2460, + "src": "2445:7:4", + "typeDescriptions": { + "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$_t_uint256_$returns$__$", + "typeString": "function (address,address,uint256,uint256)" + } + }, + "id": 2587, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "2445:45:4", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 2588, + "nodeType": "EmitStatement", + "src": "2440:50:4" + }, + { + "expression": { + "arguments": [ + { + "id": 2590, + "name": "assets", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2556, + "src": "2514:6:4", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 2591, + "name": "shares", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2551, + "src": "2522:6:4", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 2589, + "name": "afterDeposit", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2952, + "src": "2501:12:4", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_uint256_$_t_uint256_$returns$__$", + "typeString": "function (uint256,uint256)" + } + }, + "id": 2592, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "2501:28:4", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 2593, + "nodeType": "ExpressionStatement", + "src": "2501:28:4" + } + ] + }, + "functionSelector": "94bf804d", + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "mint", + "nameLocation": "2078:4:4", + "parameters": { + "id": 2554, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2551, + "mutability": "mutable", + "name": "shares", + "nameLocation": "2091:6:4", + "nodeType": "VariableDeclaration", + "scope": 2595, + "src": "2083:14:4", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2550, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2083:7:4", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2553, + "mutability": "mutable", + "name": "receiver", + "nameLocation": "2107:8:4", + "nodeType": "VariableDeclaration", + "scope": 2595, + "src": "2099:16:4", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 2552, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "2099:7:4", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "2082:34:4" + }, + "returnParameters": { + "id": 2557, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2556, + "mutability": "mutable", + "name": "assets", + "nameLocation": "2149:6:4", + "nodeType": "VariableDeclaration", + "scope": 2595, + "src": "2141:14:4", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2555, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2141:7:4", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "2140:16:4" + }, + "scope": 2953, + "stateMutability": "nonpayable", + "virtual": true, + "visibility": "public" + }, + { + "id": 2673, + "nodeType": "FunctionDefinition", + "src": "2542:679:4", + "body": { + "id": 2672, + "nodeType": "Block", + "src": "2679:542:4", + "statements": [ + { + "expression": { + "id": 2610, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 2606, + "name": "shares", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2604, + "src": "2689:6:4", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "arguments": [ + { + "id": 2608, + "name": "assets", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2597, + "src": "2714:6:4", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 2607, + "name": "previewWithdraw", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2870, + "src": "2698:15:4", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$_t_uint256_$returns$_t_uint256_$", + "typeString": "function (uint256) view returns (uint256)" + } + }, + "id": 2609, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "2698:23:4", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "2689:32:4", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 2611, + "nodeType": "ExpressionStatement", + "src": "2689:32:4" + }, + { + "condition": { + "commonType": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "id": 2615, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "expression": { + "id": 2612, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -15, + "src": "2803:3:4", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 2613, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "src": "2803:10:4", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "id": 2614, + "name": "owner", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2601, + "src": "2817:5:4", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "src": "2803:19:4", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 2645, + "nodeType": "IfStatement", + "src": "2799:228:4", + "trueBody": { + "id": 2644, + "nodeType": "Block", + "src": "2824:203:4", + "statements": [ + { + "assignments": [ + 2617 + ], + "declarations": [ + { + "constant": false, + "id": 2617, + "mutability": "mutable", + "name": "allowed", + "nameLocation": "2846:7:4", + "nodeType": "VariableDeclaration", + "scope": 2644, + "src": "2838:15:4", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2616, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2838:7:4", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "id": 2624, + "initialValue": { + "baseExpression": { + "baseExpression": { + "id": 2618, + "name": "allowance", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 31057, + "src": "2856:9:4", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_uint256_$_$", + "typeString": "mapping(address => mapping(address => uint256))" + } + }, + "id": 2620, + "indexExpression": { + "id": 2619, + "name": "owner", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2601, + "src": "2866:5:4", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "2856:16:4", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$", + "typeString": "mapping(address => uint256)" + } + }, + "id": 2623, + "indexExpression": { + "expression": { + "id": 2621, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -15, + "src": "2873:3:4", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 2622, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "src": "2873:10:4", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "2856:28:4", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "2838:46:4" + }, + { + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 2631, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 2625, + "name": "allowed", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2617, + "src": "2939:7:4", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "expression": { + "arguments": [ + { + "id": 2628, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "2955:7:4", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint256_$", + "typeString": "type(uint256)" + }, + "typeName": { + "id": 2627, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2955:7:4", + "typeDescriptions": {} + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_type$_t_uint256_$", + "typeString": "type(uint256)" + } + ], + "id": 2626, + "name": "type", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -27, + "src": "2950:4:4", + "typeDescriptions": { + "typeIdentifier": "t_function_metatype_pure$__$returns$__$", + "typeString": "function () pure" + } + }, + "id": 2629, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "2950:13:4", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_magic_meta_type_t_uint256", + "typeString": "type(uint256)" + } + }, + "id": 2630, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "max", + "nodeType": "MemberAccess", + "src": "2950:17:4", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "2939:28:4", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 2643, + "nodeType": "IfStatement", + "src": "2935:81:4", + "trueBody": { + "expression": { + "id": 2641, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "baseExpression": { + "baseExpression": { + "id": 2632, + "name": "allowance", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 31057, + "src": "2969:9:4", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_uint256_$_$", + "typeString": "mapping(address => mapping(address => uint256))" + } + }, + "id": 2636, + "indexExpression": { + "id": 2633, + "name": "owner", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2601, + "src": "2979:5:4", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "2969:16:4", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$", + "typeString": "mapping(address => uint256)" + } + }, + "id": 2637, + "indexExpression": { + "expression": { + "id": 2634, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -15, + "src": "2986:3:4", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 2635, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "src": "2986:10:4", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "nodeType": "IndexAccess", + "src": "2969:28:4", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 2640, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 2638, + "name": "allowed", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2617, + "src": "3000:7:4", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "-", + "rightExpression": { + "id": 2639, + "name": "shares", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2604, + "src": "3010:6:4", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "3000:16:4", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "2969:47:4", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 2642, + "nodeType": "ExpressionStatement", + "src": "2969:47:4" + } + } + ] + } + }, + { + "expression": { + "arguments": [ + { + "id": 2647, + "name": "assets", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2597, + "src": "3052:6:4", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 2648, + "name": "shares", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2604, + "src": "3060:6:4", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 2646, + "name": "beforeWithdraw", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2944, + "src": "3037:14:4", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_uint256_$_t_uint256_$returns$__$", + "typeString": "function (uint256,uint256)" + } + }, + "id": 2649, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "3037:30:4", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 2650, + "nodeType": "ExpressionStatement", + "src": "3037:30:4" + }, + { + "expression": { + "arguments": [ + { + "id": 2652, + "name": "owner", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2601, + "src": "3084:5:4", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 2653, + "name": "shares", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2604, + "src": "3091:6:4", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 2651, + "name": "_burn", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 31407, + "src": "3078:5:4", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_uint256_$returns$__$", + "typeString": "function (address,uint256)" + } + }, + "id": 2654, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "3078:20:4", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 2655, + "nodeType": "ExpressionStatement", + "src": "3078:20:4" + }, + { + "eventCall": { + "arguments": [ + { + "expression": { + "id": 2657, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -15, + "src": "3123:3:4", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 2658, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "src": "3123:10:4", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 2659, + "name": "receiver", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2599, + "src": "3135:8:4", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 2660, + "name": "owner", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2601, + "src": "3145:5:4", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 2661, + "name": "assets", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2597, + "src": "3152:6:4", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 2662, + "name": "shares", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2604, + "src": "3160:6:4", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 2656, + "name": "Withdraw", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2472, + "src": "3114:8:4", + "typeDescriptions": { + "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$_t_address_$_t_uint256_$_t_uint256_$returns$__$", + "typeString": "function (address,address,address,uint256,uint256)" + } + }, + "id": 2663, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "3114:53:4", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 2664, + "nodeType": "EmitStatement", + "src": "3109:58:4" + }, + { + "expression": { + "arguments": [ + { + "id": 2668, + "name": "receiver", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2599, + "src": "3197:8:4", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 2669, + "name": "assets", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2597, + "src": "3207:6:4", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "id": 2665, + "name": "asset", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2475, + "src": "3178:5:4", + "typeDescriptions": { + "typeIdentifier": "t_contract$_ERC20_$31408", + "typeString": "contract ERC20" + } + }, + "id": 2667, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "safeTransfer", + "nodeType": "MemberAccess", + "referencedDeclaration": 32764, + "src": "3178:18:4", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_contract$_ERC20_$31408_$_t_address_$_t_uint256_$returns$__$bound_to$_t_contract$_ERC20_$31408_$", + "typeString": "function (contract ERC20,address,uint256)" + } + }, + "id": 2670, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "3178:36:4", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 2671, + "nodeType": "ExpressionStatement", + "src": "3178:36:4" + } + ] + }, + "functionSelector": "b460af94", + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "withdraw", + "nameLocation": "2551:8:4", + "parameters": { + "id": 2602, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2597, + "mutability": "mutable", + "name": "assets", + "nameLocation": "2577:6:4", + "nodeType": "VariableDeclaration", + "scope": 2673, + "src": "2569:14:4", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2596, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2569:7:4", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2599, + "mutability": "mutable", + "name": "receiver", + "nameLocation": "2601:8:4", + "nodeType": "VariableDeclaration", + "scope": 2673, + "src": "2593:16:4", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 2598, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "2593:7:4", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2601, + "mutability": "mutable", + "name": "owner", + "nameLocation": "2627:5:4", + "nodeType": "VariableDeclaration", + "scope": 2673, + "src": "2619:13:4", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 2600, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "2619:7:4", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "2559:79:4" + }, + "returnParameters": { + "id": 2605, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2604, + "mutability": "mutable", + "name": "shares", + "nameLocation": "2671:6:4", + "nodeType": "VariableDeclaration", + "scope": 2673, + "src": "2663:14:4", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2603, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2663:7:4", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "2662:16:4" + }, + "scope": 2953, + "stateMutability": "nonpayable", + "virtual": true, + "visibility": "public" + }, + { + "id": 2757, + "nodeType": "FunctionDefinition", + "src": "3227:713:4", + "body": { + "id": 2756, + "nodeType": "Block", + "src": "3362:578:4", + "statements": [ + { + "condition": { + "commonType": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "id": 2687, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "expression": { + "id": 2684, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -15, + "src": "3376:3:4", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 2685, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "src": "3376:10:4", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "id": 2686, + "name": "owner", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2679, + "src": "3390:5:4", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "src": "3376:19:4", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 2717, + "nodeType": "IfStatement", + "src": "3372:228:4", + "trueBody": { + "id": 2716, + "nodeType": "Block", + "src": "3397:203:4", + "statements": [ + { + "assignments": [ + 2689 + ], + "declarations": [ + { + "constant": false, + "id": 2689, + "mutability": "mutable", + "name": "allowed", + "nameLocation": "3419:7:4", + "nodeType": "VariableDeclaration", + "scope": 2716, + "src": "3411:15:4", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2688, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "3411:7:4", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "id": 2696, + "initialValue": { + "baseExpression": { + "baseExpression": { + "id": 2690, + "name": "allowance", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 31057, + "src": "3429:9:4", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_uint256_$_$", + "typeString": "mapping(address => mapping(address => uint256))" + } + }, + "id": 2692, + "indexExpression": { + "id": 2691, + "name": "owner", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2679, + "src": "3439:5:4", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "3429:16:4", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$", + "typeString": "mapping(address => uint256)" + } + }, + "id": 2695, + "indexExpression": { + "expression": { + "id": 2693, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -15, + "src": "3446:3:4", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 2694, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "src": "3446:10:4", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "3429:28:4", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "3411:46:4" + }, + { + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 2703, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 2697, + "name": "allowed", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2689, + "src": "3512:7:4", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "expression": { + "arguments": [ + { + "id": 2700, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "3528:7:4", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint256_$", + "typeString": "type(uint256)" + }, + "typeName": { + "id": 2699, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "3528:7:4", + "typeDescriptions": {} + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_type$_t_uint256_$", + "typeString": "type(uint256)" + } + ], + "id": 2698, + "name": "type", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -27, + "src": "3523:4:4", + "typeDescriptions": { + "typeIdentifier": "t_function_metatype_pure$__$returns$__$", + "typeString": "function () pure" + } + }, + "id": 2701, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "3523:13:4", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_magic_meta_type_t_uint256", + "typeString": "type(uint256)" + } + }, + "id": 2702, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "max", + "nodeType": "MemberAccess", + "src": "3523:17:4", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "3512:28:4", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 2715, + "nodeType": "IfStatement", + "src": "3508:81:4", + "trueBody": { + "expression": { + "id": 2713, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "baseExpression": { + "baseExpression": { + "id": 2704, + "name": "allowance", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 31057, + "src": "3542:9:4", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_uint256_$_$", + "typeString": "mapping(address => mapping(address => uint256))" + } + }, + "id": 2708, + "indexExpression": { + "id": 2705, + "name": "owner", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2679, + "src": "3552:5:4", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "3542:16:4", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$", + "typeString": "mapping(address => uint256)" + } + }, + "id": 2709, + "indexExpression": { + "expression": { + "id": 2706, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -15, + "src": "3559:3:4", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 2707, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "src": "3559:10:4", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "nodeType": "IndexAccess", + "src": "3542:28:4", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 2712, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 2710, + "name": "allowed", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2689, + "src": "3573:7:4", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "-", + "rightExpression": { + "id": 2711, + "name": "shares", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2675, + "src": "3583:6:4", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "3573:16:4", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "3542:47:4", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 2714, + "nodeType": "ExpressionStatement", + "src": "3542:47:4" + } + } + ] + } + }, + { + "expression": { + "arguments": [ + { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 2726, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "components": [ + { + "id": 2723, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 2719, + "name": "assets", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2682, + "src": "3693:6:4", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "arguments": [ + { + "id": 2721, + "name": "shares", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2675, + "src": "3716:6:4", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 2720, + "name": "previewRedeem", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2882, + "src": "3702:13:4", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$_t_uint256_$returns$_t_uint256_$", + "typeString": "function (uint256) view returns (uint256)" + } + }, + "id": 2722, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "3702:21:4", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "3693:30:4", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "id": 2724, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "3692:32:4", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "hexValue": "30", + "id": 2725, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "3728:1:4", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "src": "3692:37:4", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "hexValue": "5a45524f5f415353455453", + "id": 2727, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "3731:13:4", + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_bf169ab2ef12d57708bb5afe72ea54ba3ad2eccb91dd95f37571afa377c52483", + "typeString": "literal_string \"ZERO_ASSETS\"" + }, + "value": "ZERO_ASSETS" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_stringliteral_bf169ab2ef12d57708bb5afe72ea54ba3ad2eccb91dd95f37571afa377c52483", + "typeString": "literal_string \"ZERO_ASSETS\"" + } + ], + "id": 2718, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [ + -18, + -18 + ], + "referencedDeclaration": -18, + "src": "3684:7:4", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", + "typeString": "function (bool,string memory) pure" + } + }, + "id": 2728, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "3684:61:4", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 2729, + "nodeType": "ExpressionStatement", + "src": "3684:61:4" + }, + { + "expression": { + "arguments": [ + { + "id": 2731, + "name": "assets", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2682, + "src": "3771:6:4", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 2732, + "name": "shares", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2675, + "src": "3779:6:4", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 2730, + "name": "beforeWithdraw", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2944, + "src": "3756:14:4", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_uint256_$_t_uint256_$returns$__$", + "typeString": "function (uint256,uint256)" + } + }, + "id": 2733, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "3756:30:4", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 2734, + "nodeType": "ExpressionStatement", + "src": "3756:30:4" + }, + { + "expression": { + "arguments": [ + { + "id": 2736, + "name": "owner", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2679, + "src": "3803:5:4", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 2737, + "name": "shares", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2675, + "src": "3810:6:4", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 2735, + "name": "_burn", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 31407, + "src": "3797:5:4", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_uint256_$returns$__$", + "typeString": "function (address,uint256)" + } + }, + "id": 2738, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "3797:20:4", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 2739, + "nodeType": "ExpressionStatement", + "src": "3797:20:4" + }, + { + "eventCall": { + "arguments": [ + { + "expression": { + "id": 2741, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -15, + "src": "3842:3:4", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 2742, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "src": "3842:10:4", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 2743, + "name": "receiver", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2677, + "src": "3854:8:4", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 2744, + "name": "owner", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2679, + "src": "3864:5:4", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 2745, + "name": "assets", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2682, + "src": "3871:6:4", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 2746, + "name": "shares", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2675, + "src": "3879:6:4", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 2740, + "name": "Withdraw", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2472, + "src": "3833:8:4", + "typeDescriptions": { + "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$_t_address_$_t_uint256_$_t_uint256_$returns$__$", + "typeString": "function (address,address,address,uint256,uint256)" + } + }, + "id": 2747, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "3833:53:4", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 2748, + "nodeType": "EmitStatement", + "src": "3828:58:4" + }, + { + "expression": { + "arguments": [ + { + "id": 2752, + "name": "receiver", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2677, + "src": "3916:8:4", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 2753, + "name": "assets", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2682, + "src": "3926:6:4", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "id": 2749, + "name": "asset", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2475, + "src": "3897:5:4", + "typeDescriptions": { + "typeIdentifier": "t_contract$_ERC20_$31408", + "typeString": "contract ERC20" + } + }, + "id": 2751, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "safeTransfer", + "nodeType": "MemberAccess", + "referencedDeclaration": 32764, + "src": "3897:18:4", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_contract$_ERC20_$31408_$_t_address_$_t_uint256_$returns$__$bound_to$_t_contract$_ERC20_$31408_$", + "typeString": "function (contract ERC20,address,uint256)" + } + }, + "id": 2754, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "3897:36:4", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 2755, + "nodeType": "ExpressionStatement", + "src": "3897:36:4" + } + ] + }, + "functionSelector": "ba087652", + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "redeem", + "nameLocation": "3236:6:4", + "parameters": { + "id": 2680, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2675, + "mutability": "mutable", + "name": "shares", + "nameLocation": "3260:6:4", + "nodeType": "VariableDeclaration", + "scope": 2757, + "src": "3252:14:4", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2674, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "3252:7:4", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2677, + "mutability": "mutable", + "name": "receiver", + "nameLocation": "3284:8:4", + "nodeType": "VariableDeclaration", + "scope": 2757, + "src": "3276:16:4", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 2676, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "3276:7:4", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2679, + "mutability": "mutable", + "name": "owner", + "nameLocation": "3310:5:4", + "nodeType": "VariableDeclaration", + "scope": 2757, + "src": "3302:13:4", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 2678, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "3302:7:4", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "3242:79:4" + }, + "returnParameters": { + "id": 2683, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2682, + "mutability": "mutable", + "name": "assets", + "nameLocation": "3354:6:4", + "nodeType": "VariableDeclaration", + "scope": 2757, + "src": "3346:14:4", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2681, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "3346:7:4", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "3345:16:4" + }, + "scope": 2953, + "stateMutability": "nonpayable", + "virtual": true, + "visibility": "public" + }, + { + "id": 2762, + "nodeType": "FunctionDefinition", + "src": "4130:61:4", + "functionSelector": "01e1d114", + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "totalAssets", + "nameLocation": "4139:11:4", + "parameters": { + "id": 2758, + "nodeType": "ParameterList", + "parameters": [], + "src": "4150:2:4" + }, + "returnParameters": { + "id": 2761, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2760, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 2762, + "src": "4182:7:4", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2759, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "4182:7:4", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "4181:9:4" + }, + "scope": 2953, + "stateMutability": "view", + "virtual": true, + "visibility": "public" + }, + { + "id": 2786, + "nodeType": "FunctionDefinition", + "src": "4197:257:4", + "body": { + "id": 2785, + "nodeType": "Block", + "src": "4276:178:4", + "statements": [ + { + "assignments": [ + 2770 + ], + "declarations": [ + { + "constant": false, + "id": 2770, + "mutability": "mutable", + "name": "supply", + "nameLocation": "4294:6:4", + "nodeType": "VariableDeclaration", + "scope": 2785, + "src": "4286:14:4", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2769, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "4286:7:4", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "id": 2772, + "initialValue": { + "id": 2771, + "name": "totalSupply", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 31047, + "src": "4303:11:4", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "4286:28:4" + }, + { + "expression": { + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 2775, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 2773, + "name": "supply", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2770, + "src": "4384:6:4", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "hexValue": "30", + "id": 2774, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "4394:1:4", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "src": "4384:11:4", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseExpression": { + "arguments": [ + { + "id": 2779, + "name": "supply", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2770, + "src": "4425:6:4", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 2780, + "name": "totalAssets", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2762, + "src": "4433:11:4", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$__$returns$_t_uint256_$", + "typeString": "function () view returns (uint256)" + } + }, + "id": 2781, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "4433:13:4", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "id": 2777, + "name": "assets", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2764, + "src": "4407:6:4", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 2778, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "mulDivDown", + "nodeType": "MemberAccess", + "referencedDeclaration": 32285, + "src": "4407:17:4", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", + "typeString": "function (uint256,uint256,uint256) pure returns (uint256)" + } + }, + "id": 2782, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "4407:40:4", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 2783, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "Conditional", + "src": "4384:63:4", + "trueExpression": { + "id": 2776, + "name": "assets", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2764, + "src": "4398:6:4", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "functionReturnParameters": 2768, + "id": 2784, + "nodeType": "Return", + "src": "4377:70:4" + } + ] + }, + "functionSelector": "c6e6f592", + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "convertToShares", + "nameLocation": "4206:15:4", + "parameters": { + "id": 2765, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2764, + "mutability": "mutable", + "name": "assets", + "nameLocation": "4230:6:4", + "nodeType": "VariableDeclaration", + "scope": 2786, + "src": "4222:14:4", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2763, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "4222:7:4", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "4221:16:4" + }, + "returnParameters": { + "id": 2768, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2767, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 2786, + "src": "4267:7:4", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2766, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "4267:7:4", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "4266:9:4" + }, + "scope": 2953, + "stateMutability": "view", + "virtual": true, + "visibility": "public" + }, + { + "id": 2810, + "nodeType": "FunctionDefinition", + "src": "4460:257:4", + "body": { + "id": 2809, + "nodeType": "Block", + "src": "4539:178:4", + "statements": [ + { + "assignments": [ + 2794 + ], + "declarations": [ + { + "constant": false, + "id": 2794, + "mutability": "mutable", + "name": "supply", + "nameLocation": "4557:6:4", + "nodeType": "VariableDeclaration", + "scope": 2809, + "src": "4549:14:4", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2793, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "4549:7:4", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "id": 2796, + "initialValue": { + "id": 2795, + "name": "totalSupply", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 31047, + "src": "4566:11:4", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "4549:28:4" + }, + { + "expression": { + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 2799, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 2797, + "name": "supply", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2794, + "src": "4647:6:4", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "hexValue": "30", + "id": 2798, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "4657:1:4", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "src": "4647:11:4", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseExpression": { + "arguments": [ + { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 2803, + "name": "totalAssets", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2762, + "src": "4688:11:4", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$__$returns$_t_uint256_$", + "typeString": "function () view returns (uint256)" + } + }, + "id": 2804, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "4688:13:4", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 2805, + "name": "supply", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2794, + "src": "4703:6:4", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "id": 2801, + "name": "shares", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2788, + "src": "4670:6:4", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 2802, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "mulDivDown", + "nodeType": "MemberAccess", + "referencedDeclaration": 32285, + "src": "4670:17:4", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", + "typeString": "function (uint256,uint256,uint256) pure returns (uint256)" + } + }, + "id": 2806, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "4670:40:4", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 2807, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "Conditional", + "src": "4647:63:4", + "trueExpression": { + "id": 2800, + "name": "shares", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2788, + "src": "4661:6:4", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "functionReturnParameters": 2792, + "id": 2808, + "nodeType": "Return", + "src": "4640:70:4" + } + ] + }, + "functionSelector": "07a2d13a", + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "convertToAssets", + "nameLocation": "4469:15:4", + "parameters": { + "id": 2789, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2788, + "mutability": "mutable", + "name": "shares", + "nameLocation": "4493:6:4", + "nodeType": "VariableDeclaration", + "scope": 2810, + "src": "4485:14:4", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2787, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "4485:7:4", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "4484:16:4" + }, + "returnParameters": { + "id": 2792, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2791, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 2810, + "src": "4530:7:4", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2790, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "4530:7:4", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "4529:9:4" + }, + "scope": 2953, + "stateMutability": "view", + "virtual": true, + "visibility": "public" + }, + { + "id": 2822, + "nodeType": "FunctionDefinition", + "src": "4723:125:4", + "body": { + "id": 2821, + "nodeType": "Block", + "src": "4801:47:4", + "statements": [ + { + "expression": { + "arguments": [ + { + "id": 2818, + "name": "assets", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2812, + "src": "4834:6:4", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 2817, + "name": "convertToShares", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2786, + "src": "4818:15:4", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$_t_uint256_$returns$_t_uint256_$", + "typeString": "function (uint256) view returns (uint256)" + } + }, + "id": 2819, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "4818:23:4", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "functionReturnParameters": 2816, + "id": 2820, + "nodeType": "Return", + "src": "4811:30:4" + } + ] + }, + "functionSelector": "ef8b30f7", + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "previewDeposit", + "nameLocation": "4732:14:4", + "parameters": { + "id": 2813, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2812, + "mutability": "mutable", + "name": "assets", + "nameLocation": "4755:6:4", + "nodeType": "VariableDeclaration", + "scope": 2822, + "src": "4747:14:4", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2811, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "4747:7:4", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "4746:16:4" + }, + "returnParameters": { + "id": 2816, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2815, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 2822, + "src": "4792:7:4", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2814, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "4792:7:4", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "4791:9:4" + }, + "scope": 2953, + "stateMutability": "view", + "virtual": true, + "visibility": "public" + }, + { + "id": 2846, + "nodeType": "FunctionDefinition", + "src": "4854:251:4", + "body": { + "id": 2845, + "nodeType": "Block", + "src": "4929:176:4", + "statements": [ + { + "assignments": [ + 2830 + ], + "declarations": [ + { + "constant": false, + "id": 2830, + "mutability": "mutable", + "name": "supply", + "nameLocation": "4947:6:4", + "nodeType": "VariableDeclaration", + "scope": 2845, + "src": "4939:14:4", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2829, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "4939:7:4", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "id": 2832, + "initialValue": { + "id": 2831, + "name": "totalSupply", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 31047, + "src": "4956:11:4", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "4939:28:4" + }, + { + "expression": { + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 2835, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 2833, + "name": "supply", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2830, + "src": "5037:6:4", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "hexValue": "30", + "id": 2834, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "5047:1:4", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "src": "5037:11:4", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseExpression": { + "arguments": [ + { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 2839, + "name": "totalAssets", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2762, + "src": "5076:11:4", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$__$returns$_t_uint256_$", + "typeString": "function () view returns (uint256)" + } + }, + "id": 2840, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "5076:13:4", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 2841, + "name": "supply", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2830, + "src": "5091:6:4", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "id": 2837, + "name": "shares", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2824, + "src": "5060:6:4", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 2838, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "mulDivUp", + "nodeType": "MemberAccess", + "referencedDeclaration": 32298, + "src": "5060:15:4", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", + "typeString": "function (uint256,uint256,uint256) pure returns (uint256)" + } + }, + "id": 2842, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "5060:38:4", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 2843, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "Conditional", + "src": "5037:61:4", + "trueExpression": { + "id": 2836, + "name": "shares", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2824, + "src": "5051:6:4", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "functionReturnParameters": 2828, + "id": 2844, + "nodeType": "Return", + "src": "5030:68:4" + } + ] + }, + "functionSelector": "b3d7f6b9", + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "previewMint", + "nameLocation": "4863:11:4", + "parameters": { + "id": 2825, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2824, + "mutability": "mutable", + "name": "shares", + "nameLocation": "4883:6:4", + "nodeType": "VariableDeclaration", + "scope": 2846, + "src": "4875:14:4", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2823, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "4875:7:4", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "4874:16:4" + }, + "returnParameters": { + "id": 2828, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2827, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 2846, + "src": "4920:7:4", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2826, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "4920:7:4", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "4919:9:4" + }, + "scope": 2953, + "stateMutability": "view", + "virtual": true, + "visibility": "public" + }, + { + "id": 2870, + "nodeType": "FunctionDefinition", + "src": "5111:255:4", + "body": { + "id": 2869, + "nodeType": "Block", + "src": "5190:176:4", + "statements": [ + { + "assignments": [ + 2854 + ], + "declarations": [ + { + "constant": false, + "id": 2854, + "mutability": "mutable", + "name": "supply", + "nameLocation": "5208:6:4", + "nodeType": "VariableDeclaration", + "scope": 2869, + "src": "5200:14:4", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2853, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "5200:7:4", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "id": 2856, + "initialValue": { + "id": 2855, + "name": "totalSupply", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 31047, + "src": "5217:11:4", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "5200:28:4" + }, + { + "expression": { + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 2859, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 2857, + "name": "supply", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2854, + "src": "5298:6:4", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "hexValue": "30", + "id": 2858, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "5308:1:4", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "src": "5298:11:4", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseExpression": { + "arguments": [ + { + "id": 2863, + "name": "supply", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2854, + "src": "5337:6:4", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 2864, + "name": "totalAssets", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2762, + "src": "5345:11:4", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$__$returns$_t_uint256_$", + "typeString": "function () view returns (uint256)" + } + }, + "id": 2865, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "5345:13:4", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "id": 2861, + "name": "assets", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2848, + "src": "5321:6:4", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 2862, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "mulDivUp", + "nodeType": "MemberAccess", + "referencedDeclaration": 32298, + "src": "5321:15:4", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", + "typeString": "function (uint256,uint256,uint256) pure returns (uint256)" + } + }, + "id": 2866, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "5321:38:4", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 2867, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "Conditional", + "src": "5298:61:4", + "trueExpression": { + "id": 2860, + "name": "assets", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2848, + "src": "5312:6:4", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "functionReturnParameters": 2852, + "id": 2868, + "nodeType": "Return", + "src": "5291:68:4" + } + ] + }, + "functionSelector": "0a28a477", + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "previewWithdraw", + "nameLocation": "5120:15:4", + "parameters": { + "id": 2849, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2848, + "mutability": "mutable", + "name": "assets", + "nameLocation": "5144:6:4", + "nodeType": "VariableDeclaration", + "scope": 2870, + "src": "5136:14:4", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2847, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "5136:7:4", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "5135:16:4" + }, + "returnParameters": { + "id": 2852, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2851, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 2870, + "src": "5181:7:4", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2850, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "5181:7:4", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "5180:9:4" + }, + "scope": 2953, + "stateMutability": "view", + "virtual": true, + "visibility": "public" + }, + { + "id": 2882, + "nodeType": "FunctionDefinition", + "src": "5372:124:4", + "body": { + "id": 2881, + "nodeType": "Block", + "src": "5449:47:4", + "statements": [ + { + "expression": { + "arguments": [ + { + "id": 2878, + "name": "shares", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2872, + "src": "5482:6:4", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 2877, + "name": "convertToAssets", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2810, + "src": "5466:15:4", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$_t_uint256_$returns$_t_uint256_$", + "typeString": "function (uint256) view returns (uint256)" + } + }, + "id": 2879, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "5466:23:4", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "functionReturnParameters": 2876, + "id": 2880, + "nodeType": "Return", + "src": "5459:30:4" + } + ] + }, + "functionSelector": "4cdad506", + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "previewRedeem", + "nameLocation": "5381:13:4", + "parameters": { + "id": 2873, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2872, + "mutability": "mutable", + "name": "shares", + "nameLocation": "5403:6:4", + "nodeType": "VariableDeclaration", + "scope": 2882, + "src": "5395:14:4", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2871, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "5395:7:4", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "5394:16:4" + }, + "returnParameters": { + "id": 2876, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2875, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 2882, + "src": "5440:7:4", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2874, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "5440:7:4", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "5439:9:4" + }, + "scope": 2953, + "stateMutability": "view", + "virtual": true, + "visibility": "public" + }, + { + "id": 2896, + "nodeType": "FunctionDefinition", + "src": "5693:108:4", + "body": { + "id": 2895, + "nodeType": "Block", + "src": "5760:41:4", + "statements": [ + { + "expression": { + "expression": { + "arguments": [ + { + "id": 2891, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "5782:7:4", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint256_$", + "typeString": "type(uint256)" + }, + "typeName": { + "id": 2890, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "5782:7:4", + "typeDescriptions": {} + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_type$_t_uint256_$", + "typeString": "type(uint256)" + } + ], + "id": 2889, + "name": "type", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -27, + "src": "5777:4:4", + "typeDescriptions": { + "typeIdentifier": "t_function_metatype_pure$__$returns$__$", + "typeString": "function () pure" + } + }, + "id": 2892, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "5777:13:4", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_magic_meta_type_t_uint256", + "typeString": "type(uint256)" + } + }, + "id": 2893, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "max", + "nodeType": "MemberAccess", + "src": "5777:17:4", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "functionReturnParameters": 2888, + "id": 2894, + "nodeType": "Return", + "src": "5770:24:4" + } + ] + }, + "functionSelector": "402d267d", + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "maxDeposit", + "nameLocation": "5702:10:4", + "parameters": { + "id": 2885, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2884, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 2896, + "src": "5713:7:4", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 2883, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "5713:7:4", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "5712:9:4" + }, + "returnParameters": { + "id": 2888, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2887, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 2896, + "src": "5751:7:4", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2886, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "5751:7:4", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "5750:9:4" + }, + "scope": 2953, + "stateMutability": "view", + "virtual": true, + "visibility": "public" + }, + { + "id": 2910, + "nodeType": "FunctionDefinition", + "src": "5807:105:4", + "body": { + "id": 2909, + "nodeType": "Block", + "src": "5871:41:4", + "statements": [ + { + "expression": { + "expression": { + "arguments": [ + { + "id": 2905, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "5893:7:4", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint256_$", + "typeString": "type(uint256)" + }, + "typeName": { + "id": 2904, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "5893:7:4", + "typeDescriptions": {} + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_type$_t_uint256_$", + "typeString": "type(uint256)" + } + ], + "id": 2903, + "name": "type", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -27, + "src": "5888:4:4", + "typeDescriptions": { + "typeIdentifier": "t_function_metatype_pure$__$returns$__$", + "typeString": "function () pure" + } + }, + "id": 2906, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "5888:13:4", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_magic_meta_type_t_uint256", + "typeString": "type(uint256)" + } + }, + "id": 2907, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "max", + "nodeType": "MemberAccess", + "src": "5888:17:4", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "functionReturnParameters": 2902, + "id": 2908, + "nodeType": "Return", + "src": "5881:24:4" + } + ] + }, + "functionSelector": "c63d75b6", + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "maxMint", + "nameLocation": "5816:7:4", + "parameters": { + "id": 2899, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2898, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 2910, + "src": "5824:7:4", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 2897, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "5824:7:4", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "5823:9:4" + }, + "returnParameters": { + "id": 2902, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2901, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 2910, + "src": "5862:7:4", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2900, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "5862:7:4", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "5861:9:4" + }, + "scope": 2953, + "stateMutability": "view", + "virtual": true, + "visibility": "public" + }, + { + "id": 2924, + "nodeType": "FunctionDefinition", + "src": "5918:131:4", + "body": { + "id": 2923, + "nodeType": "Block", + "src": "5992:57:4", + "statements": [ + { + "expression": { + "arguments": [ + { + "baseExpression": { + "id": 2918, + "name": "balanceOf", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 31051, + "src": "6025:9:4", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$", + "typeString": "mapping(address => uint256)" + } + }, + "id": 2920, + "indexExpression": { + "id": 2919, + "name": "owner", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2912, + "src": "6035:5:4", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "6025:16:4", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 2917, + "name": "convertToAssets", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2810, + "src": "6009:15:4", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$_t_uint256_$returns$_t_uint256_$", + "typeString": "function (uint256) view returns (uint256)" + } + }, + "id": 2921, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "6009:33:4", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "functionReturnParameters": 2916, + "id": 2922, + "nodeType": "Return", + "src": "6002:40:4" + } + ] + }, + "functionSelector": "ce96cb77", + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "maxWithdraw", + "nameLocation": "5927:11:4", + "parameters": { + "id": 2913, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2912, + "mutability": "mutable", + "name": "owner", + "nameLocation": "5947:5:4", + "nodeType": "VariableDeclaration", + "scope": 2924, + "src": "5939:13:4", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 2911, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "5939:7:4", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "5938:15:4" + }, + "returnParameters": { + "id": 2916, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2915, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 2924, + "src": "5983:7:4", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2914, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "5983:7:4", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "5982:9:4" + }, + "scope": 2953, + "stateMutability": "view", + "virtual": true, + "visibility": "public" + }, + { + "id": 2936, + "nodeType": "FunctionDefinition", + "src": "6055:112:4", + "body": { + "id": 2935, + "nodeType": "Block", + "src": "6127:40:4", + "statements": [ + { + "expression": { + "baseExpression": { + "id": 2931, + "name": "balanceOf", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 31051, + "src": "6144:9:4", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$", + "typeString": "mapping(address => uint256)" + } + }, + "id": 2933, + "indexExpression": { + "id": 2932, + "name": "owner", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2926, + "src": "6154:5:4", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "6144:16:4", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "functionReturnParameters": 2930, + "id": 2934, + "nodeType": "Return", + "src": "6137:23:4" + } + ] + }, + "functionSelector": "d905777e", + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "maxRedeem", + "nameLocation": "6064:9:4", + "parameters": { + "id": 2927, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2926, + "mutability": "mutable", + "name": "owner", + "nameLocation": "6082:5:4", + "nodeType": "VariableDeclaration", + "scope": 2936, + "src": "6074:13:4", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 2925, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "6074:7:4", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "6073:15:4" + }, + "returnParameters": { + "id": 2930, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2929, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 2936, + "src": "6118:7:4", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2928, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "6118:7:4", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "6117:9:4" + }, + "scope": 2953, + "stateMutability": "view", + "virtual": true, + "visibility": "public" + }, + { + "id": 2944, + "nodeType": "FunctionDefinition", + "src": "6359:75:4", + "body": { + "id": 2943, + "nodeType": "Block", + "src": "6432:2:4", + "statements": [] + }, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "beforeWithdraw", + "nameLocation": "6368:14:4", + "parameters": { + "id": 2941, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2938, + "mutability": "mutable", + "name": "assets", + "nameLocation": "6391:6:4", + "nodeType": "VariableDeclaration", + "scope": 2944, + "src": "6383:14:4", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2937, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "6383:7:4", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2940, + "mutability": "mutable", + "name": "shares", + "nameLocation": "6407:6:4", + "nodeType": "VariableDeclaration", + "scope": 2944, + "src": "6399:14:4", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2939, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "6399:7:4", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "6382:32:4" + }, + "returnParameters": { + "id": 2942, + "nodeType": "ParameterList", + "parameters": [], + "src": "6432:0:4" + }, + "scope": 2953, + "stateMutability": "nonpayable", + "virtual": true, + "visibility": "internal" + }, + { + "id": 2952, + "nodeType": "FunctionDefinition", + "src": "6440:73:4", + "body": { + "id": 2951, + "nodeType": "Block", + "src": "6511:2:4", + "statements": [] + }, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "afterDeposit", + "nameLocation": "6449:12:4", + "parameters": { + "id": 2949, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2946, + "mutability": "mutable", + "name": "assets", + "nameLocation": "6470:6:4", + "nodeType": "VariableDeclaration", + "scope": 2952, + "src": "6462:14:4", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2945, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "6462:7:4", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2948, + "mutability": "mutable", + "name": "shares", + "nameLocation": "6486:6:4", + "nodeType": "VariableDeclaration", + "scope": 2952, + "src": "6478:14:4", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2947, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "6478:7:4", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "6461:32:4" + }, + "returnParameters": { + "id": 2950, + "nodeType": "ParameterList", + "parameters": [], + "src": "6511:0:4" + }, + "scope": 2953, + "stateMutability": "nonpayable", + "virtual": true, + "visibility": "internal" + } + ], + "abstract": true, + "baseContracts": [ + { + "baseName": { + "id": 2442, + "name": "ERC20", + "nodeType": "IdentifierPath", + "referencedDeclaration": 31408, + "src": "424:5:4" + }, + "id": 2443, + "nodeType": "InheritanceSpecifier", + "src": "424:5:4" + } + ], + "canonicalName": "ERC4626", + "contractDependencies": [], + "contractKind": "contract", + "documentation": { + "id": 2441, + "nodeType": "StructuredDocumentation", + "src": "240:155:4", + "text": "@notice Minimal ERC4626 tokenized Vault implementation.\n @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/mixins/ERC4626.sol)" + }, + "fullyImplemented": false, + "linearizedBaseContracts": [ + 2953, + 31408 + ], + "name": "ERC4626", + "nameLocation": "413:7:4", + "scope": 2954, + "usedErrors": [] + } + ], + "license": "AGPL-3.0-only" +} diff --git a/ethers-solc/test-data/library-remapping-in-2.json b/ethers-solc/test-data/library-remapping-in-2.json new file mode 100644 index 0000000000..39a83e2c38 --- /dev/null +++ b/ethers-solc/test-data/library-remapping-in-2.json @@ -0,0 +1,43 @@ +{ + "language": "Solidity", + "sources": { + "/private/var/folders/l5/lprhf87s6xv8djgd017f0b2h0000gn/T/can_create_on_goerli-0vd5EOs/lib/remapping/MyLib.sol": { + "content": "\n// SPDX-License-Identifier: MIT\nlibrary MyLib {\n function foobar(uint256 a) public view returns (uint256) {\n \treturn a * 100;\n }\n}\n" + }, + "/private/var/folders/l5/lprhf87s6xv8djgd017f0b2h0000gn/T/can_create_on_goerli-0vd5EOs/src/LinkTest.sol": { + "content": "\n// SPDX-License-Identifier: MIT\nimport \"remapping/MyLib.sol\";\ncontract LinkTest {\n function foo() public returns (uint256) {\n return MyLib.foobar(1);\n }\n}\n" + } + }, + "settings": { + "remappings": [ + "remapping/=/private/var/folders/l5/lprhf87s6xv8djgd017f0b2h0000gn/T/can_create_on_goerli-0vd5EOs/lib/remapping/", + "src/=/private/var/folders/l5/lprhf87s6xv8djgd017f0b2h0000gn/T/can_create_on_goerli-0vd5EOs/src/" + ], + "optimizer": { + "enabled": true, + "runs": 200 + }, + "metadata": { + "bytecodeHash": "ipfs" + }, + "outputSelection": { + "*": { + "": [ + "ast" + ], + "*": [ + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers" + ] + } + }, + "evmVersion": "london", + "libraries": { + "/private/var/folders/l5/lprhf87s6xv8djgd017f0b2h0000gn/T/can_create_on_goerli-0vd5EOs/lib/remapping/MyLib.sol": { + "MyLib": "0x0000000000000000000000000000000000000000" + } + } + } +} \ No newline at end of file diff --git a/ethers-solc/test-data/library-remapping-in.json b/ethers-solc/test-data/library-remapping-in.json new file mode 100644 index 0000000000..63163d7f83 --- /dev/null +++ b/ethers-solc/test-data/library-remapping-in.json @@ -0,0 +1,39 @@ +{ + "language": "Solidity", + "sources": { + "/private/var/folders/l5/lprhf87s6xv8djgd017f0b2h0000gn/T/tmp_dappPyXsdD/lib/remapping/MyLib.sol": { + "content": "\n// SPDX-License-Identifier: MIT\nlibrary MyLib {\n function foobar(uint256 a) public view returns (uint256) {\n \treturn a * 100;\n }\n}\n" + }, + "/private/var/folders/l5/lprhf87s6xv8djgd017f0b2h0000gn/T/tmp_dappPyXsdD/src/LinkTest.sol": { + "content": "\n// SPDX-License-Identifier: MIT\nimport \"remapping/MyLib.sol\";\ncontract LinkTest {\n function foo() public returns (uint256) {\n return MyLib.foobar(1);\n }\n}\n" + } + }, + "settings": { + "remappings": [ + "remapping/=/private/var/folders/l5/lprhf87s6xv8djgd017f0b2h0000gn/T/tmp_dappPyXsdD/lib/remapping/" + ], + "optimizer": { + "enabled": false, + "runs": 200 + }, + "outputSelection": { + "*": { + "": [ + "ast" + ], + "*": [ + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers" + ] + } + }, + "evmVersion": "london", + "libraries": { + "/private/var/folders/l5/lprhf87s6xv8djgd017f0b2h0000gn/T/tmp_dappPyXsdD/lib/remapping/MyLib.sol": { + "MyLib": "0x0000000000000000000000000000000000000000" + } + } + } +} \ No newline at end of file diff --git a/ethers-solc/test-data/model-checker-sample/Assert.sol b/ethers-solc/test-data/model-checker-sample/Assert.sol new file mode 100644 index 0000000000..4d6656e05f --- /dev/null +++ b/ethers-solc/test-data/model-checker-sample/Assert.sol @@ -0,0 +1,5 @@ +contract Assert { + function f(uint x) public pure { + assert(x > 0); + } +} diff --git a/ethers-solc/test-data/out/compiler-out-17.json b/ethers-solc/test-data/out/compiler-out-17.json new file mode 100644 index 0000000000..eb37fabc0c --- /dev/null +++ b/ethers-solc/test-data/out/compiler-out-17.json @@ -0,0 +1,56266 @@ +{ + "contracts": { + "src/Contract.sol": { + "BasicToken": { + "abi": [ + { + "constant": true, + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "", + "type": "address" + } + ], + "name": "balances", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "maximumFee", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "_totalSupply", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "_owner", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "name": "balance", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "owner", + "outputs": [ + { + "name": "", + "type": "address" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_to", + "type": "address" + }, + { + "name": "_value", + "type": "uint256" + } + ], + "name": "transfer", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "basisPointsRate", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "from", + "type": "address" + }, + { + "indexed": true, + "name": "to", + "type": "address" + }, + { + "indexed": false, + "name": "value", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + } + ], + "devdoc": { + "methods": { + "balanceOf(address)": { + "details": "Gets the balance of the specified address.", + "params": { + "_owner": "The address to query the the balance of." + }, + "return": "An uint representing the amount owned by the passed address." + }, + "transfer(address,uint256)": { + "details": "transfer token for a specified address", + "params": { + "_to": "The address to transfer to.", + "_value": "The amount to be transferred." + } + }, + "transferOwnership(address)": { + "details": "Allows the current owner to transfer control of the contract to a newOwner.", + "params": { + "newOwner": "The address to transfer ownership to." + } + } + }, + "title": "Basic token" + }, + "evm": { + "assembly": "", + "bytecode": { + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "deployedBytecode": { + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "gasEstimates": null, + "legacyAssembly": null, + "methodIdentifiers": { + "_totalSupply()": "3eaaf86b", + "balanceOf(address)": "70a08231", + "balances(address)": "27e235e3", + "basisPointsRate()": "dd644f72", + "maximumFee()": "35390714", + "owner()": "8da5cb5b", + "totalSupply()": "18160ddd", + "transfer(address,uint256)": "a9059cbb", + "transferOwnership(address)": "f2fde38b" + } + }, + "metadata": "", + "userdoc": { + "methods": {} + } + }, + "BlackList": { + "abi": [ + { + "constant": false, + "inputs": [ + { + "name": "_evilUser", + "type": "address" + } + ], + "name": "addBlackList", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "", + "type": "address" + } + ], + "name": "balances", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "maximumFee", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "_totalSupply", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "_maker", + "type": "address" + } + ], + "name": "getBlackListStatus", + "outputs": [ + { + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "_owner", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "name": "balance", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "getOwner", + "outputs": [ + { + "name": "", + "type": "address" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "owner", + "outputs": [ + { + "name": "", + "type": "address" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_to", + "type": "address" + }, + { + "name": "_value", + "type": "uint256" + } + ], + "name": "transfer", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "basisPointsRate", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "", + "type": "address" + } + ], + "name": "isBlackListed", + "outputs": [ + { + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_clearedUser", + "type": "address" + } + ], + "name": "removeBlackList", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_blackListedUser", + "type": "address" + } + ], + "name": "destroyBlackFunds", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "name": "_blackListedUser", + "type": "address" + }, + { + "indexed": false, + "name": "_balance", + "type": "uint256" + } + ], + "name": "DestroyedBlackFunds", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "name": "_user", + "type": "address" + } + ], + "name": "AddedBlackList", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "name": "_user", + "type": "address" + } + ], + "name": "RemovedBlackList", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "from", + "type": "address" + }, + { + "indexed": true, + "name": "to", + "type": "address" + }, + { + "indexed": false, + "name": "value", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + } + ], + "devdoc": { + "methods": { + "balanceOf(address)": { + "details": "Gets the balance of the specified address.", + "params": { + "_owner": "The address to query the the balance of." + }, + "return": "An uint representing the amount owned by the passed address." + }, + "transfer(address,uint256)": { + "details": "transfer token for a specified address", + "params": { + "_to": "The address to transfer to.", + "_value": "The amount to be transferred." + } + }, + "transferOwnership(address)": { + "details": "Allows the current owner to transfer control of the contract to a newOwner.", + "params": { + "newOwner": "The address to transfer ownership to." + } + } + } + }, + "evm": { + "assembly": "", + "bytecode": { + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "deployedBytecode": { + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "gasEstimates": null, + "legacyAssembly": null, + "methodIdentifiers": { + "_totalSupply()": "3eaaf86b", + "addBlackList(address)": "0ecb93c0", + "balanceOf(address)": "70a08231", + "balances(address)": "27e235e3", + "basisPointsRate()": "dd644f72", + "destroyBlackFunds(address)": "f3bdc228", + "getBlackListStatus(address)": "59bf1abe", + "getOwner()": "893d20e8", + "isBlackListed(address)": "e47d6060", + "maximumFee()": "35390714", + "owner()": "8da5cb5b", + "removeBlackList(address)": "e4997dc5", + "totalSupply()": "18160ddd", + "transfer(address,uint256)": "a9059cbb", + "transferOwnership(address)": "f2fde38b" + } + }, + "metadata": "", + "userdoc": { + "methods": { + "getBlackListStatus(address)": { + "notice": "//// Getters to allow the same blacklist to be used also by other contracts (including upgraded Tether) ///////" + } + } + } + }, + "ERC20": { + "abi": [ + { + "constant": false, + "inputs": [ + { + "name": "spender", + "type": "address" + }, + { + "name": "value", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "from", + "type": "address" + }, + { + "name": "to", + "type": "address" + }, + { + "name": "value", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "_totalSupply", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "who", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "to", + "type": "address" + }, + { + "name": "value", + "type": "uint256" + } + ], + "name": "transfer", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "owner", + "type": "address" + }, + { + "name": "spender", + "type": "address" + } + ], + "name": "allowance", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "name": "spender", + "type": "address" + }, + { + "indexed": false, + "name": "value", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "from", + "type": "address" + }, + { + "indexed": true, + "name": "to", + "type": "address" + }, + { + "indexed": false, + "name": "value", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + } + ], + "devdoc": { + "methods": {}, + "title": "ERC20 interface" + }, + "evm": { + "assembly": "", + "bytecode": { + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "deployedBytecode": { + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "gasEstimates": null, + "legacyAssembly": null, + "methodIdentifiers": { + "_totalSupply()": "3eaaf86b", + "allowance(address,address)": "dd62ed3e", + "approve(address,uint256)": "095ea7b3", + "balanceOf(address)": "70a08231", + "totalSupply()": "18160ddd", + "transfer(address,uint256)": "a9059cbb", + "transferFrom(address,address,uint256)": "23b872dd" + } + }, + "metadata": "", + "userdoc": { + "methods": {} + } + }, + "ERC20Basic": { + "abi": [ + { + "constant": true, + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "_totalSupply", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "who", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "to", + "type": "address" + }, + { + "name": "value", + "type": "uint256" + } + ], + "name": "transfer", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "from", + "type": "address" + }, + { + "indexed": true, + "name": "to", + "type": "address" + }, + { + "indexed": false, + "name": "value", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + } + ], + "devdoc": { + "methods": {}, + "title": "ERC20Basic" + }, + "evm": { + "assembly": "", + "bytecode": { + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "deployedBytecode": { + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "gasEstimates": null, + "legacyAssembly": null, + "methodIdentifiers": { + "_totalSupply()": "3eaaf86b", + "balanceOf(address)": "70a08231", + "totalSupply()": "18160ddd", + "transfer(address,uint256)": "a9059cbb" + } + }, + "metadata": "", + "userdoc": { + "methods": {} + } + }, + "Ownable": { + "abi": [ + { + "constant": true, + "inputs": [], + "name": "owner", + "outputs": [ + { + "name": "", + "type": "address" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "constructor" + } + ], + "devdoc": { + "methods": { + "transferOwnership(address)": { + "details": "Allows the current owner to transfer control of the contract to a newOwner.", + "params": { + "newOwner": "The address to transfer ownership to." + } + } + }, + "title": "Ownable" + }, + "evm": { + "assembly": " /* \"src/Contract.sol\":1165:1888 contract Ownable {... */\n mstore(0x40, 0x60)\n /* \"src/Contract.sol\":1342:1403 function Ownable() public {... */\n jumpi(tag_1, iszero(callvalue))\n 0x0\n dup1\n revert\ntag_1:\n /* \"src/Contract.sol\":1378:1383 owner */\n 0x0\n /* \"src/Contract.sol\":1378:1396 owner = msg.sender */\n dup1\n sload\n sub(exp(0x2, 0xa0), 0x1)\n /* \"src/Contract.sol\":1386:1396 msg.sender */\n caller\n /* \"src/Contract.sol\":1378:1396 owner = msg.sender */\n and\n not(sub(exp(0x2, 0xa0), 0x1))\n swap1\n swap2\n and\n or\n swap1\n sstore\n /* \"src/Contract.sol\":1165:1888 contract Ownable {... */\n dataSize(sub_0)\n dup1\n dataOffset(sub_0)\n 0x0\n codecopy\n 0x0\n return\nstop\n\nsub_0: assembly {\n /* \"src/Contract.sol\":1165:1888 contract Ownable {... */\n mstore(0x40, 0x60)\n jumpi(tag_1, lt(calldatasize, 0x4))\n and(div(calldataload(0x0), 0x100000000000000000000000000000000000000000000000000000000), 0xffffffff)\n 0x8da5cb5b\n dup2\n eq\n tag_2\n jumpi\n dup1\n 0xf2fde38b\n eq\n tag_3\n jumpi\n tag_1:\n 0x0\n dup1\n revert\n /* \"src/Contract.sol\":1188:1208 address public owner */\n tag_2:\n jumpi(tag_4, iszero(callvalue))\n 0x0\n dup1\n revert\n tag_4:\n tag_5\n jump(tag_6)\n tag_5:\n mload(0x40)\n 0xffffffffffffffffffffffffffffffffffffffff\n swap1\n swap2\n and\n dup2\n mstore\n 0x20\n add\n mload(0x40)\n dup1\n swap2\n sub\n swap1\n return\n /* \"src/Contract.sol\":1738:1885 function transferOwnership(address newOwner) public onlyOwner {... */\n tag_3:\n jumpi(tag_7, iszero(callvalue))\n 0x0\n dup1\n revert\n tag_7:\n tag_8\n and(calldataload(0x4), 0xffffffffffffffffffffffffffffffffffffffff)\n jump(tag_9)\n tag_8:\n stop\n /* \"src/Contract.sol\":1188:1208 address public owner */\n tag_6:\n and(0xffffffffffffffffffffffffffffffffffffffff, sload(0x0))\n dup2\n jump\t// out\n /* \"src/Contract.sol\":1738:1885 function transferOwnership(address newOwner) public onlyOwner {... */\n tag_9:\n /* \"src/Contract.sol\":1546:1551 owner */\n sload(0x0)\n /* \"src/Contract.sol\":1532:1542 msg.sender */\n caller\n /* \"src/Contract.sol\":1546:1551 owner */\n 0xffffffffffffffffffffffffffffffffffffffff\n /* \"src/Contract.sol\":1532:1551 msg.sender == owner */\n swap1\n dup2\n and\n /* \"src/Contract.sol\":1546:1551 owner */\n swap2\n and\n /* \"src/Contract.sol\":1532:1551 msg.sender == owner */\n eq\n /* \"src/Contract.sol\":1524:1552 require(msg.sender == owner) */\n tag_11\n jumpi\n 0x0\n dup1\n revert\n tag_11:\n /* \"src/Contract.sol\":1814:1836 newOwner != address(0) */\n 0xffffffffffffffffffffffffffffffffffffffff\n dup2\n and\n iszero\n /* \"src/Contract.sol\":1810:1879 if (newOwner != address(0)) {... */\n tag_13\n jumpi\n /* \"src/Contract.sol\":1852:1857 owner */\n 0x0\n /* \"src/Contract.sol\":1852:1868 owner = newOwner */\n dup1\n sload\n 0xffffffffffffffffffffffff0000000000000000000000000000000000000000\n and\n 0xffffffffffffffffffffffffffffffffffffffff\n dup4\n and\n or\n swap1\n sstore\n /* \"src/Contract.sol\":1810:1879 if (newOwner != address(0)) {... */\n tag_13:\n /* \"src/Contract.sol\":1738:1885 function transferOwnership(address newOwner) public onlyOwner {... */\n pop\n jump\t// out\n\n auxdata: 0xa165627a7a72305820c6a93faac9eead78138000d369532624c4f3bbf41fe0af8c23367a32bb2196030029\n}\n", + "bytecode": { + "linkReferences": {}, + "object": "6060604052341561000f57600080fd5b60008054600160a060020a033316600160a060020a031990911617905561018a8061003b6000396000f30060606040526004361061004b5763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416638da5cb5b8114610050578063f2fde38b1461008c575b600080fd5b341561005b57600080fd5b6100636100ba565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b341561009757600080fd5b6100b873ffffffffffffffffffffffffffffffffffffffff600435166100d6565b005b60005473ffffffffffffffffffffffffffffffffffffffff1681565b6000543373ffffffffffffffffffffffffffffffffffffffff9081169116146100fe57600080fd5b73ffffffffffffffffffffffffffffffffffffffff81161561015b57600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83161790555b505600a165627a7a72305820c6a93faac9eead78138000d369532624c4f3bbf41fe0af8c23367a32bb2196030029", + "opcodes": "PUSH1 0x60 PUSH1 0x40 MSTORE CALLVALUE ISZERO PUSH2 0xF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB CALLER AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB NOT SWAP1 SWAP2 AND OR SWAP1 SSTORE PUSH2 0x18A DUP1 PUSH2 0x3B PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN STOP PUSH1 0x60 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x4B JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x8DA5CB5B DUP2 EQ PUSH2 0x50 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x8C JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE ISZERO PUSH2 0x5B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x63 PUSH2 0xBA JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE ISZERO PUSH2 0x97 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xB8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0xD6 JUMP JUMPDEST STOP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 SLOAD CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 DUP2 AND SWAP2 AND EQ PUSH2 0xFE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x15B JUMPI PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND OR SWAP1 SSTORE JUMPDEST POP JUMP STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 0xc6 0xa9 0x3f 0xaa 0xc9 0xee 0xad PUSH25 0x138000D369532624C4F3BBF41FE0AF8C23367A32BB21960300 0x29 ", + "sourceMap": "1165:723:0:-;;;1342:61;;;;;;;;1378:5;:18;;-1:-1:-1;;;;;1386:10:0;1378:18;-1:-1:-1;;;;;;1378:18:0;;;;;;1165:723;;;;;;" + }, + "deployedBytecode": { + "linkReferences": {}, + "object": "60606040526004361061004b5763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416638da5cb5b8114610050578063f2fde38b1461008c575b600080fd5b341561005b57600080fd5b6100636100ba565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b341561009757600080fd5b6100b873ffffffffffffffffffffffffffffffffffffffff600435166100d6565b005b60005473ffffffffffffffffffffffffffffffffffffffff1681565b6000543373ffffffffffffffffffffffffffffffffffffffff9081169116146100fe57600080fd5b73ffffffffffffffffffffffffffffffffffffffff81161561015b57600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83161790555b505600a165627a7a72305820c6a93faac9eead78138000d369532624c4f3bbf41fe0af8c23367a32bb2196030029", + "opcodes": "PUSH1 0x60 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x4B JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x8DA5CB5B DUP2 EQ PUSH2 0x50 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x8C JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE ISZERO PUSH2 0x5B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x63 PUSH2 0xBA JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE ISZERO PUSH2 0x97 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xB8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0xD6 JUMP JUMPDEST STOP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 SLOAD CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 DUP2 AND SWAP2 AND EQ PUSH2 0xFE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x15B JUMPI PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND OR SWAP1 SSTORE JUMPDEST POP JUMP STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 0xc6 0xa9 0x3f 0xaa 0xc9 0xee 0xad PUSH25 0x138000D369532624C4F3BBF41FE0AF8C23367A32BB21960300 0x29 ", + "sourceMap": "1165:723:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;1188:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1738:147;;;;;;;;;;;;;;;;;;1188:20;;;;;;:::o;1738:147::-;1546:5;;1532:10;1546:5;1532:19;;;1546:5;;1532:19;1524:28;;;;;;1814:22;;;;1810:69;;1852:5;:16;;;;;;;;;;1810:69;1738:147;:::o" + }, + "gasEstimates": { + "creation": { + "codeDepositCost": "78800", + "executionCost": "20497", + "totalCost": "99297" + }, + "external": { + "owner()": "388", + "transferOwnership(address)": "20654" + } + }, + "legacyAssembly": { + ".code": [ + { + "begin": 1165, + "end": 1888, + "name": "PUSH", + "value": "60" + }, + { + "begin": 1165, + "end": 1888, + "name": "PUSH", + "value": "40" + }, + { + "begin": 1165, + "end": 1888, + "name": "MSTORE" + }, + { + "begin": 1342, + "end": 1403, + "name": "CALLVALUE" + }, + { + "begin": 1342, + "end": 1403, + "name": "ISZERO" + }, + { + "begin": 1342, + "end": 1403, + "name": "PUSH [tag]", + "value": "1" + }, + { + "begin": 1342, + "end": 1403, + "name": "JUMPI" + }, + { + "begin": 1342, + "end": 1403, + "name": "PUSH", + "value": "0" + }, + { + "begin": 1342, + "end": 1403, + "name": "DUP1" + }, + { + "begin": 1342, + "end": 1403, + "name": "REVERT" + }, + { + "begin": 1342, + "end": 1403, + "name": "tag", + "value": "1" + }, + { + "begin": 1342, + "end": 1403, + "name": "JUMPDEST" + }, + { + "begin": 1378, + "end": 1383, + "name": "PUSH", + "value": "0" + }, + { + "begin": 1378, + "end": 1396, + "name": "DUP1" + }, + { + "begin": 1378, + "end": 1396, + "name": "SLOAD" + }, + { + "begin": -1, + "end": -1, + "name": "PUSH", + "value": "1" + }, + { + "begin": -1, + "end": -1, + "name": "PUSH", + "value": "A0" + }, + { + "begin": -1, + "end": -1, + "name": "PUSH", + "value": "2" + }, + { + "begin": -1, + "end": -1, + "name": "EXP" + }, + { + "begin": -1, + "end": -1, + "name": "SUB" + }, + { + "begin": 1386, + "end": 1396, + "name": "CALLER" + }, + { + "begin": 1378, + "end": 1396, + "name": "AND" + }, + { + "begin": -1, + "end": -1, + "name": "PUSH", + "value": "1" + }, + { + "begin": -1, + "end": -1, + "name": "PUSH", + "value": "A0" + }, + { + "begin": -1, + "end": -1, + "name": "PUSH", + "value": "2" + }, + { + "begin": -1, + "end": -1, + "name": "EXP" + }, + { + "begin": -1, + "end": -1, + "name": "SUB" + }, + { + "begin": -1, + "end": -1, + "name": "NOT" + }, + { + "begin": 1378, + "end": 1396, + "name": "SWAP1" + }, + { + "begin": 1378, + "end": 1396, + "name": "SWAP2" + }, + { + "begin": 1378, + "end": 1396, + "name": "AND" + }, + { + "begin": 1378, + "end": 1396, + "name": "OR" + }, + { + "begin": 1378, + "end": 1396, + "name": "SWAP1" + }, + { + "begin": 1378, + "end": 1396, + "name": "SSTORE" + }, + { + "begin": 1165, + "end": 1888, + "name": "PUSH #[$]", + "value": "0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "begin": 1165, + "end": 1888, + "name": "DUP1" + }, + { + "begin": 1165, + "end": 1888, + "name": "PUSH [$]", + "value": "0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "begin": 1165, + "end": 1888, + "name": "PUSH", + "value": "0" + }, + { + "begin": 1165, + "end": 1888, + "name": "CODECOPY" + }, + { + "begin": 1165, + "end": 1888, + "name": "PUSH", + "value": "0" + }, + { + "begin": 1165, + "end": 1888, + "name": "RETURN" + } + ], + ".data": { + "0": { + ".auxdata": "a165627a7a72305820c6a93faac9eead78138000d369532624c4f3bbf41fe0af8c23367a32bb2196030029", + ".code": [ + { + "begin": 1165, + "end": 1888, + "name": "PUSH", + "value": "60" + }, + { + "begin": 1165, + "end": 1888, + "name": "PUSH", + "value": "40" + }, + { + "begin": 1165, + "end": 1888, + "name": "MSTORE" + }, + { + "begin": 1165, + "end": 1888, + "name": "PUSH", + "value": "4" + }, + { + "begin": 1165, + "end": 1888, + "name": "CALLDATASIZE" + }, + { + "begin": 1165, + "end": 1888, + "name": "LT" + }, + { + "begin": 1165, + "end": 1888, + "name": "PUSH [tag]", + "value": "1" + }, + { + "begin": 1165, + "end": 1888, + "name": "JUMPI" + }, + { + "begin": 1165, + "end": 1888, + "name": "PUSH", + "value": "FFFFFFFF" + }, + { + "begin": 1165, + "end": 1888, + "name": "PUSH", + "value": "100000000000000000000000000000000000000000000000000000000" + }, + { + "begin": 1165, + "end": 1888, + "name": "PUSH", + "value": "0" + }, + { + "begin": 1165, + "end": 1888, + "name": "CALLDATALOAD" + }, + { + "begin": 1165, + "end": 1888, + "name": "DIV" + }, + { + "begin": 1165, + "end": 1888, + "name": "AND" + }, + { + "begin": 1165, + "end": 1888, + "name": "PUSH", + "value": "8DA5CB5B" + }, + { + "begin": 1165, + "end": 1888, + "name": "DUP2" + }, + { + "begin": 1165, + "end": 1888, + "name": "EQ" + }, + { + "begin": 1165, + "end": 1888, + "name": "PUSH [tag]", + "value": "2" + }, + { + "begin": 1165, + "end": 1888, + "name": "JUMPI" + }, + { + "begin": 1165, + "end": 1888, + "name": "DUP1" + }, + { + "begin": 1165, + "end": 1888, + "name": "PUSH", + "value": "F2FDE38B" + }, + { + "begin": 1165, + "end": 1888, + "name": "EQ" + }, + { + "begin": 1165, + "end": 1888, + "name": "PUSH [tag]", + "value": "3" + }, + { + "begin": 1165, + "end": 1888, + "name": "JUMPI" + }, + { + "begin": 1165, + "end": 1888, + "name": "tag", + "value": "1" + }, + { + "begin": 1165, + "end": 1888, + "name": "JUMPDEST" + }, + { + "begin": 1165, + "end": 1888, + "name": "PUSH", + "value": "0" + }, + { + "begin": 1165, + "end": 1888, + "name": "DUP1" + }, + { + "begin": 1165, + "end": 1888, + "name": "REVERT" + }, + { + "begin": 1188, + "end": 1208, + "name": "tag", + "value": "2" + }, + { + "begin": 1188, + "end": 1208, + "name": "JUMPDEST" + }, + { + "begin": 1188, + "end": 1208, + "name": "CALLVALUE" + }, + { + "begin": 1188, + "end": 1208, + "name": "ISZERO" + }, + { + "begin": 1188, + "end": 1208, + "name": "PUSH [tag]", + "value": "4" + }, + { + "begin": 1188, + "end": 1208, + "name": "JUMPI" + }, + { + "begin": 1188, + "end": 1208, + "name": "PUSH", + "value": "0" + }, + { + "begin": 1188, + "end": 1208, + "name": "DUP1" + }, + { + "begin": 1188, + "end": 1208, + "name": "REVERT" + }, + { + "begin": 1188, + "end": 1208, + "name": "tag", + "value": "4" + }, + { + "begin": 1188, + "end": 1208, + "name": "JUMPDEST" + }, + { + "begin": 1188, + "end": 1208, + "name": "PUSH [tag]", + "value": "5" + }, + { + "begin": 1188, + "end": 1208, + "name": "PUSH [tag]", + "value": "6" + }, + { + "begin": 1188, + "end": 1208, + "name": "JUMP" + }, + { + "begin": 1188, + "end": 1208, + "name": "tag", + "value": "5" + }, + { + "begin": 1188, + "end": 1208, + "name": "JUMPDEST" + }, + { + "begin": 1188, + "end": 1208, + "name": "PUSH", + "value": "40" + }, + { + "begin": 1188, + "end": 1208, + "name": "MLOAD" + }, + { + "begin": 1188, + "end": 1208, + "name": "PUSH", + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + }, + { + "begin": 1188, + "end": 1208, + "name": "SWAP1" + }, + { + "begin": 1188, + "end": 1208, + "name": "SWAP2" + }, + { + "begin": 1188, + "end": 1208, + "name": "AND" + }, + { + "begin": 1188, + "end": 1208, + "name": "DUP2" + }, + { + "begin": 1188, + "end": 1208, + "name": "MSTORE" + }, + { + "begin": 1188, + "end": 1208, + "name": "PUSH", + "value": "20" + }, + { + "begin": 1188, + "end": 1208, + "name": "ADD" + }, + { + "begin": 1188, + "end": 1208, + "name": "PUSH", + "value": "40" + }, + { + "begin": 1188, + "end": 1208, + "name": "MLOAD" + }, + { + "begin": 1188, + "end": 1208, + "name": "DUP1" + }, + { + "begin": 1188, + "end": 1208, + "name": "SWAP2" + }, + { + "begin": 1188, + "end": 1208, + "name": "SUB" + }, + { + "begin": 1188, + "end": 1208, + "name": "SWAP1" + }, + { + "begin": 1188, + "end": 1208, + "name": "RETURN" + }, + { + "begin": 1738, + "end": 1885, + "name": "tag", + "value": "3" + }, + { + "begin": 1738, + "end": 1885, + "name": "JUMPDEST" + }, + { + "begin": 1738, + "end": 1885, + "name": "CALLVALUE" + }, + { + "begin": 1738, + "end": 1885, + "name": "ISZERO" + }, + { + "begin": 1738, + "end": 1885, + "name": "PUSH [tag]", + "value": "7" + }, + { + "begin": 1738, + "end": 1885, + "name": "JUMPI" + }, + { + "begin": 1738, + "end": 1885, + "name": "PUSH", + "value": "0" + }, + { + "begin": 1738, + "end": 1885, + "name": "DUP1" + }, + { + "begin": 1738, + "end": 1885, + "name": "REVERT" + }, + { + "begin": 1738, + "end": 1885, + "name": "tag", + "value": "7" + }, + { + "begin": 1738, + "end": 1885, + "name": "JUMPDEST" + }, + { + "begin": 1738, + "end": 1885, + "name": "PUSH [tag]", + "value": "8" + }, + { + "begin": 1738, + "end": 1885, + "name": "PUSH", + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + }, + { + "begin": 1738, + "end": 1885, + "name": "PUSH", + "value": "4" + }, + { + "begin": 1738, + "end": 1885, + "name": "CALLDATALOAD" + }, + { + "begin": 1738, + "end": 1885, + "name": "AND" + }, + { + "begin": 1738, + "end": 1885, + "name": "PUSH [tag]", + "value": "9" + }, + { + "begin": 1738, + "end": 1885, + "name": "JUMP" + }, + { + "begin": 1738, + "end": 1885, + "name": "tag", + "value": "8" + }, + { + "begin": 1738, + "end": 1885, + "name": "JUMPDEST" + }, + { + "begin": 1738, + "end": 1885, + "name": "STOP" + }, + { + "begin": 1188, + "end": 1208, + "name": "tag", + "value": "6" + }, + { + "begin": 1188, + "end": 1208, + "name": "JUMPDEST" + }, + { + "begin": 1188, + "end": 1208, + "name": "PUSH", + "value": "0" + }, + { + "begin": 1188, + "end": 1208, + "name": "SLOAD" + }, + { + "begin": 1188, + "end": 1208, + "name": "PUSH", + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + }, + { + "begin": 1188, + "end": 1208, + "name": "AND" + }, + { + "begin": 1188, + "end": 1208, + "name": "DUP2" + }, + { + "begin": 1188, + "end": 1208, + "name": "JUMP", + "value": "[out]" + }, + { + "begin": 1738, + "end": 1885, + "name": "tag", + "value": "9" + }, + { + "begin": 1738, + "end": 1885, + "name": "JUMPDEST" + }, + { + "begin": 1546, + "end": 1551, + "name": "PUSH", + "value": "0" + }, + { + "begin": 1546, + "end": 1551, + "name": "SLOAD" + }, + { + "begin": 1532, + "end": 1542, + "name": "CALLER" + }, + { + "begin": 1546, + "end": 1551, + "name": "PUSH", + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + }, + { + "begin": 1532, + "end": 1551, + "name": "SWAP1" + }, + { + "begin": 1532, + "end": 1551, + "name": "DUP2" + }, + { + "begin": 1532, + "end": 1551, + "name": "AND" + }, + { + "begin": 1546, + "end": 1551, + "name": "SWAP2" + }, + { + "begin": 1546, + "end": 1551, + "name": "AND" + }, + { + "begin": 1532, + "end": 1551, + "name": "EQ" + }, + { + "begin": 1524, + "end": 1552, + "name": "PUSH [tag]", + "value": "11" + }, + { + "begin": 1524, + "end": 1552, + "name": "JUMPI" + }, + { + "begin": 1524, + "end": 1552, + "name": "PUSH", + "value": "0" + }, + { + "begin": 1524, + "end": 1552, + "name": "DUP1" + }, + { + "begin": 1524, + "end": 1552, + "name": "REVERT" + }, + { + "begin": 1524, + "end": 1552, + "name": "tag", + "value": "11" + }, + { + "begin": 1524, + "end": 1552, + "name": "JUMPDEST" + }, + { + "begin": 1814, + "end": 1836, + "name": "PUSH", + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + }, + { + "begin": 1814, + "end": 1836, + "name": "DUP2" + }, + { + "begin": 1814, + "end": 1836, + "name": "AND" + }, + { + "begin": 1814, + "end": 1836, + "name": "ISZERO" + }, + { + "begin": 1810, + "end": 1879, + "name": "PUSH [tag]", + "value": "13" + }, + { + "begin": 1810, + "end": 1879, + "name": "JUMPI" + }, + { + "begin": 1852, + "end": 1857, + "name": "PUSH", + "value": "0" + }, + { + "begin": 1852, + "end": 1868, + "name": "DUP1" + }, + { + "begin": 1852, + "end": 1868, + "name": "SLOAD" + }, + { + "begin": 1852, + "end": 1868, + "name": "PUSH", + "value": "FFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000" + }, + { + "begin": 1852, + "end": 1868, + "name": "AND" + }, + { + "begin": 1852, + "end": 1868, + "name": "PUSH", + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + }, + { + "begin": 1852, + "end": 1868, + "name": "DUP4" + }, + { + "begin": 1852, + "end": 1868, + "name": "AND" + }, + { + "begin": 1852, + "end": 1868, + "name": "OR" + }, + { + "begin": 1852, + "end": 1868, + "name": "SWAP1" + }, + { + "begin": 1852, + "end": 1868, + "name": "SSTORE" + }, + { + "begin": 1810, + "end": 1879, + "name": "tag", + "value": "13" + }, + { + "begin": 1810, + "end": 1879, + "name": "JUMPDEST" + }, + { + "begin": 1738, + "end": 1885, + "name": "POP" + }, + { + "begin": 1738, + "end": 1885, + "name": "JUMP", + "value": "[out]" + } + ] + } + } + }, + "methodIdentifiers": { + "owner()": "8da5cb5b", + "transferOwnership(address)": "f2fde38b" + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.4.18+commit.9cf6e910\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"constant\":true,\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"}],\"devdoc\":{\"methods\":{\"transferOwnership(address)\":{\"details\":\"Allows the current owner to transfer control of the contract to a newOwner.\",\"params\":{\"newOwner\":\"The address to transfer ownership to.\"}}},\"title\":\"Ownable\"},\"userdoc\":{\"methods\":{}}},\"settings\":{\"compilationTarget\":{\"src/Contract.sol\":\"Ownable\"},\"libraries\":{},\"optimizer\":{\"enabled\":true,\"runs\":1000000},\"remappings\":[\":src/=src/\"]},\"sources\":{\"src/Contract.sol\":{\"keccak256\":\"0x3e0d611f53491f313ae035797ed7ecfd1dfd8db8fef8f82737e6f0cd86d71de7\",\"urls\":[\"bzzr://9c33025fa9d1b8389e4c7c9534a1d70fad91c6c2ad70eb5e4b7dc3a701a5f892\"]}},\"version\":1}", + "userdoc": { + "methods": {} + } + }, + "Pausable": { + "abi": [ + { + "constant": false, + "inputs": [], + "name": "unpause", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "paused", + "outputs": [ + { + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [], + "name": "pause", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "owner", + "outputs": [ + { + "name": "", + "type": "address" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "anonymous": false, + "inputs": [], + "name": "Pause", + "type": "event" + }, + { + "anonymous": false, + "inputs": [], + "name": "Unpause", + "type": "event" + } + ], + "devdoc": { + "methods": { + "pause()": { + "details": "called by the owner to pause, triggers stopped state" + }, + "transferOwnership(address)": { + "details": "Allows the current owner to transfer control of the contract to a newOwner.", + "params": { + "newOwner": "The address to transfer ownership to." + } + }, + "unpause()": { + "details": "called by the owner to unpause, returns to normal state" + } + }, + "title": "Pausable" + }, + "evm": { + "assembly": " /* \"src/Contract.sol\":7314:8059 contract Pausable is Ownable {... */\n mstore(0x40, 0x60)\n /* \"src/Contract.sol\":7405:7410 false */\n 0x0\n /* \"src/Contract.sol\":7384:7410 bool public paused = false */\n dup1\n sload\n sub(exp(0x2, 0xa0), 0x1)\n /* \"src/Contract.sol\":1386:1396 msg.sender */\n caller\n /* \"src/Contract.sol\":1378:1396 owner = msg.sender */\n and\n not(sub(exp(0x2, 0xa8), 0x1))\n swap1\n swap2\n and\n or\n swap1\n sstore\n /* \"src/Contract.sol\":7314:8059 contract Pausable is Ownable {... */\n dataSize(sub_0)\n dup1\n dataOffset(sub_0)\n 0x0\n codecopy\n 0x0\n return\nstop\n\nsub_0: assembly {\n /* \"src/Contract.sol\":7314:8059 contract Pausable is Ownable {... */\n mstore(0x40, 0x60)\n jumpi(tag_1, lt(calldatasize, 0x4))\n and(div(calldataload(0x0), 0x100000000000000000000000000000000000000000000000000000000), 0xffffffff)\n 0x3f4ba83a\n dup2\n eq\n tag_2\n jumpi\n dup1\n 0x5c975abb\n eq\n tag_3\n jumpi\n dup1\n 0x8456cb59\n eq\n tag_4\n jumpi\n dup1\n 0x8da5cb5b\n eq\n tag_5\n jumpi\n dup1\n 0xf2fde38b\n eq\n tag_6\n jumpi\n tag_1:\n 0x0\n dup1\n revert\n /* \"src/Contract.sol\":7970:8057 function unpause() onlyOwner whenPaused public {... */\n tag_2:\n jumpi(tag_7, iszero(callvalue))\n 0x0\n dup1\n revert\n tag_7:\n tag_8\n jump(tag_9)\n tag_8:\n stop\n /* \"src/Contract.sol\":7384:7410 bool public paused = false */\n tag_3:\n jumpi(tag_10, iszero(callvalue))\n 0x0\n dup1\n revert\n tag_10:\n tag_11\n jump(tag_12)\n tag_11:\n mload(0x40)\n swap1\n iszero\n iszero\n dup2\n mstore\n 0x20\n add\n mload(0x40)\n dup1\n swap2\n sub\n swap1\n return\n /* \"src/Contract.sol\":7803:7888 function pause() onlyOwner whenNotPaused public {... */\n tag_4:\n jumpi(tag_13, iszero(callvalue))\n 0x0\n dup1\n revert\n tag_13:\n tag_8\n jump(tag_15)\n /* \"src/Contract.sol\":1188:1208 address public owner */\n tag_5:\n jumpi(tag_16, iszero(callvalue))\n 0x0\n dup1\n revert\n tag_16:\n tag_17\n jump(tag_18)\n tag_17:\n mload(0x40)\n 0xffffffffffffffffffffffffffffffffffffffff\n swap1\n swap2\n and\n dup2\n mstore\n 0x20\n add\n mload(0x40)\n dup1\n swap2\n sub\n swap1\n return\n /* \"src/Contract.sol\":1738:1885 function transferOwnership(address newOwner) public onlyOwner {... */\n tag_6:\n jumpi(tag_19, iszero(callvalue))\n 0x0\n dup1\n revert\n tag_19:\n tag_8\n and(calldataload(0x4), 0xffffffffffffffffffffffffffffffffffffffff)\n jump(tag_21)\n /* \"src/Contract.sol\":7970:8057 function unpause() onlyOwner whenPaused public {... */\n tag_9:\n /* \"src/Contract.sol\":1546:1551 owner */\n sload(0x0)\n /* \"src/Contract.sol\":1532:1542 msg.sender */\n caller\n /* \"src/Contract.sol\":1546:1551 owner */\n 0xffffffffffffffffffffffffffffffffffffffff\n /* \"src/Contract.sol\":1532:1551 msg.sender == owner */\n swap1\n dup2\n and\n /* \"src/Contract.sol\":1546:1551 owner */\n swap2\n and\n /* \"src/Contract.sol\":1532:1551 msg.sender == owner */\n eq\n /* \"src/Contract.sol\":1524:1552 require(msg.sender == owner) */\n tag_23\n jumpi\n 0x0\n dup1\n revert\n tag_23:\n /* \"src/Contract.sol\":7705:7711 paused */\n sload(0x0)\n 0x10000000000000000000000000000000000000000\n swap1\n div\n 0xff\n and\n /* \"src/Contract.sol\":7697:7712 require(paused) */\n iszero\n iszero\n tag_25\n jumpi\n 0x0\n dup1\n revert\n tag_25:\n /* \"src/Contract.sol\":8032:8037 false */\n 0x0\n /* \"src/Contract.sol\":8023:8037 paused = false */\n dup1\n sload\n 0xffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff\n and\n swap1\n sstore\n /* \"src/Contract.sol\":8043:8052 Unpause() */\n 0x7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b33\n mload(0x40)\n mload(0x40)\n dup1\n swap2\n sub\n swap1\n log1\n /* \"src/Contract.sol\":7970:8057 function unpause() onlyOwner whenPaused public {... */\n jump\t// out\n /* \"src/Contract.sol\":7384:7410 bool public paused = false */\n tag_12:\n sload(0x0)\n 0x10000000000000000000000000000000000000000\n swap1\n div\n 0xff\n and\n dup2\n jump\t// out\n /* \"src/Contract.sol\":7803:7888 function pause() onlyOwner whenNotPaused public {... */\n tag_15:\n /* \"src/Contract.sol\":1546:1551 owner */\n sload(0x0)\n /* \"src/Contract.sol\":1532:1542 msg.sender */\n caller\n /* \"src/Contract.sol\":1546:1551 owner */\n 0xffffffffffffffffffffffffffffffffffffffff\n /* \"src/Contract.sol\":1532:1551 msg.sender == owner */\n swap1\n dup2\n and\n /* \"src/Contract.sol\":1546:1551 owner */\n swap2\n and\n /* \"src/Contract.sol\":1532:1551 msg.sender == owner */\n eq\n /* \"src/Contract.sol\":1524:1552 require(msg.sender == owner) */\n tag_28\n jumpi\n 0x0\n dup1\n revert\n tag_28:\n /* \"src/Contract.sol\":7553:7559 paused */\n sload(0x0)\n 0x10000000000000000000000000000000000000000\n swap1\n div\n 0xff\n and\n /* \"src/Contract.sol\":7552:7559 !paused */\n iszero\n /* \"src/Contract.sol\":7544:7560 require(!paused) */\n tag_30\n jumpi\n 0x0\n dup1\n revert\n tag_30:\n /* \"src/Contract.sol\":7857:7863 paused */\n 0x0\n /* \"src/Contract.sol\":7857:7870 paused = true */\n dup1\n sload\n 0xffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff\n and\n 0x10000000000000000000000000000000000000000\n or\n swap1\n sstore\n /* \"src/Contract.sol\":7876:7883 Pause() */\n 0x6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff625\n mload(0x40)\n mload(0x40)\n dup1\n swap2\n sub\n swap1\n log1\n /* \"src/Contract.sol\":7803:7888 function pause() onlyOwner whenNotPaused public {... */\n jump\t// out\n /* \"src/Contract.sol\":1188:1208 address public owner */\n tag_18:\n and(0xffffffffffffffffffffffffffffffffffffffff, sload(0x0))\n dup2\n jump\t// out\n /* \"src/Contract.sol\":1738:1885 function transferOwnership(address newOwner) public onlyOwner {... */\n tag_21:\n /* \"src/Contract.sol\":1546:1551 owner */\n sload(0x0)\n /* \"src/Contract.sol\":1532:1542 msg.sender */\n caller\n /* \"src/Contract.sol\":1546:1551 owner */\n 0xffffffffffffffffffffffffffffffffffffffff\n /* \"src/Contract.sol\":1532:1551 msg.sender == owner */\n swap1\n dup2\n and\n /* \"src/Contract.sol\":1546:1551 owner */\n swap2\n and\n /* \"src/Contract.sol\":1532:1551 msg.sender == owner */\n eq\n /* \"src/Contract.sol\":1524:1552 require(msg.sender == owner) */\n tag_33\n jumpi\n 0x0\n dup1\n revert\n tag_33:\n /* \"src/Contract.sol\":1814:1836 newOwner != address(0) */\n 0xffffffffffffffffffffffffffffffffffffffff\n dup2\n and\n iszero\n /* \"src/Contract.sol\":1810:1879 if (newOwner != address(0)) {... */\n tag_35\n jumpi\n /* \"src/Contract.sol\":1852:1857 owner */\n 0x0\n /* \"src/Contract.sol\":1852:1868 owner = newOwner */\n dup1\n sload\n 0xffffffffffffffffffffffff0000000000000000000000000000000000000000\n and\n 0xffffffffffffffffffffffffffffffffffffffff\n dup4\n and\n or\n swap1\n sstore\n /* \"src/Contract.sol\":1810:1879 if (newOwner != address(0)) {... */\n tag_35:\n /* \"src/Contract.sol\":1738:1885 function transferOwnership(address newOwner) public onlyOwner {... */\n pop\n jump\t// out\n\n auxdata: 0xa165627a7a723058203eab31f3b2cbee25ec6b08cf0580afe43ebf9244126362b101da54fb9f11131b0029\n}\n", + "bytecode": { + "linkReferences": {}, + "object": "606060405260008054600160a060020a033316600160a860020a031990911617905561037d806100306000396000f30060606040526004361061006c5763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416633f4ba83a81146100715780635c975abb146100865780638456cb59146100ad5780638da5cb5b146100c0578063f2fde38b146100fc575b600080fd5b341561007c57600080fd5b610084610128565b005b341561009157600080fd5b6100996101cf565b604051901515815260200160405180910390f35b34156100b857600080fd5b6100846101f0565b34156100cb57600080fd5b6100d36102ad565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b341561010757600080fd5b61008473ffffffffffffffffffffffffffffffffffffffff600435166102c9565b6000543373ffffffffffffffffffffffffffffffffffffffff90811691161461015057600080fd5b60005474010000000000000000000000000000000000000000900460ff16151561017957600080fd5b600080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690557f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b60005474010000000000000000000000000000000000000000900460ff1681565b6000543373ffffffffffffffffffffffffffffffffffffffff90811691161461021857600080fd5b60005474010000000000000000000000000000000000000000900460ff161561024057600080fd5b600080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790557f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b60005473ffffffffffffffffffffffffffffffffffffffff1681565b6000543373ffffffffffffffffffffffffffffffffffffffff9081169116146102f157600080fd5b73ffffffffffffffffffffffffffffffffffffffff81161561034e57600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83161790555b505600a165627a7a723058203eab31f3b2cbee25ec6b08cf0580afe43ebf9244126362b101da54fb9f11131b0029", + "opcodes": "PUSH1 0x60 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB CALLER AND PUSH1 0x1 PUSH1 0xA8 PUSH1 0x2 EXP SUB NOT SWAP1 SWAP2 AND OR SWAP1 SSTORE PUSH2 0x37D DUP1 PUSH2 0x30 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN STOP PUSH1 0x60 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x6C JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x3F4BA83A DUP2 EQ PUSH2 0x71 JUMPI DUP1 PUSH4 0x5C975ABB EQ PUSH2 0x86 JUMPI DUP1 PUSH4 0x8456CB59 EQ PUSH2 0xAD JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0xC0 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0xFC JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE ISZERO PUSH2 0x7C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x84 PUSH2 0x128 JUMP JUMPDEST STOP JUMPDEST CALLVALUE ISZERO PUSH2 0x91 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x99 PUSH2 0x1CF JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE ISZERO PUSH2 0xB8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x84 PUSH2 0x1F0 JUMP JUMPDEST CALLVALUE ISZERO PUSH2 0xCB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xD3 PUSH2 0x2AD JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE ISZERO PUSH2 0x107 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x84 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0x2C9 JUMP JUMPDEST PUSH1 0x0 SLOAD CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 DUP2 AND SWAP2 AND EQ PUSH2 0x150 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH21 0x10000000000000000000000000000000000000000 SWAP1 DIV PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x179 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 SSTORE PUSH32 0x7805862F689E2F13DF9F062FF482AD3AD112ACA9E0847911ED832E158C525B33 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH21 0x10000000000000000000000000000000000000000 SWAP1 DIV PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 SLOAD CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 DUP2 AND SWAP2 AND EQ PUSH2 0x218 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH21 0x10000000000000000000000000000000000000000 SWAP1 DIV PUSH1 0xFF AND ISZERO PUSH2 0x240 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH21 0x10000000000000000000000000000000000000000 OR SWAP1 SSTORE PUSH32 0x6985A02210A168E66602D3235CB6DB0E70F92B3BA4D376A33C0F3D9434BFF625 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 SLOAD CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 DUP2 AND SWAP2 AND EQ PUSH2 0x2F1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x34E JUMPI PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND OR SWAP1 SSTORE JUMPDEST POP JUMP STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 RETURNDATACOPY 0xab BALANCE RETURN 0xb2 0xcb 0xee 0x25 0xec PUSH12 0x8CF0580AFE43EBF92441263 PUSH3 0xB101DA SLOAD CREATE2 SWAP16 GT SGT 0x1b STOP 0x29 ", + "sourceMap": "7314:745:0:-;;;7405:5;7384:26;;-1:-1:-1;;;;;1386:10:0;1378:18;-1:-1:-1;;;;;;1378:18:0;;;;;;7314:745;;;;;;" + }, + "deployedBytecode": { + "linkReferences": {}, + "object": "60606040526004361061006c5763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416633f4ba83a81146100715780635c975abb146100865780638456cb59146100ad5780638da5cb5b146100c0578063f2fde38b146100fc575b600080fd5b341561007c57600080fd5b610084610128565b005b341561009157600080fd5b6100996101cf565b604051901515815260200160405180910390f35b34156100b857600080fd5b6100846101f0565b34156100cb57600080fd5b6100d36102ad565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b341561010757600080fd5b61008473ffffffffffffffffffffffffffffffffffffffff600435166102c9565b6000543373ffffffffffffffffffffffffffffffffffffffff90811691161461015057600080fd5b60005474010000000000000000000000000000000000000000900460ff16151561017957600080fd5b600080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690557f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b60005474010000000000000000000000000000000000000000900460ff1681565b6000543373ffffffffffffffffffffffffffffffffffffffff90811691161461021857600080fd5b60005474010000000000000000000000000000000000000000900460ff161561024057600080fd5b600080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790557f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b60005473ffffffffffffffffffffffffffffffffffffffff1681565b6000543373ffffffffffffffffffffffffffffffffffffffff9081169116146102f157600080fd5b73ffffffffffffffffffffffffffffffffffffffff81161561034e57600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83161790555b505600a165627a7a723058203eab31f3b2cbee25ec6b08cf0580afe43ebf9244126362b101da54fb9f11131b0029", + "opcodes": "PUSH1 0x60 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x6C JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x3F4BA83A DUP2 EQ PUSH2 0x71 JUMPI DUP1 PUSH4 0x5C975ABB EQ PUSH2 0x86 JUMPI DUP1 PUSH4 0x8456CB59 EQ PUSH2 0xAD JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0xC0 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0xFC JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE ISZERO PUSH2 0x7C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x84 PUSH2 0x128 JUMP JUMPDEST STOP JUMPDEST CALLVALUE ISZERO PUSH2 0x91 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x99 PUSH2 0x1CF JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE ISZERO PUSH2 0xB8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x84 PUSH2 0x1F0 JUMP JUMPDEST CALLVALUE ISZERO PUSH2 0xCB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xD3 PUSH2 0x2AD JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE ISZERO PUSH2 0x107 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x84 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0x2C9 JUMP JUMPDEST PUSH1 0x0 SLOAD CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 DUP2 AND SWAP2 AND EQ PUSH2 0x150 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH21 0x10000000000000000000000000000000000000000 SWAP1 DIV PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x179 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 SSTORE PUSH32 0x7805862F689E2F13DF9F062FF482AD3AD112ACA9E0847911ED832E158C525B33 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH21 0x10000000000000000000000000000000000000000 SWAP1 DIV PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 SLOAD CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 DUP2 AND SWAP2 AND EQ PUSH2 0x218 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH21 0x10000000000000000000000000000000000000000 SWAP1 DIV PUSH1 0xFF AND ISZERO PUSH2 0x240 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH21 0x10000000000000000000000000000000000000000 OR SWAP1 SSTORE PUSH32 0x6985A02210A168E66602D3235CB6DB0E70F92B3BA4D376A33C0F3D9434BFF625 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 SLOAD CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 DUP2 AND SWAP2 AND EQ PUSH2 0x2F1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x34E JUMPI PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND OR SWAP1 SSTORE JUMPDEST POP JUMP STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 RETURNDATACOPY 0xab BALANCE RETURN 0xb2 0xcb 0xee 0x25 0xec PUSH12 0x8CF0580AFE43EBF92441263 PUSH3 0xB101DA SLOAD CREATE2 SWAP16 GT SGT 0x1b STOP 0x29 ", + "sourceMap": "7314:745:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7970:87;;;;;;;;;;;;;;7384:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7803:85;;;;;;;;;;;;1188:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1738:147;;;;;;;;;;;;;;;;7970:87;1546:5;;1532:10;1546:5;1532:19;;;1546:5;;1532:19;1524:28;;;;;;7705:6;;;;;;;7697:15;;;;;;;;8032:5;8023:14;;;;;;8043:9;;;;;;;;;;7970:87::o;7384:26::-;;;;;;;;;:::o;7803:85::-;1546:5;;1532:10;1546:5;1532:19;;;1546:5;;1532:19;1524:28;;;;;;7553:6;;;;;;;7552:7;7544:16;;;;;;7857:6;:13;;;;;;;;7876:7;;;;;;;;;;7803:85::o;1188:20::-;;;;;;:::o;1738:147::-;1546:5;;1532:10;1546:5;1532:19;;;1546:5;;1532:19;1524:28;;;;;;1814:22;;;;1810:69;;1852:5;:16;;;;;;;;;;1810:69;1738:147;:::o" + }, + "gasEstimates": { + "creation": { + "codeDepositCost": "178600", + "executionCost": "20569", + "totalCost": "199169" + }, + "external": { + "owner()": "454", + "pause()": "21644", + "paused()": "418", + "transferOwnership(address)": "20720", + "unpause()": "21597" + } + }, + "legacyAssembly": { + ".code": [ + { + "begin": 7314, + "end": 8059, + "name": "PUSH", + "value": "60" + }, + { + "begin": 7314, + "end": 8059, + "name": "PUSH", + "value": "40" + }, + { + "begin": 7314, + "end": 8059, + "name": "MSTORE" + }, + { + "begin": 7405, + "end": 7410, + "name": "PUSH", + "value": "0" + }, + { + "begin": 7384, + "end": 7410, + "name": "DUP1" + }, + { + "begin": 7384, + "end": 7410, + "name": "SLOAD" + }, + { + "begin": -1, + "end": -1, + "name": "PUSH", + "value": "1" + }, + { + "begin": -1, + "end": -1, + "name": "PUSH", + "value": "A0" + }, + { + "begin": -1, + "end": -1, + "name": "PUSH", + "value": "2" + }, + { + "begin": -1, + "end": -1, + "name": "EXP" + }, + { + "begin": -1, + "end": -1, + "name": "SUB" + }, + { + "begin": 1386, + "end": 1396, + "name": "CALLER" + }, + { + "begin": 1378, + "end": 1396, + "name": "AND" + }, + { + "begin": -1, + "end": -1, + "name": "PUSH", + "value": "1" + }, + { + "begin": -1, + "end": -1, + "name": "PUSH", + "value": "A8" + }, + { + "begin": -1, + "end": -1, + "name": "PUSH", + "value": "2" + }, + { + "begin": -1, + "end": -1, + "name": "EXP" + }, + { + "begin": -1, + "end": -1, + "name": "SUB" + }, + { + "begin": -1, + "end": -1, + "name": "NOT" + }, + { + "begin": 1378, + "end": 1396, + "name": "SWAP1" + }, + { + "begin": 1378, + "end": 1396, + "name": "SWAP2" + }, + { + "begin": 1378, + "end": 1396, + "name": "AND" + }, + { + "begin": 1378, + "end": 1396, + "name": "OR" + }, + { + "begin": 1378, + "end": 1396, + "name": "SWAP1" + }, + { + "begin": 1378, + "end": 1396, + "name": "SSTORE" + }, + { + "begin": 7314, + "end": 8059, + "name": "PUSH #[$]", + "value": "0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "begin": 7314, + "end": 8059, + "name": "DUP1" + }, + { + "begin": 7314, + "end": 8059, + "name": "PUSH [$]", + "value": "0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "begin": 7314, + "end": 8059, + "name": "PUSH", + "value": "0" + }, + { + "begin": 7314, + "end": 8059, + "name": "CODECOPY" + }, + { + "begin": 7314, + "end": 8059, + "name": "PUSH", + "value": "0" + }, + { + "begin": 7314, + "end": 8059, + "name": "RETURN" + } + ], + ".data": { + "0": { + ".auxdata": "a165627a7a723058203eab31f3b2cbee25ec6b08cf0580afe43ebf9244126362b101da54fb9f11131b0029", + ".code": [ + { + "begin": 7314, + "end": 8059, + "name": "PUSH", + "value": "60" + }, + { + "begin": 7314, + "end": 8059, + "name": "PUSH", + "value": "40" + }, + { + "begin": 7314, + "end": 8059, + "name": "MSTORE" + }, + { + "begin": 7314, + "end": 8059, + "name": "PUSH", + "value": "4" + }, + { + "begin": 7314, + "end": 8059, + "name": "CALLDATASIZE" + }, + { + "begin": 7314, + "end": 8059, + "name": "LT" + }, + { + "begin": 7314, + "end": 8059, + "name": "PUSH [tag]", + "value": "1" + }, + { + "begin": 7314, + "end": 8059, + "name": "JUMPI" + }, + { + "begin": 7314, + "end": 8059, + "name": "PUSH", + "value": "FFFFFFFF" + }, + { + "begin": 7314, + "end": 8059, + "name": "PUSH", + "value": "100000000000000000000000000000000000000000000000000000000" + }, + { + "begin": 7314, + "end": 8059, + "name": "PUSH", + "value": "0" + }, + { + "begin": 7314, + "end": 8059, + "name": "CALLDATALOAD" + }, + { + "begin": 7314, + "end": 8059, + "name": "DIV" + }, + { + "begin": 7314, + "end": 8059, + "name": "AND" + }, + { + "begin": 7314, + "end": 8059, + "name": "PUSH", + "value": "3F4BA83A" + }, + { + "begin": 7314, + "end": 8059, + "name": "DUP2" + }, + { + "begin": 7314, + "end": 8059, + "name": "EQ" + }, + { + "begin": 7314, + "end": 8059, + "name": "PUSH [tag]", + "value": "2" + }, + { + "begin": 7314, + "end": 8059, + "name": "JUMPI" + }, + { + "begin": 7314, + "end": 8059, + "name": "DUP1" + }, + { + "begin": 7314, + "end": 8059, + "name": "PUSH", + "value": "5C975ABB" + }, + { + "begin": 7314, + "end": 8059, + "name": "EQ" + }, + { + "begin": 7314, + "end": 8059, + "name": "PUSH [tag]", + "value": "3" + }, + { + "begin": 7314, + "end": 8059, + "name": "JUMPI" + }, + { + "begin": 7314, + "end": 8059, + "name": "DUP1" + }, + { + "begin": 7314, + "end": 8059, + "name": "PUSH", + "value": "8456CB59" + }, + { + "begin": 7314, + "end": 8059, + "name": "EQ" + }, + { + "begin": 7314, + "end": 8059, + "name": "PUSH [tag]", + "value": "4" + }, + { + "begin": 7314, + "end": 8059, + "name": "JUMPI" + }, + { + "begin": 7314, + "end": 8059, + "name": "DUP1" + }, + { + "begin": 7314, + "end": 8059, + "name": "PUSH", + "value": "8DA5CB5B" + }, + { + "begin": 7314, + "end": 8059, + "name": "EQ" + }, + { + "begin": 7314, + "end": 8059, + "name": "PUSH [tag]", + "value": "5" + }, + { + "begin": 7314, + "end": 8059, + "name": "JUMPI" + }, + { + "begin": 7314, + "end": 8059, + "name": "DUP1" + }, + { + "begin": 7314, + "end": 8059, + "name": "PUSH", + "value": "F2FDE38B" + }, + { + "begin": 7314, + "end": 8059, + "name": "EQ" + }, + { + "begin": 7314, + "end": 8059, + "name": "PUSH [tag]", + "value": "6" + }, + { + "begin": 7314, + "end": 8059, + "name": "JUMPI" + }, + { + "begin": 7314, + "end": 8059, + "name": "tag", + "value": "1" + }, + { + "begin": 7314, + "end": 8059, + "name": "JUMPDEST" + }, + { + "begin": 7314, + "end": 8059, + "name": "PUSH", + "value": "0" + }, + { + "begin": 7314, + "end": 8059, + "name": "DUP1" + }, + { + "begin": 7314, + "end": 8059, + "name": "REVERT" + }, + { + "begin": 7970, + "end": 8057, + "name": "tag", + "value": "2" + }, + { + "begin": 7970, + "end": 8057, + "name": "JUMPDEST" + }, + { + "begin": 7970, + "end": 8057, + "name": "CALLVALUE" + }, + { + "begin": 7970, + "end": 8057, + "name": "ISZERO" + }, + { + "begin": 7970, + "end": 8057, + "name": "PUSH [tag]", + "value": "7" + }, + { + "begin": 7970, + "end": 8057, + "name": "JUMPI" + }, + { + "begin": 7970, + "end": 8057, + "name": "PUSH", + "value": "0" + }, + { + "begin": 7970, + "end": 8057, + "name": "DUP1" + }, + { + "begin": 7970, + "end": 8057, + "name": "REVERT" + }, + { + "begin": 7970, + "end": 8057, + "name": "tag", + "value": "7" + }, + { + "begin": 7970, + "end": 8057, + "name": "JUMPDEST" + }, + { + "begin": 7970, + "end": 8057, + "name": "PUSH [tag]", + "value": "8" + }, + { + "begin": 7970, + "end": 8057, + "name": "PUSH [tag]", + "value": "9" + }, + { + "begin": 7970, + "end": 8057, + "name": "JUMP" + }, + { + "begin": 7970, + "end": 8057, + "name": "tag", + "value": "8" + }, + { + "begin": 7970, + "end": 8057, + "name": "JUMPDEST" + }, + { + "begin": 7970, + "end": 8057, + "name": "STOP" + }, + { + "begin": 7384, + "end": 7410, + "name": "tag", + "value": "3" + }, + { + "begin": 7384, + "end": 7410, + "name": "JUMPDEST" + }, + { + "begin": 7384, + "end": 7410, + "name": "CALLVALUE" + }, + { + "begin": 7384, + "end": 7410, + "name": "ISZERO" + }, + { + "begin": 7384, + "end": 7410, + "name": "PUSH [tag]", + "value": "10" + }, + { + "begin": 7384, + "end": 7410, + "name": "JUMPI" + }, + { + "begin": 7384, + "end": 7410, + "name": "PUSH", + "value": "0" + }, + { + "begin": 7384, + "end": 7410, + "name": "DUP1" + }, + { + "begin": 7384, + "end": 7410, + "name": "REVERT" + }, + { + "begin": 7384, + "end": 7410, + "name": "tag", + "value": "10" + }, + { + "begin": 7384, + "end": 7410, + "name": "JUMPDEST" + }, + { + "begin": 7384, + "end": 7410, + "name": "PUSH [tag]", + "value": "11" + }, + { + "begin": 7384, + "end": 7410, + "name": "PUSH [tag]", + "value": "12" + }, + { + "begin": 7384, + "end": 7410, + "name": "JUMP" + }, + { + "begin": 7384, + "end": 7410, + "name": "tag", + "value": "11" + }, + { + "begin": 7384, + "end": 7410, + "name": "JUMPDEST" + }, + { + "begin": 7384, + "end": 7410, + "name": "PUSH", + "value": "40" + }, + { + "begin": 7384, + "end": 7410, + "name": "MLOAD" + }, + { + "begin": 7384, + "end": 7410, + "name": "SWAP1" + }, + { + "begin": 7384, + "end": 7410, + "name": "ISZERO" + }, + { + "begin": 7384, + "end": 7410, + "name": "ISZERO" + }, + { + "begin": 7384, + "end": 7410, + "name": "DUP2" + }, + { + "begin": 7384, + "end": 7410, + "name": "MSTORE" + }, + { + "begin": 7384, + "end": 7410, + "name": "PUSH", + "value": "20" + }, + { + "begin": 7384, + "end": 7410, + "name": "ADD" + }, + { + "begin": 7384, + "end": 7410, + "name": "PUSH", + "value": "40" + }, + { + "begin": 7384, + "end": 7410, + "name": "MLOAD" + }, + { + "begin": 7384, + "end": 7410, + "name": "DUP1" + }, + { + "begin": 7384, + "end": 7410, + "name": "SWAP2" + }, + { + "begin": 7384, + "end": 7410, + "name": "SUB" + }, + { + "begin": 7384, + "end": 7410, + "name": "SWAP1" + }, + { + "begin": 7384, + "end": 7410, + "name": "RETURN" + }, + { + "begin": 7803, + "end": 7888, + "name": "tag", + "value": "4" + }, + { + "begin": 7803, + "end": 7888, + "name": "JUMPDEST" + }, + { + "begin": 7803, + "end": 7888, + "name": "CALLVALUE" + }, + { + "begin": 7803, + "end": 7888, + "name": "ISZERO" + }, + { + "begin": 7803, + "end": 7888, + "name": "PUSH [tag]", + "value": "13" + }, + { + "begin": 7803, + "end": 7888, + "name": "JUMPI" + }, + { + "begin": 7803, + "end": 7888, + "name": "PUSH", + "value": "0" + }, + { + "begin": 7803, + "end": 7888, + "name": "DUP1" + }, + { + "begin": 7803, + "end": 7888, + "name": "REVERT" + }, + { + "begin": 7803, + "end": 7888, + "name": "tag", + "value": "13" + }, + { + "begin": 7803, + "end": 7888, + "name": "JUMPDEST" + }, + { + "begin": 7803, + "end": 7888, + "name": "PUSH [tag]", + "value": "8" + }, + { + "begin": 7803, + "end": 7888, + "name": "PUSH [tag]", + "value": "15" + }, + { + "begin": 7803, + "end": 7888, + "name": "JUMP" + }, + { + "begin": 1188, + "end": 1208, + "name": "tag", + "value": "5" + }, + { + "begin": 1188, + "end": 1208, + "name": "JUMPDEST" + }, + { + "begin": 1188, + "end": 1208, + "name": "CALLVALUE" + }, + { + "begin": 1188, + "end": 1208, + "name": "ISZERO" + }, + { + "begin": 1188, + "end": 1208, + "name": "PUSH [tag]", + "value": "16" + }, + { + "begin": 1188, + "end": 1208, + "name": "JUMPI" + }, + { + "begin": 1188, + "end": 1208, + "name": "PUSH", + "value": "0" + }, + { + "begin": 1188, + "end": 1208, + "name": "DUP1" + }, + { + "begin": 1188, + "end": 1208, + "name": "REVERT" + }, + { + "begin": 1188, + "end": 1208, + "name": "tag", + "value": "16" + }, + { + "begin": 1188, + "end": 1208, + "name": "JUMPDEST" + }, + { + "begin": 1188, + "end": 1208, + "name": "PUSH [tag]", + "value": "17" + }, + { + "begin": 1188, + "end": 1208, + "name": "PUSH [tag]", + "value": "18" + }, + { + "begin": 1188, + "end": 1208, + "name": "JUMP" + }, + { + "begin": 1188, + "end": 1208, + "name": "tag", + "value": "17" + }, + { + "begin": 1188, + "end": 1208, + "name": "JUMPDEST" + }, + { + "begin": 1188, + "end": 1208, + "name": "PUSH", + "value": "40" + }, + { + "begin": 1188, + "end": 1208, + "name": "MLOAD" + }, + { + "begin": 1188, + "end": 1208, + "name": "PUSH", + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + }, + { + "begin": 1188, + "end": 1208, + "name": "SWAP1" + }, + { + "begin": 1188, + "end": 1208, + "name": "SWAP2" + }, + { + "begin": 1188, + "end": 1208, + "name": "AND" + }, + { + "begin": 1188, + "end": 1208, + "name": "DUP2" + }, + { + "begin": 1188, + "end": 1208, + "name": "MSTORE" + }, + { + "begin": 1188, + "end": 1208, + "name": "PUSH", + "value": "20" + }, + { + "begin": 1188, + "end": 1208, + "name": "ADD" + }, + { + "begin": 1188, + "end": 1208, + "name": "PUSH", + "value": "40" + }, + { + "begin": 1188, + "end": 1208, + "name": "MLOAD" + }, + { + "begin": 1188, + "end": 1208, + "name": "DUP1" + }, + { + "begin": 1188, + "end": 1208, + "name": "SWAP2" + }, + { + "begin": 1188, + "end": 1208, + "name": "SUB" + }, + { + "begin": 1188, + "end": 1208, + "name": "SWAP1" + }, + { + "begin": 1188, + "end": 1208, + "name": "RETURN" + }, + { + "begin": 1738, + "end": 1885, + "name": "tag", + "value": "6" + }, + { + "begin": 1738, + "end": 1885, + "name": "JUMPDEST" + }, + { + "begin": 1738, + "end": 1885, + "name": "CALLVALUE" + }, + { + "begin": 1738, + "end": 1885, + "name": "ISZERO" + }, + { + "begin": 1738, + "end": 1885, + "name": "PUSH [tag]", + "value": "19" + }, + { + "begin": 1738, + "end": 1885, + "name": "JUMPI" + }, + { + "begin": 1738, + "end": 1885, + "name": "PUSH", + "value": "0" + }, + { + "begin": 1738, + "end": 1885, + "name": "DUP1" + }, + { + "begin": 1738, + "end": 1885, + "name": "REVERT" + }, + { + "begin": 1738, + "end": 1885, + "name": "tag", + "value": "19" + }, + { + "begin": 1738, + "end": 1885, + "name": "JUMPDEST" + }, + { + "begin": 1738, + "end": 1885, + "name": "PUSH [tag]", + "value": "8" + }, + { + "begin": 1738, + "end": 1885, + "name": "PUSH", + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + }, + { + "begin": 1738, + "end": 1885, + "name": "PUSH", + "value": "4" + }, + { + "begin": 1738, + "end": 1885, + "name": "CALLDATALOAD" + }, + { + "begin": 1738, + "end": 1885, + "name": "AND" + }, + { + "begin": 1738, + "end": 1885, + "name": "PUSH [tag]", + "value": "21" + }, + { + "begin": 1738, + "end": 1885, + "name": "JUMP" + }, + { + "begin": 7970, + "end": 8057, + "name": "tag", + "value": "9" + }, + { + "begin": 7970, + "end": 8057, + "name": "JUMPDEST" + }, + { + "begin": 1546, + "end": 1551, + "name": "PUSH", + "value": "0" + }, + { + "begin": 1546, + "end": 1551, + "name": "SLOAD" + }, + { + "begin": 1532, + "end": 1542, + "name": "CALLER" + }, + { + "begin": 1546, + "end": 1551, + "name": "PUSH", + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + }, + { + "begin": 1532, + "end": 1551, + "name": "SWAP1" + }, + { + "begin": 1532, + "end": 1551, + "name": "DUP2" + }, + { + "begin": 1532, + "end": 1551, + "name": "AND" + }, + { + "begin": 1546, + "end": 1551, + "name": "SWAP2" + }, + { + "begin": 1546, + "end": 1551, + "name": "AND" + }, + { + "begin": 1532, + "end": 1551, + "name": "EQ" + }, + { + "begin": 1524, + "end": 1552, + "name": "PUSH [tag]", + "value": "23" + }, + { + "begin": 1524, + "end": 1552, + "name": "JUMPI" + }, + { + "begin": 1524, + "end": 1552, + "name": "PUSH", + "value": "0" + }, + { + "begin": 1524, + "end": 1552, + "name": "DUP1" + }, + { + "begin": 1524, + "end": 1552, + "name": "REVERT" + }, + { + "begin": 1524, + "end": 1552, + "name": "tag", + "value": "23" + }, + { + "begin": 1524, + "end": 1552, + "name": "JUMPDEST" + }, + { + "begin": 7705, + "end": 7711, + "name": "PUSH", + "value": "0" + }, + { + "begin": 7705, + "end": 7711, + "name": "SLOAD" + }, + { + "begin": 7705, + "end": 7711, + "name": "PUSH", + "value": "10000000000000000000000000000000000000000" + }, + { + "begin": 7705, + "end": 7711, + "name": "SWAP1" + }, + { + "begin": 7705, + "end": 7711, + "name": "DIV" + }, + { + "begin": 7705, + "end": 7711, + "name": "PUSH", + "value": "FF" + }, + { + "begin": 7705, + "end": 7711, + "name": "AND" + }, + { + "begin": 7697, + "end": 7712, + "name": "ISZERO" + }, + { + "begin": 7697, + "end": 7712, + "name": "ISZERO" + }, + { + "begin": 7697, + "end": 7712, + "name": "PUSH [tag]", + "value": "25" + }, + { + "begin": 7697, + "end": 7712, + "name": "JUMPI" + }, + { + "begin": 7697, + "end": 7712, + "name": "PUSH", + "value": "0" + }, + { + "begin": 7697, + "end": 7712, + "name": "DUP1" + }, + { + "begin": 7697, + "end": 7712, + "name": "REVERT" + }, + { + "begin": 7697, + "end": 7712, + "name": "tag", + "value": "25" + }, + { + "begin": 7697, + "end": 7712, + "name": "JUMPDEST" + }, + { + "begin": 8032, + "end": 8037, + "name": "PUSH", + "value": "0" + }, + { + "begin": 8023, + "end": 8037, + "name": "DUP1" + }, + { + "begin": 8023, + "end": 8037, + "name": "SLOAD" + }, + { + "begin": 8023, + "end": 8037, + "name": "PUSH", + "value": "FFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + }, + { + "begin": 8023, + "end": 8037, + "name": "AND" + }, + { + "begin": 8023, + "end": 8037, + "name": "SWAP1" + }, + { + "begin": 8023, + "end": 8037, + "name": "SSTORE" + }, + { + "begin": 8043, + "end": 8052, + "name": "PUSH", + "value": "7805862F689E2F13DF9F062FF482AD3AD112ACA9E0847911ED832E158C525B33" + }, + { + "begin": 8043, + "end": 8052, + "name": "PUSH", + "value": "40" + }, + { + "begin": 8043, + "end": 8052, + "name": "MLOAD" + }, + { + "begin": 8043, + "end": 8052, + "name": "PUSH", + "value": "40" + }, + { + "begin": 8043, + "end": 8052, + "name": "MLOAD" + }, + { + "begin": 8043, + "end": 8052, + "name": "DUP1" + }, + { + "begin": 8043, + "end": 8052, + "name": "SWAP2" + }, + { + "begin": 8043, + "end": 8052, + "name": "SUB" + }, + { + "begin": 8043, + "end": 8052, + "name": "SWAP1" + }, + { + "begin": 8043, + "end": 8052, + "name": "LOG1" + }, + { + "begin": 7970, + "end": 8057, + "name": "JUMP", + "value": "[out]" + }, + { + "begin": 7384, + "end": 7410, + "name": "tag", + "value": "12" + }, + { + "begin": 7384, + "end": 7410, + "name": "JUMPDEST" + }, + { + "begin": 7384, + "end": 7410, + "name": "PUSH", + "value": "0" + }, + { + "begin": 7384, + "end": 7410, + "name": "SLOAD" + }, + { + "begin": 7384, + "end": 7410, + "name": "PUSH", + "value": "10000000000000000000000000000000000000000" + }, + { + "begin": 7384, + "end": 7410, + "name": "SWAP1" + }, + { + "begin": 7384, + "end": 7410, + "name": "DIV" + }, + { + "begin": 7384, + "end": 7410, + "name": "PUSH", + "value": "FF" + }, + { + "begin": 7384, + "end": 7410, + "name": "AND" + }, + { + "begin": 7384, + "end": 7410, + "name": "DUP2" + }, + { + "begin": 7384, + "end": 7410, + "name": "JUMP", + "value": "[out]" + }, + { + "begin": 7803, + "end": 7888, + "name": "tag", + "value": "15" + }, + { + "begin": 7803, + "end": 7888, + "name": "JUMPDEST" + }, + { + "begin": 1546, + "end": 1551, + "name": "PUSH", + "value": "0" + }, + { + "begin": 1546, + "end": 1551, + "name": "SLOAD" + }, + { + "begin": 1532, + "end": 1542, + "name": "CALLER" + }, + { + "begin": 1546, + "end": 1551, + "name": "PUSH", + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + }, + { + "begin": 1532, + "end": 1551, + "name": "SWAP1" + }, + { + "begin": 1532, + "end": 1551, + "name": "DUP2" + }, + { + "begin": 1532, + "end": 1551, + "name": "AND" + }, + { + "begin": 1546, + "end": 1551, + "name": "SWAP2" + }, + { + "begin": 1546, + "end": 1551, + "name": "AND" + }, + { + "begin": 1532, + "end": 1551, + "name": "EQ" + }, + { + "begin": 1524, + "end": 1552, + "name": "PUSH [tag]", + "value": "28" + }, + { + "begin": 1524, + "end": 1552, + "name": "JUMPI" + }, + { + "begin": 1524, + "end": 1552, + "name": "PUSH", + "value": "0" + }, + { + "begin": 1524, + "end": 1552, + "name": "DUP1" + }, + { + "begin": 1524, + "end": 1552, + "name": "REVERT" + }, + { + "begin": 1524, + "end": 1552, + "name": "tag", + "value": "28" + }, + { + "begin": 1524, + "end": 1552, + "name": "JUMPDEST" + }, + { + "begin": 7553, + "end": 7559, + "name": "PUSH", + "value": "0" + }, + { + "begin": 7553, + "end": 7559, + "name": "SLOAD" + }, + { + "begin": 7553, + "end": 7559, + "name": "PUSH", + "value": "10000000000000000000000000000000000000000" + }, + { + "begin": 7553, + "end": 7559, + "name": "SWAP1" + }, + { + "begin": 7553, + "end": 7559, + "name": "DIV" + }, + { + "begin": 7553, + "end": 7559, + "name": "PUSH", + "value": "FF" + }, + { + "begin": 7553, + "end": 7559, + "name": "AND" + }, + { + "begin": 7552, + "end": 7559, + "name": "ISZERO" + }, + { + "begin": 7544, + "end": 7560, + "name": "PUSH [tag]", + "value": "30" + }, + { + "begin": 7544, + "end": 7560, + "name": "JUMPI" + }, + { + "begin": 7544, + "end": 7560, + "name": "PUSH", + "value": "0" + }, + { + "begin": 7544, + "end": 7560, + "name": "DUP1" + }, + { + "begin": 7544, + "end": 7560, + "name": "REVERT" + }, + { + "begin": 7544, + "end": 7560, + "name": "tag", + "value": "30" + }, + { + "begin": 7544, + "end": 7560, + "name": "JUMPDEST" + }, + { + "begin": 7857, + "end": 7863, + "name": "PUSH", + "value": "0" + }, + { + "begin": 7857, + "end": 7870, + "name": "DUP1" + }, + { + "begin": 7857, + "end": 7870, + "name": "SLOAD" + }, + { + "begin": 7857, + "end": 7870, + "name": "PUSH", + "value": "FFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + }, + { + "begin": 7857, + "end": 7870, + "name": "AND" + }, + { + "begin": 7857, + "end": 7870, + "name": "PUSH", + "value": "10000000000000000000000000000000000000000" + }, + { + "begin": 7857, + "end": 7870, + "name": "OR" + }, + { + "begin": 7857, + "end": 7870, + "name": "SWAP1" + }, + { + "begin": 7857, + "end": 7870, + "name": "SSTORE" + }, + { + "begin": 7876, + "end": 7883, + "name": "PUSH", + "value": "6985A02210A168E66602D3235CB6DB0E70F92B3BA4D376A33C0F3D9434BFF625" + }, + { + "begin": 7876, + "end": 7883, + "name": "PUSH", + "value": "40" + }, + { + "begin": 7876, + "end": 7883, + "name": "MLOAD" + }, + { + "begin": 7876, + "end": 7883, + "name": "PUSH", + "value": "40" + }, + { + "begin": 7876, + "end": 7883, + "name": "MLOAD" + }, + { + "begin": 7876, + "end": 7883, + "name": "DUP1" + }, + { + "begin": 7876, + "end": 7883, + "name": "SWAP2" + }, + { + "begin": 7876, + "end": 7883, + "name": "SUB" + }, + { + "begin": 7876, + "end": 7883, + "name": "SWAP1" + }, + { + "begin": 7876, + "end": 7883, + "name": "LOG1" + }, + { + "begin": 7803, + "end": 7888, + "name": "JUMP", + "value": "[out]" + }, + { + "begin": 1188, + "end": 1208, + "name": "tag", + "value": "18" + }, + { + "begin": 1188, + "end": 1208, + "name": "JUMPDEST" + }, + { + "begin": 1188, + "end": 1208, + "name": "PUSH", + "value": "0" + }, + { + "begin": 1188, + "end": 1208, + "name": "SLOAD" + }, + { + "begin": 1188, + "end": 1208, + "name": "PUSH", + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + }, + { + "begin": 1188, + "end": 1208, + "name": "AND" + }, + { + "begin": 1188, + "end": 1208, + "name": "DUP2" + }, + { + "begin": 1188, + "end": 1208, + "name": "JUMP", + "value": "[out]" + }, + { + "begin": 1738, + "end": 1885, + "name": "tag", + "value": "21" + }, + { + "begin": 1738, + "end": 1885, + "name": "JUMPDEST" + }, + { + "begin": 1546, + "end": 1551, + "name": "PUSH", + "value": "0" + }, + { + "begin": 1546, + "end": 1551, + "name": "SLOAD" + }, + { + "begin": 1532, + "end": 1542, + "name": "CALLER" + }, + { + "begin": 1546, + "end": 1551, + "name": "PUSH", + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + }, + { + "begin": 1532, + "end": 1551, + "name": "SWAP1" + }, + { + "begin": 1532, + "end": 1551, + "name": "DUP2" + }, + { + "begin": 1532, + "end": 1551, + "name": "AND" + }, + { + "begin": 1546, + "end": 1551, + "name": "SWAP2" + }, + { + "begin": 1546, + "end": 1551, + "name": "AND" + }, + { + "begin": 1532, + "end": 1551, + "name": "EQ" + }, + { + "begin": 1524, + "end": 1552, + "name": "PUSH [tag]", + "value": "33" + }, + { + "begin": 1524, + "end": 1552, + "name": "JUMPI" + }, + { + "begin": 1524, + "end": 1552, + "name": "PUSH", + "value": "0" + }, + { + "begin": 1524, + "end": 1552, + "name": "DUP1" + }, + { + "begin": 1524, + "end": 1552, + "name": "REVERT" + }, + { + "begin": 1524, + "end": 1552, + "name": "tag", + "value": "33" + }, + { + "begin": 1524, + "end": 1552, + "name": "JUMPDEST" + }, + { + "begin": 1814, + "end": 1836, + "name": "PUSH", + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + }, + { + "begin": 1814, + "end": 1836, + "name": "DUP2" + }, + { + "begin": 1814, + "end": 1836, + "name": "AND" + }, + { + "begin": 1814, + "end": 1836, + "name": "ISZERO" + }, + { + "begin": 1810, + "end": 1879, + "name": "PUSH [tag]", + "value": "35" + }, + { + "begin": 1810, + "end": 1879, + "name": "JUMPI" + }, + { + "begin": 1852, + "end": 1857, + "name": "PUSH", + "value": "0" + }, + { + "begin": 1852, + "end": 1868, + "name": "DUP1" + }, + { + "begin": 1852, + "end": 1868, + "name": "SLOAD" + }, + { + "begin": 1852, + "end": 1868, + "name": "PUSH", + "value": "FFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000" + }, + { + "begin": 1852, + "end": 1868, + "name": "AND" + }, + { + "begin": 1852, + "end": 1868, + "name": "PUSH", + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + }, + { + "begin": 1852, + "end": 1868, + "name": "DUP4" + }, + { + "begin": 1852, + "end": 1868, + "name": "AND" + }, + { + "begin": 1852, + "end": 1868, + "name": "OR" + }, + { + "begin": 1852, + "end": 1868, + "name": "SWAP1" + }, + { + "begin": 1852, + "end": 1868, + "name": "SSTORE" + }, + { + "begin": 1810, + "end": 1879, + "name": "tag", + "value": "35" + }, + { + "begin": 1810, + "end": 1879, + "name": "JUMPDEST" + }, + { + "begin": 1738, + "end": 1885, + "name": "POP" + }, + { + "begin": 1738, + "end": 1885, + "name": "JUMP", + "value": "[out]" + } + ] + } + } + }, + "methodIdentifiers": { + "owner()": "8da5cb5b", + "pause()": "8456cb59", + "paused()": "5c975abb", + "transferOwnership(address)": "f2fde38b", + "unpause()": "3f4ba83a" + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.4.18+commit.9cf6e910\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"constant\":false,\"inputs\":[],\"name\":\"unpause\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"paused\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"pause\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"Pause\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"Unpause\",\"type\":\"event\"}],\"devdoc\":{\"methods\":{\"pause()\":{\"details\":\"called by the owner to pause, triggers stopped state\"},\"transferOwnership(address)\":{\"details\":\"Allows the current owner to transfer control of the contract to a newOwner.\",\"params\":{\"newOwner\":\"The address to transfer ownership to.\"}},\"unpause()\":{\"details\":\"called by the owner to unpause, returns to normal state\"}},\"title\":\"Pausable\"},\"userdoc\":{\"methods\":{}}},\"settings\":{\"compilationTarget\":{\"src/Contract.sol\":\"Pausable\"},\"libraries\":{},\"optimizer\":{\"enabled\":true,\"runs\":1000000},\"remappings\":[\":src/=src/\"]},\"sources\":{\"src/Contract.sol\":{\"keccak256\":\"0x3e0d611f53491f313ae035797ed7ecfd1dfd8db8fef8f82737e6f0cd86d71de7\",\"urls\":[\"bzzr://9c33025fa9d1b8389e4c7c9534a1d70fad91c6c2ad70eb5e4b7dc3a701a5f892\"]}},\"version\":1}", + "userdoc": { + "methods": {} + } + }, + "SafeMath": { + "abi": [], + "devdoc": { + "methods": {}, + "title": "SafeMath" + }, + "evm": { + "assembly": " /* \"src/Contract.sol\":183:973 library SafeMath {... */\n mstore(0x40, 0x60)\n jumpi(tag_1, iszero(callvalue))\n 0x0\n dup1\n revert\ntag_1:\n dataSize(sub_0)\n dup1\n dataOffset(sub_0)\n 0x0\n codecopy\n 0x0\n return\nstop\n\nsub_0: assembly {\n /* \"src/Contract.sol\":183:973 library SafeMath {... */\n mstore(0x40, 0x60)\n 0x0\n dup1\n revert\n\n auxdata: 0xa165627a7a723058208676802f00cec3d9fa1405b82d7c8e5a9d71b9518ae049545240c1777a6e8e790029\n}\n", + "bytecode": { + "linkReferences": {}, + "object": "60606040523415600e57600080fd5b603580601b6000396000f3006060604052600080fd00a165627a7a723058208676802f00cec3d9fa1405b82d7c8e5a9d71b9518ae049545240c1777a6e8e790029", + "opcodes": "PUSH1 0x60 PUSH1 0x40 MSTORE CALLVALUE ISZERO PUSH1 0xE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x35 DUP1 PUSH1 0x1B PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN STOP PUSH1 0x60 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 DUP7 PUSH23 0x802F00CEC3D9FA1405B82D7C8E5A9D71B9518AE0495452 BLOCKHASH 0xc1 PUSH24 0x7A6E8E790029000000000000000000000000000000000000 ", + "sourceMap": "183:790:0:-;;;;;;;;;;;;;;;;;" + }, + "deployedBytecode": { + "linkReferences": {}, + "object": "6060604052600080fd00a165627a7a723058208676802f00cec3d9fa1405b82d7c8e5a9d71b9518ae049545240c1777a6e8e790029", + "opcodes": "PUSH1 0x60 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 DUP7 PUSH23 0x802F00CEC3D9FA1405B82D7C8E5A9D71B9518AE0495452 BLOCKHASH 0xc1 PUSH24 0x7A6E8E790029000000000000000000000000000000000000 ", + "sourceMap": "183:790:0:-;;;;;" + }, + "gasEstimates": { + "creation": { + "codeDepositCost": "10600", + "executionCost": "61", + "totalCost": "10661" + }, + "internal": { + "add(uint256,uint256)": "infinite", + "div(uint256,uint256)": "infinite", + "mul(uint256,uint256)": "infinite", + "sub(uint256,uint256)": "infinite" + } + }, + "legacyAssembly": { + ".code": [ + { + "begin": 183, + "end": 973, + "name": "PUSH", + "value": "60" + }, + { + "begin": 183, + "end": 973, + "name": "PUSH", + "value": "40" + }, + { + "begin": 183, + "end": 973, + "name": "MSTORE" + }, + { + "begin": 183, + "end": 973, + "name": "CALLVALUE" + }, + { + "begin": 183, + "end": 973, + "name": "ISZERO" + }, + { + "begin": 183, + "end": 973, + "name": "PUSH [tag]", + "value": "1" + }, + { + "begin": 183, + "end": 973, + "name": "JUMPI" + }, + { + "begin": 183, + "end": 973, + "name": "PUSH", + "value": "0" + }, + { + "begin": 183, + "end": 973, + "name": "DUP1" + }, + { + "begin": 183, + "end": 973, + "name": "REVERT" + }, + { + "begin": 183, + "end": 973, + "name": "tag", + "value": "1" + }, + { + "begin": 183, + "end": 973, + "name": "JUMPDEST" + }, + { + "begin": 183, + "end": 973, + "name": "PUSH #[$]", + "value": "0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "begin": 183, + "end": 973, + "name": "DUP1" + }, + { + "begin": 183, + "end": 973, + "name": "PUSH [$]", + "value": "0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "begin": 183, + "end": 973, + "name": "PUSH", + "value": "0" + }, + { + "begin": 183, + "end": 973, + "name": "CODECOPY" + }, + { + "begin": 183, + "end": 973, + "name": "PUSH", + "value": "0" + }, + { + "begin": 183, + "end": 973, + "name": "RETURN" + } + ], + ".data": { + "0": { + ".auxdata": "a165627a7a723058208676802f00cec3d9fa1405b82d7c8e5a9d71b9518ae049545240c1777a6e8e790029", + ".code": [ + { + "begin": 183, + "end": 973, + "name": "PUSH", + "value": "60" + }, + { + "begin": 183, + "end": 973, + "name": "PUSH", + "value": "40" + }, + { + "begin": 183, + "end": 973, + "name": "MSTORE" + }, + { + "begin": 183, + "end": 973, + "name": "PUSH", + "value": "0" + }, + { + "begin": 183, + "end": 973, + "name": "DUP1" + }, + { + "begin": 183, + "end": 973, + "name": "REVERT" + } + ] + } + } + }, + "methodIdentifiers": {} + }, + "metadata": "{\"compiler\":{\"version\":\"0.4.18+commit.9cf6e910\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"methods\":{},\"title\":\"SafeMath\"},\"userdoc\":{\"methods\":{}}},\"settings\":{\"compilationTarget\":{\"src/Contract.sol\":\"SafeMath\"},\"libraries\":{},\"optimizer\":{\"enabled\":true,\"runs\":1000000},\"remappings\":[\":src/=src/\"]},\"sources\":{\"src/Contract.sol\":{\"keccak256\":\"0x3e0d611f53491f313ae035797ed7ecfd1dfd8db8fef8f82737e6f0cd86d71de7\",\"urls\":[\"bzzr://9c33025fa9d1b8389e4c7c9534a1d70fad91c6c2ad70eb5e4b7dc3a701a5f892\"]}},\"version\":1}", + "userdoc": { + "methods": {} + } + }, + "StandardToken": { + "abi": [ + { + "constant": false, + "inputs": [ + { + "name": "_spender", + "type": "address" + }, + { + "name": "_value", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_from", + "type": "address" + }, + { + "name": "_to", + "type": "address" + }, + { + "name": "_value", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "", + "type": "address" + } + ], + "name": "balances", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "maximumFee", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "_totalSupply", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "", + "type": "address" + }, + { + "name": "", + "type": "address" + } + ], + "name": "allowed", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "_owner", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "name": "balance", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "owner", + "outputs": [ + { + "name": "", + "type": "address" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_to", + "type": "address" + }, + { + "name": "_value", + "type": "uint256" + } + ], + "name": "transfer", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "_owner", + "type": "address" + }, + { + "name": "_spender", + "type": "address" + } + ], + "name": "allowance", + "outputs": [ + { + "name": "remaining", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "basisPointsRate", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "MAX_UINT", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "name": "spender", + "type": "address" + }, + { + "indexed": false, + "name": "value", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "from", + "type": "address" + }, + { + "indexed": true, + "name": "to", + "type": "address" + }, + { + "indexed": false, + "name": "value", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + } + ], + "devdoc": { + "methods": { + "allowance(address,address)": { + "details": "Function to check the amount of tokens than an owner allowed to a spender.", + "params": { + "_owner": "address The address which owns the funds.", + "_spender": "address The address which will spend the funds." + }, + "return": "A uint specifying the amount of tokens still available for the spender." + }, + "approve(address,uint256)": { + "details": "Approve the passed address to spend the specified amount of tokens on behalf of msg.sender.", + "params": { + "_spender": "The address which will spend the funds.", + "_value": "The amount of tokens to be spent." + } + }, + "balanceOf(address)": { + "details": "Gets the balance of the specified address.", + "params": { + "_owner": "The address to query the the balance of." + }, + "return": "An uint representing the amount owned by the passed address." + }, + "transfer(address,uint256)": { + "details": "transfer token for a specified address", + "params": { + "_to": "The address to transfer to.", + "_value": "The amount to be transferred." + } + }, + "transferFrom(address,address,uint256)": { + "details": "Transfer tokens from one address to another", + "params": { + "_from": "address The address which you want to send tokens from", + "_to": "address The address which you want to transfer to", + "_value": "uint the amount of tokens to be transferred" + } + }, + "transferOwnership(address)": { + "details": "Allows the current owner to transfer control of the contract to a newOwner.", + "params": { + "newOwner": "The address to transfer ownership to." + } + } + }, + "title": "Standard ERC20 token" + }, + "evm": { + "assembly": "", + "bytecode": { + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "deployedBytecode": { + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "gasEstimates": null, + "legacyAssembly": null, + "methodIdentifiers": { + "MAX_UINT()": "e5b5019a", + "_totalSupply()": "3eaaf86b", + "allowance(address,address)": "dd62ed3e", + "allowed(address,address)": "5c658165", + "approve(address,uint256)": "095ea7b3", + "balanceOf(address)": "70a08231", + "balances(address)": "27e235e3", + "basisPointsRate()": "dd644f72", + "maximumFee()": "35390714", + "owner()": "8da5cb5b", + "totalSupply()": "18160ddd", + "transfer(address,uint256)": "a9059cbb", + "transferFrom(address,address,uint256)": "23b872dd", + "transferOwnership(address)": "f2fde38b" + } + }, + "metadata": "", + "userdoc": { + "methods": {} + } + }, + "TetherToken": { + "abi": [ + { + "constant": true, + "inputs": [], + "name": "name", + "outputs": [ + { + "name": "", + "type": "string" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_upgradedAddress", + "type": "address" + } + ], + "name": "deprecate", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_spender", + "type": "address" + }, + { + "name": "_value", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "deprecated", + "outputs": [ + { + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_evilUser", + "type": "address" + } + ], + "name": "addBlackList", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_from", + "type": "address" + }, + { + "name": "_to", + "type": "address" + }, + { + "name": "_value", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "upgradedAddress", + "outputs": [ + { + "name": "", + "type": "address" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "", + "type": "address" + } + ], + "name": "balances", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "decimals", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "maximumFee", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "_totalSupply", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [], + "name": "unpause", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "_maker", + "type": "address" + } + ], + "name": "getBlackListStatus", + "outputs": [ + { + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "", + "type": "address" + }, + { + "name": "", + "type": "address" + } + ], + "name": "allowed", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "paused", + "outputs": [ + { + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "who", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [], + "name": "pause", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "getOwner", + "outputs": [ + { + "name": "", + "type": "address" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "owner", + "outputs": [ + { + "name": "", + "type": "address" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "symbol", + "outputs": [ + { + "name": "", + "type": "string" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_to", + "type": "address" + }, + { + "name": "_value", + "type": "uint256" + } + ], + "name": "transfer", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "newBasisPoints", + "type": "uint256" + }, + { + "name": "newMaxFee", + "type": "uint256" + } + ], + "name": "setParams", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "amount", + "type": "uint256" + } + ], + "name": "issue", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "amount", + "type": "uint256" + } + ], + "name": "redeem", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "_owner", + "type": "address" + }, + { + "name": "_spender", + "type": "address" + } + ], + "name": "allowance", + "outputs": [ + { + "name": "remaining", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "basisPointsRate", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "", + "type": "address" + } + ], + "name": "isBlackListed", + "outputs": [ + { + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_clearedUser", + "type": "address" + } + ], + "name": "removeBlackList", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "MAX_UINT", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_blackListedUser", + "type": "address" + } + ], + "name": "destroyBlackFunds", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "name": "_initialSupply", + "type": "uint256" + }, + { + "name": "_name", + "type": "string" + }, + { + "name": "_symbol", + "type": "string" + }, + { + "name": "_decimals", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "name": "amount", + "type": "uint256" + } + ], + "name": "Issue", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "name": "amount", + "type": "uint256" + } + ], + "name": "Redeem", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "name": "newAddress", + "type": "address" + } + ], + "name": "Deprecate", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "name": "feeBasisPoints", + "type": "uint256" + }, + { + "indexed": false, + "name": "maxFee", + "type": "uint256" + } + ], + "name": "Params", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "name": "_blackListedUser", + "type": "address" + }, + { + "indexed": false, + "name": "_balance", + "type": "uint256" + } + ], + "name": "DestroyedBlackFunds", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "name": "_user", + "type": "address" + } + ], + "name": "AddedBlackList", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "name": "_user", + "type": "address" + } + ], + "name": "RemovedBlackList", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "name": "spender", + "type": "address" + }, + { + "indexed": false, + "name": "value", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "from", + "type": "address" + }, + { + "indexed": true, + "name": "to", + "type": "address" + }, + { + "indexed": false, + "name": "value", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "anonymous": false, + "inputs": [], + "name": "Pause", + "type": "event" + }, + { + "anonymous": false, + "inputs": [], + "name": "Unpause", + "type": "event" + } + ], + "devdoc": { + "methods": { + "pause()": { + "details": "called by the owner to pause, triggers stopped state" + }, + "transferOwnership(address)": { + "details": "Allows the current owner to transfer control of the contract to a newOwner.", + "params": { + "newOwner": "The address to transfer ownership to." + } + }, + "unpause()": { + "details": "called by the owner to unpause, returns to normal state" + } + } + }, + "evm": { + "assembly": " /* \"src/Contract.sol\":9728:14509 contract TetherToken is Pausable, StandardToken, BlackList {... */\n mstore(0x40, 0x60)\n /* \"src/Contract.sol\":7405:7410 false */\n 0x0\n /* \"src/Contract.sol\":7384:7410 bool public paused = false */\n dup1\n sload\n not(mul(0xff, exp(0x2, 0xa0)))\n and\n dup2\n sstore\n /* \"src/Contract.sol\":3041:3072 uint public basisPointsRate = 0 */\n 0x3\n dup2\n swap1\n sstore\n /* \"src/Contract.sol\":3078:3104 uint public maximumFee = 0 */\n 0x4\n sstore\n /* \"src/Contract.sol\":10223:10512 function TetherToken(uint _initialSupply, string _name, string _symbol, uint _decimals) public {... */\n jumpi(tag_1, iszero(callvalue))\n 0x0\n dup1\n revert\ntag_1:\n mload(0x40)\n sub(codesize, bytecodeSize)\n dup1\n bytecodeSize\n dup4\n codecopy\n dup2\n add\n 0x40\n mstore\n dup1\n dup1\n mload\n swap2\n swap1\n 0x20\n add\n dup1\n mload\n dup3\n add\n swap2\n swap1\n 0x20\n add\n dup1\n mload\n dup3\n add\n swap2\n swap1\n 0x20\n add\n dup1\n mload\n /* \"src/Contract.sol\":1378:1383 owner */\n 0x0\n /* \"src/Contract.sol\":1378:1396 owner = msg.sender */\n dup1\n sload\n not(sub(exp(0x2, 0xa0), 0x1))\n and\n /* \"src/Contract.sol\":1386:1396 msg.sender */\n caller\n sub(exp(0x2, 0xa0), 0x1)\n /* \"src/Contract.sol\":1378:1396 owner = msg.sender */\n and\n or\n swap1\n sstore\n 0x1\n /* \"src/Contract.sol\":10328:10357 _totalSupply = _initialSupply */\n dup7\n swap1\n sstore\n /* \"src/Contract.sol\":10223:10512 function TetherToken(uint _initialSupply, string _name, string _symbol, uint _decimals) public {... */\n swap2\n pop\n /* \"src/Contract.sol\":10367:10371 name */\n 0x7\n swap1\n pop\n /* \"src/Contract.sol\":10374:10379 _name */\n dup4\n dup1\n /* \"src/Contract.sol\":10367:10379 name = _name */\n mload\n tag_6\n swap3\n swap2\n 0x20\n add\n swap1\n jump\t// in(tag_7)\ntag_6:\n pop\n /* \"src/Contract.sol\":10389:10395 symbol */\n 0x8\n /* \"src/Contract.sol\":10398:10405 _symbol */\n dup3\n dup1\n /* \"src/Contract.sol\":10389:10405 symbol = _symbol */\n mload\n tag_8\n swap3\n swap2\n 0x20\n add\n swap1\n jump\t// in(tag_7)\ntag_8:\n pop\n /* \"src/Contract.sol\":10415:10423 decimals */\n 0x9\n /* \"src/Contract.sol\":10415:10435 decimals = _decimals */\n sstore\n pop\n pop\n /* \"src/Contract.sol\":10445:10460 balances[owner] */\n 0x0\n /* \"src/Contract.sol\":10454:10459 owner */\n dup1\n sload\n sub(exp(0x2, 0xa0), 0x1)\n and\n /* \"src/Contract.sol\":10445:10460 balances[owner] */\n dup2\n mstore\n /* \"src/Contract.sol\":10445:10453 balances */\n 0x2\n /* \"src/Contract.sol\":10445:10460 balances[owner] */\n 0x20\n mstore\n 0x40\n swap1\n keccak256\n /* \"src/Contract.sol\":10445:10477 balances[owner] = _initialSupply */\n sstore\n /* \"src/Contract.sol\":10487:10497 deprecated */\n 0xa\n /* \"src/Contract.sol\":10487:10505 deprecated = false */\n dup1\n sload\n not(mul(0xff, exp(0x2, 0xa0)))\n and\n swap1\n sstore\n /* \"src/Contract.sol\":9728:14509 contract TetherToken is Pausable, StandardToken, BlackList {... */\n jump(tag_9)\ntag_7:\n dup3\n dup1\n sload\n 0x1\n dup2\n 0x1\n and\n iszero\n 0x100\n mul\n sub\n and\n 0x2\n swap1\n div\n swap1\n 0x0\n mstore\n keccak256(0x0, 0x20)\n swap1\n 0x1f\n add\n 0x20\n swap1\n div\n dup2\n add\n swap3\n dup3\n 0x1f\n lt\n tag_11\n jumpi\n dup1\n mload\n not(0xff)\n and\n dup4\n dup1\n add\n or\n dup6\n sstore\n jump(tag_13)\ntag_11:\n dup3\n dup1\n add\n 0x1\n add\n dup6\n sstore\n dup3\n iszero\n tag_13\n jumpi\n swap2\n dup3\n add\ntag_12:\n dup3\n dup2\n gt\n iszero\n tag_13\n jumpi\n dup3\n mload\n dup3\n sstore\n swap2\n 0x20\n add\n swap2\n swap1\n 0x1\n add\n swap1\n jump(tag_12)\ntag_13:\n pop\n tag_14\n swap3\n swap2\n pop\n jump\t// in(tag_15)\ntag_14:\n pop\n swap1\n jump\t// out\ntag_15:\n tag_16\n swap2\n swap1\ntag_17:\n dup1\n dup3\n gt\n iszero\n tag_14\n jumpi\n 0x0\n dup2\n sstore\n 0x1\n add\n jump(tag_17)\ntag_16:\n swap1\n jump\t// out\ntag_9:\n dataSize(sub_0)\n dup1\n dataOffset(sub_0)\n 0x0\n codecopy\n 0x0\n return\nstop\n\nsub_0: assembly {\n /* \"src/Contract.sol\":9728:14509 contract TetherToken is Pausable, StandardToken, BlackList {... */\n mstore(0x40, 0x60)\n jumpi(tag_1, lt(calldatasize, 0x4))\n and(div(calldataload(0x0), 0x100000000000000000000000000000000000000000000000000000000), 0xffffffff)\n 0x6fdde03\n dup2\n eq\n tag_2\n jumpi\n dup1\n 0x753c30c\n eq\n tag_3\n jumpi\n dup1\n 0x95ea7b3\n eq\n tag_4\n jumpi\n dup1\n 0xe136b19\n eq\n tag_5\n jumpi\n dup1\n 0xecb93c0\n eq\n tag_6\n jumpi\n dup1\n 0x18160ddd\n eq\n tag_7\n jumpi\n dup1\n 0x23b872dd\n eq\n tag_8\n jumpi\n dup1\n 0x26976e3f\n eq\n tag_9\n jumpi\n dup1\n 0x27e235e3\n eq\n tag_10\n jumpi\n dup1\n 0x313ce567\n eq\n tag_11\n jumpi\n dup1\n 0x35390714\n eq\n tag_12\n jumpi\n dup1\n 0x3eaaf86b\n eq\n tag_13\n jumpi\n dup1\n 0x3f4ba83a\n eq\n tag_14\n jumpi\n dup1\n 0x59bf1abe\n eq\n tag_15\n jumpi\n dup1\n 0x5c658165\n eq\n tag_16\n jumpi\n dup1\n 0x5c975abb\n eq\n tag_17\n jumpi\n dup1\n 0x70a08231\n eq\n tag_18\n jumpi\n dup1\n 0x8456cb59\n eq\n tag_19\n jumpi\n dup1\n 0x893d20e8\n eq\n tag_20\n jumpi\n dup1\n 0x8da5cb5b\n eq\n tag_21\n jumpi\n dup1\n 0x95d89b41\n eq\n tag_22\n jumpi\n dup1\n 0xa9059cbb\n eq\n tag_23\n jumpi\n dup1\n 0xc0324c77\n eq\n tag_24\n jumpi\n dup1\n 0xcc872b66\n eq\n tag_25\n jumpi\n dup1\n 0xdb006a75\n eq\n tag_26\n jumpi\n dup1\n 0xdd62ed3e\n eq\n tag_27\n jumpi\n dup1\n 0xdd644f72\n eq\n tag_28\n jumpi\n dup1\n 0xe47d6060\n eq\n tag_29\n jumpi\n dup1\n 0xe4997dc5\n eq\n tag_30\n jumpi\n dup1\n 0xe5b5019a\n eq\n tag_31\n jumpi\n dup1\n 0xf2fde38b\n eq\n tag_32\n jumpi\n dup1\n 0xf3bdc228\n eq\n tag_33\n jumpi\n tag_1:\n 0x0\n dup1\n revert\n /* \"src/Contract.sol\":9794:9812 string public name */\n tag_2:\n jumpi(tag_34, iszero(callvalue))\n 0x0\n dup1\n revert\n tag_34:\n tag_35\n jump(tag_36)\n tag_35:\n mload(0x40)\n 0x20\n dup1\n dup3\n mstore\n dup2\n swap1\n dup2\n add\n dup4\n dup2\n dup2\n mload\n dup2\n mstore\n 0x20\n add\n swap2\n pop\n dup1\n mload\n swap1\n 0x20\n add\n swap1\n dup1\n dup4\n dup4\n /* \"--CODEGEN--\":23:24 */\n 0x0\n /* \"--CODEGEN--\":8:108 */\n tag_37:\n /* \"--CODEGEN--\":33:36 */\n dup4\n /* \"--CODEGEN--\":30:31 */\n dup2\n /* \"--CODEGEN--\":27:29 */\n lt\n /* \"--CODEGEN--\":8:108 */\n iszero\n tag_38\n jumpi\n /* \"--CODEGEN--\":99:100 */\n dup1\n /* \"--CODEGEN--\":94:97 */\n dup3\n /* \"--CODEGEN--\":90:93 */\n add\n /* \"--CODEGEN--\":84:89 */\n mload\n /* \"--CODEGEN--\":71:74 */\n dup4\n dup3\n add\n /* \"--CODEGEN--\":64:70 */\n mstore\n /* \"--CODEGEN--\":52:54 */\n 0x20\n /* \"--CODEGEN--\":45:48 */\n add\n /* \"--CODEGEN--\":8:108 */\n jump(tag_37)\n tag_38:\n /* \"--CODEGEN--\":12:26 */\n pop\n /* \"--CODEGEN--\":3:112 */\n pop\n pop\n pop\n swap1\n pop\n swap1\n dup2\n add\n swap1\n 0x1f\n and\n dup1\n iszero\n tag_40\n jumpi\n dup1\n dup3\n sub\n dup1\n mload\n 0x1\n dup4\n 0x20\n sub\n 0x100\n exp\n sub\n not\n and\n dup2\n mstore\n 0x20\n add\n swap2\n pop\n tag_40:\n pop\n swap3\n pop\n pop\n pop\n mload(0x40)\n dup1\n swap2\n sub\n swap1\n return\n /* \"src/Contract.sol\":12480:12657 function deprecate(address _upgradedAddress) public onlyOwner {... */\n tag_3:\n jumpi(tag_41, iszero(callvalue))\n 0x0\n dup1\n revert\n tag_41:\n tag_42\n and(calldataload(0x4), 0xffffffffffffffffffffffffffffffffffffffff)\n jump(tag_43)\n tag_42:\n stop\n /* \"src/Contract.sol\":11752:12048 function approve(address _spender, uint _value) public onlyPayloadSize(2 * 32) {... */\n tag_4:\n jumpi(tag_44, iszero(callvalue))\n 0x0\n dup1\n revert\n tag_44:\n tag_42\n and(calldataload(0x4), 0xffffffffffffffffffffffffffffffffffffffff)\n calldataload(0x24)\n jump(tag_46)\n /* \"src/Contract.sol\":9906:9928 bool public deprecated */\n tag_5:\n jumpi(tag_47, iszero(callvalue))\n 0x0\n dup1\n revert\n tag_47:\n tag_48\n jump(tag_49)\n tag_48:\n mload(0x40)\n swap1\n iszero\n iszero\n dup2\n mstore\n 0x20\n add\n mload(0x40)\n dup1\n swap2\n sub\n swap1\n return\n /* \"src/Contract.sol\":8505:8647 function addBlackList (address _evilUser) public onlyOwner {... */\n tag_6:\n jumpi(tag_50, iszero(callvalue))\n 0x0\n dup1\n revert\n tag_50:\n tag_42\n and(calldataload(0x4), 0xffffffffffffffffffffffffffffffffffffffff)\n jump(tag_52)\n /* \"src/Contract.sol\":12720:12932 function totalSupply() public constant returns (uint) {... */\n tag_7:\n jumpi(tag_53, iszero(callvalue))\n 0x0\n dup1\n revert\n tag_53:\n tag_54\n jump(tag_55)\n tag_54:\n mload(0x40)\n swap1\n dup2\n mstore\n 0x20\n add\n mload(0x40)\n dup1\n swap2\n sub\n swap1\n return\n /* \"src/Contract.sol\":10995:11350 function transferFrom(address _from, address _to, uint _value) public whenNotPaused {... */\n tag_8:\n jumpi(tag_56, iszero(callvalue))\n 0x0\n dup1\n revert\n tag_56:\n tag_42\n 0xffffffffffffffffffffffffffffffffffffffff\n calldataload(0x4)\n dup2\n and\n swap1\n calldataload(0x24)\n and\n calldataload(0x44)\n jump(tag_58)\n /* \"src/Contract.sol\":9870:9900 address public upgradedAddress */\n tag_9:\n jumpi(tag_59, iszero(callvalue))\n 0x0\n dup1\n revert\n tag_59:\n tag_60\n jump(tag_61)\n tag_60:\n mload(0x40)\n 0xffffffffffffffffffffffffffffffffffffffff\n swap1\n swap2\n and\n dup2\n mstore\n 0x20\n add\n mload(0x40)\n dup1\n swap2\n sub\n swap1\n return\n /* \"src/Contract.sol\":2916:2956 mapping(address => uint) public balances */\n tag_10:\n jumpi(tag_62, iszero(callvalue))\n 0x0\n dup1\n revert\n tag_62:\n tag_54\n and(calldataload(0x4), 0xffffffffffffffffffffffffffffffffffffffff)\n jump(tag_64)\n /* \"src/Contract.sol\":9844:9864 uint public decimals */\n tag_11:\n jumpi(tag_65, iszero(callvalue))\n 0x0\n dup1\n revert\n tag_65:\n tag_54\n jump(tag_67)\n /* \"src/Contract.sol\":3078:3104 uint public maximumFee = 0 */\n tag_12:\n jumpi(tag_68, iszero(callvalue))\n 0x0\n dup1\n revert\n tag_68:\n tag_54\n jump(tag_70)\n /* \"src/Contract.sol\":2043:2067 uint public _totalSupply */\n tag_13:\n jumpi(tag_71, iszero(callvalue))\n 0x0\n dup1\n revert\n tag_71:\n tag_54\n jump(tag_73)\n /* \"src/Contract.sol\":7970:8057 function unpause() onlyOwner whenPaused public {... */\n tag_14:\n jumpi(tag_74, iszero(callvalue))\n 0x0\n dup1\n revert\n tag_74:\n tag_42\n jump(tag_76)\n /* \"src/Contract.sol\":8229:8351 function getBlackListStatus(address _maker) external constant returns (bool) {... */\n tag_15:\n jumpi(tag_77, iszero(callvalue))\n 0x0\n dup1\n revert\n tag_77:\n tag_48\n and(calldataload(0x4), 0xffffffffffffffffffffffffffffffffffffffff)\n jump(tag_79)\n /* \"src/Contract.sol\":4652:4713 mapping (address => mapping (address => uint)) public allowed */\n tag_16:\n jumpi(tag_80, iszero(callvalue))\n 0x0\n dup1\n revert\n tag_80:\n tag_54\n 0xffffffffffffffffffffffffffffffffffffffff\n calldataload(0x4)\n dup2\n and\n swap1\n calldataload(0x24)\n and\n jump(tag_82)\n /* \"src/Contract.sol\":7384:7410 bool public paused = false */\n tag_17:\n jumpi(tag_83, iszero(callvalue))\n 0x0\n dup1\n revert\n tag_83:\n tag_48\n jump(tag_85)\n /* \"src/Contract.sol\":11432:11670 function balanceOf(address who) public constant returns (uint) {... */\n tag_18:\n jumpi(tag_86, iszero(callvalue))\n 0x0\n dup1\n revert\n tag_86:\n tag_54\n and(calldataload(0x4), 0xffffffffffffffffffffffffffffffffffffffff)\n jump(tag_88)\n /* \"src/Contract.sol\":7803:7888 function pause() onlyOwner whenNotPaused public {... */\n tag_19:\n jumpi(tag_89, iszero(callvalue))\n 0x0\n dup1\n revert\n tag_89:\n tag_42\n jump(tag_91)\n /* \"src/Contract.sol\":8357:8442 function getOwner() external constant returns (address) {... */\n tag_20:\n jumpi(tag_92, iszero(callvalue))\n 0x0\n dup1\n revert\n tag_92:\n tag_60\n jump(tag_94)\n /* \"src/Contract.sol\":1188:1208 address public owner */\n tag_21:\n jumpi(tag_95, iszero(callvalue))\n 0x0\n dup1\n revert\n tag_95:\n tag_60\n jump(tag_97)\n /* \"src/Contract.sol\":9818:9838 string public symbol */\n tag_22:\n jumpi(tag_98, iszero(callvalue))\n 0x0\n dup1\n revert\n tag_98:\n tag_35\n jump(tag_100)\n /* \"src/Contract.sol\":10594:10913 function transfer(address _to, uint _value) public whenNotPaused {... */\n tag_23:\n jumpi(tag_105, iszero(callvalue))\n 0x0\n dup1\n revert\n tag_105:\n tag_42\n and(calldataload(0x4), 0xffffffffffffffffffffffffffffffffffffffff)\n calldataload(0x24)\n jump(tag_107)\n /* \"src/Contract.sol\":13809:14187 function setParams(uint newBasisPoints, uint newMaxFee) public onlyOwner {... */\n tag_24:\n jumpi(tag_108, iszero(callvalue))\n 0x0\n dup1\n revert\n tag_108:\n tag_42\n calldataload(0x4)\n calldataload(0x24)\n jump(tag_110)\n /* \"src/Contract.sol\":13090:13349 function issue(uint amount) public onlyOwner {... */\n tag_25:\n jumpi(tag_111, iszero(callvalue))\n 0x0\n dup1\n revert\n tag_111:\n tag_42\n calldataload(0x4)\n jump(tag_113)\n /* \"src/Contract.sol\":13573:13803 function redeem(uint amount) public onlyOwner {... */\n tag_26:\n jumpi(tag_114, iszero(callvalue))\n 0x0\n dup1\n revert\n tag_114:\n tag_42\n calldataload(0x4)\n jump(tag_116)\n /* \"src/Contract.sol\":12130:12417 function allowance(address _owner, address _spender) public constant returns (uint remaining) {... */\n tag_27:\n jumpi(tag_117, iszero(callvalue))\n 0x0\n dup1\n revert\n tag_117:\n tag_54\n 0xffffffffffffffffffffffffffffffffffffffff\n calldataload(0x4)\n dup2\n and\n swap1\n calldataload(0x24)\n and\n jump(tag_119)\n /* \"src/Contract.sol\":3041:3072 uint public basisPointsRate = 0 */\n tag_28:\n jumpi(tag_120, iszero(callvalue))\n 0x0\n dup1\n revert\n tag_120:\n tag_54\n jump(tag_122)\n /* \"src/Contract.sol\":8448:8494 mapping (address => bool) public isBlackListed */\n tag_29:\n jumpi(tag_123, iszero(callvalue))\n 0x0\n dup1\n revert\n tag_123:\n tag_48\n and(calldataload(0x4), 0xffffffffffffffffffffffffffffffffffffffff)\n jump(tag_125)\n /* \"src/Contract.sol\":8653:8810 function removeBlackList (address _clearedUser) public onlyOwner {... */\n tag_30:\n jumpi(tag_126, iszero(callvalue))\n 0x0\n dup1\n revert\n tag_126:\n tag_42\n and(calldataload(0x4), 0xffffffffffffffffffffffffffffffffffffffff)\n jump(tag_128)\n /* \"src/Contract.sol\":4720:4762 uint public constant MAX_UINT = 2**256 - 1 */\n tag_31:\n jumpi(tag_129, iszero(callvalue))\n 0x0\n dup1\n revert\n tag_129:\n tag_54\n jump(tag_131)\n /* \"src/Contract.sol\":1738:1885 function transferOwnership(address newOwner) public onlyOwner {... */\n tag_32:\n jumpi(tag_132, iszero(callvalue))\n 0x0\n dup1\n revert\n tag_132:\n tag_42\n and(calldataload(0x4), 0xffffffffffffffffffffffffffffffffffffffff)\n jump(tag_134)\n /* \"src/Contract.sol\":8816:9134 function destroyBlackFunds (address _blackListedUser) public onlyOwner {... */\n tag_33:\n jumpi(tag_135, iszero(callvalue))\n 0x0\n dup1\n revert\n tag_135:\n tag_42\n and(calldataload(0x4), 0xffffffffffffffffffffffffffffffffffffffff)\n jump(tag_137)\n /* \"src/Contract.sol\":9794:9812 string public name */\n tag_36:\n 0x7\n dup1\n sload\n 0x1\n dup2\n 0x1\n and\n iszero\n 0x100\n mul\n sub\n and\n 0x2\n swap1\n div\n dup1\n 0x1f\n add\n 0x20\n dup1\n swap2\n div\n mul\n 0x20\n add\n mload(0x40)\n swap1\n dup2\n add\n 0x40\n mstore\n dup1\n swap3\n swap2\n swap1\n dup2\n dup2\n mstore\n 0x20\n add\n dup3\n dup1\n sload\n 0x1\n dup2\n 0x1\n and\n iszero\n 0x100\n mul\n sub\n and\n 0x2\n swap1\n div\n dup1\n iszero\n tag_138\n jumpi\n dup1\n 0x1f\n lt\n tag_139\n jumpi\n 0x100\n dup1\n dup4\n sload\n div\n mul\n dup4\n mstore\n swap2\n 0x20\n add\n swap2\n jump(tag_138)\n tag_139:\n dup3\n add\n swap2\n swap1\n 0x0\n mstore\n keccak256(0x0, 0x20)\n swap1\n tag_140:\n dup2\n sload\n dup2\n mstore\n swap1\n 0x1\n add\n swap1\n 0x20\n add\n dup1\n dup4\n gt\n tag_140\n jumpi\n dup3\n swap1\n sub\n 0x1f\n and\n dup3\n add\n swap2\n tag_138:\n pop\n pop\n pop\n pop\n pop\n dup2\n jump\t// out\n /* \"src/Contract.sol\":12480:12657 function deprecate(address _upgradedAddress) public onlyOwner {... */\n tag_43:\n /* \"src/Contract.sol\":1546:1551 owner */\n sload(0x0)\n /* \"src/Contract.sol\":1532:1542 msg.sender */\n caller\n /* \"src/Contract.sol\":1546:1551 owner */\n 0xffffffffffffffffffffffffffffffffffffffff\n /* \"src/Contract.sol\":1532:1551 msg.sender == owner */\n swap1\n dup2\n and\n /* \"src/Contract.sol\":1546:1551 owner */\n swap2\n and\n /* \"src/Contract.sol\":1532:1551 msg.sender == owner */\n eq\n /* \"src/Contract.sol\":1524:1552 require(msg.sender == owner) */\n tag_142\n jumpi\n 0x0\n dup1\n revert\n tag_142:\n /* \"src/Contract.sol\":12552:12562 deprecated */\n 0xa\n /* \"src/Contract.sol\":12552:12569 deprecated = true */\n dup1\n sload\n 0x10000000000000000000000000000000000000000\n 0xffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff\n swap1\n swap2\n and\n or\n /* \"src/Contract.sol\":12579:12613 upgradedAddress = _upgradedAddress */\n 0xffffffffffffffffffffffff0000000000000000000000000000000000000000\n and\n 0xffffffffffffffffffffffffffffffffffffffff\n dup4\n and\n or\n swap1\n sstore\n /* \"src/Contract.sol\":12623:12650 Deprecate(_upgradedAddress) */\n 0xcc358699805e9a8b7f77b522628c7cb9abd07d9efb86b6fb616af1609036a99e\n /* \"src/Contract.sol\":12579:12613 upgradedAddress = _upgradedAddress */\n dup2\n /* \"src/Contract.sol\":12623:12650 Deprecate(_upgradedAddress) */\n mload(0x40)\n 0xffffffffffffffffffffffffffffffffffffffff\n swap1\n swap2\n and\n dup2\n mstore\n 0x20\n add\n mload(0x40)\n dup1\n swap2\n sub\n swap1\n log1\n /* \"src/Contract.sol\":12480:12657 function deprecate(address _upgradedAddress) public onlyOwner {... */\n pop\n jump\t// out\n /* \"src/Contract.sol\":11752:12048 function approve(address _spender, uint _value) public onlyPayloadSize(2 * 32) {... */\n tag_46:\n /* \"src/Contract.sol\":11823:11829 2 * 32 */\n 0x40\n /* \"src/Contract.sol\":3251:3259 size + 4 */\n 0x44\n /* \"src/Contract.sol\":3233:3241 msg.data */\n calldatasize\n /* \"src/Contract.sol\":3233:3259 msg.data.length < size + 4 */\n lt\n /* \"src/Contract.sol\":3231:3260 !(msg.data.length < size + 4) */\n iszero\n /* \"src/Contract.sol\":3223:3261 require(!(msg.data.length < size + 4)) */\n tag_145\n jumpi\n 0x0\n dup1\n revert\n tag_145:\n /* \"src/Contract.sol\":11845:11855 deprecated */\n sload(0xa)\n 0x10000000000000000000000000000000000000000\n swap1\n div\n 0xff\n and\n /* \"src/Contract.sol\":11841:12042 if (deprecated) {... */\n iszero\n tag_147\n jumpi\n /* \"src/Contract.sol\":11900:11915 upgradedAddress */\n and(0xffffffffffffffffffffffffffffffffffffffff, sload(0xa))\n /* \"src/Contract.sol\":11878:11932 UpgradedStandardToken(upgradedAddress).approveByLegacy */\n 0xaee92d33\n /* \"src/Contract.sol\":11933:11943 msg.sender */\n caller\n /* \"src/Contract.sol\":11945:11953 _spender */\n dup6\n /* \"src/Contract.sol\":11955:11961 _value */\n dup6\n /* \"src/Contract.sol\":11878:11962 UpgradedStandardToken(upgradedAddress).approveByLegacy(msg.sender, _spender, _value) */\n mload(0x40)\n 0x100000000000000000000000000000000000000000000000000000000\n 0xffffffff\n dup7\n and\n mul\n dup2\n mstore\n 0xffffffffffffffffffffffffffffffffffffffff\n swap4\n dup5\n and\n 0x4\n dup3\n add\n mstore\n swap2\n swap1\n swap3\n and\n 0x24\n dup3\n add\n mstore\n 0x44\n dup2\n add\n swap2\n swap1\n swap2\n mstore\n 0x64\n add\n 0x0\n mload(0x40)\n dup1\n dup4\n sub\n dup2\n 0x0\n dup8\n dup1\n extcodesize\n iszero\n iszero\n tag_148\n jumpi\n 0x0\n dup1\n revert\n tag_148:\n sub(gas, 0x2c6)\n call\n iszero\n iszero\n tag_149\n jumpi\n 0x0\n dup1\n revert\n tag_149:\n pop\n pop\n pop\n /* \"src/Contract.sol\":11871:11962 return UpgradedStandardToken(upgradedAddress).approveByLegacy(msg.sender, _spender, _value) */\n jump(tag_151)\n /* \"src/Contract.sol\":11841:12042 if (deprecated) {... */\n tag_147:\n /* \"src/Contract.sol\":12000:12031 super.approve(_spender, _value) */\n tag_151\n /* \"src/Contract.sol\":12014:12022 _spender */\n dup4\n /* \"src/Contract.sol\":12024:12030 _value */\n dup4\n /* \"src/Contract.sol\":12000:12013 super.approve */\n tag_152\n /* \"src/Contract.sol\":12000:12031 super.approve(_spender, _value) */\n jump\t// in\n tag_151:\n /* \"src/Contract.sol\":11752:12048 function approve(address _spender, uint _value) public onlyPayloadSize(2 * 32) {... */\n pop\n pop\n pop\n jump\t// out\n /* \"src/Contract.sol\":9906:9928 bool public deprecated */\n tag_49:\n sload(0xa)\n 0x10000000000000000000000000000000000000000\n swap1\n div\n 0xff\n and\n dup2\n jump\t// out\n /* \"src/Contract.sol\":8505:8647 function addBlackList (address _evilUser) public onlyOwner {... */\n tag_52:\n /* \"src/Contract.sol\":1546:1551 owner */\n sload(0x0)\n /* \"src/Contract.sol\":1532:1542 msg.sender */\n caller\n /* \"src/Contract.sol\":1546:1551 owner */\n 0xffffffffffffffffffffffffffffffffffffffff\n /* \"src/Contract.sol\":1532:1551 msg.sender == owner */\n swap1\n dup2\n and\n /* \"src/Contract.sol\":1546:1551 owner */\n swap2\n and\n /* \"src/Contract.sol\":1532:1551 msg.sender == owner */\n eq\n /* \"src/Contract.sol\":1524:1552 require(msg.sender == owner) */\n tag_154\n jumpi\n 0x0\n dup1\n revert\n tag_154:\n /* \"src/Contract.sol\":8574:8598 isBlackListed[_evilUser] */\n 0xffffffffffffffffffffffffffffffffffffffff\n dup2\n and\n 0x0\n swap1\n dup2\n mstore\n /* \"src/Contract.sol\":8574:8587 isBlackListed */\n 0x6\n /* \"src/Contract.sol\":8574:8598 isBlackListed[_evilUser] */\n 0x20\n mstore\n 0x40\n swap1\n dup2\n swap1\n keccak256\n /* \"src/Contract.sol\":8574:8605 isBlackListed[_evilUser] = true */\n dup1\n sload\n 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00\n and\n /* \"src/Contract.sol\":8601:8605 true */\n 0x1\n /* \"src/Contract.sol\":8574:8605 isBlackListed[_evilUser] = true */\n or\n swap1\n sstore\n /* \"src/Contract.sol\":8615:8640 AddedBlackList(_evilUser) */\n 0x42e160154868087d6bfdc0ca23d96a1c1cfa32f1b72ba9ba27b69b98a0d819dc\n swap1\n /* \"src/Contract.sol\":8588:8597 _evilUser */\n dup3\n swap1\n /* \"src/Contract.sol\":8615:8640 AddedBlackList(_evilUser) */\n mload\n 0xffffffffffffffffffffffffffffffffffffffff\n swap1\n swap2\n and\n dup2\n mstore\n 0x20\n add\n mload(0x40)\n dup1\n swap2\n sub\n swap1\n log1\n /* \"src/Contract.sol\":8505:8647 function addBlackList (address _evilUser) public onlyOwner {... */\n pop\n jump\t// out\n /* \"src/Contract.sol\":12720:12932 function totalSupply() public constant returns (uint) {... */\n tag_55:\n /* \"src/Contract.sol\":12788:12798 deprecated */\n sload(0xa)\n /* \"src/Contract.sol\":12768:12772 uint */\n 0x0\n swap1\n /* \"src/Contract.sol\":12788:12798 deprecated */\n 0x10000000000000000000000000000000000000000\n swap1\n div\n 0xff\n and\n /* \"src/Contract.sol\":12784:12926 if (deprecated) {... */\n iszero\n tag_157\n jumpi\n /* \"src/Contract.sol\":12835:12850 upgradedAddress */\n and(0xffffffffffffffffffffffffffffffffffffffff, sload(0xa))\n /* \"src/Contract.sol\":12821:12863 StandardToken(upgradedAddress).totalSupply */\n 0x18160ddd\n /* \"src/Contract.sol\":12835:12850 upgradedAddress */\n 0x0\n /* \"src/Contract.sol\":12821:12865 StandardToken(upgradedAddress).totalSupply() */\n add(0x20, mload(0x40))\n mstore\n mload(0x40)\n dup2\n 0xffffffff\n and\n 0x100000000000000000000000000000000000000000000000000000000\n mul\n dup2\n mstore\n 0x4\n add\n 0x20\n mload(0x40)\n dup1\n dup4\n sub\n dup2\n 0x0\n dup8\n dup1\n extcodesize\n iszero\n iszero\n tag_158\n jumpi\n 0x0\n dup1\n revert\n tag_158:\n sub(gas, 0x2c6)\n call\n iszero\n iszero\n tag_159\n jumpi\n 0x0\n dup1\n revert\n tag_159:\n pop\n pop\n pop\n mload(0x40)\n dup1\n mload\n swap1\n pop\n /* \"src/Contract.sol\":12814:12865 return StandardToken(upgradedAddress).totalSupply() */\n swap1\n pop\n jump(tag_160)\n /* \"src/Contract.sol\":12784:12926 if (deprecated) {... */\n tag_157:\n pop\n /* \"src/Contract.sol\":12903:12915 _totalSupply */\n sload(0x1)\n /* \"src/Contract.sol\":12784:12926 if (deprecated) {... */\n tag_160:\n /* \"src/Contract.sol\":12720:12932 function totalSupply() public constant returns (uint) {... */\n swap1\n jump\t// out\n /* \"src/Contract.sol\":10995:11350 function transferFrom(address _from, address _to, uint _value) public whenNotPaused {... */\n tag_58:\n /* \"src/Contract.sol\":7553:7559 paused */\n sload(0x0)\n 0x10000000000000000000000000000000000000000\n swap1\n div\n 0xff\n and\n /* \"src/Contract.sol\":7552:7559 !paused */\n iszero\n /* \"src/Contract.sol\":7544:7560 require(!paused) */\n tag_162\n jumpi\n 0x0\n dup1\n revert\n tag_162:\n /* \"src/Contract.sol\":11098:11118 isBlackListed[_from] */\n 0xffffffffffffffffffffffffffffffffffffffff\n dup4\n and\n 0x0\n swap1\n dup2\n mstore\n /* \"src/Contract.sol\":11098:11111 isBlackListed */\n 0x6\n /* \"src/Contract.sol\":11098:11118 isBlackListed[_from] */\n 0x20\n mstore\n 0x40\n swap1\n keccak256\n sload\n 0xff\n and\n /* \"src/Contract.sol\":11097:11118 !isBlackListed[_from] */\n iszero\n /* \"src/Contract.sol\":11089:11119 require(!isBlackListed[_from]) */\n tag_164\n jumpi\n 0x0\n dup1\n revert\n tag_164:\n /* \"src/Contract.sol\":11133:11143 deprecated */\n sload(0xa)\n 0x10000000000000000000000000000000000000000\n swap1\n div\n 0xff\n and\n /* \"src/Contract.sol\":11129:11344 if (deprecated) {... */\n iszero\n tag_165\n jumpi\n /* \"src/Contract.sol\":11188:11203 upgradedAddress */\n and(0xffffffffffffffffffffffffffffffffffffffff, sload(0xa))\n /* \"src/Contract.sol\":11166:11225 UpgradedStandardToken(upgradedAddress).transferFromByLegacy */\n 0x8b477adb\n /* \"src/Contract.sol\":11226:11236 msg.sender */\n caller\n /* \"src/Contract.sol\":11238:11243 _from */\n dup6\n /* \"src/Contract.sol\":11245:11248 _to */\n dup6\n /* \"src/Contract.sol\":11250:11256 _value */\n dup6\n /* \"src/Contract.sol\":11166:11257 UpgradedStandardToken(upgradedAddress).transferFromByLegacy(msg.sender, _from, _to, _value) */\n mload(0x40)\n 0x100000000000000000000000000000000000000000000000000000000\n 0xffffffff\n dup8\n and\n mul\n dup2\n mstore\n 0xffffffffffffffffffffffffffffffffffffffff\n swap5\n dup6\n and\n 0x4\n dup3\n add\n mstore\n swap3\n dup5\n and\n 0x24\n dup5\n add\n mstore\n swap3\n and\n 0x44\n dup3\n add\n mstore\n 0x64\n dup2\n add\n swap2\n swap1\n swap2\n mstore\n 0x84\n add\n 0x0\n mload(0x40)\n dup1\n dup4\n sub\n dup2\n 0x0\n dup8\n dup1\n extcodesize\n iszero\n iszero\n tag_148\n jumpi\n 0x0\n dup1\n revert\n /* \"src/Contract.sol\":11129:11344 if (deprecated) {... */\n tag_165:\n /* \"src/Contract.sol\":11295:11333 super.transferFrom(_from, _to, _value) */\n tag_151\n /* \"src/Contract.sol\":11314:11319 _from */\n dup4\n /* \"src/Contract.sol\":11321:11324 _to */\n dup4\n /* \"src/Contract.sol\":11326:11332 _value */\n dup4\n /* \"src/Contract.sol\":11295:11313 super.transferFrom */\n tag_170\n /* \"src/Contract.sol\":11295:11333 super.transferFrom(_from, _to, _value) */\n jump\t// in\n /* \"src/Contract.sol\":9870:9900 address public upgradedAddress */\n tag_61:\n and(0xffffffffffffffffffffffffffffffffffffffff, sload(0xa))\n dup2\n jump\t// out\n /* \"src/Contract.sol\":2916:2956 mapping(address => uint) public balances */\n tag_64:\n mstore(0x20, 0x2)\n 0x0\n swap1\n dup2\n mstore\n 0x40\n swap1\n keccak256\n sload\n dup2\n jump\t// out\n /* \"src/Contract.sol\":9844:9864 uint public decimals */\n tag_67:\n sload(0x9)\n dup2\n jump\t// out\n /* \"src/Contract.sol\":3078:3104 uint public maximumFee = 0 */\n tag_70:\n sload(0x4)\n dup2\n jump\t// out\n /* \"src/Contract.sol\":2043:2067 uint public _totalSupply */\n tag_73:\n sload(0x1)\n dup2\n jump\t// out\n /* \"src/Contract.sol\":7970:8057 function unpause() onlyOwner whenPaused public {... */\n tag_76:\n /* \"src/Contract.sol\":1546:1551 owner */\n sload(0x0)\n /* \"src/Contract.sol\":1532:1542 msg.sender */\n caller\n /* \"src/Contract.sol\":1546:1551 owner */\n 0xffffffffffffffffffffffffffffffffffffffff\n /* \"src/Contract.sol\":1532:1551 msg.sender == owner */\n swap1\n dup2\n and\n /* \"src/Contract.sol\":1546:1551 owner */\n swap2\n and\n /* \"src/Contract.sol\":1532:1551 msg.sender == owner */\n eq\n /* \"src/Contract.sol\":1524:1552 require(msg.sender == owner) */\n tag_172\n jumpi\n 0x0\n dup1\n revert\n tag_172:\n /* \"src/Contract.sol\":7705:7711 paused */\n sload(0x0)\n 0x10000000000000000000000000000000000000000\n swap1\n div\n 0xff\n and\n /* \"src/Contract.sol\":7697:7712 require(paused) */\n iszero\n iszero\n tag_174\n jumpi\n 0x0\n dup1\n revert\n tag_174:\n /* \"src/Contract.sol\":8032:8037 false */\n 0x0\n /* \"src/Contract.sol\":8023:8037 paused = false */\n dup1\n sload\n 0xffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff\n and\n swap1\n sstore\n /* \"src/Contract.sol\":8043:8052 Unpause() */\n 0x7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b33\n mload(0x40)\n mload(0x40)\n dup1\n swap2\n sub\n swap1\n log1\n /* \"src/Contract.sol\":7970:8057 function unpause() onlyOwner whenPaused public {... */\n jump\t// out\n /* \"src/Contract.sol\":8229:8351 function getBlackListStatus(address _maker) external constant returns (bool) {... */\n tag_79:\n /* \"src/Contract.sol\":8323:8344 isBlackListed[_maker] */\n 0xffffffffffffffffffffffffffffffffffffffff\n dup2\n and\n /* \"src/Contract.sol\":8300:8304 bool */\n 0x0\n /* \"src/Contract.sol\":8323:8344 isBlackListed[_maker] */\n swap1\n dup2\n mstore\n /* \"src/Contract.sol\":8323:8336 isBlackListed */\n 0x6\n /* \"src/Contract.sol\":8323:8344 isBlackListed[_maker] */\n 0x20\n mstore\n 0x40\n swap1\n keccak256\n sload\n 0xff\n and\n /* \"src/Contract.sol\":8229:8351 function getBlackListStatus(address _maker) external constant returns (bool) {... */\n tag_176:\n swap2\n swap1\n pop\n jump\t// out\n /* \"src/Contract.sol\":4652:4713 mapping (address => mapping (address => uint)) public allowed */\n tag_82:\n 0x5\n 0x20\n swap1\n dup2\n mstore\n 0x0\n swap3\n dup4\n mstore\n 0x40\n dup1\n dup5\n keccak256\n swap1\n swap2\n mstore\n swap1\n dup3\n mstore\n swap1\n keccak256\n sload\n dup2\n jump\t// out\n /* \"src/Contract.sol\":7384:7410 bool public paused = false */\n tag_85:\n sload(0x0)\n 0x10000000000000000000000000000000000000000\n swap1\n div\n 0xff\n and\n dup2\n jump\t// out\n /* \"src/Contract.sol\":11432:11670 function balanceOf(address who) public constant returns (uint) {... */\n tag_88:\n /* \"src/Contract.sol\":11509:11519 deprecated */\n sload(0xa)\n /* \"src/Contract.sol\":11489:11493 uint */\n 0x0\n swap1\n /* \"src/Contract.sol\":11509:11519 deprecated */\n 0x10000000000000000000000000000000000000000\n swap1\n div\n 0xff\n and\n /* \"src/Contract.sol\":11505:11664 if (deprecated) {... */\n iszero\n tag_178\n jumpi\n /* \"src/Contract.sol\":11564:11579 upgradedAddress */\n and(0xffffffffffffffffffffffffffffffffffffffff, sload(0xa))\n /* \"src/Contract.sol\":11542:11590 UpgradedStandardToken(upgradedAddress).balanceOf */\n 0x70a08231\n /* \"src/Contract.sol\":11591:11594 who */\n dup4\n /* \"src/Contract.sol\":11564:11579 upgradedAddress */\n 0x0\n /* \"src/Contract.sol\":11542:11595 UpgradedStandardToken(upgradedAddress).balanceOf(who) */\n add(0x20, mload(0x40))\n mstore\n mload(0x40)\n 0x100000000000000000000000000000000000000000000000000000000\n 0xffffffff\n dup5\n and\n mul\n dup2\n mstore\n 0xffffffffffffffffffffffffffffffffffffffff\n swap1\n swap2\n and\n 0x4\n dup3\n add\n mstore\n 0x24\n add\n 0x20\n mload(0x40)\n dup1\n dup4\n sub\n dup2\n 0x0\n dup8\n dup1\n extcodesize\n iszero\n iszero\n tag_179\n jumpi\n 0x0\n dup1\n revert\n tag_179:\n sub(gas, 0x2c6)\n call\n iszero\n iszero\n tag_180\n jumpi\n 0x0\n dup1\n revert\n tag_180:\n pop\n pop\n pop\n mload(0x40)\n dup1\n mload\n swap1\n pop\n /* \"src/Contract.sol\":11535:11595 return UpgradedStandardToken(upgradedAddress).balanceOf(who) */\n swap1\n pop\n jump(tag_176)\n /* \"src/Contract.sol\":11505:11664 if (deprecated) {... */\n tag_178:\n /* \"src/Contract.sol\":11633:11653 super.balanceOf(who) */\n tag_182\n /* \"src/Contract.sol\":11649:11652 who */\n dup3\n /* \"src/Contract.sol\":11633:11648 super.balanceOf */\n tag_183\n /* \"src/Contract.sol\":11633:11653 super.balanceOf(who) */\n jump\t// in\n tag_182:\n /* \"src/Contract.sol\":11626:11653 return super.balanceOf(who) */\n swap1\n pop\n jump(tag_176)\n /* \"src/Contract.sol\":7803:7888 function pause() onlyOwner whenNotPaused public {... */\n tag_91:\n /* \"src/Contract.sol\":1546:1551 owner */\n sload(0x0)\n /* \"src/Contract.sol\":1532:1542 msg.sender */\n caller\n /* \"src/Contract.sol\":1546:1551 owner */\n 0xffffffffffffffffffffffffffffffffffffffff\n /* \"src/Contract.sol\":1532:1551 msg.sender == owner */\n swap1\n dup2\n and\n /* \"src/Contract.sol\":1546:1551 owner */\n swap2\n and\n /* \"src/Contract.sol\":1532:1551 msg.sender == owner */\n eq\n /* \"src/Contract.sol\":1524:1552 require(msg.sender == owner) */\n tag_185\n jumpi\n 0x0\n dup1\n revert\n tag_185:\n /* \"src/Contract.sol\":7553:7559 paused */\n sload(0x0)\n 0x10000000000000000000000000000000000000000\n swap1\n div\n 0xff\n and\n /* \"src/Contract.sol\":7552:7559 !paused */\n iszero\n /* \"src/Contract.sol\":7544:7560 require(!paused) */\n tag_187\n jumpi\n 0x0\n dup1\n revert\n tag_187:\n /* \"src/Contract.sol\":7857:7863 paused */\n 0x0\n /* \"src/Contract.sol\":7857:7870 paused = true */\n dup1\n sload\n 0xffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff\n and\n 0x10000000000000000000000000000000000000000\n or\n swap1\n sstore\n /* \"src/Contract.sol\":7876:7883 Pause() */\n 0x6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff625\n mload(0x40)\n mload(0x40)\n dup1\n swap2\n sub\n swap1\n log1\n /* \"src/Contract.sol\":7803:7888 function pause() onlyOwner whenNotPaused public {... */\n jump\t// out\n /* \"src/Contract.sol\":8357:8442 function getOwner() external constant returns (address) {... */\n tag_94:\n /* \"src/Contract.sol\":8404:8411 address */\n 0x0\n /* \"src/Contract.sol\":8430:8435 owner */\n sload\n 0xffffffffffffffffffffffffffffffffffffffff\n and\n /* \"src/Contract.sol\":8357:8442 function getOwner() external constant returns (address) {... */\n swap1\n jump\t// out\n /* \"src/Contract.sol\":1188:1208 address public owner */\n tag_97:\n and(0xffffffffffffffffffffffffffffffffffffffff, sload(0x0))\n dup2\n jump\t// out\n /* \"src/Contract.sol\":9818:9838 string public symbol */\n tag_100:\n 0x8\n dup1\n sload\n 0x1\n dup2\n 0x1\n and\n iszero\n 0x100\n mul\n sub\n and\n 0x2\n swap1\n div\n dup1\n 0x1f\n add\n 0x20\n dup1\n swap2\n div\n mul\n 0x20\n add\n mload(0x40)\n swap1\n dup2\n add\n 0x40\n mstore\n dup1\n swap3\n swap2\n swap1\n dup2\n dup2\n mstore\n 0x20\n add\n dup3\n dup1\n sload\n 0x1\n dup2\n 0x1\n and\n iszero\n 0x100\n mul\n sub\n and\n 0x2\n swap1\n div\n dup1\n iszero\n tag_138\n jumpi\n dup1\n 0x1f\n lt\n tag_139\n jumpi\n 0x100\n dup1\n dup4\n sload\n div\n mul\n dup4\n mstore\n swap2\n 0x20\n add\n swap2\n jump(tag_138)\n /* \"src/Contract.sol\":10594:10913 function transfer(address _to, uint _value) public whenNotPaused {... */\n tag_107:\n /* \"src/Contract.sol\":7553:7559 paused */\n sload(0x0)\n 0x10000000000000000000000000000000000000000\n swap1\n div\n 0xff\n and\n /* \"src/Contract.sol\":7552:7559 !paused */\n iszero\n /* \"src/Contract.sol\":7544:7560 require(!paused) */\n tag_194\n jumpi\n 0x0\n dup1\n revert\n tag_194:\n /* \"src/Contract.sol\":10678:10703 isBlackListed[msg.sender] */\n 0xffffffffffffffffffffffffffffffffffffffff\n /* \"src/Contract.sol\":10692:10702 msg.sender */\n caller\n /* \"src/Contract.sol\":10678:10703 isBlackListed[msg.sender] */\n and\n 0x0\n swap1\n dup2\n mstore\n /* \"src/Contract.sol\":10678:10691 isBlackListed */\n 0x6\n /* \"src/Contract.sol\":10678:10703 isBlackListed[msg.sender] */\n 0x20\n mstore\n 0x40\n swap1\n keccak256\n sload\n 0xff\n and\n /* \"src/Contract.sol\":10677:10703 !isBlackListed[msg.sender] */\n iszero\n /* \"src/Contract.sol\":10669:10704 require(!isBlackListed[msg.sender]) */\n tag_196\n jumpi\n 0x0\n dup1\n revert\n tag_196:\n /* \"src/Contract.sol\":10718:10728 deprecated */\n sload(0xa)\n 0x10000000000000000000000000000000000000000\n swap1\n div\n 0xff\n and\n /* \"src/Contract.sol\":10714:10907 if (deprecated) {... */\n iszero\n tag_197\n jumpi\n /* \"src/Contract.sol\":10773:10788 upgradedAddress */\n and(0xffffffffffffffffffffffffffffffffffffffff, sload(0xa))\n /* \"src/Contract.sol\":10751:10806 UpgradedStandardToken(upgradedAddress).transferByLegacy */\n 0x6e18980a\n /* \"src/Contract.sol\":10807:10817 msg.sender */\n caller\n /* \"src/Contract.sol\":10819:10822 _to */\n dup5\n /* \"src/Contract.sol\":10824:10830 _value */\n dup5\n /* \"src/Contract.sol\":10751:10831 UpgradedStandardToken(upgradedAddress).transferByLegacy(msg.sender, _to, _value) */\n mload(0x40)\n 0x100000000000000000000000000000000000000000000000000000000\n 0xffffffff\n dup7\n and\n mul\n dup2\n mstore\n 0xffffffffffffffffffffffffffffffffffffffff\n swap4\n dup5\n and\n 0x4\n dup3\n add\n mstore\n swap2\n swap1\n swap3\n and\n 0x24\n dup3\n add\n mstore\n 0x44\n dup2\n add\n swap2\n swap1\n swap2\n mstore\n 0x64\n add\n 0x0\n mload(0x40)\n dup1\n dup4\n sub\n dup2\n 0x0\n dup8\n dup1\n extcodesize\n iszero\n iszero\n tag_198\n jumpi\n 0x0\n dup1\n revert\n tag_198:\n sub(gas, 0x2c6)\n call\n iszero\n iszero\n tag_199\n jumpi\n 0x0\n dup1\n revert\n tag_199:\n pop\n pop\n pop\n /* \"src/Contract.sol\":10744:10831 return UpgradedStandardToken(upgradedAddress).transferByLegacy(msg.sender, _to, _value) */\n jump(tag_201)\n /* \"src/Contract.sol\":10714:10907 if (deprecated) {... */\n tag_197:\n /* \"src/Contract.sol\":10869:10896 super.transfer(_to, _value) */\n tag_201\n /* \"src/Contract.sol\":10884:10887 _to */\n dup3\n /* \"src/Contract.sol\":10889:10895 _value */\n dup3\n /* \"src/Contract.sol\":10869:10883 super.transfer */\n tag_202\n /* \"src/Contract.sol\":10869:10896 super.transfer(_to, _value) */\n jump\t// in\n tag_201:\n /* \"src/Contract.sol\":10594:10913 function transfer(address _to, uint _value) public whenNotPaused {... */\n pop\n pop\n jump\t// out\n /* \"src/Contract.sol\":13809:14187 function setParams(uint newBasisPoints, uint newMaxFee) public onlyOwner {... */\n tag_110:\n /* \"src/Contract.sol\":1546:1551 owner */\n sload(0x0)\n /* \"src/Contract.sol\":1532:1542 msg.sender */\n caller\n /* \"src/Contract.sol\":1546:1551 owner */\n 0xffffffffffffffffffffffffffffffffffffffff\n /* \"src/Contract.sol\":1532:1551 msg.sender == owner */\n swap1\n dup2\n and\n /* \"src/Contract.sol\":1546:1551 owner */\n swap2\n and\n /* \"src/Contract.sol\":1532:1551 msg.sender == owner */\n eq\n /* \"src/Contract.sol\":1524:1552 require(msg.sender == owner) */\n tag_204\n jumpi\n 0x0\n dup1\n revert\n tag_204:\n /* \"src/Contract.sol\":14005:14007 20 */\n 0x14\n /* \"src/Contract.sol\":13988:14007 newBasisPoints < 20 */\n dup3\n lt\n /* \"src/Contract.sol\":13980:14008 require(newBasisPoints < 20) */\n tag_206\n jumpi\n 0x0\n dup1\n revert\n tag_206:\n /* \"src/Contract.sol\":14038:14040 50 */\n 0x32\n /* \"src/Contract.sol\":14026:14040 newMaxFee < 50 */\n dup2\n lt\n /* \"src/Contract.sol\":14018:14041 require(newMaxFee < 50) */\n tag_207\n jumpi\n 0x0\n dup1\n revert\n tag_207:\n /* \"src/Contract.sol\":14052:14067 basisPointsRate */\n 0x3\n /* \"src/Contract.sol\":14052:14084 basisPointsRate = newBasisPoints */\n dup3\n swap1\n sstore\n /* \"src/Contract.sol\":14125:14133 decimals */\n sload(0x9)\n /* \"src/Contract.sol\":14107:14134 newMaxFee.mul(10**decimals) */\n tag_208\n swap1\n /* \"src/Contract.sol\":14107:14116 newMaxFee */\n dup3\n swap1\n /* \"src/Contract.sol\":14121:14123 10 */\n 0xa\n /* \"src/Contract.sol\":14121:14133 10**decimals */\n exp\n /* \"src/Contract.sol\":14107:14134 newMaxFee.mul(10**decimals) */\n 0xffffffff\n /* \"src/Contract.sol\":14107:14120 newMaxFee.mul */\n tag_209\n /* \"src/Contract.sol\":14107:14134 newMaxFee.mul(10**decimals) */\n and\n jump\t// in\n tag_208:\n /* \"src/Contract.sol\":14094:14104 maximumFee */\n 0x4\n /* \"src/Contract.sol\":14094:14134 maximumFee = newMaxFee.mul(10**decimals) */\n dup2\n swap1\n sstore\n /* \"src/Contract.sol\":14152:14167 basisPointsRate */\n sload(0x3)\n /* \"src/Contract.sol\":14145:14180 Params(basisPointsRate, maximumFee) */\n 0xb044a1e409eac5c48e5af22d4af52670dd1a99059537a78b31b48c6500a6354e\n swap2\n mload(0x40)\n swap2\n dup3\n mstore\n 0x20\n dup3\n add\n mstore\n 0x40\n swap1\n dup2\n add\n swap1\n mload\n dup1\n swap2\n sub\n swap1\n log1\n /* \"src/Contract.sol\":13809:14187 function setParams(uint newBasisPoints, uint newMaxFee) public onlyOwner {... */\n pop\n pop\n jump\t// out\n /* \"src/Contract.sol\":13090:13349 function issue(uint amount) public onlyOwner {... */\n tag_113:\n /* \"src/Contract.sol\":1546:1551 owner */\n sload(0x0)\n /* \"src/Contract.sol\":1532:1542 msg.sender */\n caller\n /* \"src/Contract.sol\":1546:1551 owner */\n 0xffffffffffffffffffffffffffffffffffffffff\n /* \"src/Contract.sol\":1532:1551 msg.sender == owner */\n swap1\n dup2\n and\n /* \"src/Contract.sol\":1546:1551 owner */\n swap2\n and\n /* \"src/Contract.sol\":1532:1551 msg.sender == owner */\n eq\n /* \"src/Contract.sol\":1524:1552 require(msg.sender == owner) */\n tag_211\n jumpi\n 0x0\n dup1\n revert\n tag_211:\n /* \"src/Contract.sol\":13177:13189 _totalSupply */\n sload(0x1)\n /* \"src/Contract.sol\":13153:13174 _totalSupply + amount */\n dup2\n dup2\n add\n /* \"src/Contract.sol\":13153:13189 _totalSupply + amount > _totalSupply */\n gt\n /* \"src/Contract.sol\":13145:13190 require(_totalSupply + amount > _totalSupply) */\n tag_213\n jumpi\n 0x0\n dup1\n revert\n tag_213:\n /* \"src/Contract.sol\":13235:13250 balances[owner] */\n 0x0\n /* \"src/Contract.sol\":13244:13249 owner */\n dup1\n sload\n 0xffffffffffffffffffffffffffffffffffffffff\n and\n /* \"src/Contract.sol\":13235:13250 balances[owner] */\n dup2\n mstore\n /* \"src/Contract.sol\":13235:13243 balances */\n 0x2\n /* \"src/Contract.sol\":13235:13250 balances[owner] */\n 0x20\n mstore\n 0x40\n swap1\n keccak256\n sload\n /* \"src/Contract.sol\":13208:13232 balances[owner] + amount */\n dup2\n dup2\n add\n /* \"src/Contract.sol\":13208:13250 balances[owner] + amount > balances[owner] */\n gt\n /* \"src/Contract.sol\":13200:13251 require(balances[owner] + amount > balances[owner]) */\n tag_214\n jumpi\n 0x0\n dup1\n revert\n tag_214:\n /* \"src/Contract.sol\":13262:13277 balances[owner] */\n 0x0\n /* \"src/Contract.sol\":13271:13276 owner */\n dup1\n sload\n 0xffffffffffffffffffffffffffffffffffffffff\n and\n /* \"src/Contract.sol\":13262:13277 balances[owner] */\n dup2\n mstore\n /* \"src/Contract.sol\":13262:13270 balances */\n 0x2\n /* \"src/Contract.sol\":13262:13277 balances[owner] */\n 0x20\n mstore\n 0x40\n swap1\n dup2\n swap1\n keccak256\n /* \"src/Contract.sol\":13262:13287 balances[owner] += amount */\n dup1\n sload\n dup4\n add\n swap1\n sstore\n /* \"src/Contract.sol\":13271:13276 owner */\n 0x1\n /* \"src/Contract.sol\":13297:13319 _totalSupply += amount */\n dup1\n sload\n dup4\n add\n swap1\n sstore\n /* \"src/Contract.sol\":13329:13342 Issue(amount) */\n 0xcb8241adb0c3fdb35b70c24ce35c5eb0c17af7431c99f827d44a445ca624176a\n swap1\n /* \"src/Contract.sol\":13281:13287 amount */\n dup3\n swap1\n /* \"src/Contract.sol\":13329:13342 Issue(amount) */\n mload\n swap1\n dup2\n mstore\n 0x20\n add\n mload(0x40)\n dup1\n swap2\n sub\n swap1\n log1\n /* \"src/Contract.sol\":13090:13349 function issue(uint amount) public onlyOwner {... */\n pop\n jump\t// out\n /* \"src/Contract.sol\":13573:13803 function redeem(uint amount) public onlyOwner {... */\n tag_116:\n /* \"src/Contract.sol\":1546:1551 owner */\n sload(0x0)\n /* \"src/Contract.sol\":1532:1542 msg.sender */\n caller\n /* \"src/Contract.sol\":1546:1551 owner */\n 0xffffffffffffffffffffffffffffffffffffffff\n /* \"src/Contract.sol\":1532:1551 msg.sender == owner */\n swap1\n dup2\n and\n /* \"src/Contract.sol\":1546:1551 owner */\n swap2\n and\n /* \"src/Contract.sol\":1532:1551 msg.sender == owner */\n eq\n /* \"src/Contract.sol\":1524:1552 require(msg.sender == owner) */\n tag_216\n jumpi\n 0x0\n dup1\n revert\n tag_216:\n /* \"src/Contract.sol\":13637:13649 _totalSupply */\n sload(0x1)\n /* \"src/Contract.sol\":13637:13659 _totalSupply >= amount */\n dup2\n swap1\n lt\n iszero\n /* \"src/Contract.sol\":13629:13660 require(_totalSupply >= amount) */\n tag_218\n jumpi\n 0x0\n dup1\n revert\n tag_218:\n /* \"src/Contract.sol\":13678:13693 balances[owner] */\n 0x0\n /* \"src/Contract.sol\":13687:13692 owner */\n dup1\n sload\n 0xffffffffffffffffffffffffffffffffffffffff\n and\n /* \"src/Contract.sol\":13678:13693 balances[owner] */\n dup2\n mstore\n /* \"src/Contract.sol\":13678:13686 balances */\n 0x2\n /* \"src/Contract.sol\":13678:13693 balances[owner] */\n 0x20\n mstore\n 0x40\n swap1\n keccak256\n sload\n /* \"src/Contract.sol\":13678:13703 balances[owner] >= amount */\n dup2\n swap1\n lt\n iszero\n /* \"src/Contract.sol\":13670:13704 require(balances[owner] >= amount) */\n tag_219\n jumpi\n 0x0\n dup1\n revert\n tag_219:\n /* \"src/Contract.sol\":13715:13727 _totalSupply */\n 0x1\n /* \"src/Contract.sol\":13715:13737 _totalSupply -= amount */\n dup1\n sload\n dup3\n swap1\n sub\n swap1\n sstore\n /* \"src/Contract.sol\":13715:13727 _totalSupply */\n 0x0\n /* \"src/Contract.sol\":13756:13761 owner */\n dup1\n sload\n 0xffffffffffffffffffffffffffffffffffffffff\n and\n /* \"src/Contract.sol\":13747:13762 balances[owner] */\n dup2\n mstore\n /* \"src/Contract.sol\":13747:13755 balances */\n 0x2\n /* \"src/Contract.sol\":13747:13762 balances[owner] */\n 0x20\n mstore\n 0x40\n swap1\n dup2\n swap1\n keccak256\n /* \"src/Contract.sol\":13747:13772 balances[owner] -= amount */\n dup1\n sload\n dup4\n swap1\n sub\n swap1\n sstore\n /* \"src/Contract.sol\":13782:13796 Redeem(amount) */\n 0x702d5967f45f6513a38ffc42d6ba9bf230bd40e8f53b16363c7eb4fd2deb9a44\n swap1\n /* \"src/Contract.sol\":13731:13737 amount */\n dup3\n swap1\n /* \"src/Contract.sol\":13782:13796 Redeem(amount) */\n mload\n swap1\n dup2\n mstore\n 0x20\n add\n mload(0x40)\n dup1\n swap2\n sub\n swap1\n log1\n /* \"src/Contract.sol\":13573:13803 function redeem(uint amount) public onlyOwner {... */\n pop\n jump\t// out\n /* \"src/Contract.sol\":12130:12417 function allowance(address _owner, address _spender) public constant returns (uint remaining) {... */\n tag_119:\n /* \"src/Contract.sol\":12238:12248 deprecated */\n sload(0xa)\n /* \"src/Contract.sol\":12208:12222 uint remaining */\n 0x0\n swap1\n /* \"src/Contract.sol\":12238:12248 deprecated */\n 0x10000000000000000000000000000000000000000\n swap1\n div\n 0xff\n and\n /* \"src/Contract.sol\":12234:12411 if (deprecated) {... */\n iszero\n tag_221\n jumpi\n /* \"src/Contract.sol\":12285:12300 upgradedAddress */\n and(0xffffffffffffffffffffffffffffffffffffffff, sload(0xa))\n /* \"src/Contract.sol\":12271:12311 StandardToken(upgradedAddress).allowance */\n 0xdd62ed3e\n /* \"src/Contract.sol\":12312:12318 _owner */\n dup5\n /* \"src/Contract.sol\":12320:12328 _spender */\n dup5\n /* \"src/Contract.sol\":12285:12300 upgradedAddress */\n 0x0\n /* \"src/Contract.sol\":12271:12329 StandardToken(upgradedAddress).allowance(_owner, _spender) */\n add(0x20, mload(0x40))\n mstore\n mload(0x40)\n 0x100000000000000000000000000000000000000000000000000000000\n 0xffffffff\n dup6\n and\n mul\n dup2\n mstore\n 0xffffffffffffffffffffffffffffffffffffffff\n swap3\n dup4\n and\n 0x4\n dup3\n add\n mstore\n swap2\n and\n 0x24\n dup3\n add\n mstore\n 0x44\n add\n 0x20\n mload(0x40)\n dup1\n dup4\n sub\n dup2\n 0x0\n dup8\n dup1\n extcodesize\n iszero\n iszero\n tag_222\n jumpi\n 0x0\n dup1\n revert\n tag_222:\n sub(gas, 0x2c6)\n call\n iszero\n iszero\n tag_223\n jumpi\n 0x0\n dup1\n revert\n tag_223:\n pop\n pop\n pop\n mload(0x40)\n dup1\n mload\n swap1\n pop\n /* \"src/Contract.sol\":12264:12329 return StandardToken(upgradedAddress).allowance(_owner, _spender) */\n swap1\n pop\n jump(tag_224)\n /* \"src/Contract.sol\":12234:12411 if (deprecated) {... */\n tag_221:\n /* \"src/Contract.sol\":12367:12400 super.allowance(_owner, _spender) */\n tag_225\n /* \"src/Contract.sol\":12383:12389 _owner */\n dup4\n /* \"src/Contract.sol\":12391:12399 _spender */\n dup4\n /* \"src/Contract.sol\":12367:12382 super.allowance */\n tag_226\n /* \"src/Contract.sol\":12367:12400 super.allowance(_owner, _spender) */\n jump\t// in\n tag_225:\n /* \"src/Contract.sol\":12360:12400 return super.allowance(_owner, _spender) */\n swap1\n pop\n /* \"src/Contract.sol\":12234:12411 if (deprecated) {... */\n tag_224:\n /* \"src/Contract.sol\":12130:12417 function allowance(address _owner, address _spender) public constant returns (uint remaining) {... */\n swap3\n swap2\n pop\n pop\n jump\t// out\n /* \"src/Contract.sol\":3041:3072 uint public basisPointsRate = 0 */\n tag_122:\n sload(0x3)\n dup2\n jump\t// out\n /* \"src/Contract.sol\":8448:8494 mapping (address => bool) public isBlackListed */\n tag_125:\n mstore(0x20, 0x6)\n 0x0\n swap1\n dup2\n mstore\n 0x40\n swap1\n keccak256\n sload\n 0xff\n and\n dup2\n jump\t// out\n /* \"src/Contract.sol\":8653:8810 function removeBlackList (address _clearedUser) public onlyOwner {... */\n tag_128:\n /* \"src/Contract.sol\":1546:1551 owner */\n sload(0x0)\n /* \"src/Contract.sol\":1532:1542 msg.sender */\n caller\n /* \"src/Contract.sol\":1546:1551 owner */\n 0xffffffffffffffffffffffffffffffffffffffff\n /* \"src/Contract.sol\":1532:1551 msg.sender == owner */\n swap1\n dup2\n and\n /* \"src/Contract.sol\":1546:1551 owner */\n swap2\n and\n /* \"src/Contract.sol\":1532:1551 msg.sender == owner */\n eq\n /* \"src/Contract.sol\":1524:1552 require(msg.sender == owner) */\n tag_228\n jumpi\n 0x0\n dup1\n revert\n tag_228:\n /* \"src/Contract.sol\":8728:8755 isBlackListed[_clearedUser] */\n 0xffffffffffffffffffffffffffffffffffffffff\n dup2\n and\n /* \"src/Contract.sol\":8758:8763 false */\n 0x0\n /* \"src/Contract.sol\":8728:8755 isBlackListed[_clearedUser] */\n swap1\n dup2\n mstore\n /* \"src/Contract.sol\":8728:8741 isBlackListed */\n 0x6\n /* \"src/Contract.sol\":8728:8755 isBlackListed[_clearedUser] */\n 0x20\n mstore\n 0x40\n swap1\n dup2\n swap1\n keccak256\n /* \"src/Contract.sol\":8728:8763 isBlackListed[_clearedUser] = false */\n dup1\n sload\n 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00\n and\n swap1\n sstore\n /* \"src/Contract.sol\":8773:8803 RemovedBlackList(_clearedUser) */\n 0xd7e9ec6e6ecd65492dce6bf513cd6867560d49544421d0783ddf06e76c24470c\n swap1\n /* \"src/Contract.sol\":8742:8754 _clearedUser */\n dup3\n swap1\n /* \"src/Contract.sol\":8773:8803 RemovedBlackList(_clearedUser) */\n mload\n 0xffffffffffffffffffffffffffffffffffffffff\n swap1\n swap2\n and\n dup2\n mstore\n 0x20\n add\n mload(0x40)\n dup1\n swap2\n sub\n swap1\n log1\n /* \"src/Contract.sol\":8653:8810 function removeBlackList (address _clearedUser) public onlyOwner {... */\n pop\n jump\t// out\n /* \"src/Contract.sol\":4720:4762 uint public constant MAX_UINT = 2**256 - 1 */\n tag_131:\n /* \"src/Contract.sol\":4752:4762 2**256 - 1 */\n 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\n /* \"src/Contract.sol\":4720:4762 uint public constant MAX_UINT = 2**256 - 1 */\n dup2\n jump\t// out\n /* \"src/Contract.sol\":1738:1885 function transferOwnership(address newOwner) public onlyOwner {... */\n tag_134:\n /* \"src/Contract.sol\":1546:1551 owner */\n sload(0x0)\n /* \"src/Contract.sol\":1532:1542 msg.sender */\n caller\n /* \"src/Contract.sol\":1546:1551 owner */\n 0xffffffffffffffffffffffffffffffffffffffff\n /* \"src/Contract.sol\":1532:1551 msg.sender == owner */\n swap1\n dup2\n and\n /* \"src/Contract.sol\":1546:1551 owner */\n swap2\n and\n /* \"src/Contract.sol\":1532:1551 msg.sender == owner */\n eq\n /* \"src/Contract.sol\":1524:1552 require(msg.sender == owner) */\n tag_231\n jumpi\n 0x0\n dup1\n revert\n tag_231:\n /* \"src/Contract.sol\":1814:1836 newOwner != address(0) */\n 0xffffffffffffffffffffffffffffffffffffffff\n dup2\n and\n iszero\n /* \"src/Contract.sol\":1810:1879 if (newOwner != address(0)) {... */\n tag_233\n jumpi\n /* \"src/Contract.sol\":1852:1857 owner */\n 0x0\n /* \"src/Contract.sol\":1852:1868 owner = newOwner */\n dup1\n sload\n 0xffffffffffffffffffffffff0000000000000000000000000000000000000000\n and\n 0xffffffffffffffffffffffffffffffffffffffff\n dup4\n and\n or\n swap1\n sstore\n /* \"src/Contract.sol\":1810:1879 if (newOwner != address(0)) {... */\n tag_233:\n /* \"src/Contract.sol\":1738:1885 function transferOwnership(address newOwner) public onlyOwner {... */\n pop\n jump\t// out\n /* \"src/Contract.sol\":8816:9134 function destroyBlackFunds (address _blackListedUser) public onlyOwner {... */\n tag_137:\n /* \"src/Contract.sol\":8947:8962 uint dirtyFunds */\n 0x0\n /* \"src/Contract.sol\":1546:1551 owner */\n dup1\n sload\n /* \"src/Contract.sol\":1532:1542 msg.sender */\n caller\n /* \"src/Contract.sol\":1546:1551 owner */\n 0xffffffffffffffffffffffffffffffffffffffff\n /* \"src/Contract.sol\":1532:1551 msg.sender == owner */\n swap1\n dup2\n and\n /* \"src/Contract.sol\":1546:1551 owner */\n swap2\n and\n /* \"src/Contract.sol\":1532:1551 msg.sender == owner */\n eq\n /* \"src/Contract.sol\":1524:1552 require(msg.sender == owner) */\n tag_235\n jumpi\n 0x0\n dup1\n revert\n tag_235:\n /* \"src/Contract.sol\":8905:8936 isBlackListed[_blackListedUser] */\n 0xffffffffffffffffffffffffffffffffffffffff\n dup3\n and\n 0x0\n swap1\n dup2\n mstore\n /* \"src/Contract.sol\":8905:8918 isBlackListed */\n 0x6\n /* \"src/Contract.sol\":8905:8936 isBlackListed[_blackListedUser] */\n 0x20\n mstore\n 0x40\n swap1\n keccak256\n sload\n 0xff\n and\n /* \"src/Contract.sol\":8897:8937 require(isBlackListed[_blackListedUser]) */\n iszero\n iszero\n tag_237\n jumpi\n 0x0\n dup1\n revert\n tag_237:\n /* \"src/Contract.sol\":8965:8992 balanceOf(_blackListedUser) */\n tag_238\n /* \"src/Contract.sol\":8975:8991 _blackListedUser */\n dup3\n /* \"src/Contract.sol\":8965:8974 balanceOf */\n tag_88\n /* \"src/Contract.sol\":8965:8992 balanceOf(_blackListedUser) */\n jump\t// in\n tag_238:\n /* \"src/Contract.sol\":9002:9028 balances[_blackListedUser] */\n 0xffffffffffffffffffffffffffffffffffffffff\n dup4\n and\n /* \"src/Contract.sol\":9031:9032 0 */\n 0x0\n /* \"src/Contract.sol\":9002:9028 balances[_blackListedUser] */\n swap1\n dup2\n mstore\n /* \"src/Contract.sol\":9002:9010 balances */\n 0x2\n /* \"src/Contract.sol\":9002:9028 balances[_blackListedUser] */\n 0x20\n mstore\n 0x40\n dup1\n dup3\n keccak256\n /* \"src/Contract.sol\":9002:9032 balances[_blackListedUser] = 0 */\n swap2\n swap1\n swap2\n sstore\n /* \"src/Contract.sol\":9042:9054 _totalSupply */\n 0x1\n /* \"src/Contract.sol\":9042:9068 _totalSupply -= dirtyFunds */\n dup1\n sload\n dup4\n swap1\n sub\n swap1\n sstore\n /* \"src/Contract.sol\":8947:8992 uint dirtyFunds = balanceOf(_blackListedUser) */\n swap1\n swap2\n pop\n /* \"src/Contract.sol\":9078:9127 DestroyedBlackFunds(_blackListedUser, dirtyFunds) */\n 0x61e6e66b0d6339b2980aecc6ccc0039736791f0ccde9ed512e789a7fbdd698c6\n swap1\n /* \"src/Contract.sol\":9011:9027 _blackListedUser */\n dup4\n swap1\n /* \"src/Contract.sol\":8947:8992 uint dirtyFunds = balanceOf(_blackListedUser) */\n dup4\n swap1\n /* \"src/Contract.sol\":9078:9127 DestroyedBlackFunds(_blackListedUser, dirtyFunds) */\n mload\n 0xffffffffffffffffffffffffffffffffffffffff\n swap1\n swap3\n and\n dup3\n mstore\n 0x20\n dup3\n add\n mstore\n 0x40\n swap1\n dup2\n add\n swap1\n mload\n dup1\n swap2\n sub\n swap1\n log1\n /* \"src/Contract.sol\":8816:9134 function destroyBlackFunds (address _blackListedUser) public onlyOwner {... */\n pop\n pop\n jump\t// out\n /* \"src/Contract.sol\":6164:6727 function approve(address _spender, uint _value) public onlyPayloadSize(2 * 32) {... */\n tag_152:\n /* \"src/Contract.sol\":6235:6241 2 * 32 */\n 0x40\n /* \"src/Contract.sol\":3251:3259 size + 4 */\n 0x44\n /* \"src/Contract.sol\":3233:3241 msg.data */\n calldatasize\n /* \"src/Contract.sol\":3233:3259 msg.data.length < size + 4 */\n lt\n /* \"src/Contract.sol\":3231:3260 !(msg.data.length < size + 4) */\n iszero\n /* \"src/Contract.sol\":3223:3261 require(!(msg.data.length < size + 4)) */\n tag_240\n jumpi\n 0x0\n dup1\n revert\n tag_240:\n /* \"src/Contract.sol\":6569:6580 _value != 0 */\n dup2\n iszero\n dup1\n iszero\n swap1\n /* \"src/Contract.sol\":6568:6621 (_value != 0) && (allowed[msg.sender][_spender] != 0) */\n tag_242\n jumpi\n pop\n /* \"src/Contract.sol\":6586:6605 allowed[msg.sender] */\n 0xffffffffffffffffffffffffffffffffffffffff\n /* \"src/Contract.sol\":6594:6604 msg.sender */\n caller\n /* \"src/Contract.sol\":6586:6605 allowed[msg.sender] */\n dup2\n and\n 0x0\n swap1\n dup2\n mstore\n /* \"src/Contract.sol\":6586:6593 allowed */\n 0x5\n /* \"src/Contract.sol\":6586:6605 allowed[msg.sender] */\n 0x20\n swap1\n dup2\n mstore\n 0x40\n dup1\n dup4\n keccak256\n /* \"src/Contract.sol\":6586:6615 allowed[msg.sender][_spender] */\n swap4\n dup8\n and\n dup4\n mstore\n swap3\n swap1\n mstore\n keccak256\n sload\n /* \"src/Contract.sol\":6586:6620 allowed[msg.sender][_spender] != 0 */\n iszero\n iszero\n /* \"src/Contract.sol\":6568:6621 (_value != 0) && (allowed[msg.sender][_spender] != 0) */\n tag_242:\n /* \"src/Contract.sol\":6566:6622 !((_value != 0) && (allowed[msg.sender][_spender] != 0)) */\n iszero\n /* \"src/Contract.sol\":6558:6623 require(!((_value != 0) && (allowed[msg.sender][_spender] != 0))) */\n tag_243\n jumpi\n 0x0\n dup1\n revert\n tag_243:\n /* \"src/Contract.sol\":6634:6653 allowed[msg.sender] */\n 0xffffffffffffffffffffffffffffffffffffffff\n /* \"src/Contract.sol\":6642:6652 msg.sender */\n caller\n /* \"src/Contract.sol\":6634:6653 allowed[msg.sender] */\n dup2\n and\n 0x0\n dup2\n dup2\n mstore\n /* \"src/Contract.sol\":6634:6641 allowed */\n 0x5\n /* \"src/Contract.sol\":6634:6653 allowed[msg.sender] */\n 0x20\n swap1\n dup2\n mstore\n 0x40\n dup1\n dup4\n keccak256\n /* \"src/Contract.sol\":6634:6663 allowed[msg.sender][_spender] */\n swap5\n dup9\n and\n dup1\n dup5\n mstore\n swap5\n swap1\n swap2\n mstore\n swap1\n dup2\n swap1\n keccak256\n /* \"src/Contract.sol\":6634:6672 allowed[msg.sender][_spender] = _value */\n dup6\n swap1\n sstore\n /* \"src/Contract.sol\":6682:6720 Approval(msg.sender, _spender, _value) */\n 0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925\n swap1\n /* \"src/Contract.sol\":6666:6672 _value */\n dup6\n swap1\n /* \"src/Contract.sol\":6682:6720 Approval(msg.sender, _spender, _value) */\n mload\n swap1\n dup2\n mstore\n 0x20\n add\n mload(0x40)\n dup1\n swap2\n sub\n swap1\n log3\n /* \"src/Contract.sol\":6164:6727 function approve(address _spender, uint _value) public onlyPayloadSize(2 * 32) {... */\n pop\n pop\n pop\n jump\t// out\n /* \"src/Contract.sol\":5044:5924 function transferFrom(address _from, address _to, uint _value) public onlyPayloadSize(3 * 32) {... */\n tag_170:\n /* \"src/Contract.sol\":5148:5162 var _allowance */\n 0x0\n dup1\n dup1\n /* \"src/Contract.sol\":5130:5136 3 * 32 */\n 0x60\n /* \"src/Contract.sol\":3251:3259 size + 4 */\n 0x64\n /* \"src/Contract.sol\":3233:3241 msg.data */\n calldatasize\n /* \"src/Contract.sol\":3233:3259 msg.data.length < size + 4 */\n lt\n /* \"src/Contract.sol\":3231:3260 !(msg.data.length < size + 4) */\n iszero\n /* \"src/Contract.sol\":3223:3261 require(!(msg.data.length < size + 4)) */\n tag_245\n jumpi\n 0x0\n dup1\n revert\n tag_245:\n /* \"src/Contract.sol\":5165:5179 allowed[_from] */\n 0xffffffffffffffffffffffffffffffffffffffff\n dup1\n dup9\n and\n 0x0\n swap1\n dup2\n mstore\n /* \"src/Contract.sol\":5165:5172 allowed */\n 0x5\n /* \"src/Contract.sol\":5165:5179 allowed[_from] */\n 0x20\n swap1\n dup2\n mstore\n 0x40\n dup1\n dup4\n keccak256\n /* \"src/Contract.sol\":5180:5190 msg.sender */\n caller\n /* \"src/Contract.sol\":5165:5191 allowed[_from][msg.sender] */\n swap1\n swap5\n and\n dup4\n mstore\n swap3\n swap1\n mstore\n keccak256\n sload\n /* \"src/Contract.sol\":5380:5395 basisPointsRate */\n sload(0x3)\n /* \"src/Contract.sol\":5165:5191 allowed[_from][msg.sender] */\n swap1\n swap5\n pop\n /* \"src/Contract.sol\":5368:5408 (_value.mul(basisPointsRate)).div(10000) */\n tag_247\n swap1\n /* \"src/Contract.sol\":5402:5407 10000 */\n 0x2710\n swap1\n /* \"src/Contract.sol\":5369:5396 _value.mul(basisPointsRate) */\n tag_248\n swap1\n /* \"src/Contract.sol\":5369:5375 _value */\n dup9\n swap1\n /* \"src/Contract.sol\":5369:5396 _value.mul(basisPointsRate) */\n 0xffffffff\n /* \"src/Contract.sol\":5369:5379 _value.mul */\n tag_209\n /* \"src/Contract.sol\":5369:5396 _value.mul(basisPointsRate) */\n and\n jump\t// in\n tag_248:\n /* \"src/Contract.sol\":5368:5401 (_value.mul(basisPointsRate)).div */\n swap1\n /* \"src/Contract.sol\":5368:5408 (_value.mul(basisPointsRate)).div(10000) */\n 0xffffffff\n /* \"src/Contract.sol\":5368:5401 (_value.mul(basisPointsRate)).div */\n tag_249\n /* \"src/Contract.sol\":5368:5408 (_value.mul(basisPointsRate)).div(10000) */\n and\n jump\t// in\n tag_247:\n /* \"src/Contract.sol\":5357:5408 uint fee = (_value.mul(basisPointsRate)).div(10000) */\n swap3\n pop\n /* \"src/Contract.sol\":5428:5438 maximumFee */\n sload(0x4)\n /* \"src/Contract.sol\":5422:5425 fee */\n dup4\n /* \"src/Contract.sol\":5422:5438 fee > maximumFee */\n gt\n /* \"src/Contract.sol\":5418:5481 if (fee > maximumFee) {... */\n iszero\n tag_250\n jumpi\n /* \"src/Contract.sol\":5460:5470 maximumFee */\n sload(0x4)\n /* \"src/Contract.sol\":5454:5470 fee = maximumFee */\n swap3\n pop\n /* \"src/Contract.sol\":5418:5481 if (fee > maximumFee) {... */\n tag_250:\n /* \"src/Contract.sol\":4752:4762 2**256 - 1 */\n 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\n /* \"src/Contract.sol\":5494:5504 _allowance */\n dup5\n /* \"src/Contract.sol\":5494:5515 _allowance < MAX_UINT */\n lt\n /* \"src/Contract.sol\":5490:5593 if (_allowance < MAX_UINT) {... */\n iszero\n tag_251\n jumpi\n /* \"src/Contract.sol\":5560:5582 _allowance.sub(_value) */\n tag_252\n /* \"src/Contract.sol\":5560:5570 _allowance */\n dup5\n /* \"src/Contract.sol\":5575:5581 _value */\n dup7\n /* \"src/Contract.sol\":5560:5582 _allowance.sub(_value) */\n 0xffffffff\n /* \"src/Contract.sol\":5560:5574 _allowance.sub */\n tag_253\n /* \"src/Contract.sol\":5560:5582 _allowance.sub(_value) */\n and\n jump\t// in\n tag_252:\n /* \"src/Contract.sol\":5531:5545 allowed[_from] */\n 0xffffffffffffffffffffffffffffffffffffffff\n dup1\n dup10\n and\n 0x0\n swap1\n dup2\n mstore\n /* \"src/Contract.sol\":5531:5538 allowed */\n 0x5\n /* \"src/Contract.sol\":5531:5545 allowed[_from] */\n 0x20\n swap1\n dup2\n mstore\n 0x40\n dup1\n dup4\n keccak256\n /* \"src/Contract.sol\":5546:5556 msg.sender */\n caller\n /* \"src/Contract.sol\":5531:5557 allowed[_from][msg.sender] */\n swap1\n swap5\n and\n dup4\n mstore\n swap3\n swap1\n mstore\n keccak256\n /* \"src/Contract.sol\":5531:5582 allowed[_from][msg.sender] = _allowance.sub(_value) */\n sstore\n /* \"src/Contract.sol\":5490:5593 if (_allowance < MAX_UINT) {... */\n tag_251:\n /* \"src/Contract.sol\":5620:5635 _value.sub(fee) */\n tag_254\n /* \"src/Contract.sol\":5620:5626 _value */\n dup6\n /* \"src/Contract.sol\":5631:5634 fee */\n dup5\n /* \"src/Contract.sol\":5620:5635 _value.sub(fee) */\n 0xffffffff\n /* \"src/Contract.sol\":5620:5630 _value.sub */\n tag_253\n /* \"src/Contract.sol\":5620:5635 _value.sub(fee) */\n and\n jump\t// in\n tag_254:\n /* \"src/Contract.sol\":5663:5678 balances[_from] */\n 0xffffffffffffffffffffffffffffffffffffffff\n dup9\n and\n 0x0\n swap1\n dup2\n mstore\n /* \"src/Contract.sol\":5663:5671 balances */\n 0x2\n /* \"src/Contract.sol\":5663:5678 balances[_from] */\n 0x20\n mstore\n 0x40\n swap1\n keccak256\n sload\n /* \"src/Contract.sol\":5602:5635 uint sendAmount = _value.sub(fee) */\n swap1\n swap3\n pop\n /* \"src/Contract.sol\":5663:5690 balances[_from].sub(_value) */\n tag_255\n swap1\n /* \"src/Contract.sol\":5683:5689 _value */\n dup7\n /* \"src/Contract.sol\":5663:5690 balances[_from].sub(_value) */\n 0xffffffff\n /* \"src/Contract.sol\":5663:5682 balances[_from].sub */\n tag_253\n /* \"src/Contract.sol\":5663:5690 balances[_from].sub(_value) */\n and\n jump\t// in\n tag_255:\n /* \"src/Contract.sol\":5645:5660 balances[_from] */\n 0xffffffffffffffffffffffffffffffffffffffff\n dup1\n dup10\n and\n 0x0\n swap1\n dup2\n mstore\n /* \"src/Contract.sol\":5645:5653 balances */\n 0x2\n /* \"src/Contract.sol\":5645:5660 balances[_from] */\n 0x20\n mstore\n 0x40\n dup1\n dup3\n keccak256\n /* \"src/Contract.sol\":5645:5690 balances[_from] = balances[_from].sub(_value) */\n swap4\n swap1\n swap4\n sstore\n /* \"src/Contract.sol\":5716:5729 balances[_to] */\n swap1\n dup9\n and\n dup2\n mstore\n keccak256\n sload\n /* \"src/Contract.sol\":5716:5745 balances[_to].add(sendAmount) */\n tag_256\n swap1\n /* \"src/Contract.sol\":5734:5744 sendAmount */\n dup4\n /* \"src/Contract.sol\":5716:5745 balances[_to].add(sendAmount) */\n 0xffffffff\n /* \"src/Contract.sol\":5716:5733 balances[_to].add */\n tag_257\n /* \"src/Contract.sol\":5716:5745 balances[_to].add(sendAmount) */\n and\n jump\t// in\n tag_256:\n /* \"src/Contract.sol\":5700:5713 balances[_to] */\n 0xffffffffffffffffffffffffffffffffffffffff\n dup8\n and\n 0x0\n swap1\n dup2\n mstore\n /* \"src/Contract.sol\":5700:5708 balances */\n 0x2\n /* \"src/Contract.sol\":5700:5713 balances[_to] */\n 0x20\n mstore\n 0x40\n dup2\n keccak256\n /* \"src/Contract.sol\":5700:5745 balances[_to] = balances[_to].add(sendAmount) */\n swap2\n swap1\n swap2\n sstore\n /* \"src/Contract.sol\":5759:5766 fee > 0 */\n dup4\n gt\n /* \"src/Contract.sol\":5755:5876 if (fee > 0) {... */\n iszero\n tag_258\n jumpi\n /* \"src/Contract.sol\":5800:5815 balances[owner] */\n 0x0\n /* \"src/Contract.sol\":5809:5814 owner */\n dup1\n sload\n 0xffffffffffffffffffffffffffffffffffffffff\n and\n /* \"src/Contract.sol\":5800:5815 balances[owner] */\n dup2\n mstore\n /* \"src/Contract.sol\":5800:5808 balances */\n 0x2\n /* \"src/Contract.sol\":5800:5815 balances[owner] */\n 0x20\n mstore\n 0x40\n swap1\n keccak256\n sload\n /* \"src/Contract.sol\":5800:5824 balances[owner].add(fee) */\n tag_259\n swap1\n /* \"src/Contract.sol\":5820:5823 fee */\n dup5\n /* \"src/Contract.sol\":5800:5824 balances[owner].add(fee) */\n 0xffffffff\n /* \"src/Contract.sol\":5800:5819 balances[owner].add */\n tag_257\n /* \"src/Contract.sol\":5800:5824 balances[owner].add(fee) */\n and\n jump\t// in\n tag_259:\n /* \"src/Contract.sol\":5782:5797 balances[owner] */\n 0x0\n /* \"src/Contract.sol\":5791:5796 owner */\n dup1\n sload\n 0xffffffffffffffffffffffffffffffffffffffff\n swap1\n dup2\n and\n /* \"src/Contract.sol\":5782:5797 balances[owner] */\n dup3\n mstore\n /* \"src/Contract.sol\":5782:5790 balances */\n 0x2\n /* \"src/Contract.sol\":5782:5797 balances[owner] */\n 0x20\n mstore\n 0x40\n dup1\n dup4\n keccak256\n /* \"src/Contract.sol\":5782:5824 balances[owner] = balances[owner].add(fee) */\n swap4\n swap1\n swap4\n sstore\n /* \"src/Contract.sol\":5854:5859 owner */\n swap1\n sload\n dup2\n and\n swap2\n /* \"src/Contract.sol\":5838:5865 Transfer(_from, owner, fee) */\n swap1\n dup10\n and\n swap1\n 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef\n swap1\n /* \"src/Contract.sol\":5861:5864 fee */\n dup7\n swap1\n /* \"src/Contract.sol\":5838:5865 Transfer(_from, owner, fee) */\n mload\n swap1\n dup2\n mstore\n 0x20\n add\n mload(0x40)\n dup1\n swap2\n sub\n swap1\n log3\n /* \"src/Contract.sol\":5755:5876 if (fee > 0) {... */\n tag_258:\n /* \"src/Contract.sol\":5901:5904 _to */\n dup6\n /* \"src/Contract.sol\":5885:5917 Transfer(_from, _to, sendAmount) */\n 0xffffffffffffffffffffffffffffffffffffffff\n and\n /* \"src/Contract.sol\":5894:5899 _from */\n dup8\n /* \"src/Contract.sol\":5885:5917 Transfer(_from, _to, sendAmount) */\n 0xffffffffffffffffffffffffffffffffffffffff\n and\n 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef\n /* \"src/Contract.sol\":5906:5916 sendAmount */\n dup5\n /* \"src/Contract.sol\":5885:5917 Transfer(_from, _to, sendAmount) */\n mload(0x40)\n swap1\n dup2\n mstore\n 0x20\n add\n mload(0x40)\n dup1\n swap2\n sub\n swap1\n log3\n /* \"src/Contract.sol\":5044:5924 function transferFrom(address _from, address _to, uint _value) public onlyPayloadSize(3 * 32) {... */\n pop\n pop\n pop\n pop\n pop\n pop\n pop\n jump\t// out\n /* \"src/Contract.sol\":4216:4330 function balanceOf(address _owner) public constant returns (uint balance) {... */\n tag_183:\n /* \"src/Contract.sol\":4307:4323 balances[_owner] */\n 0xffffffffffffffffffffffffffffffffffffffff\n and\n /* \"src/Contract.sol\":4276:4288 uint balance */\n 0x0\n /* \"src/Contract.sol\":4307:4323 balances[_owner] */\n swap1\n dup2\n mstore\n /* \"src/Contract.sol\":4307:4315 balances */\n 0x2\n /* \"src/Contract.sol\":4307:4323 balances[_owner] */\n 0x20\n mstore\n 0x40\n swap1\n keccak256\n sload\n swap1\n /* \"src/Contract.sol\":4216:4330 function balanceOf(address _owner) public constant returns (uint balance) {... */\n jump\t// out\n /* \"src/Contract.sol\":3445:4005 function transfer(address _to, uint _value) public onlyPayloadSize(2 * 32) {... */\n tag_202:\n /* \"src/Contract.sol\":3530:3538 uint fee */\n 0x0\n dup1\n /* \"src/Contract.sol\":3512:3518 2 * 32 */\n 0x40\n /* \"src/Contract.sol\":3251:3259 size + 4 */\n 0x44\n /* \"src/Contract.sol\":3233:3241 msg.data */\n calldatasize\n /* \"src/Contract.sol\":3233:3259 msg.data.length < size + 4 */\n lt\n /* \"src/Contract.sol\":3231:3260 !(msg.data.length < size + 4) */\n iszero\n /* \"src/Contract.sol\":3223:3261 require(!(msg.data.length < size + 4)) */\n tag_262\n jumpi\n 0x0\n dup1\n revert\n tag_262:\n /* \"src/Contract.sol\":3541:3581 (_value.mul(basisPointsRate)).div(10000) */\n tag_264\n /* \"src/Contract.sol\":3575:3580 10000 */\n 0x2710\n /* \"src/Contract.sol\":3542:3569 _value.mul(basisPointsRate) */\n tag_248\n /* \"src/Contract.sol\":3553:3568 basisPointsRate */\n sload(0x3)\n /* \"src/Contract.sol\":3542:3548 _value */\n dup8\n /* \"src/Contract.sol\":3542:3552 _value.mul */\n tag_209\n swap1\n /* \"src/Contract.sol\":3542:3569 _value.mul(basisPointsRate) */\n swap2\n swap1\n 0xffffffff\n and\n jump\t// in\n /* \"src/Contract.sol\":3541:3581 (_value.mul(basisPointsRate)).div(10000) */\n tag_264:\n /* \"src/Contract.sol\":3530:3581 uint fee = (_value.mul(basisPointsRate)).div(10000) */\n swap3\n pop\n /* \"src/Contract.sol\":3601:3611 maximumFee */\n sload(0x4)\n /* \"src/Contract.sol\":3595:3598 fee */\n dup4\n /* \"src/Contract.sol\":3595:3611 fee > maximumFee */\n gt\n /* \"src/Contract.sol\":3591:3654 if (fee > maximumFee) {... */\n iszero\n tag_266\n jumpi\n /* \"src/Contract.sol\":3633:3643 maximumFee */\n sload(0x4)\n /* \"src/Contract.sol\":3627:3643 fee = maximumFee */\n swap3\n pop\n /* \"src/Contract.sol\":3591:3654 if (fee > maximumFee) {... */\n tag_266:\n /* \"src/Contract.sol\":3681:3696 _value.sub(fee) */\n tag_267\n /* \"src/Contract.sol\":3681:3687 _value */\n dup5\n /* \"src/Contract.sol\":3692:3695 fee */\n dup5\n /* \"src/Contract.sol\":3681:3696 _value.sub(fee) */\n 0xffffffff\n /* \"src/Contract.sol\":3681:3691 _value.sub */\n tag_253\n /* \"src/Contract.sol\":3681:3696 _value.sub(fee) */\n and\n jump\t// in\n tag_267:\n /* \"src/Contract.sol\":3729:3749 balances[msg.sender] */\n 0xffffffffffffffffffffffffffffffffffffffff\n /* \"src/Contract.sol\":3738:3748 msg.sender */\n caller\n /* \"src/Contract.sol\":3729:3749 balances[msg.sender] */\n and\n 0x0\n swap1\n dup2\n mstore\n /* \"src/Contract.sol\":3729:3737 balances */\n 0x2\n /* \"src/Contract.sol\":3729:3749 balances[msg.sender] */\n 0x20\n mstore\n 0x40\n swap1\n keccak256\n sload\n /* \"src/Contract.sol\":3663:3696 uint sendAmount = _value.sub(fee) */\n swap1\n swap3\n pop\n /* \"src/Contract.sol\":3729:3761 balances[msg.sender].sub(_value) */\n tag_268\n swap1\n /* \"src/Contract.sol\":3754:3760 _value */\n dup6\n /* \"src/Contract.sol\":3729:3761 balances[msg.sender].sub(_value) */\n 0xffffffff\n /* \"src/Contract.sol\":3729:3753 balances[msg.sender].sub */\n tag_253\n /* \"src/Contract.sol\":3729:3761 balances[msg.sender].sub(_value) */\n and\n jump\t// in\n tag_268:\n /* \"src/Contract.sol\":3706:3726 balances[msg.sender] */\n 0xffffffffffffffffffffffffffffffffffffffff\n /* \"src/Contract.sol\":3715:3725 msg.sender */\n caller\n /* \"src/Contract.sol\":3706:3726 balances[msg.sender] */\n dup2\n and\n 0x0\n swap1\n dup2\n mstore\n /* \"src/Contract.sol\":3706:3714 balances */\n 0x2\n /* \"src/Contract.sol\":3706:3726 balances[msg.sender] */\n 0x20\n mstore\n 0x40\n dup1\n dup3\n keccak256\n /* \"src/Contract.sol\":3706:3761 balances[msg.sender] = balances[msg.sender].sub(_value) */\n swap4\n swap1\n swap4\n sstore\n /* \"src/Contract.sol\":3787:3800 balances[_to] */\n swap1\n dup8\n and\n dup2\n mstore\n keccak256\n sload\n /* \"src/Contract.sol\":3787:3816 balances[_to].add(sendAmount) */\n tag_269\n swap1\n /* \"src/Contract.sol\":3805:3815 sendAmount */\n dup4\n /* \"src/Contract.sol\":3787:3816 balances[_to].add(sendAmount) */\n 0xffffffff\n /* \"src/Contract.sol\":3787:3804 balances[_to].add */\n tag_257\n /* \"src/Contract.sol\":3787:3816 balances[_to].add(sendAmount) */\n and\n jump\t// in\n tag_269:\n /* \"src/Contract.sol\":3771:3784 balances[_to] */\n 0xffffffffffffffffffffffffffffffffffffffff\n dup7\n and\n 0x0\n swap1\n dup2\n mstore\n /* \"src/Contract.sol\":3771:3779 balances */\n 0x2\n /* \"src/Contract.sol\":3771:3784 balances[_to] */\n 0x20\n mstore\n 0x40\n dup2\n keccak256\n /* \"src/Contract.sol\":3771:3816 balances[_to] = balances[_to].add(sendAmount) */\n swap2\n swap1\n swap2\n sstore\n /* \"src/Contract.sol\":3830:3837 fee > 0 */\n dup4\n gt\n /* \"src/Contract.sol\":3826:3952 if (fee > 0) {... */\n iszero\n tag_270\n jumpi\n /* \"src/Contract.sol\":3871:3886 balances[owner] */\n 0x0\n /* \"src/Contract.sol\":3880:3885 owner */\n dup1\n sload\n 0xffffffffffffffffffffffffffffffffffffffff\n and\n /* \"src/Contract.sol\":3871:3886 balances[owner] */\n dup2\n mstore\n /* \"src/Contract.sol\":3871:3879 balances */\n 0x2\n /* \"src/Contract.sol\":3871:3886 balances[owner] */\n 0x20\n mstore\n 0x40\n swap1\n keccak256\n sload\n /* \"src/Contract.sol\":3871:3895 balances[owner].add(fee) */\n tag_271\n swap1\n /* \"src/Contract.sol\":3891:3894 fee */\n dup5\n /* \"src/Contract.sol\":3871:3895 balances[owner].add(fee) */\n 0xffffffff\n /* \"src/Contract.sol\":3871:3890 balances[owner].add */\n tag_257\n /* \"src/Contract.sol\":3871:3895 balances[owner].add(fee) */\n and\n jump\t// in\n tag_271:\n /* \"src/Contract.sol\":3853:3868 balances[owner] */\n 0x0\n /* \"src/Contract.sol\":3862:3867 owner */\n dup1\n sload\n 0xffffffffffffffffffffffffffffffffffffffff\n swap1\n dup2\n and\n /* \"src/Contract.sol\":3853:3868 balances[owner] */\n dup3\n mstore\n /* \"src/Contract.sol\":3853:3861 balances */\n 0x2\n /* \"src/Contract.sol\":3853:3868 balances[owner] */\n 0x20\n mstore\n 0x40\n dup1\n dup4\n keccak256\n /* \"src/Contract.sol\":3853:3895 balances[owner] = balances[owner].add(fee) */\n swap4\n swap1\n swap4\n sstore\n /* \"src/Contract.sol\":3930:3935 owner */\n swap1\n sload\n dup2\n and\n swap2\n /* \"src/Contract.sol\":3918:3928 msg.sender */\n caller\n /* \"src/Contract.sol\":3909:3941 Transfer(msg.sender, owner, fee) */\n swap1\n swap2\n and\n swap1\n 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef\n swap1\n /* \"src/Contract.sol\":3937:3940 fee */\n dup7\n swap1\n /* \"src/Contract.sol\":3909:3941 Transfer(msg.sender, owner, fee) */\n mload\n swap1\n dup2\n mstore\n 0x20\n add\n mload(0x40)\n dup1\n swap2\n sub\n swap1\n log3\n /* \"src/Contract.sol\":3826:3952 if (fee > 0) {... */\n tag_270:\n /* \"src/Contract.sol\":3982:3985 _to */\n dup5\n /* \"src/Contract.sol\":3961:3998 Transfer(msg.sender, _to, sendAmount) */\n 0xffffffffffffffffffffffffffffffffffffffff\n and\n /* \"src/Contract.sol\":3970:3980 msg.sender */\n caller\n /* \"src/Contract.sol\":3961:3998 Transfer(msg.sender, _to, sendAmount) */\n 0xffffffffffffffffffffffffffffffffffffffff\n and\n 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef\n /* \"src/Contract.sol\":3987:3997 sendAmount */\n dup5\n /* \"src/Contract.sol\":3961:3998 Transfer(msg.sender, _to, sendAmount) */\n mload(0x40)\n swap1\n dup2\n mstore\n 0x20\n add\n mload(0x40)\n dup1\n swap2\n sub\n swap1\n log3\n /* \"src/Contract.sol\":3445:4005 function transfer(address _to, uint _value) public onlyPayloadSize(2 * 32) {... */\n pop\n pop\n pop\n pop\n pop\n jump\t// out\n /* \"src/Contract.sol\":206:407 function mul(uint256 a, uint256 b) internal pure returns (uint256) {... */\n tag_209:\n /* \"src/Contract.sol\":264:271 uint256 */\n 0x0\n dup1\n /* \"src/Contract.sol\":287:293 a == 0 */\n dup4\n iszero\n /* \"src/Contract.sol\":283:328 if (a == 0) {... */\n iszero\n tag_273\n jumpi\n /* \"src/Contract.sol\":316:317 0 */\n 0x0\n /* \"src/Contract.sol\":309:317 return 0 */\n swap2\n pop\n jump(tag_272)\n /* \"src/Contract.sol\":283:328 if (a == 0) {... */\n tag_273:\n pop\n /* \"src/Contract.sol\":349:354 a * b */\n dup3\n dup3\n mul\n /* \"src/Contract.sol\":353:354 b */\n dup3\n /* \"src/Contract.sol\":349:350 a */\n dup5\n /* \"src/Contract.sol\":349:354 a * b */\n dup3\n /* \"src/Contract.sol\":371:376 c / a */\n dup2\n iszero\n iszero\n tag_274\n jumpi\n invalid\n tag_274:\n div\n /* \"src/Contract.sol\":371:381 c / a == b */\n eq\n /* \"src/Contract.sol\":364:382 assert(c / a == b) */\n tag_275\n jumpi\n invalid\n tag_275:\n /* \"src/Contract.sol\":399:400 c */\n dup1\n /* \"src/Contract.sol\":392:400 return c */\n swap2\n pop\n /* \"src/Contract.sol\":206:407 function mul(uint256 a, uint256 b) internal pure returns (uint256) {... */\n tag_272:\n pop\n swap3\n swap2\n pop\n pop\n jump\t// out\n /* \"src/Contract.sol\":7052:7195 function allowance(address _owner, address _spender) public constant returns (uint remaining) {... */\n tag_226:\n /* \"src/Contract.sol\":7163:7178 allowed[_owner] */\n 0xffffffffffffffffffffffffffffffffffffffff\n swap2\n dup3\n and\n /* \"src/Contract.sol\":7130:7144 uint remaining */\n 0x0\n /* \"src/Contract.sol\":7163:7178 allowed[_owner] */\n swap1\n dup2\n mstore\n /* \"src/Contract.sol\":7163:7170 allowed */\n 0x5\n /* \"src/Contract.sol\":7163:7178 allowed[_owner] */\n 0x20\n swap1\n dup2\n mstore\n 0x40\n dup1\n dup4\n keccak256\n /* \"src/Contract.sol\":7163:7188 allowed[_owner][_spender] */\n swap4\n swap1\n swap5\n and\n dup3\n mstore\n swap2\n swap1\n swap2\n mstore\n keccak256\n sload\n swap1\n /* \"src/Contract.sol\":7052:7195 function allowance(address _owner, address _spender) public constant returns (uint remaining) {... */\n jump\t// out\n /* \"src/Contract.sol\":413:696 function div(uint256 a, uint256 b) internal pure returns (uint256) {... */\n tag_249:\n /* \"src/Contract.sol\":471:478 uint256 */\n 0x0\n /* \"src/Contract.sol\":568:577 uint256 c */\n dup1\n /* \"src/Contract.sol\":584:585 b */\n dup3\n /* \"src/Contract.sol\":580:581 a */\n dup5\n /* \"src/Contract.sol\":580:585 a / b */\n dup2\n iszero\n iszero\n tag_278\n jumpi\n invalid\n tag_278:\n div\n swap5\n /* \"src/Contract.sol\":413:696 function div(uint256 a, uint256 b) internal pure returns (uint256) {... */\n swap4\n pop\n pop\n pop\n pop\n jump\t// out\n /* \"src/Contract.sol\":702:822 function sub(uint256 a, uint256 b) internal pure returns (uint256) {... */\n tag_253:\n /* \"src/Contract.sol\":760:767 uint256 */\n 0x0\n /* \"src/Contract.sol\":786:792 b <= a */\n dup3\n dup3\n gt\n iszero\n /* \"src/Contract.sol\":779:793 assert(b <= a) */\n tag_280\n jumpi\n invalid\n tag_280:\n pop\n /* \"src/Contract.sol\":810:815 a - b */\n swap1\n sub\n swap1\n /* \"src/Contract.sol\":702:822 function sub(uint256 a, uint256 b) internal pure returns (uint256) {... */\n jump\t// out\n /* \"src/Contract.sol\":828:971 function add(uint256 a, uint256 b) internal pure returns (uint256) {... */\n tag_257:\n /* \"src/Contract.sol\":886:893 uint256 */\n 0x0\n /* \"src/Contract.sol\":917:922 a + b */\n dup3\n dup3\n add\n /* \"src/Contract.sol\":939:945 c >= a */\n dup4\n dup2\n lt\n iszero\n /* \"src/Contract.sol\":932:946 assert(c >= a) */\n tag_275\n jumpi\n invalid\n\n auxdata: 0xa165627a7a72305820c6c7ec5e3bee0b2db470f633175dd5c4c1900658f43d73e4f34ffa2e46d86ab80029\n}\n", + "bytecode": { + "linkReferences": {}, + "object": "60606040526000805460a060020a60ff0219168155600381905560045534156200002857600080fd5b60405162001e2f38038062001e2f833981016040528080519190602001805182019190602001805182019190602001805160008054600160a060020a03191633600160a060020a0316179055600186905591506007905083805162000092929160200190620000dd565b506008828051620000a8929160200190620000dd565b50600955505060008054600160a060020a0316815260026020526040902055600a805460a060020a60ff021916905562000182565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200012057805160ff191683800117855562000150565b8280016001018555821562000150579182015b828111156200015057825182559160200191906001019062000133565b506200015e92915062000162565b5090565b6200017f91905b808211156200015e576000815560010162000169565b90565b611c9d80620001926000396000f3006060604052600436106101955763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166306fdde03811461019a5780630753c30c14610224578063095ea7b3146102525780630e136b19146102815780630ecb93c0146102a857806318160ddd146102d457806323b872dd146102f957806326976e3f1461032e57806327e235e31461036a578063313ce5671461039657806335390714146103a95780633eaaf86b146103bc5780633f4ba83a146103cf57806359bf1abe146103e25780635c6581651461040e5780635c975abb1461044057806370a08231146104535780638456cb591461047f578063893d20e8146104925780638da5cb5b146104a557806395d89b41146104b8578063a9059cbb146104cb578063c0324c77146104fa578063cc872b6614610513578063db006a7514610529578063dd62ed3e1461053f578063dd644f7214610571578063e47d606014610584578063e4997dc5146105b0578063e5b5019a146105dc578063f2fde38b146105ef578063f3bdc2281461061b575b600080fd5b34156101a557600080fd5b6101ad610647565b60405160208082528190810183818151815260200191508051906020019080838360005b838110156101e95780820151838201526020016101d1565b50505050905090810190601f1680156102165780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561022f57600080fd5b61025073ffffffffffffffffffffffffffffffffffffffff600435166106e5565b005b341561025d57600080fd5b61025073ffffffffffffffffffffffffffffffffffffffff600435166024356107d5565b341561028c57600080fd5b6102946108c6565b604051901515815260200160405180910390f35b34156102b357600080fd5b61025073ffffffffffffffffffffffffffffffffffffffff600435166108e7565b34156102df57600080fd5b6102e76109ac565b60405190815260200160405180910390f35b341561030457600080fd5b61025073ffffffffffffffffffffffffffffffffffffffff60043581169060243516604435610a6a565b341561033957600080fd5b610341610b90565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b341561037557600080fd5b6102e773ffffffffffffffffffffffffffffffffffffffff60043516610bac565b34156103a157600080fd5b6102e7610bbe565b34156103b457600080fd5b6102e7610bc4565b34156103c757600080fd5b6102e7610bca565b34156103da57600080fd5b610250610bd0565b34156103ed57600080fd5b61029473ffffffffffffffffffffffffffffffffffffffff60043516610c77565b341561041957600080fd5b6102e773ffffffffffffffffffffffffffffffffffffffff60043581169060243516610ca6565b341561044b57600080fd5b610294610cc3565b341561045e57600080fd5b6102e773ffffffffffffffffffffffffffffffffffffffff60043516610ce4565b341561048a57600080fd5b610250610dc8565b341561049d57600080fd5b610341610e85565b34156104b057600080fd5b610341610ea1565b34156104c357600080fd5b6101ad610ebd565b34156104d657600080fd5b61025073ffffffffffffffffffffffffffffffffffffffff60043516602435610f28565b341561050557600080fd5b610250600435602435611063565b341561051e57600080fd5b610250600435611106565b341561053457600080fd5b6102506004356111dc565b341561054a57600080fd5b6102e773ffffffffffffffffffffffffffffffffffffffff600435811690602435166112b4565b341561057c57600080fd5b6102e76113a3565b341561058f57600080fd5b61029473ffffffffffffffffffffffffffffffffffffffff600435166113a9565b34156105bb57600080fd5b61025073ffffffffffffffffffffffffffffffffffffffff600435166113be565b34156105e757600080fd5b6102e7611480565b34156105fa57600080fd5b61025073ffffffffffffffffffffffffffffffffffffffff600435166114a4565b341561062657600080fd5b61025073ffffffffffffffffffffffffffffffffffffffff6004351661152c565b60078054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156106dd5780601f106106b2576101008083540402835291602001916106dd565b820191906000526020600020905b8154815290600101906020018083116106c057829003601f168201915b505050505081565b6000543373ffffffffffffffffffffffffffffffffffffffff90811691161461070d57600080fd5b600a8054740100000000000000000000000000000000000000007fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff909116177fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83161790557fcc358699805e9a8b7f77b522628c7cb9abd07d9efb86b6fb616af1609036a99e8160405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a150565b604060443610156107e557600080fd5b600a5474010000000000000000000000000000000000000000900460ff16156108b757600a5473ffffffffffffffffffffffffffffffffffffffff1663aee92d333385856040517c010000000000000000000000000000000000000000000000000000000063ffffffff861602815273ffffffffffffffffffffffffffffffffffffffff93841660048201529190921660248201526044810191909152606401600060405180830381600087803b151561089e57600080fd5b6102c65a03f115156108af57600080fd5b5050506108c1565b6108c1838361161e565b505050565b600a5474010000000000000000000000000000000000000000900460ff1681565b6000543373ffffffffffffffffffffffffffffffffffffffff90811691161461090f57600080fd5b73ffffffffffffffffffffffffffffffffffffffff81166000908152600660205260409081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790557f42e160154868087d6bfdc0ca23d96a1c1cfa32f1b72ba9ba27b69b98a0d819dc9082905173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a150565b600a5460009074010000000000000000000000000000000000000000900460ff1615610a6257600a5473ffffffffffffffffffffffffffffffffffffffff166318160ddd6000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515610a4057600080fd5b6102c65a03f11515610a5157600080fd5b505050604051805190509050610a67565b506001545b90565b60005474010000000000000000000000000000000000000000900460ff1615610a9257600080fd5b73ffffffffffffffffffffffffffffffffffffffff831660009081526006602052604090205460ff1615610ac557600080fd5b600a5474010000000000000000000000000000000000000000900460ff1615610b8557600a5473ffffffffffffffffffffffffffffffffffffffff16638b477adb338585856040517c010000000000000000000000000000000000000000000000000000000063ffffffff871602815273ffffffffffffffffffffffffffffffffffffffff94851660048201529284166024840152921660448201526064810191909152608401600060405180830381600087803b151561089e57600080fd5b6108c18383836116ea565b600a5473ffffffffffffffffffffffffffffffffffffffff1681565b60026020526000908152604090205481565b60095481565b60045481565b60015481565b6000543373ffffffffffffffffffffffffffffffffffffffff908116911614610bf857600080fd5b60005474010000000000000000000000000000000000000000900460ff161515610c2157600080fd5b600080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690557f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b73ffffffffffffffffffffffffffffffffffffffff811660009081526006602052604090205460ff165b919050565b600560209081526000928352604080842090915290825290205481565b60005474010000000000000000000000000000000000000000900460ff1681565b600a5460009074010000000000000000000000000000000000000000900460ff1615610db857600a5473ffffffffffffffffffffffffffffffffffffffff166370a08231836000604051602001526040517c010000000000000000000000000000000000000000000000000000000063ffffffff841602815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401602060405180830381600087803b1515610d9657600080fd5b6102c65a03f11515610da757600080fd5b505050604051805190509050610ca1565b610dc1826119a0565b9050610ca1565b6000543373ffffffffffffffffffffffffffffffffffffffff908116911614610df057600080fd5b60005474010000000000000000000000000000000000000000900460ff1615610e1857600080fd5b600080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790557f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b60005473ffffffffffffffffffffffffffffffffffffffff1690565b60005473ffffffffffffffffffffffffffffffffffffffff1681565b60088054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156106dd5780601f106106b2576101008083540402835291602001916106dd565b60005474010000000000000000000000000000000000000000900460ff1615610f5057600080fd5b73ffffffffffffffffffffffffffffffffffffffff331660009081526006602052604090205460ff1615610f8357600080fd5b600a5474010000000000000000000000000000000000000000900460ff161561105557600a5473ffffffffffffffffffffffffffffffffffffffff16636e18980a3384846040517c010000000000000000000000000000000000000000000000000000000063ffffffff861602815273ffffffffffffffffffffffffffffffffffffffff93841660048201529190921660248201526044810191909152606401600060405180830381600087803b151561103c57600080fd5b6102c65a03f1151561104d57600080fd5b50505061105f565b61105f82826119c8565b5050565b6000543373ffffffffffffffffffffffffffffffffffffffff90811691161461108b57600080fd5b6014821061109857600080fd5b603281106110a557600080fd5b60038290556009546110c1908290600a0a63ffffffff611bcb16565b60048190556003547fb044a1e409eac5c48e5af22d4af52670dd1a99059537a78b31b48c6500a6354e9160405191825260208201526040908101905180910390a15050565b6000543373ffffffffffffffffffffffffffffffffffffffff90811691161461112e57600080fd5b6001548181011161113e57600080fd5b6000805473ffffffffffffffffffffffffffffffffffffffff168152600260205260409020548181011161117157600080fd5b6000805473ffffffffffffffffffffffffffffffffffffffff168152600260205260409081902080548301905560018054830190557fcb8241adb0c3fdb35b70c24ce35c5eb0c17af7431c99f827d44a445ca624176a9082905190815260200160405180910390a150565b6000543373ffffffffffffffffffffffffffffffffffffffff90811691161461120457600080fd5b6001548190101561121457600080fd5b6000805473ffffffffffffffffffffffffffffffffffffffff168152600260205260409020548190101561124757600080fd5b6001805482900390556000805473ffffffffffffffffffffffffffffffffffffffff1681526002602052604090819020805483900390557f702d5967f45f6513a38ffc42d6ba9bf230bd40e8f53b16363c7eb4fd2deb9a449082905190815260200160405180910390a150565b600a5460009074010000000000000000000000000000000000000000900460ff161561139057600a5473ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e84846000604051602001526040517c010000000000000000000000000000000000000000000000000000000063ffffffff851602815273ffffffffffffffffffffffffffffffffffffffff928316600482015291166024820152604401602060405180830381600087803b151561136e57600080fd5b6102c65a03f1151561137f57600080fd5b50505060405180519050905061139d565b61139a8383611c01565b90505b92915050565b60035481565b60066020526000908152604090205460ff1681565b6000543373ffffffffffffffffffffffffffffffffffffffff9081169116146113e657600080fd5b73ffffffffffffffffffffffffffffffffffffffff81166000908152600660205260409081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690557fd7e9ec6e6ecd65492dce6bf513cd6867560d49544421d0783ddf06e76c24470c9082905173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a150565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81565b6000543373ffffffffffffffffffffffffffffffffffffffff9081169116146114cc57600080fd5b73ffffffffffffffffffffffffffffffffffffffff81161561152957600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83161790555b50565b600080543373ffffffffffffffffffffffffffffffffffffffff90811691161461155557600080fd5b73ffffffffffffffffffffffffffffffffffffffff821660009081526006602052604090205460ff16151561158957600080fd5b61159282610ce4565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260026020526040808220919091556001805483900390559091507f61e6e66b0d6339b2980aecc6ccc0039736791f0ccde9ed512e789a7fbdd698c690839083905173ffffffffffffffffffffffffffffffffffffffff909216825260208201526040908101905180910390a15050565b6040604436101561162e57600080fd5b811580159061166e575073ffffffffffffffffffffffffffffffffffffffff33811660009081526005602090815260408083209387168352929052205415155b1561167857600080fd5b73ffffffffffffffffffffffffffffffffffffffff338116600081815260056020908152604080832094881680845294909152908190208590557f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259085905190815260200160405180910390a3505050565b60008080606060643610156116fe57600080fd5b73ffffffffffffffffffffffffffffffffffffffff8088166000908152600560209081526040808320339094168352929052205460035490945061175d906127109061175190889063ffffffff611bcb16565b9063ffffffff611c3916565b925060045483111561176f5760045492505b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8410156117dc576117a7848663ffffffff611c5016565b73ffffffffffffffffffffffffffffffffffffffff808916600090815260056020908152604080832033909416835292905220555b6117ec858463ffffffff611c5016565b73ffffffffffffffffffffffffffffffffffffffff8816600090815260026020526040902054909250611825908663ffffffff611c5016565b73ffffffffffffffffffffffffffffffffffffffff8089166000908152600260205260408082209390935590881681522054611867908363ffffffff611c6216565b73ffffffffffffffffffffffffffffffffffffffff8716600090815260026020526040812091909155831115611936576000805473ffffffffffffffffffffffffffffffffffffffff168152600260205260409020546118cd908463ffffffff611c6216565b6000805473ffffffffffffffffffffffffffffffffffffffff908116825260026020526040808320939093559054811691908916907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9086905190815260200160405180910390a35b8573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405190815260200160405180910390a350505050505050565b73ffffffffffffffffffffffffffffffffffffffff1660009081526002602052604090205490565b600080604060443610156119db57600080fd5b6119f661271061175160035487611bcb90919063ffffffff16565b9250600454831115611a085760045492505b611a18848463ffffffff611c5016565b73ffffffffffffffffffffffffffffffffffffffff3316600090815260026020526040902054909250611a51908563ffffffff611c5016565b73ffffffffffffffffffffffffffffffffffffffff3381166000908152600260205260408082209390935590871681522054611a93908363ffffffff611c6216565b73ffffffffffffffffffffffffffffffffffffffff8616600090815260026020526040812091909155831115611b63576000805473ffffffffffffffffffffffffffffffffffffffff16815260026020526040902054611af9908463ffffffff611c6216565b6000805473ffffffffffffffffffffffffffffffffffffffff90811682526002602052604080832093909355905481169133909116907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9086905190815260200160405180910390a35b8473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405190815260200160405180910390a35050505050565b600080831515611bde5760009150611bfa565b50828202828482811515611bee57fe5b0414611bf657fe5b8091505b5092915050565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260056020908152604080832093909416825291909152205490565b6000808284811515611c4757fe5b04949350505050565b600082821115611c5c57fe5b50900390565b600082820183811015611bf657fe00a165627a7a72305820c6c7ec5e3bee0b2db470f633175dd5c4c1900658f43d73e4f34ffa2e46d86ab80029", + "opcodes": "PUSH1 0x60 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 SLOAD PUSH1 0xA0 PUSH1 0x2 EXP PUSH1 0xFF MUL NOT AND DUP2 SSTORE PUSH1 0x3 DUP2 SWAP1 SSTORE PUSH1 0x4 SSTORE CALLVALUE ISZERO PUSH3 0x28 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH3 0x1E2F CODESIZE SUB DUP1 PUSH3 0x1E2F DUP4 CODECOPY DUP2 ADD PUSH1 0x40 MSTORE DUP1 DUP1 MLOAD SWAP2 SWAP1 PUSH1 0x20 ADD DUP1 MLOAD DUP3 ADD SWAP2 SWAP1 PUSH1 0x20 ADD DUP1 MLOAD DUP3 ADD SWAP2 SWAP1 PUSH1 0x20 ADD DUP1 MLOAD PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB NOT AND CALLER PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND OR SWAP1 SSTORE PUSH1 0x1 DUP7 SWAP1 SSTORE SWAP2 POP PUSH1 0x7 SWAP1 POP DUP4 DUP1 MLOAD PUSH3 0x92 SWAP3 SWAP2 PUSH1 0x20 ADD SWAP1 PUSH3 0xDD JUMP JUMPDEST POP PUSH1 0x8 DUP3 DUP1 MLOAD PUSH3 0xA8 SWAP3 SWAP2 PUSH1 0x20 ADD SWAP1 PUSH3 0xDD JUMP JUMPDEST POP PUSH1 0x9 SSTORE POP POP PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SSTORE PUSH1 0xA DUP1 SLOAD PUSH1 0xA0 PUSH1 0x2 EXP PUSH1 0xFF MUL NOT AND SWAP1 SSTORE PUSH3 0x182 JUMP JUMPDEST DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x1F ADD PUSH1 0x20 SWAP1 DIV DUP2 ADD SWAP3 DUP3 PUSH1 0x1F LT PUSH3 0x120 JUMPI DUP1 MLOAD PUSH1 0xFF NOT AND DUP4 DUP1 ADD OR DUP6 SSTORE PUSH3 0x150 JUMP JUMPDEST DUP3 DUP1 ADD PUSH1 0x1 ADD DUP6 SSTORE DUP3 ISZERO PUSH3 0x150 JUMPI SWAP2 DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH3 0x150 JUMPI DUP3 MLOAD DUP3 SSTORE SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH3 0x133 JUMP JUMPDEST POP PUSH3 0x15E SWAP3 SWAP2 POP PUSH3 0x162 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH3 0x17F SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH3 0x15E JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH3 0x169 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x1C9D DUP1 PUSH3 0x192 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN STOP PUSH1 0x60 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x195 JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x6FDDE03 DUP2 EQ PUSH2 0x19A JUMPI DUP1 PUSH4 0x753C30C EQ PUSH2 0x224 JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x252 JUMPI DUP1 PUSH4 0xE136B19 EQ PUSH2 0x281 JUMPI DUP1 PUSH4 0xECB93C0 EQ PUSH2 0x2A8 JUMPI DUP1 PUSH4 0x18160DDD EQ PUSH2 0x2D4 JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x2F9 JUMPI DUP1 PUSH4 0x26976E3F EQ PUSH2 0x32E JUMPI DUP1 PUSH4 0x27E235E3 EQ PUSH2 0x36A JUMPI DUP1 PUSH4 0x313CE567 EQ PUSH2 0x396 JUMPI DUP1 PUSH4 0x35390714 EQ PUSH2 0x3A9 JUMPI DUP1 PUSH4 0x3EAAF86B EQ PUSH2 0x3BC JUMPI DUP1 PUSH4 0x3F4BA83A EQ PUSH2 0x3CF JUMPI DUP1 PUSH4 0x59BF1ABE EQ PUSH2 0x3E2 JUMPI DUP1 PUSH4 0x5C658165 EQ PUSH2 0x40E JUMPI DUP1 PUSH4 0x5C975ABB EQ PUSH2 0x440 JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x453 JUMPI DUP1 PUSH4 0x8456CB59 EQ PUSH2 0x47F JUMPI DUP1 PUSH4 0x893D20E8 EQ PUSH2 0x492 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x4A5 JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x4B8 JUMPI DUP1 PUSH4 0xA9059CBB EQ PUSH2 0x4CB JUMPI DUP1 PUSH4 0xC0324C77 EQ PUSH2 0x4FA JUMPI DUP1 PUSH4 0xCC872B66 EQ PUSH2 0x513 JUMPI DUP1 PUSH4 0xDB006A75 EQ PUSH2 0x529 JUMPI DUP1 PUSH4 0xDD62ED3E EQ PUSH2 0x53F JUMPI DUP1 PUSH4 0xDD644F72 EQ PUSH2 0x571 JUMPI DUP1 PUSH4 0xE47D6060 EQ PUSH2 0x584 JUMPI DUP1 PUSH4 0xE4997DC5 EQ PUSH2 0x5B0 JUMPI DUP1 PUSH4 0xE5B5019A EQ PUSH2 0x5DC JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x5EF JUMPI DUP1 PUSH4 0xF3BDC228 EQ PUSH2 0x61B JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE ISZERO PUSH2 0x1A5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1AD PUSH2 0x647 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 SWAP1 DUP2 ADD DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1E9 JUMPI DUP1 DUP3 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x1D1 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x216 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE ISZERO PUSH2 0x22F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x250 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0x6E5 JUMP JUMPDEST STOP JUMPDEST CALLVALUE ISZERO PUSH2 0x25D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x250 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH1 0x24 CALLDATALOAD PUSH2 0x7D5 JUMP JUMPDEST CALLVALUE ISZERO PUSH2 0x28C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x294 PUSH2 0x8C6 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE ISZERO PUSH2 0x2B3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x250 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0x8E7 JUMP JUMPDEST CALLVALUE ISZERO PUSH2 0x2DF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x2E7 PUSH2 0x9AC JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE ISZERO PUSH2 0x304 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x250 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD DUP2 AND SWAP1 PUSH1 0x24 CALLDATALOAD AND PUSH1 0x44 CALLDATALOAD PUSH2 0xA6A JUMP JUMPDEST CALLVALUE ISZERO PUSH2 0x339 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x341 PUSH2 0xB90 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE ISZERO PUSH2 0x375 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x2E7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0xBAC JUMP JUMPDEST CALLVALUE ISZERO PUSH2 0x3A1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x2E7 PUSH2 0xBBE JUMP JUMPDEST CALLVALUE ISZERO PUSH2 0x3B4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x2E7 PUSH2 0xBC4 JUMP JUMPDEST CALLVALUE ISZERO PUSH2 0x3C7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x2E7 PUSH2 0xBCA JUMP JUMPDEST CALLVALUE ISZERO PUSH2 0x3DA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x250 PUSH2 0xBD0 JUMP JUMPDEST CALLVALUE ISZERO PUSH2 0x3ED JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x294 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0xC77 JUMP JUMPDEST CALLVALUE ISZERO PUSH2 0x419 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x2E7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD DUP2 AND SWAP1 PUSH1 0x24 CALLDATALOAD AND PUSH2 0xCA6 JUMP JUMPDEST CALLVALUE ISZERO PUSH2 0x44B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x294 PUSH2 0xCC3 JUMP JUMPDEST CALLVALUE ISZERO PUSH2 0x45E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x2E7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0xCE4 JUMP JUMPDEST CALLVALUE ISZERO PUSH2 0x48A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x250 PUSH2 0xDC8 JUMP JUMPDEST CALLVALUE ISZERO PUSH2 0x49D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x341 PUSH2 0xE85 JUMP JUMPDEST CALLVALUE ISZERO PUSH2 0x4B0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x341 PUSH2 0xEA1 JUMP JUMPDEST CALLVALUE ISZERO PUSH2 0x4C3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1AD PUSH2 0xEBD JUMP JUMPDEST CALLVALUE ISZERO PUSH2 0x4D6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x250 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH1 0x24 CALLDATALOAD PUSH2 0xF28 JUMP JUMPDEST CALLVALUE ISZERO PUSH2 0x505 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x250 PUSH1 0x4 CALLDATALOAD PUSH1 0x24 CALLDATALOAD PUSH2 0x1063 JUMP JUMPDEST CALLVALUE ISZERO PUSH2 0x51E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x250 PUSH1 0x4 CALLDATALOAD PUSH2 0x1106 JUMP JUMPDEST CALLVALUE ISZERO PUSH2 0x534 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x250 PUSH1 0x4 CALLDATALOAD PUSH2 0x11DC JUMP JUMPDEST CALLVALUE ISZERO PUSH2 0x54A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x2E7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD DUP2 AND SWAP1 PUSH1 0x24 CALLDATALOAD AND PUSH2 0x12B4 JUMP JUMPDEST CALLVALUE ISZERO PUSH2 0x57C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x2E7 PUSH2 0x13A3 JUMP JUMPDEST CALLVALUE ISZERO PUSH2 0x58F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x294 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0x13A9 JUMP JUMPDEST CALLVALUE ISZERO PUSH2 0x5BB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x250 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0x13BE JUMP JUMPDEST CALLVALUE ISZERO PUSH2 0x5E7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x2E7 PUSH2 0x1480 JUMP JUMPDEST CALLVALUE ISZERO PUSH2 0x5FA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x250 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0x14A4 JUMP JUMPDEST CALLVALUE ISZERO PUSH2 0x626 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x250 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0x152C JUMP JUMPDEST PUSH1 0x7 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x6DD JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x6B2 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x6DD JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x6C0 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP DUP2 JUMP JUMPDEST PUSH1 0x0 SLOAD CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 DUP2 AND SWAP2 AND EQ PUSH2 0x70D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0xA DUP1 SLOAD PUSH21 0x10000000000000000000000000000000000000000 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND OR PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND OR SWAP1 SSTORE PUSH32 0xCC358699805E9A8B7F77B522628C7CB9ABD07D9EFB86B6FB616AF1609036A99E DUP2 PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP JUMP JUMPDEST PUSH1 0x40 PUSH1 0x44 CALLDATASIZE LT ISZERO PUSH2 0x7E5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0xA SLOAD PUSH21 0x10000000000000000000000000000000000000000 SWAP1 DIV PUSH1 0xFF AND ISZERO PUSH2 0x8B7 JUMPI PUSH1 0xA SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xAEE92D33 CALLER DUP6 DUP6 PUSH1 0x40 MLOAD PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH4 0xFFFFFFFF DUP7 AND MUL DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP4 DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE SWAP2 SWAP1 SWAP3 AND PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x44 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x64 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO ISZERO PUSH2 0x89E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x2C6 GAS SUB CALL ISZERO ISZERO PUSH2 0x8AF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP POP POP PUSH2 0x8C1 JUMP JUMPDEST PUSH2 0x8C1 DUP4 DUP4 PUSH2 0x161E JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0xA SLOAD PUSH21 0x10000000000000000000000000000000000000000 SWAP1 DIV PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 SLOAD CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 DUP2 AND SWAP2 AND EQ PUSH2 0x90F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x6 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE PUSH32 0x42E160154868087D6BFDC0CA23D96A1C1CFA32F1B72BA9BA27B69B98A0D819DC SWAP1 DUP3 SWAP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP JUMP JUMPDEST PUSH1 0xA SLOAD PUSH1 0x0 SWAP1 PUSH21 0x10000000000000000000000000000000000000000 SWAP1 DIV PUSH1 0xFF AND ISZERO PUSH2 0xA62 JUMPI PUSH1 0xA SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x18160DDD PUSH1 0x0 PUSH1 0x40 MLOAD PUSH1 0x20 ADD MSTORE PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO ISZERO PUSH2 0xA40 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x2C6 GAS SUB CALL ISZERO ISZERO PUSH2 0xA51 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP POP POP PUSH1 0x40 MLOAD DUP1 MLOAD SWAP1 POP SWAP1 POP PUSH2 0xA67 JUMP JUMPDEST POP PUSH1 0x1 SLOAD JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH21 0x10000000000000000000000000000000000000000 SWAP1 DIV PUSH1 0xFF AND ISZERO PUSH2 0xA92 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x6 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND ISZERO PUSH2 0xAC5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0xA SLOAD PUSH21 0x10000000000000000000000000000000000000000 SWAP1 DIV PUSH1 0xFF AND ISZERO PUSH2 0xB85 JUMPI PUSH1 0xA SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x8B477ADB CALLER DUP6 DUP6 DUP6 PUSH1 0x40 MLOAD PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH4 0xFFFFFFFF DUP8 AND MUL DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 DUP6 AND PUSH1 0x4 DUP3 ADD MSTORE SWAP3 DUP5 AND PUSH1 0x24 DUP5 ADD MSTORE SWAP3 AND PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x84 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO ISZERO PUSH2 0x89E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x8C1 DUP4 DUP4 DUP4 PUSH2 0x16EA JUMP JUMPDEST PUSH1 0xA SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x9 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x4 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x1 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 SLOAD CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 DUP2 AND SWAP2 AND EQ PUSH2 0xBF8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH21 0x10000000000000000000000000000000000000000 SWAP1 DIV PUSH1 0xFF AND ISZERO ISZERO PUSH2 0xC21 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 SSTORE PUSH32 0x7805862F689E2F13DF9F062FF482AD3AD112ACA9E0847911ED832E158C525B33 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x6 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x5 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 SWAP1 SWAP2 MSTORE SWAP1 DUP3 MSTORE SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH21 0x10000000000000000000000000000000000000000 SWAP1 DIV PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0xA SLOAD PUSH1 0x0 SWAP1 PUSH21 0x10000000000000000000000000000000000000000 SWAP1 DIV PUSH1 0xFF AND ISZERO PUSH2 0xDB8 JUMPI PUSH1 0xA SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x70A08231 DUP4 PUSH1 0x0 PUSH1 0x40 MLOAD PUSH1 0x20 ADD MSTORE PUSH1 0x40 MLOAD PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH4 0xFFFFFFFF DUP5 AND MUL DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO ISZERO PUSH2 0xD96 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x2C6 GAS SUB CALL ISZERO ISZERO PUSH2 0xDA7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP POP POP PUSH1 0x40 MLOAD DUP1 MLOAD SWAP1 POP SWAP1 POP PUSH2 0xCA1 JUMP JUMPDEST PUSH2 0xDC1 DUP3 PUSH2 0x19A0 JUMP JUMPDEST SWAP1 POP PUSH2 0xCA1 JUMP JUMPDEST PUSH1 0x0 SLOAD CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 DUP2 AND SWAP2 AND EQ PUSH2 0xDF0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH21 0x10000000000000000000000000000000000000000 SWAP1 DIV PUSH1 0xFF AND ISZERO PUSH2 0xE18 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH21 0x10000000000000000000000000000000000000000 OR SWAP1 SSTORE PUSH32 0x6985A02210A168E66602D3235CB6DB0E70F92B3BA4D376A33C0F3D9434BFF625 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x8 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x6DD JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x6B2 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x6DD JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH21 0x10000000000000000000000000000000000000000 SWAP1 DIV PUSH1 0xFF AND ISZERO PUSH2 0xF50 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF CALLER AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x6 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND ISZERO PUSH2 0xF83 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0xA SLOAD PUSH21 0x10000000000000000000000000000000000000000 SWAP1 DIV PUSH1 0xFF AND ISZERO PUSH2 0x1055 JUMPI PUSH1 0xA SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x6E18980A CALLER DUP5 DUP5 PUSH1 0x40 MLOAD PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH4 0xFFFFFFFF DUP7 AND MUL DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP4 DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE SWAP2 SWAP1 SWAP3 AND PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x44 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x64 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO ISZERO PUSH2 0x103C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x2C6 GAS SUB CALL ISZERO ISZERO PUSH2 0x104D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP POP POP PUSH2 0x105F JUMP JUMPDEST PUSH2 0x105F DUP3 DUP3 PUSH2 0x19C8 JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 DUP2 AND SWAP2 AND EQ PUSH2 0x108B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x14 DUP3 LT PUSH2 0x1098 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x32 DUP2 LT PUSH2 0x10A5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x3 DUP3 SWAP1 SSTORE PUSH1 0x9 SLOAD PUSH2 0x10C1 SWAP1 DUP3 SWAP1 PUSH1 0xA EXP PUSH4 0xFFFFFFFF PUSH2 0x1BCB AND JUMP JUMPDEST PUSH1 0x4 DUP2 SWAP1 SSTORE PUSH1 0x3 SLOAD PUSH32 0xB044A1E409EAC5C48E5AF22D4AF52670DD1A99059537A78B31B48C6500A6354E SWAP2 PUSH1 0x40 MLOAD SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 SWAP1 DUP2 ADD SWAP1 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 DUP2 AND SWAP2 AND EQ PUSH2 0x112E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 SLOAD DUP2 DUP2 ADD GT PUSH2 0x113E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 DUP2 ADD GT PUSH2 0x1171 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD DUP4 ADD SWAP1 SSTORE PUSH1 0x1 DUP1 SLOAD DUP4 ADD SWAP1 SSTORE PUSH32 0xCB8241ADB0C3FDB35B70C24CE35C5EB0C17AF7431C99F827D44A445CA624176A SWAP1 DUP3 SWAP1 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP JUMP JUMPDEST PUSH1 0x0 SLOAD CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 DUP2 AND SWAP2 AND EQ PUSH2 0x1204 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 SLOAD DUP2 SWAP1 LT ISZERO PUSH2 0x1214 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 SWAP1 LT ISZERO PUSH2 0x1247 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 DUP1 SLOAD DUP3 SWAP1 SUB SWAP1 SSTORE PUSH1 0x0 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD DUP4 SWAP1 SUB SWAP1 SSTORE PUSH32 0x702D5967F45F6513A38FFC42D6BA9BF230BD40E8F53B16363C7EB4FD2DEB9A44 SWAP1 DUP3 SWAP1 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP JUMP JUMPDEST PUSH1 0xA SLOAD PUSH1 0x0 SWAP1 PUSH21 0x10000000000000000000000000000000000000000 SWAP1 DIV PUSH1 0xFF AND ISZERO PUSH2 0x1390 JUMPI PUSH1 0xA SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xDD62ED3E DUP5 DUP5 PUSH1 0x0 PUSH1 0x40 MLOAD PUSH1 0x20 ADD MSTORE PUSH1 0x40 MLOAD PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH4 0xFFFFFFFF DUP6 AND MUL DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 DUP4 AND PUSH1 0x4 DUP3 ADD MSTORE SWAP2 AND PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x44 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO ISZERO PUSH2 0x136E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x2C6 GAS SUB CALL ISZERO ISZERO PUSH2 0x137F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP POP POP PUSH1 0x40 MLOAD DUP1 MLOAD SWAP1 POP SWAP1 POP PUSH2 0x139D JUMP JUMPDEST PUSH2 0x139A DUP4 DUP4 PUSH2 0x1C01 JUMP JUMPDEST SWAP1 POP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x3 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x6 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 SLOAD CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 DUP2 AND SWAP2 AND EQ PUSH2 0x13E6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x6 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE PUSH32 0xD7E9EC6E6ECD65492DCE6BF513CD6867560D49544421D0783DDF06E76C24470C SWAP1 DUP3 SWAP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 JUMP JUMPDEST PUSH1 0x0 SLOAD CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 DUP2 AND SWAP2 AND EQ PUSH2 0x14CC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x1529 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND OR SWAP1 SSTORE JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 DUP2 AND SWAP2 AND EQ PUSH2 0x1555 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x6 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x1589 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1592 DUP3 PUSH2 0xCE4 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 SWAP2 SWAP1 SWAP2 SSTORE PUSH1 0x1 DUP1 SLOAD DUP4 SWAP1 SUB SWAP1 SSTORE SWAP1 SWAP2 POP PUSH32 0x61E6E66B0D6339B2980AECC6CCC0039736791F0CCDE9ED512E789A7FBDD698C6 SWAP1 DUP4 SWAP1 DUP4 SWAP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 SWAP1 DUP2 ADD SWAP1 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP POP JUMP JUMPDEST PUSH1 0x40 PUSH1 0x44 CALLDATASIZE LT ISZERO PUSH2 0x162E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ISZERO DUP1 ISZERO SWAP1 PUSH2 0x166E JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF CALLER DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP8 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD ISZERO ISZERO JUMPDEST ISZERO PUSH2 0x1678 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF CALLER DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 DUP9 AND DUP1 DUP5 MSTORE SWAP5 SWAP1 SWAP2 MSTORE SWAP1 DUP2 SWAP1 KECCAK256 DUP6 SWAP1 SSTORE PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP1 DUP6 SWAP1 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP1 PUSH1 0x60 PUSH1 0x64 CALLDATASIZE LT ISZERO PUSH2 0x16FE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP9 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 CALLER SWAP1 SWAP5 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD PUSH1 0x3 SLOAD SWAP1 SWAP5 POP PUSH2 0x175D SWAP1 PUSH2 0x2710 SWAP1 PUSH2 0x1751 SWAP1 DUP9 SWAP1 PUSH4 0xFFFFFFFF PUSH2 0x1BCB AND JUMP JUMPDEST SWAP1 PUSH4 0xFFFFFFFF PUSH2 0x1C39 AND JUMP JUMPDEST SWAP3 POP PUSH1 0x4 SLOAD DUP4 GT ISZERO PUSH2 0x176F JUMPI PUSH1 0x4 SLOAD SWAP3 POP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 LT ISZERO PUSH2 0x17DC JUMPI PUSH2 0x17A7 DUP5 DUP7 PUSH4 0xFFFFFFFF PUSH2 0x1C50 AND JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP10 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 CALLER SWAP1 SWAP5 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SSTORE JUMPDEST PUSH2 0x17EC DUP6 DUP5 PUSH4 0xFFFFFFFF PUSH2 0x1C50 AND JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 SWAP3 POP PUSH2 0x1825 SWAP1 DUP7 PUSH4 0xFFFFFFFF PUSH2 0x1C50 AND JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP10 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 SWAP4 SWAP1 SWAP4 SSTORE SWAP1 DUP9 AND DUP2 MSTORE KECCAK256 SLOAD PUSH2 0x1867 SWAP1 DUP4 PUSH4 0xFFFFFFFF PUSH2 0x1C62 AND JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SWAP2 SWAP1 SWAP2 SSTORE DUP4 GT ISZERO PUSH2 0x1936 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH2 0x18CD SWAP1 DUP5 PUSH4 0xFFFFFFFF PUSH2 0x1C62 AND JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 DUP2 AND DUP3 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 SWAP1 SWAP4 SSTORE SWAP1 SLOAD DUP2 AND SWAP2 SWAP1 DUP10 AND SWAP1 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP1 DUP7 SWAP1 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 JUMPDEST DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP5 PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 PUSH1 0x44 CALLDATASIZE LT ISZERO PUSH2 0x19DB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x19F6 PUSH2 0x2710 PUSH2 0x1751 PUSH1 0x3 SLOAD DUP8 PUSH2 0x1BCB SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST SWAP3 POP PUSH1 0x4 SLOAD DUP4 GT ISZERO PUSH2 0x1A08 JUMPI PUSH1 0x4 SLOAD SWAP3 POP JUMPDEST PUSH2 0x1A18 DUP5 DUP5 PUSH4 0xFFFFFFFF PUSH2 0x1C50 AND JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF CALLER AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 SWAP3 POP PUSH2 0x1A51 SWAP1 DUP6 PUSH4 0xFFFFFFFF PUSH2 0x1C50 AND JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF CALLER DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 SWAP4 SWAP1 SWAP4 SSTORE SWAP1 DUP8 AND DUP2 MSTORE KECCAK256 SLOAD PUSH2 0x1A93 SWAP1 DUP4 PUSH4 0xFFFFFFFF PUSH2 0x1C62 AND JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SWAP2 SWAP1 SWAP2 SSTORE DUP4 GT ISZERO PUSH2 0x1B63 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH2 0x1AF9 SWAP1 DUP5 PUSH4 0xFFFFFFFF PUSH2 0x1C62 AND JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 DUP2 AND DUP3 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 SWAP1 SWAP4 SSTORE SWAP1 SLOAD DUP2 AND SWAP2 CALLER SWAP1 SWAP2 AND SWAP1 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP1 DUP7 SWAP1 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 JUMPDEST DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP5 PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 ISZERO ISZERO PUSH2 0x1BDE JUMPI PUSH1 0x0 SWAP2 POP PUSH2 0x1BFA JUMP JUMPDEST POP DUP3 DUP3 MUL DUP3 DUP5 DUP3 DUP2 ISZERO ISZERO PUSH2 0x1BEE JUMPI INVALID JUMPDEST DIV EQ PUSH2 0x1BF6 JUMPI INVALID JUMPDEST DUP1 SWAP2 POP JUMPDEST POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 SWAP1 SWAP5 AND DUP3 MSTORE SWAP2 SWAP1 SWAP2 MSTORE KECCAK256 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 DUP5 DUP2 ISZERO ISZERO PUSH2 0x1C47 JUMPI INVALID JUMPDEST DIV SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0x1C5C JUMPI INVALID JUMPDEST POP SWAP1 SUB SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH2 0x1BF6 JUMPI INVALID STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 0xc6 0xc7 0xec 0x5e EXTCODESIZE 0xee SIGNEXTEND 0x2d 0xb4 PUSH17 0xF633175DD5C4C1900658F43D73E4F34FFA 0x2e 0x46 0xd8 PUSH11 0xB800290000000000000000 ", + "sourceMap": "9728:4781:0:-;;;7405:5;7384:26;;-1:-1:-1;;;;;;7384:26:0;;;3041:31;;;;3078:26;;10223:289;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1378:5;:18;;-1:-1:-1;;;;;;1378:18:0;1386:10;-1:-1:-1;;;;;1378:18:0;;;;-1:-1:-1;10328:29:0;;;10223:289;-1:-1:-1;10367:4:0;;-1:-1:-1;10374:5:0;;10367:12;;;;;;;;:::i;:::-;-1:-1:-1;10389:6:0;10398:7;;10389:16;;;;;;;;:::i;:::-;-1:-1:-1;10415:8:0;:20;-1:-1:-1;;10445:15:0;10454:5;;-1:-1:-1;;;;;10454:5:0;10445:15;;:8;:15;;;;;:32;10487:10;:18;;-1:-1:-1;;;;;;10487:18:0;;;9728:4781;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9728:4781:0;;;-1:-1:-1;9728:4781:0;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;" + }, + "deployedBytecode": { + "linkReferences": {}, + "object": "6060604052600436106101955763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166306fdde03811461019a5780630753c30c14610224578063095ea7b3146102525780630e136b19146102815780630ecb93c0146102a857806318160ddd146102d457806323b872dd146102f957806326976e3f1461032e57806327e235e31461036a578063313ce5671461039657806335390714146103a95780633eaaf86b146103bc5780633f4ba83a146103cf57806359bf1abe146103e25780635c6581651461040e5780635c975abb1461044057806370a08231146104535780638456cb591461047f578063893d20e8146104925780638da5cb5b146104a557806395d89b41146104b8578063a9059cbb146104cb578063c0324c77146104fa578063cc872b6614610513578063db006a7514610529578063dd62ed3e1461053f578063dd644f7214610571578063e47d606014610584578063e4997dc5146105b0578063e5b5019a146105dc578063f2fde38b146105ef578063f3bdc2281461061b575b600080fd5b34156101a557600080fd5b6101ad610647565b60405160208082528190810183818151815260200191508051906020019080838360005b838110156101e95780820151838201526020016101d1565b50505050905090810190601f1680156102165780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561022f57600080fd5b61025073ffffffffffffffffffffffffffffffffffffffff600435166106e5565b005b341561025d57600080fd5b61025073ffffffffffffffffffffffffffffffffffffffff600435166024356107d5565b341561028c57600080fd5b6102946108c6565b604051901515815260200160405180910390f35b34156102b357600080fd5b61025073ffffffffffffffffffffffffffffffffffffffff600435166108e7565b34156102df57600080fd5b6102e76109ac565b60405190815260200160405180910390f35b341561030457600080fd5b61025073ffffffffffffffffffffffffffffffffffffffff60043581169060243516604435610a6a565b341561033957600080fd5b610341610b90565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b341561037557600080fd5b6102e773ffffffffffffffffffffffffffffffffffffffff60043516610bac565b34156103a157600080fd5b6102e7610bbe565b34156103b457600080fd5b6102e7610bc4565b34156103c757600080fd5b6102e7610bca565b34156103da57600080fd5b610250610bd0565b34156103ed57600080fd5b61029473ffffffffffffffffffffffffffffffffffffffff60043516610c77565b341561041957600080fd5b6102e773ffffffffffffffffffffffffffffffffffffffff60043581169060243516610ca6565b341561044b57600080fd5b610294610cc3565b341561045e57600080fd5b6102e773ffffffffffffffffffffffffffffffffffffffff60043516610ce4565b341561048a57600080fd5b610250610dc8565b341561049d57600080fd5b610341610e85565b34156104b057600080fd5b610341610ea1565b34156104c357600080fd5b6101ad610ebd565b34156104d657600080fd5b61025073ffffffffffffffffffffffffffffffffffffffff60043516602435610f28565b341561050557600080fd5b610250600435602435611063565b341561051e57600080fd5b610250600435611106565b341561053457600080fd5b6102506004356111dc565b341561054a57600080fd5b6102e773ffffffffffffffffffffffffffffffffffffffff600435811690602435166112b4565b341561057c57600080fd5b6102e76113a3565b341561058f57600080fd5b61029473ffffffffffffffffffffffffffffffffffffffff600435166113a9565b34156105bb57600080fd5b61025073ffffffffffffffffffffffffffffffffffffffff600435166113be565b34156105e757600080fd5b6102e7611480565b34156105fa57600080fd5b61025073ffffffffffffffffffffffffffffffffffffffff600435166114a4565b341561062657600080fd5b61025073ffffffffffffffffffffffffffffffffffffffff6004351661152c565b60078054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156106dd5780601f106106b2576101008083540402835291602001916106dd565b820191906000526020600020905b8154815290600101906020018083116106c057829003601f168201915b505050505081565b6000543373ffffffffffffffffffffffffffffffffffffffff90811691161461070d57600080fd5b600a8054740100000000000000000000000000000000000000007fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff909116177fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83161790557fcc358699805e9a8b7f77b522628c7cb9abd07d9efb86b6fb616af1609036a99e8160405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a150565b604060443610156107e557600080fd5b600a5474010000000000000000000000000000000000000000900460ff16156108b757600a5473ffffffffffffffffffffffffffffffffffffffff1663aee92d333385856040517c010000000000000000000000000000000000000000000000000000000063ffffffff861602815273ffffffffffffffffffffffffffffffffffffffff93841660048201529190921660248201526044810191909152606401600060405180830381600087803b151561089e57600080fd5b6102c65a03f115156108af57600080fd5b5050506108c1565b6108c1838361161e565b505050565b600a5474010000000000000000000000000000000000000000900460ff1681565b6000543373ffffffffffffffffffffffffffffffffffffffff90811691161461090f57600080fd5b73ffffffffffffffffffffffffffffffffffffffff81166000908152600660205260409081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790557f42e160154868087d6bfdc0ca23d96a1c1cfa32f1b72ba9ba27b69b98a0d819dc9082905173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a150565b600a5460009074010000000000000000000000000000000000000000900460ff1615610a6257600a5473ffffffffffffffffffffffffffffffffffffffff166318160ddd6000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515610a4057600080fd5b6102c65a03f11515610a5157600080fd5b505050604051805190509050610a67565b506001545b90565b60005474010000000000000000000000000000000000000000900460ff1615610a9257600080fd5b73ffffffffffffffffffffffffffffffffffffffff831660009081526006602052604090205460ff1615610ac557600080fd5b600a5474010000000000000000000000000000000000000000900460ff1615610b8557600a5473ffffffffffffffffffffffffffffffffffffffff16638b477adb338585856040517c010000000000000000000000000000000000000000000000000000000063ffffffff871602815273ffffffffffffffffffffffffffffffffffffffff94851660048201529284166024840152921660448201526064810191909152608401600060405180830381600087803b151561089e57600080fd5b6108c18383836116ea565b600a5473ffffffffffffffffffffffffffffffffffffffff1681565b60026020526000908152604090205481565b60095481565b60045481565b60015481565b6000543373ffffffffffffffffffffffffffffffffffffffff908116911614610bf857600080fd5b60005474010000000000000000000000000000000000000000900460ff161515610c2157600080fd5b600080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690557f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b73ffffffffffffffffffffffffffffffffffffffff811660009081526006602052604090205460ff165b919050565b600560209081526000928352604080842090915290825290205481565b60005474010000000000000000000000000000000000000000900460ff1681565b600a5460009074010000000000000000000000000000000000000000900460ff1615610db857600a5473ffffffffffffffffffffffffffffffffffffffff166370a08231836000604051602001526040517c010000000000000000000000000000000000000000000000000000000063ffffffff841602815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401602060405180830381600087803b1515610d9657600080fd5b6102c65a03f11515610da757600080fd5b505050604051805190509050610ca1565b610dc1826119a0565b9050610ca1565b6000543373ffffffffffffffffffffffffffffffffffffffff908116911614610df057600080fd5b60005474010000000000000000000000000000000000000000900460ff1615610e1857600080fd5b600080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790557f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b60005473ffffffffffffffffffffffffffffffffffffffff1690565b60005473ffffffffffffffffffffffffffffffffffffffff1681565b60088054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156106dd5780601f106106b2576101008083540402835291602001916106dd565b60005474010000000000000000000000000000000000000000900460ff1615610f5057600080fd5b73ffffffffffffffffffffffffffffffffffffffff331660009081526006602052604090205460ff1615610f8357600080fd5b600a5474010000000000000000000000000000000000000000900460ff161561105557600a5473ffffffffffffffffffffffffffffffffffffffff16636e18980a3384846040517c010000000000000000000000000000000000000000000000000000000063ffffffff861602815273ffffffffffffffffffffffffffffffffffffffff93841660048201529190921660248201526044810191909152606401600060405180830381600087803b151561103c57600080fd5b6102c65a03f1151561104d57600080fd5b50505061105f565b61105f82826119c8565b5050565b6000543373ffffffffffffffffffffffffffffffffffffffff90811691161461108b57600080fd5b6014821061109857600080fd5b603281106110a557600080fd5b60038290556009546110c1908290600a0a63ffffffff611bcb16565b60048190556003547fb044a1e409eac5c48e5af22d4af52670dd1a99059537a78b31b48c6500a6354e9160405191825260208201526040908101905180910390a15050565b6000543373ffffffffffffffffffffffffffffffffffffffff90811691161461112e57600080fd5b6001548181011161113e57600080fd5b6000805473ffffffffffffffffffffffffffffffffffffffff168152600260205260409020548181011161117157600080fd5b6000805473ffffffffffffffffffffffffffffffffffffffff168152600260205260409081902080548301905560018054830190557fcb8241adb0c3fdb35b70c24ce35c5eb0c17af7431c99f827d44a445ca624176a9082905190815260200160405180910390a150565b6000543373ffffffffffffffffffffffffffffffffffffffff90811691161461120457600080fd5b6001548190101561121457600080fd5b6000805473ffffffffffffffffffffffffffffffffffffffff168152600260205260409020548190101561124757600080fd5b6001805482900390556000805473ffffffffffffffffffffffffffffffffffffffff1681526002602052604090819020805483900390557f702d5967f45f6513a38ffc42d6ba9bf230bd40e8f53b16363c7eb4fd2deb9a449082905190815260200160405180910390a150565b600a5460009074010000000000000000000000000000000000000000900460ff161561139057600a5473ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e84846000604051602001526040517c010000000000000000000000000000000000000000000000000000000063ffffffff851602815273ffffffffffffffffffffffffffffffffffffffff928316600482015291166024820152604401602060405180830381600087803b151561136e57600080fd5b6102c65a03f1151561137f57600080fd5b50505060405180519050905061139d565b61139a8383611c01565b90505b92915050565b60035481565b60066020526000908152604090205460ff1681565b6000543373ffffffffffffffffffffffffffffffffffffffff9081169116146113e657600080fd5b73ffffffffffffffffffffffffffffffffffffffff81166000908152600660205260409081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690557fd7e9ec6e6ecd65492dce6bf513cd6867560d49544421d0783ddf06e76c24470c9082905173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a150565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81565b6000543373ffffffffffffffffffffffffffffffffffffffff9081169116146114cc57600080fd5b73ffffffffffffffffffffffffffffffffffffffff81161561152957600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83161790555b50565b600080543373ffffffffffffffffffffffffffffffffffffffff90811691161461155557600080fd5b73ffffffffffffffffffffffffffffffffffffffff821660009081526006602052604090205460ff16151561158957600080fd5b61159282610ce4565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260026020526040808220919091556001805483900390559091507f61e6e66b0d6339b2980aecc6ccc0039736791f0ccde9ed512e789a7fbdd698c690839083905173ffffffffffffffffffffffffffffffffffffffff909216825260208201526040908101905180910390a15050565b6040604436101561162e57600080fd5b811580159061166e575073ffffffffffffffffffffffffffffffffffffffff33811660009081526005602090815260408083209387168352929052205415155b1561167857600080fd5b73ffffffffffffffffffffffffffffffffffffffff338116600081815260056020908152604080832094881680845294909152908190208590557f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259085905190815260200160405180910390a3505050565b60008080606060643610156116fe57600080fd5b73ffffffffffffffffffffffffffffffffffffffff8088166000908152600560209081526040808320339094168352929052205460035490945061175d906127109061175190889063ffffffff611bcb16565b9063ffffffff611c3916565b925060045483111561176f5760045492505b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8410156117dc576117a7848663ffffffff611c5016565b73ffffffffffffffffffffffffffffffffffffffff808916600090815260056020908152604080832033909416835292905220555b6117ec858463ffffffff611c5016565b73ffffffffffffffffffffffffffffffffffffffff8816600090815260026020526040902054909250611825908663ffffffff611c5016565b73ffffffffffffffffffffffffffffffffffffffff8089166000908152600260205260408082209390935590881681522054611867908363ffffffff611c6216565b73ffffffffffffffffffffffffffffffffffffffff8716600090815260026020526040812091909155831115611936576000805473ffffffffffffffffffffffffffffffffffffffff168152600260205260409020546118cd908463ffffffff611c6216565b6000805473ffffffffffffffffffffffffffffffffffffffff908116825260026020526040808320939093559054811691908916907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9086905190815260200160405180910390a35b8573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405190815260200160405180910390a350505050505050565b73ffffffffffffffffffffffffffffffffffffffff1660009081526002602052604090205490565b600080604060443610156119db57600080fd5b6119f661271061175160035487611bcb90919063ffffffff16565b9250600454831115611a085760045492505b611a18848463ffffffff611c5016565b73ffffffffffffffffffffffffffffffffffffffff3316600090815260026020526040902054909250611a51908563ffffffff611c5016565b73ffffffffffffffffffffffffffffffffffffffff3381166000908152600260205260408082209390935590871681522054611a93908363ffffffff611c6216565b73ffffffffffffffffffffffffffffffffffffffff8616600090815260026020526040812091909155831115611b63576000805473ffffffffffffffffffffffffffffffffffffffff16815260026020526040902054611af9908463ffffffff611c6216565b6000805473ffffffffffffffffffffffffffffffffffffffff90811682526002602052604080832093909355905481169133909116907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9086905190815260200160405180910390a35b8473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405190815260200160405180910390a35050505050565b600080831515611bde5760009150611bfa565b50828202828482811515611bee57fe5b0414611bf657fe5b8091505b5092915050565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260056020908152604080832093909416825291909152205490565b6000808284811515611c4757fe5b04949350505050565b600082821115611c5c57fe5b50900390565b600082820183811015611bf657fe00a165627a7a72305820c6c7ec5e3bee0b2db470f633175dd5c4c1900658f43d73e4f34ffa2e46d86ab80029", + "opcodes": "PUSH1 0x60 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x195 JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x6FDDE03 DUP2 EQ PUSH2 0x19A JUMPI DUP1 PUSH4 0x753C30C EQ PUSH2 0x224 JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x252 JUMPI DUP1 PUSH4 0xE136B19 EQ PUSH2 0x281 JUMPI DUP1 PUSH4 0xECB93C0 EQ PUSH2 0x2A8 JUMPI DUP1 PUSH4 0x18160DDD EQ PUSH2 0x2D4 JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x2F9 JUMPI DUP1 PUSH4 0x26976E3F EQ PUSH2 0x32E JUMPI DUP1 PUSH4 0x27E235E3 EQ PUSH2 0x36A JUMPI DUP1 PUSH4 0x313CE567 EQ PUSH2 0x396 JUMPI DUP1 PUSH4 0x35390714 EQ PUSH2 0x3A9 JUMPI DUP1 PUSH4 0x3EAAF86B EQ PUSH2 0x3BC JUMPI DUP1 PUSH4 0x3F4BA83A EQ PUSH2 0x3CF JUMPI DUP1 PUSH4 0x59BF1ABE EQ PUSH2 0x3E2 JUMPI DUP1 PUSH4 0x5C658165 EQ PUSH2 0x40E JUMPI DUP1 PUSH4 0x5C975ABB EQ PUSH2 0x440 JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x453 JUMPI DUP1 PUSH4 0x8456CB59 EQ PUSH2 0x47F JUMPI DUP1 PUSH4 0x893D20E8 EQ PUSH2 0x492 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x4A5 JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x4B8 JUMPI DUP1 PUSH4 0xA9059CBB EQ PUSH2 0x4CB JUMPI DUP1 PUSH4 0xC0324C77 EQ PUSH2 0x4FA JUMPI DUP1 PUSH4 0xCC872B66 EQ PUSH2 0x513 JUMPI DUP1 PUSH4 0xDB006A75 EQ PUSH2 0x529 JUMPI DUP1 PUSH4 0xDD62ED3E EQ PUSH2 0x53F JUMPI DUP1 PUSH4 0xDD644F72 EQ PUSH2 0x571 JUMPI DUP1 PUSH4 0xE47D6060 EQ PUSH2 0x584 JUMPI DUP1 PUSH4 0xE4997DC5 EQ PUSH2 0x5B0 JUMPI DUP1 PUSH4 0xE5B5019A EQ PUSH2 0x5DC JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x5EF JUMPI DUP1 PUSH4 0xF3BDC228 EQ PUSH2 0x61B JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE ISZERO PUSH2 0x1A5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1AD PUSH2 0x647 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 SWAP1 DUP2 ADD DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1E9 JUMPI DUP1 DUP3 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x1D1 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x216 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE ISZERO PUSH2 0x22F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x250 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0x6E5 JUMP JUMPDEST STOP JUMPDEST CALLVALUE ISZERO PUSH2 0x25D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x250 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH1 0x24 CALLDATALOAD PUSH2 0x7D5 JUMP JUMPDEST CALLVALUE ISZERO PUSH2 0x28C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x294 PUSH2 0x8C6 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE ISZERO PUSH2 0x2B3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x250 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0x8E7 JUMP JUMPDEST CALLVALUE ISZERO PUSH2 0x2DF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x2E7 PUSH2 0x9AC JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE ISZERO PUSH2 0x304 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x250 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD DUP2 AND SWAP1 PUSH1 0x24 CALLDATALOAD AND PUSH1 0x44 CALLDATALOAD PUSH2 0xA6A JUMP JUMPDEST CALLVALUE ISZERO PUSH2 0x339 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x341 PUSH2 0xB90 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE ISZERO PUSH2 0x375 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x2E7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0xBAC JUMP JUMPDEST CALLVALUE ISZERO PUSH2 0x3A1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x2E7 PUSH2 0xBBE JUMP JUMPDEST CALLVALUE ISZERO PUSH2 0x3B4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x2E7 PUSH2 0xBC4 JUMP JUMPDEST CALLVALUE ISZERO PUSH2 0x3C7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x2E7 PUSH2 0xBCA JUMP JUMPDEST CALLVALUE ISZERO PUSH2 0x3DA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x250 PUSH2 0xBD0 JUMP JUMPDEST CALLVALUE ISZERO PUSH2 0x3ED JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x294 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0xC77 JUMP JUMPDEST CALLVALUE ISZERO PUSH2 0x419 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x2E7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD DUP2 AND SWAP1 PUSH1 0x24 CALLDATALOAD AND PUSH2 0xCA6 JUMP JUMPDEST CALLVALUE ISZERO PUSH2 0x44B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x294 PUSH2 0xCC3 JUMP JUMPDEST CALLVALUE ISZERO PUSH2 0x45E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x2E7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0xCE4 JUMP JUMPDEST CALLVALUE ISZERO PUSH2 0x48A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x250 PUSH2 0xDC8 JUMP JUMPDEST CALLVALUE ISZERO PUSH2 0x49D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x341 PUSH2 0xE85 JUMP JUMPDEST CALLVALUE ISZERO PUSH2 0x4B0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x341 PUSH2 0xEA1 JUMP JUMPDEST CALLVALUE ISZERO PUSH2 0x4C3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1AD PUSH2 0xEBD JUMP JUMPDEST CALLVALUE ISZERO PUSH2 0x4D6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x250 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH1 0x24 CALLDATALOAD PUSH2 0xF28 JUMP JUMPDEST CALLVALUE ISZERO PUSH2 0x505 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x250 PUSH1 0x4 CALLDATALOAD PUSH1 0x24 CALLDATALOAD PUSH2 0x1063 JUMP JUMPDEST CALLVALUE ISZERO PUSH2 0x51E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x250 PUSH1 0x4 CALLDATALOAD PUSH2 0x1106 JUMP JUMPDEST CALLVALUE ISZERO PUSH2 0x534 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x250 PUSH1 0x4 CALLDATALOAD PUSH2 0x11DC JUMP JUMPDEST CALLVALUE ISZERO PUSH2 0x54A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x2E7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD DUP2 AND SWAP1 PUSH1 0x24 CALLDATALOAD AND PUSH2 0x12B4 JUMP JUMPDEST CALLVALUE ISZERO PUSH2 0x57C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x2E7 PUSH2 0x13A3 JUMP JUMPDEST CALLVALUE ISZERO PUSH2 0x58F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x294 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0x13A9 JUMP JUMPDEST CALLVALUE ISZERO PUSH2 0x5BB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x250 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0x13BE JUMP JUMPDEST CALLVALUE ISZERO PUSH2 0x5E7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x2E7 PUSH2 0x1480 JUMP JUMPDEST CALLVALUE ISZERO PUSH2 0x5FA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x250 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0x14A4 JUMP JUMPDEST CALLVALUE ISZERO PUSH2 0x626 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x250 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0x152C JUMP JUMPDEST PUSH1 0x7 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x6DD JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x6B2 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x6DD JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x6C0 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP DUP2 JUMP JUMPDEST PUSH1 0x0 SLOAD CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 DUP2 AND SWAP2 AND EQ PUSH2 0x70D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0xA DUP1 SLOAD PUSH21 0x10000000000000000000000000000000000000000 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND OR PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND OR SWAP1 SSTORE PUSH32 0xCC358699805E9A8B7F77B522628C7CB9ABD07D9EFB86B6FB616AF1609036A99E DUP2 PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP JUMP JUMPDEST PUSH1 0x40 PUSH1 0x44 CALLDATASIZE LT ISZERO PUSH2 0x7E5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0xA SLOAD PUSH21 0x10000000000000000000000000000000000000000 SWAP1 DIV PUSH1 0xFF AND ISZERO PUSH2 0x8B7 JUMPI PUSH1 0xA SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xAEE92D33 CALLER DUP6 DUP6 PUSH1 0x40 MLOAD PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH4 0xFFFFFFFF DUP7 AND MUL DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP4 DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE SWAP2 SWAP1 SWAP3 AND PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x44 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x64 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO ISZERO PUSH2 0x89E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x2C6 GAS SUB CALL ISZERO ISZERO PUSH2 0x8AF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP POP POP PUSH2 0x8C1 JUMP JUMPDEST PUSH2 0x8C1 DUP4 DUP4 PUSH2 0x161E JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0xA SLOAD PUSH21 0x10000000000000000000000000000000000000000 SWAP1 DIV PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 SLOAD CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 DUP2 AND SWAP2 AND EQ PUSH2 0x90F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x6 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE PUSH32 0x42E160154868087D6BFDC0CA23D96A1C1CFA32F1B72BA9BA27B69B98A0D819DC SWAP1 DUP3 SWAP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP JUMP JUMPDEST PUSH1 0xA SLOAD PUSH1 0x0 SWAP1 PUSH21 0x10000000000000000000000000000000000000000 SWAP1 DIV PUSH1 0xFF AND ISZERO PUSH2 0xA62 JUMPI PUSH1 0xA SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x18160DDD PUSH1 0x0 PUSH1 0x40 MLOAD PUSH1 0x20 ADD MSTORE PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO ISZERO PUSH2 0xA40 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x2C6 GAS SUB CALL ISZERO ISZERO PUSH2 0xA51 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP POP POP PUSH1 0x40 MLOAD DUP1 MLOAD SWAP1 POP SWAP1 POP PUSH2 0xA67 JUMP JUMPDEST POP PUSH1 0x1 SLOAD JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH21 0x10000000000000000000000000000000000000000 SWAP1 DIV PUSH1 0xFF AND ISZERO PUSH2 0xA92 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x6 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND ISZERO PUSH2 0xAC5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0xA SLOAD PUSH21 0x10000000000000000000000000000000000000000 SWAP1 DIV PUSH1 0xFF AND ISZERO PUSH2 0xB85 JUMPI PUSH1 0xA SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x8B477ADB CALLER DUP6 DUP6 DUP6 PUSH1 0x40 MLOAD PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH4 0xFFFFFFFF DUP8 AND MUL DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 DUP6 AND PUSH1 0x4 DUP3 ADD MSTORE SWAP3 DUP5 AND PUSH1 0x24 DUP5 ADD MSTORE SWAP3 AND PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x84 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO ISZERO PUSH2 0x89E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x8C1 DUP4 DUP4 DUP4 PUSH2 0x16EA JUMP JUMPDEST PUSH1 0xA SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x9 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x4 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x1 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 SLOAD CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 DUP2 AND SWAP2 AND EQ PUSH2 0xBF8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH21 0x10000000000000000000000000000000000000000 SWAP1 DIV PUSH1 0xFF AND ISZERO ISZERO PUSH2 0xC21 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 SSTORE PUSH32 0x7805862F689E2F13DF9F062FF482AD3AD112ACA9E0847911ED832E158C525B33 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x6 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x5 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 SWAP1 SWAP2 MSTORE SWAP1 DUP3 MSTORE SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH21 0x10000000000000000000000000000000000000000 SWAP1 DIV PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0xA SLOAD PUSH1 0x0 SWAP1 PUSH21 0x10000000000000000000000000000000000000000 SWAP1 DIV PUSH1 0xFF AND ISZERO PUSH2 0xDB8 JUMPI PUSH1 0xA SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x70A08231 DUP4 PUSH1 0x0 PUSH1 0x40 MLOAD PUSH1 0x20 ADD MSTORE PUSH1 0x40 MLOAD PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH4 0xFFFFFFFF DUP5 AND MUL DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO ISZERO PUSH2 0xD96 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x2C6 GAS SUB CALL ISZERO ISZERO PUSH2 0xDA7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP POP POP PUSH1 0x40 MLOAD DUP1 MLOAD SWAP1 POP SWAP1 POP PUSH2 0xCA1 JUMP JUMPDEST PUSH2 0xDC1 DUP3 PUSH2 0x19A0 JUMP JUMPDEST SWAP1 POP PUSH2 0xCA1 JUMP JUMPDEST PUSH1 0x0 SLOAD CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 DUP2 AND SWAP2 AND EQ PUSH2 0xDF0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH21 0x10000000000000000000000000000000000000000 SWAP1 DIV PUSH1 0xFF AND ISZERO PUSH2 0xE18 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH21 0x10000000000000000000000000000000000000000 OR SWAP1 SSTORE PUSH32 0x6985A02210A168E66602D3235CB6DB0E70F92B3BA4D376A33C0F3D9434BFF625 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x8 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x6DD JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x6B2 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x6DD JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH21 0x10000000000000000000000000000000000000000 SWAP1 DIV PUSH1 0xFF AND ISZERO PUSH2 0xF50 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF CALLER AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x6 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND ISZERO PUSH2 0xF83 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0xA SLOAD PUSH21 0x10000000000000000000000000000000000000000 SWAP1 DIV PUSH1 0xFF AND ISZERO PUSH2 0x1055 JUMPI PUSH1 0xA SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x6E18980A CALLER DUP5 DUP5 PUSH1 0x40 MLOAD PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH4 0xFFFFFFFF DUP7 AND MUL DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP4 DUP5 AND PUSH1 0x4 DUP3 ADD MSTORE SWAP2 SWAP1 SWAP3 AND PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x44 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x64 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO ISZERO PUSH2 0x103C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x2C6 GAS SUB CALL ISZERO ISZERO PUSH2 0x104D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP POP POP PUSH2 0x105F JUMP JUMPDEST PUSH2 0x105F DUP3 DUP3 PUSH2 0x19C8 JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 DUP2 AND SWAP2 AND EQ PUSH2 0x108B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x14 DUP3 LT PUSH2 0x1098 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x32 DUP2 LT PUSH2 0x10A5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x3 DUP3 SWAP1 SSTORE PUSH1 0x9 SLOAD PUSH2 0x10C1 SWAP1 DUP3 SWAP1 PUSH1 0xA EXP PUSH4 0xFFFFFFFF PUSH2 0x1BCB AND JUMP JUMPDEST PUSH1 0x4 DUP2 SWAP1 SSTORE PUSH1 0x3 SLOAD PUSH32 0xB044A1E409EAC5C48E5AF22D4AF52670DD1A99059537A78B31B48C6500A6354E SWAP2 PUSH1 0x40 MLOAD SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 SWAP1 DUP2 ADD SWAP1 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 DUP2 AND SWAP2 AND EQ PUSH2 0x112E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 SLOAD DUP2 DUP2 ADD GT PUSH2 0x113E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 DUP2 ADD GT PUSH2 0x1171 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD DUP4 ADD SWAP1 SSTORE PUSH1 0x1 DUP1 SLOAD DUP4 ADD SWAP1 SSTORE PUSH32 0xCB8241ADB0C3FDB35B70C24CE35C5EB0C17AF7431C99F827D44A445CA624176A SWAP1 DUP3 SWAP1 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP JUMP JUMPDEST PUSH1 0x0 SLOAD CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 DUP2 AND SWAP2 AND EQ PUSH2 0x1204 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 SLOAD DUP2 SWAP1 LT ISZERO PUSH2 0x1214 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 SWAP1 LT ISZERO PUSH2 0x1247 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 DUP1 SLOAD DUP3 SWAP1 SUB SWAP1 SSTORE PUSH1 0x0 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD DUP4 SWAP1 SUB SWAP1 SSTORE PUSH32 0x702D5967F45F6513A38FFC42D6BA9BF230BD40E8F53B16363C7EB4FD2DEB9A44 SWAP1 DUP3 SWAP1 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP JUMP JUMPDEST PUSH1 0xA SLOAD PUSH1 0x0 SWAP1 PUSH21 0x10000000000000000000000000000000000000000 SWAP1 DIV PUSH1 0xFF AND ISZERO PUSH2 0x1390 JUMPI PUSH1 0xA SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xDD62ED3E DUP5 DUP5 PUSH1 0x0 PUSH1 0x40 MLOAD PUSH1 0x20 ADD MSTORE PUSH1 0x40 MLOAD PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH4 0xFFFFFFFF DUP6 AND MUL DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 DUP4 AND PUSH1 0x4 DUP3 ADD MSTORE SWAP2 AND PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x44 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO ISZERO PUSH2 0x136E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x2C6 GAS SUB CALL ISZERO ISZERO PUSH2 0x137F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP POP POP PUSH1 0x40 MLOAD DUP1 MLOAD SWAP1 POP SWAP1 POP PUSH2 0x139D JUMP JUMPDEST PUSH2 0x139A DUP4 DUP4 PUSH2 0x1C01 JUMP JUMPDEST SWAP1 POP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x3 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x6 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 SLOAD CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 DUP2 AND SWAP2 AND EQ PUSH2 0x13E6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x6 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE PUSH32 0xD7E9EC6E6ECD65492DCE6BF513CD6867560D49544421D0783DDF06E76C24470C SWAP1 DUP3 SWAP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 JUMP JUMPDEST PUSH1 0x0 SLOAD CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 DUP2 AND SWAP2 AND EQ PUSH2 0x14CC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x1529 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND OR SWAP1 SSTORE JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 DUP2 AND SWAP2 AND EQ PUSH2 0x1555 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x6 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x1589 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1592 DUP3 PUSH2 0xCE4 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 SWAP2 SWAP1 SWAP2 SSTORE PUSH1 0x1 DUP1 SLOAD DUP4 SWAP1 SUB SWAP1 SSTORE SWAP1 SWAP2 POP PUSH32 0x61E6E66B0D6339B2980AECC6CCC0039736791F0CCDE9ED512E789A7FBDD698C6 SWAP1 DUP4 SWAP1 DUP4 SWAP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 SWAP1 DUP2 ADD SWAP1 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP POP JUMP JUMPDEST PUSH1 0x40 PUSH1 0x44 CALLDATASIZE LT ISZERO PUSH2 0x162E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ISZERO DUP1 ISZERO SWAP1 PUSH2 0x166E JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF CALLER DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP8 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD ISZERO ISZERO JUMPDEST ISZERO PUSH2 0x1678 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF CALLER DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 DUP9 AND DUP1 DUP5 MSTORE SWAP5 SWAP1 SWAP2 MSTORE SWAP1 DUP2 SWAP1 KECCAK256 DUP6 SWAP1 SSTORE PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP1 DUP6 SWAP1 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP1 PUSH1 0x60 PUSH1 0x64 CALLDATASIZE LT ISZERO PUSH2 0x16FE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP9 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 CALLER SWAP1 SWAP5 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD PUSH1 0x3 SLOAD SWAP1 SWAP5 POP PUSH2 0x175D SWAP1 PUSH2 0x2710 SWAP1 PUSH2 0x1751 SWAP1 DUP9 SWAP1 PUSH4 0xFFFFFFFF PUSH2 0x1BCB AND JUMP JUMPDEST SWAP1 PUSH4 0xFFFFFFFF PUSH2 0x1C39 AND JUMP JUMPDEST SWAP3 POP PUSH1 0x4 SLOAD DUP4 GT ISZERO PUSH2 0x176F JUMPI PUSH1 0x4 SLOAD SWAP3 POP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 LT ISZERO PUSH2 0x17DC JUMPI PUSH2 0x17A7 DUP5 DUP7 PUSH4 0xFFFFFFFF PUSH2 0x1C50 AND JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP10 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 CALLER SWAP1 SWAP5 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SSTORE JUMPDEST PUSH2 0x17EC DUP6 DUP5 PUSH4 0xFFFFFFFF PUSH2 0x1C50 AND JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 SWAP3 POP PUSH2 0x1825 SWAP1 DUP7 PUSH4 0xFFFFFFFF PUSH2 0x1C50 AND JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP10 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 SWAP4 SWAP1 SWAP4 SSTORE SWAP1 DUP9 AND DUP2 MSTORE KECCAK256 SLOAD PUSH2 0x1867 SWAP1 DUP4 PUSH4 0xFFFFFFFF PUSH2 0x1C62 AND JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SWAP2 SWAP1 SWAP2 SSTORE DUP4 GT ISZERO PUSH2 0x1936 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH2 0x18CD SWAP1 DUP5 PUSH4 0xFFFFFFFF PUSH2 0x1C62 AND JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 DUP2 AND DUP3 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 SWAP1 SWAP4 SSTORE SWAP1 SLOAD DUP2 AND SWAP2 SWAP1 DUP10 AND SWAP1 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP1 DUP7 SWAP1 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 JUMPDEST DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP5 PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 PUSH1 0x44 CALLDATASIZE LT ISZERO PUSH2 0x19DB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x19F6 PUSH2 0x2710 PUSH2 0x1751 PUSH1 0x3 SLOAD DUP8 PUSH2 0x1BCB SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST SWAP3 POP PUSH1 0x4 SLOAD DUP4 GT ISZERO PUSH2 0x1A08 JUMPI PUSH1 0x4 SLOAD SWAP3 POP JUMPDEST PUSH2 0x1A18 DUP5 DUP5 PUSH4 0xFFFFFFFF PUSH2 0x1C50 AND JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF CALLER AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 SWAP3 POP PUSH2 0x1A51 SWAP1 DUP6 PUSH4 0xFFFFFFFF PUSH2 0x1C50 AND JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF CALLER DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 SWAP4 SWAP1 SWAP4 SSTORE SWAP1 DUP8 AND DUP2 MSTORE KECCAK256 SLOAD PUSH2 0x1A93 SWAP1 DUP4 PUSH4 0xFFFFFFFF PUSH2 0x1C62 AND JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SWAP2 SWAP1 SWAP2 SSTORE DUP4 GT ISZERO PUSH2 0x1B63 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH2 0x1AF9 SWAP1 DUP5 PUSH4 0xFFFFFFFF PUSH2 0x1C62 AND JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 DUP2 AND DUP3 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 SWAP1 SWAP4 SSTORE SWAP1 SLOAD DUP2 AND SWAP2 CALLER SWAP1 SWAP2 AND SWAP1 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP1 DUP7 SWAP1 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 JUMPDEST DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP5 PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 ISZERO ISZERO PUSH2 0x1BDE JUMPI PUSH1 0x0 SWAP2 POP PUSH2 0x1BFA JUMP JUMPDEST POP DUP3 DUP3 MUL DUP3 DUP5 DUP3 DUP2 ISZERO ISZERO PUSH2 0x1BEE JUMPI INVALID JUMPDEST DIV EQ PUSH2 0x1BF6 JUMPI INVALID JUMPDEST DUP1 SWAP2 POP JUMPDEST POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 SWAP1 SWAP5 AND DUP3 MSTORE SWAP2 SWAP1 SWAP2 MSTORE KECCAK256 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 DUP5 DUP2 ISZERO ISZERO PUSH2 0x1C47 JUMPI INVALID JUMPDEST DIV SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0x1C5C JUMPI INVALID JUMPDEST POP SWAP1 SUB SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH2 0x1BF6 JUMPI INVALID STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 0xc6 0xc7 0xec 0x5e EXTCODESIZE 0xee SIGNEXTEND 0x2d 0xb4 PUSH17 0xF633175DD5C4C1900658F43D73E4F34FFA 0x2e 0x46 0xd8 PUSH11 0xB800290000000000000000 ", + "sourceMap": "9728:4781:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9794:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;71:3;;;64:6;52:2;45:3;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12480:177:0;;;;;;;;;;;;;;;;;;11752:296;;;;;;;;;;;;;;;;;;9906:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8505:142;;;;;;;;;;;;;;;;12720:212;;;;;;;;;;;;;;;;;;;;;;;;;;;10995:355;;;;;;;;;;;;;;;;;;;;;;;9870:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2916:40;;;;;;;;;;;;;;;;9844:20;;;;;;;;;;;;3078:26;;;;;;;;;;;;2043:24;;;;;;;;;;;;7970:87;;;;;;;;;;;;8229:122;;;;;;;;;;;;;;;;4652:61;;;;;;;;;;;;;;;;;;;;;7384:26;;;;;;;;;;;;11432:238;;;;;;;;;;;;;;;;7803:85;;;;;;;;;;;;8357;;;;;;;;;;;;1188:20;;;;;;;;;;;;9818;;;;;;;;;;;;10594:319;;;;;;;;;;;;;;;;;;13809:378;;;;;;;;;;;;;;;;13090:259;;;;;;;;;;;;;;13573:230;;;;;;;;;;;;;;12130:287;;;;;;;;;;;;;;;;;;;;;3041:31;;;;;;;;;;;;8448:46;;;;;;;;;;;;;;;;8653:157;;;;;;;;;;;;;;;;4720:42;;;;;;;;;;;;1738:147;;;;;;;;;;;;;;;;8816:318;;;;;;;;;;;;;;;;9794:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;12480:177::-;1546:5;;1532:10;1546:5;1532:19;;;1546:5;;1532:19;1524:28;;;;;;12552:10;:17;;;;;;;;12579:34;;;;;;;;12623:27;12579:34;12623:27;;;;;;;;;;;;;;;;;12480:177;:::o;11752:296::-;11823:6;3251:8;3233;:26;3231:29;3223:38;;;;;;11845:10;;;;;;;11841:201;;;11900:15;;;;11878:54;11933:10;11945:8;11955:6;11878:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11878:84:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11871:91;;11841:201;12000:31;12014:8;12024:6;12000:13;:31::i;:::-;11752:296;;;:::o;9906:22::-;;;;;;;;;:::o;8505:142::-;1546:5;;1532:10;1546:5;1532:19;;;1546:5;;1532:19;1524:28;;;;;;8574:24;;;;;;;:13;:24;;;;;;;:31;;;;8601:4;8574:31;;;8615:25;;8588:9;;8615:25;;;;;;;;;;;;;;;;8505:142;:::o;12720:212::-;12788:10;;12768:4;;12788:10;;;;;12784:142;;;12835:15;;;;12821:42;12835:15;12821:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12814:51;;;;12784:142;-1:-1:-1;12903:12:0;;12784:142;12720:212;:::o;10995:355::-;7553:6;;;;;;;7552:7;7544:16;;;;;;11098:20;;;;;;;:13;:20;;;;;;;;11097:21;11089:30;;;;;;11133:10;;;;;;;11129:215;;;11188:15;;;;11166:59;11226:10;11238:5;11245:3;11250:6;11166:91;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11166:91:0;;;;;;;;;;;;;;;;;11129:215;11295:38;11314:5;11321:3;11326:6;11295:18;:38::i;9870:30::-;;;;;;:::o;2916:40::-;;;;;;;;;;;;;:::o;9844:20::-;;;;:::o;3078:26::-;;;;:::o;2043:24::-;;;;:::o;7970:87::-;1546:5;;1532:10;1546:5;1532:19;;;1546:5;;1532:19;1524:28;;;;;;7705:6;;;;;;;7697:15;;;;;;;;8032:5;8023:14;;;;;;8043:9;;;;;;;;;;7970:87::o;8229:122::-;8323:21;;;8300:4;8323:21;;;:13;:21;;;;;;;;8229:122;;;;:::o;4652:61::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;7384:26::-;;;;;;;;;:::o;11432:238::-;11509:10;;11489:4;;11509:10;;;;;11505:159;;;11564:15;;;;11542:48;11591:3;11564:15;11542:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11535:60;;;;11505:159;11633:20;11649:3;11633:15;:20::i;:::-;11626:27;;;;7803:85;1546:5;;1532:10;1546:5;1532:19;;;1546:5;;1532:19;1524:28;;;;;;7553:6;;;;;;;7552:7;7544:16;;;;;;7857:6;:13;;;;;;;;7876:7;;;;;;;;;;7803:85::o;8357:::-;8404:7;8430:5;;;8357:85;:::o;1188:20::-;;;;;;:::o;9818:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10594:319;7553:6;;;;;;;7552:7;7544:16;;;;;;10678:25;10692:10;10678:25;;;;;:13;:25;;;;;;;;10677:26;10669:35;;;;;;10718:10;;;;;;;10714:193;;;10773:15;;;;10751:55;10807:10;10819:3;10824:6;10751:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10751:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10744:87;;10714:193;10869:27;10884:3;10889:6;10869:14;:27::i;:::-;10594:319;;:::o;13809:378::-;1546:5;;1532:10;1546:5;1532:19;;;1546:5;;1532:19;1524:28;;;;;;14005:2;13988:19;;13980:28;;;;;;14038:2;14026:14;;14018:23;;;;;;14052:15;:32;;;14125:8;;14107:27;;:9;;14121:2;:12;14107:27;:13;:27;:::i;:::-;14094:10;:40;;;14152:15;;14145:35;;;;;;;;;;;;;;;;;;;;;;13809:378;;:::o;13090:259::-;1546:5;;1532:10;1546:5;1532:19;;;1546:5;;1532:19;1524:28;;;;;;13177:12;;13153:21;;;:36;13145:45;;;;;;13235:15;13244:5;;;;13235:15;;:8;:15;;;;;;13208:24;;;:42;13200:51;;;;;;13262:15;13271:5;;;;13262:15;;:8;:15;;;;;;;:25;;;;;;13271:5;13297:22;;;;;;13329:13;;13281:6;;13329:13;;;;;;;;;;;;;13090:259;:::o;13573:230::-;1546:5;;1532:10;1546:5;1532:19;;;1546:5;;1532:19;1524:28;;;;;;13637:12;;:22;;;;13629:31;;;;;;13678:15;13687:5;;;;13678:15;;:8;:15;;;;;;:25;;;;13670:34;;;;;;13715:12;:22;;;;;;;:12;13756:5;;;;13747:15;;:8;:15;;;;;;;:25;;;;;;;13782:14;;13731:6;;13782:14;;;;;;;;;;;;;13573:230;:::o;12130:287::-;12238:10;;12208:14;;12238:10;;;;;12234:177;;;12285:15;;;;12271:40;12312:6;12320:8;12285:15;12271:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12264:65;;;;12234:177;12367:33;12383:6;12391:8;12367:15;:33::i;:::-;12360:40;;12234:177;12130:287;;;;:::o;3041:31::-;;;;:::o;8448:46::-;;;;;;;;;;;;;;;:::o;8653:157::-;1546:5;;1532:10;1546:5;1532:19;;;1546:5;;1532:19;1524:28;;;;;;8728:27;;;8758:5;8728:27;;;:13;:27;;;;;;;:35;;;;;;8773:30;;8742:12;;8773:30;;;;;;;;;;;;;;;;8653:157;:::o;4720:42::-;4752:10;4720:42;:::o;1738:147::-;1546:5;;1532:10;1546:5;1532:19;;;1546:5;;1532:19;1524:28;;;;;;1814:22;;;;1810:69;;1852:5;:16;;;;;;;;;;1810:69;1738:147;:::o;8816:318::-;8947:15;1546:5;;1532:10;1546:5;1532:19;;;1546:5;;1532:19;1524:28;;;;;;8905:31;;;;;;;:13;:31;;;;;;;;8897:40;;;;;;;;8965:27;8975:16;8965:9;:27::i;:::-;9002:26;;;9031:1;9002:26;;;:8;:26;;;;;;:30;;;;9042:12;:26;;;;;;;8947:45;;-1:-1:-1;9078:49:0;;9011:16;;8947:45;;9078:49;;;;;;;;;;;;;;;;;;;;;;8816:318;;:::o;6164:563::-;6235:6;3251:8;3233;:26;3231:29;3223:38;;;;;;6569:11;;;;;6568:53;;-1:-1:-1;6586:19:0;6594:10;6586:19;;;;;;:7;:19;;;;;;;;:29;;;;;;;;;;:34;;6568:53;6566:56;6558:65;;;;;;6634:19;6642:10;6634:19;;;;;;:7;:19;;;;;;;;:29;;;;;;;;;;;;;;:38;;;6682;;6666:6;;6682:38;;;;;;;;;;;;;6164:563;;;:::o;5044:880::-;5148:14;;;5130:6;3251:8;3233;:26;3231:29;3223:38;;;;;;5165:14;;;;;;;;:7;:14;;;;;;;;5180:10;5165:26;;;;;;;;;;5380:15;;5165:26;;-1:-1:-1;5368:40:0;;5402:5;;5369:27;;:6;;:27;:10;:27;:::i;:::-;5368:33;:40;:33;:40;:::i;:::-;5357:51;;5428:10;;5422:3;:16;5418:63;;;5460:10;;5454:16;;5418:63;4752:10;5494;:21;5490:103;;;5560:22;:10;5575:6;5560:22;:14;:22;:::i;:::-;5531:14;;;;;;;;:7;:14;;;;;;;;5546:10;5531:26;;;;;;;;;:51;5490:103;5620:15;:6;5631:3;5620:15;:10;:15;:::i;:::-;5663;;;;;;;:8;:15;;;;;;5602:33;;-1:-1:-1;5663:27:0;;5683:6;5663:27;:19;:27;:::i;:::-;5645:15;;;;;;;;:8;:15;;;;;;:45;;;;5716:13;;;;;;;:29;;5734:10;5716:29;:17;:29;:::i;:::-;5700:13;;;;;;;:8;:13;;;;;:45;;;;5759:7;;5755:121;;;5800:15;5809:5;;;;5800:15;;:8;:15;;;;;;:24;;5820:3;5800:24;:19;:24;:::i;:::-;5782:15;5791:5;;;;;;5782:15;;:8;:15;;;;;;:42;;;;5854:5;;;;;5838:27;;;;;;5861:3;;5838:27;;;;;;;;;;;;;5755:121;5901:3;5885:32;;5894:5;5885:32;;;5906:10;5885:32;;;;;;;;;;;;;;5044:880;;;;;;;:::o;4216:114::-;4307:16;;4276:12;4307:16;;;:8;:16;;;;;;;4216:114::o;3445:560::-;3530:8;;3512:6;3251:8;3233;:26;3231:29;3223:38;;;;;;3541:40;3575:5;3542:27;3553:15;;3542:6;:10;;:27;;;;:::i;3541:40::-;3530:51;;3601:10;;3595:3;:16;3591:63;;;3633:10;;3627:16;;3591:63;3681:15;:6;3692:3;3681:15;:10;:15;:::i;:::-;3729:20;3738:10;3729:20;;;;;:8;:20;;;;;;3663:33;;-1:-1:-1;3729:32:0;;3754:6;3729:32;:24;:32;:::i;:::-;3706:20;3715:10;3706:20;;;;;;:8;:20;;;;;;:55;;;;3787:13;;;;;;;:29;;3805:10;3787:29;:17;:29;:::i;:::-;3771:13;;;;;;;:8;:13;;;;;:45;;;;3830:7;;3826:126;;;3871:15;3880:5;;;;3871:15;;:8;:15;;;;;;:24;;3891:3;3871:24;:19;:24;:::i;:::-;3853:15;3862:5;;;;;;3853:15;;:8;:15;;;;;;:42;;;;3930:5;;;;;3918:10;3909:32;;;;;;3937:3;;3909:32;;;;;;;;;;;;;3826:126;3982:3;3961:37;;3970:10;3961:37;;;3987:10;3961:37;;;;;;;;;;;;;;3445:560;;;;;:::o;206:201::-;264:7;;287:6;;283:45;;;316:1;309:8;;;;283:45;-1:-1:-1;349:5:0;;;353:1;349;:5;371;;;;;;;;:10;364:18;;;;399:1;392:8;;206:201;;;;;;:::o;7052:143::-;7163:15;;;;7130:14;7163:15;;;:7;:15;;;;;;;;:25;;;;;;;;;;;;;7052:143::o;413:283::-;471:7;568:9;584:1;580;:5;;;;;;;;;413:283;-1:-1:-1;;;;413:283:0:o;702:120::-;760:7;786:6;;;;779:14;;;;-1:-1:-1;810:5:0;;;702:120::o;828:143::-;886:7;917:5;;;939:6;;;;932:14;;" + }, + "gasEstimates": { + "creation": { + "codeDepositCost": "1465000", + "executionCost": "infinite", + "totalCost": "infinite" + }, + "external": { + "MAX_UINT()": "811", + "_totalSupply()": "615", + "addBlackList(address)": "21835", + "allowance(address,address)": "infinite", + "allowed(address,address)": "846", + "approve(address,uint256)": "infinite", + "balanceOf(address)": "infinite", + "balances(address)": "627", + "basisPointsRate()": "945", + "decimals()": "571", + "deprecate(address)": "21709", + "deprecated()": "462", + "destroyBlackFunds(address)": "infinite", + "getBlackListStatus(address)": "764", + "getOwner()": "784", + "isBlackListed(address)": "1057", + "issue(uint256)": "43374", + "maximumFee()": "593", + "name()": "infinite", + "owner()": "806", + "pause()": "21974", + "paused()": "726", + "redeem(uint256)": "43402", + "removeBlackList(address)": "22357", + "setParams(uint256,uint256)": "infinite", + "symbol()": "infinite", + "totalSupply()": "infinite", + "transfer(address,uint256)": "infinite", + "transferFrom(address,address,uint256)": "infinite", + "transferOwnership(address)": "21292", + "unpause()": "21861", + "upgradedAddress()": "542" + } + }, + "legacyAssembly": { + ".code": [ + { + "begin": 9728, + "end": 14509, + "name": "PUSH", + "value": "60" + }, + { + "begin": 9728, + "end": 14509, + "name": "PUSH", + "value": "40" + }, + { + "begin": 9728, + "end": 14509, + "name": "MSTORE" + }, + { + "begin": 7405, + "end": 7410, + "name": "PUSH", + "value": "0" + }, + { + "begin": 7384, + "end": 7410, + "name": "DUP1" + }, + { + "begin": 7384, + "end": 7410, + "name": "SLOAD" + }, + { + "begin": -1, + "end": -1, + "name": "PUSH", + "value": "A0" + }, + { + "begin": -1, + "end": -1, + "name": "PUSH", + "value": "2" + }, + { + "begin": -1, + "end": -1, + "name": "EXP" + }, + { + "begin": -1, + "end": -1, + "name": "PUSH", + "value": "FF" + }, + { + "begin": -1, + "end": -1, + "name": "MUL" + }, + { + "begin": -1, + "end": -1, + "name": "NOT" + }, + { + "begin": 7384, + "end": 7410, + "name": "AND" + }, + { + "begin": 7384, + "end": 7410, + "name": "DUP2" + }, + { + "begin": 7384, + "end": 7410, + "name": "SSTORE" + }, + { + "begin": 3041, + "end": 3072, + "name": "PUSH", + "value": "3" + }, + { + "begin": 3041, + "end": 3072, + "name": "DUP2" + }, + { + "begin": 3041, + "end": 3072, + "name": "SWAP1" + }, + { + "begin": 3041, + "end": 3072, + "name": "SSTORE" + }, + { + "begin": 3078, + "end": 3104, + "name": "PUSH", + "value": "4" + }, + { + "begin": 3078, + "end": 3104, + "name": "SSTORE" + }, + { + "begin": 10223, + "end": 10512, + "name": "CALLVALUE" + }, + { + "begin": 10223, + "end": 10512, + "name": "ISZERO" + }, + { + "begin": 10223, + "end": 10512, + "name": "PUSH [tag]", + "value": "1" + }, + { + "begin": 10223, + "end": 10512, + "name": "JUMPI" + }, + { + "begin": 10223, + "end": 10512, + "name": "PUSH", + "value": "0" + }, + { + "begin": 10223, + "end": 10512, + "name": "DUP1" + }, + { + "begin": 10223, + "end": 10512, + "name": "REVERT" + }, + { + "begin": 10223, + "end": 10512, + "name": "tag", + "value": "1" + }, + { + "begin": 10223, + "end": 10512, + "name": "JUMPDEST" + }, + { + "begin": 10223, + "end": 10512, + "name": "PUSH", + "value": "40" + }, + { + "begin": 10223, + "end": 10512, + "name": "MLOAD" + }, + { + "begin": 10223, + "end": 10512, + "name": "PUSHSIZE" + }, + { + "begin": 10223, + "end": 10512, + "name": "CODESIZE" + }, + { + "begin": 10223, + "end": 10512, + "name": "SUB" + }, + { + "begin": 10223, + "end": 10512, + "name": "DUP1" + }, + { + "begin": 10223, + "end": 10512, + "name": "PUSHSIZE" + }, + { + "begin": 10223, + "end": 10512, + "name": "DUP4" + }, + { + "begin": 10223, + "end": 10512, + "name": "CODECOPY" + }, + { + "begin": 10223, + "end": 10512, + "name": "DUP2" + }, + { + "begin": 10223, + "end": 10512, + "name": "ADD" + }, + { + "begin": 10223, + "end": 10512, + "name": "PUSH", + "value": "40" + }, + { + "begin": 10223, + "end": 10512, + "name": "MSTORE" + }, + { + "begin": 10223, + "end": 10512, + "name": "DUP1" + }, + { + "begin": 10223, + "end": 10512, + "name": "DUP1" + }, + { + "begin": 10223, + "end": 10512, + "name": "MLOAD" + }, + { + "begin": 10223, + "end": 10512, + "name": "SWAP2" + }, + { + "begin": 10223, + "end": 10512, + "name": "SWAP1" + }, + { + "begin": 10223, + "end": 10512, + "name": "PUSH", + "value": "20" + }, + { + "begin": 10223, + "end": 10512, + "name": "ADD" + }, + { + "begin": 10223, + "end": 10512, + "name": "DUP1" + }, + { + "begin": 10223, + "end": 10512, + "name": "MLOAD" + }, + { + "begin": 10223, + "end": 10512, + "name": "DUP3" + }, + { + "begin": 10223, + "end": 10512, + "name": "ADD" + }, + { + "begin": 10223, + "end": 10512, + "name": "SWAP2" + }, + { + "begin": 10223, + "end": 10512, + "name": "SWAP1" + }, + { + "begin": 10223, + "end": 10512, + "name": "PUSH", + "value": "20" + }, + { + "begin": 10223, + "end": 10512, + "name": "ADD" + }, + { + "begin": 10223, + "end": 10512, + "name": "DUP1" + }, + { + "begin": 10223, + "end": 10512, + "name": "MLOAD" + }, + { + "begin": 10223, + "end": 10512, + "name": "DUP3" + }, + { + "begin": 10223, + "end": 10512, + "name": "ADD" + }, + { + "begin": 10223, + "end": 10512, + "name": "SWAP2" + }, + { + "begin": 10223, + "end": 10512, + "name": "SWAP1" + }, + { + "begin": 10223, + "end": 10512, + "name": "PUSH", + "value": "20" + }, + { + "begin": 10223, + "end": 10512, + "name": "ADD" + }, + { + "begin": 10223, + "end": 10512, + "name": "DUP1" + }, + { + "begin": 10223, + "end": 10512, + "name": "MLOAD" + }, + { + "begin": 1378, + "end": 1383, + "name": "PUSH", + "value": "0" + }, + { + "begin": 1378, + "end": 1396, + "name": "DUP1" + }, + { + "begin": 1378, + "end": 1396, + "name": "SLOAD" + }, + { + "begin": -1, + "end": -1, + "name": "PUSH", + "value": "1" + }, + { + "begin": -1, + "end": -1, + "name": "PUSH", + "value": "A0" + }, + { + "begin": -1, + "end": -1, + "name": "PUSH", + "value": "2" + }, + { + "begin": -1, + "end": -1, + "name": "EXP" + }, + { + "begin": -1, + "end": -1, + "name": "SUB" + }, + { + "begin": -1, + "end": -1, + "name": "NOT" + }, + { + "begin": 1378, + "end": 1396, + "name": "AND" + }, + { + "begin": 1386, + "end": 1396, + "name": "CALLER" + }, + { + "begin": -1, + "end": -1, + "name": "PUSH", + "value": "1" + }, + { + "begin": -1, + "end": -1, + "name": "PUSH", + "value": "A0" + }, + { + "begin": -1, + "end": -1, + "name": "PUSH", + "value": "2" + }, + { + "begin": -1, + "end": -1, + "name": "EXP" + }, + { + "begin": -1, + "end": -1, + "name": "SUB" + }, + { + "begin": 1378, + "end": 1396, + "name": "AND" + }, + { + "begin": 1378, + "end": 1396, + "name": "OR" + }, + { + "begin": 1378, + "end": 1396, + "name": "SWAP1" + }, + { + "begin": 1378, + "end": 1396, + "name": "SSTORE" + }, + { + "begin": -1, + "end": -1, + "name": "PUSH", + "value": "1" + }, + { + "begin": 10328, + "end": 10357, + "name": "DUP7" + }, + { + "begin": 10328, + "end": 10357, + "name": "SWAP1" + }, + { + "begin": 10328, + "end": 10357, + "name": "SSTORE" + }, + { + "begin": 10223, + "end": 10512, + "name": "SWAP2" + }, + { + "begin": -1, + "end": -1, + "name": "POP" + }, + { + "begin": 10367, + "end": 10371, + "name": "PUSH", + "value": "7" + }, + { + "begin": 10367, + "end": 10371, + "name": "SWAP1" + }, + { + "begin": -1, + "end": -1, + "name": "POP" + }, + { + "begin": 10374, + "end": 10379, + "name": "DUP4" + }, + { + "begin": 10374, + "end": 10379, + "name": "DUP1" + }, + { + "begin": 10367, + "end": 10379, + "name": "MLOAD" + }, + { + "begin": 10367, + "end": 10379, + "name": "PUSH [tag]", + "value": "6" + }, + { + "begin": 10367, + "end": 10379, + "name": "SWAP3" + }, + { + "begin": 10367, + "end": 10379, + "name": "SWAP2" + }, + { + "begin": 10367, + "end": 10379, + "name": "PUSH", + "value": "20" + }, + { + "begin": 10367, + "end": 10379, + "name": "ADD" + }, + { + "begin": 10367, + "end": 10379, + "name": "SWAP1" + }, + { + "begin": 10367, + "end": 10379, + "name": "PUSH [tag]", + "value": "7" + }, + { + "begin": 10367, + "end": 10379, + "name": "JUMP", + "value": "[in]" + }, + { + "begin": 10367, + "end": 10379, + "name": "tag", + "value": "6" + }, + { + "begin": 10367, + "end": 10379, + "name": "JUMPDEST" + }, + { + "begin": -1, + "end": -1, + "name": "POP" + }, + { + "begin": 10389, + "end": 10395, + "name": "PUSH", + "value": "8" + }, + { + "begin": 10398, + "end": 10405, + "name": "DUP3" + }, + { + "begin": 10398, + "end": 10405, + "name": "DUP1" + }, + { + "begin": 10389, + "end": 10405, + "name": "MLOAD" + }, + { + "begin": 10389, + "end": 10405, + "name": "PUSH [tag]", + "value": "8" + }, + { + "begin": 10389, + "end": 10405, + "name": "SWAP3" + }, + { + "begin": 10389, + "end": 10405, + "name": "SWAP2" + }, + { + "begin": 10389, + "end": 10405, + "name": "PUSH", + "value": "20" + }, + { + "begin": 10389, + "end": 10405, + "name": "ADD" + }, + { + "begin": 10389, + "end": 10405, + "name": "SWAP1" + }, + { + "begin": 10389, + "end": 10405, + "name": "PUSH [tag]", + "value": "7" + }, + { + "begin": 10389, + "end": 10405, + "name": "JUMP", + "value": "[in]" + }, + { + "begin": 10389, + "end": 10405, + "name": "tag", + "value": "8" + }, + { + "begin": 10389, + "end": 10405, + "name": "JUMPDEST" + }, + { + "begin": -1, + "end": -1, + "name": "POP" + }, + { + "begin": 10415, + "end": 10423, + "name": "PUSH", + "value": "9" + }, + { + "begin": 10415, + "end": 10435, + "name": "SSTORE" + }, + { + "begin": -1, + "end": -1, + "name": "POP" + }, + { + "begin": -1, + "end": -1, + "name": "POP" + }, + { + "begin": 10445, + "end": 10460, + "name": "PUSH", + "value": "0" + }, + { + "begin": 10454, + "end": 10459, + "name": "DUP1" + }, + { + "begin": 10454, + "end": 10459, + "name": "SLOAD" + }, + { + "begin": -1, + "end": -1, + "name": "PUSH", + "value": "1" + }, + { + "begin": -1, + "end": -1, + "name": "PUSH", + "value": "A0" + }, + { + "begin": -1, + "end": -1, + "name": "PUSH", + "value": "2" + }, + { + "begin": -1, + "end": -1, + "name": "EXP" + }, + { + "begin": -1, + "end": -1, + "name": "SUB" + }, + { + "begin": 10454, + "end": 10459, + "name": "AND" + }, + { + "begin": 10445, + "end": 10460, + "name": "DUP2" + }, + { + "begin": 10445, + "end": 10460, + "name": "MSTORE" + }, + { + "begin": 10445, + "end": 10453, + "name": "PUSH", + "value": "2" + }, + { + "begin": 10445, + "end": 10460, + "name": "PUSH", + "value": "20" + }, + { + "begin": 10445, + "end": 10460, + "name": "MSTORE" + }, + { + "begin": 10445, + "end": 10460, + "name": "PUSH", + "value": "40" + }, + { + "begin": 10445, + "end": 10460, + "name": "SWAP1" + }, + { + "begin": 10445, + "end": 10460, + "name": "KECCAK256" + }, + { + "begin": 10445, + "end": 10477, + "name": "SSTORE" + }, + { + "begin": 10487, + "end": 10497, + "name": "PUSH", + "value": "A" + }, + { + "begin": 10487, + "end": 10505, + "name": "DUP1" + }, + { + "begin": 10487, + "end": 10505, + "name": "SLOAD" + }, + { + "begin": -1, + "end": -1, + "name": "PUSH", + "value": "A0" + }, + { + "begin": -1, + "end": -1, + "name": "PUSH", + "value": "2" + }, + { + "begin": -1, + "end": -1, + "name": "EXP" + }, + { + "begin": -1, + "end": -1, + "name": "PUSH", + "value": "FF" + }, + { + "begin": -1, + "end": -1, + "name": "MUL" + }, + { + "begin": -1, + "end": -1, + "name": "NOT" + }, + { + "begin": 10487, + "end": 10505, + "name": "AND" + }, + { + "begin": 10487, + "end": 10505, + "name": "SWAP1" + }, + { + "begin": 10487, + "end": 10505, + "name": "SSTORE" + }, + { + "begin": 9728, + "end": 14509, + "name": "PUSH [tag]", + "value": "9" + }, + { + "begin": 9728, + "end": 14509, + "name": "JUMP" + }, + { + "begin": 9728, + "end": 14509, + "name": "tag", + "value": "7" + }, + { + "begin": 9728, + "end": 14509, + "name": "JUMPDEST" + }, + { + "begin": 9728, + "end": 14509, + "name": "DUP3" + }, + { + "begin": 9728, + "end": 14509, + "name": "DUP1" + }, + { + "begin": 9728, + "end": 14509, + "name": "SLOAD" + }, + { + "begin": 9728, + "end": 14509, + "name": "PUSH", + "value": "1" + }, + { + "begin": 9728, + "end": 14509, + "name": "DUP2" + }, + { + "begin": 9728, + "end": 14509, + "name": "PUSH", + "value": "1" + }, + { + "begin": 9728, + "end": 14509, + "name": "AND" + }, + { + "begin": 9728, + "end": 14509, + "name": "ISZERO" + }, + { + "begin": 9728, + "end": 14509, + "name": "PUSH", + "value": "100" + }, + { + "begin": 9728, + "end": 14509, + "name": "MUL" + }, + { + "begin": 9728, + "end": 14509, + "name": "SUB" + }, + { + "begin": 9728, + "end": 14509, + "name": "AND" + }, + { + "begin": 9728, + "end": 14509, + "name": "PUSH", + "value": "2" + }, + { + "begin": 9728, + "end": 14509, + "name": "SWAP1" + }, + { + "begin": 9728, + "end": 14509, + "name": "DIV" + }, + { + "begin": 9728, + "end": 14509, + "name": "SWAP1" + }, + { + "begin": 9728, + "end": 14509, + "name": "PUSH", + "value": "0" + }, + { + "begin": 9728, + "end": 14509, + "name": "MSTORE" + }, + { + "begin": 9728, + "end": 14509, + "name": "PUSH", + "value": "20" + }, + { + "begin": 9728, + "end": 14509, + "name": "PUSH", + "value": "0" + }, + { + "begin": 9728, + "end": 14509, + "name": "KECCAK256" + }, + { + "begin": 9728, + "end": 14509, + "name": "SWAP1" + }, + { + "begin": 9728, + "end": 14509, + "name": "PUSH", + "value": "1F" + }, + { + "begin": 9728, + "end": 14509, + "name": "ADD" + }, + { + "begin": 9728, + "end": 14509, + "name": "PUSH", + "value": "20" + }, + { + "begin": 9728, + "end": 14509, + "name": "SWAP1" + }, + { + "begin": 9728, + "end": 14509, + "name": "DIV" + }, + { + "begin": 9728, + "end": 14509, + "name": "DUP2" + }, + { + "begin": 9728, + "end": 14509, + "name": "ADD" + }, + { + "begin": 9728, + "end": 14509, + "name": "SWAP3" + }, + { + "begin": 9728, + "end": 14509, + "name": "DUP3" + }, + { + "begin": 9728, + "end": 14509, + "name": "PUSH", + "value": "1F" + }, + { + "begin": 9728, + "end": 14509, + "name": "LT" + }, + { + "begin": 9728, + "end": 14509, + "name": "PUSH [tag]", + "value": "11" + }, + { + "begin": 9728, + "end": 14509, + "name": "JUMPI" + }, + { + "begin": 9728, + "end": 14509, + "name": "DUP1" + }, + { + "begin": 9728, + "end": 14509, + "name": "MLOAD" + }, + { + "begin": 9728, + "end": 14509, + "name": "PUSH", + "value": "FF" + }, + { + "begin": 9728, + "end": 14509, + "name": "NOT" + }, + { + "begin": 9728, + "end": 14509, + "name": "AND" + }, + { + "begin": 9728, + "end": 14509, + "name": "DUP4" + }, + { + "begin": 9728, + "end": 14509, + "name": "DUP1" + }, + { + "begin": 9728, + "end": 14509, + "name": "ADD" + }, + { + "begin": 9728, + "end": 14509, + "name": "OR" + }, + { + "begin": 9728, + "end": 14509, + "name": "DUP6" + }, + { + "begin": 9728, + "end": 14509, + "name": "SSTORE" + }, + { + "begin": 9728, + "end": 14509, + "name": "PUSH [tag]", + "value": "13" + }, + { + "begin": 9728, + "end": 14509, + "name": "JUMP" + }, + { + "begin": 9728, + "end": 14509, + "name": "tag", + "value": "11" + }, + { + "begin": 9728, + "end": 14509, + "name": "JUMPDEST" + }, + { + "begin": 9728, + "end": 14509, + "name": "DUP3" + }, + { + "begin": 9728, + "end": 14509, + "name": "DUP1" + }, + { + "begin": 9728, + "end": 14509, + "name": "ADD" + }, + { + "begin": 9728, + "end": 14509, + "name": "PUSH", + "value": "1" + }, + { + "begin": 9728, + "end": 14509, + "name": "ADD" + }, + { + "begin": 9728, + "end": 14509, + "name": "DUP6" + }, + { + "begin": 9728, + "end": 14509, + "name": "SSTORE" + }, + { + "begin": 9728, + "end": 14509, + "name": "DUP3" + }, + { + "begin": 9728, + "end": 14509, + "name": "ISZERO" + }, + { + "begin": 9728, + "end": 14509, + "name": "PUSH [tag]", + "value": "13" + }, + { + "begin": 9728, + "end": 14509, + "name": "JUMPI" + }, + { + "begin": 9728, + "end": 14509, + "name": "SWAP2" + }, + { + "begin": 9728, + "end": 14509, + "name": "DUP3" + }, + { + "begin": 9728, + "end": 14509, + "name": "ADD" + }, + { + "begin": 9728, + "end": 14509, + "name": "tag", + "value": "12" + }, + { + "begin": 9728, + "end": 14509, + "name": "JUMPDEST" + }, + { + "begin": 9728, + "end": 14509, + "name": "DUP3" + }, + { + "begin": 9728, + "end": 14509, + "name": "DUP2" + }, + { + "begin": 9728, + "end": 14509, + "name": "GT" + }, + { + "begin": 9728, + "end": 14509, + "name": "ISZERO" + }, + { + "begin": 9728, + "end": 14509, + "name": "PUSH [tag]", + "value": "13" + }, + { + "begin": 9728, + "end": 14509, + "name": "JUMPI" + }, + { + "begin": 9728, + "end": 14509, + "name": "DUP3" + }, + { + "begin": 9728, + "end": 14509, + "name": "MLOAD" + }, + { + "begin": 9728, + "end": 14509, + "name": "DUP3" + }, + { + "begin": 9728, + "end": 14509, + "name": "SSTORE" + }, + { + "begin": 9728, + "end": 14509, + "name": "SWAP2" + }, + { + "begin": 9728, + "end": 14509, + "name": "PUSH", + "value": "20" + }, + { + "begin": 9728, + "end": 14509, + "name": "ADD" + }, + { + "begin": 9728, + "end": 14509, + "name": "SWAP2" + }, + { + "begin": 9728, + "end": 14509, + "name": "SWAP1" + }, + { + "begin": 9728, + "end": 14509, + "name": "PUSH", + "value": "1" + }, + { + "begin": 9728, + "end": 14509, + "name": "ADD" + }, + { + "begin": 9728, + "end": 14509, + "name": "SWAP1" + }, + { + "begin": 9728, + "end": 14509, + "name": "PUSH [tag]", + "value": "12" + }, + { + "begin": 9728, + "end": 14509, + "name": "JUMP" + }, + { + "begin": 9728, + "end": 14509, + "name": "tag", + "value": "13" + }, + { + "begin": 9728, + "end": 14509, + "name": "JUMPDEST" + }, + { + "begin": -1, + "end": -1, + "name": "POP" + }, + { + "begin": 9728, + "end": 14509, + "name": "PUSH [tag]", + "value": "14" + }, + { + "begin": 9728, + "end": 14509, + "name": "SWAP3" + }, + { + "begin": 9728, + "end": 14509, + "name": "SWAP2" + }, + { + "begin": -1, + "end": -1, + "name": "POP" + }, + { + "begin": 9728, + "end": 14509, + "name": "PUSH [tag]", + "value": "15" + }, + { + "begin": 9728, + "end": 14509, + "name": "JUMP", + "value": "[in]" + }, + { + "begin": 9728, + "end": 14509, + "name": "tag", + "value": "14" + }, + { + "begin": 9728, + "end": 14509, + "name": "JUMPDEST" + }, + { + "begin": 9728, + "end": 14509, + "name": "POP" + }, + { + "begin": 9728, + "end": 14509, + "name": "SWAP1" + }, + { + "begin": 9728, + "end": 14509, + "name": "JUMP", + "value": "[out]" + }, + { + "begin": 9728, + "end": 14509, + "name": "tag", + "value": "15" + }, + { + "begin": 9728, + "end": 14509, + "name": "JUMPDEST" + }, + { + "begin": 9728, + "end": 14509, + "name": "PUSH [tag]", + "value": "16" + }, + { + "begin": 9728, + "end": 14509, + "name": "SWAP2" + }, + { + "begin": 9728, + "end": 14509, + "name": "SWAP1" + }, + { + "begin": 9728, + "end": 14509, + "name": "tag", + "value": "17" + }, + { + "begin": 9728, + "end": 14509, + "name": "JUMPDEST" + }, + { + "begin": 9728, + "end": 14509, + "name": "DUP1" + }, + { + "begin": 9728, + "end": 14509, + "name": "DUP3" + }, + { + "begin": 9728, + "end": 14509, + "name": "GT" + }, + { + "begin": 9728, + "end": 14509, + "name": "ISZERO" + }, + { + "begin": 9728, + "end": 14509, + "name": "PUSH [tag]", + "value": "14" + }, + { + "begin": 9728, + "end": 14509, + "name": "JUMPI" + }, + { + "begin": 9728, + "end": 14509, + "name": "PUSH", + "value": "0" + }, + { + "begin": 9728, + "end": 14509, + "name": "DUP2" + }, + { + "begin": 9728, + "end": 14509, + "name": "SSTORE" + }, + { + "begin": 9728, + "end": 14509, + "name": "PUSH", + "value": "1" + }, + { + "begin": 9728, + "end": 14509, + "name": "ADD" + }, + { + "begin": 9728, + "end": 14509, + "name": "PUSH [tag]", + "value": "17" + }, + { + "begin": 9728, + "end": 14509, + "name": "JUMP" + }, + { + "begin": 9728, + "end": 14509, + "name": "tag", + "value": "16" + }, + { + "begin": 9728, + "end": 14509, + "name": "JUMPDEST" + }, + { + "begin": 9728, + "end": 14509, + "name": "SWAP1" + }, + { + "begin": 9728, + "end": 14509, + "name": "JUMP", + "value": "[out]" + }, + { + "begin": 9728, + "end": 14509, + "name": "tag", + "value": "9" + }, + { + "begin": 9728, + "end": 14509, + "name": "JUMPDEST" + }, + { + "begin": 9728, + "end": 14509, + "name": "PUSH #[$]", + "value": "0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "begin": 9728, + "end": 14509, + "name": "DUP1" + }, + { + "begin": 9728, + "end": 14509, + "name": "PUSH [$]", + "value": "0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "begin": 9728, + "end": 14509, + "name": "PUSH", + "value": "0" + }, + { + "begin": 9728, + "end": 14509, + "name": "CODECOPY" + }, + { + "begin": 9728, + "end": 14509, + "name": "PUSH", + "value": "0" + }, + { + "begin": 9728, + "end": 14509, + "name": "RETURN" + } + ], + ".data": { + "0": { + ".auxdata": "a165627a7a72305820c6c7ec5e3bee0b2db470f633175dd5c4c1900658f43d73e4f34ffa2e46d86ab80029", + ".code": [ + { + "begin": 9728, + "end": 14509, + "name": "PUSH", + "value": "60" + }, + { + "begin": 9728, + "end": 14509, + "name": "PUSH", + "value": "40" + }, + { + "begin": 9728, + "end": 14509, + "name": "MSTORE" + }, + { + "begin": 9728, + "end": 14509, + "name": "PUSH", + "value": "4" + }, + { + "begin": 9728, + "end": 14509, + "name": "CALLDATASIZE" + }, + { + "begin": 9728, + "end": 14509, + "name": "LT" + }, + { + "begin": 9728, + "end": 14509, + "name": "PUSH [tag]", + "value": "1" + }, + { + "begin": 9728, + "end": 14509, + "name": "JUMPI" + }, + { + "begin": 9728, + "end": 14509, + "name": "PUSH", + "value": "FFFFFFFF" + }, + { + "begin": 9728, + "end": 14509, + "name": "PUSH", + "value": "100000000000000000000000000000000000000000000000000000000" + }, + { + "begin": 9728, + "end": 14509, + "name": "PUSH", + "value": "0" + }, + { + "begin": 9728, + "end": 14509, + "name": "CALLDATALOAD" + }, + { + "begin": 9728, + "end": 14509, + "name": "DIV" + }, + { + "begin": 9728, + "end": 14509, + "name": "AND" + }, + { + "begin": 9728, + "end": 14509, + "name": "PUSH", + "value": "6FDDE03" + }, + { + "begin": 9728, + "end": 14509, + "name": "DUP2" + }, + { + "begin": 9728, + "end": 14509, + "name": "EQ" + }, + { + "begin": 9728, + "end": 14509, + "name": "PUSH [tag]", + "value": "2" + }, + { + "begin": 9728, + "end": 14509, + "name": "JUMPI" + }, + { + "begin": 9728, + "end": 14509, + "name": "DUP1" + }, + { + "begin": 9728, + "end": 14509, + "name": "PUSH", + "value": "753C30C" + }, + { + "begin": 9728, + "end": 14509, + "name": "EQ" + }, + { + "begin": 9728, + "end": 14509, + "name": "PUSH [tag]", + "value": "3" + }, + { + "begin": 9728, + "end": 14509, + "name": "JUMPI" + }, + { + "begin": 9728, + "end": 14509, + "name": "DUP1" + }, + { + "begin": 9728, + "end": 14509, + "name": "PUSH", + "value": "95EA7B3" + }, + { + "begin": 9728, + "end": 14509, + "name": "EQ" + }, + { + "begin": 9728, + "end": 14509, + "name": "PUSH [tag]", + "value": "4" + }, + { + "begin": 9728, + "end": 14509, + "name": "JUMPI" + }, + { + "begin": 9728, + "end": 14509, + "name": "DUP1" + }, + { + "begin": 9728, + "end": 14509, + "name": "PUSH", + "value": "E136B19" + }, + { + "begin": 9728, + "end": 14509, + "name": "EQ" + }, + { + "begin": 9728, + "end": 14509, + "name": "PUSH [tag]", + "value": "5" + }, + { + "begin": 9728, + "end": 14509, + "name": "JUMPI" + }, + { + "begin": 9728, + "end": 14509, + "name": "DUP1" + }, + { + "begin": 9728, + "end": 14509, + "name": "PUSH", + "value": "ECB93C0" + }, + { + "begin": 9728, + "end": 14509, + "name": "EQ" + }, + { + "begin": 9728, + "end": 14509, + "name": "PUSH [tag]", + "value": "6" + }, + { + "begin": 9728, + "end": 14509, + "name": "JUMPI" + }, + { + "begin": 9728, + "end": 14509, + "name": "DUP1" + }, + { + "begin": 9728, + "end": 14509, + "name": "PUSH", + "value": "18160DDD" + }, + { + "begin": 9728, + "end": 14509, + "name": "EQ" + }, + { + "begin": 9728, + "end": 14509, + "name": "PUSH [tag]", + "value": "7" + }, + { + "begin": 9728, + "end": 14509, + "name": "JUMPI" + }, + { + "begin": 9728, + "end": 14509, + "name": "DUP1" + }, + { + "begin": 9728, + "end": 14509, + "name": "PUSH", + "value": "23B872DD" + }, + { + "begin": 9728, + "end": 14509, + "name": "EQ" + }, + { + "begin": 9728, + "end": 14509, + "name": "PUSH [tag]", + "value": "8" + }, + { + "begin": 9728, + "end": 14509, + "name": "JUMPI" + }, + { + "begin": 9728, + "end": 14509, + "name": "DUP1" + }, + { + "begin": 9728, + "end": 14509, + "name": "PUSH", + "value": "26976E3F" + }, + { + "begin": 9728, + "end": 14509, + "name": "EQ" + }, + { + "begin": 9728, + "end": 14509, + "name": "PUSH [tag]", + "value": "9" + }, + { + "begin": 9728, + "end": 14509, + "name": "JUMPI" + }, + { + "begin": 9728, + "end": 14509, + "name": "DUP1" + }, + { + "begin": 9728, + "end": 14509, + "name": "PUSH", + "value": "27E235E3" + }, + { + "begin": 9728, + "end": 14509, + "name": "EQ" + }, + { + "begin": 9728, + "end": 14509, + "name": "PUSH [tag]", + "value": "10" + }, + { + "begin": 9728, + "end": 14509, + "name": "JUMPI" + }, + { + "begin": 9728, + "end": 14509, + "name": "DUP1" + }, + { + "begin": 9728, + "end": 14509, + "name": "PUSH", + "value": "313CE567" + }, + { + "begin": 9728, + "end": 14509, + "name": "EQ" + }, + { + "begin": 9728, + "end": 14509, + "name": "PUSH [tag]", + "value": "11" + }, + { + "begin": 9728, + "end": 14509, + "name": "JUMPI" + }, + { + "begin": 9728, + "end": 14509, + "name": "DUP1" + }, + { + "begin": 9728, + "end": 14509, + "name": "PUSH", + "value": "35390714" + }, + { + "begin": 9728, + "end": 14509, + "name": "EQ" + }, + { + "begin": 9728, + "end": 14509, + "name": "PUSH [tag]", + "value": "12" + }, + { + "begin": 9728, + "end": 14509, + "name": "JUMPI" + }, + { + "begin": 9728, + "end": 14509, + "name": "DUP1" + }, + { + "begin": 9728, + "end": 14509, + "name": "PUSH", + "value": "3EAAF86B" + }, + { + "begin": 9728, + "end": 14509, + "name": "EQ" + }, + { + "begin": 9728, + "end": 14509, + "name": "PUSH [tag]", + "value": "13" + }, + { + "begin": 9728, + "end": 14509, + "name": "JUMPI" + }, + { + "begin": 9728, + "end": 14509, + "name": "DUP1" + }, + { + "begin": 9728, + "end": 14509, + "name": "PUSH", + "value": "3F4BA83A" + }, + { + "begin": 9728, + "end": 14509, + "name": "EQ" + }, + { + "begin": 9728, + "end": 14509, + "name": "PUSH [tag]", + "value": "14" + }, + { + "begin": 9728, + "end": 14509, + "name": "JUMPI" + }, + { + "begin": 9728, + "end": 14509, + "name": "DUP1" + }, + { + "begin": 9728, + "end": 14509, + "name": "PUSH", + "value": "59BF1ABE" + }, + { + "begin": 9728, + "end": 14509, + "name": "EQ" + }, + { + "begin": 9728, + "end": 14509, + "name": "PUSH [tag]", + "value": "15" + }, + { + "begin": 9728, + "end": 14509, + "name": "JUMPI" + }, + { + "begin": 9728, + "end": 14509, + "name": "DUP1" + }, + { + "begin": 9728, + "end": 14509, + "name": "PUSH", + "value": "5C658165" + }, + { + "begin": 9728, + "end": 14509, + "name": "EQ" + }, + { + "begin": 9728, + "end": 14509, + "name": "PUSH [tag]", + "value": "16" + }, + { + "begin": 9728, + "end": 14509, + "name": "JUMPI" + }, + { + "begin": 9728, + "end": 14509, + "name": "DUP1" + }, + { + "begin": 9728, + "end": 14509, + "name": "PUSH", + "value": "5C975ABB" + }, + { + "begin": 9728, + "end": 14509, + "name": "EQ" + }, + { + "begin": 9728, + "end": 14509, + "name": "PUSH [tag]", + "value": "17" + }, + { + "begin": 9728, + "end": 14509, + "name": "JUMPI" + }, + { + "begin": 9728, + "end": 14509, + "name": "DUP1" + }, + { + "begin": 9728, + "end": 14509, + "name": "PUSH", + "value": "70A08231" + }, + { + "begin": 9728, + "end": 14509, + "name": "EQ" + }, + { + "begin": 9728, + "end": 14509, + "name": "PUSH [tag]", + "value": "18" + }, + { + "begin": 9728, + "end": 14509, + "name": "JUMPI" + }, + { + "begin": 9728, + "end": 14509, + "name": "DUP1" + }, + { + "begin": 9728, + "end": 14509, + "name": "PUSH", + "value": "8456CB59" + }, + { + "begin": 9728, + "end": 14509, + "name": "EQ" + }, + { + "begin": 9728, + "end": 14509, + "name": "PUSH [tag]", + "value": "19" + }, + { + "begin": 9728, + "end": 14509, + "name": "JUMPI" + }, + { + "begin": 9728, + "end": 14509, + "name": "DUP1" + }, + { + "begin": 9728, + "end": 14509, + "name": "PUSH", + "value": "893D20E8" + }, + { + "begin": 9728, + "end": 14509, + "name": "EQ" + }, + { + "begin": 9728, + "end": 14509, + "name": "PUSH [tag]", + "value": "20" + }, + { + "begin": 9728, + "end": 14509, + "name": "JUMPI" + }, + { + "begin": 9728, + "end": 14509, + "name": "DUP1" + }, + { + "begin": 9728, + "end": 14509, + "name": "PUSH", + "value": "8DA5CB5B" + }, + { + "begin": 9728, + "end": 14509, + "name": "EQ" + }, + { + "begin": 9728, + "end": 14509, + "name": "PUSH [tag]", + "value": "21" + }, + { + "begin": 9728, + "end": 14509, + "name": "JUMPI" + }, + { + "begin": 9728, + "end": 14509, + "name": "DUP1" + }, + { + "begin": 9728, + "end": 14509, + "name": "PUSH", + "value": "95D89B41" + }, + { + "begin": 9728, + "end": 14509, + "name": "EQ" + }, + { + "begin": 9728, + "end": 14509, + "name": "PUSH [tag]", + "value": "22" + }, + { + "begin": 9728, + "end": 14509, + "name": "JUMPI" + }, + { + "begin": 9728, + "end": 14509, + "name": "DUP1" + }, + { + "begin": 9728, + "end": 14509, + "name": "PUSH", + "value": "A9059CBB" + }, + { + "begin": 9728, + "end": 14509, + "name": "EQ" + }, + { + "begin": 9728, + "end": 14509, + "name": "PUSH [tag]", + "value": "23" + }, + { + "begin": 9728, + "end": 14509, + "name": "JUMPI" + }, + { + "begin": 9728, + "end": 14509, + "name": "DUP1" + }, + { + "begin": 9728, + "end": 14509, + "name": "PUSH", + "value": "C0324C77" + }, + { + "begin": 9728, + "end": 14509, + "name": "EQ" + }, + { + "begin": 9728, + "end": 14509, + "name": "PUSH [tag]", + "value": "24" + }, + { + "begin": 9728, + "end": 14509, + "name": "JUMPI" + }, + { + "begin": 9728, + "end": 14509, + "name": "DUP1" + }, + { + "begin": 9728, + "end": 14509, + "name": "PUSH", + "value": "CC872B66" + }, + { + "begin": 9728, + "end": 14509, + "name": "EQ" + }, + { + "begin": 9728, + "end": 14509, + "name": "PUSH [tag]", + "value": "25" + }, + { + "begin": 9728, + "end": 14509, + "name": "JUMPI" + }, + { + "begin": 9728, + "end": 14509, + "name": "DUP1" + }, + { + "begin": 9728, + "end": 14509, + "name": "PUSH", + "value": "DB006A75" + }, + { + "begin": 9728, + "end": 14509, + "name": "EQ" + }, + { + "begin": 9728, + "end": 14509, + "name": "PUSH [tag]", + "value": "26" + }, + { + "begin": 9728, + "end": 14509, + "name": "JUMPI" + }, + { + "begin": 9728, + "end": 14509, + "name": "DUP1" + }, + { + "begin": 9728, + "end": 14509, + "name": "PUSH", + "value": "DD62ED3E" + }, + { + "begin": 9728, + "end": 14509, + "name": "EQ" + }, + { + "begin": 9728, + "end": 14509, + "name": "PUSH [tag]", + "value": "27" + }, + { + "begin": 9728, + "end": 14509, + "name": "JUMPI" + }, + { + "begin": 9728, + "end": 14509, + "name": "DUP1" + }, + { + "begin": 9728, + "end": 14509, + "name": "PUSH", + "value": "DD644F72" + }, + { + "begin": 9728, + "end": 14509, + "name": "EQ" + }, + { + "begin": 9728, + "end": 14509, + "name": "PUSH [tag]", + "value": "28" + }, + { + "begin": 9728, + "end": 14509, + "name": "JUMPI" + }, + { + "begin": 9728, + "end": 14509, + "name": "DUP1" + }, + { + "begin": 9728, + "end": 14509, + "name": "PUSH", + "value": "E47D6060" + }, + { + "begin": 9728, + "end": 14509, + "name": "EQ" + }, + { + "begin": 9728, + "end": 14509, + "name": "PUSH [tag]", + "value": "29" + }, + { + "begin": 9728, + "end": 14509, + "name": "JUMPI" + }, + { + "begin": 9728, + "end": 14509, + "name": "DUP1" + }, + { + "begin": 9728, + "end": 14509, + "name": "PUSH", + "value": "E4997DC5" + }, + { + "begin": 9728, + "end": 14509, + "name": "EQ" + }, + { + "begin": 9728, + "end": 14509, + "name": "PUSH [tag]", + "value": "30" + }, + { + "begin": 9728, + "end": 14509, + "name": "JUMPI" + }, + { + "begin": 9728, + "end": 14509, + "name": "DUP1" + }, + { + "begin": 9728, + "end": 14509, + "name": "PUSH", + "value": "E5B5019A" + }, + { + "begin": 9728, + "end": 14509, + "name": "EQ" + }, + { + "begin": 9728, + "end": 14509, + "name": "PUSH [tag]", + "value": "31" + }, + { + "begin": 9728, + "end": 14509, + "name": "JUMPI" + }, + { + "begin": 9728, + "end": 14509, + "name": "DUP1" + }, + { + "begin": 9728, + "end": 14509, + "name": "PUSH", + "value": "F2FDE38B" + }, + { + "begin": 9728, + "end": 14509, + "name": "EQ" + }, + { + "begin": 9728, + "end": 14509, + "name": "PUSH [tag]", + "value": "32" + }, + { + "begin": 9728, + "end": 14509, + "name": "JUMPI" + }, + { + "begin": 9728, + "end": 14509, + "name": "DUP1" + }, + { + "begin": 9728, + "end": 14509, + "name": "PUSH", + "value": "F3BDC228" + }, + { + "begin": 9728, + "end": 14509, + "name": "EQ" + }, + { + "begin": 9728, + "end": 14509, + "name": "PUSH [tag]", + "value": "33" + }, + { + "begin": 9728, + "end": 14509, + "name": "JUMPI" + }, + { + "begin": 9728, + "end": 14509, + "name": "tag", + "value": "1" + }, + { + "begin": 9728, + "end": 14509, + "name": "JUMPDEST" + }, + { + "begin": 9728, + "end": 14509, + "name": "PUSH", + "value": "0" + }, + { + "begin": 9728, + "end": 14509, + "name": "DUP1" + }, + { + "begin": 9728, + "end": 14509, + "name": "REVERT" + }, + { + "begin": 9794, + "end": 9812, + "name": "tag", + "value": "2" + }, + { + "begin": 9794, + "end": 9812, + "name": "JUMPDEST" + }, + { + "begin": 9794, + "end": 9812, + "name": "CALLVALUE" + }, + { + "begin": 9794, + "end": 9812, + "name": "ISZERO" + }, + { + "begin": 9794, + "end": 9812, + "name": "PUSH [tag]", + "value": "34" + }, + { + "begin": 9794, + "end": 9812, + "name": "JUMPI" + }, + { + "begin": 9794, + "end": 9812, + "name": "PUSH", + "value": "0" + }, + { + "begin": 9794, + "end": 9812, + "name": "DUP1" + }, + { + "begin": 9794, + "end": 9812, + "name": "REVERT" + }, + { + "begin": 9794, + "end": 9812, + "name": "tag", + "value": "34" + }, + { + "begin": 9794, + "end": 9812, + "name": "JUMPDEST" + }, + { + "begin": 9794, + "end": 9812, + "name": "PUSH [tag]", + "value": "35" + }, + { + "begin": 9794, + "end": 9812, + "name": "PUSH [tag]", + "value": "36" + }, + { + "begin": 9794, + "end": 9812, + "name": "JUMP" + }, + { + "begin": 9794, + "end": 9812, + "name": "tag", + "value": "35" + }, + { + "begin": 9794, + "end": 9812, + "name": "JUMPDEST" + }, + { + "begin": 9794, + "end": 9812, + "name": "PUSH", + "value": "40" + }, + { + "begin": 9794, + "end": 9812, + "name": "MLOAD" + }, + { + "begin": 9794, + "end": 9812, + "name": "PUSH", + "value": "20" + }, + { + "begin": 9794, + "end": 9812, + "name": "DUP1" + }, + { + "begin": 9794, + "end": 9812, + "name": "DUP3" + }, + { + "begin": 9794, + "end": 9812, + "name": "MSTORE" + }, + { + "begin": 9794, + "end": 9812, + "name": "DUP2" + }, + { + "begin": 9794, + "end": 9812, + "name": "SWAP1" + }, + { + "begin": 9794, + "end": 9812, + "name": "DUP2" + }, + { + "begin": 9794, + "end": 9812, + "name": "ADD" + }, + { + "begin": 9794, + "end": 9812, + "name": "DUP4" + }, + { + "begin": 9794, + "end": 9812, + "name": "DUP2" + }, + { + "begin": 9794, + "end": 9812, + "name": "DUP2" + }, + { + "begin": 9794, + "end": 9812, + "name": "MLOAD" + }, + { + "begin": 9794, + "end": 9812, + "name": "DUP2" + }, + { + "begin": 9794, + "end": 9812, + "name": "MSTORE" + }, + { + "begin": 9794, + "end": 9812, + "name": "PUSH", + "value": "20" + }, + { + "begin": 9794, + "end": 9812, + "name": "ADD" + }, + { + "begin": 9794, + "end": 9812, + "name": "SWAP2" + }, + { + "begin": 9794, + "end": 9812, + "name": "POP" + }, + { + "begin": 9794, + "end": 9812, + "name": "DUP1" + }, + { + "begin": 9794, + "end": 9812, + "name": "MLOAD" + }, + { + "begin": 9794, + "end": 9812, + "name": "SWAP1" + }, + { + "begin": 9794, + "end": 9812, + "name": "PUSH", + "value": "20" + }, + { + "begin": 9794, + "end": 9812, + "name": "ADD" + }, + { + "begin": 9794, + "end": 9812, + "name": "SWAP1" + }, + { + "begin": 9794, + "end": 9812, + "name": "DUP1" + }, + { + "begin": 9794, + "end": 9812, + "name": "DUP4" + }, + { + "begin": 9794, + "end": 9812, + "name": "DUP4" + }, + { + "begin": 23, + "end": 24, + "name": "PUSH", + "value": "0" + }, + { + "begin": 8, + "end": 108, + "name": "tag", + "value": "37" + }, + { + "begin": 8, + "end": 108, + "name": "JUMPDEST" + }, + { + "begin": 33, + "end": 36, + "name": "DUP4" + }, + { + "begin": 30, + "end": 31, + "name": "DUP2" + }, + { + "begin": 27, + "end": 29, + "name": "LT" + }, + { + "begin": 8, + "end": 108, + "name": "ISZERO" + }, + { + "begin": 8, + "end": 108, + "name": "PUSH [tag]", + "value": "38" + }, + { + "begin": 8, + "end": 108, + "name": "JUMPI" + }, + { + "begin": 99, + "end": 100, + "name": "DUP1" + }, + { + "begin": 94, + "end": 97, + "name": "DUP3" + }, + { + "begin": 90, + "end": 93, + "name": "ADD" + }, + { + "begin": 84, + "end": 89, + "name": "MLOAD" + }, + { + "begin": 71, + "end": 74, + "name": "DUP4" + }, + { + "begin": 71, + "end": 74, + "name": "DUP3" + }, + { + "begin": 71, + "end": 74, + "name": "ADD" + }, + { + "begin": 64, + "end": 70, + "name": "MSTORE" + }, + { + "begin": 52, + "end": 54, + "name": "PUSH", + "value": "20" + }, + { + "begin": 45, + "end": 48, + "name": "ADD" + }, + { + "begin": 8, + "end": 108, + "name": "PUSH [tag]", + "value": "37" + }, + { + "begin": 8, + "end": 108, + "name": "JUMP" + }, + { + "begin": 8, + "end": 108, + "name": "tag", + "value": "38" + }, + { + "begin": 8, + "end": 108, + "name": "JUMPDEST" + }, + { + "begin": 12, + "end": 26, + "name": "POP" + }, + { + "begin": 3, + "end": 112, + "name": "POP" + }, + { + "begin": 3, + "end": 112, + "name": "POP" + }, + { + "begin": 3, + "end": 112, + "name": "POP" + }, + { + "begin": 3, + "end": 112, + "name": "SWAP1" + }, + { + "begin": 3, + "end": 112, + "name": "POP" + }, + { + "begin": 3, + "end": 112, + "name": "SWAP1" + }, + { + "begin": 3, + "end": 112, + "name": "DUP2" + }, + { + "begin": 3, + "end": 112, + "name": "ADD" + }, + { + "begin": 3, + "end": 112, + "name": "SWAP1" + }, + { + "begin": 3, + "end": 112, + "name": "PUSH", + "value": "1F" + }, + { + "begin": 3, + "end": 112, + "name": "AND" + }, + { + "begin": 3, + "end": 112, + "name": "DUP1" + }, + { + "begin": 3, + "end": 112, + "name": "ISZERO" + }, + { + "begin": 3, + "end": 112, + "name": "PUSH [tag]", + "value": "40" + }, + { + "begin": 3, + "end": 112, + "name": "JUMPI" + }, + { + "begin": 3, + "end": 112, + "name": "DUP1" + }, + { + "begin": 3, + "end": 112, + "name": "DUP3" + }, + { + "begin": 3, + "end": 112, + "name": "SUB" + }, + { + "begin": 3, + "end": 112, + "name": "DUP1" + }, + { + "begin": 3, + "end": 112, + "name": "MLOAD" + }, + { + "begin": 3, + "end": 112, + "name": "PUSH", + "value": "1" + }, + { + "begin": 3, + "end": 112, + "name": "DUP4" + }, + { + "begin": 3, + "end": 112, + "name": "PUSH", + "value": "20" + }, + { + "begin": 3, + "end": 112, + "name": "SUB" + }, + { + "begin": 3, + "end": 112, + "name": "PUSH", + "value": "100" + }, + { + "begin": 3, + "end": 112, + "name": "EXP" + }, + { + "begin": 3, + "end": 112, + "name": "SUB" + }, + { + "begin": 3, + "end": 112, + "name": "NOT" + }, + { + "begin": 3, + "end": 112, + "name": "AND" + }, + { + "begin": 3, + "end": 112, + "name": "DUP2" + }, + { + "begin": 3, + "end": 112, + "name": "MSTORE" + }, + { + "begin": 3, + "end": 112, + "name": "PUSH", + "value": "20" + }, + { + "begin": 3, + "end": 112, + "name": "ADD" + }, + { + "begin": 3, + "end": 112, + "name": "SWAP2" + }, + { + "begin": 3, + "end": 112, + "name": "POP" + }, + { + "begin": 3, + "end": 112, + "name": "tag", + "value": "40" + }, + { + "begin": 3, + "end": 112, + "name": "JUMPDEST" + }, + { + "begin": 3, + "end": 112, + "name": "POP" + }, + { + "begin": 3, + "end": 112, + "name": "SWAP3" + }, + { + "begin": 3, + "end": 112, + "name": "POP" + }, + { + "begin": 3, + "end": 112, + "name": "POP" + }, + { + "begin": 3, + "end": 112, + "name": "POP" + }, + { + "begin": 3, + "end": 112, + "name": "PUSH", + "value": "40" + }, + { + "begin": 3, + "end": 112, + "name": "MLOAD" + }, + { + "begin": 3, + "end": 112, + "name": "DUP1" + }, + { + "begin": 3, + "end": 112, + "name": "SWAP2" + }, + { + "begin": 3, + "end": 112, + "name": "SUB" + }, + { + "begin": 3, + "end": 112, + "name": "SWAP1" + }, + { + "begin": 3, + "end": 112, + "name": "RETURN" + }, + { + "begin": 12480, + "end": 12657, + "name": "tag", + "value": "3" + }, + { + "begin": 12480, + "end": 12657, + "name": "JUMPDEST" + }, + { + "begin": 12480, + "end": 12657, + "name": "CALLVALUE" + }, + { + "begin": 12480, + "end": 12657, + "name": "ISZERO" + }, + { + "begin": 12480, + "end": 12657, + "name": "PUSH [tag]", + "value": "41" + }, + { + "begin": 12480, + "end": 12657, + "name": "JUMPI" + }, + { + "begin": 12480, + "end": 12657, + "name": "PUSH", + "value": "0" + }, + { + "begin": 12480, + "end": 12657, + "name": "DUP1" + }, + { + "begin": 12480, + "end": 12657, + "name": "REVERT" + }, + { + "begin": 12480, + "end": 12657, + "name": "tag", + "value": "41" + }, + { + "begin": 12480, + "end": 12657, + "name": "JUMPDEST" + }, + { + "begin": 12480, + "end": 12657, + "name": "PUSH [tag]", + "value": "42" + }, + { + "begin": 12480, + "end": 12657, + "name": "PUSH", + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + }, + { + "begin": 12480, + "end": 12657, + "name": "PUSH", + "value": "4" + }, + { + "begin": 12480, + "end": 12657, + "name": "CALLDATALOAD" + }, + { + "begin": 12480, + "end": 12657, + "name": "AND" + }, + { + "begin": 12480, + "end": 12657, + "name": "PUSH [tag]", + "value": "43" + }, + { + "begin": 12480, + "end": 12657, + "name": "JUMP" + }, + { + "begin": 12480, + "end": 12657, + "name": "tag", + "value": "42" + }, + { + "begin": 12480, + "end": 12657, + "name": "JUMPDEST" + }, + { + "begin": 12480, + "end": 12657, + "name": "STOP" + }, + { + "begin": 11752, + "end": 12048, + "name": "tag", + "value": "4" + }, + { + "begin": 11752, + "end": 12048, + "name": "JUMPDEST" + }, + { + "begin": 11752, + "end": 12048, + "name": "CALLVALUE" + }, + { + "begin": 11752, + "end": 12048, + "name": "ISZERO" + }, + { + "begin": 11752, + "end": 12048, + "name": "PUSH [tag]", + "value": "44" + }, + { + "begin": 11752, + "end": 12048, + "name": "JUMPI" + }, + { + "begin": 11752, + "end": 12048, + "name": "PUSH", + "value": "0" + }, + { + "begin": 11752, + "end": 12048, + "name": "DUP1" + }, + { + "begin": 11752, + "end": 12048, + "name": "REVERT" + }, + { + "begin": 11752, + "end": 12048, + "name": "tag", + "value": "44" + }, + { + "begin": 11752, + "end": 12048, + "name": "JUMPDEST" + }, + { + "begin": 11752, + "end": 12048, + "name": "PUSH [tag]", + "value": "42" + }, + { + "begin": 11752, + "end": 12048, + "name": "PUSH", + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + }, + { + "begin": 11752, + "end": 12048, + "name": "PUSH", + "value": "4" + }, + { + "begin": 11752, + "end": 12048, + "name": "CALLDATALOAD" + }, + { + "begin": 11752, + "end": 12048, + "name": "AND" + }, + { + "begin": 11752, + "end": 12048, + "name": "PUSH", + "value": "24" + }, + { + "begin": 11752, + "end": 12048, + "name": "CALLDATALOAD" + }, + { + "begin": 11752, + "end": 12048, + "name": "PUSH [tag]", + "value": "46" + }, + { + "begin": 11752, + "end": 12048, + "name": "JUMP" + }, + { + "begin": 9906, + "end": 9928, + "name": "tag", + "value": "5" + }, + { + "begin": 9906, + "end": 9928, + "name": "JUMPDEST" + }, + { + "begin": 9906, + "end": 9928, + "name": "CALLVALUE" + }, + { + "begin": 9906, + "end": 9928, + "name": "ISZERO" + }, + { + "begin": 9906, + "end": 9928, + "name": "PUSH [tag]", + "value": "47" + }, + { + "begin": 9906, + "end": 9928, + "name": "JUMPI" + }, + { + "begin": 9906, + "end": 9928, + "name": "PUSH", + "value": "0" + }, + { + "begin": 9906, + "end": 9928, + "name": "DUP1" + }, + { + "begin": 9906, + "end": 9928, + "name": "REVERT" + }, + { + "begin": 9906, + "end": 9928, + "name": "tag", + "value": "47" + }, + { + "begin": 9906, + "end": 9928, + "name": "JUMPDEST" + }, + { + "begin": 9906, + "end": 9928, + "name": "PUSH [tag]", + "value": "48" + }, + { + "begin": 9906, + "end": 9928, + "name": "PUSH [tag]", + "value": "49" + }, + { + "begin": 9906, + "end": 9928, + "name": "JUMP" + }, + { + "begin": 9906, + "end": 9928, + "name": "tag", + "value": "48" + }, + { + "begin": 9906, + "end": 9928, + "name": "JUMPDEST" + }, + { + "begin": 9906, + "end": 9928, + "name": "PUSH", + "value": "40" + }, + { + "begin": 9906, + "end": 9928, + "name": "MLOAD" + }, + { + "begin": 9906, + "end": 9928, + "name": "SWAP1" + }, + { + "begin": 9906, + "end": 9928, + "name": "ISZERO" + }, + { + "begin": 9906, + "end": 9928, + "name": "ISZERO" + }, + { + "begin": 9906, + "end": 9928, + "name": "DUP2" + }, + { + "begin": 9906, + "end": 9928, + "name": "MSTORE" + }, + { + "begin": 9906, + "end": 9928, + "name": "PUSH", + "value": "20" + }, + { + "begin": 9906, + "end": 9928, + "name": "ADD" + }, + { + "begin": 9906, + "end": 9928, + "name": "PUSH", + "value": "40" + }, + { + "begin": 9906, + "end": 9928, + "name": "MLOAD" + }, + { + "begin": 9906, + "end": 9928, + "name": "DUP1" + }, + { + "begin": 9906, + "end": 9928, + "name": "SWAP2" + }, + { + "begin": 9906, + "end": 9928, + "name": "SUB" + }, + { + "begin": 9906, + "end": 9928, + "name": "SWAP1" + }, + { + "begin": 9906, + "end": 9928, + "name": "RETURN" + }, + { + "begin": 8505, + "end": 8647, + "name": "tag", + "value": "6" + }, + { + "begin": 8505, + "end": 8647, + "name": "JUMPDEST" + }, + { + "begin": 8505, + "end": 8647, + "name": "CALLVALUE" + }, + { + "begin": 8505, + "end": 8647, + "name": "ISZERO" + }, + { + "begin": 8505, + "end": 8647, + "name": "PUSH [tag]", + "value": "50" + }, + { + "begin": 8505, + "end": 8647, + "name": "JUMPI" + }, + { + "begin": 8505, + "end": 8647, + "name": "PUSH", + "value": "0" + }, + { + "begin": 8505, + "end": 8647, + "name": "DUP1" + }, + { + "begin": 8505, + "end": 8647, + "name": "REVERT" + }, + { + "begin": 8505, + "end": 8647, + "name": "tag", + "value": "50" + }, + { + "begin": 8505, + "end": 8647, + "name": "JUMPDEST" + }, + { + "begin": 8505, + "end": 8647, + "name": "PUSH [tag]", + "value": "42" + }, + { + "begin": 8505, + "end": 8647, + "name": "PUSH", + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + }, + { + "begin": 8505, + "end": 8647, + "name": "PUSH", + "value": "4" + }, + { + "begin": 8505, + "end": 8647, + "name": "CALLDATALOAD" + }, + { + "begin": 8505, + "end": 8647, + "name": "AND" + }, + { + "begin": 8505, + "end": 8647, + "name": "PUSH [tag]", + "value": "52" + }, + { + "begin": 8505, + "end": 8647, + "name": "JUMP" + }, + { + "begin": 12720, + "end": 12932, + "name": "tag", + "value": "7" + }, + { + "begin": 12720, + "end": 12932, + "name": "JUMPDEST" + }, + { + "begin": 12720, + "end": 12932, + "name": "CALLVALUE" + }, + { + "begin": 12720, + "end": 12932, + "name": "ISZERO" + }, + { + "begin": 12720, + "end": 12932, + "name": "PUSH [tag]", + "value": "53" + }, + { + "begin": 12720, + "end": 12932, + "name": "JUMPI" + }, + { + "begin": 12720, + "end": 12932, + "name": "PUSH", + "value": "0" + }, + { + "begin": 12720, + "end": 12932, + "name": "DUP1" + }, + { + "begin": 12720, + "end": 12932, + "name": "REVERT" + }, + { + "begin": 12720, + "end": 12932, + "name": "tag", + "value": "53" + }, + { + "begin": 12720, + "end": 12932, + "name": "JUMPDEST" + }, + { + "begin": 12720, + "end": 12932, + "name": "PUSH [tag]", + "value": "54" + }, + { + "begin": 12720, + "end": 12932, + "name": "PUSH [tag]", + "value": "55" + }, + { + "begin": 12720, + "end": 12932, + "name": "JUMP" + }, + { + "begin": 12720, + "end": 12932, + "name": "tag", + "value": "54" + }, + { + "begin": 12720, + "end": 12932, + "name": "JUMPDEST" + }, + { + "begin": 12720, + "end": 12932, + "name": "PUSH", + "value": "40" + }, + { + "begin": 12720, + "end": 12932, + "name": "MLOAD" + }, + { + "begin": 12720, + "end": 12932, + "name": "SWAP1" + }, + { + "begin": 12720, + "end": 12932, + "name": "DUP2" + }, + { + "begin": 12720, + "end": 12932, + "name": "MSTORE" + }, + { + "begin": 12720, + "end": 12932, + "name": "PUSH", + "value": "20" + }, + { + "begin": 12720, + "end": 12932, + "name": "ADD" + }, + { + "begin": 12720, + "end": 12932, + "name": "PUSH", + "value": "40" + }, + { + "begin": 12720, + "end": 12932, + "name": "MLOAD" + }, + { + "begin": 12720, + "end": 12932, + "name": "DUP1" + }, + { + "begin": 12720, + "end": 12932, + "name": "SWAP2" + }, + { + "begin": 12720, + "end": 12932, + "name": "SUB" + }, + { + "begin": 12720, + "end": 12932, + "name": "SWAP1" + }, + { + "begin": 12720, + "end": 12932, + "name": "RETURN" + }, + { + "begin": 10995, + "end": 11350, + "name": "tag", + "value": "8" + }, + { + "begin": 10995, + "end": 11350, + "name": "JUMPDEST" + }, + { + "begin": 10995, + "end": 11350, + "name": "CALLVALUE" + }, + { + "begin": 10995, + "end": 11350, + "name": "ISZERO" + }, + { + "begin": 10995, + "end": 11350, + "name": "PUSH [tag]", + "value": "56" + }, + { + "begin": 10995, + "end": 11350, + "name": "JUMPI" + }, + { + "begin": 10995, + "end": 11350, + "name": "PUSH", + "value": "0" + }, + { + "begin": 10995, + "end": 11350, + "name": "DUP1" + }, + { + "begin": 10995, + "end": 11350, + "name": "REVERT" + }, + { + "begin": 10995, + "end": 11350, + "name": "tag", + "value": "56" + }, + { + "begin": 10995, + "end": 11350, + "name": "JUMPDEST" + }, + { + "begin": 10995, + "end": 11350, + "name": "PUSH [tag]", + "value": "42" + }, + { + "begin": 10995, + "end": 11350, + "name": "PUSH", + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + }, + { + "begin": 10995, + "end": 11350, + "name": "PUSH", + "value": "4" + }, + { + "begin": 10995, + "end": 11350, + "name": "CALLDATALOAD" + }, + { + "begin": 10995, + "end": 11350, + "name": "DUP2" + }, + { + "begin": 10995, + "end": 11350, + "name": "AND" + }, + { + "begin": 10995, + "end": 11350, + "name": "SWAP1" + }, + { + "begin": 10995, + "end": 11350, + "name": "PUSH", + "value": "24" + }, + { + "begin": 10995, + "end": 11350, + "name": "CALLDATALOAD" + }, + { + "begin": 10995, + "end": 11350, + "name": "AND" + }, + { + "begin": 10995, + "end": 11350, + "name": "PUSH", + "value": "44" + }, + { + "begin": 10995, + "end": 11350, + "name": "CALLDATALOAD" + }, + { + "begin": 10995, + "end": 11350, + "name": "PUSH [tag]", + "value": "58" + }, + { + "begin": 10995, + "end": 11350, + "name": "JUMP" + }, + { + "begin": 9870, + "end": 9900, + "name": "tag", + "value": "9" + }, + { + "begin": 9870, + "end": 9900, + "name": "JUMPDEST" + }, + { + "begin": 9870, + "end": 9900, + "name": "CALLVALUE" + }, + { + "begin": 9870, + "end": 9900, + "name": "ISZERO" + }, + { + "begin": 9870, + "end": 9900, + "name": "PUSH [tag]", + "value": "59" + }, + { + "begin": 9870, + "end": 9900, + "name": "JUMPI" + }, + { + "begin": 9870, + "end": 9900, + "name": "PUSH", + "value": "0" + }, + { + "begin": 9870, + "end": 9900, + "name": "DUP1" + }, + { + "begin": 9870, + "end": 9900, + "name": "REVERT" + }, + { + "begin": 9870, + "end": 9900, + "name": "tag", + "value": "59" + }, + { + "begin": 9870, + "end": 9900, + "name": "JUMPDEST" + }, + { + "begin": 9870, + "end": 9900, + "name": "PUSH [tag]", + "value": "60" + }, + { + "begin": 9870, + "end": 9900, + "name": "PUSH [tag]", + "value": "61" + }, + { + "begin": 9870, + "end": 9900, + "name": "JUMP" + }, + { + "begin": 9870, + "end": 9900, + "name": "tag", + "value": "60" + }, + { + "begin": 9870, + "end": 9900, + "name": "JUMPDEST" + }, + { + "begin": 9870, + "end": 9900, + "name": "PUSH", + "value": "40" + }, + { + "begin": 9870, + "end": 9900, + "name": "MLOAD" + }, + { + "begin": 9870, + "end": 9900, + "name": "PUSH", + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + }, + { + "begin": 9870, + "end": 9900, + "name": "SWAP1" + }, + { + "begin": 9870, + "end": 9900, + "name": "SWAP2" + }, + { + "begin": 9870, + "end": 9900, + "name": "AND" + }, + { + "begin": 9870, + "end": 9900, + "name": "DUP2" + }, + { + "begin": 9870, + "end": 9900, + "name": "MSTORE" + }, + { + "begin": 9870, + "end": 9900, + "name": "PUSH", + "value": "20" + }, + { + "begin": 9870, + "end": 9900, + "name": "ADD" + }, + { + "begin": 9870, + "end": 9900, + "name": "PUSH", + "value": "40" + }, + { + "begin": 9870, + "end": 9900, + "name": "MLOAD" + }, + { + "begin": 9870, + "end": 9900, + "name": "DUP1" + }, + { + "begin": 9870, + "end": 9900, + "name": "SWAP2" + }, + { + "begin": 9870, + "end": 9900, + "name": "SUB" + }, + { + "begin": 9870, + "end": 9900, + "name": "SWAP1" + }, + { + "begin": 9870, + "end": 9900, + "name": "RETURN" + }, + { + "begin": 2916, + "end": 2956, + "name": "tag", + "value": "10" + }, + { + "begin": 2916, + "end": 2956, + "name": "JUMPDEST" + }, + { + "begin": 2916, + "end": 2956, + "name": "CALLVALUE" + }, + { + "begin": 2916, + "end": 2956, + "name": "ISZERO" + }, + { + "begin": 2916, + "end": 2956, + "name": "PUSH [tag]", + "value": "62" + }, + { + "begin": 2916, + "end": 2956, + "name": "JUMPI" + }, + { + "begin": 2916, + "end": 2956, + "name": "PUSH", + "value": "0" + }, + { + "begin": 2916, + "end": 2956, + "name": "DUP1" + }, + { + "begin": 2916, + "end": 2956, + "name": "REVERT" + }, + { + "begin": 2916, + "end": 2956, + "name": "tag", + "value": "62" + }, + { + "begin": 2916, + "end": 2956, + "name": "JUMPDEST" + }, + { + "begin": 2916, + "end": 2956, + "name": "PUSH [tag]", + "value": "54" + }, + { + "begin": 2916, + "end": 2956, + "name": "PUSH", + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + }, + { + "begin": 2916, + "end": 2956, + "name": "PUSH", + "value": "4" + }, + { + "begin": 2916, + "end": 2956, + "name": "CALLDATALOAD" + }, + { + "begin": 2916, + "end": 2956, + "name": "AND" + }, + { + "begin": 2916, + "end": 2956, + "name": "PUSH [tag]", + "value": "64" + }, + { + "begin": 2916, + "end": 2956, + "name": "JUMP" + }, + { + "begin": 9844, + "end": 9864, + "name": "tag", + "value": "11" + }, + { + "begin": 9844, + "end": 9864, + "name": "JUMPDEST" + }, + { + "begin": 9844, + "end": 9864, + "name": "CALLVALUE" + }, + { + "begin": 9844, + "end": 9864, + "name": "ISZERO" + }, + { + "begin": 9844, + "end": 9864, + "name": "PUSH [tag]", + "value": "65" + }, + { + "begin": 9844, + "end": 9864, + "name": "JUMPI" + }, + { + "begin": 9844, + "end": 9864, + "name": "PUSH", + "value": "0" + }, + { + "begin": 9844, + "end": 9864, + "name": "DUP1" + }, + { + "begin": 9844, + "end": 9864, + "name": "REVERT" + }, + { + "begin": 9844, + "end": 9864, + "name": "tag", + "value": "65" + }, + { + "begin": 9844, + "end": 9864, + "name": "JUMPDEST" + }, + { + "begin": 9844, + "end": 9864, + "name": "PUSH [tag]", + "value": "54" + }, + { + "begin": 9844, + "end": 9864, + "name": "PUSH [tag]", + "value": "67" + }, + { + "begin": 9844, + "end": 9864, + "name": "JUMP" + }, + { + "begin": 3078, + "end": 3104, + "name": "tag", + "value": "12" + }, + { + "begin": 3078, + "end": 3104, + "name": "JUMPDEST" + }, + { + "begin": 3078, + "end": 3104, + "name": "CALLVALUE" + }, + { + "begin": 3078, + "end": 3104, + "name": "ISZERO" + }, + { + "begin": 3078, + "end": 3104, + "name": "PUSH [tag]", + "value": "68" + }, + { + "begin": 3078, + "end": 3104, + "name": "JUMPI" + }, + { + "begin": 3078, + "end": 3104, + "name": "PUSH", + "value": "0" + }, + { + "begin": 3078, + "end": 3104, + "name": "DUP1" + }, + { + "begin": 3078, + "end": 3104, + "name": "REVERT" + }, + { + "begin": 3078, + "end": 3104, + "name": "tag", + "value": "68" + }, + { + "begin": 3078, + "end": 3104, + "name": "JUMPDEST" + }, + { + "begin": 3078, + "end": 3104, + "name": "PUSH [tag]", + "value": "54" + }, + { + "begin": 3078, + "end": 3104, + "name": "PUSH [tag]", + "value": "70" + }, + { + "begin": 3078, + "end": 3104, + "name": "JUMP" + }, + { + "begin": 2043, + "end": 2067, + "name": "tag", + "value": "13" + }, + { + "begin": 2043, + "end": 2067, + "name": "JUMPDEST" + }, + { + "begin": 2043, + "end": 2067, + "name": "CALLVALUE" + }, + { + "begin": 2043, + "end": 2067, + "name": "ISZERO" + }, + { + "begin": 2043, + "end": 2067, + "name": "PUSH [tag]", + "value": "71" + }, + { + "begin": 2043, + "end": 2067, + "name": "JUMPI" + }, + { + "begin": 2043, + "end": 2067, + "name": "PUSH", + "value": "0" + }, + { + "begin": 2043, + "end": 2067, + "name": "DUP1" + }, + { + "begin": 2043, + "end": 2067, + "name": "REVERT" + }, + { + "begin": 2043, + "end": 2067, + "name": "tag", + "value": "71" + }, + { + "begin": 2043, + "end": 2067, + "name": "JUMPDEST" + }, + { + "begin": 2043, + "end": 2067, + "name": "PUSH [tag]", + "value": "54" + }, + { + "begin": 2043, + "end": 2067, + "name": "PUSH [tag]", + "value": "73" + }, + { + "begin": 2043, + "end": 2067, + "name": "JUMP" + }, + { + "begin": 7970, + "end": 8057, + "name": "tag", + "value": "14" + }, + { + "begin": 7970, + "end": 8057, + "name": "JUMPDEST" + }, + { + "begin": 7970, + "end": 8057, + "name": "CALLVALUE" + }, + { + "begin": 7970, + "end": 8057, + "name": "ISZERO" + }, + { + "begin": 7970, + "end": 8057, + "name": "PUSH [tag]", + "value": "74" + }, + { + "begin": 7970, + "end": 8057, + "name": "JUMPI" + }, + { + "begin": 7970, + "end": 8057, + "name": "PUSH", + "value": "0" + }, + { + "begin": 7970, + "end": 8057, + "name": "DUP1" + }, + { + "begin": 7970, + "end": 8057, + "name": "REVERT" + }, + { + "begin": 7970, + "end": 8057, + "name": "tag", + "value": "74" + }, + { + "begin": 7970, + "end": 8057, + "name": "JUMPDEST" + }, + { + "begin": 7970, + "end": 8057, + "name": "PUSH [tag]", + "value": "42" + }, + { + "begin": 7970, + "end": 8057, + "name": "PUSH [tag]", + "value": "76" + }, + { + "begin": 7970, + "end": 8057, + "name": "JUMP" + }, + { + "begin": 8229, + "end": 8351, + "name": "tag", + "value": "15" + }, + { + "begin": 8229, + "end": 8351, + "name": "JUMPDEST" + }, + { + "begin": 8229, + "end": 8351, + "name": "CALLVALUE" + }, + { + "begin": 8229, + "end": 8351, + "name": "ISZERO" + }, + { + "begin": 8229, + "end": 8351, + "name": "PUSH [tag]", + "value": "77" + }, + { + "begin": 8229, + "end": 8351, + "name": "JUMPI" + }, + { + "begin": 8229, + "end": 8351, + "name": "PUSH", + "value": "0" + }, + { + "begin": 8229, + "end": 8351, + "name": "DUP1" + }, + { + "begin": 8229, + "end": 8351, + "name": "REVERT" + }, + { + "begin": 8229, + "end": 8351, + "name": "tag", + "value": "77" + }, + { + "begin": 8229, + "end": 8351, + "name": "JUMPDEST" + }, + { + "begin": 8229, + "end": 8351, + "name": "PUSH [tag]", + "value": "48" + }, + { + "begin": 8229, + "end": 8351, + "name": "PUSH", + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + }, + { + "begin": 8229, + "end": 8351, + "name": "PUSH", + "value": "4" + }, + { + "begin": 8229, + "end": 8351, + "name": "CALLDATALOAD" + }, + { + "begin": 8229, + "end": 8351, + "name": "AND" + }, + { + "begin": 8229, + "end": 8351, + "name": "PUSH [tag]", + "value": "79" + }, + { + "begin": 8229, + "end": 8351, + "name": "JUMP" + }, + { + "begin": 4652, + "end": 4713, + "name": "tag", + "value": "16" + }, + { + "begin": 4652, + "end": 4713, + "name": "JUMPDEST" + }, + { + "begin": 4652, + "end": 4713, + "name": "CALLVALUE" + }, + { + "begin": 4652, + "end": 4713, + "name": "ISZERO" + }, + { + "begin": 4652, + "end": 4713, + "name": "PUSH [tag]", + "value": "80" + }, + { + "begin": 4652, + "end": 4713, + "name": "JUMPI" + }, + { + "begin": 4652, + "end": 4713, + "name": "PUSH", + "value": "0" + }, + { + "begin": 4652, + "end": 4713, + "name": "DUP1" + }, + { + "begin": 4652, + "end": 4713, + "name": "REVERT" + }, + { + "begin": 4652, + "end": 4713, + "name": "tag", + "value": "80" + }, + { + "begin": 4652, + "end": 4713, + "name": "JUMPDEST" + }, + { + "begin": 4652, + "end": 4713, + "name": "PUSH [tag]", + "value": "54" + }, + { + "begin": 4652, + "end": 4713, + "name": "PUSH", + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + }, + { + "begin": 4652, + "end": 4713, + "name": "PUSH", + "value": "4" + }, + { + "begin": 4652, + "end": 4713, + "name": "CALLDATALOAD" + }, + { + "begin": 4652, + "end": 4713, + "name": "DUP2" + }, + { + "begin": 4652, + "end": 4713, + "name": "AND" + }, + { + "begin": 4652, + "end": 4713, + "name": "SWAP1" + }, + { + "begin": 4652, + "end": 4713, + "name": "PUSH", + "value": "24" + }, + { + "begin": 4652, + "end": 4713, + "name": "CALLDATALOAD" + }, + { + "begin": 4652, + "end": 4713, + "name": "AND" + }, + { + "begin": 4652, + "end": 4713, + "name": "PUSH [tag]", + "value": "82" + }, + { + "begin": 4652, + "end": 4713, + "name": "JUMP" + }, + { + "begin": 7384, + "end": 7410, + "name": "tag", + "value": "17" + }, + { + "begin": 7384, + "end": 7410, + "name": "JUMPDEST" + }, + { + "begin": 7384, + "end": 7410, + "name": "CALLVALUE" + }, + { + "begin": 7384, + "end": 7410, + "name": "ISZERO" + }, + { + "begin": 7384, + "end": 7410, + "name": "PUSH [tag]", + "value": "83" + }, + { + "begin": 7384, + "end": 7410, + "name": "JUMPI" + }, + { + "begin": 7384, + "end": 7410, + "name": "PUSH", + "value": "0" + }, + { + "begin": 7384, + "end": 7410, + "name": "DUP1" + }, + { + "begin": 7384, + "end": 7410, + "name": "REVERT" + }, + { + "begin": 7384, + "end": 7410, + "name": "tag", + "value": "83" + }, + { + "begin": 7384, + "end": 7410, + "name": "JUMPDEST" + }, + { + "begin": 7384, + "end": 7410, + "name": "PUSH [tag]", + "value": "48" + }, + { + "begin": 7384, + "end": 7410, + "name": "PUSH [tag]", + "value": "85" + }, + { + "begin": 7384, + "end": 7410, + "name": "JUMP" + }, + { + "begin": 11432, + "end": 11670, + "name": "tag", + "value": "18" + }, + { + "begin": 11432, + "end": 11670, + "name": "JUMPDEST" + }, + { + "begin": 11432, + "end": 11670, + "name": "CALLVALUE" + }, + { + "begin": 11432, + "end": 11670, + "name": "ISZERO" + }, + { + "begin": 11432, + "end": 11670, + "name": "PUSH [tag]", + "value": "86" + }, + { + "begin": 11432, + "end": 11670, + "name": "JUMPI" + }, + { + "begin": 11432, + "end": 11670, + "name": "PUSH", + "value": "0" + }, + { + "begin": 11432, + "end": 11670, + "name": "DUP1" + }, + { + "begin": 11432, + "end": 11670, + "name": "REVERT" + }, + { + "begin": 11432, + "end": 11670, + "name": "tag", + "value": "86" + }, + { + "begin": 11432, + "end": 11670, + "name": "JUMPDEST" + }, + { + "begin": 11432, + "end": 11670, + "name": "PUSH [tag]", + "value": "54" + }, + { + "begin": 11432, + "end": 11670, + "name": "PUSH", + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + }, + { + "begin": 11432, + "end": 11670, + "name": "PUSH", + "value": "4" + }, + { + "begin": 11432, + "end": 11670, + "name": "CALLDATALOAD" + }, + { + "begin": 11432, + "end": 11670, + "name": "AND" + }, + { + "begin": 11432, + "end": 11670, + "name": "PUSH [tag]", + "value": "88" + }, + { + "begin": 11432, + "end": 11670, + "name": "JUMP" + }, + { + "begin": 7803, + "end": 7888, + "name": "tag", + "value": "19" + }, + { + "begin": 7803, + "end": 7888, + "name": "JUMPDEST" + }, + { + "begin": 7803, + "end": 7888, + "name": "CALLVALUE" + }, + { + "begin": 7803, + "end": 7888, + "name": "ISZERO" + }, + { + "begin": 7803, + "end": 7888, + "name": "PUSH [tag]", + "value": "89" + }, + { + "begin": 7803, + "end": 7888, + "name": "JUMPI" + }, + { + "begin": 7803, + "end": 7888, + "name": "PUSH", + "value": "0" + }, + { + "begin": 7803, + "end": 7888, + "name": "DUP1" + }, + { + "begin": 7803, + "end": 7888, + "name": "REVERT" + }, + { + "begin": 7803, + "end": 7888, + "name": "tag", + "value": "89" + }, + { + "begin": 7803, + "end": 7888, + "name": "JUMPDEST" + }, + { + "begin": 7803, + "end": 7888, + "name": "PUSH [tag]", + "value": "42" + }, + { + "begin": 7803, + "end": 7888, + "name": "PUSH [tag]", + "value": "91" + }, + { + "begin": 7803, + "end": 7888, + "name": "JUMP" + }, + { + "begin": 8357, + "end": 8442, + "name": "tag", + "value": "20" + }, + { + "begin": 8357, + "end": 8442, + "name": "JUMPDEST" + }, + { + "begin": 8357, + "end": 8442, + "name": "CALLVALUE" + }, + { + "begin": 8357, + "end": 8442, + "name": "ISZERO" + }, + { + "begin": 8357, + "end": 8442, + "name": "PUSH [tag]", + "value": "92" + }, + { + "begin": 8357, + "end": 8442, + "name": "JUMPI" + }, + { + "begin": 8357, + "end": 8442, + "name": "PUSH", + "value": "0" + }, + { + "begin": 8357, + "end": 8442, + "name": "DUP1" + }, + { + "begin": 8357, + "end": 8442, + "name": "REVERT" + }, + { + "begin": 8357, + "end": 8442, + "name": "tag", + "value": "92" + }, + { + "begin": 8357, + "end": 8442, + "name": "JUMPDEST" + }, + { + "begin": 8357, + "end": 8442, + "name": "PUSH [tag]", + "value": "60" + }, + { + "begin": 8357, + "end": 8442, + "name": "PUSH [tag]", + "value": "94" + }, + { + "begin": 8357, + "end": 8442, + "name": "JUMP" + }, + { + "begin": 1188, + "end": 1208, + "name": "tag", + "value": "21" + }, + { + "begin": 1188, + "end": 1208, + "name": "JUMPDEST" + }, + { + "begin": 1188, + "end": 1208, + "name": "CALLVALUE" + }, + { + "begin": 1188, + "end": 1208, + "name": "ISZERO" + }, + { + "begin": 1188, + "end": 1208, + "name": "PUSH [tag]", + "value": "95" + }, + { + "begin": 1188, + "end": 1208, + "name": "JUMPI" + }, + { + "begin": 1188, + "end": 1208, + "name": "PUSH", + "value": "0" + }, + { + "begin": 1188, + "end": 1208, + "name": "DUP1" + }, + { + "begin": 1188, + "end": 1208, + "name": "REVERT" + }, + { + "begin": 1188, + "end": 1208, + "name": "tag", + "value": "95" + }, + { + "begin": 1188, + "end": 1208, + "name": "JUMPDEST" + }, + { + "begin": 1188, + "end": 1208, + "name": "PUSH [tag]", + "value": "60" + }, + { + "begin": 1188, + "end": 1208, + "name": "PUSH [tag]", + "value": "97" + }, + { + "begin": 1188, + "end": 1208, + "name": "JUMP" + }, + { + "begin": 9818, + "end": 9838, + "name": "tag", + "value": "22" + }, + { + "begin": 9818, + "end": 9838, + "name": "JUMPDEST" + }, + { + "begin": 9818, + "end": 9838, + "name": "CALLVALUE" + }, + { + "begin": 9818, + "end": 9838, + "name": "ISZERO" + }, + { + "begin": 9818, + "end": 9838, + "name": "PUSH [tag]", + "value": "98" + }, + { + "begin": 9818, + "end": 9838, + "name": "JUMPI" + }, + { + "begin": 9818, + "end": 9838, + "name": "PUSH", + "value": "0" + }, + { + "begin": 9818, + "end": 9838, + "name": "DUP1" + }, + { + "begin": 9818, + "end": 9838, + "name": "REVERT" + }, + { + "begin": 9818, + "end": 9838, + "name": "tag", + "value": "98" + }, + { + "begin": 9818, + "end": 9838, + "name": "JUMPDEST" + }, + { + "begin": 9818, + "end": 9838, + "name": "PUSH [tag]", + "value": "35" + }, + { + "begin": 9818, + "end": 9838, + "name": "PUSH [tag]", + "value": "100" + }, + { + "begin": 9818, + "end": 9838, + "name": "JUMP" + }, + { + "begin": 10594, + "end": 10913, + "name": "tag", + "value": "23" + }, + { + "begin": 10594, + "end": 10913, + "name": "JUMPDEST" + }, + { + "begin": 10594, + "end": 10913, + "name": "CALLVALUE" + }, + { + "begin": 10594, + "end": 10913, + "name": "ISZERO" + }, + { + "begin": 10594, + "end": 10913, + "name": "PUSH [tag]", + "value": "105" + }, + { + "begin": 10594, + "end": 10913, + "name": "JUMPI" + }, + { + "begin": 10594, + "end": 10913, + "name": "PUSH", + "value": "0" + }, + { + "begin": 10594, + "end": 10913, + "name": "DUP1" + }, + { + "begin": 10594, + "end": 10913, + "name": "REVERT" + }, + { + "begin": 10594, + "end": 10913, + "name": "tag", + "value": "105" + }, + { + "begin": 10594, + "end": 10913, + "name": "JUMPDEST" + }, + { + "begin": 10594, + "end": 10913, + "name": "PUSH [tag]", + "value": "42" + }, + { + "begin": 10594, + "end": 10913, + "name": "PUSH", + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + }, + { + "begin": 10594, + "end": 10913, + "name": "PUSH", + "value": "4" + }, + { + "begin": 10594, + "end": 10913, + "name": "CALLDATALOAD" + }, + { + "begin": 10594, + "end": 10913, + "name": "AND" + }, + { + "begin": 10594, + "end": 10913, + "name": "PUSH", + "value": "24" + }, + { + "begin": 10594, + "end": 10913, + "name": "CALLDATALOAD" + }, + { + "begin": 10594, + "end": 10913, + "name": "PUSH [tag]", + "value": "107" + }, + { + "begin": 10594, + "end": 10913, + "name": "JUMP" + }, + { + "begin": 13809, + "end": 14187, + "name": "tag", + "value": "24" + }, + { + "begin": 13809, + "end": 14187, + "name": "JUMPDEST" + }, + { + "begin": 13809, + "end": 14187, + "name": "CALLVALUE" + }, + { + "begin": 13809, + "end": 14187, + "name": "ISZERO" + }, + { + "begin": 13809, + "end": 14187, + "name": "PUSH [tag]", + "value": "108" + }, + { + "begin": 13809, + "end": 14187, + "name": "JUMPI" + }, + { + "begin": 13809, + "end": 14187, + "name": "PUSH", + "value": "0" + }, + { + "begin": 13809, + "end": 14187, + "name": "DUP1" + }, + { + "begin": 13809, + "end": 14187, + "name": "REVERT" + }, + { + "begin": 13809, + "end": 14187, + "name": "tag", + "value": "108" + }, + { + "begin": 13809, + "end": 14187, + "name": "JUMPDEST" + }, + { + "begin": 13809, + "end": 14187, + "name": "PUSH [tag]", + "value": "42" + }, + { + "begin": 13809, + "end": 14187, + "name": "PUSH", + "value": "4" + }, + { + "begin": 13809, + "end": 14187, + "name": "CALLDATALOAD" + }, + { + "begin": 13809, + "end": 14187, + "name": "PUSH", + "value": "24" + }, + { + "begin": 13809, + "end": 14187, + "name": "CALLDATALOAD" + }, + { + "begin": 13809, + "end": 14187, + "name": "PUSH [tag]", + "value": "110" + }, + { + "begin": 13809, + "end": 14187, + "name": "JUMP" + }, + { + "begin": 13090, + "end": 13349, + "name": "tag", + "value": "25" + }, + { + "begin": 13090, + "end": 13349, + "name": "JUMPDEST" + }, + { + "begin": 13090, + "end": 13349, + "name": "CALLVALUE" + }, + { + "begin": 13090, + "end": 13349, + "name": "ISZERO" + }, + { + "begin": 13090, + "end": 13349, + "name": "PUSH [tag]", + "value": "111" + }, + { + "begin": 13090, + "end": 13349, + "name": "JUMPI" + }, + { + "begin": 13090, + "end": 13349, + "name": "PUSH", + "value": "0" + }, + { + "begin": 13090, + "end": 13349, + "name": "DUP1" + }, + { + "begin": 13090, + "end": 13349, + "name": "REVERT" + }, + { + "begin": 13090, + "end": 13349, + "name": "tag", + "value": "111" + }, + { + "begin": 13090, + "end": 13349, + "name": "JUMPDEST" + }, + { + "begin": 13090, + "end": 13349, + "name": "PUSH [tag]", + "value": "42" + }, + { + "begin": 13090, + "end": 13349, + "name": "PUSH", + "value": "4" + }, + { + "begin": 13090, + "end": 13349, + "name": "CALLDATALOAD" + }, + { + "begin": 13090, + "end": 13349, + "name": "PUSH [tag]", + "value": "113" + }, + { + "begin": 13090, + "end": 13349, + "name": "JUMP" + }, + { + "begin": 13573, + "end": 13803, + "name": "tag", + "value": "26" + }, + { + "begin": 13573, + "end": 13803, + "name": "JUMPDEST" + }, + { + "begin": 13573, + "end": 13803, + "name": "CALLVALUE" + }, + { + "begin": 13573, + "end": 13803, + "name": "ISZERO" + }, + { + "begin": 13573, + "end": 13803, + "name": "PUSH [tag]", + "value": "114" + }, + { + "begin": 13573, + "end": 13803, + "name": "JUMPI" + }, + { + "begin": 13573, + "end": 13803, + "name": "PUSH", + "value": "0" + }, + { + "begin": 13573, + "end": 13803, + "name": "DUP1" + }, + { + "begin": 13573, + "end": 13803, + "name": "REVERT" + }, + { + "begin": 13573, + "end": 13803, + "name": "tag", + "value": "114" + }, + { + "begin": 13573, + "end": 13803, + "name": "JUMPDEST" + }, + { + "begin": 13573, + "end": 13803, + "name": "PUSH [tag]", + "value": "42" + }, + { + "begin": 13573, + "end": 13803, + "name": "PUSH", + "value": "4" + }, + { + "begin": 13573, + "end": 13803, + "name": "CALLDATALOAD" + }, + { + "begin": 13573, + "end": 13803, + "name": "PUSH [tag]", + "value": "116" + }, + { + "begin": 13573, + "end": 13803, + "name": "JUMP" + }, + { + "begin": 12130, + "end": 12417, + "name": "tag", + "value": "27" + }, + { + "begin": 12130, + "end": 12417, + "name": "JUMPDEST" + }, + { + "begin": 12130, + "end": 12417, + "name": "CALLVALUE" + }, + { + "begin": 12130, + "end": 12417, + "name": "ISZERO" + }, + { + "begin": 12130, + "end": 12417, + "name": "PUSH [tag]", + "value": "117" + }, + { + "begin": 12130, + "end": 12417, + "name": "JUMPI" + }, + { + "begin": 12130, + "end": 12417, + "name": "PUSH", + "value": "0" + }, + { + "begin": 12130, + "end": 12417, + "name": "DUP1" + }, + { + "begin": 12130, + "end": 12417, + "name": "REVERT" + }, + { + "begin": 12130, + "end": 12417, + "name": "tag", + "value": "117" + }, + { + "begin": 12130, + "end": 12417, + "name": "JUMPDEST" + }, + { + "begin": 12130, + "end": 12417, + "name": "PUSH [tag]", + "value": "54" + }, + { + "begin": 12130, + "end": 12417, + "name": "PUSH", + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + }, + { + "begin": 12130, + "end": 12417, + "name": "PUSH", + "value": "4" + }, + { + "begin": 12130, + "end": 12417, + "name": "CALLDATALOAD" + }, + { + "begin": 12130, + "end": 12417, + "name": "DUP2" + }, + { + "begin": 12130, + "end": 12417, + "name": "AND" + }, + { + "begin": 12130, + "end": 12417, + "name": "SWAP1" + }, + { + "begin": 12130, + "end": 12417, + "name": "PUSH", + "value": "24" + }, + { + "begin": 12130, + "end": 12417, + "name": "CALLDATALOAD" + }, + { + "begin": 12130, + "end": 12417, + "name": "AND" + }, + { + "begin": 12130, + "end": 12417, + "name": "PUSH [tag]", + "value": "119" + }, + { + "begin": 12130, + "end": 12417, + "name": "JUMP" + }, + { + "begin": 3041, + "end": 3072, + "name": "tag", + "value": "28" + }, + { + "begin": 3041, + "end": 3072, + "name": "JUMPDEST" + }, + { + "begin": 3041, + "end": 3072, + "name": "CALLVALUE" + }, + { + "begin": 3041, + "end": 3072, + "name": "ISZERO" + }, + { + "begin": 3041, + "end": 3072, + "name": "PUSH [tag]", + "value": "120" + }, + { + "begin": 3041, + "end": 3072, + "name": "JUMPI" + }, + { + "begin": 3041, + "end": 3072, + "name": "PUSH", + "value": "0" + }, + { + "begin": 3041, + "end": 3072, + "name": "DUP1" + }, + { + "begin": 3041, + "end": 3072, + "name": "REVERT" + }, + { + "begin": 3041, + "end": 3072, + "name": "tag", + "value": "120" + }, + { + "begin": 3041, + "end": 3072, + "name": "JUMPDEST" + }, + { + "begin": 3041, + "end": 3072, + "name": "PUSH [tag]", + "value": "54" + }, + { + "begin": 3041, + "end": 3072, + "name": "PUSH [tag]", + "value": "122" + }, + { + "begin": 3041, + "end": 3072, + "name": "JUMP" + }, + { + "begin": 8448, + "end": 8494, + "name": "tag", + "value": "29" + }, + { + "begin": 8448, + "end": 8494, + "name": "JUMPDEST" + }, + { + "begin": 8448, + "end": 8494, + "name": "CALLVALUE" + }, + { + "begin": 8448, + "end": 8494, + "name": "ISZERO" + }, + { + "begin": 8448, + "end": 8494, + "name": "PUSH [tag]", + "value": "123" + }, + { + "begin": 8448, + "end": 8494, + "name": "JUMPI" + }, + { + "begin": 8448, + "end": 8494, + "name": "PUSH", + "value": "0" + }, + { + "begin": 8448, + "end": 8494, + "name": "DUP1" + }, + { + "begin": 8448, + "end": 8494, + "name": "REVERT" + }, + { + "begin": 8448, + "end": 8494, + "name": "tag", + "value": "123" + }, + { + "begin": 8448, + "end": 8494, + "name": "JUMPDEST" + }, + { + "begin": 8448, + "end": 8494, + "name": "PUSH [tag]", + "value": "48" + }, + { + "begin": 8448, + "end": 8494, + "name": "PUSH", + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + }, + { + "begin": 8448, + "end": 8494, + "name": "PUSH", + "value": "4" + }, + { + "begin": 8448, + "end": 8494, + "name": "CALLDATALOAD" + }, + { + "begin": 8448, + "end": 8494, + "name": "AND" + }, + { + "begin": 8448, + "end": 8494, + "name": "PUSH [tag]", + "value": "125" + }, + { + "begin": 8448, + "end": 8494, + "name": "JUMP" + }, + { + "begin": 8653, + "end": 8810, + "name": "tag", + "value": "30" + }, + { + "begin": 8653, + "end": 8810, + "name": "JUMPDEST" + }, + { + "begin": 8653, + "end": 8810, + "name": "CALLVALUE" + }, + { + "begin": 8653, + "end": 8810, + "name": "ISZERO" + }, + { + "begin": 8653, + "end": 8810, + "name": "PUSH [tag]", + "value": "126" + }, + { + "begin": 8653, + "end": 8810, + "name": "JUMPI" + }, + { + "begin": 8653, + "end": 8810, + "name": "PUSH", + "value": "0" + }, + { + "begin": 8653, + "end": 8810, + "name": "DUP1" + }, + { + "begin": 8653, + "end": 8810, + "name": "REVERT" + }, + { + "begin": 8653, + "end": 8810, + "name": "tag", + "value": "126" + }, + { + "begin": 8653, + "end": 8810, + "name": "JUMPDEST" + }, + { + "begin": 8653, + "end": 8810, + "name": "PUSH [tag]", + "value": "42" + }, + { + "begin": 8653, + "end": 8810, + "name": "PUSH", + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + }, + { + "begin": 8653, + "end": 8810, + "name": "PUSH", + "value": "4" + }, + { + "begin": 8653, + "end": 8810, + "name": "CALLDATALOAD" + }, + { + "begin": 8653, + "end": 8810, + "name": "AND" + }, + { + "begin": 8653, + "end": 8810, + "name": "PUSH [tag]", + "value": "128" + }, + { + "begin": 8653, + "end": 8810, + "name": "JUMP" + }, + { + "begin": 4720, + "end": 4762, + "name": "tag", + "value": "31" + }, + { + "begin": 4720, + "end": 4762, + "name": "JUMPDEST" + }, + { + "begin": 4720, + "end": 4762, + "name": "CALLVALUE" + }, + { + "begin": 4720, + "end": 4762, + "name": "ISZERO" + }, + { + "begin": 4720, + "end": 4762, + "name": "PUSH [tag]", + "value": "129" + }, + { + "begin": 4720, + "end": 4762, + "name": "JUMPI" + }, + { + "begin": 4720, + "end": 4762, + "name": "PUSH", + "value": "0" + }, + { + "begin": 4720, + "end": 4762, + "name": "DUP1" + }, + { + "begin": 4720, + "end": 4762, + "name": "REVERT" + }, + { + "begin": 4720, + "end": 4762, + "name": "tag", + "value": "129" + }, + { + "begin": 4720, + "end": 4762, + "name": "JUMPDEST" + }, + { + "begin": 4720, + "end": 4762, + "name": "PUSH [tag]", + "value": "54" + }, + { + "begin": 4720, + "end": 4762, + "name": "PUSH [tag]", + "value": "131" + }, + { + "begin": 4720, + "end": 4762, + "name": "JUMP" + }, + { + "begin": 1738, + "end": 1885, + "name": "tag", + "value": "32" + }, + { + "begin": 1738, + "end": 1885, + "name": "JUMPDEST" + }, + { + "begin": 1738, + "end": 1885, + "name": "CALLVALUE" + }, + { + "begin": 1738, + "end": 1885, + "name": "ISZERO" + }, + { + "begin": 1738, + "end": 1885, + "name": "PUSH [tag]", + "value": "132" + }, + { + "begin": 1738, + "end": 1885, + "name": "JUMPI" + }, + { + "begin": 1738, + "end": 1885, + "name": "PUSH", + "value": "0" + }, + { + "begin": 1738, + "end": 1885, + "name": "DUP1" + }, + { + "begin": 1738, + "end": 1885, + "name": "REVERT" + }, + { + "begin": 1738, + "end": 1885, + "name": "tag", + "value": "132" + }, + { + "begin": 1738, + "end": 1885, + "name": "JUMPDEST" + }, + { + "begin": 1738, + "end": 1885, + "name": "PUSH [tag]", + "value": "42" + }, + { + "begin": 1738, + "end": 1885, + "name": "PUSH", + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + }, + { + "begin": 1738, + "end": 1885, + "name": "PUSH", + "value": "4" + }, + { + "begin": 1738, + "end": 1885, + "name": "CALLDATALOAD" + }, + { + "begin": 1738, + "end": 1885, + "name": "AND" + }, + { + "begin": 1738, + "end": 1885, + "name": "PUSH [tag]", + "value": "134" + }, + { + "begin": 1738, + "end": 1885, + "name": "JUMP" + }, + { + "begin": 8816, + "end": 9134, + "name": "tag", + "value": "33" + }, + { + "begin": 8816, + "end": 9134, + "name": "JUMPDEST" + }, + { + "begin": 8816, + "end": 9134, + "name": "CALLVALUE" + }, + { + "begin": 8816, + "end": 9134, + "name": "ISZERO" + }, + { + "begin": 8816, + "end": 9134, + "name": "PUSH [tag]", + "value": "135" + }, + { + "begin": 8816, + "end": 9134, + "name": "JUMPI" + }, + { + "begin": 8816, + "end": 9134, + "name": "PUSH", + "value": "0" + }, + { + "begin": 8816, + "end": 9134, + "name": "DUP1" + }, + { + "begin": 8816, + "end": 9134, + "name": "REVERT" + }, + { + "begin": 8816, + "end": 9134, + "name": "tag", + "value": "135" + }, + { + "begin": 8816, + "end": 9134, + "name": "JUMPDEST" + }, + { + "begin": 8816, + "end": 9134, + "name": "PUSH [tag]", + "value": "42" + }, + { + "begin": 8816, + "end": 9134, + "name": "PUSH", + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + }, + { + "begin": 8816, + "end": 9134, + "name": "PUSH", + "value": "4" + }, + { + "begin": 8816, + "end": 9134, + "name": "CALLDATALOAD" + }, + { + "begin": 8816, + "end": 9134, + "name": "AND" + }, + { + "begin": 8816, + "end": 9134, + "name": "PUSH [tag]", + "value": "137" + }, + { + "begin": 8816, + "end": 9134, + "name": "JUMP" + }, + { + "begin": 9794, + "end": 9812, + "name": "tag", + "value": "36" + }, + { + "begin": 9794, + "end": 9812, + "name": "JUMPDEST" + }, + { + "begin": 9794, + "end": 9812, + "name": "PUSH", + "value": "7" + }, + { + "begin": 9794, + "end": 9812, + "name": "DUP1" + }, + { + "begin": 9794, + "end": 9812, + "name": "SLOAD" + }, + { + "begin": 9794, + "end": 9812, + "name": "PUSH", + "value": "1" + }, + { + "begin": 9794, + "end": 9812, + "name": "DUP2" + }, + { + "begin": 9794, + "end": 9812, + "name": "PUSH", + "value": "1" + }, + { + "begin": 9794, + "end": 9812, + "name": "AND" + }, + { + "begin": 9794, + "end": 9812, + "name": "ISZERO" + }, + { + "begin": 9794, + "end": 9812, + "name": "PUSH", + "value": "100" + }, + { + "begin": 9794, + "end": 9812, + "name": "MUL" + }, + { + "begin": 9794, + "end": 9812, + "name": "SUB" + }, + { + "begin": 9794, + "end": 9812, + "name": "AND" + }, + { + "begin": 9794, + "end": 9812, + "name": "PUSH", + "value": "2" + }, + { + "begin": 9794, + "end": 9812, + "name": "SWAP1" + }, + { + "begin": 9794, + "end": 9812, + "name": "DIV" + }, + { + "begin": 9794, + "end": 9812, + "name": "DUP1" + }, + { + "begin": 9794, + "end": 9812, + "name": "PUSH", + "value": "1F" + }, + { + "begin": 9794, + "end": 9812, + "name": "ADD" + }, + { + "begin": 9794, + "end": 9812, + "name": "PUSH", + "value": "20" + }, + { + "begin": 9794, + "end": 9812, + "name": "DUP1" + }, + { + "begin": 9794, + "end": 9812, + "name": "SWAP2" + }, + { + "begin": 9794, + "end": 9812, + "name": "DIV" + }, + { + "begin": 9794, + "end": 9812, + "name": "MUL" + }, + { + "begin": 9794, + "end": 9812, + "name": "PUSH", + "value": "20" + }, + { + "begin": 9794, + "end": 9812, + "name": "ADD" + }, + { + "begin": 9794, + "end": 9812, + "name": "PUSH", + "value": "40" + }, + { + "begin": 9794, + "end": 9812, + "name": "MLOAD" + }, + { + "begin": 9794, + "end": 9812, + "name": "SWAP1" + }, + { + "begin": 9794, + "end": 9812, + "name": "DUP2" + }, + { + "begin": 9794, + "end": 9812, + "name": "ADD" + }, + { + "begin": 9794, + "end": 9812, + "name": "PUSH", + "value": "40" + }, + { + "begin": 9794, + "end": 9812, + "name": "MSTORE" + }, + { + "begin": 9794, + "end": 9812, + "name": "DUP1" + }, + { + "begin": 9794, + "end": 9812, + "name": "SWAP3" + }, + { + "begin": 9794, + "end": 9812, + "name": "SWAP2" + }, + { + "begin": 9794, + "end": 9812, + "name": "SWAP1" + }, + { + "begin": 9794, + "end": 9812, + "name": "DUP2" + }, + { + "begin": 9794, + "end": 9812, + "name": "DUP2" + }, + { + "begin": 9794, + "end": 9812, + "name": "MSTORE" + }, + { + "begin": 9794, + "end": 9812, + "name": "PUSH", + "value": "20" + }, + { + "begin": 9794, + "end": 9812, + "name": "ADD" + }, + { + "begin": 9794, + "end": 9812, + "name": "DUP3" + }, + { + "begin": 9794, + "end": 9812, + "name": "DUP1" + }, + { + "begin": 9794, + "end": 9812, + "name": "SLOAD" + }, + { + "begin": 9794, + "end": 9812, + "name": "PUSH", + "value": "1" + }, + { + "begin": 9794, + "end": 9812, + "name": "DUP2" + }, + { + "begin": 9794, + "end": 9812, + "name": "PUSH", + "value": "1" + }, + { + "begin": 9794, + "end": 9812, + "name": "AND" + }, + { + "begin": 9794, + "end": 9812, + "name": "ISZERO" + }, + { + "begin": 9794, + "end": 9812, + "name": "PUSH", + "value": "100" + }, + { + "begin": 9794, + "end": 9812, + "name": "MUL" + }, + { + "begin": 9794, + "end": 9812, + "name": "SUB" + }, + { + "begin": 9794, + "end": 9812, + "name": "AND" + }, + { + "begin": 9794, + "end": 9812, + "name": "PUSH", + "value": "2" + }, + { + "begin": 9794, + "end": 9812, + "name": "SWAP1" + }, + { + "begin": 9794, + "end": 9812, + "name": "DIV" + }, + { + "begin": 9794, + "end": 9812, + "name": "DUP1" + }, + { + "begin": 9794, + "end": 9812, + "name": "ISZERO" + }, + { + "begin": 9794, + "end": 9812, + "name": "PUSH [tag]", + "value": "138" + }, + { + "begin": 9794, + "end": 9812, + "name": "JUMPI" + }, + { + "begin": 9794, + "end": 9812, + "name": "DUP1" + }, + { + "begin": 9794, + "end": 9812, + "name": "PUSH", + "value": "1F" + }, + { + "begin": 9794, + "end": 9812, + "name": "LT" + }, + { + "begin": 9794, + "end": 9812, + "name": "PUSH [tag]", + "value": "139" + }, + { + "begin": 9794, + "end": 9812, + "name": "JUMPI" + }, + { + "begin": 9794, + "end": 9812, + "name": "PUSH", + "value": "100" + }, + { + "begin": 9794, + "end": 9812, + "name": "DUP1" + }, + { + "begin": 9794, + "end": 9812, + "name": "DUP4" + }, + { + "begin": 9794, + "end": 9812, + "name": "SLOAD" + }, + { + "begin": 9794, + "end": 9812, + "name": "DIV" + }, + { + "begin": 9794, + "end": 9812, + "name": "MUL" + }, + { + "begin": 9794, + "end": 9812, + "name": "DUP4" + }, + { + "begin": 9794, + "end": 9812, + "name": "MSTORE" + }, + { + "begin": 9794, + "end": 9812, + "name": "SWAP2" + }, + { + "begin": 9794, + "end": 9812, + "name": "PUSH", + "value": "20" + }, + { + "begin": 9794, + "end": 9812, + "name": "ADD" + }, + { + "begin": 9794, + "end": 9812, + "name": "SWAP2" + }, + { + "begin": 9794, + "end": 9812, + "name": "PUSH [tag]", + "value": "138" + }, + { + "begin": 9794, + "end": 9812, + "name": "JUMP" + }, + { + "begin": 9794, + "end": 9812, + "name": "tag", + "value": "139" + }, + { + "begin": 9794, + "end": 9812, + "name": "JUMPDEST" + }, + { + "begin": 9794, + "end": 9812, + "name": "DUP3" + }, + { + "begin": 9794, + "end": 9812, + "name": "ADD" + }, + { + "begin": 9794, + "end": 9812, + "name": "SWAP2" + }, + { + "begin": 9794, + "end": 9812, + "name": "SWAP1" + }, + { + "begin": 9794, + "end": 9812, + "name": "PUSH", + "value": "0" + }, + { + "begin": 9794, + "end": 9812, + "name": "MSTORE" + }, + { + "begin": 9794, + "end": 9812, + "name": "PUSH", + "value": "20" + }, + { + "begin": 9794, + "end": 9812, + "name": "PUSH", + "value": "0" + }, + { + "begin": 9794, + "end": 9812, + "name": "KECCAK256" + }, + { + "begin": 9794, + "end": 9812, + "name": "SWAP1" + }, + { + "begin": 9794, + "end": 9812, + "name": "tag", + "value": "140" + }, + { + "begin": 9794, + "end": 9812, + "name": "JUMPDEST" + }, + { + "begin": 9794, + "end": 9812, + "name": "DUP2" + }, + { + "begin": 9794, + "end": 9812, + "name": "SLOAD" + }, + { + "begin": 9794, + "end": 9812, + "name": "DUP2" + }, + { + "begin": 9794, + "end": 9812, + "name": "MSTORE" + }, + { + "begin": 9794, + "end": 9812, + "name": "SWAP1" + }, + { + "begin": 9794, + "end": 9812, + "name": "PUSH", + "value": "1" + }, + { + "begin": 9794, + "end": 9812, + "name": "ADD" + }, + { + "begin": 9794, + "end": 9812, + "name": "SWAP1" + }, + { + "begin": 9794, + "end": 9812, + "name": "PUSH", + "value": "20" + }, + { + "begin": 9794, + "end": 9812, + "name": "ADD" + }, + { + "begin": 9794, + "end": 9812, + "name": "DUP1" + }, + { + "begin": 9794, + "end": 9812, + "name": "DUP4" + }, + { + "begin": 9794, + "end": 9812, + "name": "GT" + }, + { + "begin": 9794, + "end": 9812, + "name": "PUSH [tag]", + "value": "140" + }, + { + "begin": 9794, + "end": 9812, + "name": "JUMPI" + }, + { + "begin": 9794, + "end": 9812, + "name": "DUP3" + }, + { + "begin": 9794, + "end": 9812, + "name": "SWAP1" + }, + { + "begin": 9794, + "end": 9812, + "name": "SUB" + }, + { + "begin": 9794, + "end": 9812, + "name": "PUSH", + "value": "1F" + }, + { + "begin": 9794, + "end": 9812, + "name": "AND" + }, + { + "begin": 9794, + "end": 9812, + "name": "DUP3" + }, + { + "begin": 9794, + "end": 9812, + "name": "ADD" + }, + { + "begin": 9794, + "end": 9812, + "name": "SWAP2" + }, + { + "begin": 9794, + "end": 9812, + "name": "tag", + "value": "138" + }, + { + "begin": 9794, + "end": 9812, + "name": "JUMPDEST" + }, + { + "begin": 9794, + "end": 9812, + "name": "POP" + }, + { + "begin": 9794, + "end": 9812, + "name": "POP" + }, + { + "begin": 9794, + "end": 9812, + "name": "POP" + }, + { + "begin": 9794, + "end": 9812, + "name": "POP" + }, + { + "begin": 9794, + "end": 9812, + "name": "POP" + }, + { + "begin": 9794, + "end": 9812, + "name": "DUP2" + }, + { + "begin": 9794, + "end": 9812, + "name": "JUMP", + "value": "[out]" + }, + { + "begin": 12480, + "end": 12657, + "name": "tag", + "value": "43" + }, + { + "begin": 12480, + "end": 12657, + "name": "JUMPDEST" + }, + { + "begin": 1546, + "end": 1551, + "name": "PUSH", + "value": "0" + }, + { + "begin": 1546, + "end": 1551, + "name": "SLOAD" + }, + { + "begin": 1532, + "end": 1542, + "name": "CALLER" + }, + { + "begin": 1546, + "end": 1551, + "name": "PUSH", + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + }, + { + "begin": 1532, + "end": 1551, + "name": "SWAP1" + }, + { + "begin": 1532, + "end": 1551, + "name": "DUP2" + }, + { + "begin": 1532, + "end": 1551, + "name": "AND" + }, + { + "begin": 1546, + "end": 1551, + "name": "SWAP2" + }, + { + "begin": 1546, + "end": 1551, + "name": "AND" + }, + { + "begin": 1532, + "end": 1551, + "name": "EQ" + }, + { + "begin": 1524, + "end": 1552, + "name": "PUSH [tag]", + "value": "142" + }, + { + "begin": 1524, + "end": 1552, + "name": "JUMPI" + }, + { + "begin": 1524, + "end": 1552, + "name": "PUSH", + "value": "0" + }, + { + "begin": 1524, + "end": 1552, + "name": "DUP1" + }, + { + "begin": 1524, + "end": 1552, + "name": "REVERT" + }, + { + "begin": 1524, + "end": 1552, + "name": "tag", + "value": "142" + }, + { + "begin": 1524, + "end": 1552, + "name": "JUMPDEST" + }, + { + "begin": 12552, + "end": 12562, + "name": "PUSH", + "value": "A" + }, + { + "begin": 12552, + "end": 12569, + "name": "DUP1" + }, + { + "begin": 12552, + "end": 12569, + "name": "SLOAD" + }, + { + "begin": 12552, + "end": 12569, + "name": "PUSH", + "value": "10000000000000000000000000000000000000000" + }, + { + "begin": 12552, + "end": 12569, + "name": "PUSH", + "value": "FFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + }, + { + "begin": 12552, + "end": 12569, + "name": "SWAP1" + }, + { + "begin": 12552, + "end": 12569, + "name": "SWAP2" + }, + { + "begin": 12552, + "end": 12569, + "name": "AND" + }, + { + "begin": 12552, + "end": 12569, + "name": "OR" + }, + { + "begin": 12579, + "end": 12613, + "name": "PUSH", + "value": "FFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000" + }, + { + "begin": 12579, + "end": 12613, + "name": "AND" + }, + { + "begin": 12579, + "end": 12613, + "name": "PUSH", + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + }, + { + "begin": 12579, + "end": 12613, + "name": "DUP4" + }, + { + "begin": 12579, + "end": 12613, + "name": "AND" + }, + { + "begin": 12579, + "end": 12613, + "name": "OR" + }, + { + "begin": 12579, + "end": 12613, + "name": "SWAP1" + }, + { + "begin": 12579, + "end": 12613, + "name": "SSTORE" + }, + { + "begin": 12623, + "end": 12650, + "name": "PUSH", + "value": "CC358699805E9A8B7F77B522628C7CB9ABD07D9EFB86B6FB616AF1609036A99E" + }, + { + "begin": 12579, + "end": 12613, + "name": "DUP2" + }, + { + "begin": 12623, + "end": 12650, + "name": "PUSH", + "value": "40" + }, + { + "begin": 12623, + "end": 12650, + "name": "MLOAD" + }, + { + "begin": 12623, + "end": 12650, + "name": "PUSH", + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + }, + { + "begin": 12623, + "end": 12650, + "name": "SWAP1" + }, + { + "begin": 12623, + "end": 12650, + "name": "SWAP2" + }, + { + "begin": 12623, + "end": 12650, + "name": "AND" + }, + { + "begin": 12623, + "end": 12650, + "name": "DUP2" + }, + { + "begin": 12623, + "end": 12650, + "name": "MSTORE" + }, + { + "begin": 12623, + "end": 12650, + "name": "PUSH", + "value": "20" + }, + { + "begin": 12623, + "end": 12650, + "name": "ADD" + }, + { + "begin": 12623, + "end": 12650, + "name": "PUSH", + "value": "40" + }, + { + "begin": 12623, + "end": 12650, + "name": "MLOAD" + }, + { + "begin": 12623, + "end": 12650, + "name": "DUP1" + }, + { + "begin": 12623, + "end": 12650, + "name": "SWAP2" + }, + { + "begin": 12623, + "end": 12650, + "name": "SUB" + }, + { + "begin": 12623, + "end": 12650, + "name": "SWAP1" + }, + { + "begin": 12623, + "end": 12650, + "name": "LOG1" + }, + { + "begin": 12480, + "end": 12657, + "name": "POP" + }, + { + "begin": 12480, + "end": 12657, + "name": "JUMP", + "value": "[out]" + }, + { + "begin": 11752, + "end": 12048, + "name": "tag", + "value": "46" + }, + { + "begin": 11752, + "end": 12048, + "name": "JUMPDEST" + }, + { + "begin": 11823, + "end": 11829, + "name": "PUSH", + "value": "40" + }, + { + "begin": 3251, + "end": 3259, + "name": "PUSH", + "value": "44" + }, + { + "begin": 3233, + "end": 3241, + "name": "CALLDATASIZE" + }, + { + "begin": 3233, + "end": 3259, + "name": "LT" + }, + { + "begin": 3231, + "end": 3260, + "name": "ISZERO" + }, + { + "begin": 3223, + "end": 3261, + "name": "PUSH [tag]", + "value": "145" + }, + { + "begin": 3223, + "end": 3261, + "name": "JUMPI" + }, + { + "begin": 3223, + "end": 3261, + "name": "PUSH", + "value": "0" + }, + { + "begin": 3223, + "end": 3261, + "name": "DUP1" + }, + { + "begin": 3223, + "end": 3261, + "name": "REVERT" + }, + { + "begin": 3223, + "end": 3261, + "name": "tag", + "value": "145" + }, + { + "begin": 3223, + "end": 3261, + "name": "JUMPDEST" + }, + { + "begin": 11845, + "end": 11855, + "name": "PUSH", + "value": "A" + }, + { + "begin": 11845, + "end": 11855, + "name": "SLOAD" + }, + { + "begin": 11845, + "end": 11855, + "name": "PUSH", + "value": "10000000000000000000000000000000000000000" + }, + { + "begin": 11845, + "end": 11855, + "name": "SWAP1" + }, + { + "begin": 11845, + "end": 11855, + "name": "DIV" + }, + { + "begin": 11845, + "end": 11855, + "name": "PUSH", + "value": "FF" + }, + { + "begin": 11845, + "end": 11855, + "name": "AND" + }, + { + "begin": 11841, + "end": 12042, + "name": "ISZERO" + }, + { + "begin": 11841, + "end": 12042, + "name": "PUSH [tag]", + "value": "147" + }, + { + "begin": 11841, + "end": 12042, + "name": "JUMPI" + }, + { + "begin": 11900, + "end": 11915, + "name": "PUSH", + "value": "A" + }, + { + "begin": 11900, + "end": 11915, + "name": "SLOAD" + }, + { + "begin": 11900, + "end": 11915, + "name": "PUSH", + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + }, + { + "begin": 11900, + "end": 11915, + "name": "AND" + }, + { + "begin": 11878, + "end": 11932, + "name": "PUSH", + "value": "AEE92D33" + }, + { + "begin": 11933, + "end": 11943, + "name": "CALLER" + }, + { + "begin": 11945, + "end": 11953, + "name": "DUP6" + }, + { + "begin": 11955, + "end": 11961, + "name": "DUP6" + }, + { + "begin": 11878, + "end": 11962, + "name": "PUSH", + "value": "40" + }, + { + "begin": 11878, + "end": 11962, + "name": "MLOAD" + }, + { + "begin": 11878, + "end": 11962, + "name": "PUSH", + "value": "100000000000000000000000000000000000000000000000000000000" + }, + { + "begin": 11878, + "end": 11962, + "name": "PUSH", + "value": "FFFFFFFF" + }, + { + "begin": 11878, + "end": 11962, + "name": "DUP7" + }, + { + "begin": 11878, + "end": 11962, + "name": "AND" + }, + { + "begin": 11878, + "end": 11962, + "name": "MUL" + }, + { + "begin": 11878, + "end": 11962, + "name": "DUP2" + }, + { + "begin": 11878, + "end": 11962, + "name": "MSTORE" + }, + { + "begin": 11878, + "end": 11962, + "name": "PUSH", + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + }, + { + "begin": 11878, + "end": 11962, + "name": "SWAP4" + }, + { + "begin": 11878, + "end": 11962, + "name": "DUP5" + }, + { + "begin": 11878, + "end": 11962, + "name": "AND" + }, + { + "begin": 11878, + "end": 11962, + "name": "PUSH", + "value": "4" + }, + { + "begin": 11878, + "end": 11962, + "name": "DUP3" + }, + { + "begin": 11878, + "end": 11962, + "name": "ADD" + }, + { + "begin": 11878, + "end": 11962, + "name": "MSTORE" + }, + { + "begin": 11878, + "end": 11962, + "name": "SWAP2" + }, + { + "begin": 11878, + "end": 11962, + "name": "SWAP1" + }, + { + "begin": 11878, + "end": 11962, + "name": "SWAP3" + }, + { + "begin": 11878, + "end": 11962, + "name": "AND" + }, + { + "begin": 11878, + "end": 11962, + "name": "PUSH", + "value": "24" + }, + { + "begin": 11878, + "end": 11962, + "name": "DUP3" + }, + { + "begin": 11878, + "end": 11962, + "name": "ADD" + }, + { + "begin": 11878, + "end": 11962, + "name": "MSTORE" + }, + { + "begin": 11878, + "end": 11962, + "name": "PUSH", + "value": "44" + }, + { + "begin": 11878, + "end": 11962, + "name": "DUP2" + }, + { + "begin": 11878, + "end": 11962, + "name": "ADD" + }, + { + "begin": 11878, + "end": 11962, + "name": "SWAP2" + }, + { + "begin": 11878, + "end": 11962, + "name": "SWAP1" + }, + { + "begin": 11878, + "end": 11962, + "name": "SWAP2" + }, + { + "begin": 11878, + "end": 11962, + "name": "MSTORE" + }, + { + "begin": 11878, + "end": 11962, + "name": "PUSH", + "value": "64" + }, + { + "begin": 11878, + "end": 11962, + "name": "ADD" + }, + { + "begin": -1, + "end": -1, + "name": "PUSH", + "value": "0" + }, + { + "begin": 11878, + "end": 11962, + "name": "PUSH", + "value": "40" + }, + { + "begin": 11878, + "end": 11962, + "name": "MLOAD" + }, + { + "begin": 11878, + "end": 11962, + "name": "DUP1" + }, + { + "begin": 11878, + "end": 11962, + "name": "DUP4" + }, + { + "begin": 11878, + "end": 11962, + "name": "SUB" + }, + { + "begin": 11878, + "end": 11962, + "name": "DUP2" + }, + { + "begin": 11878, + "end": 11962, + "name": "PUSH", + "value": "0" + }, + { + "begin": 11878, + "end": 11962, + "name": "DUP8" + }, + { + "begin": 11878, + "end": 11962, + "name": "DUP1" + }, + { + "begin": 11878, + "end": 11962, + "name": "EXTCODESIZE" + }, + { + "begin": 11878, + "end": 11962, + "name": "ISZERO" + }, + { + "begin": 11878, + "end": 11962, + "name": "ISZERO" + }, + { + "begin": 11878, + "end": 11962, + "name": "PUSH [tag]", + "value": "148" + }, + { + "begin": 11878, + "end": 11962, + "name": "JUMPI" + }, + { + "begin": 11878, + "end": 11962, + "name": "PUSH", + "value": "0" + }, + { + "begin": 11878, + "end": 11962, + "name": "DUP1" + }, + { + "begin": 11878, + "end": 11962, + "name": "REVERT" + }, + { + "begin": 11878, + "end": 11962, + "name": "tag", + "value": "148" + }, + { + "begin": 11878, + "end": 11962, + "name": "JUMPDEST" + }, + { + "begin": 11878, + "end": 11962, + "name": "PUSH", + "value": "2C6" + }, + { + "begin": 11878, + "end": 11962, + "name": "GAS" + }, + { + "begin": 11878, + "end": 11962, + "name": "SUB" + }, + { + "begin": 11878, + "end": 11962, + "name": "CALL" + }, + { + "begin": 11878, + "end": 11962, + "name": "ISZERO" + }, + { + "begin": 11878, + "end": 11962, + "name": "ISZERO" + }, + { + "begin": 11878, + "end": 11962, + "name": "PUSH [tag]", + "value": "149" + }, + { + "begin": 11878, + "end": 11962, + "name": "JUMPI" + }, + { + "begin": 11878, + "end": 11962, + "name": "PUSH", + "value": "0" + }, + { + "begin": 11878, + "end": 11962, + "name": "DUP1" + }, + { + "begin": 11878, + "end": 11962, + "name": "REVERT" + }, + { + "begin": 11878, + "end": 11962, + "name": "tag", + "value": "149" + }, + { + "begin": 11878, + "end": 11962, + "name": "JUMPDEST" + }, + { + "begin": 11878, + "end": 11962, + "name": "POP" + }, + { + "begin": 11878, + "end": 11962, + "name": "POP" + }, + { + "begin": 11878, + "end": 11962, + "name": "POP" + }, + { + "begin": 11871, + "end": 11962, + "name": "PUSH [tag]", + "value": "151" + }, + { + "begin": 11871, + "end": 11962, + "name": "JUMP" + }, + { + "begin": 11841, + "end": 12042, + "name": "tag", + "value": "147" + }, + { + "begin": 11841, + "end": 12042, + "name": "JUMPDEST" + }, + { + "begin": 12000, + "end": 12031, + "name": "PUSH [tag]", + "value": "151" + }, + { + "begin": 12014, + "end": 12022, + "name": "DUP4" + }, + { + "begin": 12024, + "end": 12030, + "name": "DUP4" + }, + { + "begin": 12000, + "end": 12013, + "name": "PUSH [tag]", + "value": "152" + }, + { + "begin": 12000, + "end": 12031, + "name": "JUMP", + "value": "[in]" + }, + { + "begin": 12000, + "end": 12031, + "name": "tag", + "value": "151" + }, + { + "begin": 12000, + "end": 12031, + "name": "JUMPDEST" + }, + { + "begin": 11752, + "end": 12048, + "name": "POP" + }, + { + "begin": 11752, + "end": 12048, + "name": "POP" + }, + { + "begin": 11752, + "end": 12048, + "name": "POP" + }, + { + "begin": 11752, + "end": 12048, + "name": "JUMP", + "value": "[out]" + }, + { + "begin": 9906, + "end": 9928, + "name": "tag", + "value": "49" + }, + { + "begin": 9906, + "end": 9928, + "name": "JUMPDEST" + }, + { + "begin": 9906, + "end": 9928, + "name": "PUSH", + "value": "A" + }, + { + "begin": 9906, + "end": 9928, + "name": "SLOAD" + }, + { + "begin": 9906, + "end": 9928, + "name": "PUSH", + "value": "10000000000000000000000000000000000000000" + }, + { + "begin": 9906, + "end": 9928, + "name": "SWAP1" + }, + { + "begin": 9906, + "end": 9928, + "name": "DIV" + }, + { + "begin": 9906, + "end": 9928, + "name": "PUSH", + "value": "FF" + }, + { + "begin": 9906, + "end": 9928, + "name": "AND" + }, + { + "begin": 9906, + "end": 9928, + "name": "DUP2" + }, + { + "begin": 9906, + "end": 9928, + "name": "JUMP", + "value": "[out]" + }, + { + "begin": 8505, + "end": 8647, + "name": "tag", + "value": "52" + }, + { + "begin": 8505, + "end": 8647, + "name": "JUMPDEST" + }, + { + "begin": 1546, + "end": 1551, + "name": "PUSH", + "value": "0" + }, + { + "begin": 1546, + "end": 1551, + "name": "SLOAD" + }, + { + "begin": 1532, + "end": 1542, + "name": "CALLER" + }, + { + "begin": 1546, + "end": 1551, + "name": "PUSH", + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + }, + { + "begin": 1532, + "end": 1551, + "name": "SWAP1" + }, + { + "begin": 1532, + "end": 1551, + "name": "DUP2" + }, + { + "begin": 1532, + "end": 1551, + "name": "AND" + }, + { + "begin": 1546, + "end": 1551, + "name": "SWAP2" + }, + { + "begin": 1546, + "end": 1551, + "name": "AND" + }, + { + "begin": 1532, + "end": 1551, + "name": "EQ" + }, + { + "begin": 1524, + "end": 1552, + "name": "PUSH [tag]", + "value": "154" + }, + { + "begin": 1524, + "end": 1552, + "name": "JUMPI" + }, + { + "begin": 1524, + "end": 1552, + "name": "PUSH", + "value": "0" + }, + { + "begin": 1524, + "end": 1552, + "name": "DUP1" + }, + { + "begin": 1524, + "end": 1552, + "name": "REVERT" + }, + { + "begin": 1524, + "end": 1552, + "name": "tag", + "value": "154" + }, + { + "begin": 1524, + "end": 1552, + "name": "JUMPDEST" + }, + { + "begin": 8574, + "end": 8598, + "name": "PUSH", + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + }, + { + "begin": 8574, + "end": 8598, + "name": "DUP2" + }, + { + "begin": 8574, + "end": 8598, + "name": "AND" + }, + { + "begin": 8574, + "end": 8598, + "name": "PUSH", + "value": "0" + }, + { + "begin": 8574, + "end": 8598, + "name": "SWAP1" + }, + { + "begin": 8574, + "end": 8598, + "name": "DUP2" + }, + { + "begin": 8574, + "end": 8598, + "name": "MSTORE" + }, + { + "begin": 8574, + "end": 8587, + "name": "PUSH", + "value": "6" + }, + { + "begin": 8574, + "end": 8598, + "name": "PUSH", + "value": "20" + }, + { + "begin": 8574, + "end": 8598, + "name": "MSTORE" + }, + { + "begin": 8574, + "end": 8598, + "name": "PUSH", + "value": "40" + }, + { + "begin": 8574, + "end": 8598, + "name": "SWAP1" + }, + { + "begin": 8574, + "end": 8598, + "name": "DUP2" + }, + { + "begin": 8574, + "end": 8598, + "name": "SWAP1" + }, + { + "begin": 8574, + "end": 8598, + "name": "KECCAK256" + }, + { + "begin": 8574, + "end": 8605, + "name": "DUP1" + }, + { + "begin": 8574, + "end": 8605, + "name": "SLOAD" + }, + { + "begin": 8574, + "end": 8605, + "name": "PUSH", + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00" + }, + { + "begin": 8574, + "end": 8605, + "name": "AND" + }, + { + "begin": 8601, + "end": 8605, + "name": "PUSH", + "value": "1" + }, + { + "begin": 8574, + "end": 8605, + "name": "OR" + }, + { + "begin": 8574, + "end": 8605, + "name": "SWAP1" + }, + { + "begin": 8574, + "end": 8605, + "name": "SSTORE" + }, + { + "begin": 8615, + "end": 8640, + "name": "PUSH", + "value": "42E160154868087D6BFDC0CA23D96A1C1CFA32F1B72BA9BA27B69B98A0D819DC" + }, + { + "begin": 8615, + "end": 8640, + "name": "SWAP1" + }, + { + "begin": 8588, + "end": 8597, + "name": "DUP3" + }, + { + "begin": 8588, + "end": 8597, + "name": "SWAP1" + }, + { + "begin": 8615, + "end": 8640, + "name": "MLOAD" + }, + { + "begin": 8615, + "end": 8640, + "name": "PUSH", + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + }, + { + "begin": 8615, + "end": 8640, + "name": "SWAP1" + }, + { + "begin": 8615, + "end": 8640, + "name": "SWAP2" + }, + { + "begin": 8615, + "end": 8640, + "name": "AND" + }, + { + "begin": 8615, + "end": 8640, + "name": "DUP2" + }, + { + "begin": 8615, + "end": 8640, + "name": "MSTORE" + }, + { + "begin": 8615, + "end": 8640, + "name": "PUSH", + "value": "20" + }, + { + "begin": 8615, + "end": 8640, + "name": "ADD" + }, + { + "begin": 8615, + "end": 8640, + "name": "PUSH", + "value": "40" + }, + { + "begin": 8615, + "end": 8640, + "name": "MLOAD" + }, + { + "begin": 8615, + "end": 8640, + "name": "DUP1" + }, + { + "begin": 8615, + "end": 8640, + "name": "SWAP2" + }, + { + "begin": 8615, + "end": 8640, + "name": "SUB" + }, + { + "begin": 8615, + "end": 8640, + "name": "SWAP1" + }, + { + "begin": 8615, + "end": 8640, + "name": "LOG1" + }, + { + "begin": 8505, + "end": 8647, + "name": "POP" + }, + { + "begin": 8505, + "end": 8647, + "name": "JUMP", + "value": "[out]" + }, + { + "begin": 12720, + "end": 12932, + "name": "tag", + "value": "55" + }, + { + "begin": 12720, + "end": 12932, + "name": "JUMPDEST" + }, + { + "begin": 12788, + "end": 12798, + "name": "PUSH", + "value": "A" + }, + { + "begin": 12788, + "end": 12798, + "name": "SLOAD" + }, + { + "begin": 12768, + "end": 12772, + "name": "PUSH", + "value": "0" + }, + { + "begin": 12768, + "end": 12772, + "name": "SWAP1" + }, + { + "begin": 12788, + "end": 12798, + "name": "PUSH", + "value": "10000000000000000000000000000000000000000" + }, + { + "begin": 12788, + "end": 12798, + "name": "SWAP1" + }, + { + "begin": 12788, + "end": 12798, + "name": "DIV" + }, + { + "begin": 12788, + "end": 12798, + "name": "PUSH", + "value": "FF" + }, + { + "begin": 12788, + "end": 12798, + "name": "AND" + }, + { + "begin": 12784, + "end": 12926, + "name": "ISZERO" + }, + { + "begin": 12784, + "end": 12926, + "name": "PUSH [tag]", + "value": "157" + }, + { + "begin": 12784, + "end": 12926, + "name": "JUMPI" + }, + { + "begin": 12835, + "end": 12850, + "name": "PUSH", + "value": "A" + }, + { + "begin": 12835, + "end": 12850, + "name": "SLOAD" + }, + { + "begin": 12835, + "end": 12850, + "name": "PUSH", + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + }, + { + "begin": 12835, + "end": 12850, + "name": "AND" + }, + { + "begin": 12821, + "end": 12863, + "name": "PUSH", + "value": "18160DDD" + }, + { + "begin": 12835, + "end": 12850, + "name": "PUSH", + "value": "0" + }, + { + "begin": 12821, + "end": 12865, + "name": "PUSH", + "value": "40" + }, + { + "begin": 12821, + "end": 12865, + "name": "MLOAD" + }, + { + "begin": 12821, + "end": 12865, + "name": "PUSH", + "value": "20" + }, + { + "begin": 12821, + "end": 12865, + "name": "ADD" + }, + { + "begin": 12821, + "end": 12865, + "name": "MSTORE" + }, + { + "begin": 12821, + "end": 12865, + "name": "PUSH", + "value": "40" + }, + { + "begin": 12821, + "end": 12865, + "name": "MLOAD" + }, + { + "begin": 12821, + "end": 12865, + "name": "DUP2" + }, + { + "begin": 12821, + "end": 12865, + "name": "PUSH", + "value": "FFFFFFFF" + }, + { + "begin": 12821, + "end": 12865, + "name": "AND" + }, + { + "begin": 12821, + "end": 12865, + "name": "PUSH", + "value": "100000000000000000000000000000000000000000000000000000000" + }, + { + "begin": 12821, + "end": 12865, + "name": "MUL" + }, + { + "begin": 12821, + "end": 12865, + "name": "DUP2" + }, + { + "begin": 12821, + "end": 12865, + "name": "MSTORE" + }, + { + "begin": 12821, + "end": 12865, + "name": "PUSH", + "value": "4" + }, + { + "begin": 12821, + "end": 12865, + "name": "ADD" + }, + { + "begin": 12821, + "end": 12865, + "name": "PUSH", + "value": "20" + }, + { + "begin": 12821, + "end": 12865, + "name": "PUSH", + "value": "40" + }, + { + "begin": 12821, + "end": 12865, + "name": "MLOAD" + }, + { + "begin": 12821, + "end": 12865, + "name": "DUP1" + }, + { + "begin": 12821, + "end": 12865, + "name": "DUP4" + }, + { + "begin": 12821, + "end": 12865, + "name": "SUB" + }, + { + "begin": 12821, + "end": 12865, + "name": "DUP2" + }, + { + "begin": 12821, + "end": 12865, + "name": "PUSH", + "value": "0" + }, + { + "begin": 12821, + "end": 12865, + "name": "DUP8" + }, + { + "begin": 12821, + "end": 12865, + "name": "DUP1" + }, + { + "begin": 12821, + "end": 12865, + "name": "EXTCODESIZE" + }, + { + "begin": 12821, + "end": 12865, + "name": "ISZERO" + }, + { + "begin": 12821, + "end": 12865, + "name": "ISZERO" + }, + { + "begin": 12821, + "end": 12865, + "name": "PUSH [tag]", + "value": "158" + }, + { + "begin": 12821, + "end": 12865, + "name": "JUMPI" + }, + { + "begin": 12821, + "end": 12865, + "name": "PUSH", + "value": "0" + }, + { + "begin": 12821, + "end": 12865, + "name": "DUP1" + }, + { + "begin": 12821, + "end": 12865, + "name": "REVERT" + }, + { + "begin": 12821, + "end": 12865, + "name": "tag", + "value": "158" + }, + { + "begin": 12821, + "end": 12865, + "name": "JUMPDEST" + }, + { + "begin": 12821, + "end": 12865, + "name": "PUSH", + "value": "2C6" + }, + { + "begin": 12821, + "end": 12865, + "name": "GAS" + }, + { + "begin": 12821, + "end": 12865, + "name": "SUB" + }, + { + "begin": 12821, + "end": 12865, + "name": "CALL" + }, + { + "begin": 12821, + "end": 12865, + "name": "ISZERO" + }, + { + "begin": 12821, + "end": 12865, + "name": "ISZERO" + }, + { + "begin": 12821, + "end": 12865, + "name": "PUSH [tag]", + "value": "159" + }, + { + "begin": 12821, + "end": 12865, + "name": "JUMPI" + }, + { + "begin": 12821, + "end": 12865, + "name": "PUSH", + "value": "0" + }, + { + "begin": 12821, + "end": 12865, + "name": "DUP1" + }, + { + "begin": 12821, + "end": 12865, + "name": "REVERT" + }, + { + "begin": 12821, + "end": 12865, + "name": "tag", + "value": "159" + }, + { + "begin": 12821, + "end": 12865, + "name": "JUMPDEST" + }, + { + "begin": 12821, + "end": 12865, + "name": "POP" + }, + { + "begin": 12821, + "end": 12865, + "name": "POP" + }, + { + "begin": 12821, + "end": 12865, + "name": "POP" + }, + { + "begin": 12821, + "end": 12865, + "name": "PUSH", + "value": "40" + }, + { + "begin": 12821, + "end": 12865, + "name": "MLOAD" + }, + { + "begin": 12821, + "end": 12865, + "name": "DUP1" + }, + { + "begin": 12821, + "end": 12865, + "name": "MLOAD" + }, + { + "begin": 12821, + "end": 12865, + "name": "SWAP1" + }, + { + "begin": 12821, + "end": 12865, + "name": "POP" + }, + { + "begin": 12814, + "end": 12865, + "name": "SWAP1" + }, + { + "begin": 12814, + "end": 12865, + "name": "POP" + }, + { + "begin": 12814, + "end": 12865, + "name": "PUSH [tag]", + "value": "160" + }, + { + "begin": 12814, + "end": 12865, + "name": "JUMP" + }, + { + "begin": 12784, + "end": 12926, + "name": "tag", + "value": "157" + }, + { + "begin": 12784, + "end": 12926, + "name": "JUMPDEST" + }, + { + "begin": -1, + "end": -1, + "name": "POP" + }, + { + "begin": 12903, + "end": 12915, + "name": "PUSH", + "value": "1" + }, + { + "begin": 12903, + "end": 12915, + "name": "SLOAD" + }, + { + "begin": 12784, + "end": 12926, + "name": "tag", + "value": "160" + }, + { + "begin": 12784, + "end": 12926, + "name": "JUMPDEST" + }, + { + "begin": 12720, + "end": 12932, + "name": "SWAP1" + }, + { + "begin": 12720, + "end": 12932, + "name": "JUMP", + "value": "[out]" + }, + { + "begin": 10995, + "end": 11350, + "name": "tag", + "value": "58" + }, + { + "begin": 10995, + "end": 11350, + "name": "JUMPDEST" + }, + { + "begin": 7553, + "end": 7559, + "name": "PUSH", + "value": "0" + }, + { + "begin": 7553, + "end": 7559, + "name": "SLOAD" + }, + { + "begin": 7553, + "end": 7559, + "name": "PUSH", + "value": "10000000000000000000000000000000000000000" + }, + { + "begin": 7553, + "end": 7559, + "name": "SWAP1" + }, + { + "begin": 7553, + "end": 7559, + "name": "DIV" + }, + { + "begin": 7553, + "end": 7559, + "name": "PUSH", + "value": "FF" + }, + { + "begin": 7553, + "end": 7559, + "name": "AND" + }, + { + "begin": 7552, + "end": 7559, + "name": "ISZERO" + }, + { + "begin": 7544, + "end": 7560, + "name": "PUSH [tag]", + "value": "162" + }, + { + "begin": 7544, + "end": 7560, + "name": "JUMPI" + }, + { + "begin": 7544, + "end": 7560, + "name": "PUSH", + "value": "0" + }, + { + "begin": 7544, + "end": 7560, + "name": "DUP1" + }, + { + "begin": 7544, + "end": 7560, + "name": "REVERT" + }, + { + "begin": 7544, + "end": 7560, + "name": "tag", + "value": "162" + }, + { + "begin": 7544, + "end": 7560, + "name": "JUMPDEST" + }, + { + "begin": 11098, + "end": 11118, + "name": "PUSH", + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + }, + { + "begin": 11098, + "end": 11118, + "name": "DUP4" + }, + { + "begin": 11098, + "end": 11118, + "name": "AND" + }, + { + "begin": 11098, + "end": 11118, + "name": "PUSH", + "value": "0" + }, + { + "begin": 11098, + "end": 11118, + "name": "SWAP1" + }, + { + "begin": 11098, + "end": 11118, + "name": "DUP2" + }, + { + "begin": 11098, + "end": 11118, + "name": "MSTORE" + }, + { + "begin": 11098, + "end": 11111, + "name": "PUSH", + "value": "6" + }, + { + "begin": 11098, + "end": 11118, + "name": "PUSH", + "value": "20" + }, + { + "begin": 11098, + "end": 11118, + "name": "MSTORE" + }, + { + "begin": 11098, + "end": 11118, + "name": "PUSH", + "value": "40" + }, + { + "begin": 11098, + "end": 11118, + "name": "SWAP1" + }, + { + "begin": 11098, + "end": 11118, + "name": "KECCAK256" + }, + { + "begin": 11098, + "end": 11118, + "name": "SLOAD" + }, + { + "begin": 11098, + "end": 11118, + "name": "PUSH", + "value": "FF" + }, + { + "begin": 11098, + "end": 11118, + "name": "AND" + }, + { + "begin": 11097, + "end": 11118, + "name": "ISZERO" + }, + { + "begin": 11089, + "end": 11119, + "name": "PUSH [tag]", + "value": "164" + }, + { + "begin": 11089, + "end": 11119, + "name": "JUMPI" + }, + { + "begin": 11089, + "end": 11119, + "name": "PUSH", + "value": "0" + }, + { + "begin": 11089, + "end": 11119, + "name": "DUP1" + }, + { + "begin": 11089, + "end": 11119, + "name": "REVERT" + }, + { + "begin": 11089, + "end": 11119, + "name": "tag", + "value": "164" + }, + { + "begin": 11089, + "end": 11119, + "name": "JUMPDEST" + }, + { + "begin": 11133, + "end": 11143, + "name": "PUSH", + "value": "A" + }, + { + "begin": 11133, + "end": 11143, + "name": "SLOAD" + }, + { + "begin": 11133, + "end": 11143, + "name": "PUSH", + "value": "10000000000000000000000000000000000000000" + }, + { + "begin": 11133, + "end": 11143, + "name": "SWAP1" + }, + { + "begin": 11133, + "end": 11143, + "name": "DIV" + }, + { + "begin": 11133, + "end": 11143, + "name": "PUSH", + "value": "FF" + }, + { + "begin": 11133, + "end": 11143, + "name": "AND" + }, + { + "begin": 11129, + "end": 11344, + "name": "ISZERO" + }, + { + "begin": 11129, + "end": 11344, + "name": "PUSH [tag]", + "value": "165" + }, + { + "begin": 11129, + "end": 11344, + "name": "JUMPI" + }, + { + "begin": 11188, + "end": 11203, + "name": "PUSH", + "value": "A" + }, + { + "begin": 11188, + "end": 11203, + "name": "SLOAD" + }, + { + "begin": 11188, + "end": 11203, + "name": "PUSH", + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + }, + { + "begin": 11188, + "end": 11203, + "name": "AND" + }, + { + "begin": 11166, + "end": 11225, + "name": "PUSH", + "value": "8B477ADB" + }, + { + "begin": 11226, + "end": 11236, + "name": "CALLER" + }, + { + "begin": 11238, + "end": 11243, + "name": "DUP6" + }, + { + "begin": 11245, + "end": 11248, + "name": "DUP6" + }, + { + "begin": 11250, + "end": 11256, + "name": "DUP6" + }, + { + "begin": 11166, + "end": 11257, + "name": "PUSH", + "value": "40" + }, + { + "begin": 11166, + "end": 11257, + "name": "MLOAD" + }, + { + "begin": 11166, + "end": 11257, + "name": "PUSH", + "value": "100000000000000000000000000000000000000000000000000000000" + }, + { + "begin": 11166, + "end": 11257, + "name": "PUSH", + "value": "FFFFFFFF" + }, + { + "begin": 11166, + "end": 11257, + "name": "DUP8" + }, + { + "begin": 11166, + "end": 11257, + "name": "AND" + }, + { + "begin": 11166, + "end": 11257, + "name": "MUL" + }, + { + "begin": 11166, + "end": 11257, + "name": "DUP2" + }, + { + "begin": 11166, + "end": 11257, + "name": "MSTORE" + }, + { + "begin": 11166, + "end": 11257, + "name": "PUSH", + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + }, + { + "begin": 11166, + "end": 11257, + "name": "SWAP5" + }, + { + "begin": 11166, + "end": 11257, + "name": "DUP6" + }, + { + "begin": 11166, + "end": 11257, + "name": "AND" + }, + { + "begin": 11166, + "end": 11257, + "name": "PUSH", + "value": "4" + }, + { + "begin": 11166, + "end": 11257, + "name": "DUP3" + }, + { + "begin": 11166, + "end": 11257, + "name": "ADD" + }, + { + "begin": 11166, + "end": 11257, + "name": "MSTORE" + }, + { + "begin": 11166, + "end": 11257, + "name": "SWAP3" + }, + { + "begin": 11166, + "end": 11257, + "name": "DUP5" + }, + { + "begin": 11166, + "end": 11257, + "name": "AND" + }, + { + "begin": 11166, + "end": 11257, + "name": "PUSH", + "value": "24" + }, + { + "begin": 11166, + "end": 11257, + "name": "DUP5" + }, + { + "begin": 11166, + "end": 11257, + "name": "ADD" + }, + { + "begin": 11166, + "end": 11257, + "name": "MSTORE" + }, + { + "begin": 11166, + "end": 11257, + "name": "SWAP3" + }, + { + "begin": 11166, + "end": 11257, + "name": "AND" + }, + { + "begin": 11166, + "end": 11257, + "name": "PUSH", + "value": "44" + }, + { + "begin": 11166, + "end": 11257, + "name": "DUP3" + }, + { + "begin": 11166, + "end": 11257, + "name": "ADD" + }, + { + "begin": 11166, + "end": 11257, + "name": "MSTORE" + }, + { + "begin": 11166, + "end": 11257, + "name": "PUSH", + "value": "64" + }, + { + "begin": 11166, + "end": 11257, + "name": "DUP2" + }, + { + "begin": 11166, + "end": 11257, + "name": "ADD" + }, + { + "begin": 11166, + "end": 11257, + "name": "SWAP2" + }, + { + "begin": 11166, + "end": 11257, + "name": "SWAP1" + }, + { + "begin": 11166, + "end": 11257, + "name": "SWAP2" + }, + { + "begin": 11166, + "end": 11257, + "name": "MSTORE" + }, + { + "begin": 11166, + "end": 11257, + "name": "PUSH", + "value": "84" + }, + { + "begin": 11166, + "end": 11257, + "name": "ADD" + }, + { + "begin": -1, + "end": -1, + "name": "PUSH", + "value": "0" + }, + { + "begin": 11166, + "end": 11257, + "name": "PUSH", + "value": "40" + }, + { + "begin": 11166, + "end": 11257, + "name": "MLOAD" + }, + { + "begin": 11166, + "end": 11257, + "name": "DUP1" + }, + { + "begin": 11166, + "end": 11257, + "name": "DUP4" + }, + { + "begin": 11166, + "end": 11257, + "name": "SUB" + }, + { + "begin": 11166, + "end": 11257, + "name": "DUP2" + }, + { + "begin": 11166, + "end": 11257, + "name": "PUSH", + "value": "0" + }, + { + "begin": 11166, + "end": 11257, + "name": "DUP8" + }, + { + "begin": 11166, + "end": 11257, + "name": "DUP1" + }, + { + "begin": 11166, + "end": 11257, + "name": "EXTCODESIZE" + }, + { + "begin": 11166, + "end": 11257, + "name": "ISZERO" + }, + { + "begin": 11166, + "end": 11257, + "name": "ISZERO" + }, + { + "begin": 11166, + "end": 11257, + "name": "PUSH [tag]", + "value": "148" + }, + { + "begin": 11166, + "end": 11257, + "name": "JUMPI" + }, + { + "begin": 11166, + "end": 11257, + "name": "PUSH", + "value": "0" + }, + { + "begin": 11166, + "end": 11257, + "name": "DUP1" + }, + { + "begin": 11166, + "end": 11257, + "name": "REVERT" + }, + { + "begin": 11129, + "end": 11344, + "name": "tag", + "value": "165" + }, + { + "begin": 11129, + "end": 11344, + "name": "JUMPDEST" + }, + { + "begin": 11295, + "end": 11333, + "name": "PUSH [tag]", + "value": "151" + }, + { + "begin": 11314, + "end": 11319, + "name": "DUP4" + }, + { + "begin": 11321, + "end": 11324, + "name": "DUP4" + }, + { + "begin": 11326, + "end": 11332, + "name": "DUP4" + }, + { + "begin": 11295, + "end": 11313, + "name": "PUSH [tag]", + "value": "170" + }, + { + "begin": 11295, + "end": 11333, + "name": "JUMP", + "value": "[in]" + }, + { + "begin": 9870, + "end": 9900, + "name": "tag", + "value": "61" + }, + { + "begin": 9870, + "end": 9900, + "name": "JUMPDEST" + }, + { + "begin": 9870, + "end": 9900, + "name": "PUSH", + "value": "A" + }, + { + "begin": 9870, + "end": 9900, + "name": "SLOAD" + }, + { + "begin": 9870, + "end": 9900, + "name": "PUSH", + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + }, + { + "begin": 9870, + "end": 9900, + "name": "AND" + }, + { + "begin": 9870, + "end": 9900, + "name": "DUP2" + }, + { + "begin": 9870, + "end": 9900, + "name": "JUMP", + "value": "[out]" + }, + { + "begin": 2916, + "end": 2956, + "name": "tag", + "value": "64" + }, + { + "begin": 2916, + "end": 2956, + "name": "JUMPDEST" + }, + { + "begin": 2916, + "end": 2956, + "name": "PUSH", + "value": "2" + }, + { + "begin": 2916, + "end": 2956, + "name": "PUSH", + "value": "20" + }, + { + "begin": 2916, + "end": 2956, + "name": "MSTORE" + }, + { + "begin": 2916, + "end": 2956, + "name": "PUSH", + "value": "0" + }, + { + "begin": 2916, + "end": 2956, + "name": "SWAP1" + }, + { + "begin": 2916, + "end": 2956, + "name": "DUP2" + }, + { + "begin": 2916, + "end": 2956, + "name": "MSTORE" + }, + { + "begin": 2916, + "end": 2956, + "name": "PUSH", + "value": "40" + }, + { + "begin": 2916, + "end": 2956, + "name": "SWAP1" + }, + { + "begin": 2916, + "end": 2956, + "name": "KECCAK256" + }, + { + "begin": 2916, + "end": 2956, + "name": "SLOAD" + }, + { + "begin": 2916, + "end": 2956, + "name": "DUP2" + }, + { + "begin": 2916, + "end": 2956, + "name": "JUMP", + "value": "[out]" + }, + { + "begin": 9844, + "end": 9864, + "name": "tag", + "value": "67" + }, + { + "begin": 9844, + "end": 9864, + "name": "JUMPDEST" + }, + { + "begin": 9844, + "end": 9864, + "name": "PUSH", + "value": "9" + }, + { + "begin": 9844, + "end": 9864, + "name": "SLOAD" + }, + { + "begin": 9844, + "end": 9864, + "name": "DUP2" + }, + { + "begin": 9844, + "end": 9864, + "name": "JUMP", + "value": "[out]" + }, + { + "begin": 3078, + "end": 3104, + "name": "tag", + "value": "70" + }, + { + "begin": 3078, + "end": 3104, + "name": "JUMPDEST" + }, + { + "begin": 3078, + "end": 3104, + "name": "PUSH", + "value": "4" + }, + { + "begin": 3078, + "end": 3104, + "name": "SLOAD" + }, + { + "begin": 3078, + "end": 3104, + "name": "DUP2" + }, + { + "begin": 3078, + "end": 3104, + "name": "JUMP", + "value": "[out]" + }, + { + "begin": 2043, + "end": 2067, + "name": "tag", + "value": "73" + }, + { + "begin": 2043, + "end": 2067, + "name": "JUMPDEST" + }, + { + "begin": 2043, + "end": 2067, + "name": "PUSH", + "value": "1" + }, + { + "begin": 2043, + "end": 2067, + "name": "SLOAD" + }, + { + "begin": 2043, + "end": 2067, + "name": "DUP2" + }, + { + "begin": 2043, + "end": 2067, + "name": "JUMP", + "value": "[out]" + }, + { + "begin": 7970, + "end": 8057, + "name": "tag", + "value": "76" + }, + { + "begin": 7970, + "end": 8057, + "name": "JUMPDEST" + }, + { + "begin": 1546, + "end": 1551, + "name": "PUSH", + "value": "0" + }, + { + "begin": 1546, + "end": 1551, + "name": "SLOAD" + }, + { + "begin": 1532, + "end": 1542, + "name": "CALLER" + }, + { + "begin": 1546, + "end": 1551, + "name": "PUSH", + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + }, + { + "begin": 1532, + "end": 1551, + "name": "SWAP1" + }, + { + "begin": 1532, + "end": 1551, + "name": "DUP2" + }, + { + "begin": 1532, + "end": 1551, + "name": "AND" + }, + { + "begin": 1546, + "end": 1551, + "name": "SWAP2" + }, + { + "begin": 1546, + "end": 1551, + "name": "AND" + }, + { + "begin": 1532, + "end": 1551, + "name": "EQ" + }, + { + "begin": 1524, + "end": 1552, + "name": "PUSH [tag]", + "value": "172" + }, + { + "begin": 1524, + "end": 1552, + "name": "JUMPI" + }, + { + "begin": 1524, + "end": 1552, + "name": "PUSH", + "value": "0" + }, + { + "begin": 1524, + "end": 1552, + "name": "DUP1" + }, + { + "begin": 1524, + "end": 1552, + "name": "REVERT" + }, + { + "begin": 1524, + "end": 1552, + "name": "tag", + "value": "172" + }, + { + "begin": 1524, + "end": 1552, + "name": "JUMPDEST" + }, + { + "begin": 7705, + "end": 7711, + "name": "PUSH", + "value": "0" + }, + { + "begin": 7705, + "end": 7711, + "name": "SLOAD" + }, + { + "begin": 7705, + "end": 7711, + "name": "PUSH", + "value": "10000000000000000000000000000000000000000" + }, + { + "begin": 7705, + "end": 7711, + "name": "SWAP1" + }, + { + "begin": 7705, + "end": 7711, + "name": "DIV" + }, + { + "begin": 7705, + "end": 7711, + "name": "PUSH", + "value": "FF" + }, + { + "begin": 7705, + "end": 7711, + "name": "AND" + }, + { + "begin": 7697, + "end": 7712, + "name": "ISZERO" + }, + { + "begin": 7697, + "end": 7712, + "name": "ISZERO" + }, + { + "begin": 7697, + "end": 7712, + "name": "PUSH [tag]", + "value": "174" + }, + { + "begin": 7697, + "end": 7712, + "name": "JUMPI" + }, + { + "begin": 7697, + "end": 7712, + "name": "PUSH", + "value": "0" + }, + { + "begin": 7697, + "end": 7712, + "name": "DUP1" + }, + { + "begin": 7697, + "end": 7712, + "name": "REVERT" + }, + { + "begin": 7697, + "end": 7712, + "name": "tag", + "value": "174" + }, + { + "begin": 7697, + "end": 7712, + "name": "JUMPDEST" + }, + { + "begin": 8032, + "end": 8037, + "name": "PUSH", + "value": "0" + }, + { + "begin": 8023, + "end": 8037, + "name": "DUP1" + }, + { + "begin": 8023, + "end": 8037, + "name": "SLOAD" + }, + { + "begin": 8023, + "end": 8037, + "name": "PUSH", + "value": "FFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + }, + { + "begin": 8023, + "end": 8037, + "name": "AND" + }, + { + "begin": 8023, + "end": 8037, + "name": "SWAP1" + }, + { + "begin": 8023, + "end": 8037, + "name": "SSTORE" + }, + { + "begin": 8043, + "end": 8052, + "name": "PUSH", + "value": "7805862F689E2F13DF9F062FF482AD3AD112ACA9E0847911ED832E158C525B33" + }, + { + "begin": 8043, + "end": 8052, + "name": "PUSH", + "value": "40" + }, + { + "begin": 8043, + "end": 8052, + "name": "MLOAD" + }, + { + "begin": 8043, + "end": 8052, + "name": "PUSH", + "value": "40" + }, + { + "begin": 8043, + "end": 8052, + "name": "MLOAD" + }, + { + "begin": 8043, + "end": 8052, + "name": "DUP1" + }, + { + "begin": 8043, + "end": 8052, + "name": "SWAP2" + }, + { + "begin": 8043, + "end": 8052, + "name": "SUB" + }, + { + "begin": 8043, + "end": 8052, + "name": "SWAP1" + }, + { + "begin": 8043, + "end": 8052, + "name": "LOG1" + }, + { + "begin": 7970, + "end": 8057, + "name": "JUMP", + "value": "[out]" + }, + { + "begin": 8229, + "end": 8351, + "name": "tag", + "value": "79" + }, + { + "begin": 8229, + "end": 8351, + "name": "JUMPDEST" + }, + { + "begin": 8323, + "end": 8344, + "name": "PUSH", + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + }, + { + "begin": 8323, + "end": 8344, + "name": "DUP2" + }, + { + "begin": 8323, + "end": 8344, + "name": "AND" + }, + { + "begin": 8300, + "end": 8304, + "name": "PUSH", + "value": "0" + }, + { + "begin": 8323, + "end": 8344, + "name": "SWAP1" + }, + { + "begin": 8323, + "end": 8344, + "name": "DUP2" + }, + { + "begin": 8323, + "end": 8344, + "name": "MSTORE" + }, + { + "begin": 8323, + "end": 8336, + "name": "PUSH", + "value": "6" + }, + { + "begin": 8323, + "end": 8344, + "name": "PUSH", + "value": "20" + }, + { + "begin": 8323, + "end": 8344, + "name": "MSTORE" + }, + { + "begin": 8323, + "end": 8344, + "name": "PUSH", + "value": "40" + }, + { + "begin": 8323, + "end": 8344, + "name": "SWAP1" + }, + { + "begin": 8323, + "end": 8344, + "name": "KECCAK256" + }, + { + "begin": 8323, + "end": 8344, + "name": "SLOAD" + }, + { + "begin": 8323, + "end": 8344, + "name": "PUSH", + "value": "FF" + }, + { + "begin": 8323, + "end": 8344, + "name": "AND" + }, + { + "begin": 8229, + "end": 8351, + "name": "tag", + "value": "176" + }, + { + "begin": 8229, + "end": 8351, + "name": "JUMPDEST" + }, + { + "begin": 8229, + "end": 8351, + "name": "SWAP2" + }, + { + "begin": 8229, + "end": 8351, + "name": "SWAP1" + }, + { + "begin": 8229, + "end": 8351, + "name": "POP" + }, + { + "begin": 8229, + "end": 8351, + "name": "JUMP", + "value": "[out]" + }, + { + "begin": 4652, + "end": 4713, + "name": "tag", + "value": "82" + }, + { + "begin": 4652, + "end": 4713, + "name": "JUMPDEST" + }, + { + "begin": 4652, + "end": 4713, + "name": "PUSH", + "value": "5" + }, + { + "begin": 4652, + "end": 4713, + "name": "PUSH", + "value": "20" + }, + { + "begin": 4652, + "end": 4713, + "name": "SWAP1" + }, + { + "begin": 4652, + "end": 4713, + "name": "DUP2" + }, + { + "begin": 4652, + "end": 4713, + "name": "MSTORE" + }, + { + "begin": 4652, + "end": 4713, + "name": "PUSH", + "value": "0" + }, + { + "begin": 4652, + "end": 4713, + "name": "SWAP3" + }, + { + "begin": 4652, + "end": 4713, + "name": "DUP4" + }, + { + "begin": 4652, + "end": 4713, + "name": "MSTORE" + }, + { + "begin": 4652, + "end": 4713, + "name": "PUSH", + "value": "40" + }, + { + "begin": 4652, + "end": 4713, + "name": "DUP1" + }, + { + "begin": 4652, + "end": 4713, + "name": "DUP5" + }, + { + "begin": 4652, + "end": 4713, + "name": "KECCAK256" + }, + { + "begin": 4652, + "end": 4713, + "name": "SWAP1" + }, + { + "begin": 4652, + "end": 4713, + "name": "SWAP2" + }, + { + "begin": 4652, + "end": 4713, + "name": "MSTORE" + }, + { + "begin": 4652, + "end": 4713, + "name": "SWAP1" + }, + { + "begin": 4652, + "end": 4713, + "name": "DUP3" + }, + { + "begin": 4652, + "end": 4713, + "name": "MSTORE" + }, + { + "begin": 4652, + "end": 4713, + "name": "SWAP1" + }, + { + "begin": 4652, + "end": 4713, + "name": "KECCAK256" + }, + { + "begin": 4652, + "end": 4713, + "name": "SLOAD" + }, + { + "begin": 4652, + "end": 4713, + "name": "DUP2" + }, + { + "begin": 4652, + "end": 4713, + "name": "JUMP", + "value": "[out]" + }, + { + "begin": 7384, + "end": 7410, + "name": "tag", + "value": "85" + }, + { + "begin": 7384, + "end": 7410, + "name": "JUMPDEST" + }, + { + "begin": 7384, + "end": 7410, + "name": "PUSH", + "value": "0" + }, + { + "begin": 7384, + "end": 7410, + "name": "SLOAD" + }, + { + "begin": 7384, + "end": 7410, + "name": "PUSH", + "value": "10000000000000000000000000000000000000000" + }, + { + "begin": 7384, + "end": 7410, + "name": "SWAP1" + }, + { + "begin": 7384, + "end": 7410, + "name": "DIV" + }, + { + "begin": 7384, + "end": 7410, + "name": "PUSH", + "value": "FF" + }, + { + "begin": 7384, + "end": 7410, + "name": "AND" + }, + { + "begin": 7384, + "end": 7410, + "name": "DUP2" + }, + { + "begin": 7384, + "end": 7410, + "name": "JUMP", + "value": "[out]" + }, + { + "begin": 11432, + "end": 11670, + "name": "tag", + "value": "88" + }, + { + "begin": 11432, + "end": 11670, + "name": "JUMPDEST" + }, + { + "begin": 11509, + "end": 11519, + "name": "PUSH", + "value": "A" + }, + { + "begin": 11509, + "end": 11519, + "name": "SLOAD" + }, + { + "begin": 11489, + "end": 11493, + "name": "PUSH", + "value": "0" + }, + { + "begin": 11489, + "end": 11493, + "name": "SWAP1" + }, + { + "begin": 11509, + "end": 11519, + "name": "PUSH", + "value": "10000000000000000000000000000000000000000" + }, + { + "begin": 11509, + "end": 11519, + "name": "SWAP1" + }, + { + "begin": 11509, + "end": 11519, + "name": "DIV" + }, + { + "begin": 11509, + "end": 11519, + "name": "PUSH", + "value": "FF" + }, + { + "begin": 11509, + "end": 11519, + "name": "AND" + }, + { + "begin": 11505, + "end": 11664, + "name": "ISZERO" + }, + { + "begin": 11505, + "end": 11664, + "name": "PUSH [tag]", + "value": "178" + }, + { + "begin": 11505, + "end": 11664, + "name": "JUMPI" + }, + { + "begin": 11564, + "end": 11579, + "name": "PUSH", + "value": "A" + }, + { + "begin": 11564, + "end": 11579, + "name": "SLOAD" + }, + { + "begin": 11564, + "end": 11579, + "name": "PUSH", + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + }, + { + "begin": 11564, + "end": 11579, + "name": "AND" + }, + { + "begin": 11542, + "end": 11590, + "name": "PUSH", + "value": "70A08231" + }, + { + "begin": 11591, + "end": 11594, + "name": "DUP4" + }, + { + "begin": 11564, + "end": 11579, + "name": "PUSH", + "value": "0" + }, + { + "begin": 11542, + "end": 11595, + "name": "PUSH", + "value": "40" + }, + { + "begin": 11542, + "end": 11595, + "name": "MLOAD" + }, + { + "begin": 11542, + "end": 11595, + "name": "PUSH", + "value": "20" + }, + { + "begin": 11542, + "end": 11595, + "name": "ADD" + }, + { + "begin": 11542, + "end": 11595, + "name": "MSTORE" + }, + { + "begin": 11542, + "end": 11595, + "name": "PUSH", + "value": "40" + }, + { + "begin": 11542, + "end": 11595, + "name": "MLOAD" + }, + { + "begin": 11542, + "end": 11595, + "name": "PUSH", + "value": "100000000000000000000000000000000000000000000000000000000" + }, + { + "begin": 11542, + "end": 11595, + "name": "PUSH", + "value": "FFFFFFFF" + }, + { + "begin": 11542, + "end": 11595, + "name": "DUP5" + }, + { + "begin": 11542, + "end": 11595, + "name": "AND" + }, + { + "begin": 11542, + "end": 11595, + "name": "MUL" + }, + { + "begin": 11542, + "end": 11595, + "name": "DUP2" + }, + { + "begin": 11542, + "end": 11595, + "name": "MSTORE" + }, + { + "begin": 11542, + "end": 11595, + "name": "PUSH", + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + }, + { + "begin": 11542, + "end": 11595, + "name": "SWAP1" + }, + { + "begin": 11542, + "end": 11595, + "name": "SWAP2" + }, + { + "begin": 11542, + "end": 11595, + "name": "AND" + }, + { + "begin": 11542, + "end": 11595, + "name": "PUSH", + "value": "4" + }, + { + "begin": 11542, + "end": 11595, + "name": "DUP3" + }, + { + "begin": 11542, + "end": 11595, + "name": "ADD" + }, + { + "begin": 11542, + "end": 11595, + "name": "MSTORE" + }, + { + "begin": 11542, + "end": 11595, + "name": "PUSH", + "value": "24" + }, + { + "begin": 11542, + "end": 11595, + "name": "ADD" + }, + { + "begin": 11542, + "end": 11595, + "name": "PUSH", + "value": "20" + }, + { + "begin": 11542, + "end": 11595, + "name": "PUSH", + "value": "40" + }, + { + "begin": 11542, + "end": 11595, + "name": "MLOAD" + }, + { + "begin": 11542, + "end": 11595, + "name": "DUP1" + }, + { + "begin": 11542, + "end": 11595, + "name": "DUP4" + }, + { + "begin": 11542, + "end": 11595, + "name": "SUB" + }, + { + "begin": 11542, + "end": 11595, + "name": "DUP2" + }, + { + "begin": 11542, + "end": 11595, + "name": "PUSH", + "value": "0" + }, + { + "begin": 11542, + "end": 11595, + "name": "DUP8" + }, + { + "begin": 11542, + "end": 11595, + "name": "DUP1" + }, + { + "begin": 11542, + "end": 11595, + "name": "EXTCODESIZE" + }, + { + "begin": 11542, + "end": 11595, + "name": "ISZERO" + }, + { + "begin": 11542, + "end": 11595, + "name": "ISZERO" + }, + { + "begin": 11542, + "end": 11595, + "name": "PUSH [tag]", + "value": "179" + }, + { + "begin": 11542, + "end": 11595, + "name": "JUMPI" + }, + { + "begin": 11542, + "end": 11595, + "name": "PUSH", + "value": "0" + }, + { + "begin": 11542, + "end": 11595, + "name": "DUP1" + }, + { + "begin": 11542, + "end": 11595, + "name": "REVERT" + }, + { + "begin": 11542, + "end": 11595, + "name": "tag", + "value": "179" + }, + { + "begin": 11542, + "end": 11595, + "name": "JUMPDEST" + }, + { + "begin": 11542, + "end": 11595, + "name": "PUSH", + "value": "2C6" + }, + { + "begin": 11542, + "end": 11595, + "name": "GAS" + }, + { + "begin": 11542, + "end": 11595, + "name": "SUB" + }, + { + "begin": 11542, + "end": 11595, + "name": "CALL" + }, + { + "begin": 11542, + "end": 11595, + "name": "ISZERO" + }, + { + "begin": 11542, + "end": 11595, + "name": "ISZERO" + }, + { + "begin": 11542, + "end": 11595, + "name": "PUSH [tag]", + "value": "180" + }, + { + "begin": 11542, + "end": 11595, + "name": "JUMPI" + }, + { + "begin": 11542, + "end": 11595, + "name": "PUSH", + "value": "0" + }, + { + "begin": 11542, + "end": 11595, + "name": "DUP1" + }, + { + "begin": 11542, + "end": 11595, + "name": "REVERT" + }, + { + "begin": 11542, + "end": 11595, + "name": "tag", + "value": "180" + }, + { + "begin": 11542, + "end": 11595, + "name": "JUMPDEST" + }, + { + "begin": 11542, + "end": 11595, + "name": "POP" + }, + { + "begin": 11542, + "end": 11595, + "name": "POP" + }, + { + "begin": 11542, + "end": 11595, + "name": "POP" + }, + { + "begin": 11542, + "end": 11595, + "name": "PUSH", + "value": "40" + }, + { + "begin": 11542, + "end": 11595, + "name": "MLOAD" + }, + { + "begin": 11542, + "end": 11595, + "name": "DUP1" + }, + { + "begin": 11542, + "end": 11595, + "name": "MLOAD" + }, + { + "begin": 11542, + "end": 11595, + "name": "SWAP1" + }, + { + "begin": 11542, + "end": 11595, + "name": "POP" + }, + { + "begin": 11535, + "end": 11595, + "name": "SWAP1" + }, + { + "begin": 11535, + "end": 11595, + "name": "POP" + }, + { + "begin": 11535, + "end": 11595, + "name": "PUSH [tag]", + "value": "176" + }, + { + "begin": 11535, + "end": 11595, + "name": "JUMP" + }, + { + "begin": 11505, + "end": 11664, + "name": "tag", + "value": "178" + }, + { + "begin": 11505, + "end": 11664, + "name": "JUMPDEST" + }, + { + "begin": 11633, + "end": 11653, + "name": "PUSH [tag]", + "value": "182" + }, + { + "begin": 11649, + "end": 11652, + "name": "DUP3" + }, + { + "begin": 11633, + "end": 11648, + "name": "PUSH [tag]", + "value": "183" + }, + { + "begin": 11633, + "end": 11653, + "name": "JUMP", + "value": "[in]" + }, + { + "begin": 11633, + "end": 11653, + "name": "tag", + "value": "182" + }, + { + "begin": 11633, + "end": 11653, + "name": "JUMPDEST" + }, + { + "begin": 11626, + "end": 11653, + "name": "SWAP1" + }, + { + "begin": 11626, + "end": 11653, + "name": "POP" + }, + { + "begin": 11626, + "end": 11653, + "name": "PUSH [tag]", + "value": "176" + }, + { + "begin": 11626, + "end": 11653, + "name": "JUMP" + }, + { + "begin": 7803, + "end": 7888, + "name": "tag", + "value": "91" + }, + { + "begin": 7803, + "end": 7888, + "name": "JUMPDEST" + }, + { + "begin": 1546, + "end": 1551, + "name": "PUSH", + "value": "0" + }, + { + "begin": 1546, + "end": 1551, + "name": "SLOAD" + }, + { + "begin": 1532, + "end": 1542, + "name": "CALLER" + }, + { + "begin": 1546, + "end": 1551, + "name": "PUSH", + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + }, + { + "begin": 1532, + "end": 1551, + "name": "SWAP1" + }, + { + "begin": 1532, + "end": 1551, + "name": "DUP2" + }, + { + "begin": 1532, + "end": 1551, + "name": "AND" + }, + { + "begin": 1546, + "end": 1551, + "name": "SWAP2" + }, + { + "begin": 1546, + "end": 1551, + "name": "AND" + }, + { + "begin": 1532, + "end": 1551, + "name": "EQ" + }, + { + "begin": 1524, + "end": 1552, + "name": "PUSH [tag]", + "value": "185" + }, + { + "begin": 1524, + "end": 1552, + "name": "JUMPI" + }, + { + "begin": 1524, + "end": 1552, + "name": "PUSH", + "value": "0" + }, + { + "begin": 1524, + "end": 1552, + "name": "DUP1" + }, + { + "begin": 1524, + "end": 1552, + "name": "REVERT" + }, + { + "begin": 1524, + "end": 1552, + "name": "tag", + "value": "185" + }, + { + "begin": 1524, + "end": 1552, + "name": "JUMPDEST" + }, + { + "begin": 7553, + "end": 7559, + "name": "PUSH", + "value": "0" + }, + { + "begin": 7553, + "end": 7559, + "name": "SLOAD" + }, + { + "begin": 7553, + "end": 7559, + "name": "PUSH", + "value": "10000000000000000000000000000000000000000" + }, + { + "begin": 7553, + "end": 7559, + "name": "SWAP1" + }, + { + "begin": 7553, + "end": 7559, + "name": "DIV" + }, + { + "begin": 7553, + "end": 7559, + "name": "PUSH", + "value": "FF" + }, + { + "begin": 7553, + "end": 7559, + "name": "AND" + }, + { + "begin": 7552, + "end": 7559, + "name": "ISZERO" + }, + { + "begin": 7544, + "end": 7560, + "name": "PUSH [tag]", + "value": "187" + }, + { + "begin": 7544, + "end": 7560, + "name": "JUMPI" + }, + { + "begin": 7544, + "end": 7560, + "name": "PUSH", + "value": "0" + }, + { + "begin": 7544, + "end": 7560, + "name": "DUP1" + }, + { + "begin": 7544, + "end": 7560, + "name": "REVERT" + }, + { + "begin": 7544, + "end": 7560, + "name": "tag", + "value": "187" + }, + { + "begin": 7544, + "end": 7560, + "name": "JUMPDEST" + }, + { + "begin": 7857, + "end": 7863, + "name": "PUSH", + "value": "0" + }, + { + "begin": 7857, + "end": 7870, + "name": "DUP1" + }, + { + "begin": 7857, + "end": 7870, + "name": "SLOAD" + }, + { + "begin": 7857, + "end": 7870, + "name": "PUSH", + "value": "FFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + }, + { + "begin": 7857, + "end": 7870, + "name": "AND" + }, + { + "begin": 7857, + "end": 7870, + "name": "PUSH", + "value": "10000000000000000000000000000000000000000" + }, + { + "begin": 7857, + "end": 7870, + "name": "OR" + }, + { + "begin": 7857, + "end": 7870, + "name": "SWAP1" + }, + { + "begin": 7857, + "end": 7870, + "name": "SSTORE" + }, + { + "begin": 7876, + "end": 7883, + "name": "PUSH", + "value": "6985A02210A168E66602D3235CB6DB0E70F92B3BA4D376A33C0F3D9434BFF625" + }, + { + "begin": 7876, + "end": 7883, + "name": "PUSH", + "value": "40" + }, + { + "begin": 7876, + "end": 7883, + "name": "MLOAD" + }, + { + "begin": 7876, + "end": 7883, + "name": "PUSH", + "value": "40" + }, + { + "begin": 7876, + "end": 7883, + "name": "MLOAD" + }, + { + "begin": 7876, + "end": 7883, + "name": "DUP1" + }, + { + "begin": 7876, + "end": 7883, + "name": "SWAP2" + }, + { + "begin": 7876, + "end": 7883, + "name": "SUB" + }, + { + "begin": 7876, + "end": 7883, + "name": "SWAP1" + }, + { + "begin": 7876, + "end": 7883, + "name": "LOG1" + }, + { + "begin": 7803, + "end": 7888, + "name": "JUMP", + "value": "[out]" + }, + { + "begin": 8357, + "end": 8442, + "name": "tag", + "value": "94" + }, + { + "begin": 8357, + "end": 8442, + "name": "JUMPDEST" + }, + { + "begin": 8404, + "end": 8411, + "name": "PUSH", + "value": "0" + }, + { + "begin": 8430, + "end": 8435, + "name": "SLOAD" + }, + { + "begin": 8430, + "end": 8435, + "name": "PUSH", + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + }, + { + "begin": 8430, + "end": 8435, + "name": "AND" + }, + { + "begin": 8357, + "end": 8442, + "name": "SWAP1" + }, + { + "begin": 8357, + "end": 8442, + "name": "JUMP", + "value": "[out]" + }, + { + "begin": 1188, + "end": 1208, + "name": "tag", + "value": "97" + }, + { + "begin": 1188, + "end": 1208, + "name": "JUMPDEST" + }, + { + "begin": 1188, + "end": 1208, + "name": "PUSH", + "value": "0" + }, + { + "begin": 1188, + "end": 1208, + "name": "SLOAD" + }, + { + "begin": 1188, + "end": 1208, + "name": "PUSH", + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + }, + { + "begin": 1188, + "end": 1208, + "name": "AND" + }, + { + "begin": 1188, + "end": 1208, + "name": "DUP2" + }, + { + "begin": 1188, + "end": 1208, + "name": "JUMP", + "value": "[out]" + }, + { + "begin": 9818, + "end": 9838, + "name": "tag", + "value": "100" + }, + { + "begin": 9818, + "end": 9838, + "name": "JUMPDEST" + }, + { + "begin": 9818, + "end": 9838, + "name": "PUSH", + "value": "8" + }, + { + "begin": 9818, + "end": 9838, + "name": "DUP1" + }, + { + "begin": 9818, + "end": 9838, + "name": "SLOAD" + }, + { + "begin": 9818, + "end": 9838, + "name": "PUSH", + "value": "1" + }, + { + "begin": 9818, + "end": 9838, + "name": "DUP2" + }, + { + "begin": 9818, + "end": 9838, + "name": "PUSH", + "value": "1" + }, + { + "begin": 9818, + "end": 9838, + "name": "AND" + }, + { + "begin": 9818, + "end": 9838, + "name": "ISZERO" + }, + { + "begin": 9818, + "end": 9838, + "name": "PUSH", + "value": "100" + }, + { + "begin": 9818, + "end": 9838, + "name": "MUL" + }, + { + "begin": 9818, + "end": 9838, + "name": "SUB" + }, + { + "begin": 9818, + "end": 9838, + "name": "AND" + }, + { + "begin": 9818, + "end": 9838, + "name": "PUSH", + "value": "2" + }, + { + "begin": 9818, + "end": 9838, + "name": "SWAP1" + }, + { + "begin": 9818, + "end": 9838, + "name": "DIV" + }, + { + "begin": 9818, + "end": 9838, + "name": "DUP1" + }, + { + "begin": 9818, + "end": 9838, + "name": "PUSH", + "value": "1F" + }, + { + "begin": 9818, + "end": 9838, + "name": "ADD" + }, + { + "begin": 9818, + "end": 9838, + "name": "PUSH", + "value": "20" + }, + { + "begin": 9818, + "end": 9838, + "name": "DUP1" + }, + { + "begin": 9818, + "end": 9838, + "name": "SWAP2" + }, + { + "begin": 9818, + "end": 9838, + "name": "DIV" + }, + { + "begin": 9818, + "end": 9838, + "name": "MUL" + }, + { + "begin": 9818, + "end": 9838, + "name": "PUSH", + "value": "20" + }, + { + "begin": 9818, + "end": 9838, + "name": "ADD" + }, + { + "begin": 9818, + "end": 9838, + "name": "PUSH", + "value": "40" + }, + { + "begin": 9818, + "end": 9838, + "name": "MLOAD" + }, + { + "begin": 9818, + "end": 9838, + "name": "SWAP1" + }, + { + "begin": 9818, + "end": 9838, + "name": "DUP2" + }, + { + "begin": 9818, + "end": 9838, + "name": "ADD" + }, + { + "begin": 9818, + "end": 9838, + "name": "PUSH", + "value": "40" + }, + { + "begin": 9818, + "end": 9838, + "name": "MSTORE" + }, + { + "begin": 9818, + "end": 9838, + "name": "DUP1" + }, + { + "begin": 9818, + "end": 9838, + "name": "SWAP3" + }, + { + "begin": 9818, + "end": 9838, + "name": "SWAP2" + }, + { + "begin": 9818, + "end": 9838, + "name": "SWAP1" + }, + { + "begin": 9818, + "end": 9838, + "name": "DUP2" + }, + { + "begin": 9818, + "end": 9838, + "name": "DUP2" + }, + { + "begin": 9818, + "end": 9838, + "name": "MSTORE" + }, + { + "begin": 9818, + "end": 9838, + "name": "PUSH", + "value": "20" + }, + { + "begin": 9818, + "end": 9838, + "name": "ADD" + }, + { + "begin": 9818, + "end": 9838, + "name": "DUP3" + }, + { + "begin": 9818, + "end": 9838, + "name": "DUP1" + }, + { + "begin": 9818, + "end": 9838, + "name": "SLOAD" + }, + { + "begin": 9818, + "end": 9838, + "name": "PUSH", + "value": "1" + }, + { + "begin": 9818, + "end": 9838, + "name": "DUP2" + }, + { + "begin": 9818, + "end": 9838, + "name": "PUSH", + "value": "1" + }, + { + "begin": 9818, + "end": 9838, + "name": "AND" + }, + { + "begin": 9818, + "end": 9838, + "name": "ISZERO" + }, + { + "begin": 9818, + "end": 9838, + "name": "PUSH", + "value": "100" + }, + { + "begin": 9818, + "end": 9838, + "name": "MUL" + }, + { + "begin": 9818, + "end": 9838, + "name": "SUB" + }, + { + "begin": 9818, + "end": 9838, + "name": "AND" + }, + { + "begin": 9818, + "end": 9838, + "name": "PUSH", + "value": "2" + }, + { + "begin": 9818, + "end": 9838, + "name": "SWAP1" + }, + { + "begin": 9818, + "end": 9838, + "name": "DIV" + }, + { + "begin": 9818, + "end": 9838, + "name": "DUP1" + }, + { + "begin": 9818, + "end": 9838, + "name": "ISZERO" + }, + { + "begin": 9818, + "end": 9838, + "name": "PUSH [tag]", + "value": "138" + }, + { + "begin": 9818, + "end": 9838, + "name": "JUMPI" + }, + { + "begin": 9818, + "end": 9838, + "name": "DUP1" + }, + { + "begin": 9818, + "end": 9838, + "name": "PUSH", + "value": "1F" + }, + { + "begin": 9818, + "end": 9838, + "name": "LT" + }, + { + "begin": 9818, + "end": 9838, + "name": "PUSH [tag]", + "value": "139" + }, + { + "begin": 9818, + "end": 9838, + "name": "JUMPI" + }, + { + "begin": 9818, + "end": 9838, + "name": "PUSH", + "value": "100" + }, + { + "begin": 9818, + "end": 9838, + "name": "DUP1" + }, + { + "begin": 9818, + "end": 9838, + "name": "DUP4" + }, + { + "begin": 9818, + "end": 9838, + "name": "SLOAD" + }, + { + "begin": 9818, + "end": 9838, + "name": "DIV" + }, + { + "begin": 9818, + "end": 9838, + "name": "MUL" + }, + { + "begin": 9818, + "end": 9838, + "name": "DUP4" + }, + { + "begin": 9818, + "end": 9838, + "name": "MSTORE" + }, + { + "begin": 9818, + "end": 9838, + "name": "SWAP2" + }, + { + "begin": 9818, + "end": 9838, + "name": "PUSH", + "value": "20" + }, + { + "begin": 9818, + "end": 9838, + "name": "ADD" + }, + { + "begin": 9818, + "end": 9838, + "name": "SWAP2" + }, + { + "begin": 9818, + "end": 9838, + "name": "PUSH [tag]", + "value": "138" + }, + { + "begin": 9818, + "end": 9838, + "name": "JUMP" + }, + { + "begin": 10594, + "end": 10913, + "name": "tag", + "value": "107" + }, + { + "begin": 10594, + "end": 10913, + "name": "JUMPDEST" + }, + { + "begin": 7553, + "end": 7559, + "name": "PUSH", + "value": "0" + }, + { + "begin": 7553, + "end": 7559, + "name": "SLOAD" + }, + { + "begin": 7553, + "end": 7559, + "name": "PUSH", + "value": "10000000000000000000000000000000000000000" + }, + { + "begin": 7553, + "end": 7559, + "name": "SWAP1" + }, + { + "begin": 7553, + "end": 7559, + "name": "DIV" + }, + { + "begin": 7553, + "end": 7559, + "name": "PUSH", + "value": "FF" + }, + { + "begin": 7553, + "end": 7559, + "name": "AND" + }, + { + "begin": 7552, + "end": 7559, + "name": "ISZERO" + }, + { + "begin": 7544, + "end": 7560, + "name": "PUSH [tag]", + "value": "194" + }, + { + "begin": 7544, + "end": 7560, + "name": "JUMPI" + }, + { + "begin": 7544, + "end": 7560, + "name": "PUSH", + "value": "0" + }, + { + "begin": 7544, + "end": 7560, + "name": "DUP1" + }, + { + "begin": 7544, + "end": 7560, + "name": "REVERT" + }, + { + "begin": 7544, + "end": 7560, + "name": "tag", + "value": "194" + }, + { + "begin": 7544, + "end": 7560, + "name": "JUMPDEST" + }, + { + "begin": 10678, + "end": 10703, + "name": "PUSH", + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + }, + { + "begin": 10692, + "end": 10702, + "name": "CALLER" + }, + { + "begin": 10678, + "end": 10703, + "name": "AND" + }, + { + "begin": 10678, + "end": 10703, + "name": "PUSH", + "value": "0" + }, + { + "begin": 10678, + "end": 10703, + "name": "SWAP1" + }, + { + "begin": 10678, + "end": 10703, + "name": "DUP2" + }, + { + "begin": 10678, + "end": 10703, + "name": "MSTORE" + }, + { + "begin": 10678, + "end": 10691, + "name": "PUSH", + "value": "6" + }, + { + "begin": 10678, + "end": 10703, + "name": "PUSH", + "value": "20" + }, + { + "begin": 10678, + "end": 10703, + "name": "MSTORE" + }, + { + "begin": 10678, + "end": 10703, + "name": "PUSH", + "value": "40" + }, + { + "begin": 10678, + "end": 10703, + "name": "SWAP1" + }, + { + "begin": 10678, + "end": 10703, + "name": "KECCAK256" + }, + { + "begin": 10678, + "end": 10703, + "name": "SLOAD" + }, + { + "begin": 10678, + "end": 10703, + "name": "PUSH", + "value": "FF" + }, + { + "begin": 10678, + "end": 10703, + "name": "AND" + }, + { + "begin": 10677, + "end": 10703, + "name": "ISZERO" + }, + { + "begin": 10669, + "end": 10704, + "name": "PUSH [tag]", + "value": "196" + }, + { + "begin": 10669, + "end": 10704, + "name": "JUMPI" + }, + { + "begin": 10669, + "end": 10704, + "name": "PUSH", + "value": "0" + }, + { + "begin": 10669, + "end": 10704, + "name": "DUP1" + }, + { + "begin": 10669, + "end": 10704, + "name": "REVERT" + }, + { + "begin": 10669, + "end": 10704, + "name": "tag", + "value": "196" + }, + { + "begin": 10669, + "end": 10704, + "name": "JUMPDEST" + }, + { + "begin": 10718, + "end": 10728, + "name": "PUSH", + "value": "A" + }, + { + "begin": 10718, + "end": 10728, + "name": "SLOAD" + }, + { + "begin": 10718, + "end": 10728, + "name": "PUSH", + "value": "10000000000000000000000000000000000000000" + }, + { + "begin": 10718, + "end": 10728, + "name": "SWAP1" + }, + { + "begin": 10718, + "end": 10728, + "name": "DIV" + }, + { + "begin": 10718, + "end": 10728, + "name": "PUSH", + "value": "FF" + }, + { + "begin": 10718, + "end": 10728, + "name": "AND" + }, + { + "begin": 10714, + "end": 10907, + "name": "ISZERO" + }, + { + "begin": 10714, + "end": 10907, + "name": "PUSH [tag]", + "value": "197" + }, + { + "begin": 10714, + "end": 10907, + "name": "JUMPI" + }, + { + "begin": 10773, + "end": 10788, + "name": "PUSH", + "value": "A" + }, + { + "begin": 10773, + "end": 10788, + "name": "SLOAD" + }, + { + "begin": 10773, + "end": 10788, + "name": "PUSH", + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + }, + { + "begin": 10773, + "end": 10788, + "name": "AND" + }, + { + "begin": 10751, + "end": 10806, + "name": "PUSH", + "value": "6E18980A" + }, + { + "begin": 10807, + "end": 10817, + "name": "CALLER" + }, + { + "begin": 10819, + "end": 10822, + "name": "DUP5" + }, + { + "begin": 10824, + "end": 10830, + "name": "DUP5" + }, + { + "begin": 10751, + "end": 10831, + "name": "PUSH", + "value": "40" + }, + { + "begin": 10751, + "end": 10831, + "name": "MLOAD" + }, + { + "begin": 10751, + "end": 10831, + "name": "PUSH", + "value": "100000000000000000000000000000000000000000000000000000000" + }, + { + "begin": 10751, + "end": 10831, + "name": "PUSH", + "value": "FFFFFFFF" + }, + { + "begin": 10751, + "end": 10831, + "name": "DUP7" + }, + { + "begin": 10751, + "end": 10831, + "name": "AND" + }, + { + "begin": 10751, + "end": 10831, + "name": "MUL" + }, + { + "begin": 10751, + "end": 10831, + "name": "DUP2" + }, + { + "begin": 10751, + "end": 10831, + "name": "MSTORE" + }, + { + "begin": 10751, + "end": 10831, + "name": "PUSH", + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + }, + { + "begin": 10751, + "end": 10831, + "name": "SWAP4" + }, + { + "begin": 10751, + "end": 10831, + "name": "DUP5" + }, + { + "begin": 10751, + "end": 10831, + "name": "AND" + }, + { + "begin": 10751, + "end": 10831, + "name": "PUSH", + "value": "4" + }, + { + "begin": 10751, + "end": 10831, + "name": "DUP3" + }, + { + "begin": 10751, + "end": 10831, + "name": "ADD" + }, + { + "begin": 10751, + "end": 10831, + "name": "MSTORE" + }, + { + "begin": 10751, + "end": 10831, + "name": "SWAP2" + }, + { + "begin": 10751, + "end": 10831, + "name": "SWAP1" + }, + { + "begin": 10751, + "end": 10831, + "name": "SWAP3" + }, + { + "begin": 10751, + "end": 10831, + "name": "AND" + }, + { + "begin": 10751, + "end": 10831, + "name": "PUSH", + "value": "24" + }, + { + "begin": 10751, + "end": 10831, + "name": "DUP3" + }, + { + "begin": 10751, + "end": 10831, + "name": "ADD" + }, + { + "begin": 10751, + "end": 10831, + "name": "MSTORE" + }, + { + "begin": 10751, + "end": 10831, + "name": "PUSH", + "value": "44" + }, + { + "begin": 10751, + "end": 10831, + "name": "DUP2" + }, + { + "begin": 10751, + "end": 10831, + "name": "ADD" + }, + { + "begin": 10751, + "end": 10831, + "name": "SWAP2" + }, + { + "begin": 10751, + "end": 10831, + "name": "SWAP1" + }, + { + "begin": 10751, + "end": 10831, + "name": "SWAP2" + }, + { + "begin": 10751, + "end": 10831, + "name": "MSTORE" + }, + { + "begin": 10751, + "end": 10831, + "name": "PUSH", + "value": "64" + }, + { + "begin": 10751, + "end": 10831, + "name": "ADD" + }, + { + "begin": -1, + "end": -1, + "name": "PUSH", + "value": "0" + }, + { + "begin": 10751, + "end": 10831, + "name": "PUSH", + "value": "40" + }, + { + "begin": 10751, + "end": 10831, + "name": "MLOAD" + }, + { + "begin": 10751, + "end": 10831, + "name": "DUP1" + }, + { + "begin": 10751, + "end": 10831, + "name": "DUP4" + }, + { + "begin": 10751, + "end": 10831, + "name": "SUB" + }, + { + "begin": 10751, + "end": 10831, + "name": "DUP2" + }, + { + "begin": 10751, + "end": 10831, + "name": "PUSH", + "value": "0" + }, + { + "begin": 10751, + "end": 10831, + "name": "DUP8" + }, + { + "begin": 10751, + "end": 10831, + "name": "DUP1" + }, + { + "begin": 10751, + "end": 10831, + "name": "EXTCODESIZE" + }, + { + "begin": 10751, + "end": 10831, + "name": "ISZERO" + }, + { + "begin": 10751, + "end": 10831, + "name": "ISZERO" + }, + { + "begin": 10751, + "end": 10831, + "name": "PUSH [tag]", + "value": "198" + }, + { + "begin": 10751, + "end": 10831, + "name": "JUMPI" + }, + { + "begin": 10751, + "end": 10831, + "name": "PUSH", + "value": "0" + }, + { + "begin": 10751, + "end": 10831, + "name": "DUP1" + }, + { + "begin": 10751, + "end": 10831, + "name": "REVERT" + }, + { + "begin": 10751, + "end": 10831, + "name": "tag", + "value": "198" + }, + { + "begin": 10751, + "end": 10831, + "name": "JUMPDEST" + }, + { + "begin": 10751, + "end": 10831, + "name": "PUSH", + "value": "2C6" + }, + { + "begin": 10751, + "end": 10831, + "name": "GAS" + }, + { + "begin": 10751, + "end": 10831, + "name": "SUB" + }, + { + "begin": 10751, + "end": 10831, + "name": "CALL" + }, + { + "begin": 10751, + "end": 10831, + "name": "ISZERO" + }, + { + "begin": 10751, + "end": 10831, + "name": "ISZERO" + }, + { + "begin": 10751, + "end": 10831, + "name": "PUSH [tag]", + "value": "199" + }, + { + "begin": 10751, + "end": 10831, + "name": "JUMPI" + }, + { + "begin": 10751, + "end": 10831, + "name": "PUSH", + "value": "0" + }, + { + "begin": 10751, + "end": 10831, + "name": "DUP1" + }, + { + "begin": 10751, + "end": 10831, + "name": "REVERT" + }, + { + "begin": 10751, + "end": 10831, + "name": "tag", + "value": "199" + }, + { + "begin": 10751, + "end": 10831, + "name": "JUMPDEST" + }, + { + "begin": 10751, + "end": 10831, + "name": "POP" + }, + { + "begin": 10751, + "end": 10831, + "name": "POP" + }, + { + "begin": 10751, + "end": 10831, + "name": "POP" + }, + { + "begin": 10744, + "end": 10831, + "name": "PUSH [tag]", + "value": "201" + }, + { + "begin": 10744, + "end": 10831, + "name": "JUMP" + }, + { + "begin": 10714, + "end": 10907, + "name": "tag", + "value": "197" + }, + { + "begin": 10714, + "end": 10907, + "name": "JUMPDEST" + }, + { + "begin": 10869, + "end": 10896, + "name": "PUSH [tag]", + "value": "201" + }, + { + "begin": 10884, + "end": 10887, + "name": "DUP3" + }, + { + "begin": 10889, + "end": 10895, + "name": "DUP3" + }, + { + "begin": 10869, + "end": 10883, + "name": "PUSH [tag]", + "value": "202" + }, + { + "begin": 10869, + "end": 10896, + "name": "JUMP", + "value": "[in]" + }, + { + "begin": 10869, + "end": 10896, + "name": "tag", + "value": "201" + }, + { + "begin": 10869, + "end": 10896, + "name": "JUMPDEST" + }, + { + "begin": 10594, + "end": 10913, + "name": "POP" + }, + { + "begin": 10594, + "end": 10913, + "name": "POP" + }, + { + "begin": 10594, + "end": 10913, + "name": "JUMP", + "value": "[out]" + }, + { + "begin": 13809, + "end": 14187, + "name": "tag", + "value": "110" + }, + { + "begin": 13809, + "end": 14187, + "name": "JUMPDEST" + }, + { + "begin": 1546, + "end": 1551, + "name": "PUSH", + "value": "0" + }, + { + "begin": 1546, + "end": 1551, + "name": "SLOAD" + }, + { + "begin": 1532, + "end": 1542, + "name": "CALLER" + }, + { + "begin": 1546, + "end": 1551, + "name": "PUSH", + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + }, + { + "begin": 1532, + "end": 1551, + "name": "SWAP1" + }, + { + "begin": 1532, + "end": 1551, + "name": "DUP2" + }, + { + "begin": 1532, + "end": 1551, + "name": "AND" + }, + { + "begin": 1546, + "end": 1551, + "name": "SWAP2" + }, + { + "begin": 1546, + "end": 1551, + "name": "AND" + }, + { + "begin": 1532, + "end": 1551, + "name": "EQ" + }, + { + "begin": 1524, + "end": 1552, + "name": "PUSH [tag]", + "value": "204" + }, + { + "begin": 1524, + "end": 1552, + "name": "JUMPI" + }, + { + "begin": 1524, + "end": 1552, + "name": "PUSH", + "value": "0" + }, + { + "begin": 1524, + "end": 1552, + "name": "DUP1" + }, + { + "begin": 1524, + "end": 1552, + "name": "REVERT" + }, + { + "begin": 1524, + "end": 1552, + "name": "tag", + "value": "204" + }, + { + "begin": 1524, + "end": 1552, + "name": "JUMPDEST" + }, + { + "begin": 14005, + "end": 14007, + "name": "PUSH", + "value": "14" + }, + { + "begin": 13988, + "end": 14007, + "name": "DUP3" + }, + { + "begin": 13988, + "end": 14007, + "name": "LT" + }, + { + "begin": 13980, + "end": 14008, + "name": "PUSH [tag]", + "value": "206" + }, + { + "begin": 13980, + "end": 14008, + "name": "JUMPI" + }, + { + "begin": 13980, + "end": 14008, + "name": "PUSH", + "value": "0" + }, + { + "begin": 13980, + "end": 14008, + "name": "DUP1" + }, + { + "begin": 13980, + "end": 14008, + "name": "REVERT" + }, + { + "begin": 13980, + "end": 14008, + "name": "tag", + "value": "206" + }, + { + "begin": 13980, + "end": 14008, + "name": "JUMPDEST" + }, + { + "begin": 14038, + "end": 14040, + "name": "PUSH", + "value": "32" + }, + { + "begin": 14026, + "end": 14040, + "name": "DUP2" + }, + { + "begin": 14026, + "end": 14040, + "name": "LT" + }, + { + "begin": 14018, + "end": 14041, + "name": "PUSH [tag]", + "value": "207" + }, + { + "begin": 14018, + "end": 14041, + "name": "JUMPI" + }, + { + "begin": 14018, + "end": 14041, + "name": "PUSH", + "value": "0" + }, + { + "begin": 14018, + "end": 14041, + "name": "DUP1" + }, + { + "begin": 14018, + "end": 14041, + "name": "REVERT" + }, + { + "begin": 14018, + "end": 14041, + "name": "tag", + "value": "207" + }, + { + "begin": 14018, + "end": 14041, + "name": "JUMPDEST" + }, + { + "begin": 14052, + "end": 14067, + "name": "PUSH", + "value": "3" + }, + { + "begin": 14052, + "end": 14084, + "name": "DUP3" + }, + { + "begin": 14052, + "end": 14084, + "name": "SWAP1" + }, + { + "begin": 14052, + "end": 14084, + "name": "SSTORE" + }, + { + "begin": 14125, + "end": 14133, + "name": "PUSH", + "value": "9" + }, + { + "begin": 14125, + "end": 14133, + "name": "SLOAD" + }, + { + "begin": 14107, + "end": 14134, + "name": "PUSH [tag]", + "value": "208" + }, + { + "begin": 14107, + "end": 14134, + "name": "SWAP1" + }, + { + "begin": 14107, + "end": 14116, + "name": "DUP3" + }, + { + "begin": 14107, + "end": 14116, + "name": "SWAP1" + }, + { + "begin": 14121, + "end": 14123, + "name": "PUSH", + "value": "A" + }, + { + "begin": 14121, + "end": 14133, + "name": "EXP" + }, + { + "begin": 14107, + "end": 14134, + "name": "PUSH", + "value": "FFFFFFFF" + }, + { + "begin": 14107, + "end": 14120, + "name": "PUSH [tag]", + "value": "209" + }, + { + "begin": 14107, + "end": 14134, + "name": "AND" + }, + { + "begin": 14107, + "end": 14134, + "name": "JUMP", + "value": "[in]" + }, + { + "begin": 14107, + "end": 14134, + "name": "tag", + "value": "208" + }, + { + "begin": 14107, + "end": 14134, + "name": "JUMPDEST" + }, + { + "begin": 14094, + "end": 14104, + "name": "PUSH", + "value": "4" + }, + { + "begin": 14094, + "end": 14134, + "name": "DUP2" + }, + { + "begin": 14094, + "end": 14134, + "name": "SWAP1" + }, + { + "begin": 14094, + "end": 14134, + "name": "SSTORE" + }, + { + "begin": 14152, + "end": 14167, + "name": "PUSH", + "value": "3" + }, + { + "begin": 14152, + "end": 14167, + "name": "SLOAD" + }, + { + "begin": 14145, + "end": 14180, + "name": "PUSH", + "value": "B044A1E409EAC5C48E5AF22D4AF52670DD1A99059537A78B31B48C6500A6354E" + }, + { + "begin": 14145, + "end": 14180, + "name": "SWAP2" + }, + { + "begin": 14145, + "end": 14180, + "name": "PUSH", + "value": "40" + }, + { + "begin": 14145, + "end": 14180, + "name": "MLOAD" + }, + { + "begin": 14145, + "end": 14180, + "name": "SWAP2" + }, + { + "begin": 14145, + "end": 14180, + "name": "DUP3" + }, + { + "begin": 14145, + "end": 14180, + "name": "MSTORE" + }, + { + "begin": 14145, + "end": 14180, + "name": "PUSH", + "value": "20" + }, + { + "begin": 14145, + "end": 14180, + "name": "DUP3" + }, + { + "begin": 14145, + "end": 14180, + "name": "ADD" + }, + { + "begin": 14145, + "end": 14180, + "name": "MSTORE" + }, + { + "begin": 14145, + "end": 14180, + "name": "PUSH", + "value": "40" + }, + { + "begin": 14145, + "end": 14180, + "name": "SWAP1" + }, + { + "begin": 14145, + "end": 14180, + "name": "DUP2" + }, + { + "begin": 14145, + "end": 14180, + "name": "ADD" + }, + { + "begin": 14145, + "end": 14180, + "name": "SWAP1" + }, + { + "begin": 14145, + "end": 14180, + "name": "MLOAD" + }, + { + "begin": 14145, + "end": 14180, + "name": "DUP1" + }, + { + "begin": 14145, + "end": 14180, + "name": "SWAP2" + }, + { + "begin": 14145, + "end": 14180, + "name": "SUB" + }, + { + "begin": 14145, + "end": 14180, + "name": "SWAP1" + }, + { + "begin": 14145, + "end": 14180, + "name": "LOG1" + }, + { + "begin": 13809, + "end": 14187, + "name": "POP" + }, + { + "begin": 13809, + "end": 14187, + "name": "POP" + }, + { + "begin": 13809, + "end": 14187, + "name": "JUMP", + "value": "[out]" + }, + { + "begin": 13090, + "end": 13349, + "name": "tag", + "value": "113" + }, + { + "begin": 13090, + "end": 13349, + "name": "JUMPDEST" + }, + { + "begin": 1546, + "end": 1551, + "name": "PUSH", + "value": "0" + }, + { + "begin": 1546, + "end": 1551, + "name": "SLOAD" + }, + { + "begin": 1532, + "end": 1542, + "name": "CALLER" + }, + { + "begin": 1546, + "end": 1551, + "name": "PUSH", + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + }, + { + "begin": 1532, + "end": 1551, + "name": "SWAP1" + }, + { + "begin": 1532, + "end": 1551, + "name": "DUP2" + }, + { + "begin": 1532, + "end": 1551, + "name": "AND" + }, + { + "begin": 1546, + "end": 1551, + "name": "SWAP2" + }, + { + "begin": 1546, + "end": 1551, + "name": "AND" + }, + { + "begin": 1532, + "end": 1551, + "name": "EQ" + }, + { + "begin": 1524, + "end": 1552, + "name": "PUSH [tag]", + "value": "211" + }, + { + "begin": 1524, + "end": 1552, + "name": "JUMPI" + }, + { + "begin": 1524, + "end": 1552, + "name": "PUSH", + "value": "0" + }, + { + "begin": 1524, + "end": 1552, + "name": "DUP1" + }, + { + "begin": 1524, + "end": 1552, + "name": "REVERT" + }, + { + "begin": 1524, + "end": 1552, + "name": "tag", + "value": "211" + }, + { + "begin": 1524, + "end": 1552, + "name": "JUMPDEST" + }, + { + "begin": 13177, + "end": 13189, + "name": "PUSH", + "value": "1" + }, + { + "begin": 13177, + "end": 13189, + "name": "SLOAD" + }, + { + "begin": 13153, + "end": 13174, + "name": "DUP2" + }, + { + "begin": 13153, + "end": 13174, + "name": "DUP2" + }, + { + "begin": 13153, + "end": 13174, + "name": "ADD" + }, + { + "begin": 13153, + "end": 13189, + "name": "GT" + }, + { + "begin": 13145, + "end": 13190, + "name": "PUSH [tag]", + "value": "213" + }, + { + "begin": 13145, + "end": 13190, + "name": "JUMPI" + }, + { + "begin": 13145, + "end": 13190, + "name": "PUSH", + "value": "0" + }, + { + "begin": 13145, + "end": 13190, + "name": "DUP1" + }, + { + "begin": 13145, + "end": 13190, + "name": "REVERT" + }, + { + "begin": 13145, + "end": 13190, + "name": "tag", + "value": "213" + }, + { + "begin": 13145, + "end": 13190, + "name": "JUMPDEST" + }, + { + "begin": 13235, + "end": 13250, + "name": "PUSH", + "value": "0" + }, + { + "begin": 13244, + "end": 13249, + "name": "DUP1" + }, + { + "begin": 13244, + "end": 13249, + "name": "SLOAD" + }, + { + "begin": 13244, + "end": 13249, + "name": "PUSH", + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + }, + { + "begin": 13244, + "end": 13249, + "name": "AND" + }, + { + "begin": 13235, + "end": 13250, + "name": "DUP2" + }, + { + "begin": 13235, + "end": 13250, + "name": "MSTORE" + }, + { + "begin": 13235, + "end": 13243, + "name": "PUSH", + "value": "2" + }, + { + "begin": 13235, + "end": 13250, + "name": "PUSH", + "value": "20" + }, + { + "begin": 13235, + "end": 13250, + "name": "MSTORE" + }, + { + "begin": 13235, + "end": 13250, + "name": "PUSH", + "value": "40" + }, + { + "begin": 13235, + "end": 13250, + "name": "SWAP1" + }, + { + "begin": 13235, + "end": 13250, + "name": "KECCAK256" + }, + { + "begin": 13235, + "end": 13250, + "name": "SLOAD" + }, + { + "begin": 13208, + "end": 13232, + "name": "DUP2" + }, + { + "begin": 13208, + "end": 13232, + "name": "DUP2" + }, + { + "begin": 13208, + "end": 13232, + "name": "ADD" + }, + { + "begin": 13208, + "end": 13250, + "name": "GT" + }, + { + "begin": 13200, + "end": 13251, + "name": "PUSH [tag]", + "value": "214" + }, + { + "begin": 13200, + "end": 13251, + "name": "JUMPI" + }, + { + "begin": 13200, + "end": 13251, + "name": "PUSH", + "value": "0" + }, + { + "begin": 13200, + "end": 13251, + "name": "DUP1" + }, + { + "begin": 13200, + "end": 13251, + "name": "REVERT" + }, + { + "begin": 13200, + "end": 13251, + "name": "tag", + "value": "214" + }, + { + "begin": 13200, + "end": 13251, + "name": "JUMPDEST" + }, + { + "begin": 13262, + "end": 13277, + "name": "PUSH", + "value": "0" + }, + { + "begin": 13271, + "end": 13276, + "name": "DUP1" + }, + { + "begin": 13271, + "end": 13276, + "name": "SLOAD" + }, + { + "begin": 13271, + "end": 13276, + "name": "PUSH", + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + }, + { + "begin": 13271, + "end": 13276, + "name": "AND" + }, + { + "begin": 13262, + "end": 13277, + "name": "DUP2" + }, + { + "begin": 13262, + "end": 13277, + "name": "MSTORE" + }, + { + "begin": 13262, + "end": 13270, + "name": "PUSH", + "value": "2" + }, + { + "begin": 13262, + "end": 13277, + "name": "PUSH", + "value": "20" + }, + { + "begin": 13262, + "end": 13277, + "name": "MSTORE" + }, + { + "begin": 13262, + "end": 13277, + "name": "PUSH", + "value": "40" + }, + { + "begin": 13262, + "end": 13277, + "name": "SWAP1" + }, + { + "begin": 13262, + "end": 13277, + "name": "DUP2" + }, + { + "begin": 13262, + "end": 13277, + "name": "SWAP1" + }, + { + "begin": 13262, + "end": 13277, + "name": "KECCAK256" + }, + { + "begin": 13262, + "end": 13287, + "name": "DUP1" + }, + { + "begin": 13262, + "end": 13287, + "name": "SLOAD" + }, + { + "begin": 13262, + "end": 13287, + "name": "DUP4" + }, + { + "begin": 13262, + "end": 13287, + "name": "ADD" + }, + { + "begin": 13262, + "end": 13287, + "name": "SWAP1" + }, + { + "begin": 13262, + "end": 13287, + "name": "SSTORE" + }, + { + "begin": 13271, + "end": 13276, + "name": "PUSH", + "value": "1" + }, + { + "begin": 13297, + "end": 13319, + "name": "DUP1" + }, + { + "begin": 13297, + "end": 13319, + "name": "SLOAD" + }, + { + "begin": 13297, + "end": 13319, + "name": "DUP4" + }, + { + "begin": 13297, + "end": 13319, + "name": "ADD" + }, + { + "begin": 13297, + "end": 13319, + "name": "SWAP1" + }, + { + "begin": 13297, + "end": 13319, + "name": "SSTORE" + }, + { + "begin": 13329, + "end": 13342, + "name": "PUSH", + "value": "CB8241ADB0C3FDB35B70C24CE35C5EB0C17AF7431C99F827D44A445CA624176A" + }, + { + "begin": 13329, + "end": 13342, + "name": "SWAP1" + }, + { + "begin": 13281, + "end": 13287, + "name": "DUP3" + }, + { + "begin": 13281, + "end": 13287, + "name": "SWAP1" + }, + { + "begin": 13329, + "end": 13342, + "name": "MLOAD" + }, + { + "begin": 13329, + "end": 13342, + "name": "SWAP1" + }, + { + "begin": 13329, + "end": 13342, + "name": "DUP2" + }, + { + "begin": 13329, + "end": 13342, + "name": "MSTORE" + }, + { + "begin": 13329, + "end": 13342, + "name": "PUSH", + "value": "20" + }, + { + "begin": 13329, + "end": 13342, + "name": "ADD" + }, + { + "begin": 13329, + "end": 13342, + "name": "PUSH", + "value": "40" + }, + { + "begin": 13329, + "end": 13342, + "name": "MLOAD" + }, + { + "begin": 13329, + "end": 13342, + "name": "DUP1" + }, + { + "begin": 13329, + "end": 13342, + "name": "SWAP2" + }, + { + "begin": 13329, + "end": 13342, + "name": "SUB" + }, + { + "begin": 13329, + "end": 13342, + "name": "SWAP1" + }, + { + "begin": 13329, + "end": 13342, + "name": "LOG1" + }, + { + "begin": 13090, + "end": 13349, + "name": "POP" + }, + { + "begin": 13090, + "end": 13349, + "name": "JUMP", + "value": "[out]" + }, + { + "begin": 13573, + "end": 13803, + "name": "tag", + "value": "116" + }, + { + "begin": 13573, + "end": 13803, + "name": "JUMPDEST" + }, + { + "begin": 1546, + "end": 1551, + "name": "PUSH", + "value": "0" + }, + { + "begin": 1546, + "end": 1551, + "name": "SLOAD" + }, + { + "begin": 1532, + "end": 1542, + "name": "CALLER" + }, + { + "begin": 1546, + "end": 1551, + "name": "PUSH", + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + }, + { + "begin": 1532, + "end": 1551, + "name": "SWAP1" + }, + { + "begin": 1532, + "end": 1551, + "name": "DUP2" + }, + { + "begin": 1532, + "end": 1551, + "name": "AND" + }, + { + "begin": 1546, + "end": 1551, + "name": "SWAP2" + }, + { + "begin": 1546, + "end": 1551, + "name": "AND" + }, + { + "begin": 1532, + "end": 1551, + "name": "EQ" + }, + { + "begin": 1524, + "end": 1552, + "name": "PUSH [tag]", + "value": "216" + }, + { + "begin": 1524, + "end": 1552, + "name": "JUMPI" + }, + { + "begin": 1524, + "end": 1552, + "name": "PUSH", + "value": "0" + }, + { + "begin": 1524, + "end": 1552, + "name": "DUP1" + }, + { + "begin": 1524, + "end": 1552, + "name": "REVERT" + }, + { + "begin": 1524, + "end": 1552, + "name": "tag", + "value": "216" + }, + { + "begin": 1524, + "end": 1552, + "name": "JUMPDEST" + }, + { + "begin": 13637, + "end": 13649, + "name": "PUSH", + "value": "1" + }, + { + "begin": 13637, + "end": 13649, + "name": "SLOAD" + }, + { + "begin": 13637, + "end": 13659, + "name": "DUP2" + }, + { + "begin": 13637, + "end": 13659, + "name": "SWAP1" + }, + { + "begin": 13637, + "end": 13659, + "name": "LT" + }, + { + "begin": 13637, + "end": 13659, + "name": "ISZERO" + }, + { + "begin": 13629, + "end": 13660, + "name": "PUSH [tag]", + "value": "218" + }, + { + "begin": 13629, + "end": 13660, + "name": "JUMPI" + }, + { + "begin": 13629, + "end": 13660, + "name": "PUSH", + "value": "0" + }, + { + "begin": 13629, + "end": 13660, + "name": "DUP1" + }, + { + "begin": 13629, + "end": 13660, + "name": "REVERT" + }, + { + "begin": 13629, + "end": 13660, + "name": "tag", + "value": "218" + }, + { + "begin": 13629, + "end": 13660, + "name": "JUMPDEST" + }, + { + "begin": 13678, + "end": 13693, + "name": "PUSH", + "value": "0" + }, + { + "begin": 13687, + "end": 13692, + "name": "DUP1" + }, + { + "begin": 13687, + "end": 13692, + "name": "SLOAD" + }, + { + "begin": 13687, + "end": 13692, + "name": "PUSH", + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + }, + { + "begin": 13687, + "end": 13692, + "name": "AND" + }, + { + "begin": 13678, + "end": 13693, + "name": "DUP2" + }, + { + "begin": 13678, + "end": 13693, + "name": "MSTORE" + }, + { + "begin": 13678, + "end": 13686, + "name": "PUSH", + "value": "2" + }, + { + "begin": 13678, + "end": 13693, + "name": "PUSH", + "value": "20" + }, + { + "begin": 13678, + "end": 13693, + "name": "MSTORE" + }, + { + "begin": 13678, + "end": 13693, + "name": "PUSH", + "value": "40" + }, + { + "begin": 13678, + "end": 13693, + "name": "SWAP1" + }, + { + "begin": 13678, + "end": 13693, + "name": "KECCAK256" + }, + { + "begin": 13678, + "end": 13693, + "name": "SLOAD" + }, + { + "begin": 13678, + "end": 13703, + "name": "DUP2" + }, + { + "begin": 13678, + "end": 13703, + "name": "SWAP1" + }, + { + "begin": 13678, + "end": 13703, + "name": "LT" + }, + { + "begin": 13678, + "end": 13703, + "name": "ISZERO" + }, + { + "begin": 13670, + "end": 13704, + "name": "PUSH [tag]", + "value": "219" + }, + { + "begin": 13670, + "end": 13704, + "name": "JUMPI" + }, + { + "begin": 13670, + "end": 13704, + "name": "PUSH", + "value": "0" + }, + { + "begin": 13670, + "end": 13704, + "name": "DUP1" + }, + { + "begin": 13670, + "end": 13704, + "name": "REVERT" + }, + { + "begin": 13670, + "end": 13704, + "name": "tag", + "value": "219" + }, + { + "begin": 13670, + "end": 13704, + "name": "JUMPDEST" + }, + { + "begin": 13715, + "end": 13727, + "name": "PUSH", + "value": "1" + }, + { + "begin": 13715, + "end": 13737, + "name": "DUP1" + }, + { + "begin": 13715, + "end": 13737, + "name": "SLOAD" + }, + { + "begin": 13715, + "end": 13737, + "name": "DUP3" + }, + { + "begin": 13715, + "end": 13737, + "name": "SWAP1" + }, + { + "begin": 13715, + "end": 13737, + "name": "SUB" + }, + { + "begin": 13715, + "end": 13737, + "name": "SWAP1" + }, + { + "begin": 13715, + "end": 13737, + "name": "SSTORE" + }, + { + "begin": 13715, + "end": 13727, + "name": "PUSH", + "value": "0" + }, + { + "begin": 13756, + "end": 13761, + "name": "DUP1" + }, + { + "begin": 13756, + "end": 13761, + "name": "SLOAD" + }, + { + "begin": 13756, + "end": 13761, + "name": "PUSH", + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + }, + { + "begin": 13756, + "end": 13761, + "name": "AND" + }, + { + "begin": 13747, + "end": 13762, + "name": "DUP2" + }, + { + "begin": 13747, + "end": 13762, + "name": "MSTORE" + }, + { + "begin": 13747, + "end": 13755, + "name": "PUSH", + "value": "2" + }, + { + "begin": 13747, + "end": 13762, + "name": "PUSH", + "value": "20" + }, + { + "begin": 13747, + "end": 13762, + "name": "MSTORE" + }, + { + "begin": 13747, + "end": 13762, + "name": "PUSH", + "value": "40" + }, + { + "begin": 13747, + "end": 13762, + "name": "SWAP1" + }, + { + "begin": 13747, + "end": 13762, + "name": "DUP2" + }, + { + "begin": 13747, + "end": 13762, + "name": "SWAP1" + }, + { + "begin": 13747, + "end": 13762, + "name": "KECCAK256" + }, + { + "begin": 13747, + "end": 13772, + "name": "DUP1" + }, + { + "begin": 13747, + "end": 13772, + "name": "SLOAD" + }, + { + "begin": 13747, + "end": 13772, + "name": "DUP4" + }, + { + "begin": 13747, + "end": 13772, + "name": "SWAP1" + }, + { + "begin": 13747, + "end": 13772, + "name": "SUB" + }, + { + "begin": 13747, + "end": 13772, + "name": "SWAP1" + }, + { + "begin": 13747, + "end": 13772, + "name": "SSTORE" + }, + { + "begin": 13782, + "end": 13796, + "name": "PUSH", + "value": "702D5967F45F6513A38FFC42D6BA9BF230BD40E8F53B16363C7EB4FD2DEB9A44" + }, + { + "begin": 13782, + "end": 13796, + "name": "SWAP1" + }, + { + "begin": 13731, + "end": 13737, + "name": "DUP3" + }, + { + "begin": 13731, + "end": 13737, + "name": "SWAP1" + }, + { + "begin": 13782, + "end": 13796, + "name": "MLOAD" + }, + { + "begin": 13782, + "end": 13796, + "name": "SWAP1" + }, + { + "begin": 13782, + "end": 13796, + "name": "DUP2" + }, + { + "begin": 13782, + "end": 13796, + "name": "MSTORE" + }, + { + "begin": 13782, + "end": 13796, + "name": "PUSH", + "value": "20" + }, + { + "begin": 13782, + "end": 13796, + "name": "ADD" + }, + { + "begin": 13782, + "end": 13796, + "name": "PUSH", + "value": "40" + }, + { + "begin": 13782, + "end": 13796, + "name": "MLOAD" + }, + { + "begin": 13782, + "end": 13796, + "name": "DUP1" + }, + { + "begin": 13782, + "end": 13796, + "name": "SWAP2" + }, + { + "begin": 13782, + "end": 13796, + "name": "SUB" + }, + { + "begin": 13782, + "end": 13796, + "name": "SWAP1" + }, + { + "begin": 13782, + "end": 13796, + "name": "LOG1" + }, + { + "begin": 13573, + "end": 13803, + "name": "POP" + }, + { + "begin": 13573, + "end": 13803, + "name": "JUMP", + "value": "[out]" + }, + { + "begin": 12130, + "end": 12417, + "name": "tag", + "value": "119" + }, + { + "begin": 12130, + "end": 12417, + "name": "JUMPDEST" + }, + { + "begin": 12238, + "end": 12248, + "name": "PUSH", + "value": "A" + }, + { + "begin": 12238, + "end": 12248, + "name": "SLOAD" + }, + { + "begin": 12208, + "end": 12222, + "name": "PUSH", + "value": "0" + }, + { + "begin": 12208, + "end": 12222, + "name": "SWAP1" + }, + { + "begin": 12238, + "end": 12248, + "name": "PUSH", + "value": "10000000000000000000000000000000000000000" + }, + { + "begin": 12238, + "end": 12248, + "name": "SWAP1" + }, + { + "begin": 12238, + "end": 12248, + "name": "DIV" + }, + { + "begin": 12238, + "end": 12248, + "name": "PUSH", + "value": "FF" + }, + { + "begin": 12238, + "end": 12248, + "name": "AND" + }, + { + "begin": 12234, + "end": 12411, + "name": "ISZERO" + }, + { + "begin": 12234, + "end": 12411, + "name": "PUSH [tag]", + "value": "221" + }, + { + "begin": 12234, + "end": 12411, + "name": "JUMPI" + }, + { + "begin": 12285, + "end": 12300, + "name": "PUSH", + "value": "A" + }, + { + "begin": 12285, + "end": 12300, + "name": "SLOAD" + }, + { + "begin": 12285, + "end": 12300, + "name": "PUSH", + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + }, + { + "begin": 12285, + "end": 12300, + "name": "AND" + }, + { + "begin": 12271, + "end": 12311, + "name": "PUSH", + "value": "DD62ED3E" + }, + { + "begin": 12312, + "end": 12318, + "name": "DUP5" + }, + { + "begin": 12320, + "end": 12328, + "name": "DUP5" + }, + { + "begin": 12285, + "end": 12300, + "name": "PUSH", + "value": "0" + }, + { + "begin": 12271, + "end": 12329, + "name": "PUSH", + "value": "40" + }, + { + "begin": 12271, + "end": 12329, + "name": "MLOAD" + }, + { + "begin": 12271, + "end": 12329, + "name": "PUSH", + "value": "20" + }, + { + "begin": 12271, + "end": 12329, + "name": "ADD" + }, + { + "begin": 12271, + "end": 12329, + "name": "MSTORE" + }, + { + "begin": 12271, + "end": 12329, + "name": "PUSH", + "value": "40" + }, + { + "begin": 12271, + "end": 12329, + "name": "MLOAD" + }, + { + "begin": 12271, + "end": 12329, + "name": "PUSH", + "value": "100000000000000000000000000000000000000000000000000000000" + }, + { + "begin": 12271, + "end": 12329, + "name": "PUSH", + "value": "FFFFFFFF" + }, + { + "begin": 12271, + "end": 12329, + "name": "DUP6" + }, + { + "begin": 12271, + "end": 12329, + "name": "AND" + }, + { + "begin": 12271, + "end": 12329, + "name": "MUL" + }, + { + "begin": 12271, + "end": 12329, + "name": "DUP2" + }, + { + "begin": 12271, + "end": 12329, + "name": "MSTORE" + }, + { + "begin": 12271, + "end": 12329, + "name": "PUSH", + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + }, + { + "begin": 12271, + "end": 12329, + "name": "SWAP3" + }, + { + "begin": 12271, + "end": 12329, + "name": "DUP4" + }, + { + "begin": 12271, + "end": 12329, + "name": "AND" + }, + { + "begin": 12271, + "end": 12329, + "name": "PUSH", + "value": "4" + }, + { + "begin": 12271, + "end": 12329, + "name": "DUP3" + }, + { + "begin": 12271, + "end": 12329, + "name": "ADD" + }, + { + "begin": 12271, + "end": 12329, + "name": "MSTORE" + }, + { + "begin": 12271, + "end": 12329, + "name": "SWAP2" + }, + { + "begin": 12271, + "end": 12329, + "name": "AND" + }, + { + "begin": 12271, + "end": 12329, + "name": "PUSH", + "value": "24" + }, + { + "begin": 12271, + "end": 12329, + "name": "DUP3" + }, + { + "begin": 12271, + "end": 12329, + "name": "ADD" + }, + { + "begin": 12271, + "end": 12329, + "name": "MSTORE" + }, + { + "begin": 12271, + "end": 12329, + "name": "PUSH", + "value": "44" + }, + { + "begin": 12271, + "end": 12329, + "name": "ADD" + }, + { + "begin": 12271, + "end": 12329, + "name": "PUSH", + "value": "20" + }, + { + "begin": 12271, + "end": 12329, + "name": "PUSH", + "value": "40" + }, + { + "begin": 12271, + "end": 12329, + "name": "MLOAD" + }, + { + "begin": 12271, + "end": 12329, + "name": "DUP1" + }, + { + "begin": 12271, + "end": 12329, + "name": "DUP4" + }, + { + "begin": 12271, + "end": 12329, + "name": "SUB" + }, + { + "begin": 12271, + "end": 12329, + "name": "DUP2" + }, + { + "begin": 12271, + "end": 12329, + "name": "PUSH", + "value": "0" + }, + { + "begin": 12271, + "end": 12329, + "name": "DUP8" + }, + { + "begin": 12271, + "end": 12329, + "name": "DUP1" + }, + { + "begin": 12271, + "end": 12329, + "name": "EXTCODESIZE" + }, + { + "begin": 12271, + "end": 12329, + "name": "ISZERO" + }, + { + "begin": 12271, + "end": 12329, + "name": "ISZERO" + }, + { + "begin": 12271, + "end": 12329, + "name": "PUSH [tag]", + "value": "222" + }, + { + "begin": 12271, + "end": 12329, + "name": "JUMPI" + }, + { + "begin": 12271, + "end": 12329, + "name": "PUSH", + "value": "0" + }, + { + "begin": 12271, + "end": 12329, + "name": "DUP1" + }, + { + "begin": 12271, + "end": 12329, + "name": "REVERT" + }, + { + "begin": 12271, + "end": 12329, + "name": "tag", + "value": "222" + }, + { + "begin": 12271, + "end": 12329, + "name": "JUMPDEST" + }, + { + "begin": 12271, + "end": 12329, + "name": "PUSH", + "value": "2C6" + }, + { + "begin": 12271, + "end": 12329, + "name": "GAS" + }, + { + "begin": 12271, + "end": 12329, + "name": "SUB" + }, + { + "begin": 12271, + "end": 12329, + "name": "CALL" + }, + { + "begin": 12271, + "end": 12329, + "name": "ISZERO" + }, + { + "begin": 12271, + "end": 12329, + "name": "ISZERO" + }, + { + "begin": 12271, + "end": 12329, + "name": "PUSH [tag]", + "value": "223" + }, + { + "begin": 12271, + "end": 12329, + "name": "JUMPI" + }, + { + "begin": 12271, + "end": 12329, + "name": "PUSH", + "value": "0" + }, + { + "begin": 12271, + "end": 12329, + "name": "DUP1" + }, + { + "begin": 12271, + "end": 12329, + "name": "REVERT" + }, + { + "begin": 12271, + "end": 12329, + "name": "tag", + "value": "223" + }, + { + "begin": 12271, + "end": 12329, + "name": "JUMPDEST" + }, + { + "begin": 12271, + "end": 12329, + "name": "POP" + }, + { + "begin": 12271, + "end": 12329, + "name": "POP" + }, + { + "begin": 12271, + "end": 12329, + "name": "POP" + }, + { + "begin": 12271, + "end": 12329, + "name": "PUSH", + "value": "40" + }, + { + "begin": 12271, + "end": 12329, + "name": "MLOAD" + }, + { + "begin": 12271, + "end": 12329, + "name": "DUP1" + }, + { + "begin": 12271, + "end": 12329, + "name": "MLOAD" + }, + { + "begin": 12271, + "end": 12329, + "name": "SWAP1" + }, + { + "begin": 12271, + "end": 12329, + "name": "POP" + }, + { + "begin": 12264, + "end": 12329, + "name": "SWAP1" + }, + { + "begin": 12264, + "end": 12329, + "name": "POP" + }, + { + "begin": 12264, + "end": 12329, + "name": "PUSH [tag]", + "value": "224" + }, + { + "begin": 12264, + "end": 12329, + "name": "JUMP" + }, + { + "begin": 12234, + "end": 12411, + "name": "tag", + "value": "221" + }, + { + "begin": 12234, + "end": 12411, + "name": "JUMPDEST" + }, + { + "begin": 12367, + "end": 12400, + "name": "PUSH [tag]", + "value": "225" + }, + { + "begin": 12383, + "end": 12389, + "name": "DUP4" + }, + { + "begin": 12391, + "end": 12399, + "name": "DUP4" + }, + { + "begin": 12367, + "end": 12382, + "name": "PUSH [tag]", + "value": "226" + }, + { + "begin": 12367, + "end": 12400, + "name": "JUMP", + "value": "[in]" + }, + { + "begin": 12367, + "end": 12400, + "name": "tag", + "value": "225" + }, + { + "begin": 12367, + "end": 12400, + "name": "JUMPDEST" + }, + { + "begin": 12360, + "end": 12400, + "name": "SWAP1" + }, + { + "begin": 12360, + "end": 12400, + "name": "POP" + }, + { + "begin": 12234, + "end": 12411, + "name": "tag", + "value": "224" + }, + { + "begin": 12234, + "end": 12411, + "name": "JUMPDEST" + }, + { + "begin": 12130, + "end": 12417, + "name": "SWAP3" + }, + { + "begin": 12130, + "end": 12417, + "name": "SWAP2" + }, + { + "begin": 12130, + "end": 12417, + "name": "POP" + }, + { + "begin": 12130, + "end": 12417, + "name": "POP" + }, + { + "begin": 12130, + "end": 12417, + "name": "JUMP", + "value": "[out]" + }, + { + "begin": 3041, + "end": 3072, + "name": "tag", + "value": "122" + }, + { + "begin": 3041, + "end": 3072, + "name": "JUMPDEST" + }, + { + "begin": 3041, + "end": 3072, + "name": "PUSH", + "value": "3" + }, + { + "begin": 3041, + "end": 3072, + "name": "SLOAD" + }, + { + "begin": 3041, + "end": 3072, + "name": "DUP2" + }, + { + "begin": 3041, + "end": 3072, + "name": "JUMP", + "value": "[out]" + }, + { + "begin": 8448, + "end": 8494, + "name": "tag", + "value": "125" + }, + { + "begin": 8448, + "end": 8494, + "name": "JUMPDEST" + }, + { + "begin": 8448, + "end": 8494, + "name": "PUSH", + "value": "6" + }, + { + "begin": 8448, + "end": 8494, + "name": "PUSH", + "value": "20" + }, + { + "begin": 8448, + "end": 8494, + "name": "MSTORE" + }, + { + "begin": 8448, + "end": 8494, + "name": "PUSH", + "value": "0" + }, + { + "begin": 8448, + "end": 8494, + "name": "SWAP1" + }, + { + "begin": 8448, + "end": 8494, + "name": "DUP2" + }, + { + "begin": 8448, + "end": 8494, + "name": "MSTORE" + }, + { + "begin": 8448, + "end": 8494, + "name": "PUSH", + "value": "40" + }, + { + "begin": 8448, + "end": 8494, + "name": "SWAP1" + }, + { + "begin": 8448, + "end": 8494, + "name": "KECCAK256" + }, + { + "begin": 8448, + "end": 8494, + "name": "SLOAD" + }, + { + "begin": 8448, + "end": 8494, + "name": "PUSH", + "value": "FF" + }, + { + "begin": 8448, + "end": 8494, + "name": "AND" + }, + { + "begin": 8448, + "end": 8494, + "name": "DUP2" + }, + { + "begin": 8448, + "end": 8494, + "name": "JUMP", + "value": "[out]" + }, + { + "begin": 8653, + "end": 8810, + "name": "tag", + "value": "128" + }, + { + "begin": 8653, + "end": 8810, + "name": "JUMPDEST" + }, + { + "begin": 1546, + "end": 1551, + "name": "PUSH", + "value": "0" + }, + { + "begin": 1546, + "end": 1551, + "name": "SLOAD" + }, + { + "begin": 1532, + "end": 1542, + "name": "CALLER" + }, + { + "begin": 1546, + "end": 1551, + "name": "PUSH", + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + }, + { + "begin": 1532, + "end": 1551, + "name": "SWAP1" + }, + { + "begin": 1532, + "end": 1551, + "name": "DUP2" + }, + { + "begin": 1532, + "end": 1551, + "name": "AND" + }, + { + "begin": 1546, + "end": 1551, + "name": "SWAP2" + }, + { + "begin": 1546, + "end": 1551, + "name": "AND" + }, + { + "begin": 1532, + "end": 1551, + "name": "EQ" + }, + { + "begin": 1524, + "end": 1552, + "name": "PUSH [tag]", + "value": "228" + }, + { + "begin": 1524, + "end": 1552, + "name": "JUMPI" + }, + { + "begin": 1524, + "end": 1552, + "name": "PUSH", + "value": "0" + }, + { + "begin": 1524, + "end": 1552, + "name": "DUP1" + }, + { + "begin": 1524, + "end": 1552, + "name": "REVERT" + }, + { + "begin": 1524, + "end": 1552, + "name": "tag", + "value": "228" + }, + { + "begin": 1524, + "end": 1552, + "name": "JUMPDEST" + }, + { + "begin": 8728, + "end": 8755, + "name": "PUSH", + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + }, + { + "begin": 8728, + "end": 8755, + "name": "DUP2" + }, + { + "begin": 8728, + "end": 8755, + "name": "AND" + }, + { + "begin": 8758, + "end": 8763, + "name": "PUSH", + "value": "0" + }, + { + "begin": 8728, + "end": 8755, + "name": "SWAP1" + }, + { + "begin": 8728, + "end": 8755, + "name": "DUP2" + }, + { + "begin": 8728, + "end": 8755, + "name": "MSTORE" + }, + { + "begin": 8728, + "end": 8741, + "name": "PUSH", + "value": "6" + }, + { + "begin": 8728, + "end": 8755, + "name": "PUSH", + "value": "20" + }, + { + "begin": 8728, + "end": 8755, + "name": "MSTORE" + }, + { + "begin": 8728, + "end": 8755, + "name": "PUSH", + "value": "40" + }, + { + "begin": 8728, + "end": 8755, + "name": "SWAP1" + }, + { + "begin": 8728, + "end": 8755, + "name": "DUP2" + }, + { + "begin": 8728, + "end": 8755, + "name": "SWAP1" + }, + { + "begin": 8728, + "end": 8755, + "name": "KECCAK256" + }, + { + "begin": 8728, + "end": 8763, + "name": "DUP1" + }, + { + "begin": 8728, + "end": 8763, + "name": "SLOAD" + }, + { + "begin": 8728, + "end": 8763, + "name": "PUSH", + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00" + }, + { + "begin": 8728, + "end": 8763, + "name": "AND" + }, + { + "begin": 8728, + "end": 8763, + "name": "SWAP1" + }, + { + "begin": 8728, + "end": 8763, + "name": "SSTORE" + }, + { + "begin": 8773, + "end": 8803, + "name": "PUSH", + "value": "D7E9EC6E6ECD65492DCE6BF513CD6867560D49544421D0783DDF06E76C24470C" + }, + { + "begin": 8773, + "end": 8803, + "name": "SWAP1" + }, + { + "begin": 8742, + "end": 8754, + "name": "DUP3" + }, + { + "begin": 8742, + "end": 8754, + "name": "SWAP1" + }, + { + "begin": 8773, + "end": 8803, + "name": "MLOAD" + }, + { + "begin": 8773, + "end": 8803, + "name": "PUSH", + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + }, + { + "begin": 8773, + "end": 8803, + "name": "SWAP1" + }, + { + "begin": 8773, + "end": 8803, + "name": "SWAP2" + }, + { + "begin": 8773, + "end": 8803, + "name": "AND" + }, + { + "begin": 8773, + "end": 8803, + "name": "DUP2" + }, + { + "begin": 8773, + "end": 8803, + "name": "MSTORE" + }, + { + "begin": 8773, + "end": 8803, + "name": "PUSH", + "value": "20" + }, + { + "begin": 8773, + "end": 8803, + "name": "ADD" + }, + { + "begin": 8773, + "end": 8803, + "name": "PUSH", + "value": "40" + }, + { + "begin": 8773, + "end": 8803, + "name": "MLOAD" + }, + { + "begin": 8773, + "end": 8803, + "name": "DUP1" + }, + { + "begin": 8773, + "end": 8803, + "name": "SWAP2" + }, + { + "begin": 8773, + "end": 8803, + "name": "SUB" + }, + { + "begin": 8773, + "end": 8803, + "name": "SWAP1" + }, + { + "begin": 8773, + "end": 8803, + "name": "LOG1" + }, + { + "begin": 8653, + "end": 8810, + "name": "POP" + }, + { + "begin": 8653, + "end": 8810, + "name": "JUMP", + "value": "[out]" + }, + { + "begin": 4720, + "end": 4762, + "name": "tag", + "value": "131" + }, + { + "begin": 4720, + "end": 4762, + "name": "JUMPDEST" + }, + { + "begin": 4752, + "end": 4762, + "name": "PUSH", + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + }, + { + "begin": 4720, + "end": 4762, + "name": "DUP2" + }, + { + "begin": 4720, + "end": 4762, + "name": "JUMP", + "value": "[out]" + }, + { + "begin": 1738, + "end": 1885, + "name": "tag", + "value": "134" + }, + { + "begin": 1738, + "end": 1885, + "name": "JUMPDEST" + }, + { + "begin": 1546, + "end": 1551, + "name": "PUSH", + "value": "0" + }, + { + "begin": 1546, + "end": 1551, + "name": "SLOAD" + }, + { + "begin": 1532, + "end": 1542, + "name": "CALLER" + }, + { + "begin": 1546, + "end": 1551, + "name": "PUSH", + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + }, + { + "begin": 1532, + "end": 1551, + "name": "SWAP1" + }, + { + "begin": 1532, + "end": 1551, + "name": "DUP2" + }, + { + "begin": 1532, + "end": 1551, + "name": "AND" + }, + { + "begin": 1546, + "end": 1551, + "name": "SWAP2" + }, + { + "begin": 1546, + "end": 1551, + "name": "AND" + }, + { + "begin": 1532, + "end": 1551, + "name": "EQ" + }, + { + "begin": 1524, + "end": 1552, + "name": "PUSH [tag]", + "value": "231" + }, + { + "begin": 1524, + "end": 1552, + "name": "JUMPI" + }, + { + "begin": 1524, + "end": 1552, + "name": "PUSH", + "value": "0" + }, + { + "begin": 1524, + "end": 1552, + "name": "DUP1" + }, + { + "begin": 1524, + "end": 1552, + "name": "REVERT" + }, + { + "begin": 1524, + "end": 1552, + "name": "tag", + "value": "231" + }, + { + "begin": 1524, + "end": 1552, + "name": "JUMPDEST" + }, + { + "begin": 1814, + "end": 1836, + "name": "PUSH", + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + }, + { + "begin": 1814, + "end": 1836, + "name": "DUP2" + }, + { + "begin": 1814, + "end": 1836, + "name": "AND" + }, + { + "begin": 1814, + "end": 1836, + "name": "ISZERO" + }, + { + "begin": 1810, + "end": 1879, + "name": "PUSH [tag]", + "value": "233" + }, + { + "begin": 1810, + "end": 1879, + "name": "JUMPI" + }, + { + "begin": 1852, + "end": 1857, + "name": "PUSH", + "value": "0" + }, + { + "begin": 1852, + "end": 1868, + "name": "DUP1" + }, + { + "begin": 1852, + "end": 1868, + "name": "SLOAD" + }, + { + "begin": 1852, + "end": 1868, + "name": "PUSH", + "value": "FFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000" + }, + { + "begin": 1852, + "end": 1868, + "name": "AND" + }, + { + "begin": 1852, + "end": 1868, + "name": "PUSH", + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + }, + { + "begin": 1852, + "end": 1868, + "name": "DUP4" + }, + { + "begin": 1852, + "end": 1868, + "name": "AND" + }, + { + "begin": 1852, + "end": 1868, + "name": "OR" + }, + { + "begin": 1852, + "end": 1868, + "name": "SWAP1" + }, + { + "begin": 1852, + "end": 1868, + "name": "SSTORE" + }, + { + "begin": 1810, + "end": 1879, + "name": "tag", + "value": "233" + }, + { + "begin": 1810, + "end": 1879, + "name": "JUMPDEST" + }, + { + "begin": 1738, + "end": 1885, + "name": "POP" + }, + { + "begin": 1738, + "end": 1885, + "name": "JUMP", + "value": "[out]" + }, + { + "begin": 8816, + "end": 9134, + "name": "tag", + "value": "137" + }, + { + "begin": 8816, + "end": 9134, + "name": "JUMPDEST" + }, + { + "begin": 8947, + "end": 8962, + "name": "PUSH", + "value": "0" + }, + { + "begin": 1546, + "end": 1551, + "name": "DUP1" + }, + { + "begin": 1546, + "end": 1551, + "name": "SLOAD" + }, + { + "begin": 1532, + "end": 1542, + "name": "CALLER" + }, + { + "begin": 1546, + "end": 1551, + "name": "PUSH", + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + }, + { + "begin": 1532, + "end": 1551, + "name": "SWAP1" + }, + { + "begin": 1532, + "end": 1551, + "name": "DUP2" + }, + { + "begin": 1532, + "end": 1551, + "name": "AND" + }, + { + "begin": 1546, + "end": 1551, + "name": "SWAP2" + }, + { + "begin": 1546, + "end": 1551, + "name": "AND" + }, + { + "begin": 1532, + "end": 1551, + "name": "EQ" + }, + { + "begin": 1524, + "end": 1552, + "name": "PUSH [tag]", + "value": "235" + }, + { + "begin": 1524, + "end": 1552, + "name": "JUMPI" + }, + { + "begin": 1524, + "end": 1552, + "name": "PUSH", + "value": "0" + }, + { + "begin": 1524, + "end": 1552, + "name": "DUP1" + }, + { + "begin": 1524, + "end": 1552, + "name": "REVERT" + }, + { + "begin": 1524, + "end": 1552, + "name": "tag", + "value": "235" + }, + { + "begin": 1524, + "end": 1552, + "name": "JUMPDEST" + }, + { + "begin": 8905, + "end": 8936, + "name": "PUSH", + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + }, + { + "begin": 8905, + "end": 8936, + "name": "DUP3" + }, + { + "begin": 8905, + "end": 8936, + "name": "AND" + }, + { + "begin": 8905, + "end": 8936, + "name": "PUSH", + "value": "0" + }, + { + "begin": 8905, + "end": 8936, + "name": "SWAP1" + }, + { + "begin": 8905, + "end": 8936, + "name": "DUP2" + }, + { + "begin": 8905, + "end": 8936, + "name": "MSTORE" + }, + { + "begin": 8905, + "end": 8918, + "name": "PUSH", + "value": "6" + }, + { + "begin": 8905, + "end": 8936, + "name": "PUSH", + "value": "20" + }, + { + "begin": 8905, + "end": 8936, + "name": "MSTORE" + }, + { + "begin": 8905, + "end": 8936, + "name": "PUSH", + "value": "40" + }, + { + "begin": 8905, + "end": 8936, + "name": "SWAP1" + }, + { + "begin": 8905, + "end": 8936, + "name": "KECCAK256" + }, + { + "begin": 8905, + "end": 8936, + "name": "SLOAD" + }, + { + "begin": 8905, + "end": 8936, + "name": "PUSH", + "value": "FF" + }, + { + "begin": 8905, + "end": 8936, + "name": "AND" + }, + { + "begin": 8897, + "end": 8937, + "name": "ISZERO" + }, + { + "begin": 8897, + "end": 8937, + "name": "ISZERO" + }, + { + "begin": 8897, + "end": 8937, + "name": "PUSH [tag]", + "value": "237" + }, + { + "begin": 8897, + "end": 8937, + "name": "JUMPI" + }, + { + "begin": 8897, + "end": 8937, + "name": "PUSH", + "value": "0" + }, + { + "begin": 8897, + "end": 8937, + "name": "DUP1" + }, + { + "begin": 8897, + "end": 8937, + "name": "REVERT" + }, + { + "begin": 8897, + "end": 8937, + "name": "tag", + "value": "237" + }, + { + "begin": 8897, + "end": 8937, + "name": "JUMPDEST" + }, + { + "begin": 8965, + "end": 8992, + "name": "PUSH [tag]", + "value": "238" + }, + { + "begin": 8975, + "end": 8991, + "name": "DUP3" + }, + { + "begin": 8965, + "end": 8974, + "name": "PUSH [tag]", + "value": "88" + }, + { + "begin": 8965, + "end": 8992, + "name": "JUMP", + "value": "[in]" + }, + { + "begin": 8965, + "end": 8992, + "name": "tag", + "value": "238" + }, + { + "begin": 8965, + "end": 8992, + "name": "JUMPDEST" + }, + { + "begin": 9002, + "end": 9028, + "name": "PUSH", + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + }, + { + "begin": 9002, + "end": 9028, + "name": "DUP4" + }, + { + "begin": 9002, + "end": 9028, + "name": "AND" + }, + { + "begin": 9031, + "end": 9032, + "name": "PUSH", + "value": "0" + }, + { + "begin": 9002, + "end": 9028, + "name": "SWAP1" + }, + { + "begin": 9002, + "end": 9028, + "name": "DUP2" + }, + { + "begin": 9002, + "end": 9028, + "name": "MSTORE" + }, + { + "begin": 9002, + "end": 9010, + "name": "PUSH", + "value": "2" + }, + { + "begin": 9002, + "end": 9028, + "name": "PUSH", + "value": "20" + }, + { + "begin": 9002, + "end": 9028, + "name": "MSTORE" + }, + { + "begin": 9002, + "end": 9028, + "name": "PUSH", + "value": "40" + }, + { + "begin": 9002, + "end": 9028, + "name": "DUP1" + }, + { + "begin": 9002, + "end": 9028, + "name": "DUP3" + }, + { + "begin": 9002, + "end": 9028, + "name": "KECCAK256" + }, + { + "begin": 9002, + "end": 9032, + "name": "SWAP2" + }, + { + "begin": 9002, + "end": 9032, + "name": "SWAP1" + }, + { + "begin": 9002, + "end": 9032, + "name": "SWAP2" + }, + { + "begin": 9002, + "end": 9032, + "name": "SSTORE" + }, + { + "begin": 9042, + "end": 9054, + "name": "PUSH", + "value": "1" + }, + { + "begin": 9042, + "end": 9068, + "name": "DUP1" + }, + { + "begin": 9042, + "end": 9068, + "name": "SLOAD" + }, + { + "begin": 9042, + "end": 9068, + "name": "DUP4" + }, + { + "begin": 9042, + "end": 9068, + "name": "SWAP1" + }, + { + "begin": 9042, + "end": 9068, + "name": "SUB" + }, + { + "begin": 9042, + "end": 9068, + "name": "SWAP1" + }, + { + "begin": 9042, + "end": 9068, + "name": "SSTORE" + }, + { + "begin": 8947, + "end": 8992, + "name": "SWAP1" + }, + { + "begin": 8947, + "end": 8992, + "name": "SWAP2" + }, + { + "begin": -1, + "end": -1, + "name": "POP" + }, + { + "begin": 9078, + "end": 9127, + "name": "PUSH", + "value": "61E6E66B0D6339B2980AECC6CCC0039736791F0CCDE9ED512E789A7FBDD698C6" + }, + { + "begin": 9078, + "end": 9127, + "name": "SWAP1" + }, + { + "begin": 9011, + "end": 9027, + "name": "DUP4" + }, + { + "begin": 9011, + "end": 9027, + "name": "SWAP1" + }, + { + "begin": 8947, + "end": 8992, + "name": "DUP4" + }, + { + "begin": 8947, + "end": 8992, + "name": "SWAP1" + }, + { + "begin": 9078, + "end": 9127, + "name": "MLOAD" + }, + { + "begin": 9078, + "end": 9127, + "name": "PUSH", + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + }, + { + "begin": 9078, + "end": 9127, + "name": "SWAP1" + }, + { + "begin": 9078, + "end": 9127, + "name": "SWAP3" + }, + { + "begin": 9078, + "end": 9127, + "name": "AND" + }, + { + "begin": 9078, + "end": 9127, + "name": "DUP3" + }, + { + "begin": 9078, + "end": 9127, + "name": "MSTORE" + }, + { + "begin": 9078, + "end": 9127, + "name": "PUSH", + "value": "20" + }, + { + "begin": 9078, + "end": 9127, + "name": "DUP3" + }, + { + "begin": 9078, + "end": 9127, + "name": "ADD" + }, + { + "begin": 9078, + "end": 9127, + "name": "MSTORE" + }, + { + "begin": 9078, + "end": 9127, + "name": "PUSH", + "value": "40" + }, + { + "begin": 9078, + "end": 9127, + "name": "SWAP1" + }, + { + "begin": 9078, + "end": 9127, + "name": "DUP2" + }, + { + "begin": 9078, + "end": 9127, + "name": "ADD" + }, + { + "begin": 9078, + "end": 9127, + "name": "SWAP1" + }, + { + "begin": 9078, + "end": 9127, + "name": "MLOAD" + }, + { + "begin": 9078, + "end": 9127, + "name": "DUP1" + }, + { + "begin": 9078, + "end": 9127, + "name": "SWAP2" + }, + { + "begin": 9078, + "end": 9127, + "name": "SUB" + }, + { + "begin": 9078, + "end": 9127, + "name": "SWAP1" + }, + { + "begin": 9078, + "end": 9127, + "name": "LOG1" + }, + { + "begin": 8816, + "end": 9134, + "name": "POP" + }, + { + "begin": 8816, + "end": 9134, + "name": "POP" + }, + { + "begin": 8816, + "end": 9134, + "name": "JUMP", + "value": "[out]" + }, + { + "begin": 6164, + "end": 6727, + "name": "tag", + "value": "152" + }, + { + "begin": 6164, + "end": 6727, + "name": "JUMPDEST" + }, + { + "begin": 6235, + "end": 6241, + "name": "PUSH", + "value": "40" + }, + { + "begin": 3251, + "end": 3259, + "name": "PUSH", + "value": "44" + }, + { + "begin": 3233, + "end": 3241, + "name": "CALLDATASIZE" + }, + { + "begin": 3233, + "end": 3259, + "name": "LT" + }, + { + "begin": 3231, + "end": 3260, + "name": "ISZERO" + }, + { + "begin": 3223, + "end": 3261, + "name": "PUSH [tag]", + "value": "240" + }, + { + "begin": 3223, + "end": 3261, + "name": "JUMPI" + }, + { + "begin": 3223, + "end": 3261, + "name": "PUSH", + "value": "0" + }, + { + "begin": 3223, + "end": 3261, + "name": "DUP1" + }, + { + "begin": 3223, + "end": 3261, + "name": "REVERT" + }, + { + "begin": 3223, + "end": 3261, + "name": "tag", + "value": "240" + }, + { + "begin": 3223, + "end": 3261, + "name": "JUMPDEST" + }, + { + "begin": 6569, + "end": 6580, + "name": "DUP2" + }, + { + "begin": 6569, + "end": 6580, + "name": "ISZERO" + }, + { + "begin": 6569, + "end": 6580, + "name": "DUP1" + }, + { + "begin": 6569, + "end": 6580, + "name": "ISZERO" + }, + { + "begin": 6569, + "end": 6580, + "name": "SWAP1" + }, + { + "begin": 6568, + "end": 6621, + "name": "PUSH [tag]", + "value": "242" + }, + { + "begin": 6568, + "end": 6621, + "name": "JUMPI" + }, + { + "begin": -1, + "end": -1, + "name": "POP" + }, + { + "begin": 6586, + "end": 6605, + "name": "PUSH", + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + }, + { + "begin": 6594, + "end": 6604, + "name": "CALLER" + }, + { + "begin": 6586, + "end": 6605, + "name": "DUP2" + }, + { + "begin": 6586, + "end": 6605, + "name": "AND" + }, + { + "begin": 6586, + "end": 6605, + "name": "PUSH", + "value": "0" + }, + { + "begin": 6586, + "end": 6605, + "name": "SWAP1" + }, + { + "begin": 6586, + "end": 6605, + "name": "DUP2" + }, + { + "begin": 6586, + "end": 6605, + "name": "MSTORE" + }, + { + "begin": 6586, + "end": 6593, + "name": "PUSH", + "value": "5" + }, + { + "begin": 6586, + "end": 6605, + "name": "PUSH", + "value": "20" + }, + { + "begin": 6586, + "end": 6605, + "name": "SWAP1" + }, + { + "begin": 6586, + "end": 6605, + "name": "DUP2" + }, + { + "begin": 6586, + "end": 6605, + "name": "MSTORE" + }, + { + "begin": 6586, + "end": 6605, + "name": "PUSH", + "value": "40" + }, + { + "begin": 6586, + "end": 6605, + "name": "DUP1" + }, + { + "begin": 6586, + "end": 6605, + "name": "DUP4" + }, + { + "begin": 6586, + "end": 6605, + "name": "KECCAK256" + }, + { + "begin": 6586, + "end": 6615, + "name": "SWAP4" + }, + { + "begin": 6586, + "end": 6615, + "name": "DUP8" + }, + { + "begin": 6586, + "end": 6615, + "name": "AND" + }, + { + "begin": 6586, + "end": 6615, + "name": "DUP4" + }, + { + "begin": 6586, + "end": 6615, + "name": "MSTORE" + }, + { + "begin": 6586, + "end": 6615, + "name": "SWAP3" + }, + { + "begin": 6586, + "end": 6615, + "name": "SWAP1" + }, + { + "begin": 6586, + "end": 6615, + "name": "MSTORE" + }, + { + "begin": 6586, + "end": 6615, + "name": "KECCAK256" + }, + { + "begin": 6586, + "end": 6615, + "name": "SLOAD" + }, + { + "begin": 6586, + "end": 6620, + "name": "ISZERO" + }, + { + "begin": 6586, + "end": 6620, + "name": "ISZERO" + }, + { + "begin": 6568, + "end": 6621, + "name": "tag", + "value": "242" + }, + { + "begin": 6568, + "end": 6621, + "name": "JUMPDEST" + }, + { + "begin": 6566, + "end": 6622, + "name": "ISZERO" + }, + { + "begin": 6558, + "end": 6623, + "name": "PUSH [tag]", + "value": "243" + }, + { + "begin": 6558, + "end": 6623, + "name": "JUMPI" + }, + { + "begin": 6558, + "end": 6623, + "name": "PUSH", + "value": "0" + }, + { + "begin": 6558, + "end": 6623, + "name": "DUP1" + }, + { + "begin": 6558, + "end": 6623, + "name": "REVERT" + }, + { + "begin": 6558, + "end": 6623, + "name": "tag", + "value": "243" + }, + { + "begin": 6558, + "end": 6623, + "name": "JUMPDEST" + }, + { + "begin": 6634, + "end": 6653, + "name": "PUSH", + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + }, + { + "begin": 6642, + "end": 6652, + "name": "CALLER" + }, + { + "begin": 6634, + "end": 6653, + "name": "DUP2" + }, + { + "begin": 6634, + "end": 6653, + "name": "AND" + }, + { + "begin": 6634, + "end": 6653, + "name": "PUSH", + "value": "0" + }, + { + "begin": 6634, + "end": 6653, + "name": "DUP2" + }, + { + "begin": 6634, + "end": 6653, + "name": "DUP2" + }, + { + "begin": 6634, + "end": 6653, + "name": "MSTORE" + }, + { + "begin": 6634, + "end": 6641, + "name": "PUSH", + "value": "5" + }, + { + "begin": 6634, + "end": 6653, + "name": "PUSH", + "value": "20" + }, + { + "begin": 6634, + "end": 6653, + "name": "SWAP1" + }, + { + "begin": 6634, + "end": 6653, + "name": "DUP2" + }, + { + "begin": 6634, + "end": 6653, + "name": "MSTORE" + }, + { + "begin": 6634, + "end": 6653, + "name": "PUSH", + "value": "40" + }, + { + "begin": 6634, + "end": 6653, + "name": "DUP1" + }, + { + "begin": 6634, + "end": 6653, + "name": "DUP4" + }, + { + "begin": 6634, + "end": 6653, + "name": "KECCAK256" + }, + { + "begin": 6634, + "end": 6663, + "name": "SWAP5" + }, + { + "begin": 6634, + "end": 6663, + "name": "DUP9" + }, + { + "begin": 6634, + "end": 6663, + "name": "AND" + }, + { + "begin": 6634, + "end": 6663, + "name": "DUP1" + }, + { + "begin": 6634, + "end": 6663, + "name": "DUP5" + }, + { + "begin": 6634, + "end": 6663, + "name": "MSTORE" + }, + { + "begin": 6634, + "end": 6663, + "name": "SWAP5" + }, + { + "begin": 6634, + "end": 6663, + "name": "SWAP1" + }, + { + "begin": 6634, + "end": 6663, + "name": "SWAP2" + }, + { + "begin": 6634, + "end": 6663, + "name": "MSTORE" + }, + { + "begin": 6634, + "end": 6663, + "name": "SWAP1" + }, + { + "begin": 6634, + "end": 6663, + "name": "DUP2" + }, + { + "begin": 6634, + "end": 6663, + "name": "SWAP1" + }, + { + "begin": 6634, + "end": 6663, + "name": "KECCAK256" + }, + { + "begin": 6634, + "end": 6672, + "name": "DUP6" + }, + { + "begin": 6634, + "end": 6672, + "name": "SWAP1" + }, + { + "begin": 6634, + "end": 6672, + "name": "SSTORE" + }, + { + "begin": 6682, + "end": 6720, + "name": "PUSH", + "value": "8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925" + }, + { + "begin": 6682, + "end": 6720, + "name": "SWAP1" + }, + { + "begin": 6666, + "end": 6672, + "name": "DUP6" + }, + { + "begin": 6666, + "end": 6672, + "name": "SWAP1" + }, + { + "begin": 6682, + "end": 6720, + "name": "MLOAD" + }, + { + "begin": 6682, + "end": 6720, + "name": "SWAP1" + }, + { + "begin": 6682, + "end": 6720, + "name": "DUP2" + }, + { + "begin": 6682, + "end": 6720, + "name": "MSTORE" + }, + { + "begin": 6682, + "end": 6720, + "name": "PUSH", + "value": "20" + }, + { + "begin": 6682, + "end": 6720, + "name": "ADD" + }, + { + "begin": 6682, + "end": 6720, + "name": "PUSH", + "value": "40" + }, + { + "begin": 6682, + "end": 6720, + "name": "MLOAD" + }, + { + "begin": 6682, + "end": 6720, + "name": "DUP1" + }, + { + "begin": 6682, + "end": 6720, + "name": "SWAP2" + }, + { + "begin": 6682, + "end": 6720, + "name": "SUB" + }, + { + "begin": 6682, + "end": 6720, + "name": "SWAP1" + }, + { + "begin": 6682, + "end": 6720, + "name": "LOG3" + }, + { + "begin": 6164, + "end": 6727, + "name": "POP" + }, + { + "begin": 6164, + "end": 6727, + "name": "POP" + }, + { + "begin": 6164, + "end": 6727, + "name": "POP" + }, + { + "begin": 6164, + "end": 6727, + "name": "JUMP", + "value": "[out]" + }, + { + "begin": 5044, + "end": 5924, + "name": "tag", + "value": "170" + }, + { + "begin": 5044, + "end": 5924, + "name": "JUMPDEST" + }, + { + "begin": 5148, + "end": 5162, + "name": "PUSH", + "value": "0" + }, + { + "begin": 5148, + "end": 5162, + "name": "DUP1" + }, + { + "begin": 5148, + "end": 5162, + "name": "DUP1" + }, + { + "begin": 5130, + "end": 5136, + "name": "PUSH", + "value": "60" + }, + { + "begin": 3251, + "end": 3259, + "name": "PUSH", + "value": "64" + }, + { + "begin": 3233, + "end": 3241, + "name": "CALLDATASIZE" + }, + { + "begin": 3233, + "end": 3259, + "name": "LT" + }, + { + "begin": 3231, + "end": 3260, + "name": "ISZERO" + }, + { + "begin": 3223, + "end": 3261, + "name": "PUSH [tag]", + "value": "245" + }, + { + "begin": 3223, + "end": 3261, + "name": "JUMPI" + }, + { + "begin": 3223, + "end": 3261, + "name": "PUSH", + "value": "0" + }, + { + "begin": 3223, + "end": 3261, + "name": "DUP1" + }, + { + "begin": 3223, + "end": 3261, + "name": "REVERT" + }, + { + "begin": 3223, + "end": 3261, + "name": "tag", + "value": "245" + }, + { + "begin": 3223, + "end": 3261, + "name": "JUMPDEST" + }, + { + "begin": 5165, + "end": 5179, + "name": "PUSH", + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + }, + { + "begin": 5165, + "end": 5179, + "name": "DUP1" + }, + { + "begin": 5165, + "end": 5179, + "name": "DUP9" + }, + { + "begin": 5165, + "end": 5179, + "name": "AND" + }, + { + "begin": 5165, + "end": 5179, + "name": "PUSH", + "value": "0" + }, + { + "begin": 5165, + "end": 5179, + "name": "SWAP1" + }, + { + "begin": 5165, + "end": 5179, + "name": "DUP2" + }, + { + "begin": 5165, + "end": 5179, + "name": "MSTORE" + }, + { + "begin": 5165, + "end": 5172, + "name": "PUSH", + "value": "5" + }, + { + "begin": 5165, + "end": 5179, + "name": "PUSH", + "value": "20" + }, + { + "begin": 5165, + "end": 5179, + "name": "SWAP1" + }, + { + "begin": 5165, + "end": 5179, + "name": "DUP2" + }, + { + "begin": 5165, + "end": 5179, + "name": "MSTORE" + }, + { + "begin": 5165, + "end": 5179, + "name": "PUSH", + "value": "40" + }, + { + "begin": 5165, + "end": 5179, + "name": "DUP1" + }, + { + "begin": 5165, + "end": 5179, + "name": "DUP4" + }, + { + "begin": 5165, + "end": 5179, + "name": "KECCAK256" + }, + { + "begin": 5180, + "end": 5190, + "name": "CALLER" + }, + { + "begin": 5165, + "end": 5191, + "name": "SWAP1" + }, + { + "begin": 5165, + "end": 5191, + "name": "SWAP5" + }, + { + "begin": 5165, + "end": 5191, + "name": "AND" + }, + { + "begin": 5165, + "end": 5191, + "name": "DUP4" + }, + { + "begin": 5165, + "end": 5191, + "name": "MSTORE" + }, + { + "begin": 5165, + "end": 5191, + "name": "SWAP3" + }, + { + "begin": 5165, + "end": 5191, + "name": "SWAP1" + }, + { + "begin": 5165, + "end": 5191, + "name": "MSTORE" + }, + { + "begin": 5165, + "end": 5191, + "name": "KECCAK256" + }, + { + "begin": 5165, + "end": 5191, + "name": "SLOAD" + }, + { + "begin": 5380, + "end": 5395, + "name": "PUSH", + "value": "3" + }, + { + "begin": 5380, + "end": 5395, + "name": "SLOAD" + }, + { + "begin": 5165, + "end": 5191, + "name": "SWAP1" + }, + { + "begin": 5165, + "end": 5191, + "name": "SWAP5" + }, + { + "begin": -1, + "end": -1, + "name": "POP" + }, + { + "begin": 5368, + "end": 5408, + "name": "PUSH [tag]", + "value": "247" + }, + { + "begin": 5368, + "end": 5408, + "name": "SWAP1" + }, + { + "begin": 5402, + "end": 5407, + "name": "PUSH", + "value": "2710" + }, + { + "begin": 5402, + "end": 5407, + "name": "SWAP1" + }, + { + "begin": 5369, + "end": 5396, + "name": "PUSH [tag]", + "value": "248" + }, + { + "begin": 5369, + "end": 5396, + "name": "SWAP1" + }, + { + "begin": 5369, + "end": 5375, + "name": "DUP9" + }, + { + "begin": 5369, + "end": 5375, + "name": "SWAP1" + }, + { + "begin": 5369, + "end": 5396, + "name": "PUSH", + "value": "FFFFFFFF" + }, + { + "begin": 5369, + "end": 5379, + "name": "PUSH [tag]", + "value": "209" + }, + { + "begin": 5369, + "end": 5396, + "name": "AND" + }, + { + "begin": 5369, + "end": 5396, + "name": "JUMP", + "value": "[in]" + }, + { + "begin": 5369, + "end": 5396, + "name": "tag", + "value": "248" + }, + { + "begin": 5369, + "end": 5396, + "name": "JUMPDEST" + }, + { + "begin": 5368, + "end": 5401, + "name": "SWAP1" + }, + { + "begin": 5368, + "end": 5408, + "name": "PUSH", + "value": "FFFFFFFF" + }, + { + "begin": 5368, + "end": 5401, + "name": "PUSH [tag]", + "value": "249" + }, + { + "begin": 5368, + "end": 5408, + "name": "AND" + }, + { + "begin": 5368, + "end": 5408, + "name": "JUMP", + "value": "[in]" + }, + { + "begin": 5368, + "end": 5408, + "name": "tag", + "value": "247" + }, + { + "begin": 5368, + "end": 5408, + "name": "JUMPDEST" + }, + { + "begin": 5357, + "end": 5408, + "name": "SWAP3" + }, + { + "begin": 5357, + "end": 5408, + "name": "POP" + }, + { + "begin": 5428, + "end": 5438, + "name": "PUSH", + "value": "4" + }, + { + "begin": 5428, + "end": 5438, + "name": "SLOAD" + }, + { + "begin": 5422, + "end": 5425, + "name": "DUP4" + }, + { + "begin": 5422, + "end": 5438, + "name": "GT" + }, + { + "begin": 5418, + "end": 5481, + "name": "ISZERO" + }, + { + "begin": 5418, + "end": 5481, + "name": "PUSH [tag]", + "value": "250" + }, + { + "begin": 5418, + "end": 5481, + "name": "JUMPI" + }, + { + "begin": 5460, + "end": 5470, + "name": "PUSH", + "value": "4" + }, + { + "begin": 5460, + "end": 5470, + "name": "SLOAD" + }, + { + "begin": 5454, + "end": 5470, + "name": "SWAP3" + }, + { + "begin": 5454, + "end": 5470, + "name": "POP" + }, + { + "begin": 5418, + "end": 5481, + "name": "tag", + "value": "250" + }, + { + "begin": 5418, + "end": 5481, + "name": "JUMPDEST" + }, + { + "begin": 4752, + "end": 4762, + "name": "PUSH", + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + }, + { + "begin": 5494, + "end": 5504, + "name": "DUP5" + }, + { + "begin": 5494, + "end": 5515, + "name": "LT" + }, + { + "begin": 5490, + "end": 5593, + "name": "ISZERO" + }, + { + "begin": 5490, + "end": 5593, + "name": "PUSH [tag]", + "value": "251" + }, + { + "begin": 5490, + "end": 5593, + "name": "JUMPI" + }, + { + "begin": 5560, + "end": 5582, + "name": "PUSH [tag]", + "value": "252" + }, + { + "begin": 5560, + "end": 5570, + "name": "DUP5" + }, + { + "begin": 5575, + "end": 5581, + "name": "DUP7" + }, + { + "begin": 5560, + "end": 5582, + "name": "PUSH", + "value": "FFFFFFFF" + }, + { + "begin": 5560, + "end": 5574, + "name": "PUSH [tag]", + "value": "253" + }, + { + "begin": 5560, + "end": 5582, + "name": "AND" + }, + { + "begin": 5560, + "end": 5582, + "name": "JUMP", + "value": "[in]" + }, + { + "begin": 5560, + "end": 5582, + "name": "tag", + "value": "252" + }, + { + "begin": 5560, + "end": 5582, + "name": "JUMPDEST" + }, + { + "begin": 5531, + "end": 5545, + "name": "PUSH", + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + }, + { + "begin": 5531, + "end": 5545, + "name": "DUP1" + }, + { + "begin": 5531, + "end": 5545, + "name": "DUP10" + }, + { + "begin": 5531, + "end": 5545, + "name": "AND" + }, + { + "begin": 5531, + "end": 5545, + "name": "PUSH", + "value": "0" + }, + { + "begin": 5531, + "end": 5545, + "name": "SWAP1" + }, + { + "begin": 5531, + "end": 5545, + "name": "DUP2" + }, + { + "begin": 5531, + "end": 5545, + "name": "MSTORE" + }, + { + "begin": 5531, + "end": 5538, + "name": "PUSH", + "value": "5" + }, + { + "begin": 5531, + "end": 5545, + "name": "PUSH", + "value": "20" + }, + { + "begin": 5531, + "end": 5545, + "name": "SWAP1" + }, + { + "begin": 5531, + "end": 5545, + "name": "DUP2" + }, + { + "begin": 5531, + "end": 5545, + "name": "MSTORE" + }, + { + "begin": 5531, + "end": 5545, + "name": "PUSH", + "value": "40" + }, + { + "begin": 5531, + "end": 5545, + "name": "DUP1" + }, + { + "begin": 5531, + "end": 5545, + "name": "DUP4" + }, + { + "begin": 5531, + "end": 5545, + "name": "KECCAK256" + }, + { + "begin": 5546, + "end": 5556, + "name": "CALLER" + }, + { + "begin": 5531, + "end": 5557, + "name": "SWAP1" + }, + { + "begin": 5531, + "end": 5557, + "name": "SWAP5" + }, + { + "begin": 5531, + "end": 5557, + "name": "AND" + }, + { + "begin": 5531, + "end": 5557, + "name": "DUP4" + }, + { + "begin": 5531, + "end": 5557, + "name": "MSTORE" + }, + { + "begin": 5531, + "end": 5557, + "name": "SWAP3" + }, + { + "begin": 5531, + "end": 5557, + "name": "SWAP1" + }, + { + "begin": 5531, + "end": 5557, + "name": "MSTORE" + }, + { + "begin": 5531, + "end": 5557, + "name": "KECCAK256" + }, + { + "begin": 5531, + "end": 5582, + "name": "SSTORE" + }, + { + "begin": 5490, + "end": 5593, + "name": "tag", + "value": "251" + }, + { + "begin": 5490, + "end": 5593, + "name": "JUMPDEST" + }, + { + "begin": 5620, + "end": 5635, + "name": "PUSH [tag]", + "value": "254" + }, + { + "begin": 5620, + "end": 5626, + "name": "DUP6" + }, + { + "begin": 5631, + "end": 5634, + "name": "DUP5" + }, + { + "begin": 5620, + "end": 5635, + "name": "PUSH", + "value": "FFFFFFFF" + }, + { + "begin": 5620, + "end": 5630, + "name": "PUSH [tag]", + "value": "253" + }, + { + "begin": 5620, + "end": 5635, + "name": "AND" + }, + { + "begin": 5620, + "end": 5635, + "name": "JUMP", + "value": "[in]" + }, + { + "begin": 5620, + "end": 5635, + "name": "tag", + "value": "254" + }, + { + "begin": 5620, + "end": 5635, + "name": "JUMPDEST" + }, + { + "begin": 5663, + "end": 5678, + "name": "PUSH", + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + }, + { + "begin": 5663, + "end": 5678, + "name": "DUP9" + }, + { + "begin": 5663, + "end": 5678, + "name": "AND" + }, + { + "begin": 5663, + "end": 5678, + "name": "PUSH", + "value": "0" + }, + { + "begin": 5663, + "end": 5678, + "name": "SWAP1" + }, + { + "begin": 5663, + "end": 5678, + "name": "DUP2" + }, + { + "begin": 5663, + "end": 5678, + "name": "MSTORE" + }, + { + "begin": 5663, + "end": 5671, + "name": "PUSH", + "value": "2" + }, + { + "begin": 5663, + "end": 5678, + "name": "PUSH", + "value": "20" + }, + { + "begin": 5663, + "end": 5678, + "name": "MSTORE" + }, + { + "begin": 5663, + "end": 5678, + "name": "PUSH", + "value": "40" + }, + { + "begin": 5663, + "end": 5678, + "name": "SWAP1" + }, + { + "begin": 5663, + "end": 5678, + "name": "KECCAK256" + }, + { + "begin": 5663, + "end": 5678, + "name": "SLOAD" + }, + { + "begin": 5602, + "end": 5635, + "name": "SWAP1" + }, + { + "begin": 5602, + "end": 5635, + "name": "SWAP3" + }, + { + "begin": -1, + "end": -1, + "name": "POP" + }, + { + "begin": 5663, + "end": 5690, + "name": "PUSH [tag]", + "value": "255" + }, + { + "begin": 5663, + "end": 5690, + "name": "SWAP1" + }, + { + "begin": 5683, + "end": 5689, + "name": "DUP7" + }, + { + "begin": 5663, + "end": 5690, + "name": "PUSH", + "value": "FFFFFFFF" + }, + { + "begin": 5663, + "end": 5682, + "name": "PUSH [tag]", + "value": "253" + }, + { + "begin": 5663, + "end": 5690, + "name": "AND" + }, + { + "begin": 5663, + "end": 5690, + "name": "JUMP", + "value": "[in]" + }, + { + "begin": 5663, + "end": 5690, + "name": "tag", + "value": "255" + }, + { + "begin": 5663, + "end": 5690, + "name": "JUMPDEST" + }, + { + "begin": 5645, + "end": 5660, + "name": "PUSH", + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + }, + { + "begin": 5645, + "end": 5660, + "name": "DUP1" + }, + { + "begin": 5645, + "end": 5660, + "name": "DUP10" + }, + { + "begin": 5645, + "end": 5660, + "name": "AND" + }, + { + "begin": 5645, + "end": 5660, + "name": "PUSH", + "value": "0" + }, + { + "begin": 5645, + "end": 5660, + "name": "SWAP1" + }, + { + "begin": 5645, + "end": 5660, + "name": "DUP2" + }, + { + "begin": 5645, + "end": 5660, + "name": "MSTORE" + }, + { + "begin": 5645, + "end": 5653, + "name": "PUSH", + "value": "2" + }, + { + "begin": 5645, + "end": 5660, + "name": "PUSH", + "value": "20" + }, + { + "begin": 5645, + "end": 5660, + "name": "MSTORE" + }, + { + "begin": 5645, + "end": 5660, + "name": "PUSH", + "value": "40" + }, + { + "begin": 5645, + "end": 5660, + "name": "DUP1" + }, + { + "begin": 5645, + "end": 5660, + "name": "DUP3" + }, + { + "begin": 5645, + "end": 5660, + "name": "KECCAK256" + }, + { + "begin": 5645, + "end": 5690, + "name": "SWAP4" + }, + { + "begin": 5645, + "end": 5690, + "name": "SWAP1" + }, + { + "begin": 5645, + "end": 5690, + "name": "SWAP4" + }, + { + "begin": 5645, + "end": 5690, + "name": "SSTORE" + }, + { + "begin": 5716, + "end": 5729, + "name": "SWAP1" + }, + { + "begin": 5716, + "end": 5729, + "name": "DUP9" + }, + { + "begin": 5716, + "end": 5729, + "name": "AND" + }, + { + "begin": 5716, + "end": 5729, + "name": "DUP2" + }, + { + "begin": 5716, + "end": 5729, + "name": "MSTORE" + }, + { + "begin": 5716, + "end": 5729, + "name": "KECCAK256" + }, + { + "begin": 5716, + "end": 5729, + "name": "SLOAD" + }, + { + "begin": 5716, + "end": 5745, + "name": "PUSH [tag]", + "value": "256" + }, + { + "begin": 5716, + "end": 5745, + "name": "SWAP1" + }, + { + "begin": 5734, + "end": 5744, + "name": "DUP4" + }, + { + "begin": 5716, + "end": 5745, + "name": "PUSH", + "value": "FFFFFFFF" + }, + { + "begin": 5716, + "end": 5733, + "name": "PUSH [tag]", + "value": "257" + }, + { + "begin": 5716, + "end": 5745, + "name": "AND" + }, + { + "begin": 5716, + "end": 5745, + "name": "JUMP", + "value": "[in]" + }, + { + "begin": 5716, + "end": 5745, + "name": "tag", + "value": "256" + }, + { + "begin": 5716, + "end": 5745, + "name": "JUMPDEST" + }, + { + "begin": 5700, + "end": 5713, + "name": "PUSH", + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + }, + { + "begin": 5700, + "end": 5713, + "name": "DUP8" + }, + { + "begin": 5700, + "end": 5713, + "name": "AND" + }, + { + "begin": 5700, + "end": 5713, + "name": "PUSH", + "value": "0" + }, + { + "begin": 5700, + "end": 5713, + "name": "SWAP1" + }, + { + "begin": 5700, + "end": 5713, + "name": "DUP2" + }, + { + "begin": 5700, + "end": 5713, + "name": "MSTORE" + }, + { + "begin": 5700, + "end": 5708, + "name": "PUSH", + "value": "2" + }, + { + "begin": 5700, + "end": 5713, + "name": "PUSH", + "value": "20" + }, + { + "begin": 5700, + "end": 5713, + "name": "MSTORE" + }, + { + "begin": 5700, + "end": 5713, + "name": "PUSH", + "value": "40" + }, + { + "begin": 5700, + "end": 5713, + "name": "DUP2" + }, + { + "begin": 5700, + "end": 5713, + "name": "KECCAK256" + }, + { + "begin": 5700, + "end": 5745, + "name": "SWAP2" + }, + { + "begin": 5700, + "end": 5745, + "name": "SWAP1" + }, + { + "begin": 5700, + "end": 5745, + "name": "SWAP2" + }, + { + "begin": 5700, + "end": 5745, + "name": "SSTORE" + }, + { + "begin": 5759, + "end": 5766, + "name": "DUP4" + }, + { + "begin": 5759, + "end": 5766, + "name": "GT" + }, + { + "begin": 5755, + "end": 5876, + "name": "ISZERO" + }, + { + "begin": 5755, + "end": 5876, + "name": "PUSH [tag]", + "value": "258" + }, + { + "begin": 5755, + "end": 5876, + "name": "JUMPI" + }, + { + "begin": 5800, + "end": 5815, + "name": "PUSH", + "value": "0" + }, + { + "begin": 5809, + "end": 5814, + "name": "DUP1" + }, + { + "begin": 5809, + "end": 5814, + "name": "SLOAD" + }, + { + "begin": 5809, + "end": 5814, + "name": "PUSH", + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + }, + { + "begin": 5809, + "end": 5814, + "name": "AND" + }, + { + "begin": 5800, + "end": 5815, + "name": "DUP2" + }, + { + "begin": 5800, + "end": 5815, + "name": "MSTORE" + }, + { + "begin": 5800, + "end": 5808, + "name": "PUSH", + "value": "2" + }, + { + "begin": 5800, + "end": 5815, + "name": "PUSH", + "value": "20" + }, + { + "begin": 5800, + "end": 5815, + "name": "MSTORE" + }, + { + "begin": 5800, + "end": 5815, + "name": "PUSH", + "value": "40" + }, + { + "begin": 5800, + "end": 5815, + "name": "SWAP1" + }, + { + "begin": 5800, + "end": 5815, + "name": "KECCAK256" + }, + { + "begin": 5800, + "end": 5815, + "name": "SLOAD" + }, + { + "begin": 5800, + "end": 5824, + "name": "PUSH [tag]", + "value": "259" + }, + { + "begin": 5800, + "end": 5824, + "name": "SWAP1" + }, + { + "begin": 5820, + "end": 5823, + "name": "DUP5" + }, + { + "begin": 5800, + "end": 5824, + "name": "PUSH", + "value": "FFFFFFFF" + }, + { + "begin": 5800, + "end": 5819, + "name": "PUSH [tag]", + "value": "257" + }, + { + "begin": 5800, + "end": 5824, + "name": "AND" + }, + { + "begin": 5800, + "end": 5824, + "name": "JUMP", + "value": "[in]" + }, + { + "begin": 5800, + "end": 5824, + "name": "tag", + "value": "259" + }, + { + "begin": 5800, + "end": 5824, + "name": "JUMPDEST" + }, + { + "begin": 5782, + "end": 5797, + "name": "PUSH", + "value": "0" + }, + { + "begin": 5791, + "end": 5796, + "name": "DUP1" + }, + { + "begin": 5791, + "end": 5796, + "name": "SLOAD" + }, + { + "begin": 5791, + "end": 5796, + "name": "PUSH", + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + }, + { + "begin": 5791, + "end": 5796, + "name": "SWAP1" + }, + { + "begin": 5791, + "end": 5796, + "name": "DUP2" + }, + { + "begin": 5791, + "end": 5796, + "name": "AND" + }, + { + "begin": 5782, + "end": 5797, + "name": "DUP3" + }, + { + "begin": 5782, + "end": 5797, + "name": "MSTORE" + }, + { + "begin": 5782, + "end": 5790, + "name": "PUSH", + "value": "2" + }, + { + "begin": 5782, + "end": 5797, + "name": "PUSH", + "value": "20" + }, + { + "begin": 5782, + "end": 5797, + "name": "MSTORE" + }, + { + "begin": 5782, + "end": 5797, + "name": "PUSH", + "value": "40" + }, + { + "begin": 5782, + "end": 5797, + "name": "DUP1" + }, + { + "begin": 5782, + "end": 5797, + "name": "DUP4" + }, + { + "begin": 5782, + "end": 5797, + "name": "KECCAK256" + }, + { + "begin": 5782, + "end": 5824, + "name": "SWAP4" + }, + { + "begin": 5782, + "end": 5824, + "name": "SWAP1" + }, + { + "begin": 5782, + "end": 5824, + "name": "SWAP4" + }, + { + "begin": 5782, + "end": 5824, + "name": "SSTORE" + }, + { + "begin": 5854, + "end": 5859, + "name": "SWAP1" + }, + { + "begin": 5854, + "end": 5859, + "name": "SLOAD" + }, + { + "begin": 5854, + "end": 5859, + "name": "DUP2" + }, + { + "begin": 5854, + "end": 5859, + "name": "AND" + }, + { + "begin": 5854, + "end": 5859, + "name": "SWAP2" + }, + { + "begin": 5838, + "end": 5865, + "name": "SWAP1" + }, + { + "begin": 5838, + "end": 5865, + "name": "DUP10" + }, + { + "begin": 5838, + "end": 5865, + "name": "AND" + }, + { + "begin": 5838, + "end": 5865, + "name": "SWAP1" + }, + { + "begin": 5838, + "end": 5865, + "name": "PUSH", + "value": "DDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF" + }, + { + "begin": 5838, + "end": 5865, + "name": "SWAP1" + }, + { + "begin": 5861, + "end": 5864, + "name": "DUP7" + }, + { + "begin": 5861, + "end": 5864, + "name": "SWAP1" + }, + { + "begin": 5838, + "end": 5865, + "name": "MLOAD" + }, + { + "begin": 5838, + "end": 5865, + "name": "SWAP1" + }, + { + "begin": 5838, + "end": 5865, + "name": "DUP2" + }, + { + "begin": 5838, + "end": 5865, + "name": "MSTORE" + }, + { + "begin": 5838, + "end": 5865, + "name": "PUSH", + "value": "20" + }, + { + "begin": 5838, + "end": 5865, + "name": "ADD" + }, + { + "begin": 5838, + "end": 5865, + "name": "PUSH", + "value": "40" + }, + { + "begin": 5838, + "end": 5865, + "name": "MLOAD" + }, + { + "begin": 5838, + "end": 5865, + "name": "DUP1" + }, + { + "begin": 5838, + "end": 5865, + "name": "SWAP2" + }, + { + "begin": 5838, + "end": 5865, + "name": "SUB" + }, + { + "begin": 5838, + "end": 5865, + "name": "SWAP1" + }, + { + "begin": 5838, + "end": 5865, + "name": "LOG3" + }, + { + "begin": 5755, + "end": 5876, + "name": "tag", + "value": "258" + }, + { + "begin": 5755, + "end": 5876, + "name": "JUMPDEST" + }, + { + "begin": 5901, + "end": 5904, + "name": "DUP6" + }, + { + "begin": 5885, + "end": 5917, + "name": "PUSH", + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + }, + { + "begin": 5885, + "end": 5917, + "name": "AND" + }, + { + "begin": 5894, + "end": 5899, + "name": "DUP8" + }, + { + "begin": 5885, + "end": 5917, + "name": "PUSH", + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + }, + { + "begin": 5885, + "end": 5917, + "name": "AND" + }, + { + "begin": 5885, + "end": 5917, + "name": "PUSH", + "value": "DDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF" + }, + { + "begin": 5906, + "end": 5916, + "name": "DUP5" + }, + { + "begin": 5885, + "end": 5917, + "name": "PUSH", + "value": "40" + }, + { + "begin": 5885, + "end": 5917, + "name": "MLOAD" + }, + { + "begin": 5885, + "end": 5917, + "name": "SWAP1" + }, + { + "begin": 5885, + "end": 5917, + "name": "DUP2" + }, + { + "begin": 5885, + "end": 5917, + "name": "MSTORE" + }, + { + "begin": 5885, + "end": 5917, + "name": "PUSH", + "value": "20" + }, + { + "begin": 5885, + "end": 5917, + "name": "ADD" + }, + { + "begin": 5885, + "end": 5917, + "name": "PUSH", + "value": "40" + }, + { + "begin": 5885, + "end": 5917, + "name": "MLOAD" + }, + { + "begin": 5885, + "end": 5917, + "name": "DUP1" + }, + { + "begin": 5885, + "end": 5917, + "name": "SWAP2" + }, + { + "begin": 5885, + "end": 5917, + "name": "SUB" + }, + { + "begin": 5885, + "end": 5917, + "name": "SWAP1" + }, + { + "begin": 5885, + "end": 5917, + "name": "LOG3" + }, + { + "begin": 5044, + "end": 5924, + "name": "POP" + }, + { + "begin": 5044, + "end": 5924, + "name": "POP" + }, + { + "begin": 5044, + "end": 5924, + "name": "POP" + }, + { + "begin": 5044, + "end": 5924, + "name": "POP" + }, + { + "begin": 5044, + "end": 5924, + "name": "POP" + }, + { + "begin": 5044, + "end": 5924, + "name": "POP" + }, + { + "begin": 5044, + "end": 5924, + "name": "POP" + }, + { + "begin": 5044, + "end": 5924, + "name": "JUMP", + "value": "[out]" + }, + { + "begin": 4216, + "end": 4330, + "name": "tag", + "value": "183" + }, + { + "begin": 4216, + "end": 4330, + "name": "JUMPDEST" + }, + { + "begin": 4307, + "end": 4323, + "name": "PUSH", + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + }, + { + "begin": 4307, + "end": 4323, + "name": "AND" + }, + { + "begin": 4276, + "end": 4288, + "name": "PUSH", + "value": "0" + }, + { + "begin": 4307, + "end": 4323, + "name": "SWAP1" + }, + { + "begin": 4307, + "end": 4323, + "name": "DUP2" + }, + { + "begin": 4307, + "end": 4323, + "name": "MSTORE" + }, + { + "begin": 4307, + "end": 4315, + "name": "PUSH", + "value": "2" + }, + { + "begin": 4307, + "end": 4323, + "name": "PUSH", + "value": "20" + }, + { + "begin": 4307, + "end": 4323, + "name": "MSTORE" + }, + { + "begin": 4307, + "end": 4323, + "name": "PUSH", + "value": "40" + }, + { + "begin": 4307, + "end": 4323, + "name": "SWAP1" + }, + { + "begin": 4307, + "end": 4323, + "name": "KECCAK256" + }, + { + "begin": 4307, + "end": 4323, + "name": "SLOAD" + }, + { + "begin": 4307, + "end": 4323, + "name": "SWAP1" + }, + { + "begin": 4216, + "end": 4330, + "name": "JUMP", + "value": "[out]" + }, + { + "begin": 3445, + "end": 4005, + "name": "tag", + "value": "202" + }, + { + "begin": 3445, + "end": 4005, + "name": "JUMPDEST" + }, + { + "begin": 3530, + "end": 3538, + "name": "PUSH", + "value": "0" + }, + { + "begin": 3530, + "end": 3538, + "name": "DUP1" + }, + { + "begin": 3512, + "end": 3518, + "name": "PUSH", + "value": "40" + }, + { + "begin": 3251, + "end": 3259, + "name": "PUSH", + "value": "44" + }, + { + "begin": 3233, + "end": 3241, + "name": "CALLDATASIZE" + }, + { + "begin": 3233, + "end": 3259, + "name": "LT" + }, + { + "begin": 3231, + "end": 3260, + "name": "ISZERO" + }, + { + "begin": 3223, + "end": 3261, + "name": "PUSH [tag]", + "value": "262" + }, + { + "begin": 3223, + "end": 3261, + "name": "JUMPI" + }, + { + "begin": 3223, + "end": 3261, + "name": "PUSH", + "value": "0" + }, + { + "begin": 3223, + "end": 3261, + "name": "DUP1" + }, + { + "begin": 3223, + "end": 3261, + "name": "REVERT" + }, + { + "begin": 3223, + "end": 3261, + "name": "tag", + "value": "262" + }, + { + "begin": 3223, + "end": 3261, + "name": "JUMPDEST" + }, + { + "begin": 3541, + "end": 3581, + "name": "PUSH [tag]", + "value": "264" + }, + { + "begin": 3575, + "end": 3580, + "name": "PUSH", + "value": "2710" + }, + { + "begin": 3542, + "end": 3569, + "name": "PUSH [tag]", + "value": "248" + }, + { + "begin": 3553, + "end": 3568, + "name": "PUSH", + "value": "3" + }, + { + "begin": 3553, + "end": 3568, + "name": "SLOAD" + }, + { + "begin": 3542, + "end": 3548, + "name": "DUP8" + }, + { + "begin": 3542, + "end": 3552, + "name": "PUSH [tag]", + "value": "209" + }, + { + "begin": 3542, + "end": 3552, + "name": "SWAP1" + }, + { + "begin": 3542, + "end": 3569, + "name": "SWAP2" + }, + { + "begin": 3542, + "end": 3569, + "name": "SWAP1" + }, + { + "begin": 3542, + "end": 3569, + "name": "PUSH", + "value": "FFFFFFFF" + }, + { + "begin": 3542, + "end": 3569, + "name": "AND" + }, + { + "begin": 3542, + "end": 3569, + "name": "JUMP", + "value": "[in]" + }, + { + "begin": 3541, + "end": 3581, + "name": "tag", + "value": "264" + }, + { + "begin": 3541, + "end": 3581, + "name": "JUMPDEST" + }, + { + "begin": 3530, + "end": 3581, + "name": "SWAP3" + }, + { + "begin": 3530, + "end": 3581, + "name": "POP" + }, + { + "begin": 3601, + "end": 3611, + "name": "PUSH", + "value": "4" + }, + { + "begin": 3601, + "end": 3611, + "name": "SLOAD" + }, + { + "begin": 3595, + "end": 3598, + "name": "DUP4" + }, + { + "begin": 3595, + "end": 3611, + "name": "GT" + }, + { + "begin": 3591, + "end": 3654, + "name": "ISZERO" + }, + { + "begin": 3591, + "end": 3654, + "name": "PUSH [tag]", + "value": "266" + }, + { + "begin": 3591, + "end": 3654, + "name": "JUMPI" + }, + { + "begin": 3633, + "end": 3643, + "name": "PUSH", + "value": "4" + }, + { + "begin": 3633, + "end": 3643, + "name": "SLOAD" + }, + { + "begin": 3627, + "end": 3643, + "name": "SWAP3" + }, + { + "begin": 3627, + "end": 3643, + "name": "POP" + }, + { + "begin": 3591, + "end": 3654, + "name": "tag", + "value": "266" + }, + { + "begin": 3591, + "end": 3654, + "name": "JUMPDEST" + }, + { + "begin": 3681, + "end": 3696, + "name": "PUSH [tag]", + "value": "267" + }, + { + "begin": 3681, + "end": 3687, + "name": "DUP5" + }, + { + "begin": 3692, + "end": 3695, + "name": "DUP5" + }, + { + "begin": 3681, + "end": 3696, + "name": "PUSH", + "value": "FFFFFFFF" + }, + { + "begin": 3681, + "end": 3691, + "name": "PUSH [tag]", + "value": "253" + }, + { + "begin": 3681, + "end": 3696, + "name": "AND" + }, + { + "begin": 3681, + "end": 3696, + "name": "JUMP", + "value": "[in]" + }, + { + "begin": 3681, + "end": 3696, + "name": "tag", + "value": "267" + }, + { + "begin": 3681, + "end": 3696, + "name": "JUMPDEST" + }, + { + "begin": 3729, + "end": 3749, + "name": "PUSH", + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + }, + { + "begin": 3738, + "end": 3748, + "name": "CALLER" + }, + { + "begin": 3729, + "end": 3749, + "name": "AND" + }, + { + "begin": 3729, + "end": 3749, + "name": "PUSH", + "value": "0" + }, + { + "begin": 3729, + "end": 3749, + "name": "SWAP1" + }, + { + "begin": 3729, + "end": 3749, + "name": "DUP2" + }, + { + "begin": 3729, + "end": 3749, + "name": "MSTORE" + }, + { + "begin": 3729, + "end": 3737, + "name": "PUSH", + "value": "2" + }, + { + "begin": 3729, + "end": 3749, + "name": "PUSH", + "value": "20" + }, + { + "begin": 3729, + "end": 3749, + "name": "MSTORE" + }, + { + "begin": 3729, + "end": 3749, + "name": "PUSH", + "value": "40" + }, + { + "begin": 3729, + "end": 3749, + "name": "SWAP1" + }, + { + "begin": 3729, + "end": 3749, + "name": "KECCAK256" + }, + { + "begin": 3729, + "end": 3749, + "name": "SLOAD" + }, + { + "begin": 3663, + "end": 3696, + "name": "SWAP1" + }, + { + "begin": 3663, + "end": 3696, + "name": "SWAP3" + }, + { + "begin": -1, + "end": -1, + "name": "POP" + }, + { + "begin": 3729, + "end": 3761, + "name": "PUSH [tag]", + "value": "268" + }, + { + "begin": 3729, + "end": 3761, + "name": "SWAP1" + }, + { + "begin": 3754, + "end": 3760, + "name": "DUP6" + }, + { + "begin": 3729, + "end": 3761, + "name": "PUSH", + "value": "FFFFFFFF" + }, + { + "begin": 3729, + "end": 3753, + "name": "PUSH [tag]", + "value": "253" + }, + { + "begin": 3729, + "end": 3761, + "name": "AND" + }, + { + "begin": 3729, + "end": 3761, + "name": "JUMP", + "value": "[in]" + }, + { + "begin": 3729, + "end": 3761, + "name": "tag", + "value": "268" + }, + { + "begin": 3729, + "end": 3761, + "name": "JUMPDEST" + }, + { + "begin": 3706, + "end": 3726, + "name": "PUSH", + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + }, + { + "begin": 3715, + "end": 3725, + "name": "CALLER" + }, + { + "begin": 3706, + "end": 3726, + "name": "DUP2" + }, + { + "begin": 3706, + "end": 3726, + "name": "AND" + }, + { + "begin": 3706, + "end": 3726, + "name": "PUSH", + "value": "0" + }, + { + "begin": 3706, + "end": 3726, + "name": "SWAP1" + }, + { + "begin": 3706, + "end": 3726, + "name": "DUP2" + }, + { + "begin": 3706, + "end": 3726, + "name": "MSTORE" + }, + { + "begin": 3706, + "end": 3714, + "name": "PUSH", + "value": "2" + }, + { + "begin": 3706, + "end": 3726, + "name": "PUSH", + "value": "20" + }, + { + "begin": 3706, + "end": 3726, + "name": "MSTORE" + }, + { + "begin": 3706, + "end": 3726, + "name": "PUSH", + "value": "40" + }, + { + "begin": 3706, + "end": 3726, + "name": "DUP1" + }, + { + "begin": 3706, + "end": 3726, + "name": "DUP3" + }, + { + "begin": 3706, + "end": 3726, + "name": "KECCAK256" + }, + { + "begin": 3706, + "end": 3761, + "name": "SWAP4" + }, + { + "begin": 3706, + "end": 3761, + "name": "SWAP1" + }, + { + "begin": 3706, + "end": 3761, + "name": "SWAP4" + }, + { + "begin": 3706, + "end": 3761, + "name": "SSTORE" + }, + { + "begin": 3787, + "end": 3800, + "name": "SWAP1" + }, + { + "begin": 3787, + "end": 3800, + "name": "DUP8" + }, + { + "begin": 3787, + "end": 3800, + "name": "AND" + }, + { + "begin": 3787, + "end": 3800, + "name": "DUP2" + }, + { + "begin": 3787, + "end": 3800, + "name": "MSTORE" + }, + { + "begin": 3787, + "end": 3800, + "name": "KECCAK256" + }, + { + "begin": 3787, + "end": 3800, + "name": "SLOAD" + }, + { + "begin": 3787, + "end": 3816, + "name": "PUSH [tag]", + "value": "269" + }, + { + "begin": 3787, + "end": 3816, + "name": "SWAP1" + }, + { + "begin": 3805, + "end": 3815, + "name": "DUP4" + }, + { + "begin": 3787, + "end": 3816, + "name": "PUSH", + "value": "FFFFFFFF" + }, + { + "begin": 3787, + "end": 3804, + "name": "PUSH [tag]", + "value": "257" + }, + { + "begin": 3787, + "end": 3816, + "name": "AND" + }, + { + "begin": 3787, + "end": 3816, + "name": "JUMP", + "value": "[in]" + }, + { + "begin": 3787, + "end": 3816, + "name": "tag", + "value": "269" + }, + { + "begin": 3787, + "end": 3816, + "name": "JUMPDEST" + }, + { + "begin": 3771, + "end": 3784, + "name": "PUSH", + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + }, + { + "begin": 3771, + "end": 3784, + "name": "DUP7" + }, + { + "begin": 3771, + "end": 3784, + "name": "AND" + }, + { + "begin": 3771, + "end": 3784, + "name": "PUSH", + "value": "0" + }, + { + "begin": 3771, + "end": 3784, + "name": "SWAP1" + }, + { + "begin": 3771, + "end": 3784, + "name": "DUP2" + }, + { + "begin": 3771, + "end": 3784, + "name": "MSTORE" + }, + { + "begin": 3771, + "end": 3779, + "name": "PUSH", + "value": "2" + }, + { + "begin": 3771, + "end": 3784, + "name": "PUSH", + "value": "20" + }, + { + "begin": 3771, + "end": 3784, + "name": "MSTORE" + }, + { + "begin": 3771, + "end": 3784, + "name": "PUSH", + "value": "40" + }, + { + "begin": 3771, + "end": 3784, + "name": "DUP2" + }, + { + "begin": 3771, + "end": 3784, + "name": "KECCAK256" + }, + { + "begin": 3771, + "end": 3816, + "name": "SWAP2" + }, + { + "begin": 3771, + "end": 3816, + "name": "SWAP1" + }, + { + "begin": 3771, + "end": 3816, + "name": "SWAP2" + }, + { + "begin": 3771, + "end": 3816, + "name": "SSTORE" + }, + { + "begin": 3830, + "end": 3837, + "name": "DUP4" + }, + { + "begin": 3830, + "end": 3837, + "name": "GT" + }, + { + "begin": 3826, + "end": 3952, + "name": "ISZERO" + }, + { + "begin": 3826, + "end": 3952, + "name": "PUSH [tag]", + "value": "270" + }, + { + "begin": 3826, + "end": 3952, + "name": "JUMPI" + }, + { + "begin": 3871, + "end": 3886, + "name": "PUSH", + "value": "0" + }, + { + "begin": 3880, + "end": 3885, + "name": "DUP1" + }, + { + "begin": 3880, + "end": 3885, + "name": "SLOAD" + }, + { + "begin": 3880, + "end": 3885, + "name": "PUSH", + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + }, + { + "begin": 3880, + "end": 3885, + "name": "AND" + }, + { + "begin": 3871, + "end": 3886, + "name": "DUP2" + }, + { + "begin": 3871, + "end": 3886, + "name": "MSTORE" + }, + { + "begin": 3871, + "end": 3879, + "name": "PUSH", + "value": "2" + }, + { + "begin": 3871, + "end": 3886, + "name": "PUSH", + "value": "20" + }, + { + "begin": 3871, + "end": 3886, + "name": "MSTORE" + }, + { + "begin": 3871, + "end": 3886, + "name": "PUSH", + "value": "40" + }, + { + "begin": 3871, + "end": 3886, + "name": "SWAP1" + }, + { + "begin": 3871, + "end": 3886, + "name": "KECCAK256" + }, + { + "begin": 3871, + "end": 3886, + "name": "SLOAD" + }, + { + "begin": 3871, + "end": 3895, + "name": "PUSH [tag]", + "value": "271" + }, + { + "begin": 3871, + "end": 3895, + "name": "SWAP1" + }, + { + "begin": 3891, + "end": 3894, + "name": "DUP5" + }, + { + "begin": 3871, + "end": 3895, + "name": "PUSH", + "value": "FFFFFFFF" + }, + { + "begin": 3871, + "end": 3890, + "name": "PUSH [tag]", + "value": "257" + }, + { + "begin": 3871, + "end": 3895, + "name": "AND" + }, + { + "begin": 3871, + "end": 3895, + "name": "JUMP", + "value": "[in]" + }, + { + "begin": 3871, + "end": 3895, + "name": "tag", + "value": "271" + }, + { + "begin": 3871, + "end": 3895, + "name": "JUMPDEST" + }, + { + "begin": 3853, + "end": 3868, + "name": "PUSH", + "value": "0" + }, + { + "begin": 3862, + "end": 3867, + "name": "DUP1" + }, + { + "begin": 3862, + "end": 3867, + "name": "SLOAD" + }, + { + "begin": 3862, + "end": 3867, + "name": "PUSH", + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + }, + { + "begin": 3862, + "end": 3867, + "name": "SWAP1" + }, + { + "begin": 3862, + "end": 3867, + "name": "DUP2" + }, + { + "begin": 3862, + "end": 3867, + "name": "AND" + }, + { + "begin": 3853, + "end": 3868, + "name": "DUP3" + }, + { + "begin": 3853, + "end": 3868, + "name": "MSTORE" + }, + { + "begin": 3853, + "end": 3861, + "name": "PUSH", + "value": "2" + }, + { + "begin": 3853, + "end": 3868, + "name": "PUSH", + "value": "20" + }, + { + "begin": 3853, + "end": 3868, + "name": "MSTORE" + }, + { + "begin": 3853, + "end": 3868, + "name": "PUSH", + "value": "40" + }, + { + "begin": 3853, + "end": 3868, + "name": "DUP1" + }, + { + "begin": 3853, + "end": 3868, + "name": "DUP4" + }, + { + "begin": 3853, + "end": 3868, + "name": "KECCAK256" + }, + { + "begin": 3853, + "end": 3895, + "name": "SWAP4" + }, + { + "begin": 3853, + "end": 3895, + "name": "SWAP1" + }, + { + "begin": 3853, + "end": 3895, + "name": "SWAP4" + }, + { + "begin": 3853, + "end": 3895, + "name": "SSTORE" + }, + { + "begin": 3930, + "end": 3935, + "name": "SWAP1" + }, + { + "begin": 3930, + "end": 3935, + "name": "SLOAD" + }, + { + "begin": 3930, + "end": 3935, + "name": "DUP2" + }, + { + "begin": 3930, + "end": 3935, + "name": "AND" + }, + { + "begin": 3930, + "end": 3935, + "name": "SWAP2" + }, + { + "begin": 3918, + "end": 3928, + "name": "CALLER" + }, + { + "begin": 3909, + "end": 3941, + "name": "SWAP1" + }, + { + "begin": 3909, + "end": 3941, + "name": "SWAP2" + }, + { + "begin": 3909, + "end": 3941, + "name": "AND" + }, + { + "begin": 3909, + "end": 3941, + "name": "SWAP1" + }, + { + "begin": 3909, + "end": 3941, + "name": "PUSH", + "value": "DDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF" + }, + { + "begin": 3909, + "end": 3941, + "name": "SWAP1" + }, + { + "begin": 3937, + "end": 3940, + "name": "DUP7" + }, + { + "begin": 3937, + "end": 3940, + "name": "SWAP1" + }, + { + "begin": 3909, + "end": 3941, + "name": "MLOAD" + }, + { + "begin": 3909, + "end": 3941, + "name": "SWAP1" + }, + { + "begin": 3909, + "end": 3941, + "name": "DUP2" + }, + { + "begin": 3909, + "end": 3941, + "name": "MSTORE" + }, + { + "begin": 3909, + "end": 3941, + "name": "PUSH", + "value": "20" + }, + { + "begin": 3909, + "end": 3941, + "name": "ADD" + }, + { + "begin": 3909, + "end": 3941, + "name": "PUSH", + "value": "40" + }, + { + "begin": 3909, + "end": 3941, + "name": "MLOAD" + }, + { + "begin": 3909, + "end": 3941, + "name": "DUP1" + }, + { + "begin": 3909, + "end": 3941, + "name": "SWAP2" + }, + { + "begin": 3909, + "end": 3941, + "name": "SUB" + }, + { + "begin": 3909, + "end": 3941, + "name": "SWAP1" + }, + { + "begin": 3909, + "end": 3941, + "name": "LOG3" + }, + { + "begin": 3826, + "end": 3952, + "name": "tag", + "value": "270" + }, + { + "begin": 3826, + "end": 3952, + "name": "JUMPDEST" + }, + { + "begin": 3982, + "end": 3985, + "name": "DUP5" + }, + { + "begin": 3961, + "end": 3998, + "name": "PUSH", + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + }, + { + "begin": 3961, + "end": 3998, + "name": "AND" + }, + { + "begin": 3970, + "end": 3980, + "name": "CALLER" + }, + { + "begin": 3961, + "end": 3998, + "name": "PUSH", + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + }, + { + "begin": 3961, + "end": 3998, + "name": "AND" + }, + { + "begin": 3961, + "end": 3998, + "name": "PUSH", + "value": "DDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF" + }, + { + "begin": 3987, + "end": 3997, + "name": "DUP5" + }, + { + "begin": 3961, + "end": 3998, + "name": "PUSH", + "value": "40" + }, + { + "begin": 3961, + "end": 3998, + "name": "MLOAD" + }, + { + "begin": 3961, + "end": 3998, + "name": "SWAP1" + }, + { + "begin": 3961, + "end": 3998, + "name": "DUP2" + }, + { + "begin": 3961, + "end": 3998, + "name": "MSTORE" + }, + { + "begin": 3961, + "end": 3998, + "name": "PUSH", + "value": "20" + }, + { + "begin": 3961, + "end": 3998, + "name": "ADD" + }, + { + "begin": 3961, + "end": 3998, + "name": "PUSH", + "value": "40" + }, + { + "begin": 3961, + "end": 3998, + "name": "MLOAD" + }, + { + "begin": 3961, + "end": 3998, + "name": "DUP1" + }, + { + "begin": 3961, + "end": 3998, + "name": "SWAP2" + }, + { + "begin": 3961, + "end": 3998, + "name": "SUB" + }, + { + "begin": 3961, + "end": 3998, + "name": "SWAP1" + }, + { + "begin": 3961, + "end": 3998, + "name": "LOG3" + }, + { + "begin": 3445, + "end": 4005, + "name": "POP" + }, + { + "begin": 3445, + "end": 4005, + "name": "POP" + }, + { + "begin": 3445, + "end": 4005, + "name": "POP" + }, + { + "begin": 3445, + "end": 4005, + "name": "POP" + }, + { + "begin": 3445, + "end": 4005, + "name": "POP" + }, + { + "begin": 3445, + "end": 4005, + "name": "JUMP", + "value": "[out]" + }, + { + "begin": 206, + "end": 407, + "name": "tag", + "value": "209" + }, + { + "begin": 206, + "end": 407, + "name": "JUMPDEST" + }, + { + "begin": 264, + "end": 271, + "name": "PUSH", + "value": "0" + }, + { + "begin": 264, + "end": 271, + "name": "DUP1" + }, + { + "begin": 287, + "end": 293, + "name": "DUP4" + }, + { + "begin": 287, + "end": 293, + "name": "ISZERO" + }, + { + "begin": 283, + "end": 328, + "name": "ISZERO" + }, + { + "begin": 283, + "end": 328, + "name": "PUSH [tag]", + "value": "273" + }, + { + "begin": 283, + "end": 328, + "name": "JUMPI" + }, + { + "begin": 316, + "end": 317, + "name": "PUSH", + "value": "0" + }, + { + "begin": 309, + "end": 317, + "name": "SWAP2" + }, + { + "begin": 309, + "end": 317, + "name": "POP" + }, + { + "begin": 309, + "end": 317, + "name": "PUSH [tag]", + "value": "272" + }, + { + "begin": 309, + "end": 317, + "name": "JUMP" + }, + { + "begin": 283, + "end": 328, + "name": "tag", + "value": "273" + }, + { + "begin": 283, + "end": 328, + "name": "JUMPDEST" + }, + { + "begin": -1, + "end": -1, + "name": "POP" + }, + { + "begin": 349, + "end": 354, + "name": "DUP3" + }, + { + "begin": 349, + "end": 354, + "name": "DUP3" + }, + { + "begin": 349, + "end": 354, + "name": "MUL" + }, + { + "begin": 353, + "end": 354, + "name": "DUP3" + }, + { + "begin": 349, + "end": 350, + "name": "DUP5" + }, + { + "begin": 349, + "end": 354, + "name": "DUP3" + }, + { + "begin": 371, + "end": 376, + "name": "DUP2" + }, + { + "begin": 371, + "end": 376, + "name": "ISZERO" + }, + { + "begin": 371, + "end": 376, + "name": "ISZERO" + }, + { + "begin": 371, + "end": 376, + "name": "PUSH [tag]", + "value": "274" + }, + { + "begin": 371, + "end": 376, + "name": "JUMPI" + }, + { + "begin": 371, + "end": 376, + "name": "INVALID" + }, + { + "begin": 371, + "end": 376, + "name": "tag", + "value": "274" + }, + { + "begin": 371, + "end": 376, + "name": "JUMPDEST" + }, + { + "begin": 371, + "end": 376, + "name": "DIV" + }, + { + "begin": 371, + "end": 381, + "name": "EQ" + }, + { + "begin": 364, + "end": 382, + "name": "PUSH [tag]", + "value": "275" + }, + { + "begin": 364, + "end": 382, + "name": "JUMPI" + }, + { + "begin": 364, + "end": 382, + "name": "INVALID" + }, + { + "begin": 364, + "end": 382, + "name": "tag", + "value": "275" + }, + { + "begin": 364, + "end": 382, + "name": "JUMPDEST" + }, + { + "begin": 399, + "end": 400, + "name": "DUP1" + }, + { + "begin": 392, + "end": 400, + "name": "SWAP2" + }, + { + "begin": 392, + "end": 400, + "name": "POP" + }, + { + "begin": 206, + "end": 407, + "name": "tag", + "value": "272" + }, + { + "begin": 206, + "end": 407, + "name": "JUMPDEST" + }, + { + "begin": 206, + "end": 407, + "name": "POP" + }, + { + "begin": 206, + "end": 407, + "name": "SWAP3" + }, + { + "begin": 206, + "end": 407, + "name": "SWAP2" + }, + { + "begin": 206, + "end": 407, + "name": "POP" + }, + { + "begin": 206, + "end": 407, + "name": "POP" + }, + { + "begin": 206, + "end": 407, + "name": "JUMP", + "value": "[out]" + }, + { + "begin": 7052, + "end": 7195, + "name": "tag", + "value": "226" + }, + { + "begin": 7052, + "end": 7195, + "name": "JUMPDEST" + }, + { + "begin": 7163, + "end": 7178, + "name": "PUSH", + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + }, + { + "begin": 7163, + "end": 7178, + "name": "SWAP2" + }, + { + "begin": 7163, + "end": 7178, + "name": "DUP3" + }, + { + "begin": 7163, + "end": 7178, + "name": "AND" + }, + { + "begin": 7130, + "end": 7144, + "name": "PUSH", + "value": "0" + }, + { + "begin": 7163, + "end": 7178, + "name": "SWAP1" + }, + { + "begin": 7163, + "end": 7178, + "name": "DUP2" + }, + { + "begin": 7163, + "end": 7178, + "name": "MSTORE" + }, + { + "begin": 7163, + "end": 7170, + "name": "PUSH", + "value": "5" + }, + { + "begin": 7163, + "end": 7178, + "name": "PUSH", + "value": "20" + }, + { + "begin": 7163, + "end": 7178, + "name": "SWAP1" + }, + { + "begin": 7163, + "end": 7178, + "name": "DUP2" + }, + { + "begin": 7163, + "end": 7178, + "name": "MSTORE" + }, + { + "begin": 7163, + "end": 7178, + "name": "PUSH", + "value": "40" + }, + { + "begin": 7163, + "end": 7178, + "name": "DUP1" + }, + { + "begin": 7163, + "end": 7178, + "name": "DUP4" + }, + { + "begin": 7163, + "end": 7178, + "name": "KECCAK256" + }, + { + "begin": 7163, + "end": 7188, + "name": "SWAP4" + }, + { + "begin": 7163, + "end": 7188, + "name": "SWAP1" + }, + { + "begin": 7163, + "end": 7188, + "name": "SWAP5" + }, + { + "begin": 7163, + "end": 7188, + "name": "AND" + }, + { + "begin": 7163, + "end": 7188, + "name": "DUP3" + }, + { + "begin": 7163, + "end": 7188, + "name": "MSTORE" + }, + { + "begin": 7163, + "end": 7188, + "name": "SWAP2" + }, + { + "begin": 7163, + "end": 7188, + "name": "SWAP1" + }, + { + "begin": 7163, + "end": 7188, + "name": "SWAP2" + }, + { + "begin": 7163, + "end": 7188, + "name": "MSTORE" + }, + { + "begin": 7163, + "end": 7188, + "name": "KECCAK256" + }, + { + "begin": 7163, + "end": 7188, + "name": "SLOAD" + }, + { + "begin": 7163, + "end": 7188, + "name": "SWAP1" + }, + { + "begin": 7052, + "end": 7195, + "name": "JUMP", + "value": "[out]" + }, + { + "begin": 413, + "end": 696, + "name": "tag", + "value": "249" + }, + { + "begin": 413, + "end": 696, + "name": "JUMPDEST" + }, + { + "begin": 471, + "end": 478, + "name": "PUSH", + "value": "0" + }, + { + "begin": 568, + "end": 577, + "name": "DUP1" + }, + { + "begin": 584, + "end": 585, + "name": "DUP3" + }, + { + "begin": 580, + "end": 581, + "name": "DUP5" + }, + { + "begin": 580, + "end": 585, + "name": "DUP2" + }, + { + "begin": 580, + "end": 585, + "name": "ISZERO" + }, + { + "begin": 580, + "end": 585, + "name": "ISZERO" + }, + { + "begin": 580, + "end": 585, + "name": "PUSH [tag]", + "value": "278" + }, + { + "begin": 580, + "end": 585, + "name": "JUMPI" + }, + { + "begin": 580, + "end": 585, + "name": "INVALID" + }, + { + "begin": 580, + "end": 585, + "name": "tag", + "value": "278" + }, + { + "begin": 580, + "end": 585, + "name": "JUMPDEST" + }, + { + "begin": 580, + "end": 585, + "name": "DIV" + }, + { + "begin": 580, + "end": 585, + "name": "SWAP5" + }, + { + "begin": 413, + "end": 696, + "name": "SWAP4" + }, + { + "begin": -1, + "end": -1, + "name": "POP" + }, + { + "begin": -1, + "end": -1, + "name": "POP" + }, + { + "begin": -1, + "end": -1, + "name": "POP" + }, + { + "begin": -1, + "end": -1, + "name": "POP" + }, + { + "begin": 413, + "end": 696, + "name": "JUMP", + "value": "[out]" + }, + { + "begin": 702, + "end": 822, + "name": "tag", + "value": "253" + }, + { + "begin": 702, + "end": 822, + "name": "JUMPDEST" + }, + { + "begin": 760, + "end": 767, + "name": "PUSH", + "value": "0" + }, + { + "begin": 786, + "end": 792, + "name": "DUP3" + }, + { + "begin": 786, + "end": 792, + "name": "DUP3" + }, + { + "begin": 786, + "end": 792, + "name": "GT" + }, + { + "begin": 786, + "end": 792, + "name": "ISZERO" + }, + { + "begin": 779, + "end": 793, + "name": "PUSH [tag]", + "value": "280" + }, + { + "begin": 779, + "end": 793, + "name": "JUMPI" + }, + { + "begin": 779, + "end": 793, + "name": "INVALID" + }, + { + "begin": 779, + "end": 793, + "name": "tag", + "value": "280" + }, + { + "begin": 779, + "end": 793, + "name": "JUMPDEST" + }, + { + "begin": -1, + "end": -1, + "name": "POP" + }, + { + "begin": 810, + "end": 815, + "name": "SWAP1" + }, + { + "begin": 810, + "end": 815, + "name": "SUB" + }, + { + "begin": 810, + "end": 815, + "name": "SWAP1" + }, + { + "begin": 702, + "end": 822, + "name": "JUMP", + "value": "[out]" + }, + { + "begin": 828, + "end": 971, + "name": "tag", + "value": "257" + }, + { + "begin": 828, + "end": 971, + "name": "JUMPDEST" + }, + { + "begin": 886, + "end": 893, + "name": "PUSH", + "value": "0" + }, + { + "begin": 917, + "end": 922, + "name": "DUP3" + }, + { + "begin": 917, + "end": 922, + "name": "DUP3" + }, + { + "begin": 917, + "end": 922, + "name": "ADD" + }, + { + "begin": 939, + "end": 945, + "name": "DUP4" + }, + { + "begin": 939, + "end": 945, + "name": "DUP2" + }, + { + "begin": 939, + "end": 945, + "name": "LT" + }, + { + "begin": 939, + "end": 945, + "name": "ISZERO" + }, + { + "begin": 932, + "end": 946, + "name": "PUSH [tag]", + "value": "275" + }, + { + "begin": 932, + "end": 946, + "name": "JUMPI" + }, + { + "begin": 932, + "end": 946, + "name": "INVALID" + } + ] + } + } + }, + "methodIdentifiers": { + "MAX_UINT()": "e5b5019a", + "_totalSupply()": "3eaaf86b", + "addBlackList(address)": "0ecb93c0", + "allowance(address,address)": "dd62ed3e", + "allowed(address,address)": "5c658165", + "approve(address,uint256)": "095ea7b3", + "balanceOf(address)": "70a08231", + "balances(address)": "27e235e3", + "basisPointsRate()": "dd644f72", + "decimals()": "313ce567", + "deprecate(address)": "0753c30c", + "deprecated()": "0e136b19", + "destroyBlackFunds(address)": "f3bdc228", + "getBlackListStatus(address)": "59bf1abe", + "getOwner()": "893d20e8", + "isBlackListed(address)": "e47d6060", + "issue(uint256)": "cc872b66", + "maximumFee()": "35390714", + "name()": "06fdde03", + "owner()": "8da5cb5b", + "pause()": "8456cb59", + "paused()": "5c975abb", + "redeem(uint256)": "db006a75", + "removeBlackList(address)": "e4997dc5", + "setParams(uint256,uint256)": "c0324c77", + "symbol()": "95d89b41", + "totalSupply()": "18160ddd", + "transfer(address,uint256)": "a9059cbb", + "transferFrom(address,address,uint256)": "23b872dd", + "transferOwnership(address)": "f2fde38b", + "unpause()": "3f4ba83a", + "upgradedAddress()": "26976e3f" + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.4.18+commit.9cf6e910\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"constant\":true,\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_upgradedAddress\",\"type\":\"address\"}],\"name\":\"deprecate\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_spender\",\"type\":\"address\"},{\"name\":\"_value\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"deprecated\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_evilUser\",\"type\":\"address\"}],\"name\":\"addBlackList\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_from\",\"type\":\"address\"},{\"name\":\"_to\",\"type\":\"address\"},{\"name\":\"_value\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"upgradedAddress\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"}],\"name\":\"balances\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"maximumFee\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"_totalSupply\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"unpause\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_maker\",\"type\":\"address\"}],\"name\":\"getBlackListStatus\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"},{\"name\":\"\",\"type\":\"address\"}],\"name\":\"allowed\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"paused\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"who\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"pause\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getOwner\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_to\",\"type\":\"address\"},{\"name\":\"_value\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"newBasisPoints\",\"type\":\"uint256\"},{\"name\":\"newMaxFee\",\"type\":\"uint256\"}],\"name\":\"setParams\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"issue\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"redeem\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\"},{\"name\":\"_spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"name\":\"remaining\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"basisPointsRate\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"}],\"name\":\"isBlackListed\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_clearedUser\",\"type\":\"address\"}],\"name\":\"removeBlackList\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"MAX_UINT\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_blackListedUser\",\"type\":\"address\"}],\"name\":\"destroyBlackFunds\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"name\":\"_initialSupply\",\"type\":\"uint256\"},{\"name\":\"_name\",\"type\":\"string\"},{\"name\":\"_symbol\",\"type\":\"string\"},{\"name\":\"_decimals\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Issue\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Redeem\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"newAddress\",\"type\":\"address\"}],\"name\":\"Deprecate\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"feeBasisPoints\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"maxFee\",\"type\":\"uint256\"}],\"name\":\"Params\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_blackListedUser\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_balance\",\"type\":\"uint256\"}],\"name\":\"DestroyedBlackFunds\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_user\",\"type\":\"address\"}],\"name\":\"AddedBlackList\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_user\",\"type\":\"address\"}],\"name\":\"RemovedBlackList\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"Pause\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"Unpause\",\"type\":\"event\"}],\"devdoc\":{\"methods\":{\"pause()\":{\"details\":\"called by the owner to pause, triggers stopped state\"},\"transferOwnership(address)\":{\"details\":\"Allows the current owner to transfer control of the contract to a newOwner.\",\"params\":{\"newOwner\":\"The address to transfer ownership to.\"}},\"unpause()\":{\"details\":\"called by the owner to unpause, returns to normal state\"}}},\"userdoc\":{\"methods\":{\"getBlackListStatus(address)\":{\"notice\":\"//// Getters to allow the same blacklist to be used also by other contracts (including upgraded Tether) ///////\"}}}},\"settings\":{\"compilationTarget\":{\"src/Contract.sol\":\"TetherToken\"},\"libraries\":{},\"optimizer\":{\"enabled\":true,\"runs\":1000000},\"remappings\":[\":src/=src/\"]},\"sources\":{\"src/Contract.sol\":{\"keccak256\":\"0x3e0d611f53491f313ae035797ed7ecfd1dfd8db8fef8f82737e6f0cd86d71de7\",\"urls\":[\"bzzr://9c33025fa9d1b8389e4c7c9534a1d70fad91c6c2ad70eb5e4b7dc3a701a5f892\"]}},\"version\":1}", + "userdoc": { + "methods": { + "getBlackListStatus(address)": { + "notice": "//// Getters to allow the same blacklist to be used also by other contracts (including upgraded Tether) ///////" + } + } + } + }, + "UpgradedStandardToken": { + "abi": [ + { + "constant": false, + "inputs": [ + { + "name": "_spender", + "type": "address" + }, + { + "name": "_value", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_from", + "type": "address" + }, + { + "name": "_to", + "type": "address" + }, + { + "name": "_value", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "", + "type": "address" + } + ], + "name": "balances", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "maximumFee", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "_totalSupply", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "", + "type": "address" + }, + { + "name": "", + "type": "address" + } + ], + "name": "allowed", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "from", + "type": "address" + }, + { + "name": "to", + "type": "address" + }, + { + "name": "value", + "type": "uint256" + } + ], + "name": "transferByLegacy", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "_owner", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "name": "balance", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "sender", + "type": "address" + }, + { + "name": "from", + "type": "address" + }, + { + "name": "spender", + "type": "address" + }, + { + "name": "value", + "type": "uint256" + } + ], + "name": "transferFromByLegacy", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "owner", + "outputs": [ + { + "name": "", + "type": "address" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_to", + "type": "address" + }, + { + "name": "_value", + "type": "uint256" + } + ], + "name": "transfer", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "from", + "type": "address" + }, + { + "name": "spender", + "type": "address" + }, + { + "name": "value", + "type": "uint256" + } + ], + "name": "approveByLegacy", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "_owner", + "type": "address" + }, + { + "name": "_spender", + "type": "address" + } + ], + "name": "allowance", + "outputs": [ + { + "name": "remaining", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "basisPointsRate", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "MAX_UINT", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "name": "spender", + "type": "address" + }, + { + "indexed": false, + "name": "value", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "from", + "type": "address" + }, + { + "indexed": true, + "name": "to", + "type": "address" + }, + { + "indexed": false, + "name": "value", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + } + ], + "devdoc": { + "methods": { + "allowance(address,address)": { + "details": "Function to check the amount of tokens than an owner allowed to a spender.", + "params": { + "_owner": "address The address which owns the funds.", + "_spender": "address The address which will spend the funds." + }, + "return": "A uint specifying the amount of tokens still available for the spender." + }, + "approve(address,uint256)": { + "details": "Approve the passed address to spend the specified amount of tokens on behalf of msg.sender.", + "params": { + "_spender": "The address which will spend the funds.", + "_value": "The amount of tokens to be spent." + } + }, + "balanceOf(address)": { + "details": "Gets the balance of the specified address.", + "params": { + "_owner": "The address to query the the balance of." + }, + "return": "An uint representing the amount owned by the passed address." + }, + "transfer(address,uint256)": { + "details": "transfer token for a specified address", + "params": { + "_to": "The address to transfer to.", + "_value": "The amount to be transferred." + } + }, + "transferFrom(address,address,uint256)": { + "details": "Transfer tokens from one address to another", + "params": { + "_from": "address The address which you want to send tokens from", + "_to": "address The address which you want to transfer to", + "_value": "uint the amount of tokens to be transferred" + } + }, + "transferOwnership(address)": { + "details": "Allows the current owner to transfer control of the contract to a newOwner.", + "params": { + "newOwner": "The address to transfer ownership to." + } + } + } + }, + "evm": { + "assembly": "", + "bytecode": { + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "deployedBytecode": { + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "gasEstimates": null, + "legacyAssembly": null, + "methodIdentifiers": { + "MAX_UINT()": "e5b5019a", + "_totalSupply()": "3eaaf86b", + "allowance(address,address)": "dd62ed3e", + "allowed(address,address)": "5c658165", + "approve(address,uint256)": "095ea7b3", + "approveByLegacy(address,address,uint256)": "aee92d33", + "balanceOf(address)": "70a08231", + "balances(address)": "27e235e3", + "basisPointsRate()": "dd644f72", + "maximumFee()": "35390714", + "owner()": "8da5cb5b", + "totalSupply()": "18160ddd", + "transfer(address,uint256)": "a9059cbb", + "transferByLegacy(address,address,uint256)": "6e18980a", + "transferFrom(address,address,uint256)": "23b872dd", + "transferFromByLegacy(address,address,address,uint256)": "8b477adb", + "transferOwnership(address)": "f2fde38b" + } + }, + "metadata": "", + "userdoc": { + "methods": {} + } + } + } + }, + "sources": { + "src/Contract.sol": { + "ast": { + "absolutePath": "src/Contract.sol", + "exportedSymbols": { + "BasicToken": [ + 347 + ], + "BlackList": [ + 717 + ], + "ERC20": [ + 205 + ], + "ERC20Basic": [ + 169 + ], + "Ownable": [ + 139 + ], + "Pausable": [ + 603 + ], + "SafeMath": [ + 97 + ], + "StandardToken": [ + 546 + ], + "TetherToken": [ + 1142 + ], + "UpgradedStandardToken": [ + 749 + ] + }, + "id": 1143, + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 1, + "literals": [ + "solidity", + "^", + "0.4", + ".17" + ], + "nodeType": "PragmaDirective", + "src": "67:24:0" + }, + { + "baseContracts": [], + "contractDependencies": [], + "contractKind": "library", + "documentation": "@title SafeMath\n@dev Math operations with safety checks that throw on error", + "fullyImplemented": true, + "id": 97, + "linearizedBaseContracts": [ + 97 + ], + "name": "SafeMath", + "nodeType": "ContractDefinition", + "nodes": [ + { + "body": { + "id": 33, + "nodeType": "Block", + "src": "273:134:0", + "statements": [ + { + "condition": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 12, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 10, + "name": "a", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3, + "src": "287:1:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "hexValue": "30", + "id": 11, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "292:1:0", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "src": "287:6:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": null, + "id": 16, + "nodeType": "IfStatement", + "src": "283:45:0", + "trueBody": { + "id": 15, + "nodeType": "Block", + "src": "295:33:0", + "statements": [ + { + "expression": { + "argumentTypes": null, + "hexValue": "30", + "id": 13, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "316:1:0", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "functionReturnParameters": 9, + "id": 14, + "nodeType": "Return", + "src": "309:8:0" + } + ] + } + }, + { + "assignments": [ + 18 + ], + "declarations": [ + { + "constant": false, + "id": 18, + "name": "c", + "nodeType": "VariableDeclaration", + "scope": 34, + "src": "337:9:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 17, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "337:7:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "id": 22, + "initialValue": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 21, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 19, + "name": "a", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3, + "src": "349:1:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "*", + "rightExpression": { + "argumentTypes": null, + "id": 20, + "name": "b", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5, + "src": "353:1:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "349:5:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "337:17:0" + }, + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 28, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 26, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 24, + "name": "c", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 18, + "src": "371:1:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "/", + "rightExpression": { + "argumentTypes": null, + "id": 25, + "name": "a", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3, + "src": "375:1:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "371:5:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "id": 27, + "name": "b", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5, + "src": "380:1:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "371:10:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + ], + "id": 23, + "name": "assert", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1145, + "src": "364:6:0", + "typeDescriptions": { + "typeIdentifier": "t_function_assert_pure$_t_bool_$returns$__$", + "typeString": "function (bool) pure" + } + }, + "id": 29, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "364:18:0", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 30, + "nodeType": "ExpressionStatement", + "src": "364:18:0" + }, + { + "expression": { + "argumentTypes": null, + "id": 31, + "name": "c", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 18, + "src": "399:1:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "functionReturnParameters": 9, + "id": 32, + "nodeType": "Return", + "src": "392:8:0" + } + ] + }, + "id": 34, + "implemented": true, + "isConstructor": false, + "isDeclaredConst": true, + "modifiers": [], + "name": "mul", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 6, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3, + "name": "a", + "nodeType": "VariableDeclaration", + "scope": 34, + "src": "219:9:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "219:7:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 5, + "name": "b", + "nodeType": "VariableDeclaration", + "scope": 34, + "src": "230:9:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 4, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "230:7:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "218:22:0" + }, + "payable": false, + "returnParameters": { + "id": 9, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 8, + "name": "", + "nodeType": "VariableDeclaration", + "scope": 34, + "src": "264:7:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 7, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "264:7:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "263:9:0" + }, + "scope": 97, + "src": "206:201:0", + "stateMutability": "pure", + "superFunction": null, + "visibility": "internal" + }, + { + "body": { + "id": 51, + "nodeType": "Block", + "src": "480:216:0", + "statements": [ + { + "assignments": [ + 44 + ], + "declarations": [ + { + "constant": false, + "id": 44, + "name": "c", + "nodeType": "VariableDeclaration", + "scope": 52, + "src": "568:9:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 43, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "568:7:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "id": 48, + "initialValue": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 47, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 45, + "name": "a", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 36, + "src": "580:1:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "/", + "rightExpression": { + "argumentTypes": null, + "id": 46, + "name": "b", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 38, + "src": "584:1:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "580:5:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "568:17:0" + }, + { + "expression": { + "argumentTypes": null, + "id": 49, + "name": "c", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 44, + "src": "688:1:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "functionReturnParameters": 42, + "id": 50, + "nodeType": "Return", + "src": "681:8:0" + } + ] + }, + "id": 52, + "implemented": true, + "isConstructor": false, + "isDeclaredConst": true, + "modifiers": [], + "name": "div", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 39, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 36, + "name": "a", + "nodeType": "VariableDeclaration", + "scope": 52, + "src": "426:9:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 35, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "426:7:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 38, + "name": "b", + "nodeType": "VariableDeclaration", + "scope": 52, + "src": "437:9:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 37, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "437:7:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "425:22:0" + }, + "payable": false, + "returnParameters": { + "id": 42, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 41, + "name": "", + "nodeType": "VariableDeclaration", + "scope": 52, + "src": "471:7:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 40, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "471:7:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "470:9:0" + }, + "scope": 97, + "src": "413:283:0", + "stateMutability": "pure", + "superFunction": null, + "visibility": "internal" + }, + { + "body": { + "id": 71, + "nodeType": "Block", + "src": "769:53:0", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 64, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 62, + "name": "b", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 56, + "src": "786:1:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "<=", + "rightExpression": { + "argumentTypes": null, + "id": 63, + "name": "a", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 54, + "src": "791:1:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "786:6:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + ], + "id": 61, + "name": "assert", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1145, + "src": "779:6:0", + "typeDescriptions": { + "typeIdentifier": "t_function_assert_pure$_t_bool_$returns$__$", + "typeString": "function (bool) pure" + } + }, + "id": 65, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "779:14:0", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 66, + "nodeType": "ExpressionStatement", + "src": "779:14:0" + }, + { + "expression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 69, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 67, + "name": "a", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 54, + "src": "810:1:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "-", + "rightExpression": { + "argumentTypes": null, + "id": 68, + "name": "b", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 56, + "src": "814:1:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "810:5:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "functionReturnParameters": 60, + "id": 70, + "nodeType": "Return", + "src": "803:12:0" + } + ] + }, + "id": 72, + "implemented": true, + "isConstructor": false, + "isDeclaredConst": true, + "modifiers": [], + "name": "sub", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 57, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 54, + "name": "a", + "nodeType": "VariableDeclaration", + "scope": 72, + "src": "715:9:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 53, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "715:7:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 56, + "name": "b", + "nodeType": "VariableDeclaration", + "scope": 72, + "src": "726:9:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 55, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "726:7:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "714:22:0" + }, + "payable": false, + "returnParameters": { + "id": 60, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 59, + "name": "", + "nodeType": "VariableDeclaration", + "scope": 72, + "src": "760:7:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 58, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "760:7:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "759:9:0" + }, + "scope": 97, + "src": "702:120:0", + "stateMutability": "pure", + "superFunction": null, + "visibility": "internal" + }, + { + "body": { + "id": 95, + "nodeType": "Block", + "src": "895:76:0", + "statements": [ + { + "assignments": [ + 82 + ], + "declarations": [ + { + "constant": false, + "id": 82, + "name": "c", + "nodeType": "VariableDeclaration", + "scope": 96, + "src": "905:9:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 81, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "905:7:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "id": 86, + "initialValue": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 85, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 83, + "name": "a", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 74, + "src": "917:1:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "+", + "rightExpression": { + "argumentTypes": null, + "id": 84, + "name": "b", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 76, + "src": "921:1:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "917:5:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "905:17:0" + }, + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 90, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 88, + "name": "c", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 82, + "src": "939:1:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">=", + "rightExpression": { + "argumentTypes": null, + "id": 89, + "name": "a", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 74, + "src": "944:1:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "939:6:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + ], + "id": 87, + "name": "assert", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1145, + "src": "932:6:0", + "typeDescriptions": { + "typeIdentifier": "t_function_assert_pure$_t_bool_$returns$__$", + "typeString": "function (bool) pure" + } + }, + "id": 91, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "932:14:0", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 92, + "nodeType": "ExpressionStatement", + "src": "932:14:0" + }, + { + "expression": { + "argumentTypes": null, + "id": 93, + "name": "c", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 82, + "src": "963:1:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "functionReturnParameters": 80, + "id": 94, + "nodeType": "Return", + "src": "956:8:0" + } + ] + }, + "id": 96, + "implemented": true, + "isConstructor": false, + "isDeclaredConst": true, + "modifiers": [], + "name": "add", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 77, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 74, + "name": "a", + "nodeType": "VariableDeclaration", + "scope": 96, + "src": "841:9:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 73, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "841:7:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 76, + "name": "b", + "nodeType": "VariableDeclaration", + "scope": 96, + "src": "852:9:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 75, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "852:7:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "840:22:0" + }, + "payable": false, + "returnParameters": { + "id": 80, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 79, + "name": "", + "nodeType": "VariableDeclaration", + "scope": 96, + "src": "886:7:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 78, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "886:7:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "885:9:0" + }, + "scope": 97, + "src": "828:143:0", + "stateMutability": "pure", + "superFunction": null, + "visibility": "internal" + } + ], + "scope": 1143, + "src": "183:790:0" + }, + { + "baseContracts": [], + "contractDependencies": [], + "contractKind": "contract", + "documentation": "@title Ownable\n@dev The Ownable contract has an owner address, and provides basic authorization control\nfunctions, this simplifies the implementation of \"user permissions\".", + "fullyImplemented": true, + "id": 139, + "linearizedBaseContracts": [ + 139 + ], + "name": "Ownable", + "nodeType": "ContractDefinition", + "nodes": [ + { + "constant": false, + "id": 99, + "name": "owner", + "nodeType": "VariableDeclaration", + "scope": 139, + "src": "1188:20:0", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 98, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "1188:7:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "public" + }, + { + "body": { + "id": 107, + "nodeType": "Block", + "src": "1368:35:0", + "statements": [ + { + "expression": { + "argumentTypes": null, + "id": 105, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 102, + "name": "owner", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 99, + "src": "1378:5:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 103, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1154, + "src": "1386:3:0", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 104, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "1386:10:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "src": "1378:18:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "id": 106, + "nodeType": "ExpressionStatement", + "src": "1378:18:0" + } + ] + }, + "id": 108, + "implemented": true, + "isConstructor": true, + "isDeclaredConst": false, + "modifiers": [], + "name": "Ownable", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 100, + "nodeType": "ParameterList", + "parameters": [], + "src": "1358:2:0" + }, + "payable": false, + "returnParameters": { + "id": 101, + "nodeType": "ParameterList", + "parameters": [], + "src": "1368:0:0" + }, + "scope": 139, + "src": "1342:61:0", + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "public" + }, + { + "body": { + "id": 118, + "nodeType": "Block", + "src": "1514:56:0", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "id": 114, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 111, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1154, + "src": "1532:3:0", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 112, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "1532:10:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "id": 113, + "name": "owner", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 99, + "src": "1546:5:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "src": "1532:19:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + ], + "id": 110, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1157, + "src": "1524:7:0", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$returns$__$", + "typeString": "function (bool) pure" + } + }, + "id": 115, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "1524:28:0", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 116, + "nodeType": "ExpressionStatement", + "src": "1524:28:0" + }, + { + "id": 117, + "nodeType": "PlaceholderStatement", + "src": "1562:1:0" + } + ] + }, + "id": 119, + "name": "onlyOwner", + "nodeType": "ModifierDefinition", + "parameters": { + "id": 109, + "nodeType": "ParameterList", + "parameters": [], + "src": "1511:2:0" + }, + "src": "1493:77:0", + "visibility": "internal" + }, + { + "body": { + "id": 137, + "nodeType": "Block", + "src": "1800:85:0", + "statements": [ + { + "condition": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "id": 130, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 126, + "name": "newOwner", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 121, + "src": "1814:8:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "hexValue": "30", + "id": 128, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "1834:1:0", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + } + ], + "id": 127, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "1826:7:0", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": "address" + }, + "id": 129, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "typeConversion", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "1826:10:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "src": "1814:22:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": null, + "id": 136, + "nodeType": "IfStatement", + "src": "1810:69:0", + "trueBody": { + "id": 135, + "nodeType": "Block", + "src": "1838:41:0", + "statements": [ + { + "expression": { + "argumentTypes": null, + "id": 133, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 131, + "name": "owner", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 99, + "src": "1852:5:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "id": 132, + "name": "newOwner", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 121, + "src": "1860:8:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "src": "1852:16:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "id": 134, + "nodeType": "ExpressionStatement", + "src": "1852:16:0" + } + ] + } + } + ] + }, + "id": 138, + "implemented": true, + "isConstructor": false, + "isDeclaredConst": false, + "modifiers": [ + { + "arguments": [], + "id": 124, + "modifierName": { + "argumentTypes": null, + "id": 123, + "name": "onlyOwner", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 119, + "src": "1790:9:0", + "typeDescriptions": { + "typeIdentifier": "t_modifier$__$", + "typeString": "modifier ()" + } + }, + "nodeType": "ModifierInvocation", + "src": "1790:9:0" + } + ], + "name": "transferOwnership", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 122, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 121, + "name": "newOwner", + "nodeType": "VariableDeclaration", + "scope": 138, + "src": "1765:16:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 120, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "1765:7:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "1764:18:0" + }, + "payable": false, + "returnParameters": { + "id": 125, + "nodeType": "ParameterList", + "parameters": [], + "src": "1800:0:0" + }, + "scope": 139, + "src": "1738:147:0", + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "public" + } + ], + "scope": 1143, + "src": "1165:723:0" + }, + { + "baseContracts": [], + "contractDependencies": [], + "contractKind": "contract", + "documentation": "@title ERC20Basic\n@dev Simpler version of ERC20 interface\n@dev see https://github.com/ethereum/EIPs/issues/20", + "fullyImplemented": false, + "id": 169, + "linearizedBaseContracts": [ + 169 + ], + "name": "ERC20Basic", + "nodeType": "ContractDefinition", + "nodes": [ + { + "constant": false, + "id": 141, + "name": "_totalSupply", + "nodeType": "VariableDeclaration", + "scope": 169, + "src": "2043:24:0", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 140, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "2043:4:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "public" + }, + { + "body": null, + "id": 146, + "implemented": false, + "isConstructor": false, + "isDeclaredConst": true, + "modifiers": [], + "name": "totalSupply", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 142, + "nodeType": "ParameterList", + "parameters": [], + "src": "2093:2:0" + }, + "payable": false, + "returnParameters": { + "id": 145, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 144, + "name": "", + "nodeType": "VariableDeclaration", + "scope": 146, + "src": "2121:4:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 143, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "2121:4:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "2120:6:0" + }, + "scope": 169, + "src": "2073:54:0", + "stateMutability": "view", + "superFunction": null, + "visibility": "public" + }, + { + "body": null, + "id": 153, + "implemented": false, + "isConstructor": false, + "isDeclaredConst": true, + "modifiers": [], + "name": "balanceOf", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 149, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 148, + "name": "who", + "nodeType": "VariableDeclaration", + "scope": 153, + "src": "2151:11:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 147, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "2151:7:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "2150:13:0" + }, + "payable": false, + "returnParameters": { + "id": 152, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 151, + "name": "", + "nodeType": "VariableDeclaration", + "scope": 153, + "src": "2189:4:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 150, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "2189:4:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "2188:6:0" + }, + "scope": 169, + "src": "2132:63:0", + "stateMutability": "view", + "superFunction": null, + "visibility": "public" + }, + { + "body": null, + "id": 160, + "implemented": false, + "isConstructor": false, + "isDeclaredConst": false, + "modifiers": [], + "name": "transfer", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 158, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 155, + "name": "to", + "nodeType": "VariableDeclaration", + "scope": 160, + "src": "2218:10:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 154, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "2218:7:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 157, + "name": "value", + "nodeType": "VariableDeclaration", + "scope": 160, + "src": "2230:10:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 156, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "2230:4:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "2217:24:0" + }, + "payable": false, + "returnParameters": { + "id": 159, + "nodeType": "ParameterList", + "parameters": [], + "src": "2248:0:0" + }, + "scope": 169, + "src": "2200:49:0", + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "public" + }, + { + "anonymous": false, + "id": 168, + "name": "Transfer", + "nodeType": "EventDefinition", + "parameters": { + "id": 167, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 162, + "indexed": true, + "name": "from", + "nodeType": "VariableDeclaration", + "scope": 168, + "src": "2269:20:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 161, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "2269:7:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 164, + "indexed": true, + "name": "to", + "nodeType": "VariableDeclaration", + "scope": 168, + "src": "2291:18:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 163, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "2291:7:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 166, + "indexed": false, + "name": "value", + "nodeType": "VariableDeclaration", + "scope": 168, + "src": "2311:10:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 165, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "2311:4:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "2268:54:0" + }, + "src": "2254:69:0" + } + ], + "scope": 1143, + "src": "2017:308:0" + }, + { + "baseContracts": [ + { + "arguments": [], + "baseName": { + "contractScope": null, + "id": 170, + "name": "ERC20Basic", + "nodeType": "UserDefinedTypeName", + "referencedDeclaration": 169, + "src": "2434:10:0", + "typeDescriptions": { + "typeIdentifier": "t_contract$_ERC20Basic_$169", + "typeString": "contract ERC20Basic" + } + }, + "id": 171, + "nodeType": "InheritanceSpecifier", + "src": "2434:10:0" + } + ], + "contractDependencies": [ + 169 + ], + "contractKind": "contract", + "documentation": "@title ERC20 interface\n@dev see https://github.com/ethereum/EIPs/issues/20", + "fullyImplemented": false, + "id": 205, + "linearizedBaseContracts": [ + 205, + 169 + ], + "name": "ERC20", + "nodeType": "ContractDefinition", + "nodes": [ + { + "body": null, + "id": 180, + "implemented": false, + "isConstructor": false, + "isDeclaredConst": true, + "modifiers": [], + "name": "allowance", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 176, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 173, + "name": "owner", + "nodeType": "VariableDeclaration", + "scope": 180, + "src": "2470:13:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 172, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "2470:7:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 175, + "name": "spender", + "nodeType": "VariableDeclaration", + "scope": 180, + "src": "2485:15:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 174, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "2485:7:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "2469:32:0" + }, + "payable": false, + "returnParameters": { + "id": 179, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 178, + "name": "", + "nodeType": "VariableDeclaration", + "scope": 180, + "src": "2527:4:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 177, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "2527:4:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "2526:6:0" + }, + "scope": 205, + "src": "2451:82:0", + "stateMutability": "view", + "superFunction": null, + "visibility": "public" + }, + { + "body": null, + "id": 189, + "implemented": false, + "isConstructor": false, + "isDeclaredConst": false, + "modifiers": [], + "name": "transferFrom", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 187, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 182, + "name": "from", + "nodeType": "VariableDeclaration", + "scope": 189, + "src": "2560:12:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 181, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "2560:7:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 184, + "name": "to", + "nodeType": "VariableDeclaration", + "scope": 189, + "src": "2574:10:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 183, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "2574:7:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 186, + "name": "value", + "nodeType": "VariableDeclaration", + "scope": 189, + "src": "2586:10:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 185, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "2586:4:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "2559:38:0" + }, + "payable": false, + "returnParameters": { + "id": 188, + "nodeType": "ParameterList", + "parameters": [], + "src": "2604:0:0" + }, + "scope": 205, + "src": "2538:67:0", + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "public" + }, + { + "body": null, + "id": 196, + "implemented": false, + "isConstructor": false, + "isDeclaredConst": false, + "modifiers": [], + "name": "approve", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 194, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 191, + "name": "spender", + "nodeType": "VariableDeclaration", + "scope": 196, + "src": "2627:15:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 190, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "2627:7:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 193, + "name": "value", + "nodeType": "VariableDeclaration", + "scope": 196, + "src": "2644:10:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 192, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "2644:4:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "2626:29:0" + }, + "payable": false, + "returnParameters": { + "id": 195, + "nodeType": "ParameterList", + "parameters": [], + "src": "2662:0:0" + }, + "scope": 205, + "src": "2610:53:0", + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "public" + }, + { + "anonymous": false, + "id": 204, + "name": "Approval", + "nodeType": "EventDefinition", + "parameters": { + "id": 203, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 198, + "indexed": true, + "name": "owner", + "nodeType": "VariableDeclaration", + "scope": 204, + "src": "2683:21:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 197, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "2683:7:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 200, + "indexed": true, + "name": "spender", + "nodeType": "VariableDeclaration", + "scope": 204, + "src": "2706:23:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 199, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "2706:7:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 202, + "indexed": false, + "name": "value", + "nodeType": "VariableDeclaration", + "scope": 204, + "src": "2731:10:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 201, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "2731:4:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "2682:60:0" + }, + "src": "2668:75:0" + } + ], + "scope": 1143, + "src": "2416:329:0" + }, + { + "baseContracts": [ + { + "arguments": [], + "baseName": { + "contractScope": null, + "id": 206, + "name": "Ownable", + "nodeType": "UserDefinedTypeName", + "referencedDeclaration": 139, + "src": "2860:7:0", + "typeDescriptions": { + "typeIdentifier": "t_contract$_Ownable_$139", + "typeString": "contract Ownable" + } + }, + "id": 207, + "nodeType": "InheritanceSpecifier", + "src": "2860:7:0" + }, + { + "arguments": [], + "baseName": { + "contractScope": null, + "id": 208, + "name": "ERC20Basic", + "nodeType": "UserDefinedTypeName", + "referencedDeclaration": 169, + "src": "2869:10:0", + "typeDescriptions": { + "typeIdentifier": "t_contract$_ERC20Basic_$169", + "typeString": "contract ERC20Basic" + } + }, + "id": 209, + "nodeType": "InheritanceSpecifier", + "src": "2869:10:0" + } + ], + "contractDependencies": [ + 139, + 169 + ], + "contractKind": "contract", + "documentation": "@title Basic token\n@dev Basic version of StandardToken, with no allowances.", + "fullyImplemented": false, + "id": 347, + "linearizedBaseContracts": [ + 347, + 169, + 139 + ], + "name": "BasicToken", + "nodeType": "ContractDefinition", + "nodes": [ + { + "id": 212, + "libraryName": { + "contractScope": null, + "id": 210, + "name": "SafeMath", + "nodeType": "UserDefinedTypeName", + "referencedDeclaration": 97, + "src": "2892:8:0", + "typeDescriptions": { + "typeIdentifier": "t_contract$_SafeMath_$97", + "typeString": "library SafeMath" + } + }, + "nodeType": "UsingForDirective", + "src": "2886:24:0", + "typeName": { + "id": 211, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "2905:4:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + }, + { + "constant": false, + "id": 216, + "name": "balances", + "nodeType": "VariableDeclaration", + "scope": 347, + "src": "2916:40:0", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$", + "typeString": "mapping(address => uint256)" + }, + "typeName": { + "id": 215, + "keyType": { + "id": 213, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "2924:7:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "Mapping", + "src": "2916:24:0", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$", + "typeString": "mapping(address => uint256)" + }, + "valueType": { + "id": 214, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "2935:4:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + }, + "value": null, + "visibility": "public" + }, + { + "constant": false, + "id": 219, + "name": "basisPointsRate", + "nodeType": "VariableDeclaration", + "scope": 347, + "src": "3041:31:0", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 217, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "3041:4:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": { + "argumentTypes": null, + "hexValue": "30", + "id": 218, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "3071:1:0", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "visibility": "public" + }, + { + "constant": false, + "id": 222, + "name": "maximumFee", + "nodeType": "VariableDeclaration", + "scope": 347, + "src": "3078:26:0", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 220, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "3078:4:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": { + "argumentTypes": null, + "hexValue": "30", + "id": 221, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "3103:1:0", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "visibility": "public" + }, + { + "body": { + "id": 239, + "nodeType": "Block", + "src": "3213:66:0", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 235, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "UnaryOperation", + "operator": "!", + "prefix": true, + "src": "3231:29:0", + "subExpression": { + "argumentTypes": null, + "components": [ + { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 233, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 227, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1154, + "src": "3233:3:0", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 228, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "data", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "3233:8:0", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes calldata" + } + }, + "id": 229, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "length", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "3233:15:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "<", + "rightExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 232, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 230, + "name": "size", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 224, + "src": "3251:4:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "+", + "rightExpression": { + "argumentTypes": null, + "hexValue": "34", + "id": 231, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "3258:1:0", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_4_by_1", + "typeString": "int_const 4" + }, + "value": "4" + }, + "src": "3251:8:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "3233:26:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + } + ], + "id": 234, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "3232:28:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + ], + "id": 226, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1157, + "src": "3223:7:0", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$returns$__$", + "typeString": "function (bool) pure" + } + }, + "id": 236, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "3223:38:0", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 237, + "nodeType": "ExpressionStatement", + "src": "3223:38:0" + }, + { + "id": 238, + "nodeType": "PlaceholderStatement", + "src": "3271:1:0" + } + ] + }, + "id": 240, + "name": "onlyPayloadSize", + "nodeType": "ModifierDefinition", + "parameters": { + "id": 225, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 224, + "name": "size", + "nodeType": "VariableDeclaration", + "scope": 240, + "src": "3202:9:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 223, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "3202:4:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "3201:11:0" + }, + "src": "3177:102:0", + "visibility": "internal" + }, + { + "body": { + "id": 333, + "nodeType": "Block", + "src": "3520:485:0", + "statements": [ + { + "assignments": [ + 253 + ], + "declarations": [ + { + "constant": false, + "id": 253, + "name": "fee", + "nodeType": "VariableDeclaration", + "scope": 334, + "src": "3530:8:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 252, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "3530:4:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "id": 262, + "initialValue": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "hexValue": "3130303030", + "id": 260, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "3575:5:0", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_10000_by_1", + "typeString": "int_const 10000" + }, + "value": "10000" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_10000_by_1", + "typeString": "int_const 10000" + } + ], + "expression": { + "argumentTypes": null, + "components": [ + { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 256, + "name": "basisPointsRate", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 219, + "src": "3553:15:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "argumentTypes": null, + "id": 254, + "name": "_value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 244, + "src": "3542:6:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 255, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "mul", + "nodeType": "MemberAccess", + "referencedDeclaration": 34, + "src": "3542:10:0", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", + "typeString": "function (uint256,uint256) pure returns (uint256)" + } + }, + "id": 257, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "3542:27:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "id": 258, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "3541:29:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 259, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "div", + "nodeType": "MemberAccess", + "referencedDeclaration": 52, + "src": "3541:33:0", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", + "typeString": "function (uint256,uint256) pure returns (uint256)" + } + }, + "id": 261, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "3541:40:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "3530:51:0" + }, + { + "condition": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 265, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 263, + "name": "fee", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 253, + "src": "3595:3:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">", + "rightExpression": { + "argumentTypes": null, + "id": 264, + "name": "maximumFee", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 222, + "src": "3601:10:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "3595:16:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": null, + "id": 271, + "nodeType": "IfStatement", + "src": "3591:63:0", + "trueBody": { + "id": 270, + "nodeType": "Block", + "src": "3613:41:0", + "statements": [ + { + "expression": { + "argumentTypes": null, + "id": 268, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 266, + "name": "fee", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 253, + "src": "3627:3:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "id": 267, + "name": "maximumFee", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 222, + "src": "3633:10:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "3627:16:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 269, + "nodeType": "ExpressionStatement", + "src": "3627:16:0" + } + ] + } + }, + { + "assignments": [ + 273 + ], + "declarations": [ + { + "constant": false, + "id": 273, + "name": "sendAmount", + "nodeType": "VariableDeclaration", + "scope": 334, + "src": "3663:15:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 272, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "3663:4:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "id": 278, + "initialValue": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 276, + "name": "fee", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 253, + "src": "3692:3:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "argumentTypes": null, + "id": 274, + "name": "_value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 244, + "src": "3681:6:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 275, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sub", + "nodeType": "MemberAccess", + "referencedDeclaration": 72, + "src": "3681:10:0", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", + "typeString": "function (uint256,uint256) pure returns (uint256)" + } + }, + "id": 277, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "3681:15:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "3663:33:0" + }, + { + "expression": { + "argumentTypes": null, + "id": 290, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "id": 279, + "name": "balances", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 216, + "src": "3706:8:0", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$", + "typeString": "mapping(address => uint256)" + } + }, + "id": 282, + "indexExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 280, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1154, + "src": "3715:3:0", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 281, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "3715:10:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "nodeType": "IndexAccess", + "src": "3706:20:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 288, + "name": "_value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 244, + "src": "3754:6:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "id": 283, + "name": "balances", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 216, + "src": "3729:8:0", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$", + "typeString": "mapping(address => uint256)" + } + }, + "id": 286, + "indexExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 284, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1154, + "src": "3738:3:0", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 285, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "3738:10:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "3729:20:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 287, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sub", + "nodeType": "MemberAccess", + "referencedDeclaration": 72, + "src": "3729:24:0", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", + "typeString": "function (uint256,uint256) pure returns (uint256)" + } + }, + "id": 289, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "3729:32:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "3706:55:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 291, + "nodeType": "ExpressionStatement", + "src": "3706:55:0" + }, + { + "expression": { + "argumentTypes": null, + "id": 301, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "id": 292, + "name": "balances", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 216, + "src": "3771:8:0", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$", + "typeString": "mapping(address => uint256)" + } + }, + "id": 294, + "indexExpression": { + "argumentTypes": null, + "id": 293, + "name": "_to", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 242, + "src": "3780:3:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "nodeType": "IndexAccess", + "src": "3771:13:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 299, + "name": "sendAmount", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 273, + "src": "3805:10:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "id": 295, + "name": "balances", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 216, + "src": "3787:8:0", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$", + "typeString": "mapping(address => uint256)" + } + }, + "id": 297, + "indexExpression": { + "argumentTypes": null, + "id": 296, + "name": "_to", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 242, + "src": "3796:3:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "3787:13:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 298, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "add", + "nodeType": "MemberAccess", + "referencedDeclaration": 96, + "src": "3787:17:0", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", + "typeString": "function (uint256,uint256) pure returns (uint256)" + } + }, + "id": 300, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "3787:29:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "3771:45:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 302, + "nodeType": "ExpressionStatement", + "src": "3771:45:0" + }, + { + "condition": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 305, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 303, + "name": "fee", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 253, + "src": "3830:3:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">", + "rightExpression": { + "argumentTypes": null, + "hexValue": "30", + "id": 304, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "3836:1:0", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "src": "3830:7:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": null, + "id": 325, + "nodeType": "IfStatement", + "src": "3826:126:0", + "trueBody": { + "id": 324, + "nodeType": "Block", + "src": "3839:113:0", + "statements": [ + { + "expression": { + "argumentTypes": null, + "id": 315, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "id": 306, + "name": "balances", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 216, + "src": "3853:8:0", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$", + "typeString": "mapping(address => uint256)" + } + }, + "id": 308, + "indexExpression": { + "argumentTypes": null, + "id": 307, + "name": "owner", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 99, + "src": "3862:5:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "nodeType": "IndexAccess", + "src": "3853:15:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 313, + "name": "fee", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 253, + "src": "3891:3:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "id": 309, + "name": "balances", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 216, + "src": "3871:8:0", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$", + "typeString": "mapping(address => uint256)" + } + }, + "id": 311, + "indexExpression": { + "argumentTypes": null, + "id": 310, + "name": "owner", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 99, + "src": "3880:5:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "3871:15:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 312, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "add", + "nodeType": "MemberAccess", + "referencedDeclaration": 96, + "src": "3871:19:0", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", + "typeString": "function (uint256,uint256) pure returns (uint256)" + } + }, + "id": 314, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "3871:24:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "3853:42:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 316, + "nodeType": "ExpressionStatement", + "src": "3853:42:0" + }, + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 318, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1154, + "src": "3918:3:0", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 319, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "3918:10:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "argumentTypes": null, + "id": 320, + "name": "owner", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 99, + "src": "3930:5:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "argumentTypes": null, + "id": 321, + "name": "fee", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 253, + "src": "3937:3:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 317, + "name": "Transfer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 168, + "src": "3909:8:0", + "typeDescriptions": { + "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$", + "typeString": "function (address,address,uint256)" + } + }, + "id": 322, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "3909:32:0", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 323, + "nodeType": "ExpressionStatement", + "src": "3909:32:0" + } + ] + } + }, + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 327, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1154, + "src": "3970:3:0", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 328, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "3970:10:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "argumentTypes": null, + "id": 329, + "name": "_to", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 242, + "src": "3982:3:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "argumentTypes": null, + "id": 330, + "name": "sendAmount", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 273, + "src": "3987:10:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 326, + "name": "Transfer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 168, + "src": "3961:8:0", + "typeDescriptions": { + "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$", + "typeString": "function (address,address,uint256)" + } + }, + "id": 331, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "3961:37:0", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 332, + "nodeType": "ExpressionStatement", + "src": "3961:37:0" + } + ] + }, + "id": 334, + "implemented": true, + "isConstructor": false, + "isDeclaredConst": false, + "modifiers": [ + { + "arguments": [ + { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_rational_64_by_1", + "typeString": "int_const 64" + }, + "id": 249, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "hexValue": "32", + "id": 247, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "3512:1:0", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_2_by_1", + "typeString": "int_const 2" + }, + "value": "2" + }, + "nodeType": "BinaryOperation", + "operator": "*", + "rightExpression": { + "argumentTypes": null, + "hexValue": "3332", + "id": 248, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "3516:2:0", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_32_by_1", + "typeString": "int_const 32" + }, + "value": "32" + }, + "src": "3512:6:0", + "typeDescriptions": { + "typeIdentifier": "t_rational_64_by_1", + "typeString": "int_const 64" + } + } + ], + "id": 250, + "modifierName": { + "argumentTypes": null, + "id": 246, + "name": "onlyPayloadSize", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 240, + "src": "3496:15:0", + "typeDescriptions": { + "typeIdentifier": "t_modifier$_t_uint256_$", + "typeString": "modifier (uint256)" + } + }, + "nodeType": "ModifierInvocation", + "src": "3496:23:0" + } + ], + "name": "transfer", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 245, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 242, + "name": "_to", + "nodeType": "VariableDeclaration", + "scope": 334, + "src": "3463:11:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 241, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "3463:7:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 244, + "name": "_value", + "nodeType": "VariableDeclaration", + "scope": 334, + "src": "3476:11:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 243, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "3476:4:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "3462:26:0" + }, + "payable": false, + "returnParameters": { + "id": 251, + "nodeType": "ParameterList", + "parameters": [], + "src": "3520:0:0" + }, + "scope": 347, + "src": "3445:560:0", + "stateMutability": "nonpayable", + "superFunction": 160, + "visibility": "public" + }, + { + "body": { + "id": 345, + "nodeType": "Block", + "src": "4290:40:0", + "statements": [ + { + "expression": { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "id": 341, + "name": "balances", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 216, + "src": "4307:8:0", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$", + "typeString": "mapping(address => uint256)" + } + }, + "id": 343, + "indexExpression": { + "argumentTypes": null, + "id": 342, + "name": "_owner", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 336, + "src": "4316:6:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "4307:16:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "functionReturnParameters": 340, + "id": 344, + "nodeType": "Return", + "src": "4300:23:0" + } + ] + }, + "id": 346, + "implemented": true, + "isConstructor": false, + "isDeclaredConst": true, + "modifiers": [], + "name": "balanceOf", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 337, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 336, + "name": "_owner", + "nodeType": "VariableDeclaration", + "scope": 346, + "src": "4235:14:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 335, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "4235:7:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "4234:16:0" + }, + "payable": false, + "returnParameters": { + "id": 340, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 339, + "name": "balance", + "nodeType": "VariableDeclaration", + "scope": 346, + "src": "4276:12:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 338, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "4276:4:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "4275:14:0" + }, + "scope": 347, + "src": "4216:114:0", + "stateMutability": "view", + "superFunction": 153, + "visibility": "public" + } + ], + "scope": 1143, + "src": "2837:1496:0" + }, + { + "baseContracts": [ + { + "arguments": [], + "baseName": { + "contractScope": null, + "id": 348, + "name": "BasicToken", + "nodeType": "UserDefinedTypeName", + "referencedDeclaration": 347, + "src": "4627:10:0", + "typeDescriptions": { + "typeIdentifier": "t_contract$_BasicToken_$347", + "typeString": "contract BasicToken" + } + }, + "id": 349, + "nodeType": "InheritanceSpecifier", + "src": "4627:10:0" + }, + { + "arguments": [], + "baseName": { + "contractScope": null, + "id": 350, + "name": "ERC20", + "nodeType": "UserDefinedTypeName", + "referencedDeclaration": 205, + "src": "4639:5:0", + "typeDescriptions": { + "typeIdentifier": "t_contract$_ERC20_$205", + "typeString": "contract ERC20" + } + }, + "id": 351, + "nodeType": "InheritanceSpecifier", + "src": "4639:5:0" + } + ], + "contractDependencies": [ + 347, + 139, + 169, + 205 + ], + "contractKind": "contract", + "documentation": "@title Standard ERC20 token\n * @dev Implementation of the basic standard token.\n@dev https://github.com/ethereum/EIPs/issues/20\n@dev Based oncode by FirstBlood: https://github.com/Firstbloodio/token/blob/master/smart_contract/FirstBloodToken.sol", + "fullyImplemented": false, + "id": 546, + "linearizedBaseContracts": [ + 546, + 205, + 347, + 169, + 139 + ], + "name": "StandardToken", + "nodeType": "ContractDefinition", + "nodes": [ + { + "constant": false, + "id": 357, + "name": "allowed", + "nodeType": "VariableDeclaration", + "scope": 546, + "src": "4652:61:0", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_uint256_$_$", + "typeString": "mapping(address => mapping(address => uint256))" + }, + "typeName": { + "id": 356, + "keyType": { + "id": 352, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "4661:7:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "Mapping", + "src": "4652:46:0", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_uint256_$_$", + "typeString": "mapping(address => mapping(address => uint256))" + }, + "valueType": { + "id": 355, + "keyType": { + "id": 353, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "4681:7:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "Mapping", + "src": "4672:25:0", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$", + "typeString": "mapping(address => uint256)" + }, + "valueType": { + "id": 354, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "4692:4:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + } + }, + "value": null, + "visibility": "public" + }, + { + "constant": true, + "id": 364, + "name": "MAX_UINT", + "nodeType": "VariableDeclaration", + "scope": 546, + "src": "4720:42:0", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 358, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "4720:4:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_rational_115792089237316195423570985008687907853269984665640564039457584007913129639935_by_1", + "typeString": "int_const 115792089237316195423570985008687907853269984665640564039457584007913129639935" + }, + "id": 363, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_rational_115792089237316195423570985008687907853269984665640564039457584007913129639936_by_1", + "typeString": "int_const 115792089237316195423570985008687907853269984665640564039457584007913129639936" + }, + "id": 361, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "hexValue": "32", + "id": 359, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "4752:1:0", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_2_by_1", + "typeString": "int_const 2" + }, + "value": "2" + }, + "nodeType": "BinaryOperation", + "operator": "**", + "rightExpression": { + "argumentTypes": null, + "hexValue": "323536", + "id": 360, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "4755:3:0", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_256_by_1", + "typeString": "int_const 256" + }, + "value": "256" + }, + "src": "4752:6:0", + "typeDescriptions": { + "typeIdentifier": "t_rational_115792089237316195423570985008687907853269984665640564039457584007913129639936_by_1", + "typeString": "int_const 115792089237316195423570985008687907853269984665640564039457584007913129639936" + } + }, + "nodeType": "BinaryOperation", + "operator": "-", + "rightExpression": { + "argumentTypes": null, + "hexValue": "31", + "id": 362, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "4761:1:0", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_1_by_1", + "typeString": "int_const 1" + }, + "value": "1" + }, + "src": "4752:10:0", + "typeDescriptions": { + "typeIdentifier": "t_rational_115792089237316195423570985008687907853269984665640564039457584007913129639935_by_1", + "typeString": "int_const 115792089237316195423570985008687907853269984665640564039457584007913129639935" + } + }, + "visibility": "public" + }, + { + "body": { + "id": 480, + "nodeType": "Block", + "src": "5138:786:0", + "statements": [ + { + "assignments": [ + 378 + ], + "declarations": [ + { + "constant": false, + "id": 378, + "name": "_allowance", + "nodeType": "VariableDeclaration", + "scope": 481, + "src": "5148:14:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": null, + "value": null, + "visibility": "internal" + } + ], + "id": 385, + "initialValue": { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "id": 379, + "name": "allowed", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 357, + "src": "5165:7:0", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_uint256_$_$", + "typeString": "mapping(address => mapping(address => uint256))" + } + }, + "id": 381, + "indexExpression": { + "argumentTypes": null, + "id": 380, + "name": "_from", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 366, + "src": "5173:5:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "5165:14:0", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$", + "typeString": "mapping(address => uint256)" + } + }, + "id": 384, + "indexExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 382, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1154, + "src": "5180:3:0", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 383, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "5180:10:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "5165:26:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "5148:43:0" + }, + { + "assignments": [ + 387 + ], + "declarations": [ + { + "constant": false, + "id": 387, + "name": "fee", + "nodeType": "VariableDeclaration", + "scope": 481, + "src": "5357:8:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 386, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "5357:4:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "id": 396, + "initialValue": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "hexValue": "3130303030", + "id": 394, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "5402:5:0", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_10000_by_1", + "typeString": "int_const 10000" + }, + "value": "10000" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_10000_by_1", + "typeString": "int_const 10000" + } + ], + "expression": { + "argumentTypes": null, + "components": [ + { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 390, + "name": "basisPointsRate", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 219, + "src": "5380:15:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "argumentTypes": null, + "id": 388, + "name": "_value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 370, + "src": "5369:6:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 389, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "mul", + "nodeType": "MemberAccess", + "referencedDeclaration": 34, + "src": "5369:10:0", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", + "typeString": "function (uint256,uint256) pure returns (uint256)" + } + }, + "id": 391, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "5369:27:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "id": 392, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "5368:29:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 393, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "div", + "nodeType": "MemberAccess", + "referencedDeclaration": 52, + "src": "5368:33:0", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", + "typeString": "function (uint256,uint256) pure returns (uint256)" + } + }, + "id": 395, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "5368:40:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "5357:51:0" + }, + { + "condition": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 399, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 397, + "name": "fee", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 387, + "src": "5422:3:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">", + "rightExpression": { + "argumentTypes": null, + "id": 398, + "name": "maximumFee", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 222, + "src": "5428:10:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "5422:16:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": null, + "id": 405, + "nodeType": "IfStatement", + "src": "5418:63:0", + "trueBody": { + "id": 404, + "nodeType": "Block", + "src": "5440:41:0", + "statements": [ + { + "expression": { + "argumentTypes": null, + "id": 402, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 400, + "name": "fee", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 387, + "src": "5454:3:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "id": 401, + "name": "maximumFee", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 222, + "src": "5460:10:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "5454:16:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 403, + "nodeType": "ExpressionStatement", + "src": "5454:16:0" + } + ] + } + }, + { + "condition": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 408, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 406, + "name": "_allowance", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 378, + "src": "5494:10:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "<", + "rightExpression": { + "argumentTypes": null, + "id": 407, + "name": "MAX_UINT", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 364, + "src": "5507:8:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "5494:21:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": null, + "id": 422, + "nodeType": "IfStatement", + "src": "5490:103:0", + "trueBody": { + "id": 421, + "nodeType": "Block", + "src": "5517:76:0", + "statements": [ + { + "expression": { + "argumentTypes": null, + "id": 419, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "id": 409, + "name": "allowed", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 357, + "src": "5531:7:0", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_uint256_$_$", + "typeString": "mapping(address => mapping(address => uint256))" + } + }, + "id": 413, + "indexExpression": { + "argumentTypes": null, + "id": 410, + "name": "_from", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 366, + "src": "5539:5:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "5531:14:0", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$", + "typeString": "mapping(address => uint256)" + } + }, + "id": 414, + "indexExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 411, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1154, + "src": "5546:3:0", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 412, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "5546:10:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "nodeType": "IndexAccess", + "src": "5531:26:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 417, + "name": "_value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 370, + "src": "5575:6:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "argumentTypes": null, + "id": 415, + "name": "_allowance", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 378, + "src": "5560:10:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 416, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sub", + "nodeType": "MemberAccess", + "referencedDeclaration": 72, + "src": "5560:14:0", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", + "typeString": "function (uint256,uint256) pure returns (uint256)" + } + }, + "id": 418, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "5560:22:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "5531:51:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 420, + "nodeType": "ExpressionStatement", + "src": "5531:51:0" + } + ] + } + }, + { + "assignments": [ + 424 + ], + "declarations": [ + { + "constant": false, + "id": 424, + "name": "sendAmount", + "nodeType": "VariableDeclaration", + "scope": 481, + "src": "5602:15:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 423, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "5602:4:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "id": 429, + "initialValue": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 427, + "name": "fee", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 387, + "src": "5631:3:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "argumentTypes": null, + "id": 425, + "name": "_value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 370, + "src": "5620:6:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 426, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sub", + "nodeType": "MemberAccess", + "referencedDeclaration": 72, + "src": "5620:10:0", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", + "typeString": "function (uint256,uint256) pure returns (uint256)" + } + }, + "id": 428, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "5620:15:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "5602:33:0" + }, + { + "expression": { + "argumentTypes": null, + "id": 439, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "id": 430, + "name": "balances", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 216, + "src": "5645:8:0", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$", + "typeString": "mapping(address => uint256)" + } + }, + "id": 432, + "indexExpression": { + "argumentTypes": null, + "id": 431, + "name": "_from", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 366, + "src": "5654:5:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "nodeType": "IndexAccess", + "src": "5645:15:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 437, + "name": "_value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 370, + "src": "5683:6:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "id": 433, + "name": "balances", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 216, + "src": "5663:8:0", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$", + "typeString": "mapping(address => uint256)" + } + }, + "id": 435, + "indexExpression": { + "argumentTypes": null, + "id": 434, + "name": "_from", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 366, + "src": "5672:5:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "5663:15:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 436, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sub", + "nodeType": "MemberAccess", + "referencedDeclaration": 72, + "src": "5663:19:0", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", + "typeString": "function (uint256,uint256) pure returns (uint256)" + } + }, + "id": 438, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "5663:27:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "5645:45:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 440, + "nodeType": "ExpressionStatement", + "src": "5645:45:0" + }, + { + "expression": { + "argumentTypes": null, + "id": 450, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "id": 441, + "name": "balances", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 216, + "src": "5700:8:0", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$", + "typeString": "mapping(address => uint256)" + } + }, + "id": 443, + "indexExpression": { + "argumentTypes": null, + "id": 442, + "name": "_to", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 368, + "src": "5709:3:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "nodeType": "IndexAccess", + "src": "5700:13:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 448, + "name": "sendAmount", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 424, + "src": "5734:10:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "id": 444, + "name": "balances", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 216, + "src": "5716:8:0", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$", + "typeString": "mapping(address => uint256)" + } + }, + "id": 446, + "indexExpression": { + "argumentTypes": null, + "id": 445, + "name": "_to", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 368, + "src": "5725:3:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "5716:13:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 447, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "add", + "nodeType": "MemberAccess", + "referencedDeclaration": 96, + "src": "5716:17:0", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", + "typeString": "function (uint256,uint256) pure returns (uint256)" + } + }, + "id": 449, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "5716:29:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "5700:45:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 451, + "nodeType": "ExpressionStatement", + "src": "5700:45:0" + }, + { + "condition": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 454, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 452, + "name": "fee", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 387, + "src": "5759:3:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">", + "rightExpression": { + "argumentTypes": null, + "hexValue": "30", + "id": 453, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "5765:1:0", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "src": "5759:7:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": null, + "id": 473, + "nodeType": "IfStatement", + "src": "5755:121:0", + "trueBody": { + "id": 472, + "nodeType": "Block", + "src": "5768:108:0", + "statements": [ + { + "expression": { + "argumentTypes": null, + "id": 464, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "id": 455, + "name": "balances", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 216, + "src": "5782:8:0", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$", + "typeString": "mapping(address => uint256)" + } + }, + "id": 457, + "indexExpression": { + "argumentTypes": null, + "id": 456, + "name": "owner", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 99, + "src": "5791:5:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "nodeType": "IndexAccess", + "src": "5782:15:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 462, + "name": "fee", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 387, + "src": "5820:3:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "id": 458, + "name": "balances", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 216, + "src": "5800:8:0", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$", + "typeString": "mapping(address => uint256)" + } + }, + "id": 460, + "indexExpression": { + "argumentTypes": null, + "id": 459, + "name": "owner", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 99, + "src": "5809:5:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "5800:15:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 461, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "add", + "nodeType": "MemberAccess", + "referencedDeclaration": 96, + "src": "5800:19:0", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", + "typeString": "function (uint256,uint256) pure returns (uint256)" + } + }, + "id": 463, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "5800:24:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "5782:42:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 465, + "nodeType": "ExpressionStatement", + "src": "5782:42:0" + }, + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 467, + "name": "_from", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 366, + "src": "5847:5:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "argumentTypes": null, + "id": 468, + "name": "owner", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 99, + "src": "5854:5:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "argumentTypes": null, + "id": 469, + "name": "fee", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 387, + "src": "5861:3:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 466, + "name": "Transfer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 168, + "src": "5838:8:0", + "typeDescriptions": { + "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$", + "typeString": "function (address,address,uint256)" + } + }, + "id": 470, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "5838:27:0", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 471, + "nodeType": "ExpressionStatement", + "src": "5838:27:0" + } + ] + } + }, + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 475, + "name": "_from", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 366, + "src": "5894:5:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "argumentTypes": null, + "id": 476, + "name": "_to", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 368, + "src": "5901:3:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "argumentTypes": null, + "id": 477, + "name": "sendAmount", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 424, + "src": "5906:10:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 474, + "name": "Transfer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 168, + "src": "5885:8:0", + "typeDescriptions": { + "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$", + "typeString": "function (address,address,uint256)" + } + }, + "id": 478, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "5885:32:0", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 479, + "nodeType": "ExpressionStatement", + "src": "5885:32:0" + } + ] + }, + "id": 481, + "implemented": true, + "isConstructor": false, + "isDeclaredConst": false, + "modifiers": [ + { + "arguments": [ + { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_rational_96_by_1", + "typeString": "int_const 96" + }, + "id": 375, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "hexValue": "33", + "id": 373, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "5130:1:0", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_3_by_1", + "typeString": "int_const 3" + }, + "value": "3" + }, + "nodeType": "BinaryOperation", + "operator": "*", + "rightExpression": { + "argumentTypes": null, + "hexValue": "3332", + "id": 374, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "5134:2:0", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_32_by_1", + "typeString": "int_const 32" + }, + "value": "32" + }, + "src": "5130:6:0", + "typeDescriptions": { + "typeIdentifier": "t_rational_96_by_1", + "typeString": "int_const 96" + } + } + ], + "id": 376, + "modifierName": { + "argumentTypes": null, + "id": 372, + "name": "onlyPayloadSize", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 240, + "src": "5114:15:0", + "typeDescriptions": { + "typeIdentifier": "t_modifier$_t_uint256_$", + "typeString": "modifier (uint256)" + } + }, + "nodeType": "ModifierInvocation", + "src": "5114:23:0" + } + ], + "name": "transferFrom", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 371, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 366, + "name": "_from", + "nodeType": "VariableDeclaration", + "scope": 481, + "src": "5066:13:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 365, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "5066:7:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 368, + "name": "_to", + "nodeType": "VariableDeclaration", + "scope": 481, + "src": "5081:11:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 367, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "5081:7:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 370, + "name": "_value", + "nodeType": "VariableDeclaration", + "scope": 481, + "src": "5094:11:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 369, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "5094:4:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "5065:41:0" + }, + "payable": false, + "returnParameters": { + "id": 377, + "nodeType": "ParameterList", + "parameters": [], + "src": "5138:0:0" + }, + "scope": 546, + "src": "5044:880:0", + "stateMutability": "nonpayable", + "superFunction": 189, + "visibility": "public" + }, + { + "body": { + "id": 528, + "nodeType": "Block", + "src": "6243:484:0", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 509, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "UnaryOperation", + "operator": "!", + "prefix": true, + "src": "6566:56:0", + "subExpression": { + "argumentTypes": null, + "components": [ + { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "id": 507, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "components": [ + { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 496, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 494, + "name": "_value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 485, + "src": "6569:6:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "argumentTypes": null, + "hexValue": "30", + "id": 495, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "6579:1:0", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "src": "6569:11:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + } + ], + "id": 497, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "6568:13:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "BinaryOperation", + "operator": "&&", + "rightExpression": { + "argumentTypes": null, + "components": [ + { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 505, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "id": 498, + "name": "allowed", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 357, + "src": "6586:7:0", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_uint256_$_$", + "typeString": "mapping(address => mapping(address => uint256))" + } + }, + "id": 501, + "indexExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 499, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1154, + "src": "6594:3:0", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 500, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "6594:10:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "6586:19:0", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$", + "typeString": "mapping(address => uint256)" + } + }, + "id": 503, + "indexExpression": { + "argumentTypes": null, + "id": 502, + "name": "_spender", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 483, + "src": "6606:8:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "6586:29:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "argumentTypes": null, + "hexValue": "30", + "id": 504, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "6619:1:0", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "src": "6586:34:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + } + ], + "id": 506, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "6585:36:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "6568:53:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + } + ], + "id": 508, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "6567:55:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + ], + "id": 493, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1157, + "src": "6558:7:0", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$returns$__$", + "typeString": "function (bool) pure" + } + }, + "id": 510, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "6558:65:0", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 511, + "nodeType": "ExpressionStatement", + "src": "6558:65:0" + }, + { + "expression": { + "argumentTypes": null, + "id": 519, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "id": 512, + "name": "allowed", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 357, + "src": "6634:7:0", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_uint256_$_$", + "typeString": "mapping(address => mapping(address => uint256))" + } + }, + "id": 516, + "indexExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 513, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1154, + "src": "6642:3:0", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 514, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "6642:10:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "6634:19:0", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$", + "typeString": "mapping(address => uint256)" + } + }, + "id": 517, + "indexExpression": { + "argumentTypes": null, + "id": 515, + "name": "_spender", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 483, + "src": "6654:8:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "nodeType": "IndexAccess", + "src": "6634:29:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "id": 518, + "name": "_value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 485, + "src": "6666:6:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "6634:38:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 520, + "nodeType": "ExpressionStatement", + "src": "6634:38:0" + }, + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 522, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1154, + "src": "6691:3:0", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 523, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "6691:10:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "argumentTypes": null, + "id": 524, + "name": "_spender", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 483, + "src": "6703:8:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "argumentTypes": null, + "id": 525, + "name": "_value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 485, + "src": "6713:6:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 521, + "name": "Approval", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 204, + "src": "6682:8:0", + "typeDescriptions": { + "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$", + "typeString": "function (address,address,uint256)" + } + }, + "id": 526, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "6682:38:0", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 527, + "nodeType": "ExpressionStatement", + "src": "6682:38:0" + } + ] + }, + "id": 529, + "implemented": true, + "isConstructor": false, + "isDeclaredConst": false, + "modifiers": [ + { + "arguments": [ + { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_rational_64_by_1", + "typeString": "int_const 64" + }, + "id": 490, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "hexValue": "32", + "id": 488, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "6235:1:0", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_2_by_1", + "typeString": "int_const 2" + }, + "value": "2" + }, + "nodeType": "BinaryOperation", + "operator": "*", + "rightExpression": { + "argumentTypes": null, + "hexValue": "3332", + "id": 489, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "6239:2:0", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_32_by_1", + "typeString": "int_const 32" + }, + "value": "32" + }, + "src": "6235:6:0", + "typeDescriptions": { + "typeIdentifier": "t_rational_64_by_1", + "typeString": "int_const 64" + } + } + ], + "id": 491, + "modifierName": { + "argumentTypes": null, + "id": 487, + "name": "onlyPayloadSize", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 240, + "src": "6219:15:0", + "typeDescriptions": { + "typeIdentifier": "t_modifier$_t_uint256_$", + "typeString": "modifier (uint256)" + } + }, + "nodeType": "ModifierInvocation", + "src": "6219:23:0" + } + ], + "name": "approve", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 486, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 483, + "name": "_spender", + "nodeType": "VariableDeclaration", + "scope": 529, + "src": "6181:16:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 482, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "6181:7:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 485, + "name": "_value", + "nodeType": "VariableDeclaration", + "scope": 529, + "src": "6199:11:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 484, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "6199:4:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "6180:31:0" + }, + "payable": false, + "returnParameters": { + "id": 492, + "nodeType": "ParameterList", + "parameters": [], + "src": "6243:0:0" + }, + "scope": 546, + "src": "6164:563:0", + "stateMutability": "nonpayable", + "superFunction": 196, + "visibility": "public" + }, + { + "body": { + "id": 544, + "nodeType": "Block", + "src": "7146:49:0", + "statements": [ + { + "expression": { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "id": 538, + "name": "allowed", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 357, + "src": "7163:7:0", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_uint256_$_$", + "typeString": "mapping(address => mapping(address => uint256))" + } + }, + "id": 540, + "indexExpression": { + "argumentTypes": null, + "id": 539, + "name": "_owner", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 531, + "src": "7171:6:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "7163:15:0", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$", + "typeString": "mapping(address => uint256)" + } + }, + "id": 542, + "indexExpression": { + "argumentTypes": null, + "id": 541, + "name": "_spender", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 533, + "src": "7179:8:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "7163:25:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "functionReturnParameters": 537, + "id": 543, + "nodeType": "Return", + "src": "7156:32:0" + } + ] + }, + "id": 545, + "implemented": true, + "isConstructor": false, + "isDeclaredConst": true, + "modifiers": [], + "name": "allowance", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 534, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 531, + "name": "_owner", + "nodeType": "VariableDeclaration", + "scope": 545, + "src": "7071:14:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 530, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "7071:7:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 533, + "name": "_spender", + "nodeType": "VariableDeclaration", + "scope": 545, + "src": "7087:16:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 532, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "7087:7:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "7070:34:0" + }, + "payable": false, + "returnParameters": { + "id": 537, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 536, + "name": "remaining", + "nodeType": "VariableDeclaration", + "scope": 545, + "src": "7130:14:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 535, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "7130:4:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "7129:16:0" + }, + "scope": 546, + "src": "7052:143:0", + "stateMutability": "view", + "superFunction": 180, + "visibility": "public" + } + ], + "scope": 1143, + "src": "4601:2597:0" + }, + { + "baseContracts": [ + { + "arguments": [], + "baseName": { + "contractScope": null, + "id": 547, + "name": "Ownable", + "nodeType": "UserDefinedTypeName", + "referencedDeclaration": 139, + "src": "7335:7:0", + "typeDescriptions": { + "typeIdentifier": "t_contract$_Ownable_$139", + "typeString": "contract Ownable" + } + }, + "id": 548, + "nodeType": "InheritanceSpecifier", + "src": "7335:7:0" + } + ], + "contractDependencies": [ + 139 + ], + "contractKind": "contract", + "documentation": "@title Pausable\n@dev Base contract which allows children to implement an emergency stop mechanism.", + "fullyImplemented": true, + "id": 603, + "linearizedBaseContracts": [ + 603, + 139 + ], + "name": "Pausable", + "nodeType": "ContractDefinition", + "nodes": [ + { + "anonymous": false, + "id": 550, + "name": "Pause", + "nodeType": "EventDefinition", + "parameters": { + "id": 549, + "nodeType": "ParameterList", + "parameters": [], + "src": "7358:2:0" + }, + "src": "7347:14:0" + }, + { + "anonymous": false, + "id": 552, + "name": "Unpause", + "nodeType": "EventDefinition", + "parameters": { + "id": 551, + "nodeType": "ParameterList", + "parameters": [], + "src": "7377:2:0" + }, + "src": "7364:16:0" + }, + { + "constant": false, + "id": 555, + "name": "paused", + "nodeType": "VariableDeclaration", + "scope": 603, + "src": "7384:26:0", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 553, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "7384:4:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "value": { + "argumentTypes": null, + "hexValue": "66616c7365", + "id": 554, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "bool", + "lValueRequested": false, + "nodeType": "Literal", + "src": "7405:5:0", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "value": "false" + }, + "visibility": "public" + }, + { + "body": { + "id": 563, + "nodeType": "Block", + "src": "7538:34:0", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 559, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "UnaryOperation", + "operator": "!", + "prefix": true, + "src": "7552:7:0", + "subExpression": { + "argumentTypes": null, + "id": 558, + "name": "paused", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 555, + "src": "7553:6:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + ], + "id": 557, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1157, + "src": "7544:7:0", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$returns$__$", + "typeString": "function (bool) pure" + } + }, + "id": 560, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "7544:16:0", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 561, + "nodeType": "ExpressionStatement", + "src": "7544:16:0" + }, + { + "id": 562, + "nodeType": "PlaceholderStatement", + "src": "7566:1:0" + } + ] + }, + "id": 564, + "name": "whenNotPaused", + "nodeType": "ModifierDefinition", + "parameters": { + "id": 556, + "nodeType": "ParameterList", + "parameters": [], + "src": "7535:2:0" + }, + "src": "7513:59:0", + "visibility": "internal" + }, + { + "body": { + "id": 571, + "nodeType": "Block", + "src": "7691:33:0", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 567, + "name": "paused", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 555, + "src": "7705:6:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + ], + "id": 566, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1157, + "src": "7697:7:0", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$returns$__$", + "typeString": "function (bool) pure" + } + }, + "id": 568, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "7697:15:0", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 569, + "nodeType": "ExpressionStatement", + "src": "7697:15:0" + }, + { + "id": 570, + "nodeType": "PlaceholderStatement", + "src": "7718:1:0" + } + ] + }, + "id": 572, + "name": "whenPaused", + "nodeType": "ModifierDefinition", + "parameters": { + "id": 565, + "nodeType": "ParameterList", + "parameters": [], + "src": "7688:2:0" + }, + "src": "7669:55:0", + "visibility": "internal" + }, + { + "body": { + "id": 586, + "nodeType": "Block", + "src": "7851:37:0", + "statements": [ + { + "expression": { + "argumentTypes": null, + "id": 581, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 579, + "name": "paused", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 555, + "src": "7857:6:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "hexValue": "74727565", + "id": 580, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "bool", + "lValueRequested": false, + "nodeType": "Literal", + "src": "7866:4:0", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "value": "true" + }, + "src": "7857:13:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 582, + "nodeType": "ExpressionStatement", + "src": "7857:13:0" + }, + { + "expression": { + "argumentTypes": null, + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 583, + "name": "Pause", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 550, + "src": "7876:5:0", + "typeDescriptions": { + "typeIdentifier": "t_function_event_nonpayable$__$returns$__$", + "typeString": "function ()" + } + }, + "id": 584, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "7876:7:0", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 585, + "nodeType": "ExpressionStatement", + "src": "7876:7:0" + } + ] + }, + "id": 587, + "implemented": true, + "isConstructor": false, + "isDeclaredConst": false, + "modifiers": [ + { + "arguments": [], + "id": 575, + "modifierName": { + "argumentTypes": null, + "id": 574, + "name": "onlyOwner", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 119, + "src": "7820:9:0", + "typeDescriptions": { + "typeIdentifier": "t_modifier$__$", + "typeString": "modifier ()" + } + }, + "nodeType": "ModifierInvocation", + "src": "7820:9:0" + }, + { + "arguments": [], + "id": 577, + "modifierName": { + "argumentTypes": null, + "id": 576, + "name": "whenNotPaused", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 564, + "src": "7830:13:0", + "typeDescriptions": { + "typeIdentifier": "t_modifier$__$", + "typeString": "modifier ()" + } + }, + "nodeType": "ModifierInvocation", + "src": "7830:13:0" + } + ], + "name": "pause", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 573, + "nodeType": "ParameterList", + "parameters": [], + "src": "7817:2:0" + }, + "payable": false, + "returnParameters": { + "id": 578, + "nodeType": "ParameterList", + "parameters": [], + "src": "7851:0:0" + }, + "scope": 603, + "src": "7803:85:0", + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "public" + }, + { + "body": { + "id": 601, + "nodeType": "Block", + "src": "8017:40:0", + "statements": [ + { + "expression": { + "argumentTypes": null, + "id": 596, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 594, + "name": "paused", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 555, + "src": "8023:6:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "hexValue": "66616c7365", + "id": 595, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "bool", + "lValueRequested": false, + "nodeType": "Literal", + "src": "8032:5:0", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "value": "false" + }, + "src": "8023:14:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 597, + "nodeType": "ExpressionStatement", + "src": "8023:14:0" + }, + { + "expression": { + "argumentTypes": null, + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 598, + "name": "Unpause", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 552, + "src": "8043:7:0", + "typeDescriptions": { + "typeIdentifier": "t_function_event_nonpayable$__$returns$__$", + "typeString": "function ()" + } + }, + "id": 599, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "8043:9:0", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 600, + "nodeType": "ExpressionStatement", + "src": "8043:9:0" + } + ] + }, + "id": 602, + "implemented": true, + "isConstructor": false, + "isDeclaredConst": false, + "modifiers": [ + { + "arguments": [], + "id": 590, + "modifierName": { + "argumentTypes": null, + "id": 589, + "name": "onlyOwner", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 119, + "src": "7989:9:0", + "typeDescriptions": { + "typeIdentifier": "t_modifier$__$", + "typeString": "modifier ()" + } + }, + "nodeType": "ModifierInvocation", + "src": "7989:9:0" + }, + { + "arguments": [], + "id": 592, + "modifierName": { + "argumentTypes": null, + "id": 591, + "name": "whenPaused", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 572, + "src": "7999:10:0", + "typeDescriptions": { + "typeIdentifier": "t_modifier$__$", + "typeString": "modifier ()" + } + }, + "nodeType": "ModifierInvocation", + "src": "7999:10:0" + } + ], + "name": "unpause", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 588, + "nodeType": "ParameterList", + "parameters": [], + "src": "7986:2:0" + }, + "payable": false, + "returnParameters": { + "id": 593, + "nodeType": "ParameterList", + "parameters": [], + "src": "8017:0:0" + }, + "scope": 603, + "src": "7970:87:0", + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "public" + } + ], + "scope": 1143, + "src": "7314:745:0" + }, + { + "baseContracts": [ + { + "arguments": [], + "baseName": { + "contractScope": null, + "id": 604, + "name": "Ownable", + "nodeType": "UserDefinedTypeName", + "referencedDeclaration": 139, + "src": "8083:7:0", + "typeDescriptions": { + "typeIdentifier": "t_contract$_Ownable_$139", + "typeString": "contract Ownable" + } + }, + "id": 605, + "nodeType": "InheritanceSpecifier", + "src": "8083:7:0" + }, + { + "arguments": [], + "baseName": { + "contractScope": null, + "id": 606, + "name": "BasicToken", + "nodeType": "UserDefinedTypeName", + "referencedDeclaration": 347, + "src": "8092:10:0", + "typeDescriptions": { + "typeIdentifier": "t_contract$_BasicToken_$347", + "typeString": "contract BasicToken" + } + }, + "id": 607, + "nodeType": "InheritanceSpecifier", + "src": "8092:10:0" + } + ], + "contractDependencies": [ + 347, + 139, + 169 + ], + "contractKind": "contract", + "documentation": null, + "fullyImplemented": false, + "id": 717, + "linearizedBaseContracts": [ + 717, + 347, + 169, + 139 + ], + "name": "BlackList", + "nodeType": "ContractDefinition", + "nodes": [ + { + "body": { + "id": 618, + "nodeType": "Block", + "src": "8306:45:0", + "statements": [ + { + "expression": { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "id": 614, + "name": "isBlackListed", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 631, + "src": "8323:13:0", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_bool_$", + "typeString": "mapping(address => bool)" + } + }, + "id": 616, + "indexExpression": { + "argumentTypes": null, + "id": 615, + "name": "_maker", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 609, + "src": "8337:6:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "8323:21:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "functionReturnParameters": 613, + "id": 617, + "nodeType": "Return", + "src": "8316:28:0" + } + ] + }, + "id": 619, + "implemented": true, + "isConstructor": false, + "isDeclaredConst": true, + "modifiers": [], + "name": "getBlackListStatus", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 610, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 609, + "name": "_maker", + "nodeType": "VariableDeclaration", + "scope": 619, + "src": "8257:14:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 608, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "8257:7:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "8256:16:0" + }, + "payable": false, + "returnParameters": { + "id": 613, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 612, + "name": "", + "nodeType": "VariableDeclaration", + "scope": 619, + "src": "8300:4:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 611, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "8300:4:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "8299:6:0" + }, + "scope": 717, + "src": "8229:122:0", + "stateMutability": "view", + "superFunction": null, + "visibility": "external" + }, + { + "body": { + "id": 626, + "nodeType": "Block", + "src": "8413:29:0", + "statements": [ + { + "expression": { + "argumentTypes": null, + "id": 624, + "name": "owner", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 99, + "src": "8430:5:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "functionReturnParameters": 623, + "id": 625, + "nodeType": "Return", + "src": "8423:12:0" + } + ] + }, + "id": 627, + "implemented": true, + "isConstructor": false, + "isDeclaredConst": true, + "modifiers": [], + "name": "getOwner", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 620, + "nodeType": "ParameterList", + "parameters": [], + "src": "8374:2:0" + }, + "payable": false, + "returnParameters": { + "id": 623, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 622, + "name": "", + "nodeType": "VariableDeclaration", + "scope": 627, + "src": "8404:7:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 621, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "8404:7:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "8403:9:0" + }, + "scope": 717, + "src": "8357:85:0", + "stateMutability": "view", + "superFunction": null, + "visibility": "external" + }, + { + "constant": false, + "id": 631, + "name": "isBlackListed", + "nodeType": "VariableDeclaration", + "scope": 717, + "src": "8448:46:0", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_bool_$", + "typeString": "mapping(address => bool)" + }, + "typeName": { + "id": 630, + "keyType": { + "id": 628, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "8457:7:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "Mapping", + "src": "8448:25:0", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_bool_$", + "typeString": "mapping(address => bool)" + }, + "valueType": { + "id": 629, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "8468:4:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + } + }, + "value": null, + "visibility": "public" + }, + { + "body": { + "id": 648, + "nodeType": "Block", + "src": "8564:83:0", + "statements": [ + { + "expression": { + "argumentTypes": null, + "id": 642, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "id": 638, + "name": "isBlackListed", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 631, + "src": "8574:13:0", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_bool_$", + "typeString": "mapping(address => bool)" + } + }, + "id": 640, + "indexExpression": { + "argumentTypes": null, + "id": 639, + "name": "_evilUser", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 633, + "src": "8588:9:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "nodeType": "IndexAccess", + "src": "8574:24:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "hexValue": "74727565", + "id": 641, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "bool", + "lValueRequested": false, + "nodeType": "Literal", + "src": "8601:4:0", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "value": "true" + }, + "src": "8574:31:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 643, + "nodeType": "ExpressionStatement", + "src": "8574:31:0" + }, + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 645, + "name": "_evilUser", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 633, + "src": "8630:9:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "id": 644, + "name": "AddedBlackList", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 712, + "src": "8615:14:0", + "typeDescriptions": { + "typeIdentifier": "t_function_event_nonpayable$_t_address_$returns$__$", + "typeString": "function (address)" + } + }, + "id": 646, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "8615:25:0", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 647, + "nodeType": "ExpressionStatement", + "src": "8615:25:0" + } + ] + }, + "id": 649, + "implemented": true, + "isConstructor": false, + "isDeclaredConst": false, + "modifiers": [ + { + "arguments": [], + "id": 636, + "modifierName": { + "argumentTypes": null, + "id": 635, + "name": "onlyOwner", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 119, + "src": "8554:9:0", + "typeDescriptions": { + "typeIdentifier": "t_modifier$__$", + "typeString": "modifier ()" + } + }, + "nodeType": "ModifierInvocation", + "src": "8554:9:0" + } + ], + "name": "addBlackList", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 634, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 633, + "name": "_evilUser", + "nodeType": "VariableDeclaration", + "scope": 649, + "src": "8528:17:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 632, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "8528:7:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "8527:19:0" + }, + "payable": false, + "returnParameters": { + "id": 637, + "nodeType": "ParameterList", + "parameters": [], + "src": "8564:0:0" + }, + "scope": 717, + "src": "8505:142:0", + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "public" + }, + { + "body": { + "id": 666, + "nodeType": "Block", + "src": "8718:92:0", + "statements": [ + { + "expression": { + "argumentTypes": null, + "id": 660, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "id": 656, + "name": "isBlackListed", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 631, + "src": "8728:13:0", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_bool_$", + "typeString": "mapping(address => bool)" + } + }, + "id": 658, + "indexExpression": { + "argumentTypes": null, + "id": 657, + "name": "_clearedUser", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 651, + "src": "8742:12:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "nodeType": "IndexAccess", + "src": "8728:27:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "hexValue": "66616c7365", + "id": 659, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "bool", + "lValueRequested": false, + "nodeType": "Literal", + "src": "8758:5:0", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "value": "false" + }, + "src": "8728:35:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 661, + "nodeType": "ExpressionStatement", + "src": "8728:35:0" + }, + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 663, + "name": "_clearedUser", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 651, + "src": "8790:12:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "id": 662, + "name": "RemovedBlackList", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 716, + "src": "8773:16:0", + "typeDescriptions": { + "typeIdentifier": "t_function_event_nonpayable$_t_address_$returns$__$", + "typeString": "function (address)" + } + }, + "id": 664, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "8773:30:0", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 665, + "nodeType": "ExpressionStatement", + "src": "8773:30:0" + } + ] + }, + "id": 667, + "implemented": true, + "isConstructor": false, + "isDeclaredConst": false, + "modifiers": [ + { + "arguments": [], + "id": 654, + "modifierName": { + "argumentTypes": null, + "id": 653, + "name": "onlyOwner", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 119, + "src": "8708:9:0", + "typeDescriptions": { + "typeIdentifier": "t_modifier$__$", + "typeString": "modifier ()" + } + }, + "nodeType": "ModifierInvocation", + "src": "8708:9:0" + } + ], + "name": "removeBlackList", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 652, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 651, + "name": "_clearedUser", + "nodeType": "VariableDeclaration", + "scope": 667, + "src": "8679:20:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 650, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "8679:7:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "8678:22:0" + }, + "payable": false, + "returnParameters": { + "id": 655, + "nodeType": "ParameterList", + "parameters": [], + "src": "8718:0:0" + }, + "scope": 717, + "src": "8653:157:0", + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "public" + }, + { + "body": { + "id": 701, + "nodeType": "Block", + "src": "8887:247:0", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "id": 675, + "name": "isBlackListed", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 631, + "src": "8905:13:0", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_bool_$", + "typeString": "mapping(address => bool)" + } + }, + "id": 677, + "indexExpression": { + "argumentTypes": null, + "id": 676, + "name": "_blackListedUser", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 669, + "src": "8919:16:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "8905:31:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + ], + "id": 674, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1157, + "src": "8897:7:0", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$returns$__$", + "typeString": "function (bool) pure" + } + }, + "id": 678, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "8897:40:0", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 679, + "nodeType": "ExpressionStatement", + "src": "8897:40:0" + }, + { + "assignments": [ + 681 + ], + "declarations": [ + { + "constant": false, + "id": 681, + "name": "dirtyFunds", + "nodeType": "VariableDeclaration", + "scope": 702, + "src": "8947:15:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 680, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "8947:4:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "id": 685, + "initialValue": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 683, + "name": "_blackListedUser", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 669, + "src": "8975:16:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "id": 682, + "name": "balanceOf", + "nodeType": "Identifier", + "overloadedDeclarations": [ + 346 + ], + "referencedDeclaration": 346, + "src": "8965:9:0", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$_t_address_$returns$_t_uint256_$", + "typeString": "function (address) view returns (uint256)" + } + }, + "id": 684, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "8965:27:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "8947:45:0" + }, + { + "expression": { + "argumentTypes": null, + "id": 690, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "id": 686, + "name": "balances", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 216, + "src": "9002:8:0", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$", + "typeString": "mapping(address => uint256)" + } + }, + "id": 688, + "indexExpression": { + "argumentTypes": null, + "id": 687, + "name": "_blackListedUser", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 669, + "src": "9011:16:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "nodeType": "IndexAccess", + "src": "9002:26:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "hexValue": "30", + "id": 689, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "9031:1:0", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "src": "9002:30:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 691, + "nodeType": "ExpressionStatement", + "src": "9002:30:0" + }, + { + "expression": { + "argumentTypes": null, + "id": 694, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 692, + "name": "_totalSupply", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 141, + "src": "9042:12:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "-=", + "rightHandSide": { + "argumentTypes": null, + "id": 693, + "name": "dirtyFunds", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 681, + "src": "9058:10:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "9042:26:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 695, + "nodeType": "ExpressionStatement", + "src": "9042:26:0" + }, + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 697, + "name": "_blackListedUser", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 669, + "src": "9098:16:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "argumentTypes": null, + "id": 698, + "name": "dirtyFunds", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 681, + "src": "9116:10:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 696, + "name": "DestroyedBlackFunds", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 708, + "src": "9078:19:0", + "typeDescriptions": { + "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_uint256_$returns$__$", + "typeString": "function (address,uint256)" + } + }, + "id": 699, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "9078:49:0", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 700, + "nodeType": "ExpressionStatement", + "src": "9078:49:0" + } + ] + }, + "id": 702, + "implemented": true, + "isConstructor": false, + "isDeclaredConst": false, + "modifiers": [ + { + "arguments": [], + "id": 672, + "modifierName": { + "argumentTypes": null, + "id": 671, + "name": "onlyOwner", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 119, + "src": "8877:9:0", + "typeDescriptions": { + "typeIdentifier": "t_modifier$__$", + "typeString": "modifier ()" + } + }, + "nodeType": "ModifierInvocation", + "src": "8877:9:0" + } + ], + "name": "destroyBlackFunds", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 670, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 669, + "name": "_blackListedUser", + "nodeType": "VariableDeclaration", + "scope": 702, + "src": "8844:24:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 668, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "8844:7:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "8843:26:0" + }, + "payable": false, + "returnParameters": { + "id": 673, + "nodeType": "ParameterList", + "parameters": [], + "src": "8887:0:0" + }, + "scope": 717, + "src": "8816:318:0", + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "public" + }, + { + "anonymous": false, + "id": 708, + "name": "DestroyedBlackFunds", + "nodeType": "EventDefinition", + "parameters": { + "id": 707, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 704, + "indexed": false, + "name": "_blackListedUser", + "nodeType": "VariableDeclaration", + "scope": 708, + "src": "9166:24:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 703, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "9166:7:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 706, + "indexed": false, + "name": "_balance", + "nodeType": "VariableDeclaration", + "scope": 708, + "src": "9192:13:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 705, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "9192:4:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "9165:41:0" + }, + "src": "9140:67:0" + }, + { + "anonymous": false, + "id": 712, + "name": "AddedBlackList", + "nodeType": "EventDefinition", + "parameters": { + "id": 711, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 710, + "indexed": false, + "name": "_user", + "nodeType": "VariableDeclaration", + "scope": 712, + "src": "9234:13:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 709, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "9234:7:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "9233:15:0" + }, + "src": "9213:36:0" + }, + { + "anonymous": false, + "id": 716, + "name": "RemovedBlackList", + "nodeType": "EventDefinition", + "parameters": { + "id": 715, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 714, + "indexed": false, + "name": "_user", + "nodeType": "VariableDeclaration", + "scope": 716, + "src": "9278:13:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 713, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "9278:7:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "9277:15:0" + }, + "src": "9255:38:0" + } + ], + "scope": 1143, + "src": "8061:1235:0" + }, + { + "baseContracts": [ + { + "arguments": [], + "baseName": { + "contractScope": null, + "id": 718, + "name": "StandardToken", + "nodeType": "UserDefinedTypeName", + "referencedDeclaration": 546, + "src": "9332:13:0", + "typeDescriptions": { + "typeIdentifier": "t_contract$_StandardToken_$546", + "typeString": "contract StandardToken" + } + }, + "id": 719, + "nodeType": "InheritanceSpecifier", + "src": "9332:13:0" + } + ], + "contractDependencies": [ + 347, + 139, + 169, + 205, + 546 + ], + "contractKind": "contract", + "documentation": null, + "fullyImplemented": false, + "id": 749, + "linearizedBaseContracts": [ + 749, + 546, + 205, + 347, + 169, + 139 + ], + "name": "UpgradedStandardToken", + "nodeType": "ContractDefinition", + "nodes": [ + { + "body": null, + "id": 728, + "implemented": false, + "isConstructor": false, + "isDeclaredConst": false, + "modifiers": [], + "name": "transferByLegacy", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 726, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 721, + "name": "from", + "nodeType": "VariableDeclaration", + "scope": 728, + "src": "9498:12:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 720, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "9498:7:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 723, + "name": "to", + "nodeType": "VariableDeclaration", + "scope": 728, + "src": "9512:10:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 722, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "9512:7:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 725, + "name": "value", + "nodeType": "VariableDeclaration", + "scope": 728, + "src": "9524:10:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 724, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "9524:4:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "9497:38:0" + }, + "payable": false, + "returnParameters": { + "id": 727, + "nodeType": "ParameterList", + "parameters": [], + "src": "9542:0:0" + }, + "scope": 749, + "src": "9472:71:0", + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "public" + }, + { + "body": null, + "id": 739, + "implemented": false, + "isConstructor": false, + "isDeclaredConst": false, + "modifiers": [], + "name": "transferFromByLegacy", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 737, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 730, + "name": "sender", + "nodeType": "VariableDeclaration", + "scope": 739, + "src": "9578:14:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 729, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "9578:7:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 732, + "name": "from", + "nodeType": "VariableDeclaration", + "scope": 739, + "src": "9594:12:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 731, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "9594:7:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 734, + "name": "spender", + "nodeType": "VariableDeclaration", + "scope": 739, + "src": "9608:15:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 733, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "9608:7:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 736, + "name": "value", + "nodeType": "VariableDeclaration", + "scope": 739, + "src": "9625:10:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 735, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "9625:4:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "9577:59:0" + }, + "payable": false, + "returnParameters": { + "id": 738, + "nodeType": "ParameterList", + "parameters": [], + "src": "9643:0:0" + }, + "scope": 749, + "src": "9548:96:0", + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "public" + }, + { + "body": null, + "id": 748, + "implemented": false, + "isConstructor": false, + "isDeclaredConst": false, + "modifiers": [], + "name": "approveByLegacy", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 746, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 741, + "name": "from", + "nodeType": "VariableDeclaration", + "scope": 748, + "src": "9674:12:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 740, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "9674:7:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 743, + "name": "spender", + "nodeType": "VariableDeclaration", + "scope": 748, + "src": "9688:15:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 742, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "9688:7:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 745, + "name": "value", + "nodeType": "VariableDeclaration", + "scope": 748, + "src": "9705:10:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 744, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "9705:4:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "9673:43:0" + }, + "payable": false, + "returnParameters": { + "id": 747, + "nodeType": "ParameterList", + "parameters": [], + "src": "9723:0:0" + }, + "scope": 749, + "src": "9649:75:0", + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "public" + } + ], + "scope": 1143, + "src": "9298:428:0" + }, + { + "baseContracts": [ + { + "arguments": [], + "baseName": { + "contractScope": null, + "id": 750, + "name": "Pausable", + "nodeType": "UserDefinedTypeName", + "referencedDeclaration": 603, + "src": "9752:8:0", + "typeDescriptions": { + "typeIdentifier": "t_contract$_Pausable_$603", + "typeString": "contract Pausable" + } + }, + "id": 751, + "nodeType": "InheritanceSpecifier", + "src": "9752:8:0" + }, + { + "arguments": [], + "baseName": { + "contractScope": null, + "id": 752, + "name": "StandardToken", + "nodeType": "UserDefinedTypeName", + "referencedDeclaration": 546, + "src": "9762:13:0", + "typeDescriptions": { + "typeIdentifier": "t_contract$_StandardToken_$546", + "typeString": "contract StandardToken" + } + }, + "id": 753, + "nodeType": "InheritanceSpecifier", + "src": "9762:13:0" + }, + { + "arguments": [], + "baseName": { + "contractScope": null, + "id": 754, + "name": "BlackList", + "nodeType": "UserDefinedTypeName", + "referencedDeclaration": 717, + "src": "9777:9:0", + "typeDescriptions": { + "typeIdentifier": "t_contract$_BlackList_$717", + "typeString": "contract BlackList" + } + }, + "id": 755, + "nodeType": "InheritanceSpecifier", + "src": "9777:9:0" + } + ], + "contractDependencies": [ + 347, + 139, + 169, + 205, + 546, + 603, + 717 + ], + "contractKind": "contract", + "documentation": null, + "fullyImplemented": true, + "id": 1142, + "linearizedBaseContracts": [ + 1142, + 717, + 546, + 205, + 347, + 169, + 603, + 139 + ], + "name": "TetherToken", + "nodeType": "ContractDefinition", + "nodes": [ + { + "constant": false, + "id": 757, + "name": "name", + "nodeType": "VariableDeclaration", + "scope": 1142, + "src": "9794:18:0", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_string_storage", + "typeString": "string storage ref" + }, + "typeName": { + "id": 756, + "name": "string", + "nodeType": "ElementaryTypeName", + "src": "9794:6:0", + "typeDescriptions": { + "typeIdentifier": "t_string_storage_ptr", + "typeString": "string storage pointer" + } + }, + "value": null, + "visibility": "public" + }, + { + "constant": false, + "id": 759, + "name": "symbol", + "nodeType": "VariableDeclaration", + "scope": 1142, + "src": "9818:20:0", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_string_storage", + "typeString": "string storage ref" + }, + "typeName": { + "id": 758, + "name": "string", + "nodeType": "ElementaryTypeName", + "src": "9818:6:0", + "typeDescriptions": { + "typeIdentifier": "t_string_storage_ptr", + "typeString": "string storage pointer" + } + }, + "value": null, + "visibility": "public" + }, + { + "constant": false, + "id": 761, + "name": "decimals", + "nodeType": "VariableDeclaration", + "scope": 1142, + "src": "9844:20:0", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 760, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "9844:4:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "public" + }, + { + "constant": false, + "id": 763, + "name": "upgradedAddress", + "nodeType": "VariableDeclaration", + "scope": 1142, + "src": "9870:30:0", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 762, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "9870:7:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "public" + }, + { + "constant": false, + "id": 765, + "name": "deprecated", + "nodeType": "VariableDeclaration", + "scope": 1142, + "src": "9906:22:0", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 764, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "9906:4:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "value": null, + "visibility": "public" + }, + { + "body": { + "id": 802, + "nodeType": "Block", + "src": "10318:194:0", + "statements": [ + { + "expression": { + "argumentTypes": null, + "id": 778, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 776, + "name": "_totalSupply", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 141, + "src": "10328:12:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "id": 777, + "name": "_initialSupply", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 767, + "src": "10343:14:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "10328:29:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 779, + "nodeType": "ExpressionStatement", + "src": "10328:29:0" + }, + { + "expression": { + "argumentTypes": null, + "id": 782, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 780, + "name": "name", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 757, + "src": "10367:4:0", + "typeDescriptions": { + "typeIdentifier": "t_string_storage", + "typeString": "string storage ref" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "id": 781, + "name": "_name", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 769, + "src": "10374:5:0", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + }, + "src": "10367:12:0", + "typeDescriptions": { + "typeIdentifier": "t_string_storage", + "typeString": "string storage ref" + } + }, + "id": 783, + "nodeType": "ExpressionStatement", + "src": "10367:12:0" + }, + { + "expression": { + "argumentTypes": null, + "id": 786, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 784, + "name": "symbol", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 759, + "src": "10389:6:0", + "typeDescriptions": { + "typeIdentifier": "t_string_storage", + "typeString": "string storage ref" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "id": 785, + "name": "_symbol", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 771, + "src": "10398:7:0", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + }, + "src": "10389:16:0", + "typeDescriptions": { + "typeIdentifier": "t_string_storage", + "typeString": "string storage ref" + } + }, + "id": 787, + "nodeType": "ExpressionStatement", + "src": "10389:16:0" + }, + { + "expression": { + "argumentTypes": null, + "id": 790, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 788, + "name": "decimals", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 761, + "src": "10415:8:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "id": 789, + "name": "_decimals", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 773, + "src": "10426:9:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "10415:20:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 791, + "nodeType": "ExpressionStatement", + "src": "10415:20:0" + }, + { + "expression": { + "argumentTypes": null, + "id": 796, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "id": 792, + "name": "balances", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 216, + "src": "10445:8:0", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$", + "typeString": "mapping(address => uint256)" + } + }, + "id": 794, + "indexExpression": { + "argumentTypes": null, + "id": 793, + "name": "owner", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 99, + "src": "10454:5:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "nodeType": "IndexAccess", + "src": "10445:15:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "id": 795, + "name": "_initialSupply", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 767, + "src": "10463:14:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "10445:32:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 797, + "nodeType": "ExpressionStatement", + "src": "10445:32:0" + }, + { + "expression": { + "argumentTypes": null, + "id": 800, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 798, + "name": "deprecated", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 765, + "src": "10487:10:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "hexValue": "66616c7365", + "id": 799, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "bool", + "lValueRequested": false, + "nodeType": "Literal", + "src": "10500:5:0", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "value": "false" + }, + "src": "10487:18:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 801, + "nodeType": "ExpressionStatement", + "src": "10487:18:0" + } + ] + }, + "id": 803, + "implemented": true, + "isConstructor": true, + "isDeclaredConst": false, + "modifiers": [], + "name": "TetherToken", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 774, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 767, + "name": "_initialSupply", + "nodeType": "VariableDeclaration", + "scope": 803, + "src": "10244:19:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 766, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "10244:4:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 769, + "name": "_name", + "nodeType": "VariableDeclaration", + "scope": 803, + "src": "10265:12:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + }, + "typeName": { + "id": 768, + "name": "string", + "nodeType": "ElementaryTypeName", + "src": "10265:6:0", + "typeDescriptions": { + "typeIdentifier": "t_string_storage_ptr", + "typeString": "string storage pointer" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 771, + "name": "_symbol", + "nodeType": "VariableDeclaration", + "scope": 803, + "src": "10279:14:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + }, + "typeName": { + "id": 770, + "name": "string", + "nodeType": "ElementaryTypeName", + "src": "10279:6:0", + "typeDescriptions": { + "typeIdentifier": "t_string_storage_ptr", + "typeString": "string storage pointer" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 773, + "name": "_decimals", + "nodeType": "VariableDeclaration", + "scope": 803, + "src": "10295:14:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 772, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "10295:4:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "10243:67:0" + }, + "payable": false, + "returnParameters": { + "id": 775, + "nodeType": "ParameterList", + "parameters": [], + "src": "10318:0:0" + }, + "scope": 1142, + "src": "10223:289:0", + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "public" + }, + { + "body": { + "id": 840, + "nodeType": "Block", + "src": "10659:254:0", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 817, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "UnaryOperation", + "operator": "!", + "prefix": true, + "src": "10677:26:0", + "subExpression": { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "id": 813, + "name": "isBlackListed", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 631, + "src": "10678:13:0", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_bool_$", + "typeString": "mapping(address => bool)" + } + }, + "id": 816, + "indexExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 814, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1154, + "src": "10692:3:0", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 815, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "10692:10:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "10678:25:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + ], + "id": 812, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1157, + "src": "10669:7:0", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$returns$__$", + "typeString": "function (bool) pure" + } + }, + "id": 818, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "10669:35:0", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 819, + "nodeType": "ExpressionStatement", + "src": "10669:35:0" + }, + { + "condition": { + "argumentTypes": null, + "id": 820, + "name": "deprecated", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 765, + "src": "10718:10:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": { + "id": 838, + "nodeType": "Block", + "src": "10848:59:0", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 834, + "name": "_to", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 805, + "src": "10884:3:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "argumentTypes": null, + "id": 835, + "name": "_value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 807, + "src": "10889:6:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "argumentTypes": null, + "id": 832, + "name": "super", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1184, + "src": "10869:5:0", + "typeDescriptions": { + "typeIdentifier": "t_super$_TetherToken_$1142", + "typeString": "contract super TetherToken" + } + }, + "id": 833, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "transfer", + "nodeType": "MemberAccess", + "referencedDeclaration": 334, + "src": "10869:14:0", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_uint256_$returns$__$", + "typeString": "function (address,uint256)" + } + }, + "id": 836, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "10869:27:0", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "functionReturnParameters": 811, + "id": 837, + "nodeType": "Return", + "src": "10862:34:0" + } + ] + }, + "id": 839, + "nodeType": "IfStatement", + "src": "10714:193:0", + "trueBody": { + "id": 831, + "nodeType": "Block", + "src": "10730:112:0", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 825, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1154, + "src": "10807:3:0", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 826, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "10807:10:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "argumentTypes": null, + "id": 827, + "name": "_to", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 805, + "src": "10819:3:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "argumentTypes": null, + "id": 828, + "name": "_value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 807, + "src": "10824:6:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 822, + "name": "upgradedAddress", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 763, + "src": "10773:15:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "id": 821, + "name": "UpgradedStandardToken", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 749, + "src": "10751:21:0", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_UpgradedStandardToken_$749_$", + "typeString": "type(contract UpgradedStandardToken)" + } + }, + "id": 823, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "10751:38:0", + "typeDescriptions": { + "typeIdentifier": "t_contract$_UpgradedStandardToken_$749", + "typeString": "contract UpgradedStandardToken" + } + }, + "id": 824, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "transferByLegacy", + "nodeType": "MemberAccess", + "referencedDeclaration": 728, + "src": "10751:55:0", + "typeDescriptions": { + "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$", + "typeString": "function (address,address,uint256) external" + } + }, + "id": 829, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "10751:80:0", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "functionReturnParameters": 811, + "id": 830, + "nodeType": "Return", + "src": "10744:87:0" + } + ] + } + } + ] + }, + "id": 841, + "implemented": true, + "isConstructor": false, + "isDeclaredConst": false, + "modifiers": [ + { + "arguments": [], + "id": 810, + "modifierName": { + "argumentTypes": null, + "id": 809, + "name": "whenNotPaused", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 564, + "src": "10645:13:0", + "typeDescriptions": { + "typeIdentifier": "t_modifier$__$", + "typeString": "modifier ()" + } + }, + "nodeType": "ModifierInvocation", + "src": "10645:13:0" + } + ], + "name": "transfer", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 808, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 805, + "name": "_to", + "nodeType": "VariableDeclaration", + "scope": 841, + "src": "10612:11:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 804, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "10612:7:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 807, + "name": "_value", + "nodeType": "VariableDeclaration", + "scope": 841, + "src": "10625:11:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 806, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "10625:4:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "10611:26:0" + }, + "payable": false, + "returnParameters": { + "id": 811, + "nodeType": "ParameterList", + "parameters": [], + "src": "10659:0:0" + }, + "scope": 1142, + "src": "10594:319:0", + "stateMutability": "nonpayable", + "superFunction": 334, + "visibility": "public" + }, + { + "body": { + "id": 881, + "nodeType": "Block", + "src": "11079:271:0", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 856, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "UnaryOperation", + "operator": "!", + "prefix": true, + "src": "11097:21:0", + "subExpression": { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "id": 853, + "name": "isBlackListed", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 631, + "src": "11098:13:0", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_bool_$", + "typeString": "mapping(address => bool)" + } + }, + "id": 855, + "indexExpression": { + "argumentTypes": null, + "id": 854, + "name": "_from", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 843, + "src": "11112:5:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "11098:20:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + ], + "id": 852, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1157, + "src": "11089:7:0", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$returns$__$", + "typeString": "function (bool) pure" + } + }, + "id": 857, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "11089:30:0", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 858, + "nodeType": "ExpressionStatement", + "src": "11089:30:0" + }, + { + "condition": { + "argumentTypes": null, + "id": 859, + "name": "deprecated", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 765, + "src": "11133:10:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": { + "id": 879, + "nodeType": "Block", + "src": "11274:70:0", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 874, + "name": "_from", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 843, + "src": "11314:5:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "argumentTypes": null, + "id": 875, + "name": "_to", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 845, + "src": "11321:3:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "argumentTypes": null, + "id": 876, + "name": "_value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 847, + "src": "11326:6:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "argumentTypes": null, + "id": 872, + "name": "super", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1184, + "src": "11295:5:0", + "typeDescriptions": { + "typeIdentifier": "t_super$_TetherToken_$1142", + "typeString": "contract super TetherToken" + } + }, + "id": 873, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "transferFrom", + "nodeType": "MemberAccess", + "referencedDeclaration": 481, + "src": "11295:18:0", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$", + "typeString": "function (address,address,uint256)" + } + }, + "id": 877, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "11295:38:0", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "functionReturnParameters": 851, + "id": 878, + "nodeType": "Return", + "src": "11288:45:0" + } + ] + }, + "id": 880, + "nodeType": "IfStatement", + "src": "11129:215:0", + "trueBody": { + "id": 871, + "nodeType": "Block", + "src": "11145:123:0", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 864, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1154, + "src": "11226:3:0", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 865, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "11226:10:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "argumentTypes": null, + "id": 866, + "name": "_from", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 843, + "src": "11238:5:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "argumentTypes": null, + "id": 867, + "name": "_to", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 845, + "src": "11245:3:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "argumentTypes": null, + "id": 868, + "name": "_value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 847, + "src": "11250:6:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 861, + "name": "upgradedAddress", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 763, + "src": "11188:15:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "id": 860, + "name": "UpgradedStandardToken", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 749, + "src": "11166:21:0", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_UpgradedStandardToken_$749_$", + "typeString": "type(contract UpgradedStandardToken)" + } + }, + "id": 862, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "11166:38:0", + "typeDescriptions": { + "typeIdentifier": "t_contract$_UpgradedStandardToken_$749", + "typeString": "contract UpgradedStandardToken" + } + }, + "id": 863, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "transferFromByLegacy", + "nodeType": "MemberAccess", + "referencedDeclaration": 739, + "src": "11166:59:0", + "typeDescriptions": { + "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_address_$_t_address_$_t_uint256_$returns$__$", + "typeString": "function (address,address,address,uint256) external" + } + }, + "id": 869, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "11166:91:0", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "functionReturnParameters": 851, + "id": 870, + "nodeType": "Return", + "src": "11159:98:0" + } + ] + } + } + ] + }, + "id": 882, + "implemented": true, + "isConstructor": false, + "isDeclaredConst": false, + "modifiers": [ + { + "arguments": [], + "id": 850, + "modifierName": { + "argumentTypes": null, + "id": 849, + "name": "whenNotPaused", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 564, + "src": "11065:13:0", + "typeDescriptions": { + "typeIdentifier": "t_modifier$__$", + "typeString": "modifier ()" + } + }, + "nodeType": "ModifierInvocation", + "src": "11065:13:0" + } + ], + "name": "transferFrom", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 848, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 843, + "name": "_from", + "nodeType": "VariableDeclaration", + "scope": 882, + "src": "11017:13:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 842, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "11017:7:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 845, + "name": "_to", + "nodeType": "VariableDeclaration", + "scope": 882, + "src": "11032:11:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 844, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "11032:7:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 847, + "name": "_value", + "nodeType": "VariableDeclaration", + "scope": 882, + "src": "11045:11:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 846, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "11045:4:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "11016:41:0" + }, + "payable": false, + "returnParameters": { + "id": 851, + "nodeType": "ParameterList", + "parameters": [], + "src": "11079:0:0" + }, + "scope": 1142, + "src": "10995:355:0", + "stateMutability": "nonpayable", + "superFunction": 481, + "visibility": "public" + }, + { + "body": { + "id": 905, + "nodeType": "Block", + "src": "11495:175:0", + "statements": [ + { + "condition": { + "argumentTypes": null, + "id": 889, + "name": "deprecated", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 765, + "src": "11509:10:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": { + "id": 903, + "nodeType": "Block", + "src": "11612:52:0", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 900, + "name": "who", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 884, + "src": "11649:3:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "expression": { + "argumentTypes": null, + "id": 898, + "name": "super", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1184, + "src": "11633:5:0", + "typeDescriptions": { + "typeIdentifier": "t_super$_TetherToken_$1142", + "typeString": "contract super TetherToken" + } + }, + "id": 899, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "balanceOf", + "nodeType": "MemberAccess", + "referencedDeclaration": 346, + "src": "11633:15:0", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$_t_address_$returns$_t_uint256_$", + "typeString": "function (address) view returns (uint256)" + } + }, + "id": 901, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "11633:20:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "functionReturnParameters": 888, + "id": 902, + "nodeType": "Return", + "src": "11626:27:0" + } + ] + }, + "id": 904, + "nodeType": "IfStatement", + "src": "11505:159:0", + "trueBody": { + "id": 897, + "nodeType": "Block", + "src": "11521:85:0", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 894, + "name": "who", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 884, + "src": "11591:3:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 891, + "name": "upgradedAddress", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 763, + "src": "11564:15:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "id": 890, + "name": "UpgradedStandardToken", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 749, + "src": "11542:21:0", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_UpgradedStandardToken_$749_$", + "typeString": "type(contract UpgradedStandardToken)" + } + }, + "id": 892, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "11542:38:0", + "typeDescriptions": { + "typeIdentifier": "t_contract$_UpgradedStandardToken_$749", + "typeString": "contract UpgradedStandardToken" + } + }, + "id": 893, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "balanceOf", + "nodeType": "MemberAccess", + "referencedDeclaration": 346, + "src": "11542:48:0", + "typeDescriptions": { + "typeIdentifier": "t_function_external_view$_t_address_$returns$_t_uint256_$", + "typeString": "function (address) view external returns (uint256)" + } + }, + "id": 895, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "11542:53:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "functionReturnParameters": 888, + "id": 896, + "nodeType": "Return", + "src": "11535:60:0" + } + ] + } + } + ] + }, + "id": 906, + "implemented": true, + "isConstructor": false, + "isDeclaredConst": true, + "modifiers": [], + "name": "balanceOf", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 885, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 884, + "name": "who", + "nodeType": "VariableDeclaration", + "scope": 906, + "src": "11451:11:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 883, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "11451:7:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "11450:13:0" + }, + "payable": false, + "returnParameters": { + "id": 888, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 887, + "name": "", + "nodeType": "VariableDeclaration", + "scope": 906, + "src": "11489:4:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 886, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "11489:4:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "11488:6:0" + }, + "scope": 1142, + "src": "11432:238:0", + "stateMutability": "view", + "superFunction": 346, + "visibility": "public" + }, + { + "body": { + "id": 938, + "nodeType": "Block", + "src": "11831:217:0", + "statements": [ + { + "condition": { + "argumentTypes": null, + "id": 918, + "name": "deprecated", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 765, + "src": "11845:10:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": { + "id": 936, + "nodeType": "Block", + "src": "11979:63:0", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 932, + "name": "_spender", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 908, + "src": "12014:8:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "argumentTypes": null, + "id": 933, + "name": "_value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 910, + "src": "12024:6:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "argumentTypes": null, + "id": 930, + "name": "super", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1184, + "src": "12000:5:0", + "typeDescriptions": { + "typeIdentifier": "t_super$_TetherToken_$1142", + "typeString": "contract super TetherToken" + } + }, + "id": 931, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "approve", + "nodeType": "MemberAccess", + "referencedDeclaration": 529, + "src": "12000:13:0", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_uint256_$returns$__$", + "typeString": "function (address,uint256)" + } + }, + "id": 934, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "12000:31:0", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "functionReturnParameters": 917, + "id": 935, + "nodeType": "Return", + "src": "11993:38:0" + } + ] + }, + "id": 937, + "nodeType": "IfStatement", + "src": "11841:201:0", + "trueBody": { + "id": 929, + "nodeType": "Block", + "src": "11857:116:0", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 923, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1154, + "src": "11933:3:0", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 924, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "11933:10:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "argumentTypes": null, + "id": 925, + "name": "_spender", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 908, + "src": "11945:8:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "argumentTypes": null, + "id": 926, + "name": "_value", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 910, + "src": "11955:6:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 920, + "name": "upgradedAddress", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 763, + "src": "11900:15:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "id": 919, + "name": "UpgradedStandardToken", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 749, + "src": "11878:21:0", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_UpgradedStandardToken_$749_$", + "typeString": "type(contract UpgradedStandardToken)" + } + }, + "id": 921, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "11878:38:0", + "typeDescriptions": { + "typeIdentifier": "t_contract$_UpgradedStandardToken_$749", + "typeString": "contract UpgradedStandardToken" + } + }, + "id": 922, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "approveByLegacy", + "nodeType": "MemberAccess", + "referencedDeclaration": 748, + "src": "11878:54:0", + "typeDescriptions": { + "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$", + "typeString": "function (address,address,uint256) external" + } + }, + "id": 927, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "11878:84:0", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "functionReturnParameters": 917, + "id": 928, + "nodeType": "Return", + "src": "11871:91:0" + } + ] + } + } + ] + }, + "id": 939, + "implemented": true, + "isConstructor": false, + "isDeclaredConst": false, + "modifiers": [ + { + "arguments": [ + { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_rational_64_by_1", + "typeString": "int_const 64" + }, + "id": 915, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "hexValue": "32", + "id": 913, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "11823:1:0", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_2_by_1", + "typeString": "int_const 2" + }, + "value": "2" + }, + "nodeType": "BinaryOperation", + "operator": "*", + "rightExpression": { + "argumentTypes": null, + "hexValue": "3332", + "id": 914, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "11827:2:0", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_32_by_1", + "typeString": "int_const 32" + }, + "value": "32" + }, + "src": "11823:6:0", + "typeDescriptions": { + "typeIdentifier": "t_rational_64_by_1", + "typeString": "int_const 64" + } + } + ], + "id": 916, + "modifierName": { + "argumentTypes": null, + "id": 912, + "name": "onlyPayloadSize", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 240, + "src": "11807:15:0", + "typeDescriptions": { + "typeIdentifier": "t_modifier$_t_uint256_$", + "typeString": "modifier (uint256)" + } + }, + "nodeType": "ModifierInvocation", + "src": "11807:23:0" + } + ], + "name": "approve", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 911, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 908, + "name": "_spender", + "nodeType": "VariableDeclaration", + "scope": 939, + "src": "11769:16:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 907, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "11769:7:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 910, + "name": "_value", + "nodeType": "VariableDeclaration", + "scope": 939, + "src": "11787:11:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 909, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "11787:4:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "11768:31:0" + }, + "payable": false, + "returnParameters": { + "id": 917, + "nodeType": "ParameterList", + "parameters": [], + "src": "11831:0:0" + }, + "scope": 1142, + "src": "11752:296:0", + "stateMutability": "nonpayable", + "superFunction": 529, + "visibility": "public" + }, + { + "body": { + "id": 966, + "nodeType": "Block", + "src": "12224:193:0", + "statements": [ + { + "condition": { + "argumentTypes": null, + "id": 948, + "name": "deprecated", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 765, + "src": "12238:10:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": { + "id": 964, + "nodeType": "Block", + "src": "12346:65:0", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 960, + "name": "_owner", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 941, + "src": "12383:6:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "argumentTypes": null, + "id": 961, + "name": "_spender", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 943, + "src": "12391:8:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "expression": { + "argumentTypes": null, + "id": 958, + "name": "super", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1184, + "src": "12367:5:0", + "typeDescriptions": { + "typeIdentifier": "t_super$_TetherToken_$1142", + "typeString": "contract super TetherToken" + } + }, + "id": 959, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "allowance", + "nodeType": "MemberAccess", + "referencedDeclaration": 545, + "src": "12367:15:0", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$_t_address_$_t_address_$returns$_t_uint256_$", + "typeString": "function (address,address) view returns (uint256)" + } + }, + "id": 962, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "12367:33:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "functionReturnParameters": 947, + "id": 963, + "nodeType": "Return", + "src": "12360:40:0" + } + ] + }, + "id": 965, + "nodeType": "IfStatement", + "src": "12234:177:0", + "trueBody": { + "id": 957, + "nodeType": "Block", + "src": "12250:90:0", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 953, + "name": "_owner", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 941, + "src": "12312:6:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "argumentTypes": null, + "id": 954, + "name": "_spender", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 943, + "src": "12320:8:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 950, + "name": "upgradedAddress", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 763, + "src": "12285:15:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "id": 949, + "name": "StandardToken", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 546, + "src": "12271:13:0", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_StandardToken_$546_$", + "typeString": "type(contract StandardToken)" + } + }, + "id": 951, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "12271:30:0", + "typeDescriptions": { + "typeIdentifier": "t_contract$_StandardToken_$546", + "typeString": "contract StandardToken" + } + }, + "id": 952, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "allowance", + "nodeType": "MemberAccess", + "referencedDeclaration": 545, + "src": "12271:40:0", + "typeDescriptions": { + "typeIdentifier": "t_function_external_view$_t_address_$_t_address_$returns$_t_uint256_$", + "typeString": "function (address,address) view external returns (uint256)" + } + }, + "id": 955, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "12271:58:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "functionReturnParameters": 947, + "id": 956, + "nodeType": "Return", + "src": "12264:65:0" + } + ] + } + } + ] + }, + "id": 967, + "implemented": true, + "isConstructor": false, + "isDeclaredConst": true, + "modifiers": [], + "name": "allowance", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 944, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 941, + "name": "_owner", + "nodeType": "VariableDeclaration", + "scope": 967, + "src": "12149:14:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 940, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "12149:7:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 943, + "name": "_spender", + "nodeType": "VariableDeclaration", + "scope": 967, + "src": "12165:16:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 942, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "12165:7:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "12148:34:0" + }, + "payable": false, + "returnParameters": { + "id": 947, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 946, + "name": "remaining", + "nodeType": "VariableDeclaration", + "scope": 967, + "src": "12208:14:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 945, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "12208:4:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "12207:16:0" + }, + "scope": 1142, + "src": "12130:287:0", + "stateMutability": "view", + "superFunction": 545, + "visibility": "public" + }, + { + "body": { + "id": 986, + "nodeType": "Block", + "src": "12542:115:0", + "statements": [ + { + "expression": { + "argumentTypes": null, + "id": 976, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 974, + "name": "deprecated", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 765, + "src": "12552:10:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "hexValue": "74727565", + "id": 975, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "bool", + "lValueRequested": false, + "nodeType": "Literal", + "src": "12565:4:0", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "value": "true" + }, + "src": "12552:17:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 977, + "nodeType": "ExpressionStatement", + "src": "12552:17:0" + }, + { + "expression": { + "argumentTypes": null, + "id": 980, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 978, + "name": "upgradedAddress", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 763, + "src": "12579:15:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "id": 979, + "name": "_upgradedAddress", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 969, + "src": "12597:16:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "src": "12579:34:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "id": 981, + "nodeType": "ExpressionStatement", + "src": "12579:34:0" + }, + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 983, + "name": "_upgradedAddress", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 969, + "src": "12633:16:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "id": 982, + "name": "Deprecate", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1135, + "src": "12623:9:0", + "typeDescriptions": { + "typeIdentifier": "t_function_event_nonpayable$_t_address_$returns$__$", + "typeString": "function (address)" + } + }, + "id": 984, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "12623:27:0", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 985, + "nodeType": "ExpressionStatement", + "src": "12623:27:0" + } + ] + }, + "id": 987, + "implemented": true, + "isConstructor": false, + "isDeclaredConst": false, + "modifiers": [ + { + "arguments": [], + "id": 972, + "modifierName": { + "argumentTypes": null, + "id": 971, + "name": "onlyOwner", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 119, + "src": "12532:9:0", + "typeDescriptions": { + "typeIdentifier": "t_modifier$__$", + "typeString": "modifier ()" + } + }, + "nodeType": "ModifierInvocation", + "src": "12532:9:0" + } + ], + "name": "deprecate", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 970, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 969, + "name": "_upgradedAddress", + "nodeType": "VariableDeclaration", + "scope": 987, + "src": "12499:24:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 968, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "12499:7:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "12498:26:0" + }, + "payable": false, + "returnParameters": { + "id": 973, + "nodeType": "ParameterList", + "parameters": [], + "src": "12542:0:0" + }, + "scope": 1142, + "src": "12480:177:0", + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "public" + }, + { + "body": { + "id": 1004, + "nodeType": "Block", + "src": "12774:158:0", + "statements": [ + { + "condition": { + "argumentTypes": null, + "id": 992, + "name": "deprecated", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 765, + "src": "12788:10:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": { + "id": 1002, + "nodeType": "Block", + "src": "12882:44:0", + "statements": [ + { + "expression": { + "argumentTypes": null, + "id": 1000, + "name": "_totalSupply", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 141, + "src": "12903:12:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "functionReturnParameters": 991, + "id": 1001, + "nodeType": "Return", + "src": "12896:19:0" + } + ] + }, + "id": 1003, + "nodeType": "IfStatement", + "src": "12784:142:0", + "trueBody": { + "id": 999, + "nodeType": "Block", + "src": "12800:76:0", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [], + "expression": { + "argumentTypes": [], + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 994, + "name": "upgradedAddress", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 763, + "src": "12835:15:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "id": 993, + "name": "StandardToken", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 546, + "src": "12821:13:0", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_StandardToken_$546_$", + "typeString": "type(contract StandardToken)" + } + }, + "id": 995, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "12821:30:0", + "typeDescriptions": { + "typeIdentifier": "t_contract$_StandardToken_$546", + "typeString": "contract StandardToken" + } + }, + "id": 996, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "totalSupply", + "nodeType": "MemberAccess", + "referencedDeclaration": 146, + "src": "12821:42:0", + "typeDescriptions": { + "typeIdentifier": "t_function_external_view$__$returns$_t_uint256_$", + "typeString": "function () view external returns (uint256)" + } + }, + "id": 997, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "12821:44:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "functionReturnParameters": 991, + "id": 998, + "nodeType": "Return", + "src": "12814:51:0" + } + ] + } + } + ] + }, + "id": 1005, + "implemented": true, + "isConstructor": false, + "isDeclaredConst": true, + "modifiers": [], + "name": "totalSupply", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 988, + "nodeType": "ParameterList", + "parameters": [], + "src": "12740:2:0" + }, + "payable": false, + "returnParameters": { + "id": 991, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 990, + "name": "", + "nodeType": "VariableDeclaration", + "scope": 1005, + "src": "12768:4:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 989, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "12768:4:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "12767:6:0" + }, + "scope": 1142, + "src": "12720:212:0", + "stateMutability": "view", + "superFunction": 146, + "visibility": "public" + }, + { + "body": { + "id": 1046, + "nodeType": "Block", + "src": "13135:214:0", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 1017, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 1015, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 1013, + "name": "_totalSupply", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 141, + "src": "13153:12:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "+", + "rightExpression": { + "argumentTypes": null, + "id": 1014, + "name": "amount", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1007, + "src": "13168:6:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "13153:21:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">", + "rightExpression": { + "argumentTypes": null, + "id": 1016, + "name": "_totalSupply", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 141, + "src": "13177:12:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "13153:36:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + ], + "id": 1012, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1157, + "src": "13145:7:0", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$returns$__$", + "typeString": "function (bool) pure" + } + }, + "id": 1018, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "13145:45:0", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 1019, + "nodeType": "ExpressionStatement", + "src": "13145:45:0" + }, + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 1029, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 1025, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "id": 1021, + "name": "balances", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 216, + "src": "13208:8:0", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$", + "typeString": "mapping(address => uint256)" + } + }, + "id": 1023, + "indexExpression": { + "argumentTypes": null, + "id": 1022, + "name": "owner", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 99, + "src": "13217:5:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "13208:15:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "+", + "rightExpression": { + "argumentTypes": null, + "id": 1024, + "name": "amount", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1007, + "src": "13226:6:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "13208:24:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">", + "rightExpression": { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "id": 1026, + "name": "balances", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 216, + "src": "13235:8:0", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$", + "typeString": "mapping(address => uint256)" + } + }, + "id": 1028, + "indexExpression": { + "argumentTypes": null, + "id": 1027, + "name": "owner", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 99, + "src": "13244:5:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "13235:15:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "13208:42:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + ], + "id": 1020, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1157, + "src": "13200:7:0", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$returns$__$", + "typeString": "function (bool) pure" + } + }, + "id": 1030, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "13200:51:0", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 1031, + "nodeType": "ExpressionStatement", + "src": "13200:51:0" + }, + { + "expression": { + "argumentTypes": null, + "id": 1036, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "id": 1032, + "name": "balances", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 216, + "src": "13262:8:0", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$", + "typeString": "mapping(address => uint256)" + } + }, + "id": 1034, + "indexExpression": { + "argumentTypes": null, + "id": 1033, + "name": "owner", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 99, + "src": "13271:5:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "nodeType": "IndexAccess", + "src": "13262:15:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "+=", + "rightHandSide": { + "argumentTypes": null, + "id": 1035, + "name": "amount", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1007, + "src": "13281:6:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "13262:25:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 1037, + "nodeType": "ExpressionStatement", + "src": "13262:25:0" + }, + { + "expression": { + "argumentTypes": null, + "id": 1040, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 1038, + "name": "_totalSupply", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 141, + "src": "13297:12:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "+=", + "rightHandSide": { + "argumentTypes": null, + "id": 1039, + "name": "amount", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1007, + "src": "13313:6:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "13297:22:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 1041, + "nodeType": "ExpressionStatement", + "src": "13297:22:0" + }, + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 1043, + "name": "amount", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1007, + "src": "13335:6:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 1042, + "name": "Issue", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1127, + "src": "13329:5:0", + "typeDescriptions": { + "typeIdentifier": "t_function_event_nonpayable$_t_uint256_$returns$__$", + "typeString": "function (uint256)" + } + }, + "id": 1044, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "13329:13:0", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 1045, + "nodeType": "ExpressionStatement", + "src": "13329:13:0" + } + ] + }, + "id": 1047, + "implemented": true, + "isConstructor": false, + "isDeclaredConst": false, + "modifiers": [ + { + "arguments": [], + "id": 1010, + "modifierName": { + "argumentTypes": null, + "id": 1009, + "name": "onlyOwner", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 119, + "src": "13125:9:0", + "typeDescriptions": { + "typeIdentifier": "t_modifier$__$", + "typeString": "modifier ()" + } + }, + "nodeType": "ModifierInvocation", + "src": "13125:9:0" + } + ], + "name": "issue", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 1008, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 1007, + "name": "amount", + "nodeType": "VariableDeclaration", + "scope": 1047, + "src": "13105:11:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 1006, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "13105:4:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "13104:13:0" + }, + "payable": false, + "returnParameters": { + "id": 1011, + "nodeType": "ParameterList", + "parameters": [], + "src": "13135:0:0" + }, + "scope": 1142, + "src": "13090:259:0", + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "public" + }, + { + "body": { + "id": 1082, + "nodeType": "Block", + "src": "13619:184:0", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 1057, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 1055, + "name": "_totalSupply", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 141, + "src": "13637:12:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">=", + "rightExpression": { + "argumentTypes": null, + "id": 1056, + "name": "amount", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1049, + "src": "13653:6:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "13637:22:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + ], + "id": 1054, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1157, + "src": "13629:7:0", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$returns$__$", + "typeString": "function (bool) pure" + } + }, + "id": 1058, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "13629:31:0", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 1059, + "nodeType": "ExpressionStatement", + "src": "13629:31:0" + }, + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 1065, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "id": 1061, + "name": "balances", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 216, + "src": "13678:8:0", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$", + "typeString": "mapping(address => uint256)" + } + }, + "id": 1063, + "indexExpression": { + "argumentTypes": null, + "id": 1062, + "name": "owner", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 99, + "src": "13687:5:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "13678:15:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">=", + "rightExpression": { + "argumentTypes": null, + "id": 1064, + "name": "amount", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1049, + "src": "13697:6:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "13678:25:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + ], + "id": 1060, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1157, + "src": "13670:7:0", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$returns$__$", + "typeString": "function (bool) pure" + } + }, + "id": 1066, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "13670:34:0", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 1067, + "nodeType": "ExpressionStatement", + "src": "13670:34:0" + }, + { + "expression": { + "argumentTypes": null, + "id": 1070, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 1068, + "name": "_totalSupply", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 141, + "src": "13715:12:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "-=", + "rightHandSide": { + "argumentTypes": null, + "id": 1069, + "name": "amount", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1049, + "src": "13731:6:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "13715:22:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 1071, + "nodeType": "ExpressionStatement", + "src": "13715:22:0" + }, + { + "expression": { + "argumentTypes": null, + "id": 1076, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "id": 1072, + "name": "balances", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 216, + "src": "13747:8:0", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$", + "typeString": "mapping(address => uint256)" + } + }, + "id": 1074, + "indexExpression": { + "argumentTypes": null, + "id": 1073, + "name": "owner", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 99, + "src": "13756:5:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "nodeType": "IndexAccess", + "src": "13747:15:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "-=", + "rightHandSide": { + "argumentTypes": null, + "id": 1075, + "name": "amount", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1049, + "src": "13766:6:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "13747:25:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 1077, + "nodeType": "ExpressionStatement", + "src": "13747:25:0" + }, + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 1079, + "name": "amount", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1049, + "src": "13789:6:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 1078, + "name": "Redeem", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1131, + "src": "13782:6:0", + "typeDescriptions": { + "typeIdentifier": "t_function_event_nonpayable$_t_uint256_$returns$__$", + "typeString": "function (uint256)" + } + }, + "id": 1080, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "13782:14:0", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 1081, + "nodeType": "ExpressionStatement", + "src": "13782:14:0" + } + ] + }, + "id": 1083, + "implemented": true, + "isConstructor": false, + "isDeclaredConst": false, + "modifiers": [ + { + "arguments": [], + "id": 1052, + "modifierName": { + "argumentTypes": null, + "id": 1051, + "name": "onlyOwner", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 119, + "src": "13609:9:0", + "typeDescriptions": { + "typeIdentifier": "t_modifier$__$", + "typeString": "modifier ()" + } + }, + "nodeType": "ModifierInvocation", + "src": "13609:9:0" + } + ], + "name": "redeem", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 1050, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 1049, + "name": "amount", + "nodeType": "VariableDeclaration", + "scope": 1083, + "src": "13589:11:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 1048, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "13589:4:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "13588:13:0" + }, + "payable": false, + "returnParameters": { + "id": 1053, + "nodeType": "ParameterList", + "parameters": [], + "src": "13619:0:0" + }, + "scope": 1142, + "src": "13573:230:0", + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "public" + }, + { + "body": { + "id": 1122, + "nodeType": "Block", + "src": "13882:305:0", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 1095, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 1093, + "name": "newBasisPoints", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1085, + "src": "13988:14:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "<", + "rightExpression": { + "argumentTypes": null, + "hexValue": "3230", + "id": 1094, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "14005:2:0", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_20_by_1", + "typeString": "int_const 20" + }, + "value": "20" + }, + "src": "13988:19:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + ], + "id": 1092, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1157, + "src": "13980:7:0", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$returns$__$", + "typeString": "function (bool) pure" + } + }, + "id": 1096, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "13980:28:0", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 1097, + "nodeType": "ExpressionStatement", + "src": "13980:28:0" + }, + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 1101, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 1099, + "name": "newMaxFee", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1087, + "src": "14026:9:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "<", + "rightExpression": { + "argumentTypes": null, + "hexValue": "3530", + "id": 1100, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "14038:2:0", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_50_by_1", + "typeString": "int_const 50" + }, + "value": "50" + }, + "src": "14026:14:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + ], + "id": 1098, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1157, + "src": "14018:7:0", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$returns$__$", + "typeString": "function (bool) pure" + } + }, + "id": 1102, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "14018:23:0", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 1103, + "nodeType": "ExpressionStatement", + "src": "14018:23:0" + }, + { + "expression": { + "argumentTypes": null, + "id": 1106, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 1104, + "name": "basisPointsRate", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 219, + "src": "14052:15:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "id": 1105, + "name": "newBasisPoints", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1085, + "src": "14070:14:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "14052:32:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 1107, + "nodeType": "ExpressionStatement", + "src": "14052:32:0" + }, + { + "expression": { + "argumentTypes": null, + "id": 1115, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 1108, + "name": "maximumFee", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 222, + "src": "14094:10:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 1113, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "hexValue": "3130", + "id": 1111, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "14121:2:0", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_10_by_1", + "typeString": "int_const 10" + }, + "value": "10" + }, + "nodeType": "BinaryOperation", + "operator": "**", + "rightExpression": { + "argumentTypes": null, + "id": 1112, + "name": "decimals", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 761, + "src": "14125:8:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "14121:12:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "argumentTypes": null, + "id": 1109, + "name": "newMaxFee", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1087, + "src": "14107:9:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 1110, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "mul", + "nodeType": "MemberAccess", + "referencedDeclaration": 34, + "src": "14107:13:0", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", + "typeString": "function (uint256,uint256) pure returns (uint256)" + } + }, + "id": 1114, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "14107:27:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "14094:40:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 1116, + "nodeType": "ExpressionStatement", + "src": "14094:40:0" + }, + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 1118, + "name": "basisPointsRate", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 219, + "src": "14152:15:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "argumentTypes": null, + "id": 1119, + "name": "maximumFee", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 222, + "src": "14169:10:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 1117, + "name": "Params", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1141, + "src": "14145:6:0", + "typeDescriptions": { + "typeIdentifier": "t_function_event_nonpayable$_t_uint256_$_t_uint256_$returns$__$", + "typeString": "function (uint256,uint256)" + } + }, + "id": 1120, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "14145:35:0", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 1121, + "nodeType": "ExpressionStatement", + "src": "14145:35:0" + } + ] + }, + "id": 1123, + "implemented": true, + "isConstructor": false, + "isDeclaredConst": false, + "modifiers": [ + { + "arguments": [], + "id": 1090, + "modifierName": { + "argumentTypes": null, + "id": 1089, + "name": "onlyOwner", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 119, + "src": "13872:9:0", + "typeDescriptions": { + "typeIdentifier": "t_modifier$__$", + "typeString": "modifier ()" + } + }, + "nodeType": "ModifierInvocation", + "src": "13872:9:0" + } + ], + "name": "setParams", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 1088, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 1085, + "name": "newBasisPoints", + "nodeType": "VariableDeclaration", + "scope": 1123, + "src": "13828:19:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 1084, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "13828:4:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 1087, + "name": "newMaxFee", + "nodeType": "VariableDeclaration", + "scope": 1123, + "src": "13849:14:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 1086, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "13849:4:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "13827:37:0" + }, + "payable": false, + "returnParameters": { + "id": 1091, + "nodeType": "ParameterList", + "parameters": [], + "src": "13882:0:0" + }, + "scope": 1142, + "src": "13809:378:0", + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "public" + }, + { + "anonymous": false, + "id": 1127, + "name": "Issue", + "nodeType": "EventDefinition", + "parameters": { + "id": 1126, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 1125, + "indexed": false, + "name": "amount", + "nodeType": "VariableDeclaration", + "scope": 1127, + "src": "14245:11:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 1124, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "14245:4:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "14244:13:0" + }, + "src": "14233:25:0" + }, + { + "anonymous": false, + "id": 1131, + "name": "Redeem", + "nodeType": "EventDefinition", + "parameters": { + "id": 1130, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 1129, + "indexed": false, + "name": "amount", + "nodeType": "VariableDeclaration", + "scope": 1131, + "src": "14316:11:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 1128, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "14316:4:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "14315:13:0" + }, + "src": "14303:26:0" + }, + { + "anonymous": false, + "id": 1135, + "name": "Deprecate", + "nodeType": "EventDefinition", + "parameters": { + "id": 1134, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 1133, + "indexed": false, + "name": "newAddress", + "nodeType": "VariableDeclaration", + "scope": 1135, + "src": "14393:18:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 1132, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "14393:7:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "14392:20:0" + }, + "src": "14377:36:0" + }, + { + "anonymous": false, + "id": 1141, + "name": "Params", + "nodeType": "EventDefinition", + "parameters": { + "id": 1140, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 1137, + "indexed": false, + "name": "feeBasisPoints", + "nodeType": "VariableDeclaration", + "scope": 1141, + "src": "14473:19:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 1136, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "14473:4:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 1139, + "indexed": false, + "name": "maxFee", + "nodeType": "VariableDeclaration", + "scope": 1141, + "src": "14494:11:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 1138, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "14494:4:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "14472:34:0" + }, + "src": "14460:47:0" + } + ], + "scope": 1143, + "src": "9728:4781:0" + } + ], + "src": "67:14442:0" + }, + "id": 0, + "legacyAST": { + "attributes": { + "absolutePath": "src/Contract.sol", + "exportedSymbols": { + "BasicToken": [ + 347 + ], + "BlackList": [ + 717 + ], + "ERC20": [ + 205 + ], + "ERC20Basic": [ + 169 + ], + "Ownable": [ + 139 + ], + "Pausable": [ + 603 + ], + "SafeMath": [ + 97 + ], + "StandardToken": [ + 546 + ], + "TetherToken": [ + 1142 + ], + "UpgradedStandardToken": [ + 749 + ] + } + }, + "children": [ + { + "attributes": { + "literals": [ + "solidity", + "^", + "0.4", + ".17" + ] + }, + "id": 1, + "name": "PragmaDirective", + "src": "67:24:0" + }, + { + "attributes": { + "baseContracts": [ + null + ], + "contractDependencies": [ + null + ], + "contractKind": "library", + "documentation": "@title SafeMath\n@dev Math operations with safety checks that throw on error", + "fullyImplemented": true, + "linearizedBaseContracts": [ + 97 + ], + "name": "SafeMath", + "scope": 1143 + }, + "children": [ + { + "attributes": { + "constant": true, + "implemented": true, + "isConstructor": false, + "modifiers": [ + null + ], + "name": "mul", + "payable": false, + "scope": 97, + "stateMutability": "pure", + "superFunction": null, + "visibility": "internal" + }, + "children": [ + { + "children": [ + { + "attributes": { + "constant": false, + "name": "a", + "scope": 34, + "stateVariable": false, + "storageLocation": "default", + "type": "uint256", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "uint256", + "type": "uint256" + }, + "id": 2, + "name": "ElementaryTypeName", + "src": "219:7:0" + } + ], + "id": 3, + "name": "VariableDeclaration", + "src": "219:9:0" + }, + { + "attributes": { + "constant": false, + "name": "b", + "scope": 34, + "stateVariable": false, + "storageLocation": "default", + "type": "uint256", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "uint256", + "type": "uint256" + }, + "id": 4, + "name": "ElementaryTypeName", + "src": "230:7:0" + } + ], + "id": 5, + "name": "VariableDeclaration", + "src": "230:9:0" + } + ], + "id": 6, + "name": "ParameterList", + "src": "218:22:0" + }, + { + "children": [ + { + "attributes": { + "constant": false, + "name": "", + "scope": 34, + "stateVariable": false, + "storageLocation": "default", + "type": "uint256", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "uint256", + "type": "uint256" + }, + "id": 7, + "name": "ElementaryTypeName", + "src": "264:7:0" + } + ], + "id": 8, + "name": "VariableDeclaration", + "src": "264:7:0" + } + ], + "id": 9, + "name": "ParameterList", + "src": "263:9:0" + }, + { + "children": [ + { + "attributes": { + "falseBody": null + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": "==", + "type": "bool" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 3, + "type": "uint256", + "value": "a" + }, + "id": 10, + "name": "Identifier", + "src": "287:1:0" + }, + { + "attributes": { + "argumentTypes": null, + "hexvalue": "30", + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "subdenomination": null, + "token": "number", + "type": "int_const 0", + "value": "0" + }, + "id": 11, + "name": "Literal", + "src": "292:1:0" + } + ], + "id": 12, + "name": "BinaryOperation", + "src": "287:6:0" + }, + { + "children": [ + { + "attributes": { + "functionReturnParameters": 9 + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "hexvalue": "30", + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "subdenomination": null, + "token": "number", + "type": "int_const 0", + "value": "0" + }, + "id": 13, + "name": "Literal", + "src": "316:1:0" + } + ], + "id": 14, + "name": "Return", + "src": "309:8:0" + } + ], + "id": 15, + "name": "Block", + "src": "295:33:0" + } + ], + "id": 16, + "name": "IfStatement", + "src": "283:45:0" + }, + { + "attributes": { + "assignments": [ + 18 + ] + }, + "children": [ + { + "attributes": { + "constant": false, + "name": "c", + "scope": 34, + "stateVariable": false, + "storageLocation": "default", + "type": "uint256", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "uint256", + "type": "uint256" + }, + "id": 17, + "name": "ElementaryTypeName", + "src": "337:7:0" + } + ], + "id": 18, + "name": "VariableDeclaration", + "src": "337:9:0" + }, + { + "attributes": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": "*", + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 3, + "type": "uint256", + "value": "a" + }, + "id": 19, + "name": "Identifier", + "src": "349:1:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 5, + "type": "uint256", + "value": "b" + }, + "id": 20, + "name": "Identifier", + "src": "353:1:0" + } + ], + "id": 21, + "name": "BinaryOperation", + "src": "349:5:0" + } + ], + "id": 22, + "name": "VariableDeclarationStatement", + "src": "337:17:0" + }, + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "isStructConstructorCall": false, + "lValueRequested": false, + "names": [ + null + ], + "type": "tuple()", + "type_conversion": false + }, + "children": [ + { + "attributes": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + ], + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1145, + "type": "function (bool) pure", + "value": "assert" + }, + "id": 23, + "name": "Identifier", + "src": "364:6:0" + }, + { + "attributes": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": "==", + "type": "bool" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": "/", + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 18, + "type": "uint256", + "value": "c" + }, + "id": 24, + "name": "Identifier", + "src": "371:1:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 3, + "type": "uint256", + "value": "a" + }, + "id": 25, + "name": "Identifier", + "src": "375:1:0" + } + ], + "id": 26, + "name": "BinaryOperation", + "src": "371:5:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 5, + "type": "uint256", + "value": "b" + }, + "id": 27, + "name": "Identifier", + "src": "380:1:0" + } + ], + "id": 28, + "name": "BinaryOperation", + "src": "371:10:0" + } + ], + "id": 29, + "name": "FunctionCall", + "src": "364:18:0" + } + ], + "id": 30, + "name": "ExpressionStatement", + "src": "364:18:0" + }, + { + "attributes": { + "functionReturnParameters": 9 + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 18, + "type": "uint256", + "value": "c" + }, + "id": 31, + "name": "Identifier", + "src": "399:1:0" + } + ], + "id": 32, + "name": "Return", + "src": "392:8:0" + } + ], + "id": 33, + "name": "Block", + "src": "273:134:0" + } + ], + "id": 34, + "name": "FunctionDefinition", + "src": "206:201:0" + }, + { + "attributes": { + "constant": true, + "implemented": true, + "isConstructor": false, + "modifiers": [ + null + ], + "name": "div", + "payable": false, + "scope": 97, + "stateMutability": "pure", + "superFunction": null, + "visibility": "internal" + }, + "children": [ + { + "children": [ + { + "attributes": { + "constant": false, + "name": "a", + "scope": 52, + "stateVariable": false, + "storageLocation": "default", + "type": "uint256", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "uint256", + "type": "uint256" + }, + "id": 35, + "name": "ElementaryTypeName", + "src": "426:7:0" + } + ], + "id": 36, + "name": "VariableDeclaration", + "src": "426:9:0" + }, + { + "attributes": { + "constant": false, + "name": "b", + "scope": 52, + "stateVariable": false, + "storageLocation": "default", + "type": "uint256", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "uint256", + "type": "uint256" + }, + "id": 37, + "name": "ElementaryTypeName", + "src": "437:7:0" + } + ], + "id": 38, + "name": "VariableDeclaration", + "src": "437:9:0" + } + ], + "id": 39, + "name": "ParameterList", + "src": "425:22:0" + }, + { + "children": [ + { + "attributes": { + "constant": false, + "name": "", + "scope": 52, + "stateVariable": false, + "storageLocation": "default", + "type": "uint256", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "uint256", + "type": "uint256" + }, + "id": 40, + "name": "ElementaryTypeName", + "src": "471:7:0" + } + ], + "id": 41, + "name": "VariableDeclaration", + "src": "471:7:0" + } + ], + "id": 42, + "name": "ParameterList", + "src": "470:9:0" + }, + { + "children": [ + { + "attributes": { + "assignments": [ + 44 + ] + }, + "children": [ + { + "attributes": { + "constant": false, + "name": "c", + "scope": 52, + "stateVariable": false, + "storageLocation": "default", + "type": "uint256", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "uint256", + "type": "uint256" + }, + "id": 43, + "name": "ElementaryTypeName", + "src": "568:7:0" + } + ], + "id": 44, + "name": "VariableDeclaration", + "src": "568:9:0" + }, + { + "attributes": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": "/", + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 36, + "type": "uint256", + "value": "a" + }, + "id": 45, + "name": "Identifier", + "src": "580:1:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 38, + "type": "uint256", + "value": "b" + }, + "id": 46, + "name": "Identifier", + "src": "584:1:0" + } + ], + "id": 47, + "name": "BinaryOperation", + "src": "580:5:0" + } + ], + "id": 48, + "name": "VariableDeclarationStatement", + "src": "568:17:0" + }, + { + "attributes": { + "functionReturnParameters": 42 + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 44, + "type": "uint256", + "value": "c" + }, + "id": 49, + "name": "Identifier", + "src": "688:1:0" + } + ], + "id": 50, + "name": "Return", + "src": "681:8:0" + } + ], + "id": 51, + "name": "Block", + "src": "480:216:0" + } + ], + "id": 52, + "name": "FunctionDefinition", + "src": "413:283:0" + }, + { + "attributes": { + "constant": true, + "implemented": true, + "isConstructor": false, + "modifiers": [ + null + ], + "name": "sub", + "payable": false, + "scope": 97, + "stateMutability": "pure", + "superFunction": null, + "visibility": "internal" + }, + "children": [ + { + "children": [ + { + "attributes": { + "constant": false, + "name": "a", + "scope": 72, + "stateVariable": false, + "storageLocation": "default", + "type": "uint256", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "uint256", + "type": "uint256" + }, + "id": 53, + "name": "ElementaryTypeName", + "src": "715:7:0" + } + ], + "id": 54, + "name": "VariableDeclaration", + "src": "715:9:0" + }, + { + "attributes": { + "constant": false, + "name": "b", + "scope": 72, + "stateVariable": false, + "storageLocation": "default", + "type": "uint256", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "uint256", + "type": "uint256" + }, + "id": 55, + "name": "ElementaryTypeName", + "src": "726:7:0" + } + ], + "id": 56, + "name": "VariableDeclaration", + "src": "726:9:0" + } + ], + "id": 57, + "name": "ParameterList", + "src": "714:22:0" + }, + { + "children": [ + { + "attributes": { + "constant": false, + "name": "", + "scope": 72, + "stateVariable": false, + "storageLocation": "default", + "type": "uint256", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "uint256", + "type": "uint256" + }, + "id": 58, + "name": "ElementaryTypeName", + "src": "760:7:0" + } + ], + "id": 59, + "name": "VariableDeclaration", + "src": "760:7:0" + } + ], + "id": 60, + "name": "ParameterList", + "src": "759:9:0" + }, + { + "children": [ + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "isStructConstructorCall": false, + "lValueRequested": false, + "names": [ + null + ], + "type": "tuple()", + "type_conversion": false + }, + "children": [ + { + "attributes": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + ], + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1145, + "type": "function (bool) pure", + "value": "assert" + }, + "id": 61, + "name": "Identifier", + "src": "779:6:0" + }, + { + "attributes": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": "<=", + "type": "bool" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 56, + "type": "uint256", + "value": "b" + }, + "id": 62, + "name": "Identifier", + "src": "786:1:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 54, + "type": "uint256", + "value": "a" + }, + "id": 63, + "name": "Identifier", + "src": "791:1:0" + } + ], + "id": 64, + "name": "BinaryOperation", + "src": "786:6:0" + } + ], + "id": 65, + "name": "FunctionCall", + "src": "779:14:0" + } + ], + "id": 66, + "name": "ExpressionStatement", + "src": "779:14:0" + }, + { + "attributes": { + "functionReturnParameters": 60 + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": "-", + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 54, + "type": "uint256", + "value": "a" + }, + "id": 67, + "name": "Identifier", + "src": "810:1:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 56, + "type": "uint256", + "value": "b" + }, + "id": 68, + "name": "Identifier", + "src": "814:1:0" + } + ], + "id": 69, + "name": "BinaryOperation", + "src": "810:5:0" + } + ], + "id": 70, + "name": "Return", + "src": "803:12:0" + } + ], + "id": 71, + "name": "Block", + "src": "769:53:0" + } + ], + "id": 72, + "name": "FunctionDefinition", + "src": "702:120:0" + }, + { + "attributes": { + "constant": true, + "implemented": true, + "isConstructor": false, + "modifiers": [ + null + ], + "name": "add", + "payable": false, + "scope": 97, + "stateMutability": "pure", + "superFunction": null, + "visibility": "internal" + }, + "children": [ + { + "children": [ + { + "attributes": { + "constant": false, + "name": "a", + "scope": 96, + "stateVariable": false, + "storageLocation": "default", + "type": "uint256", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "uint256", + "type": "uint256" + }, + "id": 73, + "name": "ElementaryTypeName", + "src": "841:7:0" + } + ], + "id": 74, + "name": "VariableDeclaration", + "src": "841:9:0" + }, + { + "attributes": { + "constant": false, + "name": "b", + "scope": 96, + "stateVariable": false, + "storageLocation": "default", + "type": "uint256", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "uint256", + "type": "uint256" + }, + "id": 75, + "name": "ElementaryTypeName", + "src": "852:7:0" + } + ], + "id": 76, + "name": "VariableDeclaration", + "src": "852:9:0" + } + ], + "id": 77, + "name": "ParameterList", + "src": "840:22:0" + }, + { + "children": [ + { + "attributes": { + "constant": false, + "name": "", + "scope": 96, + "stateVariable": false, + "storageLocation": "default", + "type": "uint256", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "uint256", + "type": "uint256" + }, + "id": 78, + "name": "ElementaryTypeName", + "src": "886:7:0" + } + ], + "id": 79, + "name": "VariableDeclaration", + "src": "886:7:0" + } + ], + "id": 80, + "name": "ParameterList", + "src": "885:9:0" + }, + { + "children": [ + { + "attributes": { + "assignments": [ + 82 + ] + }, + "children": [ + { + "attributes": { + "constant": false, + "name": "c", + "scope": 96, + "stateVariable": false, + "storageLocation": "default", + "type": "uint256", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "uint256", + "type": "uint256" + }, + "id": 81, + "name": "ElementaryTypeName", + "src": "905:7:0" + } + ], + "id": 82, + "name": "VariableDeclaration", + "src": "905:9:0" + }, + { + "attributes": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": "+", + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 74, + "type": "uint256", + "value": "a" + }, + "id": 83, + "name": "Identifier", + "src": "917:1:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 76, + "type": "uint256", + "value": "b" + }, + "id": 84, + "name": "Identifier", + "src": "921:1:0" + } + ], + "id": 85, + "name": "BinaryOperation", + "src": "917:5:0" + } + ], + "id": 86, + "name": "VariableDeclarationStatement", + "src": "905:17:0" + }, + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "isStructConstructorCall": false, + "lValueRequested": false, + "names": [ + null + ], + "type": "tuple()", + "type_conversion": false + }, + "children": [ + { + "attributes": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + ], + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1145, + "type": "function (bool) pure", + "value": "assert" + }, + "id": 87, + "name": "Identifier", + "src": "932:6:0" + }, + { + "attributes": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": ">=", + "type": "bool" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 82, + "type": "uint256", + "value": "c" + }, + "id": 88, + "name": "Identifier", + "src": "939:1:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 74, + "type": "uint256", + "value": "a" + }, + "id": 89, + "name": "Identifier", + "src": "944:1:0" + } + ], + "id": 90, + "name": "BinaryOperation", + "src": "939:6:0" + } + ], + "id": 91, + "name": "FunctionCall", + "src": "932:14:0" + } + ], + "id": 92, + "name": "ExpressionStatement", + "src": "932:14:0" + }, + { + "attributes": { + "functionReturnParameters": 80 + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 82, + "type": "uint256", + "value": "c" + }, + "id": 93, + "name": "Identifier", + "src": "963:1:0" + } + ], + "id": 94, + "name": "Return", + "src": "956:8:0" + } + ], + "id": 95, + "name": "Block", + "src": "895:76:0" + } + ], + "id": 96, + "name": "FunctionDefinition", + "src": "828:143:0" + } + ], + "id": 97, + "name": "ContractDefinition", + "src": "183:790:0" + }, + { + "attributes": { + "baseContracts": [ + null + ], + "contractDependencies": [ + null + ], + "contractKind": "contract", + "documentation": "@title Ownable\n@dev The Ownable contract has an owner address, and provides basic authorization control\nfunctions, this simplifies the implementation of \"user permissions\".", + "fullyImplemented": true, + "linearizedBaseContracts": [ + 139 + ], + "name": "Ownable", + "scope": 1143 + }, + "children": [ + { + "attributes": { + "constant": false, + "name": "owner", + "scope": 139, + "stateVariable": true, + "storageLocation": "default", + "type": "address", + "value": null, + "visibility": "public" + }, + "children": [ + { + "attributes": { + "name": "address", + "type": "address" + }, + "id": 98, + "name": "ElementaryTypeName", + "src": "1188:7:0" + } + ], + "id": 99, + "name": "VariableDeclaration", + "src": "1188:20:0" + }, + { + "attributes": { + "constant": false, + "implemented": true, + "isConstructor": true, + "modifiers": [ + null + ], + "name": "Ownable", + "payable": false, + "scope": 139, + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "public" + }, + "children": [ + { + "attributes": { + "parameters": [ + null + ] + }, + "children": [], + "id": 100, + "name": "ParameterList", + "src": "1358:2:0" + }, + { + "attributes": { + "parameters": [ + null + ] + }, + "children": [], + "id": 101, + "name": "ParameterList", + "src": "1368:0:0" + }, + { + "children": [ + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": "=", + "type": "address" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 99, + "type": "address", + "value": "owner" + }, + "id": 102, + "name": "Identifier", + "src": "1378:5:0" + }, + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "member_name": "sender", + "referencedDeclaration": null, + "type": "address" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1154, + "type": "msg", + "value": "msg" + }, + "id": 103, + "name": "Identifier", + "src": "1386:3:0" + } + ], + "id": 104, + "name": "MemberAccess", + "src": "1386:10:0" + } + ], + "id": 105, + "name": "Assignment", + "src": "1378:18:0" + } + ], + "id": 106, + "name": "ExpressionStatement", + "src": "1378:18:0" + } + ], + "id": 107, + "name": "Block", + "src": "1368:35:0" + } + ], + "id": 108, + "name": "FunctionDefinition", + "src": "1342:61:0" + }, + { + "attributes": { + "name": "onlyOwner", + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "parameters": [ + null + ] + }, + "children": [], + "id": 109, + "name": "ParameterList", + "src": "1511:2:0" + }, + { + "children": [ + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "isStructConstructorCall": false, + "lValueRequested": false, + "names": [ + null + ], + "type": "tuple()", + "type_conversion": false + }, + "children": [ + { + "attributes": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + ], + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1157, + "type": "function (bool) pure", + "value": "require" + }, + "id": 110, + "name": "Identifier", + "src": "1524:7:0" + }, + { + "attributes": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": "==", + "type": "bool" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "member_name": "sender", + "referencedDeclaration": null, + "type": "address" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1154, + "type": "msg", + "value": "msg" + }, + "id": 111, + "name": "Identifier", + "src": "1532:3:0" + } + ], + "id": 112, + "name": "MemberAccess", + "src": "1532:10:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 99, + "type": "address", + "value": "owner" + }, + "id": 113, + "name": "Identifier", + "src": "1546:5:0" + } + ], + "id": 114, + "name": "BinaryOperation", + "src": "1532:19:0" + } + ], + "id": 115, + "name": "FunctionCall", + "src": "1524:28:0" + } + ], + "id": 116, + "name": "ExpressionStatement", + "src": "1524:28:0" + }, + { + "id": 117, + "name": "PlaceholderStatement", + "src": "1562:1:0" + } + ], + "id": 118, + "name": "Block", + "src": "1514:56:0" + } + ], + "id": 119, + "name": "ModifierDefinition", + "src": "1493:77:0" + }, + { + "attributes": { + "constant": false, + "implemented": true, + "isConstructor": false, + "name": "transferOwnership", + "payable": false, + "scope": 139, + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "public" + }, + "children": [ + { + "children": [ + { + "attributes": { + "constant": false, + "name": "newOwner", + "scope": 138, + "stateVariable": false, + "storageLocation": "default", + "type": "address", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "address", + "type": "address" + }, + "id": 120, + "name": "ElementaryTypeName", + "src": "1765:7:0" + } + ], + "id": 121, + "name": "VariableDeclaration", + "src": "1765:16:0" + } + ], + "id": 122, + "name": "ParameterList", + "src": "1764:18:0" + }, + { + "attributes": { + "parameters": [ + null + ] + }, + "children": [], + "id": 125, + "name": "ParameterList", + "src": "1800:0:0" + }, + { + "attributes": { + "arguments": [ + null + ] + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 119, + "type": "modifier ()", + "value": "onlyOwner" + }, + "id": 123, + "name": "Identifier", + "src": "1790:9:0" + } + ], + "id": 124, + "name": "ModifierInvocation", + "src": "1790:9:0" + }, + { + "children": [ + { + "attributes": { + "falseBody": null + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": "!=", + "type": "bool" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 121, + "type": "address", + "value": "newOwner" + }, + "id": 126, + "name": "Identifier", + "src": "1814:8:0" + }, + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": true, + "isStructConstructorCall": false, + "lValueRequested": false, + "names": [ + null + ], + "type": "address", + "type_conversion": true + }, + "children": [ + { + "attributes": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + } + ], + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "type": "type(address)", + "value": "address" + }, + "id": 127, + "name": "ElementaryTypeNameExpression", + "src": "1826:7:0" + }, + { + "attributes": { + "argumentTypes": null, + "hexvalue": "30", + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "subdenomination": null, + "token": "number", + "type": "int_const 0", + "value": "0" + }, + "id": 128, + "name": "Literal", + "src": "1834:1:0" + } + ], + "id": 129, + "name": "FunctionCall", + "src": "1826:10:0" + } + ], + "id": 130, + "name": "BinaryOperation", + "src": "1814:22:0" + }, + { + "children": [ + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": "=", + "type": "address" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 99, + "type": "address", + "value": "owner" + }, + "id": 131, + "name": "Identifier", + "src": "1852:5:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 121, + "type": "address", + "value": "newOwner" + }, + "id": 132, + "name": "Identifier", + "src": "1860:8:0" + } + ], + "id": 133, + "name": "Assignment", + "src": "1852:16:0" + } + ], + "id": 134, + "name": "ExpressionStatement", + "src": "1852:16:0" + } + ], + "id": 135, + "name": "Block", + "src": "1838:41:0" + } + ], + "id": 136, + "name": "IfStatement", + "src": "1810:69:0" + } + ], + "id": 137, + "name": "Block", + "src": "1800:85:0" + } + ], + "id": 138, + "name": "FunctionDefinition", + "src": "1738:147:0" + } + ], + "id": 139, + "name": "ContractDefinition", + "src": "1165:723:0" + }, + { + "attributes": { + "baseContracts": [ + null + ], + "contractDependencies": [ + null + ], + "contractKind": "contract", + "documentation": "@title ERC20Basic\n@dev Simpler version of ERC20 interface\n@dev see https://github.com/ethereum/EIPs/issues/20", + "fullyImplemented": false, + "linearizedBaseContracts": [ + 169 + ], + "name": "ERC20Basic", + "scope": 1143 + }, + "children": [ + { + "attributes": { + "constant": false, + "name": "_totalSupply", + "scope": 169, + "stateVariable": true, + "storageLocation": "default", + "type": "uint256", + "value": null, + "visibility": "public" + }, + "children": [ + { + "attributes": { + "name": "uint", + "type": "uint256" + }, + "id": 140, + "name": "ElementaryTypeName", + "src": "2043:4:0" + } + ], + "id": 141, + "name": "VariableDeclaration", + "src": "2043:24:0" + }, + { + "attributes": { + "body": null, + "constant": true, + "implemented": false, + "isConstructor": false, + "modifiers": [ + null + ], + "name": "totalSupply", + "payable": false, + "scope": 169, + "stateMutability": "view", + "superFunction": null, + "visibility": "public" + }, + "children": [ + { + "attributes": { + "parameters": [ + null + ] + }, + "children": [], + "id": 142, + "name": "ParameterList", + "src": "2093:2:0" + }, + { + "children": [ + { + "attributes": { + "constant": false, + "name": "", + "scope": 146, + "stateVariable": false, + "storageLocation": "default", + "type": "uint256", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "uint", + "type": "uint256" + }, + "id": 143, + "name": "ElementaryTypeName", + "src": "2121:4:0" + } + ], + "id": 144, + "name": "VariableDeclaration", + "src": "2121:4:0" + } + ], + "id": 145, + "name": "ParameterList", + "src": "2120:6:0" + } + ], + "id": 146, + "name": "FunctionDefinition", + "src": "2073:54:0" + }, + { + "attributes": { + "body": null, + "constant": true, + "implemented": false, + "isConstructor": false, + "modifiers": [ + null + ], + "name": "balanceOf", + "payable": false, + "scope": 169, + "stateMutability": "view", + "superFunction": null, + "visibility": "public" + }, + "children": [ + { + "children": [ + { + "attributes": { + "constant": false, + "name": "who", + "scope": 153, + "stateVariable": false, + "storageLocation": "default", + "type": "address", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "address", + "type": "address" + }, + "id": 147, + "name": "ElementaryTypeName", + "src": "2151:7:0" + } + ], + "id": 148, + "name": "VariableDeclaration", + "src": "2151:11:0" + } + ], + "id": 149, + "name": "ParameterList", + "src": "2150:13:0" + }, + { + "children": [ + { + "attributes": { + "constant": false, + "name": "", + "scope": 153, + "stateVariable": false, + "storageLocation": "default", + "type": "uint256", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "uint", + "type": "uint256" + }, + "id": 150, + "name": "ElementaryTypeName", + "src": "2189:4:0" + } + ], + "id": 151, + "name": "VariableDeclaration", + "src": "2189:4:0" + } + ], + "id": 152, + "name": "ParameterList", + "src": "2188:6:0" + } + ], + "id": 153, + "name": "FunctionDefinition", + "src": "2132:63:0" + }, + { + "attributes": { + "body": null, + "constant": false, + "implemented": false, + "isConstructor": false, + "modifiers": [ + null + ], + "name": "transfer", + "payable": false, + "scope": 169, + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "public" + }, + "children": [ + { + "children": [ + { + "attributes": { + "constant": false, + "name": "to", + "scope": 160, + "stateVariable": false, + "storageLocation": "default", + "type": "address", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "address", + "type": "address" + }, + "id": 154, + "name": "ElementaryTypeName", + "src": "2218:7:0" + } + ], + "id": 155, + "name": "VariableDeclaration", + "src": "2218:10:0" + }, + { + "attributes": { + "constant": false, + "name": "value", + "scope": 160, + "stateVariable": false, + "storageLocation": "default", + "type": "uint256", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "uint", + "type": "uint256" + }, + "id": 156, + "name": "ElementaryTypeName", + "src": "2230:4:0" + } + ], + "id": 157, + "name": "VariableDeclaration", + "src": "2230:10:0" + } + ], + "id": 158, + "name": "ParameterList", + "src": "2217:24:0" + }, + { + "attributes": { + "parameters": [ + null + ] + }, + "children": [], + "id": 159, + "name": "ParameterList", + "src": "2248:0:0" + } + ], + "id": 160, + "name": "FunctionDefinition", + "src": "2200:49:0" + }, + { + "attributes": { + "anonymous": false, + "name": "Transfer" + }, + "children": [ + { + "children": [ + { + "attributes": { + "constant": false, + "indexed": true, + "name": "from", + "scope": 168, + "stateVariable": false, + "storageLocation": "default", + "type": "address", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "address", + "type": "address" + }, + "id": 161, + "name": "ElementaryTypeName", + "src": "2269:7:0" + } + ], + "id": 162, + "name": "VariableDeclaration", + "src": "2269:20:0" + }, + { + "attributes": { + "constant": false, + "indexed": true, + "name": "to", + "scope": 168, + "stateVariable": false, + "storageLocation": "default", + "type": "address", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "address", + "type": "address" + }, + "id": 163, + "name": "ElementaryTypeName", + "src": "2291:7:0" + } + ], + "id": 164, + "name": "VariableDeclaration", + "src": "2291:18:0" + }, + { + "attributes": { + "constant": false, + "indexed": false, + "name": "value", + "scope": 168, + "stateVariable": false, + "storageLocation": "default", + "type": "uint256", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "uint", + "type": "uint256" + }, + "id": 165, + "name": "ElementaryTypeName", + "src": "2311:4:0" + } + ], + "id": 166, + "name": "VariableDeclaration", + "src": "2311:10:0" + } + ], + "id": 167, + "name": "ParameterList", + "src": "2268:54:0" + } + ], + "id": 168, + "name": "EventDefinition", + "src": "2254:69:0" + } + ], + "id": 169, + "name": "ContractDefinition", + "src": "2017:308:0" + }, + { + "attributes": { + "contractDependencies": [ + 169 + ], + "contractKind": "contract", + "documentation": "@title ERC20 interface\n@dev see https://github.com/ethereum/EIPs/issues/20", + "fullyImplemented": false, + "linearizedBaseContracts": [ + 205, + 169 + ], + "name": "ERC20", + "scope": 1143 + }, + "children": [ + { + "attributes": { + "arguments": [ + null + ] + }, + "children": [ + { + "attributes": { + "contractScope": null, + "name": "ERC20Basic", + "referencedDeclaration": 169, + "type": "contract ERC20Basic" + }, + "id": 170, + "name": "UserDefinedTypeName", + "src": "2434:10:0" + } + ], + "id": 171, + "name": "InheritanceSpecifier", + "src": "2434:10:0" + }, + { + "attributes": { + "body": null, + "constant": true, + "implemented": false, + "isConstructor": false, + "modifiers": [ + null + ], + "name": "allowance", + "payable": false, + "scope": 205, + "stateMutability": "view", + "superFunction": null, + "visibility": "public" + }, + "children": [ + { + "children": [ + { + "attributes": { + "constant": false, + "name": "owner", + "scope": 180, + "stateVariable": false, + "storageLocation": "default", + "type": "address", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "address", + "type": "address" + }, + "id": 172, + "name": "ElementaryTypeName", + "src": "2470:7:0" + } + ], + "id": 173, + "name": "VariableDeclaration", + "src": "2470:13:0" + }, + { + "attributes": { + "constant": false, + "name": "spender", + "scope": 180, + "stateVariable": false, + "storageLocation": "default", + "type": "address", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "address", + "type": "address" + }, + "id": 174, + "name": "ElementaryTypeName", + "src": "2485:7:0" + } + ], + "id": 175, + "name": "VariableDeclaration", + "src": "2485:15:0" + } + ], + "id": 176, + "name": "ParameterList", + "src": "2469:32:0" + }, + { + "children": [ + { + "attributes": { + "constant": false, + "name": "", + "scope": 180, + "stateVariable": false, + "storageLocation": "default", + "type": "uint256", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "uint", + "type": "uint256" + }, + "id": 177, + "name": "ElementaryTypeName", + "src": "2527:4:0" + } + ], + "id": 178, + "name": "VariableDeclaration", + "src": "2527:4:0" + } + ], + "id": 179, + "name": "ParameterList", + "src": "2526:6:0" + } + ], + "id": 180, + "name": "FunctionDefinition", + "src": "2451:82:0" + }, + { + "attributes": { + "body": null, + "constant": false, + "implemented": false, + "isConstructor": false, + "modifiers": [ + null + ], + "name": "transferFrom", + "payable": false, + "scope": 205, + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "public" + }, + "children": [ + { + "children": [ + { + "attributes": { + "constant": false, + "name": "from", + "scope": 189, + "stateVariable": false, + "storageLocation": "default", + "type": "address", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "address", + "type": "address" + }, + "id": 181, + "name": "ElementaryTypeName", + "src": "2560:7:0" + } + ], + "id": 182, + "name": "VariableDeclaration", + "src": "2560:12:0" + }, + { + "attributes": { + "constant": false, + "name": "to", + "scope": 189, + "stateVariable": false, + "storageLocation": "default", + "type": "address", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "address", + "type": "address" + }, + "id": 183, + "name": "ElementaryTypeName", + "src": "2574:7:0" + } + ], + "id": 184, + "name": "VariableDeclaration", + "src": "2574:10:0" + }, + { + "attributes": { + "constant": false, + "name": "value", + "scope": 189, + "stateVariable": false, + "storageLocation": "default", + "type": "uint256", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "uint", + "type": "uint256" + }, + "id": 185, + "name": "ElementaryTypeName", + "src": "2586:4:0" + } + ], + "id": 186, + "name": "VariableDeclaration", + "src": "2586:10:0" + } + ], + "id": 187, + "name": "ParameterList", + "src": "2559:38:0" + }, + { + "attributes": { + "parameters": [ + null + ] + }, + "children": [], + "id": 188, + "name": "ParameterList", + "src": "2604:0:0" + } + ], + "id": 189, + "name": "FunctionDefinition", + "src": "2538:67:0" + }, + { + "attributes": { + "body": null, + "constant": false, + "implemented": false, + "isConstructor": false, + "modifiers": [ + null + ], + "name": "approve", + "payable": false, + "scope": 205, + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "public" + }, + "children": [ + { + "children": [ + { + "attributes": { + "constant": false, + "name": "spender", + "scope": 196, + "stateVariable": false, + "storageLocation": "default", + "type": "address", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "address", + "type": "address" + }, + "id": 190, + "name": "ElementaryTypeName", + "src": "2627:7:0" + } + ], + "id": 191, + "name": "VariableDeclaration", + "src": "2627:15:0" + }, + { + "attributes": { + "constant": false, + "name": "value", + "scope": 196, + "stateVariable": false, + "storageLocation": "default", + "type": "uint256", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "uint", + "type": "uint256" + }, + "id": 192, + "name": "ElementaryTypeName", + "src": "2644:4:0" + } + ], + "id": 193, + "name": "VariableDeclaration", + "src": "2644:10:0" + } + ], + "id": 194, + "name": "ParameterList", + "src": "2626:29:0" + }, + { + "attributes": { + "parameters": [ + null + ] + }, + "children": [], + "id": 195, + "name": "ParameterList", + "src": "2662:0:0" + } + ], + "id": 196, + "name": "FunctionDefinition", + "src": "2610:53:0" + }, + { + "attributes": { + "anonymous": false, + "name": "Approval" + }, + "children": [ + { + "children": [ + { + "attributes": { + "constant": false, + "indexed": true, + "name": "owner", + "scope": 204, + "stateVariable": false, + "storageLocation": "default", + "type": "address", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "address", + "type": "address" + }, + "id": 197, + "name": "ElementaryTypeName", + "src": "2683:7:0" + } + ], + "id": 198, + "name": "VariableDeclaration", + "src": "2683:21:0" + }, + { + "attributes": { + "constant": false, + "indexed": true, + "name": "spender", + "scope": 204, + "stateVariable": false, + "storageLocation": "default", + "type": "address", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "address", + "type": "address" + }, + "id": 199, + "name": "ElementaryTypeName", + "src": "2706:7:0" + } + ], + "id": 200, + "name": "VariableDeclaration", + "src": "2706:23:0" + }, + { + "attributes": { + "constant": false, + "indexed": false, + "name": "value", + "scope": 204, + "stateVariable": false, + "storageLocation": "default", + "type": "uint256", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "uint", + "type": "uint256" + }, + "id": 201, + "name": "ElementaryTypeName", + "src": "2731:4:0" + } + ], + "id": 202, + "name": "VariableDeclaration", + "src": "2731:10:0" + } + ], + "id": 203, + "name": "ParameterList", + "src": "2682:60:0" + } + ], + "id": 204, + "name": "EventDefinition", + "src": "2668:75:0" + } + ], + "id": 205, + "name": "ContractDefinition", + "src": "2416:329:0" + }, + { + "attributes": { + "contractDependencies": [ + 139, + 169 + ], + "contractKind": "contract", + "documentation": "@title Basic token\n@dev Basic version of StandardToken, with no allowances.", + "fullyImplemented": false, + "linearizedBaseContracts": [ + 347, + 169, + 139 + ], + "name": "BasicToken", + "scope": 1143 + }, + "children": [ + { + "attributes": { + "arguments": [ + null + ] + }, + "children": [ + { + "attributes": { + "contractScope": null, + "name": "Ownable", + "referencedDeclaration": 139, + "type": "contract Ownable" + }, + "id": 206, + "name": "UserDefinedTypeName", + "src": "2860:7:0" + } + ], + "id": 207, + "name": "InheritanceSpecifier", + "src": "2860:7:0" + }, + { + "attributes": { + "arguments": [ + null + ] + }, + "children": [ + { + "attributes": { + "contractScope": null, + "name": "ERC20Basic", + "referencedDeclaration": 169, + "type": "contract ERC20Basic" + }, + "id": 208, + "name": "UserDefinedTypeName", + "src": "2869:10:0" + } + ], + "id": 209, + "name": "InheritanceSpecifier", + "src": "2869:10:0" + }, + { + "children": [ + { + "attributes": { + "contractScope": null, + "name": "SafeMath", + "referencedDeclaration": 97, + "type": "library SafeMath" + }, + "id": 210, + "name": "UserDefinedTypeName", + "src": "2892:8:0" + }, + { + "attributes": { + "name": "uint", + "type": "uint256" + }, + "id": 211, + "name": "ElementaryTypeName", + "src": "2905:4:0" + } + ], + "id": 212, + "name": "UsingForDirective", + "src": "2886:24:0" + }, + { + "attributes": { + "constant": false, + "name": "balances", + "scope": 347, + "stateVariable": true, + "storageLocation": "default", + "type": "mapping(address => uint256)", + "value": null, + "visibility": "public" + }, + "children": [ + { + "attributes": { + "type": "mapping(address => uint256)" + }, + "children": [ + { + "attributes": { + "name": "address", + "type": "address" + }, + "id": 213, + "name": "ElementaryTypeName", + "src": "2924:7:0" + }, + { + "attributes": { + "name": "uint", + "type": "uint256" + }, + "id": 214, + "name": "ElementaryTypeName", + "src": "2935:4:0" + } + ], + "id": 215, + "name": "Mapping", + "src": "2916:24:0" + } + ], + "id": 216, + "name": "VariableDeclaration", + "src": "2916:40:0" + }, + { + "attributes": { + "constant": false, + "name": "basisPointsRate", + "scope": 347, + "stateVariable": true, + "storageLocation": "default", + "type": "uint256", + "visibility": "public" + }, + "children": [ + { + "attributes": { + "name": "uint", + "type": "uint256" + }, + "id": 217, + "name": "ElementaryTypeName", + "src": "3041:4:0" + }, + { + "attributes": { + "argumentTypes": null, + "hexvalue": "30", + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "subdenomination": null, + "token": "number", + "type": "int_const 0", + "value": "0" + }, + "id": 218, + "name": "Literal", + "src": "3071:1:0" + } + ], + "id": 219, + "name": "VariableDeclaration", + "src": "3041:31:0" + }, + { + "attributes": { + "constant": false, + "name": "maximumFee", + "scope": 347, + "stateVariable": true, + "storageLocation": "default", + "type": "uint256", + "visibility": "public" + }, + "children": [ + { + "attributes": { + "name": "uint", + "type": "uint256" + }, + "id": 220, + "name": "ElementaryTypeName", + "src": "3078:4:0" + }, + { + "attributes": { + "argumentTypes": null, + "hexvalue": "30", + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "subdenomination": null, + "token": "number", + "type": "int_const 0", + "value": "0" + }, + "id": 221, + "name": "Literal", + "src": "3103:1:0" + } + ], + "id": 222, + "name": "VariableDeclaration", + "src": "3078:26:0" + }, + { + "attributes": { + "name": "onlyPayloadSize", + "visibility": "internal" + }, + "children": [ + { + "children": [ + { + "attributes": { + "constant": false, + "name": "size", + "scope": 240, + "stateVariable": false, + "storageLocation": "default", + "type": "uint256", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "uint", + "type": "uint256" + }, + "id": 223, + "name": "ElementaryTypeName", + "src": "3202:4:0" + } + ], + "id": 224, + "name": "VariableDeclaration", + "src": "3202:9:0" + } + ], + "id": 225, + "name": "ParameterList", + "src": "3201:11:0" + }, + { + "children": [ + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "isStructConstructorCall": false, + "lValueRequested": false, + "names": [ + null + ], + "type": "tuple()", + "type_conversion": false + }, + "children": [ + { + "attributes": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + ], + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1157, + "type": "function (bool) pure", + "value": "require" + }, + "id": 226, + "name": "Identifier", + "src": "3223:7:0" + }, + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": "!", + "prefix": true, + "type": "bool" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "type": "bool" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": "<", + "type": "bool" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "member_name": "length", + "referencedDeclaration": null, + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "member_name": "data", + "referencedDeclaration": null, + "type": "bytes calldata" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1154, + "type": "msg", + "value": "msg" + }, + "id": 227, + "name": "Identifier", + "src": "3233:3:0" + } + ], + "id": 228, + "name": "MemberAccess", + "src": "3233:8:0" + } + ], + "id": 229, + "name": "MemberAccess", + "src": "3233:15:0" + }, + { + "attributes": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": "+", + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 224, + "type": "uint256", + "value": "size" + }, + "id": 230, + "name": "Identifier", + "src": "3251:4:0" + }, + { + "attributes": { + "argumentTypes": null, + "hexvalue": "34", + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "subdenomination": null, + "token": "number", + "type": "int_const 4", + "value": "4" + }, + "id": 231, + "name": "Literal", + "src": "3258:1:0" + } + ], + "id": 232, + "name": "BinaryOperation", + "src": "3251:8:0" + } + ], + "id": 233, + "name": "BinaryOperation", + "src": "3233:26:0" + } + ], + "id": 234, + "name": "TupleExpression", + "src": "3232:28:0" + } + ], + "id": 235, + "name": "UnaryOperation", + "src": "3231:29:0" + } + ], + "id": 236, + "name": "FunctionCall", + "src": "3223:38:0" + } + ], + "id": 237, + "name": "ExpressionStatement", + "src": "3223:38:0" + }, + { + "id": 238, + "name": "PlaceholderStatement", + "src": "3271:1:0" + } + ], + "id": 239, + "name": "Block", + "src": "3213:66:0" + } + ], + "id": 240, + "name": "ModifierDefinition", + "src": "3177:102:0" + }, + { + "attributes": { + "constant": false, + "implemented": true, + "isConstructor": false, + "name": "transfer", + "payable": false, + "scope": 347, + "stateMutability": "nonpayable", + "superFunction": 160, + "visibility": "public" + }, + "children": [ + { + "children": [ + { + "attributes": { + "constant": false, + "name": "_to", + "scope": 334, + "stateVariable": false, + "storageLocation": "default", + "type": "address", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "address", + "type": "address" + }, + "id": 241, + "name": "ElementaryTypeName", + "src": "3463:7:0" + } + ], + "id": 242, + "name": "VariableDeclaration", + "src": "3463:11:0" + }, + { + "attributes": { + "constant": false, + "name": "_value", + "scope": 334, + "stateVariable": false, + "storageLocation": "default", + "type": "uint256", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "uint", + "type": "uint256" + }, + "id": 243, + "name": "ElementaryTypeName", + "src": "3476:4:0" + } + ], + "id": 244, + "name": "VariableDeclaration", + "src": "3476:11:0" + } + ], + "id": 245, + "name": "ParameterList", + "src": "3462:26:0" + }, + { + "attributes": { + "parameters": [ + null + ] + }, + "children": [], + "id": 251, + "name": "ParameterList", + "src": "3520:0:0" + }, + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 240, + "type": "modifier (uint256)", + "value": "onlyPayloadSize" + }, + "id": 246, + "name": "Identifier", + "src": "3496:15:0" + }, + { + "attributes": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_rational_64_by_1", + "typeString": "int_const 64" + }, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "operator": "*", + "type": "int_const 64" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "hexvalue": "32", + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "subdenomination": null, + "token": "number", + "type": "int_const 2", + "value": "2" + }, + "id": 247, + "name": "Literal", + "src": "3512:1:0" + }, + { + "attributes": { + "argumentTypes": null, + "hexvalue": "3332", + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "subdenomination": null, + "token": "number", + "type": "int_const 32", + "value": "32" + }, + "id": 248, + "name": "Literal", + "src": "3516:2:0" + } + ], + "id": 249, + "name": "BinaryOperation", + "src": "3512:6:0" + } + ], + "id": 250, + "name": "ModifierInvocation", + "src": "3496:23:0" + }, + { + "children": [ + { + "attributes": { + "assignments": [ + 253 + ] + }, + "children": [ + { + "attributes": { + "constant": false, + "name": "fee", + "scope": 334, + "stateVariable": false, + "storageLocation": "default", + "type": "uint256", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "uint", + "type": "uint256" + }, + "id": 252, + "name": "ElementaryTypeName", + "src": "3530:4:0" + } + ], + "id": 253, + "name": "VariableDeclaration", + "src": "3530:8:0" + }, + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "isStructConstructorCall": false, + "lValueRequested": false, + "names": [ + null + ], + "type": "uint256", + "type_conversion": false + }, + "children": [ + { + "attributes": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_10000_by_1", + "typeString": "int_const 10000" + } + ], + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "member_name": "div", + "referencedDeclaration": 52, + "type": "function (uint256,uint256) pure returns (uint256)" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "isStructConstructorCall": false, + "lValueRequested": false, + "names": [ + null + ], + "type": "uint256", + "type_conversion": false + }, + "children": [ + { + "attributes": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "member_name": "mul", + "referencedDeclaration": 34, + "type": "function (uint256,uint256) pure returns (uint256)" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 244, + "type": "uint256", + "value": "_value" + }, + "id": 254, + "name": "Identifier", + "src": "3542:6:0" + } + ], + "id": 255, + "name": "MemberAccess", + "src": "3542:10:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 219, + "type": "uint256", + "value": "basisPointsRate" + }, + "id": 256, + "name": "Identifier", + "src": "3553:15:0" + } + ], + "id": 257, + "name": "FunctionCall", + "src": "3542:27:0" + } + ], + "id": 258, + "name": "TupleExpression", + "src": "3541:29:0" + } + ], + "id": 259, + "name": "MemberAccess", + "src": "3541:33:0" + }, + { + "attributes": { + "argumentTypes": null, + "hexvalue": "3130303030", + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "subdenomination": null, + "token": "number", + "type": "int_const 10000", + "value": "10000" + }, + "id": 260, + "name": "Literal", + "src": "3575:5:0" + } + ], + "id": 261, + "name": "FunctionCall", + "src": "3541:40:0" + } + ], + "id": 262, + "name": "VariableDeclarationStatement", + "src": "3530:51:0" + }, + { + "attributes": { + "falseBody": null + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": ">", + "type": "bool" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 253, + "type": "uint256", + "value": "fee" + }, + "id": 263, + "name": "Identifier", + "src": "3595:3:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 222, + "type": "uint256", + "value": "maximumFee" + }, + "id": 264, + "name": "Identifier", + "src": "3601:10:0" + } + ], + "id": 265, + "name": "BinaryOperation", + "src": "3595:16:0" + }, + { + "children": [ + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": "=", + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 253, + "type": "uint256", + "value": "fee" + }, + "id": 266, + "name": "Identifier", + "src": "3627:3:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 222, + "type": "uint256", + "value": "maximumFee" + }, + "id": 267, + "name": "Identifier", + "src": "3633:10:0" + } + ], + "id": 268, + "name": "Assignment", + "src": "3627:16:0" + } + ], + "id": 269, + "name": "ExpressionStatement", + "src": "3627:16:0" + } + ], + "id": 270, + "name": "Block", + "src": "3613:41:0" + } + ], + "id": 271, + "name": "IfStatement", + "src": "3591:63:0" + }, + { + "attributes": { + "assignments": [ + 273 + ] + }, + "children": [ + { + "attributes": { + "constant": false, + "name": "sendAmount", + "scope": 334, + "stateVariable": false, + "storageLocation": "default", + "type": "uint256", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "uint", + "type": "uint256" + }, + "id": 272, + "name": "ElementaryTypeName", + "src": "3663:4:0" + } + ], + "id": 273, + "name": "VariableDeclaration", + "src": "3663:15:0" + }, + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "isStructConstructorCall": false, + "lValueRequested": false, + "names": [ + null + ], + "type": "uint256", + "type_conversion": false + }, + "children": [ + { + "attributes": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "member_name": "sub", + "referencedDeclaration": 72, + "type": "function (uint256,uint256) pure returns (uint256)" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 244, + "type": "uint256", + "value": "_value" + }, + "id": 274, + "name": "Identifier", + "src": "3681:6:0" + } + ], + "id": 275, + "name": "MemberAccess", + "src": "3681:10:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 253, + "type": "uint256", + "value": "fee" + }, + "id": 276, + "name": "Identifier", + "src": "3692:3:0" + } + ], + "id": 277, + "name": "FunctionCall", + "src": "3681:15:0" + } + ], + "id": 278, + "name": "VariableDeclarationStatement", + "src": "3663:33:0" + }, + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": "=", + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 216, + "type": "mapping(address => uint256)", + "value": "balances" + }, + "id": 279, + "name": "Identifier", + "src": "3706:8:0" + }, + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "member_name": "sender", + "referencedDeclaration": null, + "type": "address" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1154, + "type": "msg", + "value": "msg" + }, + "id": 280, + "name": "Identifier", + "src": "3715:3:0" + } + ], + "id": 281, + "name": "MemberAccess", + "src": "3715:10:0" + } + ], + "id": 282, + "name": "IndexAccess", + "src": "3706:20:0" + }, + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "isStructConstructorCall": false, + "lValueRequested": false, + "names": [ + null + ], + "type": "uint256", + "type_conversion": false + }, + "children": [ + { + "attributes": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "member_name": "sub", + "referencedDeclaration": 72, + "type": "function (uint256,uint256) pure returns (uint256)" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 216, + "type": "mapping(address => uint256)", + "value": "balances" + }, + "id": 283, + "name": "Identifier", + "src": "3729:8:0" + }, + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "member_name": "sender", + "referencedDeclaration": null, + "type": "address" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1154, + "type": "msg", + "value": "msg" + }, + "id": 284, + "name": "Identifier", + "src": "3738:3:0" + } + ], + "id": 285, + "name": "MemberAccess", + "src": "3738:10:0" + } + ], + "id": 286, + "name": "IndexAccess", + "src": "3729:20:0" + } + ], + "id": 287, + "name": "MemberAccess", + "src": "3729:24:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 244, + "type": "uint256", + "value": "_value" + }, + "id": 288, + "name": "Identifier", + "src": "3754:6:0" + } + ], + "id": 289, + "name": "FunctionCall", + "src": "3729:32:0" + } + ], + "id": 290, + "name": "Assignment", + "src": "3706:55:0" + } + ], + "id": 291, + "name": "ExpressionStatement", + "src": "3706:55:0" + }, + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": "=", + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 216, + "type": "mapping(address => uint256)", + "value": "balances" + }, + "id": 292, + "name": "Identifier", + "src": "3771:8:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 242, + "type": "address", + "value": "_to" + }, + "id": 293, + "name": "Identifier", + "src": "3780:3:0" + } + ], + "id": 294, + "name": "IndexAccess", + "src": "3771:13:0" + }, + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "isStructConstructorCall": false, + "lValueRequested": false, + "names": [ + null + ], + "type": "uint256", + "type_conversion": false + }, + "children": [ + { + "attributes": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "member_name": "add", + "referencedDeclaration": 96, + "type": "function (uint256,uint256) pure returns (uint256)" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 216, + "type": "mapping(address => uint256)", + "value": "balances" + }, + "id": 295, + "name": "Identifier", + "src": "3787:8:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 242, + "type": "address", + "value": "_to" + }, + "id": 296, + "name": "Identifier", + "src": "3796:3:0" + } + ], + "id": 297, + "name": "IndexAccess", + "src": "3787:13:0" + } + ], + "id": 298, + "name": "MemberAccess", + "src": "3787:17:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 273, + "type": "uint256", + "value": "sendAmount" + }, + "id": 299, + "name": "Identifier", + "src": "3805:10:0" + } + ], + "id": 300, + "name": "FunctionCall", + "src": "3787:29:0" + } + ], + "id": 301, + "name": "Assignment", + "src": "3771:45:0" + } + ], + "id": 302, + "name": "ExpressionStatement", + "src": "3771:45:0" + }, + { + "attributes": { + "falseBody": null + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": ">", + "type": "bool" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 253, + "type": "uint256", + "value": "fee" + }, + "id": 303, + "name": "Identifier", + "src": "3830:3:0" + }, + { + "attributes": { + "argumentTypes": null, + "hexvalue": "30", + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "subdenomination": null, + "token": "number", + "type": "int_const 0", + "value": "0" + }, + "id": 304, + "name": "Literal", + "src": "3836:1:0" + } + ], + "id": 305, + "name": "BinaryOperation", + "src": "3830:7:0" + }, + { + "children": [ + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": "=", + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 216, + "type": "mapping(address => uint256)", + "value": "balances" + }, + "id": 306, + "name": "Identifier", + "src": "3853:8:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 99, + "type": "address", + "value": "owner" + }, + "id": 307, + "name": "Identifier", + "src": "3862:5:0" + } + ], + "id": 308, + "name": "IndexAccess", + "src": "3853:15:0" + }, + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "isStructConstructorCall": false, + "lValueRequested": false, + "names": [ + null + ], + "type": "uint256", + "type_conversion": false + }, + "children": [ + { + "attributes": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "member_name": "add", + "referencedDeclaration": 96, + "type": "function (uint256,uint256) pure returns (uint256)" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 216, + "type": "mapping(address => uint256)", + "value": "balances" + }, + "id": 309, + "name": "Identifier", + "src": "3871:8:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 99, + "type": "address", + "value": "owner" + }, + "id": 310, + "name": "Identifier", + "src": "3880:5:0" + } + ], + "id": 311, + "name": "IndexAccess", + "src": "3871:15:0" + } + ], + "id": 312, + "name": "MemberAccess", + "src": "3871:19:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 253, + "type": "uint256", + "value": "fee" + }, + "id": 313, + "name": "Identifier", + "src": "3891:3:0" + } + ], + "id": 314, + "name": "FunctionCall", + "src": "3871:24:0" + } + ], + "id": 315, + "name": "Assignment", + "src": "3853:42:0" + } + ], + "id": 316, + "name": "ExpressionStatement", + "src": "3853:42:0" + }, + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "isStructConstructorCall": false, + "lValueRequested": false, + "names": [ + null + ], + "type": "tuple()", + "type_conversion": false + }, + "children": [ + { + "attributes": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 168, + "type": "function (address,address,uint256)", + "value": "Transfer" + }, + "id": 317, + "name": "Identifier", + "src": "3909:8:0" + }, + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "member_name": "sender", + "referencedDeclaration": null, + "type": "address" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1154, + "type": "msg", + "value": "msg" + }, + "id": 318, + "name": "Identifier", + "src": "3918:3:0" + } + ], + "id": 319, + "name": "MemberAccess", + "src": "3918:10:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 99, + "type": "address", + "value": "owner" + }, + "id": 320, + "name": "Identifier", + "src": "3930:5:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 253, + "type": "uint256", + "value": "fee" + }, + "id": 321, + "name": "Identifier", + "src": "3937:3:0" + } + ], + "id": 322, + "name": "FunctionCall", + "src": "3909:32:0" + } + ], + "id": 323, + "name": "ExpressionStatement", + "src": "3909:32:0" + } + ], + "id": 324, + "name": "Block", + "src": "3839:113:0" + } + ], + "id": 325, + "name": "IfStatement", + "src": "3826:126:0" + }, + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "isStructConstructorCall": false, + "lValueRequested": false, + "names": [ + null + ], + "type": "tuple()", + "type_conversion": false + }, + "children": [ + { + "attributes": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 168, + "type": "function (address,address,uint256)", + "value": "Transfer" + }, + "id": 326, + "name": "Identifier", + "src": "3961:8:0" + }, + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "member_name": "sender", + "referencedDeclaration": null, + "type": "address" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1154, + "type": "msg", + "value": "msg" + }, + "id": 327, + "name": "Identifier", + "src": "3970:3:0" + } + ], + "id": 328, + "name": "MemberAccess", + "src": "3970:10:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 242, + "type": "address", + "value": "_to" + }, + "id": 329, + "name": "Identifier", + "src": "3982:3:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 273, + "type": "uint256", + "value": "sendAmount" + }, + "id": 330, + "name": "Identifier", + "src": "3987:10:0" + } + ], + "id": 331, + "name": "FunctionCall", + "src": "3961:37:0" + } + ], + "id": 332, + "name": "ExpressionStatement", + "src": "3961:37:0" + } + ], + "id": 333, + "name": "Block", + "src": "3520:485:0" + } + ], + "id": 334, + "name": "FunctionDefinition", + "src": "3445:560:0" + }, + { + "attributes": { + "constant": true, + "implemented": true, + "isConstructor": false, + "modifiers": [ + null + ], + "name": "balanceOf", + "payable": false, + "scope": 347, + "stateMutability": "view", + "superFunction": 153, + "visibility": "public" + }, + "children": [ + { + "children": [ + { + "attributes": { + "constant": false, + "name": "_owner", + "scope": 346, + "stateVariable": false, + "storageLocation": "default", + "type": "address", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "address", + "type": "address" + }, + "id": 335, + "name": "ElementaryTypeName", + "src": "4235:7:0" + } + ], + "id": 336, + "name": "VariableDeclaration", + "src": "4235:14:0" + } + ], + "id": 337, + "name": "ParameterList", + "src": "4234:16:0" + }, + { + "children": [ + { + "attributes": { + "constant": false, + "name": "balance", + "scope": 346, + "stateVariable": false, + "storageLocation": "default", + "type": "uint256", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "uint", + "type": "uint256" + }, + "id": 338, + "name": "ElementaryTypeName", + "src": "4276:4:0" + } + ], + "id": 339, + "name": "VariableDeclaration", + "src": "4276:12:0" + } + ], + "id": 340, + "name": "ParameterList", + "src": "4275:14:0" + }, + { + "children": [ + { + "attributes": { + "functionReturnParameters": 340 + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 216, + "type": "mapping(address => uint256)", + "value": "balances" + }, + "id": 341, + "name": "Identifier", + "src": "4307:8:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 336, + "type": "address", + "value": "_owner" + }, + "id": 342, + "name": "Identifier", + "src": "4316:6:0" + } + ], + "id": 343, + "name": "IndexAccess", + "src": "4307:16:0" + } + ], + "id": 344, + "name": "Return", + "src": "4300:23:0" + } + ], + "id": 345, + "name": "Block", + "src": "4290:40:0" + } + ], + "id": 346, + "name": "FunctionDefinition", + "src": "4216:114:0" + } + ], + "id": 347, + "name": "ContractDefinition", + "src": "2837:1496:0" + }, + { + "attributes": { + "contractDependencies": [ + 347, + 139, + 169, + 205 + ], + "contractKind": "contract", + "documentation": "@title Standard ERC20 token\n * @dev Implementation of the basic standard token.\n@dev https://github.com/ethereum/EIPs/issues/20\n@dev Based oncode by FirstBlood: https://github.com/Firstbloodio/token/blob/master/smart_contract/FirstBloodToken.sol", + "fullyImplemented": false, + "linearizedBaseContracts": [ + 546, + 205, + 347, + 169, + 139 + ], + "name": "StandardToken", + "scope": 1143 + }, + "children": [ + { + "attributes": { + "arguments": [ + null + ] + }, + "children": [ + { + "attributes": { + "contractScope": null, + "name": "BasicToken", + "referencedDeclaration": 347, + "type": "contract BasicToken" + }, + "id": 348, + "name": "UserDefinedTypeName", + "src": "4627:10:0" + } + ], + "id": 349, + "name": "InheritanceSpecifier", + "src": "4627:10:0" + }, + { + "attributes": { + "arguments": [ + null + ] + }, + "children": [ + { + "attributes": { + "contractScope": null, + "name": "ERC20", + "referencedDeclaration": 205, + "type": "contract ERC20" + }, + "id": 350, + "name": "UserDefinedTypeName", + "src": "4639:5:0" + } + ], + "id": 351, + "name": "InheritanceSpecifier", + "src": "4639:5:0" + }, + { + "attributes": { + "constant": false, + "name": "allowed", + "scope": 546, + "stateVariable": true, + "storageLocation": "default", + "type": "mapping(address => mapping(address => uint256))", + "value": null, + "visibility": "public" + }, + "children": [ + { + "attributes": { + "type": "mapping(address => mapping(address => uint256))" + }, + "children": [ + { + "attributes": { + "name": "address", + "type": "address" + }, + "id": 352, + "name": "ElementaryTypeName", + "src": "4661:7:0" + }, + { + "attributes": { + "type": "mapping(address => uint256)" + }, + "children": [ + { + "attributes": { + "name": "address", + "type": "address" + }, + "id": 353, + "name": "ElementaryTypeName", + "src": "4681:7:0" + }, + { + "attributes": { + "name": "uint", + "type": "uint256" + }, + "id": 354, + "name": "ElementaryTypeName", + "src": "4692:4:0" + } + ], + "id": 355, + "name": "Mapping", + "src": "4672:25:0" + } + ], + "id": 356, + "name": "Mapping", + "src": "4652:46:0" + } + ], + "id": 357, + "name": "VariableDeclaration", + "src": "4652:61:0" + }, + { + "attributes": { + "constant": true, + "name": "MAX_UINT", + "scope": 546, + "stateVariable": true, + "storageLocation": "default", + "type": "uint256", + "visibility": "public" + }, + "children": [ + { + "attributes": { + "name": "uint", + "type": "uint256" + }, + "id": 358, + "name": "ElementaryTypeName", + "src": "4720:4:0" + }, + { + "attributes": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_rational_115792089237316195423570985008687907853269984665640564039457584007913129639935_by_1", + "typeString": "int_const 115792089237316195423570985008687907853269984665640564039457584007913129639935" + }, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "operator": "-", + "type": "int_const 115792089237316195423570985008687907853269984665640564039457584007913129639935" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_rational_115792089237316195423570985008687907853269984665640564039457584007913129639936_by_1", + "typeString": "int_const 115792089237316195423570985008687907853269984665640564039457584007913129639936" + }, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "operator": "**", + "type": "int_const 115792089237316195423570985008687907853269984665640564039457584007913129639936" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "hexvalue": "32", + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "subdenomination": null, + "token": "number", + "type": "int_const 2", + "value": "2" + }, + "id": 359, + "name": "Literal", + "src": "4752:1:0" + }, + { + "attributes": { + "argumentTypes": null, + "hexvalue": "323536", + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "subdenomination": null, + "token": "number", + "type": "int_const 256", + "value": "256" + }, + "id": 360, + "name": "Literal", + "src": "4755:3:0" + } + ], + "id": 361, + "name": "BinaryOperation", + "src": "4752:6:0" + }, + { + "attributes": { + "argumentTypes": null, + "hexvalue": "31", + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "subdenomination": null, + "token": "number", + "type": "int_const 1", + "value": "1" + }, + "id": 362, + "name": "Literal", + "src": "4761:1:0" + } + ], + "id": 363, + "name": "BinaryOperation", + "src": "4752:10:0" + } + ], + "id": 364, + "name": "VariableDeclaration", + "src": "4720:42:0" + }, + { + "attributes": { + "constant": false, + "implemented": true, + "isConstructor": false, + "name": "transferFrom", + "payable": false, + "scope": 546, + "stateMutability": "nonpayable", + "superFunction": 189, + "visibility": "public" + }, + "children": [ + { + "children": [ + { + "attributes": { + "constant": false, + "name": "_from", + "scope": 481, + "stateVariable": false, + "storageLocation": "default", + "type": "address", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "address", + "type": "address" + }, + "id": 365, + "name": "ElementaryTypeName", + "src": "5066:7:0" + } + ], + "id": 366, + "name": "VariableDeclaration", + "src": "5066:13:0" + }, + { + "attributes": { + "constant": false, + "name": "_to", + "scope": 481, + "stateVariable": false, + "storageLocation": "default", + "type": "address", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "address", + "type": "address" + }, + "id": 367, + "name": "ElementaryTypeName", + "src": "5081:7:0" + } + ], + "id": 368, + "name": "VariableDeclaration", + "src": "5081:11:0" + }, + { + "attributes": { + "constant": false, + "name": "_value", + "scope": 481, + "stateVariable": false, + "storageLocation": "default", + "type": "uint256", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "uint", + "type": "uint256" + }, + "id": 369, + "name": "ElementaryTypeName", + "src": "5094:4:0" + } + ], + "id": 370, + "name": "VariableDeclaration", + "src": "5094:11:0" + } + ], + "id": 371, + "name": "ParameterList", + "src": "5065:41:0" + }, + { + "attributes": { + "parameters": [ + null + ] + }, + "children": [], + "id": 377, + "name": "ParameterList", + "src": "5138:0:0" + }, + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 240, + "type": "modifier (uint256)", + "value": "onlyPayloadSize" + }, + "id": 372, + "name": "Identifier", + "src": "5114:15:0" + }, + { + "attributes": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_rational_96_by_1", + "typeString": "int_const 96" + }, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "operator": "*", + "type": "int_const 96" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "hexvalue": "33", + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "subdenomination": null, + "token": "number", + "type": "int_const 3", + "value": "3" + }, + "id": 373, + "name": "Literal", + "src": "5130:1:0" + }, + { + "attributes": { + "argumentTypes": null, + "hexvalue": "3332", + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "subdenomination": null, + "token": "number", + "type": "int_const 32", + "value": "32" + }, + "id": 374, + "name": "Literal", + "src": "5134:2:0" + } + ], + "id": 375, + "name": "BinaryOperation", + "src": "5130:6:0" + } + ], + "id": 376, + "name": "ModifierInvocation", + "src": "5114:23:0" + }, + { + "children": [ + { + "attributes": { + "assignments": [ + 378 + ] + }, + "children": [ + { + "attributes": { + "constant": false, + "name": "_allowance", + "scope": 481, + "stateVariable": false, + "storageLocation": "default", + "type": "uint256", + "typeName": null, + "value": null, + "visibility": "internal" + }, + "children": [], + "id": 378, + "name": "VariableDeclaration", + "src": "5148:14:0" + }, + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "type": "mapping(address => uint256)" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 357, + "type": "mapping(address => mapping(address => uint256))", + "value": "allowed" + }, + "id": 379, + "name": "Identifier", + "src": "5165:7:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 366, + "type": "address", + "value": "_from" + }, + "id": 380, + "name": "Identifier", + "src": "5173:5:0" + } + ], + "id": 381, + "name": "IndexAccess", + "src": "5165:14:0" + }, + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "member_name": "sender", + "referencedDeclaration": null, + "type": "address" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1154, + "type": "msg", + "value": "msg" + }, + "id": 382, + "name": "Identifier", + "src": "5180:3:0" + } + ], + "id": 383, + "name": "MemberAccess", + "src": "5180:10:0" + } + ], + "id": 384, + "name": "IndexAccess", + "src": "5165:26:0" + } + ], + "id": 385, + "name": "VariableDeclarationStatement", + "src": "5148:43:0" + }, + { + "attributes": { + "assignments": [ + 387 + ] + }, + "children": [ + { + "attributes": { + "constant": false, + "name": "fee", + "scope": 481, + "stateVariable": false, + "storageLocation": "default", + "type": "uint256", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "uint", + "type": "uint256" + }, + "id": 386, + "name": "ElementaryTypeName", + "src": "5357:4:0" + } + ], + "id": 387, + "name": "VariableDeclaration", + "src": "5357:8:0" + }, + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "isStructConstructorCall": false, + "lValueRequested": false, + "names": [ + null + ], + "type": "uint256", + "type_conversion": false + }, + "children": [ + { + "attributes": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_10000_by_1", + "typeString": "int_const 10000" + } + ], + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "member_name": "div", + "referencedDeclaration": 52, + "type": "function (uint256,uint256) pure returns (uint256)" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "isStructConstructorCall": false, + "lValueRequested": false, + "names": [ + null + ], + "type": "uint256", + "type_conversion": false + }, + "children": [ + { + "attributes": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "member_name": "mul", + "referencedDeclaration": 34, + "type": "function (uint256,uint256) pure returns (uint256)" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 370, + "type": "uint256", + "value": "_value" + }, + "id": 388, + "name": "Identifier", + "src": "5369:6:0" + } + ], + "id": 389, + "name": "MemberAccess", + "src": "5369:10:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 219, + "type": "uint256", + "value": "basisPointsRate" + }, + "id": 390, + "name": "Identifier", + "src": "5380:15:0" + } + ], + "id": 391, + "name": "FunctionCall", + "src": "5369:27:0" + } + ], + "id": 392, + "name": "TupleExpression", + "src": "5368:29:0" + } + ], + "id": 393, + "name": "MemberAccess", + "src": "5368:33:0" + }, + { + "attributes": { + "argumentTypes": null, + "hexvalue": "3130303030", + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "subdenomination": null, + "token": "number", + "type": "int_const 10000", + "value": "10000" + }, + "id": 394, + "name": "Literal", + "src": "5402:5:0" + } + ], + "id": 395, + "name": "FunctionCall", + "src": "5368:40:0" + } + ], + "id": 396, + "name": "VariableDeclarationStatement", + "src": "5357:51:0" + }, + { + "attributes": { + "falseBody": null + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": ">", + "type": "bool" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 387, + "type": "uint256", + "value": "fee" + }, + "id": 397, + "name": "Identifier", + "src": "5422:3:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 222, + "type": "uint256", + "value": "maximumFee" + }, + "id": 398, + "name": "Identifier", + "src": "5428:10:0" + } + ], + "id": 399, + "name": "BinaryOperation", + "src": "5422:16:0" + }, + { + "children": [ + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": "=", + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 387, + "type": "uint256", + "value": "fee" + }, + "id": 400, + "name": "Identifier", + "src": "5454:3:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 222, + "type": "uint256", + "value": "maximumFee" + }, + "id": 401, + "name": "Identifier", + "src": "5460:10:0" + } + ], + "id": 402, + "name": "Assignment", + "src": "5454:16:0" + } + ], + "id": 403, + "name": "ExpressionStatement", + "src": "5454:16:0" + } + ], + "id": 404, + "name": "Block", + "src": "5440:41:0" + } + ], + "id": 405, + "name": "IfStatement", + "src": "5418:63:0" + }, + { + "attributes": { + "falseBody": null + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": "<", + "type": "bool" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 378, + "type": "uint256", + "value": "_allowance" + }, + "id": 406, + "name": "Identifier", + "src": "5494:10:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 364, + "type": "uint256", + "value": "MAX_UINT" + }, + "id": 407, + "name": "Identifier", + "src": "5507:8:0" + } + ], + "id": 408, + "name": "BinaryOperation", + "src": "5494:21:0" + }, + { + "children": [ + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": "=", + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "type": "mapping(address => uint256)" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 357, + "type": "mapping(address => mapping(address => uint256))", + "value": "allowed" + }, + "id": 409, + "name": "Identifier", + "src": "5531:7:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 366, + "type": "address", + "value": "_from" + }, + "id": 410, + "name": "Identifier", + "src": "5539:5:0" + } + ], + "id": 413, + "name": "IndexAccess", + "src": "5531:14:0" + }, + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "member_name": "sender", + "referencedDeclaration": null, + "type": "address" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1154, + "type": "msg", + "value": "msg" + }, + "id": 411, + "name": "Identifier", + "src": "5546:3:0" + } + ], + "id": 412, + "name": "MemberAccess", + "src": "5546:10:0" + } + ], + "id": 414, + "name": "IndexAccess", + "src": "5531:26:0" + }, + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "isStructConstructorCall": false, + "lValueRequested": false, + "names": [ + null + ], + "type": "uint256", + "type_conversion": false + }, + "children": [ + { + "attributes": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "member_name": "sub", + "referencedDeclaration": 72, + "type": "function (uint256,uint256) pure returns (uint256)" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 378, + "type": "uint256", + "value": "_allowance" + }, + "id": 415, + "name": "Identifier", + "src": "5560:10:0" + } + ], + "id": 416, + "name": "MemberAccess", + "src": "5560:14:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 370, + "type": "uint256", + "value": "_value" + }, + "id": 417, + "name": "Identifier", + "src": "5575:6:0" + } + ], + "id": 418, + "name": "FunctionCall", + "src": "5560:22:0" + } + ], + "id": 419, + "name": "Assignment", + "src": "5531:51:0" + } + ], + "id": 420, + "name": "ExpressionStatement", + "src": "5531:51:0" + } + ], + "id": 421, + "name": "Block", + "src": "5517:76:0" + } + ], + "id": 422, + "name": "IfStatement", + "src": "5490:103:0" + }, + { + "attributes": { + "assignments": [ + 424 + ] + }, + "children": [ + { + "attributes": { + "constant": false, + "name": "sendAmount", + "scope": 481, + "stateVariable": false, + "storageLocation": "default", + "type": "uint256", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "uint", + "type": "uint256" + }, + "id": 423, + "name": "ElementaryTypeName", + "src": "5602:4:0" + } + ], + "id": 424, + "name": "VariableDeclaration", + "src": "5602:15:0" + }, + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "isStructConstructorCall": false, + "lValueRequested": false, + "names": [ + null + ], + "type": "uint256", + "type_conversion": false + }, + "children": [ + { + "attributes": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "member_name": "sub", + "referencedDeclaration": 72, + "type": "function (uint256,uint256) pure returns (uint256)" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 370, + "type": "uint256", + "value": "_value" + }, + "id": 425, + "name": "Identifier", + "src": "5620:6:0" + } + ], + "id": 426, + "name": "MemberAccess", + "src": "5620:10:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 387, + "type": "uint256", + "value": "fee" + }, + "id": 427, + "name": "Identifier", + "src": "5631:3:0" + } + ], + "id": 428, + "name": "FunctionCall", + "src": "5620:15:0" + } + ], + "id": 429, + "name": "VariableDeclarationStatement", + "src": "5602:33:0" + }, + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": "=", + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 216, + "type": "mapping(address => uint256)", + "value": "balances" + }, + "id": 430, + "name": "Identifier", + "src": "5645:8:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 366, + "type": "address", + "value": "_from" + }, + "id": 431, + "name": "Identifier", + "src": "5654:5:0" + } + ], + "id": 432, + "name": "IndexAccess", + "src": "5645:15:0" + }, + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "isStructConstructorCall": false, + "lValueRequested": false, + "names": [ + null + ], + "type": "uint256", + "type_conversion": false + }, + "children": [ + { + "attributes": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "member_name": "sub", + "referencedDeclaration": 72, + "type": "function (uint256,uint256) pure returns (uint256)" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 216, + "type": "mapping(address => uint256)", + "value": "balances" + }, + "id": 433, + "name": "Identifier", + "src": "5663:8:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 366, + "type": "address", + "value": "_from" + }, + "id": 434, + "name": "Identifier", + "src": "5672:5:0" + } + ], + "id": 435, + "name": "IndexAccess", + "src": "5663:15:0" + } + ], + "id": 436, + "name": "MemberAccess", + "src": "5663:19:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 370, + "type": "uint256", + "value": "_value" + }, + "id": 437, + "name": "Identifier", + "src": "5683:6:0" + } + ], + "id": 438, + "name": "FunctionCall", + "src": "5663:27:0" + } + ], + "id": 439, + "name": "Assignment", + "src": "5645:45:0" + } + ], + "id": 440, + "name": "ExpressionStatement", + "src": "5645:45:0" + }, + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": "=", + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 216, + "type": "mapping(address => uint256)", + "value": "balances" + }, + "id": 441, + "name": "Identifier", + "src": "5700:8:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 368, + "type": "address", + "value": "_to" + }, + "id": 442, + "name": "Identifier", + "src": "5709:3:0" + } + ], + "id": 443, + "name": "IndexAccess", + "src": "5700:13:0" + }, + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "isStructConstructorCall": false, + "lValueRequested": false, + "names": [ + null + ], + "type": "uint256", + "type_conversion": false + }, + "children": [ + { + "attributes": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "member_name": "add", + "referencedDeclaration": 96, + "type": "function (uint256,uint256) pure returns (uint256)" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 216, + "type": "mapping(address => uint256)", + "value": "balances" + }, + "id": 444, + "name": "Identifier", + "src": "5716:8:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 368, + "type": "address", + "value": "_to" + }, + "id": 445, + "name": "Identifier", + "src": "5725:3:0" + } + ], + "id": 446, + "name": "IndexAccess", + "src": "5716:13:0" + } + ], + "id": 447, + "name": "MemberAccess", + "src": "5716:17:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 424, + "type": "uint256", + "value": "sendAmount" + }, + "id": 448, + "name": "Identifier", + "src": "5734:10:0" + } + ], + "id": 449, + "name": "FunctionCall", + "src": "5716:29:0" + } + ], + "id": 450, + "name": "Assignment", + "src": "5700:45:0" + } + ], + "id": 451, + "name": "ExpressionStatement", + "src": "5700:45:0" + }, + { + "attributes": { + "falseBody": null + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": ">", + "type": "bool" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 387, + "type": "uint256", + "value": "fee" + }, + "id": 452, + "name": "Identifier", + "src": "5759:3:0" + }, + { + "attributes": { + "argumentTypes": null, + "hexvalue": "30", + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "subdenomination": null, + "token": "number", + "type": "int_const 0", + "value": "0" + }, + "id": 453, + "name": "Literal", + "src": "5765:1:0" + } + ], + "id": 454, + "name": "BinaryOperation", + "src": "5759:7:0" + }, + { + "children": [ + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": "=", + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 216, + "type": "mapping(address => uint256)", + "value": "balances" + }, + "id": 455, + "name": "Identifier", + "src": "5782:8:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 99, + "type": "address", + "value": "owner" + }, + "id": 456, + "name": "Identifier", + "src": "5791:5:0" + } + ], + "id": 457, + "name": "IndexAccess", + "src": "5782:15:0" + }, + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "isStructConstructorCall": false, + "lValueRequested": false, + "names": [ + null + ], + "type": "uint256", + "type_conversion": false + }, + "children": [ + { + "attributes": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "member_name": "add", + "referencedDeclaration": 96, + "type": "function (uint256,uint256) pure returns (uint256)" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 216, + "type": "mapping(address => uint256)", + "value": "balances" + }, + "id": 458, + "name": "Identifier", + "src": "5800:8:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 99, + "type": "address", + "value": "owner" + }, + "id": 459, + "name": "Identifier", + "src": "5809:5:0" + } + ], + "id": 460, + "name": "IndexAccess", + "src": "5800:15:0" + } + ], + "id": 461, + "name": "MemberAccess", + "src": "5800:19:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 387, + "type": "uint256", + "value": "fee" + }, + "id": 462, + "name": "Identifier", + "src": "5820:3:0" + } + ], + "id": 463, + "name": "FunctionCall", + "src": "5800:24:0" + } + ], + "id": 464, + "name": "Assignment", + "src": "5782:42:0" + } + ], + "id": 465, + "name": "ExpressionStatement", + "src": "5782:42:0" + }, + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "isStructConstructorCall": false, + "lValueRequested": false, + "names": [ + null + ], + "type": "tuple()", + "type_conversion": false + }, + "children": [ + { + "attributes": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 168, + "type": "function (address,address,uint256)", + "value": "Transfer" + }, + "id": 466, + "name": "Identifier", + "src": "5838:8:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 366, + "type": "address", + "value": "_from" + }, + "id": 467, + "name": "Identifier", + "src": "5847:5:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 99, + "type": "address", + "value": "owner" + }, + "id": 468, + "name": "Identifier", + "src": "5854:5:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 387, + "type": "uint256", + "value": "fee" + }, + "id": 469, + "name": "Identifier", + "src": "5861:3:0" + } + ], + "id": 470, + "name": "FunctionCall", + "src": "5838:27:0" + } + ], + "id": 471, + "name": "ExpressionStatement", + "src": "5838:27:0" + } + ], + "id": 472, + "name": "Block", + "src": "5768:108:0" + } + ], + "id": 473, + "name": "IfStatement", + "src": "5755:121:0" + }, + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "isStructConstructorCall": false, + "lValueRequested": false, + "names": [ + null + ], + "type": "tuple()", + "type_conversion": false + }, + "children": [ + { + "attributes": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 168, + "type": "function (address,address,uint256)", + "value": "Transfer" + }, + "id": 474, + "name": "Identifier", + "src": "5885:8:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 366, + "type": "address", + "value": "_from" + }, + "id": 475, + "name": "Identifier", + "src": "5894:5:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 368, + "type": "address", + "value": "_to" + }, + "id": 476, + "name": "Identifier", + "src": "5901:3:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 424, + "type": "uint256", + "value": "sendAmount" + }, + "id": 477, + "name": "Identifier", + "src": "5906:10:0" + } + ], + "id": 478, + "name": "FunctionCall", + "src": "5885:32:0" + } + ], + "id": 479, + "name": "ExpressionStatement", + "src": "5885:32:0" + } + ], + "id": 480, + "name": "Block", + "src": "5138:786:0" + } + ], + "id": 481, + "name": "FunctionDefinition", + "src": "5044:880:0" + }, + { + "attributes": { + "constant": false, + "implemented": true, + "isConstructor": false, + "name": "approve", + "payable": false, + "scope": 546, + "stateMutability": "nonpayable", + "superFunction": 196, + "visibility": "public" + }, + "children": [ + { + "children": [ + { + "attributes": { + "constant": false, + "name": "_spender", + "scope": 529, + "stateVariable": false, + "storageLocation": "default", + "type": "address", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "address", + "type": "address" + }, + "id": 482, + "name": "ElementaryTypeName", + "src": "6181:7:0" + } + ], + "id": 483, + "name": "VariableDeclaration", + "src": "6181:16:0" + }, + { + "attributes": { + "constant": false, + "name": "_value", + "scope": 529, + "stateVariable": false, + "storageLocation": "default", + "type": "uint256", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "uint", + "type": "uint256" + }, + "id": 484, + "name": "ElementaryTypeName", + "src": "6199:4:0" + } + ], + "id": 485, + "name": "VariableDeclaration", + "src": "6199:11:0" + } + ], + "id": 486, + "name": "ParameterList", + "src": "6180:31:0" + }, + { + "attributes": { + "parameters": [ + null + ] + }, + "children": [], + "id": 492, + "name": "ParameterList", + "src": "6243:0:0" + }, + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 240, + "type": "modifier (uint256)", + "value": "onlyPayloadSize" + }, + "id": 487, + "name": "Identifier", + "src": "6219:15:0" + }, + { + "attributes": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_rational_64_by_1", + "typeString": "int_const 64" + }, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "operator": "*", + "type": "int_const 64" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "hexvalue": "32", + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "subdenomination": null, + "token": "number", + "type": "int_const 2", + "value": "2" + }, + "id": 488, + "name": "Literal", + "src": "6235:1:0" + }, + { + "attributes": { + "argumentTypes": null, + "hexvalue": "3332", + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "subdenomination": null, + "token": "number", + "type": "int_const 32", + "value": "32" + }, + "id": 489, + "name": "Literal", + "src": "6239:2:0" + } + ], + "id": 490, + "name": "BinaryOperation", + "src": "6235:6:0" + } + ], + "id": 491, + "name": "ModifierInvocation", + "src": "6219:23:0" + }, + { + "children": [ + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "isStructConstructorCall": false, + "lValueRequested": false, + "names": [ + null + ], + "type": "tuple()", + "type_conversion": false + }, + "children": [ + { + "attributes": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + ], + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1157, + "type": "function (bool) pure", + "value": "require" + }, + "id": 493, + "name": "Identifier", + "src": "6558:7:0" + }, + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": "!", + "prefix": true, + "type": "bool" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "type": "bool" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": "&&", + "type": "bool" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "type": "bool" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": "!=", + "type": "bool" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 485, + "type": "uint256", + "value": "_value" + }, + "id": 494, + "name": "Identifier", + "src": "6569:6:0" + }, + { + "attributes": { + "argumentTypes": null, + "hexvalue": "30", + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "subdenomination": null, + "token": "number", + "type": "int_const 0", + "value": "0" + }, + "id": 495, + "name": "Literal", + "src": "6579:1:0" + } + ], + "id": 496, + "name": "BinaryOperation", + "src": "6569:11:0" + } + ], + "id": 497, + "name": "TupleExpression", + "src": "6568:13:0" + }, + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "type": "bool" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": "!=", + "type": "bool" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "type": "mapping(address => uint256)" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 357, + "type": "mapping(address => mapping(address => uint256))", + "value": "allowed" + }, + "id": 498, + "name": "Identifier", + "src": "6586:7:0" + }, + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "member_name": "sender", + "referencedDeclaration": null, + "type": "address" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1154, + "type": "msg", + "value": "msg" + }, + "id": 499, + "name": "Identifier", + "src": "6594:3:0" + } + ], + "id": 500, + "name": "MemberAccess", + "src": "6594:10:0" + } + ], + "id": 501, + "name": "IndexAccess", + "src": "6586:19:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 483, + "type": "address", + "value": "_spender" + }, + "id": 502, + "name": "Identifier", + "src": "6606:8:0" + } + ], + "id": 503, + "name": "IndexAccess", + "src": "6586:29:0" + }, + { + "attributes": { + "argumentTypes": null, + "hexvalue": "30", + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "subdenomination": null, + "token": "number", + "type": "int_const 0", + "value": "0" + }, + "id": 504, + "name": "Literal", + "src": "6619:1:0" + } + ], + "id": 505, + "name": "BinaryOperation", + "src": "6586:34:0" + } + ], + "id": 506, + "name": "TupleExpression", + "src": "6585:36:0" + } + ], + "id": 507, + "name": "BinaryOperation", + "src": "6568:53:0" + } + ], + "id": 508, + "name": "TupleExpression", + "src": "6567:55:0" + } + ], + "id": 509, + "name": "UnaryOperation", + "src": "6566:56:0" + } + ], + "id": 510, + "name": "FunctionCall", + "src": "6558:65:0" + } + ], + "id": 511, + "name": "ExpressionStatement", + "src": "6558:65:0" + }, + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": "=", + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "type": "mapping(address => uint256)" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 357, + "type": "mapping(address => mapping(address => uint256))", + "value": "allowed" + }, + "id": 512, + "name": "Identifier", + "src": "6634:7:0" + }, + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "member_name": "sender", + "referencedDeclaration": null, + "type": "address" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1154, + "type": "msg", + "value": "msg" + }, + "id": 513, + "name": "Identifier", + "src": "6642:3:0" + } + ], + "id": 514, + "name": "MemberAccess", + "src": "6642:10:0" + } + ], + "id": 516, + "name": "IndexAccess", + "src": "6634:19:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 483, + "type": "address", + "value": "_spender" + }, + "id": 515, + "name": "Identifier", + "src": "6654:8:0" + } + ], + "id": 517, + "name": "IndexAccess", + "src": "6634:29:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 485, + "type": "uint256", + "value": "_value" + }, + "id": 518, + "name": "Identifier", + "src": "6666:6:0" + } + ], + "id": 519, + "name": "Assignment", + "src": "6634:38:0" + } + ], + "id": 520, + "name": "ExpressionStatement", + "src": "6634:38:0" + }, + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "isStructConstructorCall": false, + "lValueRequested": false, + "names": [ + null + ], + "type": "tuple()", + "type_conversion": false + }, + "children": [ + { + "attributes": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 204, + "type": "function (address,address,uint256)", + "value": "Approval" + }, + "id": 521, + "name": "Identifier", + "src": "6682:8:0" + }, + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "member_name": "sender", + "referencedDeclaration": null, + "type": "address" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1154, + "type": "msg", + "value": "msg" + }, + "id": 522, + "name": "Identifier", + "src": "6691:3:0" + } + ], + "id": 523, + "name": "MemberAccess", + "src": "6691:10:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 483, + "type": "address", + "value": "_spender" + }, + "id": 524, + "name": "Identifier", + "src": "6703:8:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 485, + "type": "uint256", + "value": "_value" + }, + "id": 525, + "name": "Identifier", + "src": "6713:6:0" + } + ], + "id": 526, + "name": "FunctionCall", + "src": "6682:38:0" + } + ], + "id": 527, + "name": "ExpressionStatement", + "src": "6682:38:0" + } + ], + "id": 528, + "name": "Block", + "src": "6243:484:0" + } + ], + "id": 529, + "name": "FunctionDefinition", + "src": "6164:563:0" + }, + { + "attributes": { + "constant": true, + "implemented": true, + "isConstructor": false, + "modifiers": [ + null + ], + "name": "allowance", + "payable": false, + "scope": 546, + "stateMutability": "view", + "superFunction": 180, + "visibility": "public" + }, + "children": [ + { + "children": [ + { + "attributes": { + "constant": false, + "name": "_owner", + "scope": 545, + "stateVariable": false, + "storageLocation": "default", + "type": "address", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "address", + "type": "address" + }, + "id": 530, + "name": "ElementaryTypeName", + "src": "7071:7:0" + } + ], + "id": 531, + "name": "VariableDeclaration", + "src": "7071:14:0" + }, + { + "attributes": { + "constant": false, + "name": "_spender", + "scope": 545, + "stateVariable": false, + "storageLocation": "default", + "type": "address", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "address", + "type": "address" + }, + "id": 532, + "name": "ElementaryTypeName", + "src": "7087:7:0" + } + ], + "id": 533, + "name": "VariableDeclaration", + "src": "7087:16:0" + } + ], + "id": 534, + "name": "ParameterList", + "src": "7070:34:0" + }, + { + "children": [ + { + "attributes": { + "constant": false, + "name": "remaining", + "scope": 545, + "stateVariable": false, + "storageLocation": "default", + "type": "uint256", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "uint", + "type": "uint256" + }, + "id": 535, + "name": "ElementaryTypeName", + "src": "7130:4:0" + } + ], + "id": 536, + "name": "VariableDeclaration", + "src": "7130:14:0" + } + ], + "id": 537, + "name": "ParameterList", + "src": "7129:16:0" + }, + { + "children": [ + { + "attributes": { + "functionReturnParameters": 537 + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "type": "mapping(address => uint256)" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 357, + "type": "mapping(address => mapping(address => uint256))", + "value": "allowed" + }, + "id": 538, + "name": "Identifier", + "src": "7163:7:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 531, + "type": "address", + "value": "_owner" + }, + "id": 539, + "name": "Identifier", + "src": "7171:6:0" + } + ], + "id": 540, + "name": "IndexAccess", + "src": "7163:15:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 533, + "type": "address", + "value": "_spender" + }, + "id": 541, + "name": "Identifier", + "src": "7179:8:0" + } + ], + "id": 542, + "name": "IndexAccess", + "src": "7163:25:0" + } + ], + "id": 543, + "name": "Return", + "src": "7156:32:0" + } + ], + "id": 544, + "name": "Block", + "src": "7146:49:0" + } + ], + "id": 545, + "name": "FunctionDefinition", + "src": "7052:143:0" + } + ], + "id": 546, + "name": "ContractDefinition", + "src": "4601:2597:0" + }, + { + "attributes": { + "contractDependencies": [ + 139 + ], + "contractKind": "contract", + "documentation": "@title Pausable\n@dev Base contract which allows children to implement an emergency stop mechanism.", + "fullyImplemented": true, + "linearizedBaseContracts": [ + 603, + 139 + ], + "name": "Pausable", + "scope": 1143 + }, + "children": [ + { + "attributes": { + "arguments": [ + null + ] + }, + "children": [ + { + "attributes": { + "contractScope": null, + "name": "Ownable", + "referencedDeclaration": 139, + "type": "contract Ownable" + }, + "id": 547, + "name": "UserDefinedTypeName", + "src": "7335:7:0" + } + ], + "id": 548, + "name": "InheritanceSpecifier", + "src": "7335:7:0" + }, + { + "attributes": { + "anonymous": false, + "name": "Pause" + }, + "children": [ + { + "attributes": { + "parameters": [ + null + ] + }, + "children": [], + "id": 549, + "name": "ParameterList", + "src": "7358:2:0" + } + ], + "id": 550, + "name": "EventDefinition", + "src": "7347:14:0" + }, + { + "attributes": { + "anonymous": false, + "name": "Unpause" + }, + "children": [ + { + "attributes": { + "parameters": [ + null + ] + }, + "children": [], + "id": 551, + "name": "ParameterList", + "src": "7377:2:0" + } + ], + "id": 552, + "name": "EventDefinition", + "src": "7364:16:0" + }, + { + "attributes": { + "constant": false, + "name": "paused", + "scope": 603, + "stateVariable": true, + "storageLocation": "default", + "type": "bool", + "visibility": "public" + }, + "children": [ + { + "attributes": { + "name": "bool", + "type": "bool" + }, + "id": 553, + "name": "ElementaryTypeName", + "src": "7384:4:0" + }, + { + "attributes": { + "argumentTypes": null, + "hexvalue": "66616c7365", + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "subdenomination": null, + "token": "bool", + "type": "bool", + "value": "false" + }, + "id": 554, + "name": "Literal", + "src": "7405:5:0" + } + ], + "id": 555, + "name": "VariableDeclaration", + "src": "7384:26:0" + }, + { + "attributes": { + "name": "whenNotPaused", + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "parameters": [ + null + ] + }, + "children": [], + "id": 556, + "name": "ParameterList", + "src": "7535:2:0" + }, + { + "children": [ + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "isStructConstructorCall": false, + "lValueRequested": false, + "names": [ + null + ], + "type": "tuple()", + "type_conversion": false + }, + "children": [ + { + "attributes": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + ], + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1157, + "type": "function (bool) pure", + "value": "require" + }, + "id": 557, + "name": "Identifier", + "src": "7544:7:0" + }, + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": "!", + "prefix": true, + "type": "bool" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 555, + "type": "bool", + "value": "paused" + }, + "id": 558, + "name": "Identifier", + "src": "7553:6:0" + } + ], + "id": 559, + "name": "UnaryOperation", + "src": "7552:7:0" + } + ], + "id": 560, + "name": "FunctionCall", + "src": "7544:16:0" + } + ], + "id": 561, + "name": "ExpressionStatement", + "src": "7544:16:0" + }, + { + "id": 562, + "name": "PlaceholderStatement", + "src": "7566:1:0" + } + ], + "id": 563, + "name": "Block", + "src": "7538:34:0" + } + ], + "id": 564, + "name": "ModifierDefinition", + "src": "7513:59:0" + }, + { + "attributes": { + "name": "whenPaused", + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "parameters": [ + null + ] + }, + "children": [], + "id": 565, + "name": "ParameterList", + "src": "7688:2:0" + }, + { + "children": [ + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "isStructConstructorCall": false, + "lValueRequested": false, + "names": [ + null + ], + "type": "tuple()", + "type_conversion": false + }, + "children": [ + { + "attributes": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + ], + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1157, + "type": "function (bool) pure", + "value": "require" + }, + "id": 566, + "name": "Identifier", + "src": "7697:7:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 555, + "type": "bool", + "value": "paused" + }, + "id": 567, + "name": "Identifier", + "src": "7705:6:0" + } + ], + "id": 568, + "name": "FunctionCall", + "src": "7697:15:0" + } + ], + "id": 569, + "name": "ExpressionStatement", + "src": "7697:15:0" + }, + { + "id": 570, + "name": "PlaceholderStatement", + "src": "7718:1:0" + } + ], + "id": 571, + "name": "Block", + "src": "7691:33:0" + } + ], + "id": 572, + "name": "ModifierDefinition", + "src": "7669:55:0" + }, + { + "attributes": { + "constant": false, + "implemented": true, + "isConstructor": false, + "name": "pause", + "payable": false, + "scope": 603, + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "public" + }, + "children": [ + { + "attributes": { + "parameters": [ + null + ] + }, + "children": [], + "id": 573, + "name": "ParameterList", + "src": "7817:2:0" + }, + { + "attributes": { + "parameters": [ + null + ] + }, + "children": [], + "id": 578, + "name": "ParameterList", + "src": "7851:0:0" + }, + { + "attributes": { + "arguments": [ + null + ] + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 119, + "type": "modifier ()", + "value": "onlyOwner" + }, + "id": 574, + "name": "Identifier", + "src": "7820:9:0" + } + ], + "id": 575, + "name": "ModifierInvocation", + "src": "7820:9:0" + }, + { + "attributes": { + "arguments": [ + null + ] + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 564, + "type": "modifier ()", + "value": "whenNotPaused" + }, + "id": 576, + "name": "Identifier", + "src": "7830:13:0" + } + ], + "id": 577, + "name": "ModifierInvocation", + "src": "7830:13:0" + }, + { + "children": [ + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": "=", + "type": "bool" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 555, + "type": "bool", + "value": "paused" + }, + "id": 579, + "name": "Identifier", + "src": "7857:6:0" + }, + { + "attributes": { + "argumentTypes": null, + "hexvalue": "74727565", + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "subdenomination": null, + "token": "bool", + "type": "bool", + "value": "true" + }, + "id": 580, + "name": "Literal", + "src": "7866:4:0" + } + ], + "id": 581, + "name": "Assignment", + "src": "7857:13:0" + } + ], + "id": 582, + "name": "ExpressionStatement", + "src": "7857:13:0" + }, + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "arguments": [ + null + ], + "isConstant": false, + "isLValue": false, + "isPure": false, + "isStructConstructorCall": false, + "lValueRequested": false, + "names": [ + null + ], + "type": "tuple()", + "type_conversion": false + }, + "children": [ + { + "attributes": { + "argumentTypes": [ + null + ], + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 550, + "type": "function ()", + "value": "Pause" + }, + "id": 583, + "name": "Identifier", + "src": "7876:5:0" + } + ], + "id": 584, + "name": "FunctionCall", + "src": "7876:7:0" + } + ], + "id": 585, + "name": "ExpressionStatement", + "src": "7876:7:0" + } + ], + "id": 586, + "name": "Block", + "src": "7851:37:0" + } + ], + "id": 587, + "name": "FunctionDefinition", + "src": "7803:85:0" + }, + { + "attributes": { + "constant": false, + "implemented": true, + "isConstructor": false, + "name": "unpause", + "payable": false, + "scope": 603, + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "public" + }, + "children": [ + { + "attributes": { + "parameters": [ + null + ] + }, + "children": [], + "id": 588, + "name": "ParameterList", + "src": "7986:2:0" + }, + { + "attributes": { + "parameters": [ + null + ] + }, + "children": [], + "id": 593, + "name": "ParameterList", + "src": "8017:0:0" + }, + { + "attributes": { + "arguments": [ + null + ] + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 119, + "type": "modifier ()", + "value": "onlyOwner" + }, + "id": 589, + "name": "Identifier", + "src": "7989:9:0" + } + ], + "id": 590, + "name": "ModifierInvocation", + "src": "7989:9:0" + }, + { + "attributes": { + "arguments": [ + null + ] + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 572, + "type": "modifier ()", + "value": "whenPaused" + }, + "id": 591, + "name": "Identifier", + "src": "7999:10:0" + } + ], + "id": 592, + "name": "ModifierInvocation", + "src": "7999:10:0" + }, + { + "children": [ + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": "=", + "type": "bool" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 555, + "type": "bool", + "value": "paused" + }, + "id": 594, + "name": "Identifier", + "src": "8023:6:0" + }, + { + "attributes": { + "argumentTypes": null, + "hexvalue": "66616c7365", + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "subdenomination": null, + "token": "bool", + "type": "bool", + "value": "false" + }, + "id": 595, + "name": "Literal", + "src": "8032:5:0" + } + ], + "id": 596, + "name": "Assignment", + "src": "8023:14:0" + } + ], + "id": 597, + "name": "ExpressionStatement", + "src": "8023:14:0" + }, + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "arguments": [ + null + ], + "isConstant": false, + "isLValue": false, + "isPure": false, + "isStructConstructorCall": false, + "lValueRequested": false, + "names": [ + null + ], + "type": "tuple()", + "type_conversion": false + }, + "children": [ + { + "attributes": { + "argumentTypes": [ + null + ], + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 552, + "type": "function ()", + "value": "Unpause" + }, + "id": 598, + "name": "Identifier", + "src": "8043:7:0" + } + ], + "id": 599, + "name": "FunctionCall", + "src": "8043:9:0" + } + ], + "id": 600, + "name": "ExpressionStatement", + "src": "8043:9:0" + } + ], + "id": 601, + "name": "Block", + "src": "8017:40:0" + } + ], + "id": 602, + "name": "FunctionDefinition", + "src": "7970:87:0" + } + ], + "id": 603, + "name": "ContractDefinition", + "src": "7314:745:0" + }, + { + "attributes": { + "contractDependencies": [ + 347, + 139, + 169 + ], + "contractKind": "contract", + "documentation": null, + "fullyImplemented": false, + "linearizedBaseContracts": [ + 717, + 347, + 169, + 139 + ], + "name": "BlackList", + "scope": 1143 + }, + "children": [ + { + "attributes": { + "arguments": [ + null + ] + }, + "children": [ + { + "attributes": { + "contractScope": null, + "name": "Ownable", + "referencedDeclaration": 139, + "type": "contract Ownable" + }, + "id": 604, + "name": "UserDefinedTypeName", + "src": "8083:7:0" + } + ], + "id": 605, + "name": "InheritanceSpecifier", + "src": "8083:7:0" + }, + { + "attributes": { + "arguments": [ + null + ] + }, + "children": [ + { + "attributes": { + "contractScope": null, + "name": "BasicToken", + "referencedDeclaration": 347, + "type": "contract BasicToken" + }, + "id": 606, + "name": "UserDefinedTypeName", + "src": "8092:10:0" + } + ], + "id": 607, + "name": "InheritanceSpecifier", + "src": "8092:10:0" + }, + { + "attributes": { + "constant": true, + "implemented": true, + "isConstructor": false, + "modifiers": [ + null + ], + "name": "getBlackListStatus", + "payable": false, + "scope": 717, + "stateMutability": "view", + "superFunction": null, + "visibility": "external" + }, + "children": [ + { + "children": [ + { + "attributes": { + "constant": false, + "name": "_maker", + "scope": 619, + "stateVariable": false, + "storageLocation": "default", + "type": "address", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "address", + "type": "address" + }, + "id": 608, + "name": "ElementaryTypeName", + "src": "8257:7:0" + } + ], + "id": 609, + "name": "VariableDeclaration", + "src": "8257:14:0" + } + ], + "id": 610, + "name": "ParameterList", + "src": "8256:16:0" + }, + { + "children": [ + { + "attributes": { + "constant": false, + "name": "", + "scope": 619, + "stateVariable": false, + "storageLocation": "default", + "type": "bool", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "bool", + "type": "bool" + }, + "id": 611, + "name": "ElementaryTypeName", + "src": "8300:4:0" + } + ], + "id": 612, + "name": "VariableDeclaration", + "src": "8300:4:0" + } + ], + "id": 613, + "name": "ParameterList", + "src": "8299:6:0" + }, + { + "children": [ + { + "attributes": { + "functionReturnParameters": 613 + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "type": "bool" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 631, + "type": "mapping(address => bool)", + "value": "isBlackListed" + }, + "id": 614, + "name": "Identifier", + "src": "8323:13:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 609, + "type": "address", + "value": "_maker" + }, + "id": 615, + "name": "Identifier", + "src": "8337:6:0" + } + ], + "id": 616, + "name": "IndexAccess", + "src": "8323:21:0" + } + ], + "id": 617, + "name": "Return", + "src": "8316:28:0" + } + ], + "id": 618, + "name": "Block", + "src": "8306:45:0" + } + ], + "id": 619, + "name": "FunctionDefinition", + "src": "8229:122:0" + }, + { + "attributes": { + "constant": true, + "implemented": true, + "isConstructor": false, + "modifiers": [ + null + ], + "name": "getOwner", + "payable": false, + "scope": 717, + "stateMutability": "view", + "superFunction": null, + "visibility": "external" + }, + "children": [ + { + "attributes": { + "parameters": [ + null + ] + }, + "children": [], + "id": 620, + "name": "ParameterList", + "src": "8374:2:0" + }, + { + "children": [ + { + "attributes": { + "constant": false, + "name": "", + "scope": 627, + "stateVariable": false, + "storageLocation": "default", + "type": "address", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "address", + "type": "address" + }, + "id": 621, + "name": "ElementaryTypeName", + "src": "8404:7:0" + } + ], + "id": 622, + "name": "VariableDeclaration", + "src": "8404:7:0" + } + ], + "id": 623, + "name": "ParameterList", + "src": "8403:9:0" + }, + { + "children": [ + { + "attributes": { + "functionReturnParameters": 623 + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 99, + "type": "address", + "value": "owner" + }, + "id": 624, + "name": "Identifier", + "src": "8430:5:0" + } + ], + "id": 625, + "name": "Return", + "src": "8423:12:0" + } + ], + "id": 626, + "name": "Block", + "src": "8413:29:0" + } + ], + "id": 627, + "name": "FunctionDefinition", + "src": "8357:85:0" + }, + { + "attributes": { + "constant": false, + "name": "isBlackListed", + "scope": 717, + "stateVariable": true, + "storageLocation": "default", + "type": "mapping(address => bool)", + "value": null, + "visibility": "public" + }, + "children": [ + { + "attributes": { + "type": "mapping(address => bool)" + }, + "children": [ + { + "attributes": { + "name": "address", + "type": "address" + }, + "id": 628, + "name": "ElementaryTypeName", + "src": "8457:7:0" + }, + { + "attributes": { + "name": "bool", + "type": "bool" + }, + "id": 629, + "name": "ElementaryTypeName", + "src": "8468:4:0" + } + ], + "id": 630, + "name": "Mapping", + "src": "8448:25:0" + } + ], + "id": 631, + "name": "VariableDeclaration", + "src": "8448:46:0" + }, + { + "attributes": { + "constant": false, + "implemented": true, + "isConstructor": false, + "name": "addBlackList", + "payable": false, + "scope": 717, + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "public" + }, + "children": [ + { + "children": [ + { + "attributes": { + "constant": false, + "name": "_evilUser", + "scope": 649, + "stateVariable": false, + "storageLocation": "default", + "type": "address", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "address", + "type": "address" + }, + "id": 632, + "name": "ElementaryTypeName", + "src": "8528:7:0" + } + ], + "id": 633, + "name": "VariableDeclaration", + "src": "8528:17:0" + } + ], + "id": 634, + "name": "ParameterList", + "src": "8527:19:0" + }, + { + "attributes": { + "parameters": [ + null + ] + }, + "children": [], + "id": 637, + "name": "ParameterList", + "src": "8564:0:0" + }, + { + "attributes": { + "arguments": [ + null + ] + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 119, + "type": "modifier ()", + "value": "onlyOwner" + }, + "id": 635, + "name": "Identifier", + "src": "8554:9:0" + } + ], + "id": 636, + "name": "ModifierInvocation", + "src": "8554:9:0" + }, + { + "children": [ + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": "=", + "type": "bool" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "type": "bool" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 631, + "type": "mapping(address => bool)", + "value": "isBlackListed" + }, + "id": 638, + "name": "Identifier", + "src": "8574:13:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 633, + "type": "address", + "value": "_evilUser" + }, + "id": 639, + "name": "Identifier", + "src": "8588:9:0" + } + ], + "id": 640, + "name": "IndexAccess", + "src": "8574:24:0" + }, + { + "attributes": { + "argumentTypes": null, + "hexvalue": "74727565", + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "subdenomination": null, + "token": "bool", + "type": "bool", + "value": "true" + }, + "id": 641, + "name": "Literal", + "src": "8601:4:0" + } + ], + "id": 642, + "name": "Assignment", + "src": "8574:31:0" + } + ], + "id": 643, + "name": "ExpressionStatement", + "src": "8574:31:0" + }, + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "isStructConstructorCall": false, + "lValueRequested": false, + "names": [ + null + ], + "type": "tuple()", + "type_conversion": false + }, + "children": [ + { + "attributes": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 712, + "type": "function (address)", + "value": "AddedBlackList" + }, + "id": 644, + "name": "Identifier", + "src": "8615:14:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 633, + "type": "address", + "value": "_evilUser" + }, + "id": 645, + "name": "Identifier", + "src": "8630:9:0" + } + ], + "id": 646, + "name": "FunctionCall", + "src": "8615:25:0" + } + ], + "id": 647, + "name": "ExpressionStatement", + "src": "8615:25:0" + } + ], + "id": 648, + "name": "Block", + "src": "8564:83:0" + } + ], + "id": 649, + "name": "FunctionDefinition", + "src": "8505:142:0" + }, + { + "attributes": { + "constant": false, + "implemented": true, + "isConstructor": false, + "name": "removeBlackList", + "payable": false, + "scope": 717, + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "public" + }, + "children": [ + { + "children": [ + { + "attributes": { + "constant": false, + "name": "_clearedUser", + "scope": 667, + "stateVariable": false, + "storageLocation": "default", + "type": "address", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "address", + "type": "address" + }, + "id": 650, + "name": "ElementaryTypeName", + "src": "8679:7:0" + } + ], + "id": 651, + "name": "VariableDeclaration", + "src": "8679:20:0" + } + ], + "id": 652, + "name": "ParameterList", + "src": "8678:22:0" + }, + { + "attributes": { + "parameters": [ + null + ] + }, + "children": [], + "id": 655, + "name": "ParameterList", + "src": "8718:0:0" + }, + { + "attributes": { + "arguments": [ + null + ] + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 119, + "type": "modifier ()", + "value": "onlyOwner" + }, + "id": 653, + "name": "Identifier", + "src": "8708:9:0" + } + ], + "id": 654, + "name": "ModifierInvocation", + "src": "8708:9:0" + }, + { + "children": [ + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": "=", + "type": "bool" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "type": "bool" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 631, + "type": "mapping(address => bool)", + "value": "isBlackListed" + }, + "id": 656, + "name": "Identifier", + "src": "8728:13:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 651, + "type": "address", + "value": "_clearedUser" + }, + "id": 657, + "name": "Identifier", + "src": "8742:12:0" + } + ], + "id": 658, + "name": "IndexAccess", + "src": "8728:27:0" + }, + { + "attributes": { + "argumentTypes": null, + "hexvalue": "66616c7365", + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "subdenomination": null, + "token": "bool", + "type": "bool", + "value": "false" + }, + "id": 659, + "name": "Literal", + "src": "8758:5:0" + } + ], + "id": 660, + "name": "Assignment", + "src": "8728:35:0" + } + ], + "id": 661, + "name": "ExpressionStatement", + "src": "8728:35:0" + }, + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "isStructConstructorCall": false, + "lValueRequested": false, + "names": [ + null + ], + "type": "tuple()", + "type_conversion": false + }, + "children": [ + { + "attributes": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 716, + "type": "function (address)", + "value": "RemovedBlackList" + }, + "id": 662, + "name": "Identifier", + "src": "8773:16:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 651, + "type": "address", + "value": "_clearedUser" + }, + "id": 663, + "name": "Identifier", + "src": "8790:12:0" + } + ], + "id": 664, + "name": "FunctionCall", + "src": "8773:30:0" + } + ], + "id": 665, + "name": "ExpressionStatement", + "src": "8773:30:0" + } + ], + "id": 666, + "name": "Block", + "src": "8718:92:0" + } + ], + "id": 667, + "name": "FunctionDefinition", + "src": "8653:157:0" + }, + { + "attributes": { + "constant": false, + "implemented": true, + "isConstructor": false, + "name": "destroyBlackFunds", + "payable": false, + "scope": 717, + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "public" + }, + "children": [ + { + "children": [ + { + "attributes": { + "constant": false, + "name": "_blackListedUser", + "scope": 702, + "stateVariable": false, + "storageLocation": "default", + "type": "address", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "address", + "type": "address" + }, + "id": 668, + "name": "ElementaryTypeName", + "src": "8844:7:0" + } + ], + "id": 669, + "name": "VariableDeclaration", + "src": "8844:24:0" + } + ], + "id": 670, + "name": "ParameterList", + "src": "8843:26:0" + }, + { + "attributes": { + "parameters": [ + null + ] + }, + "children": [], + "id": 673, + "name": "ParameterList", + "src": "8887:0:0" + }, + { + "attributes": { + "arguments": [ + null + ] + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 119, + "type": "modifier ()", + "value": "onlyOwner" + }, + "id": 671, + "name": "Identifier", + "src": "8877:9:0" + } + ], + "id": 672, + "name": "ModifierInvocation", + "src": "8877:9:0" + }, + { + "children": [ + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "isStructConstructorCall": false, + "lValueRequested": false, + "names": [ + null + ], + "type": "tuple()", + "type_conversion": false + }, + "children": [ + { + "attributes": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + ], + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1157, + "type": "function (bool) pure", + "value": "require" + }, + "id": 674, + "name": "Identifier", + "src": "8897:7:0" + }, + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "type": "bool" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 631, + "type": "mapping(address => bool)", + "value": "isBlackListed" + }, + "id": 675, + "name": "Identifier", + "src": "8905:13:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 669, + "type": "address", + "value": "_blackListedUser" + }, + "id": 676, + "name": "Identifier", + "src": "8919:16:0" + } + ], + "id": 677, + "name": "IndexAccess", + "src": "8905:31:0" + } + ], + "id": 678, + "name": "FunctionCall", + "src": "8897:40:0" + } + ], + "id": 679, + "name": "ExpressionStatement", + "src": "8897:40:0" + }, + { + "attributes": { + "assignments": [ + 681 + ] + }, + "children": [ + { + "attributes": { + "constant": false, + "name": "dirtyFunds", + "scope": 702, + "stateVariable": false, + "storageLocation": "default", + "type": "uint256", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "uint", + "type": "uint256" + }, + "id": 680, + "name": "ElementaryTypeName", + "src": "8947:4:0" + } + ], + "id": 681, + "name": "VariableDeclaration", + "src": "8947:15:0" + }, + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "isStructConstructorCall": false, + "lValueRequested": false, + "names": [ + null + ], + "type": "uint256", + "type_conversion": false + }, + "children": [ + { + "attributes": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "overloadedDeclarations": [ + 346 + ], + "referencedDeclaration": 346, + "type": "function (address) view returns (uint256)", + "value": "balanceOf" + }, + "id": 682, + "name": "Identifier", + "src": "8965:9:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 669, + "type": "address", + "value": "_blackListedUser" + }, + "id": 683, + "name": "Identifier", + "src": "8975:16:0" + } + ], + "id": 684, + "name": "FunctionCall", + "src": "8965:27:0" + } + ], + "id": 685, + "name": "VariableDeclarationStatement", + "src": "8947:45:0" + }, + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": "=", + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 216, + "type": "mapping(address => uint256)", + "value": "balances" + }, + "id": 686, + "name": "Identifier", + "src": "9002:8:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 669, + "type": "address", + "value": "_blackListedUser" + }, + "id": 687, + "name": "Identifier", + "src": "9011:16:0" + } + ], + "id": 688, + "name": "IndexAccess", + "src": "9002:26:0" + }, + { + "attributes": { + "argumentTypes": null, + "hexvalue": "30", + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "subdenomination": null, + "token": "number", + "type": "int_const 0", + "value": "0" + }, + "id": 689, + "name": "Literal", + "src": "9031:1:0" + } + ], + "id": 690, + "name": "Assignment", + "src": "9002:30:0" + } + ], + "id": 691, + "name": "ExpressionStatement", + "src": "9002:30:0" + }, + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": "-=", + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 141, + "type": "uint256", + "value": "_totalSupply" + }, + "id": 692, + "name": "Identifier", + "src": "9042:12:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 681, + "type": "uint256", + "value": "dirtyFunds" + }, + "id": 693, + "name": "Identifier", + "src": "9058:10:0" + } + ], + "id": 694, + "name": "Assignment", + "src": "9042:26:0" + } + ], + "id": 695, + "name": "ExpressionStatement", + "src": "9042:26:0" + }, + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "isStructConstructorCall": false, + "lValueRequested": false, + "names": [ + null + ], + "type": "tuple()", + "type_conversion": false + }, + "children": [ + { + "attributes": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 708, + "type": "function (address,uint256)", + "value": "DestroyedBlackFunds" + }, + "id": 696, + "name": "Identifier", + "src": "9078:19:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 669, + "type": "address", + "value": "_blackListedUser" + }, + "id": 697, + "name": "Identifier", + "src": "9098:16:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 681, + "type": "uint256", + "value": "dirtyFunds" + }, + "id": 698, + "name": "Identifier", + "src": "9116:10:0" + } + ], + "id": 699, + "name": "FunctionCall", + "src": "9078:49:0" + } + ], + "id": 700, + "name": "ExpressionStatement", + "src": "9078:49:0" + } + ], + "id": 701, + "name": "Block", + "src": "8887:247:0" + } + ], + "id": 702, + "name": "FunctionDefinition", + "src": "8816:318:0" + }, + { + "attributes": { + "anonymous": false, + "name": "DestroyedBlackFunds" + }, + "children": [ + { + "children": [ + { + "attributes": { + "constant": false, + "indexed": false, + "name": "_blackListedUser", + "scope": 708, + "stateVariable": false, + "storageLocation": "default", + "type": "address", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "address", + "type": "address" + }, + "id": 703, + "name": "ElementaryTypeName", + "src": "9166:7:0" + } + ], + "id": 704, + "name": "VariableDeclaration", + "src": "9166:24:0" + }, + { + "attributes": { + "constant": false, + "indexed": false, + "name": "_balance", + "scope": 708, + "stateVariable": false, + "storageLocation": "default", + "type": "uint256", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "uint", + "type": "uint256" + }, + "id": 705, + "name": "ElementaryTypeName", + "src": "9192:4:0" + } + ], + "id": 706, + "name": "VariableDeclaration", + "src": "9192:13:0" + } + ], + "id": 707, + "name": "ParameterList", + "src": "9165:41:0" + } + ], + "id": 708, + "name": "EventDefinition", + "src": "9140:67:0" + }, + { + "attributes": { + "anonymous": false, + "name": "AddedBlackList" + }, + "children": [ + { + "children": [ + { + "attributes": { + "constant": false, + "indexed": false, + "name": "_user", + "scope": 712, + "stateVariable": false, + "storageLocation": "default", + "type": "address", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "address", + "type": "address" + }, + "id": 709, + "name": "ElementaryTypeName", + "src": "9234:7:0" + } + ], + "id": 710, + "name": "VariableDeclaration", + "src": "9234:13:0" + } + ], + "id": 711, + "name": "ParameterList", + "src": "9233:15:0" + } + ], + "id": 712, + "name": "EventDefinition", + "src": "9213:36:0" + }, + { + "attributes": { + "anonymous": false, + "name": "RemovedBlackList" + }, + "children": [ + { + "children": [ + { + "attributes": { + "constant": false, + "indexed": false, + "name": "_user", + "scope": 716, + "stateVariable": false, + "storageLocation": "default", + "type": "address", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "address", + "type": "address" + }, + "id": 713, + "name": "ElementaryTypeName", + "src": "9278:7:0" + } + ], + "id": 714, + "name": "VariableDeclaration", + "src": "9278:13:0" + } + ], + "id": 715, + "name": "ParameterList", + "src": "9277:15:0" + } + ], + "id": 716, + "name": "EventDefinition", + "src": "9255:38:0" + } + ], + "id": 717, + "name": "ContractDefinition", + "src": "8061:1235:0" + }, + { + "attributes": { + "contractDependencies": [ + 347, + 139, + 169, + 205, + 546 + ], + "contractKind": "contract", + "documentation": null, + "fullyImplemented": false, + "linearizedBaseContracts": [ + 749, + 546, + 205, + 347, + 169, + 139 + ], + "name": "UpgradedStandardToken", + "scope": 1143 + }, + "children": [ + { + "attributes": { + "arguments": [ + null + ] + }, + "children": [ + { + "attributes": { + "contractScope": null, + "name": "StandardToken", + "referencedDeclaration": 546, + "type": "contract StandardToken" + }, + "id": 718, + "name": "UserDefinedTypeName", + "src": "9332:13:0" + } + ], + "id": 719, + "name": "InheritanceSpecifier", + "src": "9332:13:0" + }, + { + "attributes": { + "body": null, + "constant": false, + "implemented": false, + "isConstructor": false, + "modifiers": [ + null + ], + "name": "transferByLegacy", + "payable": false, + "scope": 749, + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "public" + }, + "children": [ + { + "children": [ + { + "attributes": { + "constant": false, + "name": "from", + "scope": 728, + "stateVariable": false, + "storageLocation": "default", + "type": "address", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "address", + "type": "address" + }, + "id": 720, + "name": "ElementaryTypeName", + "src": "9498:7:0" + } + ], + "id": 721, + "name": "VariableDeclaration", + "src": "9498:12:0" + }, + { + "attributes": { + "constant": false, + "name": "to", + "scope": 728, + "stateVariable": false, + "storageLocation": "default", + "type": "address", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "address", + "type": "address" + }, + "id": 722, + "name": "ElementaryTypeName", + "src": "9512:7:0" + } + ], + "id": 723, + "name": "VariableDeclaration", + "src": "9512:10:0" + }, + { + "attributes": { + "constant": false, + "name": "value", + "scope": 728, + "stateVariable": false, + "storageLocation": "default", + "type": "uint256", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "uint", + "type": "uint256" + }, + "id": 724, + "name": "ElementaryTypeName", + "src": "9524:4:0" + } + ], + "id": 725, + "name": "VariableDeclaration", + "src": "9524:10:0" + } + ], + "id": 726, + "name": "ParameterList", + "src": "9497:38:0" + }, + { + "attributes": { + "parameters": [ + null + ] + }, + "children": [], + "id": 727, + "name": "ParameterList", + "src": "9542:0:0" + } + ], + "id": 728, + "name": "FunctionDefinition", + "src": "9472:71:0" + }, + { + "attributes": { + "body": null, + "constant": false, + "implemented": false, + "isConstructor": false, + "modifiers": [ + null + ], + "name": "transferFromByLegacy", + "payable": false, + "scope": 749, + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "public" + }, + "children": [ + { + "children": [ + { + "attributes": { + "constant": false, + "name": "sender", + "scope": 739, + "stateVariable": false, + "storageLocation": "default", + "type": "address", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "address", + "type": "address" + }, + "id": 729, + "name": "ElementaryTypeName", + "src": "9578:7:0" + } + ], + "id": 730, + "name": "VariableDeclaration", + "src": "9578:14:0" + }, + { + "attributes": { + "constant": false, + "name": "from", + "scope": 739, + "stateVariable": false, + "storageLocation": "default", + "type": "address", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "address", + "type": "address" + }, + "id": 731, + "name": "ElementaryTypeName", + "src": "9594:7:0" + } + ], + "id": 732, + "name": "VariableDeclaration", + "src": "9594:12:0" + }, + { + "attributes": { + "constant": false, + "name": "spender", + "scope": 739, + "stateVariable": false, + "storageLocation": "default", + "type": "address", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "address", + "type": "address" + }, + "id": 733, + "name": "ElementaryTypeName", + "src": "9608:7:0" + } + ], + "id": 734, + "name": "VariableDeclaration", + "src": "9608:15:0" + }, + { + "attributes": { + "constant": false, + "name": "value", + "scope": 739, + "stateVariable": false, + "storageLocation": "default", + "type": "uint256", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "uint", + "type": "uint256" + }, + "id": 735, + "name": "ElementaryTypeName", + "src": "9625:4:0" + } + ], + "id": 736, + "name": "VariableDeclaration", + "src": "9625:10:0" + } + ], + "id": 737, + "name": "ParameterList", + "src": "9577:59:0" + }, + { + "attributes": { + "parameters": [ + null + ] + }, + "children": [], + "id": 738, + "name": "ParameterList", + "src": "9643:0:0" + } + ], + "id": 739, + "name": "FunctionDefinition", + "src": "9548:96:0" + }, + { + "attributes": { + "body": null, + "constant": false, + "implemented": false, + "isConstructor": false, + "modifiers": [ + null + ], + "name": "approveByLegacy", + "payable": false, + "scope": 749, + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "public" + }, + "children": [ + { + "children": [ + { + "attributes": { + "constant": false, + "name": "from", + "scope": 748, + "stateVariable": false, + "storageLocation": "default", + "type": "address", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "address", + "type": "address" + }, + "id": 740, + "name": "ElementaryTypeName", + "src": "9674:7:0" + } + ], + "id": 741, + "name": "VariableDeclaration", + "src": "9674:12:0" + }, + { + "attributes": { + "constant": false, + "name": "spender", + "scope": 748, + "stateVariable": false, + "storageLocation": "default", + "type": "address", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "address", + "type": "address" + }, + "id": 742, + "name": "ElementaryTypeName", + "src": "9688:7:0" + } + ], + "id": 743, + "name": "VariableDeclaration", + "src": "9688:15:0" + }, + { + "attributes": { + "constant": false, + "name": "value", + "scope": 748, + "stateVariable": false, + "storageLocation": "default", + "type": "uint256", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "uint", + "type": "uint256" + }, + "id": 744, + "name": "ElementaryTypeName", + "src": "9705:4:0" + } + ], + "id": 745, + "name": "VariableDeclaration", + "src": "9705:10:0" + } + ], + "id": 746, + "name": "ParameterList", + "src": "9673:43:0" + }, + { + "attributes": { + "parameters": [ + null + ] + }, + "children": [], + "id": 747, + "name": "ParameterList", + "src": "9723:0:0" + } + ], + "id": 748, + "name": "FunctionDefinition", + "src": "9649:75:0" + } + ], + "id": 749, + "name": "ContractDefinition", + "src": "9298:428:0" + }, + { + "attributes": { + "contractDependencies": [ + 347, + 139, + 169, + 205, + 546, + 603, + 717 + ], + "contractKind": "contract", + "documentation": null, + "fullyImplemented": true, + "linearizedBaseContracts": [ + 1142, + 717, + 546, + 205, + 347, + 169, + 603, + 139 + ], + "name": "TetherToken", + "scope": 1143 + }, + "children": [ + { + "attributes": { + "arguments": [ + null + ] + }, + "children": [ + { + "attributes": { + "contractScope": null, + "name": "Pausable", + "referencedDeclaration": 603, + "type": "contract Pausable" + }, + "id": 750, + "name": "UserDefinedTypeName", + "src": "9752:8:0" + } + ], + "id": 751, + "name": "InheritanceSpecifier", + "src": "9752:8:0" + }, + { + "attributes": { + "arguments": [ + null + ] + }, + "children": [ + { + "attributes": { + "contractScope": null, + "name": "StandardToken", + "referencedDeclaration": 546, + "type": "contract StandardToken" + }, + "id": 752, + "name": "UserDefinedTypeName", + "src": "9762:13:0" + } + ], + "id": 753, + "name": "InheritanceSpecifier", + "src": "9762:13:0" + }, + { + "attributes": { + "arguments": [ + null + ] + }, + "children": [ + { + "attributes": { + "contractScope": null, + "name": "BlackList", + "referencedDeclaration": 717, + "type": "contract BlackList" + }, + "id": 754, + "name": "UserDefinedTypeName", + "src": "9777:9:0" + } + ], + "id": 755, + "name": "InheritanceSpecifier", + "src": "9777:9:0" + }, + { + "attributes": { + "constant": false, + "name": "name", + "scope": 1142, + "stateVariable": true, + "storageLocation": "default", + "type": "string storage ref", + "value": null, + "visibility": "public" + }, + "children": [ + { + "attributes": { + "name": "string", + "type": "string storage pointer" + }, + "id": 756, + "name": "ElementaryTypeName", + "src": "9794:6:0" + } + ], + "id": 757, + "name": "VariableDeclaration", + "src": "9794:18:0" + }, + { + "attributes": { + "constant": false, + "name": "symbol", + "scope": 1142, + "stateVariable": true, + "storageLocation": "default", + "type": "string storage ref", + "value": null, + "visibility": "public" + }, + "children": [ + { + "attributes": { + "name": "string", + "type": "string storage pointer" + }, + "id": 758, + "name": "ElementaryTypeName", + "src": "9818:6:0" + } + ], + "id": 759, + "name": "VariableDeclaration", + "src": "9818:20:0" + }, + { + "attributes": { + "constant": false, + "name": "decimals", + "scope": 1142, + "stateVariable": true, + "storageLocation": "default", + "type": "uint256", + "value": null, + "visibility": "public" + }, + "children": [ + { + "attributes": { + "name": "uint", + "type": "uint256" + }, + "id": 760, + "name": "ElementaryTypeName", + "src": "9844:4:0" + } + ], + "id": 761, + "name": "VariableDeclaration", + "src": "9844:20:0" + }, + { + "attributes": { + "constant": false, + "name": "upgradedAddress", + "scope": 1142, + "stateVariable": true, + "storageLocation": "default", + "type": "address", + "value": null, + "visibility": "public" + }, + "children": [ + { + "attributes": { + "name": "address", + "type": "address" + }, + "id": 762, + "name": "ElementaryTypeName", + "src": "9870:7:0" + } + ], + "id": 763, + "name": "VariableDeclaration", + "src": "9870:30:0" + }, + { + "attributes": { + "constant": false, + "name": "deprecated", + "scope": 1142, + "stateVariable": true, + "storageLocation": "default", + "type": "bool", + "value": null, + "visibility": "public" + }, + "children": [ + { + "attributes": { + "name": "bool", + "type": "bool" + }, + "id": 764, + "name": "ElementaryTypeName", + "src": "9906:4:0" + } + ], + "id": 765, + "name": "VariableDeclaration", + "src": "9906:22:0" + }, + { + "attributes": { + "constant": false, + "implemented": true, + "isConstructor": true, + "modifiers": [ + null + ], + "name": "TetherToken", + "payable": false, + "scope": 1142, + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "public" + }, + "children": [ + { + "children": [ + { + "attributes": { + "constant": false, + "name": "_initialSupply", + "scope": 803, + "stateVariable": false, + "storageLocation": "default", + "type": "uint256", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "uint", + "type": "uint256" + }, + "id": 766, + "name": "ElementaryTypeName", + "src": "10244:4:0" + } + ], + "id": 767, + "name": "VariableDeclaration", + "src": "10244:19:0" + }, + { + "attributes": { + "constant": false, + "name": "_name", + "scope": 803, + "stateVariable": false, + "storageLocation": "default", + "type": "string memory", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "string", + "type": "string storage pointer" + }, + "id": 768, + "name": "ElementaryTypeName", + "src": "10265:6:0" + } + ], + "id": 769, + "name": "VariableDeclaration", + "src": "10265:12:0" + }, + { + "attributes": { + "constant": false, + "name": "_symbol", + "scope": 803, + "stateVariable": false, + "storageLocation": "default", + "type": "string memory", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "string", + "type": "string storage pointer" + }, + "id": 770, + "name": "ElementaryTypeName", + "src": "10279:6:0" + } + ], + "id": 771, + "name": "VariableDeclaration", + "src": "10279:14:0" + }, + { + "attributes": { + "constant": false, + "name": "_decimals", + "scope": 803, + "stateVariable": false, + "storageLocation": "default", + "type": "uint256", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "uint", + "type": "uint256" + }, + "id": 772, + "name": "ElementaryTypeName", + "src": "10295:4:0" + } + ], + "id": 773, + "name": "VariableDeclaration", + "src": "10295:14:0" + } + ], + "id": 774, + "name": "ParameterList", + "src": "10243:67:0" + }, + { + "attributes": { + "parameters": [ + null + ] + }, + "children": [], + "id": 775, + "name": "ParameterList", + "src": "10318:0:0" + }, + { + "children": [ + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": "=", + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 141, + "type": "uint256", + "value": "_totalSupply" + }, + "id": 776, + "name": "Identifier", + "src": "10328:12:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 767, + "type": "uint256", + "value": "_initialSupply" + }, + "id": 777, + "name": "Identifier", + "src": "10343:14:0" + } + ], + "id": 778, + "name": "Assignment", + "src": "10328:29:0" + } + ], + "id": 779, + "name": "ExpressionStatement", + "src": "10328:29:0" + }, + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": "=", + "type": "string storage ref" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 757, + "type": "string storage ref", + "value": "name" + }, + "id": 780, + "name": "Identifier", + "src": "10367:4:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 769, + "type": "string memory", + "value": "_name" + }, + "id": 781, + "name": "Identifier", + "src": "10374:5:0" + } + ], + "id": 782, + "name": "Assignment", + "src": "10367:12:0" + } + ], + "id": 783, + "name": "ExpressionStatement", + "src": "10367:12:0" + }, + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": "=", + "type": "string storage ref" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 759, + "type": "string storage ref", + "value": "symbol" + }, + "id": 784, + "name": "Identifier", + "src": "10389:6:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 771, + "type": "string memory", + "value": "_symbol" + }, + "id": 785, + "name": "Identifier", + "src": "10398:7:0" + } + ], + "id": 786, + "name": "Assignment", + "src": "10389:16:0" + } + ], + "id": 787, + "name": "ExpressionStatement", + "src": "10389:16:0" + }, + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": "=", + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 761, + "type": "uint256", + "value": "decimals" + }, + "id": 788, + "name": "Identifier", + "src": "10415:8:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 773, + "type": "uint256", + "value": "_decimals" + }, + "id": 789, + "name": "Identifier", + "src": "10426:9:0" + } + ], + "id": 790, + "name": "Assignment", + "src": "10415:20:0" + } + ], + "id": 791, + "name": "ExpressionStatement", + "src": "10415:20:0" + }, + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": "=", + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 216, + "type": "mapping(address => uint256)", + "value": "balances" + }, + "id": 792, + "name": "Identifier", + "src": "10445:8:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 99, + "type": "address", + "value": "owner" + }, + "id": 793, + "name": "Identifier", + "src": "10454:5:0" + } + ], + "id": 794, + "name": "IndexAccess", + "src": "10445:15:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 767, + "type": "uint256", + "value": "_initialSupply" + }, + "id": 795, + "name": "Identifier", + "src": "10463:14:0" + } + ], + "id": 796, + "name": "Assignment", + "src": "10445:32:0" + } + ], + "id": 797, + "name": "ExpressionStatement", + "src": "10445:32:0" + }, + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": "=", + "type": "bool" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 765, + "type": "bool", + "value": "deprecated" + }, + "id": 798, + "name": "Identifier", + "src": "10487:10:0" + }, + { + "attributes": { + "argumentTypes": null, + "hexvalue": "66616c7365", + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "subdenomination": null, + "token": "bool", + "type": "bool", + "value": "false" + }, + "id": 799, + "name": "Literal", + "src": "10500:5:0" + } + ], + "id": 800, + "name": "Assignment", + "src": "10487:18:0" + } + ], + "id": 801, + "name": "ExpressionStatement", + "src": "10487:18:0" + } + ], + "id": 802, + "name": "Block", + "src": "10318:194:0" + } + ], + "id": 803, + "name": "FunctionDefinition", + "src": "10223:289:0" + }, + { + "attributes": { + "constant": false, + "implemented": true, + "isConstructor": false, + "name": "transfer", + "payable": false, + "scope": 1142, + "stateMutability": "nonpayable", + "superFunction": 334, + "visibility": "public" + }, + "children": [ + { + "children": [ + { + "attributes": { + "constant": false, + "name": "_to", + "scope": 841, + "stateVariable": false, + "storageLocation": "default", + "type": "address", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "address", + "type": "address" + }, + "id": 804, + "name": "ElementaryTypeName", + "src": "10612:7:0" + } + ], + "id": 805, + "name": "VariableDeclaration", + "src": "10612:11:0" + }, + { + "attributes": { + "constant": false, + "name": "_value", + "scope": 841, + "stateVariable": false, + "storageLocation": "default", + "type": "uint256", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "uint", + "type": "uint256" + }, + "id": 806, + "name": "ElementaryTypeName", + "src": "10625:4:0" + } + ], + "id": 807, + "name": "VariableDeclaration", + "src": "10625:11:0" + } + ], + "id": 808, + "name": "ParameterList", + "src": "10611:26:0" + }, + { + "attributes": { + "parameters": [ + null + ] + }, + "children": [], + "id": 811, + "name": "ParameterList", + "src": "10659:0:0" + }, + { + "attributes": { + "arguments": [ + null + ] + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 564, + "type": "modifier ()", + "value": "whenNotPaused" + }, + "id": 809, + "name": "Identifier", + "src": "10645:13:0" + } + ], + "id": 810, + "name": "ModifierInvocation", + "src": "10645:13:0" + }, + { + "children": [ + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "isStructConstructorCall": false, + "lValueRequested": false, + "names": [ + null + ], + "type": "tuple()", + "type_conversion": false + }, + "children": [ + { + "attributes": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + ], + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1157, + "type": "function (bool) pure", + "value": "require" + }, + "id": 812, + "name": "Identifier", + "src": "10669:7:0" + }, + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": "!", + "prefix": true, + "type": "bool" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "type": "bool" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 631, + "type": "mapping(address => bool)", + "value": "isBlackListed" + }, + "id": 813, + "name": "Identifier", + "src": "10678:13:0" + }, + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "member_name": "sender", + "referencedDeclaration": null, + "type": "address" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1154, + "type": "msg", + "value": "msg" + }, + "id": 814, + "name": "Identifier", + "src": "10692:3:0" + } + ], + "id": 815, + "name": "MemberAccess", + "src": "10692:10:0" + } + ], + "id": 816, + "name": "IndexAccess", + "src": "10678:25:0" + } + ], + "id": 817, + "name": "UnaryOperation", + "src": "10677:26:0" + } + ], + "id": 818, + "name": "FunctionCall", + "src": "10669:35:0" + } + ], + "id": 819, + "name": "ExpressionStatement", + "src": "10669:35:0" + }, + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 765, + "type": "bool", + "value": "deprecated" + }, + "id": 820, + "name": "Identifier", + "src": "10718:10:0" + }, + { + "children": [ + { + "attributes": { + "functionReturnParameters": 811 + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "isStructConstructorCall": false, + "lValueRequested": false, + "names": [ + null + ], + "type": "tuple()", + "type_conversion": false + }, + "children": [ + { + "attributes": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "member_name": "transferByLegacy", + "referencedDeclaration": 728, + "type": "function (address,address,uint256) external" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "isStructConstructorCall": false, + "lValueRequested": false, + "names": [ + null + ], + "type": "contract UpgradedStandardToken", + "type_conversion": true + }, + "children": [ + { + "attributes": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 749, + "type": "type(contract UpgradedStandardToken)", + "value": "UpgradedStandardToken" + }, + "id": 821, + "name": "Identifier", + "src": "10751:21:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 763, + "type": "address", + "value": "upgradedAddress" + }, + "id": 822, + "name": "Identifier", + "src": "10773:15:0" + } + ], + "id": 823, + "name": "FunctionCall", + "src": "10751:38:0" + } + ], + "id": 824, + "name": "MemberAccess", + "src": "10751:55:0" + }, + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "member_name": "sender", + "referencedDeclaration": null, + "type": "address" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1154, + "type": "msg", + "value": "msg" + }, + "id": 825, + "name": "Identifier", + "src": "10807:3:0" + } + ], + "id": 826, + "name": "MemberAccess", + "src": "10807:10:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 805, + "type": "address", + "value": "_to" + }, + "id": 827, + "name": "Identifier", + "src": "10819:3:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 807, + "type": "uint256", + "value": "_value" + }, + "id": 828, + "name": "Identifier", + "src": "10824:6:0" + } + ], + "id": 829, + "name": "FunctionCall", + "src": "10751:80:0" + } + ], + "id": 830, + "name": "Return", + "src": "10744:87:0" + } + ], + "id": 831, + "name": "Block", + "src": "10730:112:0" + }, + { + "children": [ + { + "attributes": { + "functionReturnParameters": 811 + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "isStructConstructorCall": false, + "lValueRequested": false, + "names": [ + null + ], + "type": "tuple()", + "type_conversion": false + }, + "children": [ + { + "attributes": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "member_name": "transfer", + "referencedDeclaration": 334, + "type": "function (address,uint256)" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1184, + "type": "contract super TetherToken", + "value": "super" + }, + "id": 832, + "name": "Identifier", + "src": "10869:5:0" + } + ], + "id": 833, + "name": "MemberAccess", + "src": "10869:14:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 805, + "type": "address", + "value": "_to" + }, + "id": 834, + "name": "Identifier", + "src": "10884:3:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 807, + "type": "uint256", + "value": "_value" + }, + "id": 835, + "name": "Identifier", + "src": "10889:6:0" + } + ], + "id": 836, + "name": "FunctionCall", + "src": "10869:27:0" + } + ], + "id": 837, + "name": "Return", + "src": "10862:34:0" + } + ], + "id": 838, + "name": "Block", + "src": "10848:59:0" + } + ], + "id": 839, + "name": "IfStatement", + "src": "10714:193:0" + } + ], + "id": 840, + "name": "Block", + "src": "10659:254:0" + } + ], + "id": 841, + "name": "FunctionDefinition", + "src": "10594:319:0" + }, + { + "attributes": { + "constant": false, + "implemented": true, + "isConstructor": false, + "name": "transferFrom", + "payable": false, + "scope": 1142, + "stateMutability": "nonpayable", + "superFunction": 481, + "visibility": "public" + }, + "children": [ + { + "children": [ + { + "attributes": { + "constant": false, + "name": "_from", + "scope": 882, + "stateVariable": false, + "storageLocation": "default", + "type": "address", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "address", + "type": "address" + }, + "id": 842, + "name": "ElementaryTypeName", + "src": "11017:7:0" + } + ], + "id": 843, + "name": "VariableDeclaration", + "src": "11017:13:0" + }, + { + "attributes": { + "constant": false, + "name": "_to", + "scope": 882, + "stateVariable": false, + "storageLocation": "default", + "type": "address", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "address", + "type": "address" + }, + "id": 844, + "name": "ElementaryTypeName", + "src": "11032:7:0" + } + ], + "id": 845, + "name": "VariableDeclaration", + "src": "11032:11:0" + }, + { + "attributes": { + "constant": false, + "name": "_value", + "scope": 882, + "stateVariable": false, + "storageLocation": "default", + "type": "uint256", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "uint", + "type": "uint256" + }, + "id": 846, + "name": "ElementaryTypeName", + "src": "11045:4:0" + } + ], + "id": 847, + "name": "VariableDeclaration", + "src": "11045:11:0" + } + ], + "id": 848, + "name": "ParameterList", + "src": "11016:41:0" + }, + { + "attributes": { + "parameters": [ + null + ] + }, + "children": [], + "id": 851, + "name": "ParameterList", + "src": "11079:0:0" + }, + { + "attributes": { + "arguments": [ + null + ] + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 564, + "type": "modifier ()", + "value": "whenNotPaused" + }, + "id": 849, + "name": "Identifier", + "src": "11065:13:0" + } + ], + "id": 850, + "name": "ModifierInvocation", + "src": "11065:13:0" + }, + { + "children": [ + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "isStructConstructorCall": false, + "lValueRequested": false, + "names": [ + null + ], + "type": "tuple()", + "type_conversion": false + }, + "children": [ + { + "attributes": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + ], + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1157, + "type": "function (bool) pure", + "value": "require" + }, + "id": 852, + "name": "Identifier", + "src": "11089:7:0" + }, + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": "!", + "prefix": true, + "type": "bool" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "type": "bool" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 631, + "type": "mapping(address => bool)", + "value": "isBlackListed" + }, + "id": 853, + "name": "Identifier", + "src": "11098:13:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 843, + "type": "address", + "value": "_from" + }, + "id": 854, + "name": "Identifier", + "src": "11112:5:0" + } + ], + "id": 855, + "name": "IndexAccess", + "src": "11098:20:0" + } + ], + "id": 856, + "name": "UnaryOperation", + "src": "11097:21:0" + } + ], + "id": 857, + "name": "FunctionCall", + "src": "11089:30:0" + } + ], + "id": 858, + "name": "ExpressionStatement", + "src": "11089:30:0" + }, + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 765, + "type": "bool", + "value": "deprecated" + }, + "id": 859, + "name": "Identifier", + "src": "11133:10:0" + }, + { + "children": [ + { + "attributes": { + "functionReturnParameters": 851 + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "isStructConstructorCall": false, + "lValueRequested": false, + "names": [ + null + ], + "type": "tuple()", + "type_conversion": false + }, + "children": [ + { + "attributes": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "member_name": "transferFromByLegacy", + "referencedDeclaration": 739, + "type": "function (address,address,address,uint256) external" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "isStructConstructorCall": false, + "lValueRequested": false, + "names": [ + null + ], + "type": "contract UpgradedStandardToken", + "type_conversion": true + }, + "children": [ + { + "attributes": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 749, + "type": "type(contract UpgradedStandardToken)", + "value": "UpgradedStandardToken" + }, + "id": 860, + "name": "Identifier", + "src": "11166:21:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 763, + "type": "address", + "value": "upgradedAddress" + }, + "id": 861, + "name": "Identifier", + "src": "11188:15:0" + } + ], + "id": 862, + "name": "FunctionCall", + "src": "11166:38:0" + } + ], + "id": 863, + "name": "MemberAccess", + "src": "11166:59:0" + }, + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "member_name": "sender", + "referencedDeclaration": null, + "type": "address" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1154, + "type": "msg", + "value": "msg" + }, + "id": 864, + "name": "Identifier", + "src": "11226:3:0" + } + ], + "id": 865, + "name": "MemberAccess", + "src": "11226:10:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 843, + "type": "address", + "value": "_from" + }, + "id": 866, + "name": "Identifier", + "src": "11238:5:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 845, + "type": "address", + "value": "_to" + }, + "id": 867, + "name": "Identifier", + "src": "11245:3:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 847, + "type": "uint256", + "value": "_value" + }, + "id": 868, + "name": "Identifier", + "src": "11250:6:0" + } + ], + "id": 869, + "name": "FunctionCall", + "src": "11166:91:0" + } + ], + "id": 870, + "name": "Return", + "src": "11159:98:0" + } + ], + "id": 871, + "name": "Block", + "src": "11145:123:0" + }, + { + "children": [ + { + "attributes": { + "functionReturnParameters": 851 + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "isStructConstructorCall": false, + "lValueRequested": false, + "names": [ + null + ], + "type": "tuple()", + "type_conversion": false + }, + "children": [ + { + "attributes": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "member_name": "transferFrom", + "referencedDeclaration": 481, + "type": "function (address,address,uint256)" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1184, + "type": "contract super TetherToken", + "value": "super" + }, + "id": 872, + "name": "Identifier", + "src": "11295:5:0" + } + ], + "id": 873, + "name": "MemberAccess", + "src": "11295:18:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 843, + "type": "address", + "value": "_from" + }, + "id": 874, + "name": "Identifier", + "src": "11314:5:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 845, + "type": "address", + "value": "_to" + }, + "id": 875, + "name": "Identifier", + "src": "11321:3:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 847, + "type": "uint256", + "value": "_value" + }, + "id": 876, + "name": "Identifier", + "src": "11326:6:0" + } + ], + "id": 877, + "name": "FunctionCall", + "src": "11295:38:0" + } + ], + "id": 878, + "name": "Return", + "src": "11288:45:0" + } + ], + "id": 879, + "name": "Block", + "src": "11274:70:0" + } + ], + "id": 880, + "name": "IfStatement", + "src": "11129:215:0" + } + ], + "id": 881, + "name": "Block", + "src": "11079:271:0" + } + ], + "id": 882, + "name": "FunctionDefinition", + "src": "10995:355:0" + }, + { + "attributes": { + "constant": true, + "implemented": true, + "isConstructor": false, + "modifiers": [ + null + ], + "name": "balanceOf", + "payable": false, + "scope": 1142, + "stateMutability": "view", + "superFunction": 346, + "visibility": "public" + }, + "children": [ + { + "children": [ + { + "attributes": { + "constant": false, + "name": "who", + "scope": 906, + "stateVariable": false, + "storageLocation": "default", + "type": "address", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "address", + "type": "address" + }, + "id": 883, + "name": "ElementaryTypeName", + "src": "11451:7:0" + } + ], + "id": 884, + "name": "VariableDeclaration", + "src": "11451:11:0" + } + ], + "id": 885, + "name": "ParameterList", + "src": "11450:13:0" + }, + { + "children": [ + { + "attributes": { + "constant": false, + "name": "", + "scope": 906, + "stateVariable": false, + "storageLocation": "default", + "type": "uint256", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "uint", + "type": "uint256" + }, + "id": 886, + "name": "ElementaryTypeName", + "src": "11489:4:0" + } + ], + "id": 887, + "name": "VariableDeclaration", + "src": "11489:4:0" + } + ], + "id": 888, + "name": "ParameterList", + "src": "11488:6:0" + }, + { + "children": [ + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 765, + "type": "bool", + "value": "deprecated" + }, + "id": 889, + "name": "Identifier", + "src": "11509:10:0" + }, + { + "children": [ + { + "attributes": { + "functionReturnParameters": 888 + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "isStructConstructorCall": false, + "lValueRequested": false, + "names": [ + null + ], + "type": "uint256", + "type_conversion": false + }, + "children": [ + { + "attributes": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "member_name": "balanceOf", + "referencedDeclaration": 346, + "type": "function (address) view external returns (uint256)" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "isStructConstructorCall": false, + "lValueRequested": false, + "names": [ + null + ], + "type": "contract UpgradedStandardToken", + "type_conversion": true + }, + "children": [ + { + "attributes": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 749, + "type": "type(contract UpgradedStandardToken)", + "value": "UpgradedStandardToken" + }, + "id": 890, + "name": "Identifier", + "src": "11542:21:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 763, + "type": "address", + "value": "upgradedAddress" + }, + "id": 891, + "name": "Identifier", + "src": "11564:15:0" + } + ], + "id": 892, + "name": "FunctionCall", + "src": "11542:38:0" + } + ], + "id": 893, + "name": "MemberAccess", + "src": "11542:48:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 884, + "type": "address", + "value": "who" + }, + "id": 894, + "name": "Identifier", + "src": "11591:3:0" + } + ], + "id": 895, + "name": "FunctionCall", + "src": "11542:53:0" + } + ], + "id": 896, + "name": "Return", + "src": "11535:60:0" + } + ], + "id": 897, + "name": "Block", + "src": "11521:85:0" + }, + { + "children": [ + { + "attributes": { + "functionReturnParameters": 888 + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "isStructConstructorCall": false, + "lValueRequested": false, + "names": [ + null + ], + "type": "uint256", + "type_conversion": false + }, + "children": [ + { + "attributes": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "member_name": "balanceOf", + "referencedDeclaration": 346, + "type": "function (address) view returns (uint256)" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1184, + "type": "contract super TetherToken", + "value": "super" + }, + "id": 898, + "name": "Identifier", + "src": "11633:5:0" + } + ], + "id": 899, + "name": "MemberAccess", + "src": "11633:15:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 884, + "type": "address", + "value": "who" + }, + "id": 900, + "name": "Identifier", + "src": "11649:3:0" + } + ], + "id": 901, + "name": "FunctionCall", + "src": "11633:20:0" + } + ], + "id": 902, + "name": "Return", + "src": "11626:27:0" + } + ], + "id": 903, + "name": "Block", + "src": "11612:52:0" + } + ], + "id": 904, + "name": "IfStatement", + "src": "11505:159:0" + } + ], + "id": 905, + "name": "Block", + "src": "11495:175:0" + } + ], + "id": 906, + "name": "FunctionDefinition", + "src": "11432:238:0" + }, + { + "attributes": { + "constant": false, + "implemented": true, + "isConstructor": false, + "name": "approve", + "payable": false, + "scope": 1142, + "stateMutability": "nonpayable", + "superFunction": 529, + "visibility": "public" + }, + "children": [ + { + "children": [ + { + "attributes": { + "constant": false, + "name": "_spender", + "scope": 939, + "stateVariable": false, + "storageLocation": "default", + "type": "address", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "address", + "type": "address" + }, + "id": 907, + "name": "ElementaryTypeName", + "src": "11769:7:0" + } + ], + "id": 908, + "name": "VariableDeclaration", + "src": "11769:16:0" + }, + { + "attributes": { + "constant": false, + "name": "_value", + "scope": 939, + "stateVariable": false, + "storageLocation": "default", + "type": "uint256", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "uint", + "type": "uint256" + }, + "id": 909, + "name": "ElementaryTypeName", + "src": "11787:4:0" + } + ], + "id": 910, + "name": "VariableDeclaration", + "src": "11787:11:0" + } + ], + "id": 911, + "name": "ParameterList", + "src": "11768:31:0" + }, + { + "attributes": { + "parameters": [ + null + ] + }, + "children": [], + "id": 917, + "name": "ParameterList", + "src": "11831:0:0" + }, + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 240, + "type": "modifier (uint256)", + "value": "onlyPayloadSize" + }, + "id": 912, + "name": "Identifier", + "src": "11807:15:0" + }, + { + "attributes": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_rational_64_by_1", + "typeString": "int_const 64" + }, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "operator": "*", + "type": "int_const 64" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "hexvalue": "32", + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "subdenomination": null, + "token": "number", + "type": "int_const 2", + "value": "2" + }, + "id": 913, + "name": "Literal", + "src": "11823:1:0" + }, + { + "attributes": { + "argumentTypes": null, + "hexvalue": "3332", + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "subdenomination": null, + "token": "number", + "type": "int_const 32", + "value": "32" + }, + "id": 914, + "name": "Literal", + "src": "11827:2:0" + } + ], + "id": 915, + "name": "BinaryOperation", + "src": "11823:6:0" + } + ], + "id": 916, + "name": "ModifierInvocation", + "src": "11807:23:0" + }, + { + "children": [ + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 765, + "type": "bool", + "value": "deprecated" + }, + "id": 918, + "name": "Identifier", + "src": "11845:10:0" + }, + { + "children": [ + { + "attributes": { + "functionReturnParameters": 917 + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "isStructConstructorCall": false, + "lValueRequested": false, + "names": [ + null + ], + "type": "tuple()", + "type_conversion": false + }, + "children": [ + { + "attributes": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "member_name": "approveByLegacy", + "referencedDeclaration": 748, + "type": "function (address,address,uint256) external" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "isStructConstructorCall": false, + "lValueRequested": false, + "names": [ + null + ], + "type": "contract UpgradedStandardToken", + "type_conversion": true + }, + "children": [ + { + "attributes": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 749, + "type": "type(contract UpgradedStandardToken)", + "value": "UpgradedStandardToken" + }, + "id": 919, + "name": "Identifier", + "src": "11878:21:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 763, + "type": "address", + "value": "upgradedAddress" + }, + "id": 920, + "name": "Identifier", + "src": "11900:15:0" + } + ], + "id": 921, + "name": "FunctionCall", + "src": "11878:38:0" + } + ], + "id": 922, + "name": "MemberAccess", + "src": "11878:54:0" + }, + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "member_name": "sender", + "referencedDeclaration": null, + "type": "address" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1154, + "type": "msg", + "value": "msg" + }, + "id": 923, + "name": "Identifier", + "src": "11933:3:0" + } + ], + "id": 924, + "name": "MemberAccess", + "src": "11933:10:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 908, + "type": "address", + "value": "_spender" + }, + "id": 925, + "name": "Identifier", + "src": "11945:8:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 910, + "type": "uint256", + "value": "_value" + }, + "id": 926, + "name": "Identifier", + "src": "11955:6:0" + } + ], + "id": 927, + "name": "FunctionCall", + "src": "11878:84:0" + } + ], + "id": 928, + "name": "Return", + "src": "11871:91:0" + } + ], + "id": 929, + "name": "Block", + "src": "11857:116:0" + }, + { + "children": [ + { + "attributes": { + "functionReturnParameters": 917 + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "isStructConstructorCall": false, + "lValueRequested": false, + "names": [ + null + ], + "type": "tuple()", + "type_conversion": false + }, + "children": [ + { + "attributes": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "member_name": "approve", + "referencedDeclaration": 529, + "type": "function (address,uint256)" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1184, + "type": "contract super TetherToken", + "value": "super" + }, + "id": 930, + "name": "Identifier", + "src": "12000:5:0" + } + ], + "id": 931, + "name": "MemberAccess", + "src": "12000:13:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 908, + "type": "address", + "value": "_spender" + }, + "id": 932, + "name": "Identifier", + "src": "12014:8:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 910, + "type": "uint256", + "value": "_value" + }, + "id": 933, + "name": "Identifier", + "src": "12024:6:0" + } + ], + "id": 934, + "name": "FunctionCall", + "src": "12000:31:0" + } + ], + "id": 935, + "name": "Return", + "src": "11993:38:0" + } + ], + "id": 936, + "name": "Block", + "src": "11979:63:0" + } + ], + "id": 937, + "name": "IfStatement", + "src": "11841:201:0" + } + ], + "id": 938, + "name": "Block", + "src": "11831:217:0" + } + ], + "id": 939, + "name": "FunctionDefinition", + "src": "11752:296:0" + }, + { + "attributes": { + "constant": true, + "implemented": true, + "isConstructor": false, + "modifiers": [ + null + ], + "name": "allowance", + "payable": false, + "scope": 1142, + "stateMutability": "view", + "superFunction": 545, + "visibility": "public" + }, + "children": [ + { + "children": [ + { + "attributes": { + "constant": false, + "name": "_owner", + "scope": 967, + "stateVariable": false, + "storageLocation": "default", + "type": "address", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "address", + "type": "address" + }, + "id": 940, + "name": "ElementaryTypeName", + "src": "12149:7:0" + } + ], + "id": 941, + "name": "VariableDeclaration", + "src": "12149:14:0" + }, + { + "attributes": { + "constant": false, + "name": "_spender", + "scope": 967, + "stateVariable": false, + "storageLocation": "default", + "type": "address", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "address", + "type": "address" + }, + "id": 942, + "name": "ElementaryTypeName", + "src": "12165:7:0" + } + ], + "id": 943, + "name": "VariableDeclaration", + "src": "12165:16:0" + } + ], + "id": 944, + "name": "ParameterList", + "src": "12148:34:0" + }, + { + "children": [ + { + "attributes": { + "constant": false, + "name": "remaining", + "scope": 967, + "stateVariable": false, + "storageLocation": "default", + "type": "uint256", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "uint", + "type": "uint256" + }, + "id": 945, + "name": "ElementaryTypeName", + "src": "12208:4:0" + } + ], + "id": 946, + "name": "VariableDeclaration", + "src": "12208:14:0" + } + ], + "id": 947, + "name": "ParameterList", + "src": "12207:16:0" + }, + { + "children": [ + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 765, + "type": "bool", + "value": "deprecated" + }, + "id": 948, + "name": "Identifier", + "src": "12238:10:0" + }, + { + "children": [ + { + "attributes": { + "functionReturnParameters": 947 + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "isStructConstructorCall": false, + "lValueRequested": false, + "names": [ + null + ], + "type": "uint256", + "type_conversion": false + }, + "children": [ + { + "attributes": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "member_name": "allowance", + "referencedDeclaration": 545, + "type": "function (address,address) view external returns (uint256)" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "isStructConstructorCall": false, + "lValueRequested": false, + "names": [ + null + ], + "type": "contract StandardToken", + "type_conversion": true + }, + "children": [ + { + "attributes": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 546, + "type": "type(contract StandardToken)", + "value": "StandardToken" + }, + "id": 949, + "name": "Identifier", + "src": "12271:13:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 763, + "type": "address", + "value": "upgradedAddress" + }, + "id": 950, + "name": "Identifier", + "src": "12285:15:0" + } + ], + "id": 951, + "name": "FunctionCall", + "src": "12271:30:0" + } + ], + "id": 952, + "name": "MemberAccess", + "src": "12271:40:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 941, + "type": "address", + "value": "_owner" + }, + "id": 953, + "name": "Identifier", + "src": "12312:6:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 943, + "type": "address", + "value": "_spender" + }, + "id": 954, + "name": "Identifier", + "src": "12320:8:0" + } + ], + "id": 955, + "name": "FunctionCall", + "src": "12271:58:0" + } + ], + "id": 956, + "name": "Return", + "src": "12264:65:0" + } + ], + "id": 957, + "name": "Block", + "src": "12250:90:0" + }, + { + "children": [ + { + "attributes": { + "functionReturnParameters": 947 + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "isStructConstructorCall": false, + "lValueRequested": false, + "names": [ + null + ], + "type": "uint256", + "type_conversion": false + }, + "children": [ + { + "attributes": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "member_name": "allowance", + "referencedDeclaration": 545, + "type": "function (address,address) view returns (uint256)" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1184, + "type": "contract super TetherToken", + "value": "super" + }, + "id": 958, + "name": "Identifier", + "src": "12367:5:0" + } + ], + "id": 959, + "name": "MemberAccess", + "src": "12367:15:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 941, + "type": "address", + "value": "_owner" + }, + "id": 960, + "name": "Identifier", + "src": "12383:6:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 943, + "type": "address", + "value": "_spender" + }, + "id": 961, + "name": "Identifier", + "src": "12391:8:0" + } + ], + "id": 962, + "name": "FunctionCall", + "src": "12367:33:0" + } + ], + "id": 963, + "name": "Return", + "src": "12360:40:0" + } + ], + "id": 964, + "name": "Block", + "src": "12346:65:0" + } + ], + "id": 965, + "name": "IfStatement", + "src": "12234:177:0" + } + ], + "id": 966, + "name": "Block", + "src": "12224:193:0" + } + ], + "id": 967, + "name": "FunctionDefinition", + "src": "12130:287:0" + }, + { + "attributes": { + "constant": false, + "implemented": true, + "isConstructor": false, + "name": "deprecate", + "payable": false, + "scope": 1142, + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "public" + }, + "children": [ + { + "children": [ + { + "attributes": { + "constant": false, + "name": "_upgradedAddress", + "scope": 987, + "stateVariable": false, + "storageLocation": "default", + "type": "address", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "address", + "type": "address" + }, + "id": 968, + "name": "ElementaryTypeName", + "src": "12499:7:0" + } + ], + "id": 969, + "name": "VariableDeclaration", + "src": "12499:24:0" + } + ], + "id": 970, + "name": "ParameterList", + "src": "12498:26:0" + }, + { + "attributes": { + "parameters": [ + null + ] + }, + "children": [], + "id": 973, + "name": "ParameterList", + "src": "12542:0:0" + }, + { + "attributes": { + "arguments": [ + null + ] + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 119, + "type": "modifier ()", + "value": "onlyOwner" + }, + "id": 971, + "name": "Identifier", + "src": "12532:9:0" + } + ], + "id": 972, + "name": "ModifierInvocation", + "src": "12532:9:0" + }, + { + "children": [ + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": "=", + "type": "bool" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 765, + "type": "bool", + "value": "deprecated" + }, + "id": 974, + "name": "Identifier", + "src": "12552:10:0" + }, + { + "attributes": { + "argumentTypes": null, + "hexvalue": "74727565", + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "subdenomination": null, + "token": "bool", + "type": "bool", + "value": "true" + }, + "id": 975, + "name": "Literal", + "src": "12565:4:0" + } + ], + "id": 976, + "name": "Assignment", + "src": "12552:17:0" + } + ], + "id": 977, + "name": "ExpressionStatement", + "src": "12552:17:0" + }, + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": "=", + "type": "address" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 763, + "type": "address", + "value": "upgradedAddress" + }, + "id": 978, + "name": "Identifier", + "src": "12579:15:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 969, + "type": "address", + "value": "_upgradedAddress" + }, + "id": 979, + "name": "Identifier", + "src": "12597:16:0" + } + ], + "id": 980, + "name": "Assignment", + "src": "12579:34:0" + } + ], + "id": 981, + "name": "ExpressionStatement", + "src": "12579:34:0" + }, + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "isStructConstructorCall": false, + "lValueRequested": false, + "names": [ + null + ], + "type": "tuple()", + "type_conversion": false + }, + "children": [ + { + "attributes": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1135, + "type": "function (address)", + "value": "Deprecate" + }, + "id": 982, + "name": "Identifier", + "src": "12623:9:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 969, + "type": "address", + "value": "_upgradedAddress" + }, + "id": 983, + "name": "Identifier", + "src": "12633:16:0" + } + ], + "id": 984, + "name": "FunctionCall", + "src": "12623:27:0" + } + ], + "id": 985, + "name": "ExpressionStatement", + "src": "12623:27:0" + } + ], + "id": 986, + "name": "Block", + "src": "12542:115:0" + } + ], + "id": 987, + "name": "FunctionDefinition", + "src": "12480:177:0" + }, + { + "attributes": { + "constant": true, + "implemented": true, + "isConstructor": false, + "modifiers": [ + null + ], + "name": "totalSupply", + "payable": false, + "scope": 1142, + "stateMutability": "view", + "superFunction": 146, + "visibility": "public" + }, + "children": [ + { + "attributes": { + "parameters": [ + null + ] + }, + "children": [], + "id": 988, + "name": "ParameterList", + "src": "12740:2:0" + }, + { + "children": [ + { + "attributes": { + "constant": false, + "name": "", + "scope": 1005, + "stateVariable": false, + "storageLocation": "default", + "type": "uint256", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "uint", + "type": "uint256" + }, + "id": 989, + "name": "ElementaryTypeName", + "src": "12768:4:0" + } + ], + "id": 990, + "name": "VariableDeclaration", + "src": "12768:4:0" + } + ], + "id": 991, + "name": "ParameterList", + "src": "12767:6:0" + }, + { + "children": [ + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 765, + "type": "bool", + "value": "deprecated" + }, + "id": 992, + "name": "Identifier", + "src": "12788:10:0" + }, + { + "children": [ + { + "attributes": { + "functionReturnParameters": 991 + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "arguments": [ + null + ], + "isConstant": false, + "isLValue": false, + "isPure": false, + "isStructConstructorCall": false, + "lValueRequested": false, + "names": [ + null + ], + "type": "uint256", + "type_conversion": false + }, + "children": [ + { + "attributes": { + "argumentTypes": [ + null + ], + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "member_name": "totalSupply", + "referencedDeclaration": 146, + "type": "function () view external returns (uint256)" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "isStructConstructorCall": false, + "lValueRequested": false, + "names": [ + null + ], + "type": "contract StandardToken", + "type_conversion": true + }, + "children": [ + { + "attributes": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 546, + "type": "type(contract StandardToken)", + "value": "StandardToken" + }, + "id": 993, + "name": "Identifier", + "src": "12821:13:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 763, + "type": "address", + "value": "upgradedAddress" + }, + "id": 994, + "name": "Identifier", + "src": "12835:15:0" + } + ], + "id": 995, + "name": "FunctionCall", + "src": "12821:30:0" + } + ], + "id": 996, + "name": "MemberAccess", + "src": "12821:42:0" + } + ], + "id": 997, + "name": "FunctionCall", + "src": "12821:44:0" + } + ], + "id": 998, + "name": "Return", + "src": "12814:51:0" + } + ], + "id": 999, + "name": "Block", + "src": "12800:76:0" + }, + { + "children": [ + { + "attributes": { + "functionReturnParameters": 991 + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 141, + "type": "uint256", + "value": "_totalSupply" + }, + "id": 1000, + "name": "Identifier", + "src": "12903:12:0" + } + ], + "id": 1001, + "name": "Return", + "src": "12896:19:0" + } + ], + "id": 1002, + "name": "Block", + "src": "12882:44:0" + } + ], + "id": 1003, + "name": "IfStatement", + "src": "12784:142:0" + } + ], + "id": 1004, + "name": "Block", + "src": "12774:158:0" + } + ], + "id": 1005, + "name": "FunctionDefinition", + "src": "12720:212:0" + }, + { + "attributes": { + "constant": false, + "implemented": true, + "isConstructor": false, + "name": "issue", + "payable": false, + "scope": 1142, + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "public" + }, + "children": [ + { + "children": [ + { + "attributes": { + "constant": false, + "name": "amount", + "scope": 1047, + "stateVariable": false, + "storageLocation": "default", + "type": "uint256", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "uint", + "type": "uint256" + }, + "id": 1006, + "name": "ElementaryTypeName", + "src": "13105:4:0" + } + ], + "id": 1007, + "name": "VariableDeclaration", + "src": "13105:11:0" + } + ], + "id": 1008, + "name": "ParameterList", + "src": "13104:13:0" + }, + { + "attributes": { + "parameters": [ + null + ] + }, + "children": [], + "id": 1011, + "name": "ParameterList", + "src": "13135:0:0" + }, + { + "attributes": { + "arguments": [ + null + ] + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 119, + "type": "modifier ()", + "value": "onlyOwner" + }, + "id": 1009, + "name": "Identifier", + "src": "13125:9:0" + } + ], + "id": 1010, + "name": "ModifierInvocation", + "src": "13125:9:0" + }, + { + "children": [ + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "isStructConstructorCall": false, + "lValueRequested": false, + "names": [ + null + ], + "type": "tuple()", + "type_conversion": false + }, + "children": [ + { + "attributes": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + ], + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1157, + "type": "function (bool) pure", + "value": "require" + }, + "id": 1012, + "name": "Identifier", + "src": "13145:7:0" + }, + { + "attributes": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": ">", + "type": "bool" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": "+", + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 141, + "type": "uint256", + "value": "_totalSupply" + }, + "id": 1013, + "name": "Identifier", + "src": "13153:12:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1007, + "type": "uint256", + "value": "amount" + }, + "id": 1014, + "name": "Identifier", + "src": "13168:6:0" + } + ], + "id": 1015, + "name": "BinaryOperation", + "src": "13153:21:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 141, + "type": "uint256", + "value": "_totalSupply" + }, + "id": 1016, + "name": "Identifier", + "src": "13177:12:0" + } + ], + "id": 1017, + "name": "BinaryOperation", + "src": "13153:36:0" + } + ], + "id": 1018, + "name": "FunctionCall", + "src": "13145:45:0" + } + ], + "id": 1019, + "name": "ExpressionStatement", + "src": "13145:45:0" + }, + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "isStructConstructorCall": false, + "lValueRequested": false, + "names": [ + null + ], + "type": "tuple()", + "type_conversion": false + }, + "children": [ + { + "attributes": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + ], + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1157, + "type": "function (bool) pure", + "value": "require" + }, + "id": 1020, + "name": "Identifier", + "src": "13200:7:0" + }, + { + "attributes": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": ">", + "type": "bool" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": "+", + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 216, + "type": "mapping(address => uint256)", + "value": "balances" + }, + "id": 1021, + "name": "Identifier", + "src": "13208:8:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 99, + "type": "address", + "value": "owner" + }, + "id": 1022, + "name": "Identifier", + "src": "13217:5:0" + } + ], + "id": 1023, + "name": "IndexAccess", + "src": "13208:15:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1007, + "type": "uint256", + "value": "amount" + }, + "id": 1024, + "name": "Identifier", + "src": "13226:6:0" + } + ], + "id": 1025, + "name": "BinaryOperation", + "src": "13208:24:0" + }, + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 216, + "type": "mapping(address => uint256)", + "value": "balances" + }, + "id": 1026, + "name": "Identifier", + "src": "13235:8:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 99, + "type": "address", + "value": "owner" + }, + "id": 1027, + "name": "Identifier", + "src": "13244:5:0" + } + ], + "id": 1028, + "name": "IndexAccess", + "src": "13235:15:0" + } + ], + "id": 1029, + "name": "BinaryOperation", + "src": "13208:42:0" + } + ], + "id": 1030, + "name": "FunctionCall", + "src": "13200:51:0" + } + ], + "id": 1031, + "name": "ExpressionStatement", + "src": "13200:51:0" + }, + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": "+=", + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 216, + "type": "mapping(address => uint256)", + "value": "balances" + }, + "id": 1032, + "name": "Identifier", + "src": "13262:8:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 99, + "type": "address", + "value": "owner" + }, + "id": 1033, + "name": "Identifier", + "src": "13271:5:0" + } + ], + "id": 1034, + "name": "IndexAccess", + "src": "13262:15:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1007, + "type": "uint256", + "value": "amount" + }, + "id": 1035, + "name": "Identifier", + "src": "13281:6:0" + } + ], + "id": 1036, + "name": "Assignment", + "src": "13262:25:0" + } + ], + "id": 1037, + "name": "ExpressionStatement", + "src": "13262:25:0" + }, + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": "+=", + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 141, + "type": "uint256", + "value": "_totalSupply" + }, + "id": 1038, + "name": "Identifier", + "src": "13297:12:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1007, + "type": "uint256", + "value": "amount" + }, + "id": 1039, + "name": "Identifier", + "src": "13313:6:0" + } + ], + "id": 1040, + "name": "Assignment", + "src": "13297:22:0" + } + ], + "id": 1041, + "name": "ExpressionStatement", + "src": "13297:22:0" + }, + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "isStructConstructorCall": false, + "lValueRequested": false, + "names": [ + null + ], + "type": "tuple()", + "type_conversion": false + }, + "children": [ + { + "attributes": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1127, + "type": "function (uint256)", + "value": "Issue" + }, + "id": 1042, + "name": "Identifier", + "src": "13329:5:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1007, + "type": "uint256", + "value": "amount" + }, + "id": 1043, + "name": "Identifier", + "src": "13335:6:0" + } + ], + "id": 1044, + "name": "FunctionCall", + "src": "13329:13:0" + } + ], + "id": 1045, + "name": "ExpressionStatement", + "src": "13329:13:0" + } + ], + "id": 1046, + "name": "Block", + "src": "13135:214:0" + } + ], + "id": 1047, + "name": "FunctionDefinition", + "src": "13090:259:0" + }, + { + "attributes": { + "constant": false, + "implemented": true, + "isConstructor": false, + "name": "redeem", + "payable": false, + "scope": 1142, + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "public" + }, + "children": [ + { + "children": [ + { + "attributes": { + "constant": false, + "name": "amount", + "scope": 1083, + "stateVariable": false, + "storageLocation": "default", + "type": "uint256", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "uint", + "type": "uint256" + }, + "id": 1048, + "name": "ElementaryTypeName", + "src": "13589:4:0" + } + ], + "id": 1049, + "name": "VariableDeclaration", + "src": "13589:11:0" + } + ], + "id": 1050, + "name": "ParameterList", + "src": "13588:13:0" + }, + { + "attributes": { + "parameters": [ + null + ] + }, + "children": [], + "id": 1053, + "name": "ParameterList", + "src": "13619:0:0" + }, + { + "attributes": { + "arguments": [ + null + ] + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 119, + "type": "modifier ()", + "value": "onlyOwner" + }, + "id": 1051, + "name": "Identifier", + "src": "13609:9:0" + } + ], + "id": 1052, + "name": "ModifierInvocation", + "src": "13609:9:0" + }, + { + "children": [ + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "isStructConstructorCall": false, + "lValueRequested": false, + "names": [ + null + ], + "type": "tuple()", + "type_conversion": false + }, + "children": [ + { + "attributes": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + ], + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1157, + "type": "function (bool) pure", + "value": "require" + }, + "id": 1054, + "name": "Identifier", + "src": "13629:7:0" + }, + { + "attributes": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": ">=", + "type": "bool" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 141, + "type": "uint256", + "value": "_totalSupply" + }, + "id": 1055, + "name": "Identifier", + "src": "13637:12:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1049, + "type": "uint256", + "value": "amount" + }, + "id": 1056, + "name": "Identifier", + "src": "13653:6:0" + } + ], + "id": 1057, + "name": "BinaryOperation", + "src": "13637:22:0" + } + ], + "id": 1058, + "name": "FunctionCall", + "src": "13629:31:0" + } + ], + "id": 1059, + "name": "ExpressionStatement", + "src": "13629:31:0" + }, + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "isStructConstructorCall": false, + "lValueRequested": false, + "names": [ + null + ], + "type": "tuple()", + "type_conversion": false + }, + "children": [ + { + "attributes": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + ], + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1157, + "type": "function (bool) pure", + "value": "require" + }, + "id": 1060, + "name": "Identifier", + "src": "13670:7:0" + }, + { + "attributes": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": ">=", + "type": "bool" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 216, + "type": "mapping(address => uint256)", + "value": "balances" + }, + "id": 1061, + "name": "Identifier", + "src": "13678:8:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 99, + "type": "address", + "value": "owner" + }, + "id": 1062, + "name": "Identifier", + "src": "13687:5:0" + } + ], + "id": 1063, + "name": "IndexAccess", + "src": "13678:15:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1049, + "type": "uint256", + "value": "amount" + }, + "id": 1064, + "name": "Identifier", + "src": "13697:6:0" + } + ], + "id": 1065, + "name": "BinaryOperation", + "src": "13678:25:0" + } + ], + "id": 1066, + "name": "FunctionCall", + "src": "13670:34:0" + } + ], + "id": 1067, + "name": "ExpressionStatement", + "src": "13670:34:0" + }, + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": "-=", + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 141, + "type": "uint256", + "value": "_totalSupply" + }, + "id": 1068, + "name": "Identifier", + "src": "13715:12:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1049, + "type": "uint256", + "value": "amount" + }, + "id": 1069, + "name": "Identifier", + "src": "13731:6:0" + } + ], + "id": 1070, + "name": "Assignment", + "src": "13715:22:0" + } + ], + "id": 1071, + "name": "ExpressionStatement", + "src": "13715:22:0" + }, + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": "-=", + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 216, + "type": "mapping(address => uint256)", + "value": "balances" + }, + "id": 1072, + "name": "Identifier", + "src": "13747:8:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 99, + "type": "address", + "value": "owner" + }, + "id": 1073, + "name": "Identifier", + "src": "13756:5:0" + } + ], + "id": 1074, + "name": "IndexAccess", + "src": "13747:15:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1049, + "type": "uint256", + "value": "amount" + }, + "id": 1075, + "name": "Identifier", + "src": "13766:6:0" + } + ], + "id": 1076, + "name": "Assignment", + "src": "13747:25:0" + } + ], + "id": 1077, + "name": "ExpressionStatement", + "src": "13747:25:0" + }, + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "isStructConstructorCall": false, + "lValueRequested": false, + "names": [ + null + ], + "type": "tuple()", + "type_conversion": false + }, + "children": [ + { + "attributes": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1131, + "type": "function (uint256)", + "value": "Redeem" + }, + "id": 1078, + "name": "Identifier", + "src": "13782:6:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1049, + "type": "uint256", + "value": "amount" + }, + "id": 1079, + "name": "Identifier", + "src": "13789:6:0" + } + ], + "id": 1080, + "name": "FunctionCall", + "src": "13782:14:0" + } + ], + "id": 1081, + "name": "ExpressionStatement", + "src": "13782:14:0" + } + ], + "id": 1082, + "name": "Block", + "src": "13619:184:0" + } + ], + "id": 1083, + "name": "FunctionDefinition", + "src": "13573:230:0" + }, + { + "attributes": { + "constant": false, + "implemented": true, + "isConstructor": false, + "name": "setParams", + "payable": false, + "scope": 1142, + "stateMutability": "nonpayable", + "superFunction": null, + "visibility": "public" + }, + "children": [ + { + "children": [ + { + "attributes": { + "constant": false, + "name": "newBasisPoints", + "scope": 1123, + "stateVariable": false, + "storageLocation": "default", + "type": "uint256", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "uint", + "type": "uint256" + }, + "id": 1084, + "name": "ElementaryTypeName", + "src": "13828:4:0" + } + ], + "id": 1085, + "name": "VariableDeclaration", + "src": "13828:19:0" + }, + { + "attributes": { + "constant": false, + "name": "newMaxFee", + "scope": 1123, + "stateVariable": false, + "storageLocation": "default", + "type": "uint256", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "uint", + "type": "uint256" + }, + "id": 1086, + "name": "ElementaryTypeName", + "src": "13849:4:0" + } + ], + "id": 1087, + "name": "VariableDeclaration", + "src": "13849:14:0" + } + ], + "id": 1088, + "name": "ParameterList", + "src": "13827:37:0" + }, + { + "attributes": { + "parameters": [ + null + ] + }, + "children": [], + "id": 1091, + "name": "ParameterList", + "src": "13882:0:0" + }, + { + "attributes": { + "arguments": [ + null + ] + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 119, + "type": "modifier ()", + "value": "onlyOwner" + }, + "id": 1089, + "name": "Identifier", + "src": "13872:9:0" + } + ], + "id": 1090, + "name": "ModifierInvocation", + "src": "13872:9:0" + }, + { + "children": [ + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "isStructConstructorCall": false, + "lValueRequested": false, + "names": [ + null + ], + "type": "tuple()", + "type_conversion": false + }, + "children": [ + { + "attributes": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + ], + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1157, + "type": "function (bool) pure", + "value": "require" + }, + "id": 1092, + "name": "Identifier", + "src": "13980:7:0" + }, + { + "attributes": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": "<", + "type": "bool" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1085, + "type": "uint256", + "value": "newBasisPoints" + }, + "id": 1093, + "name": "Identifier", + "src": "13988:14:0" + }, + { + "attributes": { + "argumentTypes": null, + "hexvalue": "3230", + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "subdenomination": null, + "token": "number", + "type": "int_const 20", + "value": "20" + }, + "id": 1094, + "name": "Literal", + "src": "14005:2:0" + } + ], + "id": 1095, + "name": "BinaryOperation", + "src": "13988:19:0" + } + ], + "id": 1096, + "name": "FunctionCall", + "src": "13980:28:0" + } + ], + "id": 1097, + "name": "ExpressionStatement", + "src": "13980:28:0" + }, + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "isStructConstructorCall": false, + "lValueRequested": false, + "names": [ + null + ], + "type": "tuple()", + "type_conversion": false + }, + "children": [ + { + "attributes": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + ], + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1157, + "type": "function (bool) pure", + "value": "require" + }, + "id": 1098, + "name": "Identifier", + "src": "14018:7:0" + }, + { + "attributes": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": "<", + "type": "bool" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1087, + "type": "uint256", + "value": "newMaxFee" + }, + "id": 1099, + "name": "Identifier", + "src": "14026:9:0" + }, + { + "attributes": { + "argumentTypes": null, + "hexvalue": "3530", + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "subdenomination": null, + "token": "number", + "type": "int_const 50", + "value": "50" + }, + "id": 1100, + "name": "Literal", + "src": "14038:2:0" + } + ], + "id": 1101, + "name": "BinaryOperation", + "src": "14026:14:0" + } + ], + "id": 1102, + "name": "FunctionCall", + "src": "14018:23:0" + } + ], + "id": 1103, + "name": "ExpressionStatement", + "src": "14018:23:0" + }, + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": "=", + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 219, + "type": "uint256", + "value": "basisPointsRate" + }, + "id": 1104, + "name": "Identifier", + "src": "14052:15:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1085, + "type": "uint256", + "value": "newBasisPoints" + }, + "id": 1105, + "name": "Identifier", + "src": "14070:14:0" + } + ], + "id": 1106, + "name": "Assignment", + "src": "14052:32:0" + } + ], + "id": 1107, + "name": "ExpressionStatement", + "src": "14052:32:0" + }, + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": "=", + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 222, + "type": "uint256", + "value": "maximumFee" + }, + "id": 1108, + "name": "Identifier", + "src": "14094:10:0" + }, + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "isStructConstructorCall": false, + "lValueRequested": false, + "names": [ + null + ], + "type": "uint256", + "type_conversion": false + }, + "children": [ + { + "attributes": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "member_name": "mul", + "referencedDeclaration": 34, + "type": "function (uint256,uint256) pure returns (uint256)" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1087, + "type": "uint256", + "value": "newMaxFee" + }, + "id": 1109, + "name": "Identifier", + "src": "14107:9:0" + } + ], + "id": 1110, + "name": "MemberAccess", + "src": "14107:13:0" + }, + { + "attributes": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "operator": "**", + "type": "uint256" + }, + "children": [ + { + "attributes": { + "argumentTypes": null, + "hexvalue": "3130", + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "subdenomination": null, + "token": "number", + "type": "int_const 10", + "value": "10" + }, + "id": 1111, + "name": "Literal", + "src": "14121:2:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 761, + "type": "uint256", + "value": "decimals" + }, + "id": 1112, + "name": "Identifier", + "src": "14125:8:0" + } + ], + "id": 1113, + "name": "BinaryOperation", + "src": "14121:12:0" + } + ], + "id": 1114, + "name": "FunctionCall", + "src": "14107:27:0" + } + ], + "id": 1115, + "name": "Assignment", + "src": "14094:40:0" + } + ], + "id": 1116, + "name": "ExpressionStatement", + "src": "14094:40:0" + }, + { + "children": [ + { + "attributes": { + "argumentTypes": null, + "isConstant": false, + "isLValue": false, + "isPure": false, + "isStructConstructorCall": false, + "lValueRequested": false, + "names": [ + null + ], + "type": "tuple()", + "type_conversion": false + }, + "children": [ + { + "attributes": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 1141, + "type": "function (uint256,uint256)", + "value": "Params" + }, + "id": 1117, + "name": "Identifier", + "src": "14145:6:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 219, + "type": "uint256", + "value": "basisPointsRate" + }, + "id": 1118, + "name": "Identifier", + "src": "14152:15:0" + }, + { + "attributes": { + "argumentTypes": null, + "overloadedDeclarations": [ + null + ], + "referencedDeclaration": 222, + "type": "uint256", + "value": "maximumFee" + }, + "id": 1119, + "name": "Identifier", + "src": "14169:10:0" + } + ], + "id": 1120, + "name": "FunctionCall", + "src": "14145:35:0" + } + ], + "id": 1121, + "name": "ExpressionStatement", + "src": "14145:35:0" + } + ], + "id": 1122, + "name": "Block", + "src": "13882:305:0" + } + ], + "id": 1123, + "name": "FunctionDefinition", + "src": "13809:378:0" + }, + { + "attributes": { + "anonymous": false, + "name": "Issue" + }, + "children": [ + { + "children": [ + { + "attributes": { + "constant": false, + "indexed": false, + "name": "amount", + "scope": 1127, + "stateVariable": false, + "storageLocation": "default", + "type": "uint256", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "uint", + "type": "uint256" + }, + "id": 1124, + "name": "ElementaryTypeName", + "src": "14245:4:0" + } + ], + "id": 1125, + "name": "VariableDeclaration", + "src": "14245:11:0" + } + ], + "id": 1126, + "name": "ParameterList", + "src": "14244:13:0" + } + ], + "id": 1127, + "name": "EventDefinition", + "src": "14233:25:0" + }, + { + "attributes": { + "anonymous": false, + "name": "Redeem" + }, + "children": [ + { + "children": [ + { + "attributes": { + "constant": false, + "indexed": false, + "name": "amount", + "scope": 1131, + "stateVariable": false, + "storageLocation": "default", + "type": "uint256", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "uint", + "type": "uint256" + }, + "id": 1128, + "name": "ElementaryTypeName", + "src": "14316:4:0" + } + ], + "id": 1129, + "name": "VariableDeclaration", + "src": "14316:11:0" + } + ], + "id": 1130, + "name": "ParameterList", + "src": "14315:13:0" + } + ], + "id": 1131, + "name": "EventDefinition", + "src": "14303:26:0" + }, + { + "attributes": { + "anonymous": false, + "name": "Deprecate" + }, + "children": [ + { + "children": [ + { + "attributes": { + "constant": false, + "indexed": false, + "name": "newAddress", + "scope": 1135, + "stateVariable": false, + "storageLocation": "default", + "type": "address", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "address", + "type": "address" + }, + "id": 1132, + "name": "ElementaryTypeName", + "src": "14393:7:0" + } + ], + "id": 1133, + "name": "VariableDeclaration", + "src": "14393:18:0" + } + ], + "id": 1134, + "name": "ParameterList", + "src": "14392:20:0" + } + ], + "id": 1135, + "name": "EventDefinition", + "src": "14377:36:0" + }, + { + "attributes": { + "anonymous": false, + "name": "Params" + }, + "children": [ + { + "children": [ + { + "attributes": { + "constant": false, + "indexed": false, + "name": "feeBasisPoints", + "scope": 1141, + "stateVariable": false, + "storageLocation": "default", + "type": "uint256", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "uint", + "type": "uint256" + }, + "id": 1136, + "name": "ElementaryTypeName", + "src": "14473:4:0" + } + ], + "id": 1137, + "name": "VariableDeclaration", + "src": "14473:19:0" + }, + { + "attributes": { + "constant": false, + "indexed": false, + "name": "maxFee", + "scope": 1141, + "stateVariable": false, + "storageLocation": "default", + "type": "uint256", + "value": null, + "visibility": "internal" + }, + "children": [ + { + "attributes": { + "name": "uint", + "type": "uint256" + }, + "id": 1138, + "name": "ElementaryTypeName", + "src": "14494:4:0" + } + ], + "id": 1139, + "name": "VariableDeclaration", + "src": "14494:11:0" + } + ], + "id": 1140, + "name": "ParameterList", + "src": "14472:34:0" + } + ], + "id": 1141, + "name": "EventDefinition", + "src": "14460:47:0" + } + ], + "id": 1142, + "name": "ContractDefinition", + "src": "9728:4781:0" + } + ], + "id": 1143, + "name": "SourceUnit", + "src": "67:14442:0" + } + } + } +} \ No newline at end of file diff --git a/ethers-solc/tests/project.rs b/ethers-solc/tests/project.rs index 2b360c9eb2..f2cee71183 100644 --- a/ethers-solc/tests/project.rs +++ b/ethers-solc/tests/project.rs @@ -1,21 +1,23 @@ //! project tests use std::{ - collections::{HashMap, HashSet}, + collections::{BTreeMap, HashMap, HashSet}, io, path::{Path, PathBuf}, str::FromStr, }; +use ethers_core::types::Address; use ethers_solc::{ - artifacts::BytecodeHash, + artifacts::{BytecodeHash, Libraries, ModelCheckerEngine::CHC, ModelCheckerSettings}, cache::{SolFilesCache, SOLIDITY_FILES_CACHE_FILENAME}, project_util::*, remappings::Remapping, - ConfigurableArtifacts, ExtraOutputValues, Graph, Project, ProjectCompileOutput, + CompilerInput, ConfigurableArtifacts, ExtraOutputValues, Graph, Project, ProjectCompileOutput, ProjectPathsConfig, Solc, TestFileFilter, }; use pretty_assertions::assert_eq; +use semver::Version; #[allow(unused)] fn init_tracing() { @@ -155,7 +157,7 @@ fn can_compile_dapp_detect_changes_in_libs() { project .paths_mut() .remappings - .push(Remapping::from_str(&format!("remapping={}/", remapping.display())).unwrap()); + .push(Remapping::from_str(&format!("remapping/={}/", remapping.display())).unwrap()); let src = project .add_source( @@ -490,8 +492,7 @@ contract C { } assert_eq!( result, - r#" -pragma solidity ^0.8.10; + r#"pragma solidity ^0.8.10; contract C { } @@ -547,8 +548,7 @@ contract C { } assert_eq!( result, - r#" -pragma solidity ^0.8.10; + r#"pragma solidity ^0.8.10; pragma experimental ABIEncoderV2; contract C { } @@ -656,7 +656,7 @@ contract C { } let result = project.flatten(&f).unwrap(); assert_eq!( - result.trim(), + result, r#"pragma solidity ^0.8.10; contract C { } @@ -664,7 +664,8 @@ contract C { } error IllegalArgument(); error IllegalState(); -contract A { }"# +contract A { } +"# ); } @@ -707,7 +708,7 @@ contract C { } let result = project.flatten(&f).unwrap(); assert_eq!( - result.trim(), + result, r#"pragma solidity ^0.8.10; contract C { } @@ -716,7 +717,156 @@ contract C { } contract B { } -contract A { }"# +contract A { } +"# + ); +} + +#[test] +fn can_flatten_with_alias() { + let project = TempProject::dapptools().unwrap(); + + let f = project + .add_source( + "Contract", + r#"pragma solidity ^0.8.10; +import { ParentContract as Parent } from "./Parent.sol"; +import { AnotherParentContract as AnotherParent } from "./AnotherParent.sol"; +import { PeerContract as Peer } from "./Peer.sol"; +import { MathLibrary as Math } from "./Math.sol"; +import * as Lib from "./SomeLib.sol"; + +contract Contract is Parent, + AnotherParent { + using Math for uint256; + + string public usingString = "using Math for uint256;"; + string public inheritanceString = "\"Contract is Parent {\""; + string public castString = 'Peer(smth) '; + string public methodString = '\' Math.max()'; + + Peer public peer; + + error Peer(); + + constructor(address _peer) { + peer = Peer(_peer); + } + + function Math(uint256 value) external pure returns (uint256) { + return Math.minusOne(Math.max() - value.diffMax()); + } +} +"#, + ) + .unwrap(); + + project + .add_source( + "Parent", + r#"pragma solidity ^0.8.10; +contract ParentContract { } +"#, + ) + .unwrap(); + + project + .add_source( + "AnotherParent", + r#"pragma solidity ^0.8.10; +contract AnotherParentContract { } +"#, + ) + .unwrap(); + + project + .add_source( + "Peer", + r#"pragma solidity ^0.8.10; +contract PeerContract { } +"#, + ) + .unwrap(); + + project + .add_source( + "Math", + r#"pragma solidity ^0.8.10; +library MathLibrary { + function minusOne(uint256 val) internal returns (uint256) { + return val - 1; + } + + function max() internal returns (uint256) { + return type(uint256).max; + } + + function diffMax(uint256 value) internal returns (uint256) { + return type(uint256).max - value; + } +} +"#, + ) + .unwrap(); + + project + .add_source( + "SomeLib", + r#"pragma solidity ^0.8.10; +library SomeLib { } +"#, + ) + .unwrap(); + + let result = project.flatten(&f).unwrap(); + assert_eq!( + result, + r#"pragma solidity ^0.8.10; + +contract ParentContract { } + +contract AnotherParentContract { } + +contract PeerContract { } + +library MathLibrary { + function minusOne(uint256 val) internal returns (uint256) { + return val - 1; + } + + function max() internal returns (uint256) { + return type(uint256).max; + } + + function diffMax(uint256 value) internal returns (uint256) { + return type(uint256).max - value; + } +} + +library SomeLib { } + +contract Contract is ParentContract, + AnotherParentContract { + using MathLibrary for uint256; + + string public usingString = "using Math for uint256;"; + string public inheritanceString = "\"Contract is Parent {\""; + string public castString = 'Peer(smth) '; + string public methodString = '\' Math.max()'; + + PeerContract public peer; + + error Peer(); + + constructor(address _peer) { + peer = PeerContract(_peer); + } + + function Math(uint256 value) external pure returns (uint256) { + return MathLibrary.minusOne(MathLibrary.max() - value.diffMax()); + } +} +"# ); } @@ -814,6 +964,130 @@ contract LinkTest { assert_eq!(bytecode.clone(), serde_json::from_str(&s).unwrap()); } +#[test] +fn can_apply_libraries() { + let mut tmp = TempProject::dapptools().unwrap(); + + tmp.add_source( + "LinkTest", + r#" +// SPDX-License-Identifier: MIT +import "./MyLib.sol"; +contract LinkTest { + function foo() public returns (uint256) { + return MyLib.foobar(1); + } +} +"#, + ) + .unwrap(); + + let lib = tmp + .add_source( + "MyLib", + r#" +// SPDX-License-Identifier: MIT +library MyLib { + function foobar(uint256 a) public view returns (uint256) { + return a * 100; + } +} +"#, + ) + .unwrap(); + + let compiled = tmp.compile().unwrap(); + assert!(!compiled.has_compiler_errors()); + + assert!(compiled.find("MyLib").is_some()); + let contract = compiled.find("LinkTest").unwrap(); + let bytecode = &contract.bytecode.as_ref().unwrap().object; + assert!(bytecode.is_unlinked()); + + // provide the library settings to let solc link + tmp.project_mut().solc_config.settings.libraries = BTreeMap::from([( + lib, + BTreeMap::from([("MyLib".to_string(), format!("{:?}", Address::zero()))]), + )]) + .into(); + + let compiled = tmp.compile().unwrap(); + assert!(!compiled.has_compiler_errors()); + + assert!(compiled.find("MyLib").is_some()); + let contract = compiled.find("LinkTest").unwrap(); + let bytecode = &contract.bytecode.as_ref().unwrap().object; + assert!(!bytecode.is_unlinked()); + + let libs = Libraries::parse(&[format!("./src/MyLib.sol:MyLib:{:?}", Address::zero())]).unwrap(); + // provide the library settings to let solc link + tmp.project_mut().solc_config.settings.libraries = libs.with_applied_remappings(tmp.paths()); + + let compiled = tmp.compile().unwrap(); + assert!(!compiled.has_compiler_errors()); + + assert!(compiled.find("MyLib").is_some()); + let contract = compiled.find("LinkTest").unwrap(); + let bytecode = &contract.bytecode.as_ref().unwrap().object; + assert!(!bytecode.is_unlinked()); +} + +#[test] +fn can_apply_libraries_with_remappings() { + let mut tmp = TempProject::dapptools().unwrap(); + + let remapping = tmp.paths().libraries[0].join("remapping"); + tmp.paths_mut() + .remappings + .push(Remapping::from_str(&format!("remapping/={}/", remapping.display())).unwrap()); + + tmp.add_source( + "LinkTest", + r#" +// SPDX-License-Identifier: MIT +import "remapping/MyLib.sol"; +contract LinkTest { + function foo() public returns (uint256) { + return MyLib.foobar(1); + } +} +"#, + ) + .unwrap(); + + tmp.add_lib( + "remapping/MyLib", + r#" +// SPDX-License-Identifier: MIT +library MyLib { + function foobar(uint256 a) public view returns (uint256) { + return a * 100; + } +} +"#, + ) + .unwrap(); + + let compiled = tmp.compile().unwrap(); + assert!(!compiled.has_compiler_errors()); + + assert!(compiled.find("MyLib").is_some()); + let contract = compiled.find("LinkTest").unwrap(); + let bytecode = &contract.bytecode.as_ref().unwrap().object; + assert!(bytecode.is_unlinked()); + + let libs = + Libraries::parse(&[format!("remapping/MyLib.sol:MyLib:{:?}", Address::zero())]).unwrap(); // provide the library settings to let solc link + tmp.project_mut().solc_config.settings.libraries = libs.with_applied_remappings(tmp.paths()); + + let compiled = tmp.compile().unwrap(); + assert!(!compiled.has_compiler_errors()); + + assert!(compiled.find("MyLib").is_some()); + let contract = compiled.find("LinkTest").unwrap(); + let bytecode = &contract.bytecode.as_ref().unwrap().object; + assert!(!bytecode.is_unlinked()); +} #[test] fn can_recompile_with_changes() { let mut tmp = TempProject::dapptools().unwrap(); @@ -1023,11 +1297,11 @@ fn can_sanitize_bytecode_hash() { fn can_compile_std_json_input() { let tmp = TempProject::dapptools_init().unwrap(); tmp.assert_no_errors(); - let source = - tmp.list_source_files().into_iter().filter(|p| p.ends_with("Dapp.t.sol")).next().unwrap(); + let source = tmp.list_source_files().into_iter().find(|p| p.ends_with("Dapp.t.sol")).unwrap(); let input = tmp.project().standard_json_input(source).unwrap(); assert!(input.settings.remappings.contains(&"ds-test/=lib/ds-test/src/".parse().unwrap())); + let input: CompilerInput = input.into(); assert!(input.sources.contains_key(Path::new("lib/ds-test/src/test.sol"))); // should be installed @@ -1037,3 +1311,103 @@ fn can_compile_std_json_input() { assert!(out.sources.contains_key("lib/ds-test/src/test.sol")); } } + +#[test] +fn can_compile_model_checker_sample() { + let root = PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("test-data/model-checker-sample"); + let paths = ProjectPathsConfig::builder().sources(root); + + let mut project = TempProject::::new(paths).unwrap(); + project.project_mut().solc_config.settings.model_checker = Some(ModelCheckerSettings { + contracts: BTreeMap::new(), + engine: Some(CHC), + targets: None, + timeout: Some(10000), + }); + let compiled = project.compile().unwrap(); + + assert!(compiled.find("Assert").is_some()); + assert!(!compiled.has_compiler_errors()); + assert!(compiled.has_compiler_warnings()); +} + +fn remove_solc_if_exists(version: &Version) { + match Solc::find_svm_installed_version(version.to_string()).unwrap() { + Some(_) => svm::remove_version(version).expect("failed to remove version"), + None => {} + }; +} + +#[tokio::test(flavor = "multi_thread")] +async fn can_install_solc_and_compile_version() { + let project = TempProject::dapptools().unwrap(); + let version = Version::new(0, 8, 10); + + project + .add_source( + "Contract", + format!( + r#" +pragma solidity {}; +contract Contract {{ }} +"#, + version + ), + ) + .unwrap(); + + remove_solc_if_exists(&version); + + let compiled = project.compile().unwrap(); + assert!(!compiled.has_compiler_errors()); +} + +#[tokio::test(flavor = "multi_thread")] +async fn can_install_solc_and_compile_std_json_input_async() { + let tmp = TempProject::dapptools_init().unwrap(); + tmp.assert_no_errors(); + let source = tmp.list_source_files().into_iter().find(|p| p.ends_with("Dapp.t.sol")).unwrap(); + let input = tmp.project().standard_json_input(source).unwrap(); + let solc = &tmp.project().solc; + + assert!(input.settings.remappings.contains(&"ds-test/=lib/ds-test/src/".parse().unwrap())); + let input: CompilerInput = input.into(); + assert!(input.sources.contains_key(Path::new("lib/ds-test/src/test.sol"))); + + remove_solc_if_exists(&solc.version().expect("failed to get version")); + + let out = solc.async_compile(&input).await.unwrap(); + assert!(!out.has_error()); + assert!(out.sources.contains_key("lib/ds-test/src/test.sol")); +} + +#[test] +fn can_purge_obsolete_artifacts() { + let mut project = TempProject::::dapptools().unwrap(); + project.set_solc("0.8.10"); + project + .add_source( + "Contract", + r#" + pragma solidity >=0.8.10; + + contract Contract { + function xyz() public { + } + } + "#, + ) + .unwrap(); + + let compiled = project.compile().unwrap(); + assert!(!compiled.has_compiler_errors()); + assert!(!compiled.is_unchanged()); + assert_eq!(compiled.into_artifacts().count(), 1); + + project.set_solc("0.8.13"); + + let compiled = project.compile().unwrap(); + assert!(!compiled.has_compiler_errors()); + assert!(!compiled.is_unchanged()); + assert_eq!(compiled.into_artifacts().count(), 1); +} diff --git a/examples/decode_tx_input.rs b/examples/decode_tx_input.rs index 6c6025ce4f..c52f1c36b3 100644 --- a/examples/decode_tx_input.rs +++ b/examples/decode_tx_input.rs @@ -14,11 +14,12 @@ fn main() -> Result<()> { let tx_input = "0x38ed173900000000000000000000000000000000000000000001a717cc0a3e4f84c00000000000000000000000000000000000000000000000000000000000000283568400000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000201f129111c60401630932d9f9811bd5b5fff34e000000000000000000000000000000000000000000000000000000006227723d000000000000000000000000000000000000000000000000000000000000000200000000000000000000000095ad61b0a150d79219dcf64e1e6cc01f0b64c4ce000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec7"; let calldata: Bytes = tx_input.parse().unwrap(); let decoded = SwapExactTokensForTokensCall::decode(&calldata)?; - - let from = decoded.path.into_iter().next().unwrap(); + let mut path = decoded.path.into_iter(); + let from = path.next().unwrap(); + let to = path.next().unwrap(); println!( "Swapped {} of token {} for {} of token {}", - decoded.amount_in, from, decoded.amount_out_min, decoded.to + decoded.amount_in, from, decoded.amount_out_min, to ); Ok(()) diff --git a/examples/ethers-wasm/Cargo.toml b/examples/ethers-wasm/Cargo.toml index 35a4ab52cf..ccc36499ac 100644 --- a/examples/ethers-wasm/Cargo.toml +++ b/examples/ethers-wasm/Cargo.toml @@ -19,7 +19,7 @@ crate-type = ["cdylib", "rlib"] default = ["console_error_panic_hook"] [dependencies] -ethers = { path = "../..", features = ["abigen", "legacy", "ws"] } +ethers = { path = "../..", version = "0.6.0", features = ["abigen", "legacy", "ws"] } serde_derive = "1.0.126" wasm-bindgen-futures = "0.4.30" serde_json = "1.0.64" diff --git a/examples/ethers-wasm/yarn.lock b/examples/ethers-wasm/yarn.lock index 5d752add1c..1a32e46d63 100644 --- a/examples/ethers-wasm/yarn.lock +++ b/examples/ethers-wasm/yarn.lock @@ -362,9 +362,9 @@ async-limiter@~1.0.0: integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== async@^2.6.2: - version "2.6.3" - resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" - integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg== + version "2.6.4" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.4.tgz#706b7ff6084664cd7eae713f6f965433b5504221" + integrity sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA== dependencies: lodash "^4.17.14" diff --git a/examples/subscribe_logs.rs b/examples/subscribe_logs.rs new file mode 100644 index 0000000000..18216db988 --- /dev/null +++ b/examples/subscribe_logs.rs @@ -0,0 +1,34 @@ +use ethers::{abi::AbiDecode, prelude::*, utils::keccak256}; +use eyre::Result; +use std::sync::Arc; + +#[tokio::main] +async fn main() -> Result<()> { + let client = + Provider::::connect("wss://mainnet.infura.io/ws/v3/c60b0bb42f8a4c6481ecd229eddaca27") + .await?; + let client = Arc::new(client); + + let last_block = client.get_block(BlockNumber::Latest).await?.unwrap().number.unwrap(); + println!("last_block: {}", last_block); + + let erc20_transfer_filter = Filter::new() + .from_block(last_block - 25) + .topic0(ValueOrArray::Value(H256::from(keccak256("Transfer(address,address,uint256)")))); + + let mut stream = client.subscribe_logs(&erc20_transfer_filter).await?; + + while let Some(log) = stream.next().await { + println!( + "block: {:?}, tx: {:?}, token: {:?}, from: {:?}, to: {:?}, amount: {:?}", + log.block_number, + log.transaction_hash, + log.address, + Address::from(log.topics[1]), + Address::from(log.topics[2]), + U256::decode(log.data) + ); + } + + Ok(()) +} diff --git a/release.toml b/release.toml new file mode 100644 index 0000000000..d55f4e95db --- /dev/null +++ b/release.toml @@ -0,0 +1,2 @@ +consolidate-commits = false +consolidate-pushes = true diff --git a/tests/major_contracts.rs b/tests/major_contracts.rs deleted file mode 100644 index d72a3ad044..0000000000 --- a/tests/major_contracts.rs +++ /dev/null @@ -1,37 +0,0 @@ -// // This test exists to ensure that the abigen macro works "reasonably" well with popular -// contracts use ethers::contract::abigen; -// -// abigen!( -// KeepBonding, -// "etherscan:0x7137701e90C6a80B0dA36922cd83942b32A8fc95" -// ); -// abigen!(cDAI, "etherscan:0x5d3a536E4D6DbD6114cc1Ead35777bAB948E3643"); -// abigen!( -// Comptroller, -// "etherscan:0x3d9819210a31b4961b30ef54be2aed79b9c9cd3b" -// ); -// -// // https://github.com/vyperlang/vyper/issues/1931 -// // abigen!( -// // Curve, -// // "etherscan:0xa2b47e3d5c44877cca798226b7b8118f9bfb7a56" -// // ); -// abigen!( -// UmaAdmin, -// "etherscan:0x4E6CCB1dA3C7844887F9A5aF4e8450d9fd90317A" -// ); -// -// // e.g. aave's `initialize` methods exist multiple times, so we should rename it -// abigen!( -// AavePoolCore, -// "etherscan:0x3dfd23a6c5e8bbcfc9581d2e864a68feb6a076d3", -// methods { -// initialize(address,bytes) as initialize_proxy; -// } -// ); -// -// // The DyDxLimitOrders contract uses Abi Encoder v2 with nested tuples -// abigen!( -// DyDxLimitOrders, -// "etherscan:0xDEf136D9884528e1EB302f39457af0E4d3AD24EB" -// );