diff --git a/examples/private-mint/README.md b/examples/private-mint/README.md new file mode 100644 index 00000000..e9b29f9c --- /dev/null +++ b/examples/private-mint/README.md @@ -0,0 +1,87 @@ +# Private Mint Example + +Demonstrates a cross-program bridge flow on Aleo where a Circle XReserve attestation mints tokens publicly to a wrapper program, which immediately converts them into a private token record for the end user — all in a single atomic transaction. This flow enables the final recipient's Aleo address to remain fully confidential. + +## What it does + +1. Uses a deposit payload signed by Circle's off-chain attester that authorizes a mint of a specific amount to `bridge_demo_v1.aleo`. +2. The wrapper calls `test_usdcx_bridge.aleo::mint_public`, which verifies the attestation and mints USDCx to the wrapper's public balance. +3. The wrapper then calls `test_usdcx_stablecoin.aleo::transfer_public_to_private`, converting the public balance into a private `Token` record sent to `self.signer` (the end user). +4. The nullifier for the attestation nonce is set on-chain, preventing replay. + +## Programs + +| Program | Role | +|---|---| +| `bridge_demo_v1.aleo` | Wrapper — orchestrates mint + private transfer | +| `test_usdcx_bridge.aleo` | Verifies attestation, sets nullifier, mints to caller | +| `test_usdcx_stablecoin.aleo` | USDCx token contract with public/private balance support | +| `test_usdcx_freezelist.aleo` | Freeze list for the USDCx stablecoin | +| `test_usdcx_multisig_core.aleo` | Multisig wallet required for gated operations | +| `merkle_tree.aleo` | Merkle tree utilities used to verify non-inclusion in freeze list | + +## Directory structure + +``` +private-mint/ +├── private-mint-wrapper/ +│ ├── src/main.leo # Leo source for bridge_demo_v1.aleo +│ ├── imports/ # Pre-compiled .aleo bytecode for all dependencies +│ ├── build/ # leo build output (main.aleo + compiled imports) +│ └── program.json # Leo project manifest +└── tests/ + └── private-mint.test.ts # E2E test suite +``` + +## Running the tests + +The test suite starts a local Devnode, deploys all programs, initializes the stablecoin, and verifies the full mint flow. + +```bash +PRIVATE_MINT_E2E=1 pnpm vitest run examples/private-mint/tests/private-mint.test.ts +``` + +The `PRIVATE_MINT_E2E=1` flag is required — without it the suite is skipped. + +### Prerequisites + +- `leo` CLI installed and on `$PATH` (used to rebuild the wrapper before deployment) +- `@veil/devnode` available (pulled in as a workspace dependency) + +## Rebuilding the wrapper + +If you modify `src/main.leo`, rebuild before running the tests: + +```bash +cd examples/private-mint/private-mint-wrapper +leo build +``` + +The test suite calls `leo.build()` automatically via `@veil/leo` before deploying, so a manual rebuild is only needed if you want to inspect the generated bytecode. + +## Important constraint — program name + +The wrapper **must** remain named `bridge_demo_v1.aleo`. The test payload encodes the bech32 address of `bridge_demo_v1.aleo` in bytes 76–107. The bridge mints tokens to that address, so the wrapper's on-chain address must match. Renaming the program changes its address, causing finalize to fail with an insufficient balance error. + +## How `veil` is used + +```typescript +import { createTestClient, http } from '@veil/core' +import { createDevnodeClient } from '@veil/provable' +import { createLeoClient } from '@veil/leo' + +// Start devnode and build clients +const devnode = await startDevnode({ manualBlockCreation: false }) +const { walletClient, publicClient } = createDevnodeClient({ socketAddr: devnode.socketAddr }) + +// Deploy and call contracts +await walletClient.deployContract({ program: source }) +await walletClient.writeContract({ program: 'bridge_demo_v1.aleo', function: 'mint_and_send_private', inputs: [...] }) + +// Read mapping state +const nullifier = await publicClient.readMapping({ + programId: 'test_usdcx_bridge.aleo', + mapping: 'nullifier', + key: nonce, // array-type key, e.g. '[180u8, 125u8, ...]' +}) +``` diff --git a/examples/private-mint/private-mint-wrapper/build/abi.json b/examples/private-mint/private-mint-wrapper/build/abi.json new file mode 100644 index 00000000..5ca91d41 --- /dev/null +++ b/examples/private-mint/private-mint-wrapper/build/abi.json @@ -0,0 +1,358 @@ +{ + "program": "bridge_demo_v1.aleo", + "structs": [], + "records": [], + "mappings": [], + "storage_variables": [], + "functions": [ + { + "name": "mint_and_send_private", + "is_final": true, + "inputs": [ + { + "name": "payload", + "ty": { + "Plaintext": { + "Array": { + "element": { + "Primitive": { + "UInt": "U8" + } + }, + "length": 240 + } + } + }, + "mode": "None" + }, + { + "name": "sig", + "ty": { + "Plaintext": { + "Array": { + "element": { + "Primitive": { + "UInt": "U8" + } + }, + "length": 65 + } + } + }, + "mode": "None" + }, + { + "name": "hash", + "ty": { + "Plaintext": { + "Array": { + "element": { + "Primitive": { + "UInt": "U8" + } + }, + "length": 32 + } + } + }, + "mode": "None" + }, + { + "name": "hook_data", + "ty": { + "Plaintext": { + "Array": { + "element": { + "Primitive": { + "UInt": "U8" + } + }, + "length": 32 + } + } + }, + "mode": "None" + } + ], + "outputs": [ + { + "ty": { + "Record": { + "path": [ + "Token" + ], + "program": "test_usdcx_stablecoin.aleo" + } + }, + "mode": "None" + }, + { + "ty": "Final", + "mode": "None" + } + ] + }, + { + "name": "mint_and_send_public", + "is_final": true, + "inputs": [ + { + "name": "payload", + "ty": { + "Plaintext": { + "Array": { + "element": { + "Primitive": { + "UInt": "U8" + } + }, + "length": 240 + } + } + }, + "mode": "None" + }, + { + "name": "sig", + "ty": { + "Plaintext": { + "Array": { + "element": { + "Primitive": { + "UInt": "U8" + } + }, + "length": 65 + } + } + }, + "mode": "None" + }, + { + "name": "hash", + "ty": { + "Plaintext": { + "Array": { + "element": { + "Primitive": { + "UInt": "U8" + } + }, + "length": 32 + } + } + }, + "mode": "None" + }, + { + "name": "hook_data", + "ty": { + "Plaintext": { + "Array": { + "element": { + "Primitive": { + "UInt": "U8" + } + }, + "length": 32 + } + } + }, + "mode": "None" + } + ], + "outputs": [ + { + "ty": "Final", + "mode": "None" + } + ] + }, + { + "name": "deposit_public_usdcx_to_vault", + "is_final": true, + "inputs": [ + { + "name": "amount", + "ty": { + "Plaintext": { + "Primitive": { + "UInt": "U128" + } + } + }, + "mode": "None" + } + ], + "outputs": [ + { + "ty": "Final", + "mode": "None" + } + ] + }, + { + "name": "deposit_private_usdcx_to_vault", + "is_final": true, + "inputs": [ + { + "name": "amount", + "ty": { + "Plaintext": { + "Primitive": { + "UInt": "U128" + } + } + }, + "mode": "None" + }, + { + "name": "user_record", + "ty": { + "Record": { + "path": [ + "Token" + ], + "program": "test_usdcx_stablecoin.aleo" + } + }, + "mode": "None" + }, + { + "name": "merkle_proof", + "ty": { + "Plaintext": { + "Array": { + "element": { + "Struct": { + "path": [ + "MerkleProof" + ], + "program": "test_usdcx_stablecoin.aleo" + } + }, + "length": 2 + } + } + }, + "mode": "None" + } + ], + "outputs": [ + { + "ty": "Final", + "mode": "None" + } + ] + }, + { + "name": "withdraw_from_vault_public", + "is_final": true, + "inputs": [ + { + "name": "amount", + "ty": { + "Plaintext": { + "Primitive": { + "UInt": "U128" + } + } + }, + "mode": "None" + } + ], + "outputs": [ + { + "ty": "Final", + "mode": "None" + } + ] + }, + { + "name": "withdraw_from_vault_private", + "is_final": true, + "inputs": [ + { + "name": "amount", + "ty": { + "Plaintext": { + "Primitive": { + "UInt": "U128" + } + } + }, + "mode": "None" + }, + { + "name": "recipient", + "ty": { + "Plaintext": { + "Primitive": "Address" + } + }, + "mode": "None" + } + ], + "outputs": [ + { + "ty": "Final", + "mode": "None" + } + ] + }, + { + "name": "burn_private", + "is_final": true, + "inputs": [ + { + "name": "user_record", + "ty": { + "Record": { + "path": [ + "Token" + ], + "program": "test_usdcx_stablecoin.aleo" + } + }, + "mode": "None" + }, + { + "name": "amount", + "ty": { + "Plaintext": { + "Primitive": { + "UInt": "U128" + } + } + }, + "mode": "None" + }, + { + "name": "merkle_proof", + "ty": { + "Plaintext": { + "Array": { + "element": { + "Struct": { + "path": [ + "MerkleProof" + ], + "program": "test_usdcx_stablecoin.aleo" + } + }, + "length": 2 + } + } + }, + "mode": "None" + } + ], + "outputs": [ + { + "ty": "Final", + "mode": "None" + } + ] + } + ] +} \ No newline at end of file diff --git a/examples/private-mint/private-mint-wrapper/build/imports/merkle_tree.aleo b/examples/private-mint/private-mint-wrapper/build/imports/merkle_tree.aleo new file mode 100644 index 00000000..9e1c8d4f --- /dev/null +++ b/examples/private-mint/private-mint-wrapper/build/imports/merkle_tree.aleo @@ -0,0 +1,600 @@ +program merkle_tree.aleo; + +struct MerkleProof: + siblings as [field; 16u32]; + leaf_index as u32; + +function verify_inclusion: + input r0 as address.private; + input r1 as MerkleProof.private; + cast r0 into r2 as field; + assert.eq r2 r1.siblings[0u32]; + rem r1.leaf_index 2u32 into r3; + is.eq r3 0u32 into r4; + cast 1field r1.siblings[0u32] r1.siblings[1u32] into r5 as [field; 3u32]; + cast 1field r1.siblings[1u32] r1.siblings[0u32] into r6 as [field; 3u32]; + ternary r4 r5[0u32] r6[0u32] into r7; + ternary r4 r5[1u32] r6[1u32] into r8; + ternary r4 r5[2u32] r6[2u32] into r9; + cast r7 r8 r9 into r10 as [field; 3u32]; + hash.psd4 r10 into r11 as field; + is.eq r1.siblings[2u32] 0field into r12; + div r1.leaf_index 2u32 into r13; + rem r13 2u32 into r14; + is.eq r14 0u32 into r15; + cast 0field r11 r1.siblings[2u32] into r16 as [field; 3u32]; + cast 0field r1.siblings[2u32] r11 into r17 as [field; 3u32]; + ternary r15 r16[0u32] r17[0u32] into r18; + ternary r15 r16[1u32] r17[1u32] into r19; + ternary r15 r16[2u32] r17[2u32] into r20; + cast r18 r19 r20 into r21 as [field; 3u32]; + hash.psd4 r21 into r22 as field; + is.eq r1.siblings[3u32] 0field into r23; + div r1.leaf_index 4u32 into r24; + rem r24 2u32 into r25; + is.eq r25 0u32 into r26; + cast 0field r22 r1.siblings[3u32] into r27 as [field; 3u32]; + cast 0field r1.siblings[3u32] r22 into r28 as [field; 3u32]; + ternary r26 r27[0u32] r28[0u32] into r29; + ternary r26 r27[1u32] r28[1u32] into r30; + ternary r26 r27[2u32] r28[2u32] into r31; + cast r29 r30 r31 into r32 as [field; 3u32]; + hash.psd4 r32 into r33 as field; + is.eq r1.siblings[4u32] 0field into r34; + div r1.leaf_index 8u32 into r35; + rem r35 2u32 into r36; + is.eq r36 0u32 into r37; + cast 0field r33 r1.siblings[4u32] into r38 as [field; 3u32]; + cast 0field r1.siblings[4u32] r33 into r39 as [field; 3u32]; + ternary r37 r38[0u32] r39[0u32] into r40; + ternary r37 r38[1u32] r39[1u32] into r41; + ternary r37 r38[2u32] r39[2u32] into r42; + cast r40 r41 r42 into r43 as [field; 3u32]; + hash.psd4 r43 into r44 as field; + is.eq r1.siblings[5u32] 0field into r45; + div r1.leaf_index 16u32 into r46; + rem r46 2u32 into r47; + is.eq r47 0u32 into r48; + cast 0field r44 r1.siblings[5u32] into r49 as [field; 3u32]; + cast 0field r1.siblings[5u32] r44 into r50 as [field; 3u32]; + ternary r48 r49[0u32] r50[0u32] into r51; + ternary r48 r49[1u32] r50[1u32] into r52; + ternary r48 r49[2u32] r50[2u32] into r53; + cast r51 r52 r53 into r54 as [field; 3u32]; + hash.psd4 r54 into r55 as field; + is.eq r1.siblings[6u32] 0field into r56; + div r1.leaf_index 32u32 into r57; + rem r57 2u32 into r58; + is.eq r58 0u32 into r59; + cast 0field r55 r1.siblings[6u32] into r60 as [field; 3u32]; + cast 0field r1.siblings[6u32] r55 into r61 as [field; 3u32]; + ternary r59 r60[0u32] r61[0u32] into r62; + ternary r59 r60[1u32] r61[1u32] into r63; + ternary r59 r60[2u32] r61[2u32] into r64; + cast r62 r63 r64 into r65 as [field; 3u32]; + hash.psd4 r65 into r66 as field; + is.eq r1.siblings[7u32] 0field into r67; + div r1.leaf_index 64u32 into r68; + rem r68 2u32 into r69; + is.eq r69 0u32 into r70; + cast 0field r66 r1.siblings[7u32] into r71 as [field; 3u32]; + cast 0field r1.siblings[7u32] r66 into r72 as [field; 3u32]; + ternary r70 r71[0u32] r72[0u32] into r73; + ternary r70 r71[1u32] r72[1u32] into r74; + ternary r70 r71[2u32] r72[2u32] into r75; + cast r73 r74 r75 into r76 as [field; 3u32]; + hash.psd4 r76 into r77 as field; + is.eq r1.siblings[8u32] 0field into r78; + div r1.leaf_index 128u32 into r79; + rem r79 2u32 into r80; + is.eq r80 0u32 into r81; + cast 0field r77 r1.siblings[8u32] into r82 as [field; 3u32]; + cast 0field r1.siblings[8u32] r77 into r83 as [field; 3u32]; + ternary r81 r82[0u32] r83[0u32] into r84; + ternary r81 r82[1u32] r83[1u32] into r85; + ternary r81 r82[2u32] r83[2u32] into r86; + cast r84 r85 r86 into r87 as [field; 3u32]; + hash.psd4 r87 into r88 as field; + is.eq r1.siblings[9u32] 0field into r89; + div r1.leaf_index 256u32 into r90; + rem r90 2u32 into r91; + is.eq r91 0u32 into r92; + cast 0field r88 r1.siblings[9u32] into r93 as [field; 3u32]; + cast 0field r1.siblings[9u32] r88 into r94 as [field; 3u32]; + ternary r92 r93[0u32] r94[0u32] into r95; + ternary r92 r93[1u32] r94[1u32] into r96; + ternary r92 r93[2u32] r94[2u32] into r97; + cast r95 r96 r97 into r98 as [field; 3u32]; + hash.psd4 r98 into r99 as field; + is.eq r1.siblings[10u32] 0field into r100; + div r1.leaf_index 512u32 into r101; + rem r101 2u32 into r102; + is.eq r102 0u32 into r103; + cast 0field r99 r1.siblings[10u32] into r104 as [field; 3u32]; + cast 0field r1.siblings[10u32] r99 into r105 as [field; 3u32]; + ternary r103 r104[0u32] r105[0u32] into r106; + ternary r103 r104[1u32] r105[1u32] into r107; + ternary r103 r104[2u32] r105[2u32] into r108; + cast r106 r107 r108 into r109 as [field; 3u32]; + hash.psd4 r109 into r110 as field; + is.eq r1.siblings[11u32] 0field into r111; + div r1.leaf_index 1024u32 into r112; + rem r112 2u32 into r113; + is.eq r113 0u32 into r114; + cast 0field r110 r1.siblings[11u32] into r115 as [field; 3u32]; + cast 0field r1.siblings[11u32] r110 into r116 as [field; 3u32]; + ternary r114 r115[0u32] r116[0u32] into r117; + ternary r114 r115[1u32] r116[1u32] into r118; + ternary r114 r115[2u32] r116[2u32] into r119; + cast r117 r118 r119 into r120 as [field; 3u32]; + hash.psd4 r120 into r121 as field; + is.eq r1.siblings[12u32] 0field into r122; + div r1.leaf_index 2048u32 into r123; + rem r123 2u32 into r124; + is.eq r124 0u32 into r125; + cast 0field r121 r1.siblings[12u32] into r126 as [field; 3u32]; + cast 0field r1.siblings[12u32] r121 into r127 as [field; 3u32]; + ternary r125 r126[0u32] r127[0u32] into r128; + ternary r125 r126[1u32] r127[1u32] into r129; + ternary r125 r126[2u32] r127[2u32] into r130; + cast r128 r129 r130 into r131 as [field; 3u32]; + hash.psd4 r131 into r132 as field; + is.eq r1.siblings[13u32] 0field into r133; + div r1.leaf_index 4096u32 into r134; + rem r134 2u32 into r135; + is.eq r135 0u32 into r136; + cast 0field r132 r1.siblings[13u32] into r137 as [field; 3u32]; + cast 0field r1.siblings[13u32] r132 into r138 as [field; 3u32]; + ternary r136 r137[0u32] r138[0u32] into r139; + ternary r136 r137[1u32] r138[1u32] into r140; + ternary r136 r137[2u32] r138[2u32] into r141; + cast r139 r140 r141 into r142 as [field; 3u32]; + hash.psd4 r142 into r143 as field; + is.eq r1.siblings[14u32] 0field into r144; + div r1.leaf_index 8192u32 into r145; + rem r145 2u32 into r146; + is.eq r146 0u32 into r147; + cast 0field r143 r1.siblings[14u32] into r148 as [field; 3u32]; + cast 0field r1.siblings[14u32] r143 into r149 as [field; 3u32]; + ternary r147 r148[0u32] r149[0u32] into r150; + ternary r147 r148[1u32] r149[1u32] into r151; + ternary r147 r148[2u32] r149[2u32] into r152; + cast r150 r151 r152 into r153 as [field; 3u32]; + hash.psd4 r153 into r154 as field; + is.eq r1.siblings[15u32] 0field into r155; + div r1.leaf_index 16384u32 into r156; + rem r156 2u32 into r157; + is.eq r157 0u32 into r158; + cast 0field r154 r1.siblings[15u32] into r159 as [field; 3u32]; + cast 0field r1.siblings[15u32] r154 into r160 as [field; 3u32]; + ternary r158 r159[0u32] r160[0u32] into r161; + ternary r158 r159[1u32] r160[1u32] into r162; + ternary r158 r159[2u32] r160[2u32] into r163; + cast r161 r162 r163 into r164 as [field; 3u32]; + hash.psd4 r164 into r165 as field; + ternary r155 r154 r165 into r166; + ternary r144 r143 r166 into r167; + ternary r133 r132 r167 into r168; + ternary r122 r121 r168 into r169; + ternary r111 r110 r169 into r170; + ternary r100 r99 r170 into r171; + ternary r89 r88 r171 into r172; + ternary r78 r77 r172 into r173; + ternary r67 r66 r173 into r174; + ternary r56 r55 r174 into r175; + ternary r45 r44 r175 into r176; + ternary r34 r33 r176 into r177; + ternary r23 r22 r177 into r178; + ternary r12 r11 r178 into r179; + output r179 as field.private; + +function verify_non_inclusion: + input r0 as address.private; + input r1 as [MerkleProof; 2u32].private; + rem r1[0u32].leaf_index 2u32 into r2; + is.eq r2 0u32 into r3; + cast 1field r1[0u32].siblings[0u32] r1[0u32].siblings[1u32] into r4 as [field; 3u32]; + cast 1field r1[0u32].siblings[1u32] r1[0u32].siblings[0u32] into r5 as [field; 3u32]; + ternary r3 r4[0u32] r5[0u32] into r6; + ternary r3 r4[1u32] r5[1u32] into r7; + ternary r3 r4[2u32] r5[2u32] into r8; + cast r6 r7 r8 into r9 as [field; 3u32]; + hash.psd4 r9 into r10 as field; + is.eq r1[0u32].siblings[2u32] 0field into r11; + div r1[0u32].leaf_index 2u32 into r12; + rem r12 2u32 into r13; + is.eq r13 0u32 into r14; + cast 0field r10 r1[0u32].siblings[2u32] into r15 as [field; 3u32]; + cast 0field r1[0u32].siblings[2u32] r10 into r16 as [field; 3u32]; + ternary r14 r15[0u32] r16[0u32] into r17; + ternary r14 r15[1u32] r16[1u32] into r18; + ternary r14 r15[2u32] r16[2u32] into r19; + cast r17 r18 r19 into r20 as [field; 3u32]; + hash.psd4 r20 into r21 as field; + is.eq r1[0u32].siblings[3u32] 0field into r22; + div r1[0u32].leaf_index 4u32 into r23; + rem r23 2u32 into r24; + is.eq r24 0u32 into r25; + cast 0field r21 r1[0u32].siblings[3u32] into r26 as [field; 3u32]; + cast 0field r1[0u32].siblings[3u32] r21 into r27 as [field; 3u32]; + ternary r25 r26[0u32] r27[0u32] into r28; + ternary r25 r26[1u32] r27[1u32] into r29; + ternary r25 r26[2u32] r27[2u32] into r30; + cast r28 r29 r30 into r31 as [field; 3u32]; + hash.psd4 r31 into r32 as field; + is.eq r1[0u32].siblings[4u32] 0field into r33; + div r1[0u32].leaf_index 8u32 into r34; + rem r34 2u32 into r35; + is.eq r35 0u32 into r36; + cast 0field r32 r1[0u32].siblings[4u32] into r37 as [field; 3u32]; + cast 0field r1[0u32].siblings[4u32] r32 into r38 as [field; 3u32]; + ternary r36 r37[0u32] r38[0u32] into r39; + ternary r36 r37[1u32] r38[1u32] into r40; + ternary r36 r37[2u32] r38[2u32] into r41; + cast r39 r40 r41 into r42 as [field; 3u32]; + hash.psd4 r42 into r43 as field; + is.eq r1[0u32].siblings[5u32] 0field into r44; + div r1[0u32].leaf_index 16u32 into r45; + rem r45 2u32 into r46; + is.eq r46 0u32 into r47; + cast 0field r43 r1[0u32].siblings[5u32] into r48 as [field; 3u32]; + cast 0field r1[0u32].siblings[5u32] r43 into r49 as [field; 3u32]; + ternary r47 r48[0u32] r49[0u32] into r50; + ternary r47 r48[1u32] r49[1u32] into r51; + ternary r47 r48[2u32] r49[2u32] into r52; + cast r50 r51 r52 into r53 as [field; 3u32]; + hash.psd4 r53 into r54 as field; + is.eq r1[0u32].siblings[6u32] 0field into r55; + div r1[0u32].leaf_index 32u32 into r56; + rem r56 2u32 into r57; + is.eq r57 0u32 into r58; + cast 0field r54 r1[0u32].siblings[6u32] into r59 as [field; 3u32]; + cast 0field r1[0u32].siblings[6u32] r54 into r60 as [field; 3u32]; + ternary r58 r59[0u32] r60[0u32] into r61; + ternary r58 r59[1u32] r60[1u32] into r62; + ternary r58 r59[2u32] r60[2u32] into r63; + cast r61 r62 r63 into r64 as [field; 3u32]; + hash.psd4 r64 into r65 as field; + is.eq r1[0u32].siblings[7u32] 0field into r66; + div r1[0u32].leaf_index 64u32 into r67; + rem r67 2u32 into r68; + is.eq r68 0u32 into r69; + cast 0field r65 r1[0u32].siblings[7u32] into r70 as [field; 3u32]; + cast 0field r1[0u32].siblings[7u32] r65 into r71 as [field; 3u32]; + ternary r69 r70[0u32] r71[0u32] into r72; + ternary r69 r70[1u32] r71[1u32] into r73; + ternary r69 r70[2u32] r71[2u32] into r74; + cast r72 r73 r74 into r75 as [field; 3u32]; + hash.psd4 r75 into r76 as field; + is.eq r1[0u32].siblings[8u32] 0field into r77; + div r1[0u32].leaf_index 128u32 into r78; + rem r78 2u32 into r79; + is.eq r79 0u32 into r80; + cast 0field r76 r1[0u32].siblings[8u32] into r81 as [field; 3u32]; + cast 0field r1[0u32].siblings[8u32] r76 into r82 as [field; 3u32]; + ternary r80 r81[0u32] r82[0u32] into r83; + ternary r80 r81[1u32] r82[1u32] into r84; + ternary r80 r81[2u32] r82[2u32] into r85; + cast r83 r84 r85 into r86 as [field; 3u32]; + hash.psd4 r86 into r87 as field; + is.eq r1[0u32].siblings[9u32] 0field into r88; + div r1[0u32].leaf_index 256u32 into r89; + rem r89 2u32 into r90; + is.eq r90 0u32 into r91; + cast 0field r87 r1[0u32].siblings[9u32] into r92 as [field; 3u32]; + cast 0field r1[0u32].siblings[9u32] r87 into r93 as [field; 3u32]; + ternary r91 r92[0u32] r93[0u32] into r94; + ternary r91 r92[1u32] r93[1u32] into r95; + ternary r91 r92[2u32] r93[2u32] into r96; + cast r94 r95 r96 into r97 as [field; 3u32]; + hash.psd4 r97 into r98 as field; + is.eq r1[0u32].siblings[10u32] 0field into r99; + div r1[0u32].leaf_index 512u32 into r100; + rem r100 2u32 into r101; + is.eq r101 0u32 into r102; + cast 0field r98 r1[0u32].siblings[10u32] into r103 as [field; 3u32]; + cast 0field r1[0u32].siblings[10u32] r98 into r104 as [field; 3u32]; + ternary r102 r103[0u32] r104[0u32] into r105; + ternary r102 r103[1u32] r104[1u32] into r106; + ternary r102 r103[2u32] r104[2u32] into r107; + cast r105 r106 r107 into r108 as [field; 3u32]; + hash.psd4 r108 into r109 as field; + is.eq r1[0u32].siblings[11u32] 0field into r110; + div r1[0u32].leaf_index 1024u32 into r111; + rem r111 2u32 into r112; + is.eq r112 0u32 into r113; + cast 0field r109 r1[0u32].siblings[11u32] into r114 as [field; 3u32]; + cast 0field r1[0u32].siblings[11u32] r109 into r115 as [field; 3u32]; + ternary r113 r114[0u32] r115[0u32] into r116; + ternary r113 r114[1u32] r115[1u32] into r117; + ternary r113 r114[2u32] r115[2u32] into r118; + cast r116 r117 r118 into r119 as [field; 3u32]; + hash.psd4 r119 into r120 as field; + is.eq r1[0u32].siblings[12u32] 0field into r121; + div r1[0u32].leaf_index 2048u32 into r122; + rem r122 2u32 into r123; + is.eq r123 0u32 into r124; + cast 0field r120 r1[0u32].siblings[12u32] into r125 as [field; 3u32]; + cast 0field r1[0u32].siblings[12u32] r120 into r126 as [field; 3u32]; + ternary r124 r125[0u32] r126[0u32] into r127; + ternary r124 r125[1u32] r126[1u32] into r128; + ternary r124 r125[2u32] r126[2u32] into r129; + cast r127 r128 r129 into r130 as [field; 3u32]; + hash.psd4 r130 into r131 as field; + is.eq r1[0u32].siblings[13u32] 0field into r132; + div r1[0u32].leaf_index 4096u32 into r133; + rem r133 2u32 into r134; + is.eq r134 0u32 into r135; + cast 0field r131 r1[0u32].siblings[13u32] into r136 as [field; 3u32]; + cast 0field r1[0u32].siblings[13u32] r131 into r137 as [field; 3u32]; + ternary r135 r136[0u32] r137[0u32] into r138; + ternary r135 r136[1u32] r137[1u32] into r139; + ternary r135 r136[2u32] r137[2u32] into r140; + cast r138 r139 r140 into r141 as [field; 3u32]; + hash.psd4 r141 into r142 as field; + is.eq r1[0u32].siblings[14u32] 0field into r143; + div r1[0u32].leaf_index 8192u32 into r144; + rem r144 2u32 into r145; + is.eq r145 0u32 into r146; + cast 0field r142 r1[0u32].siblings[14u32] into r147 as [field; 3u32]; + cast 0field r1[0u32].siblings[14u32] r142 into r148 as [field; 3u32]; + ternary r146 r147[0u32] r148[0u32] into r149; + ternary r146 r147[1u32] r148[1u32] into r150; + ternary r146 r147[2u32] r148[2u32] into r151; + cast r149 r150 r151 into r152 as [field; 3u32]; + hash.psd4 r152 into r153 as field; + is.eq r1[0u32].siblings[15u32] 0field into r154; + div r1[0u32].leaf_index 16384u32 into r155; + rem r155 2u32 into r156; + is.eq r156 0u32 into r157; + cast 0field r153 r1[0u32].siblings[15u32] into r158 as [field; 3u32]; + cast 0field r1[0u32].siblings[15u32] r153 into r159 as [field; 3u32]; + ternary r157 r158[0u32] r159[0u32] into r160; + ternary r157 r158[1u32] r159[1u32] into r161; + ternary r157 r158[2u32] r159[2u32] into r162; + cast r160 r161 r162 into r163 as [field; 3u32]; + hash.psd4 r163 into r164 as field; + ternary r154 r153 r164 into r165; + ternary r154 14u32 15u32 into r166; + ternary r143 r142 r165 into r167; + ternary r143 13u32 r166 into r168; + ternary r132 r131 r167 into r169; + ternary r132 12u32 r168 into r170; + ternary r121 r120 r169 into r171; + ternary r121 11u32 r170 into r172; + ternary r110 r109 r171 into r173; + ternary r110 10u32 r172 into r174; + ternary r99 r98 r173 into r175; + ternary r99 9u32 r174 into r176; + ternary r88 r87 r175 into r177; + ternary r88 8u32 r176 into r178; + ternary r77 r76 r177 into r179; + ternary r77 7u32 r178 into r180; + ternary r66 r65 r179 into r181; + ternary r66 6u32 r180 into r182; + ternary r55 r54 r181 into r183; + ternary r55 5u32 r182 into r184; + ternary r44 r43 r183 into r185; + ternary r44 4u32 r184 into r186; + ternary r33 r32 r185 into r187; + ternary r33 3u32 r186 into r188; + ternary r22 r21 r187 into r189; + ternary r22 2u32 r188 into r190; + ternary r11 r10 r189 into r191; + ternary r11 1u32 r190 into r192; + rem r1[1u32].leaf_index 2u32 into r193; + is.eq r193 0u32 into r194; + cast 1field r1[1u32].siblings[0u32] r1[1u32].siblings[1u32] into r195 as [field; 3u32]; + cast 1field r1[1u32].siblings[1u32] r1[1u32].siblings[0u32] into r196 as [field; 3u32]; + ternary r194 r195[0u32] r196[0u32] into r197; + ternary r194 r195[1u32] r196[1u32] into r198; + ternary r194 r195[2u32] r196[2u32] into r199; + cast r197 r198 r199 into r200 as [field; 3u32]; + hash.psd4 r200 into r201 as field; + is.eq r1[1u32].siblings[2u32] 0field into r202; + div r1[1u32].leaf_index 2u32 into r203; + rem r203 2u32 into r204; + is.eq r204 0u32 into r205; + cast 0field r201 r1[1u32].siblings[2u32] into r206 as [field; 3u32]; + cast 0field r1[1u32].siblings[2u32] r201 into r207 as [field; 3u32]; + ternary r205 r206[0u32] r207[0u32] into r208; + ternary r205 r206[1u32] r207[1u32] into r209; + ternary r205 r206[2u32] r207[2u32] into r210; + cast r208 r209 r210 into r211 as [field; 3u32]; + hash.psd4 r211 into r212 as field; + is.eq r1[1u32].siblings[3u32] 0field into r213; + div r1[1u32].leaf_index 4u32 into r214; + rem r214 2u32 into r215; + is.eq r215 0u32 into r216; + cast 0field r212 r1[1u32].siblings[3u32] into r217 as [field; 3u32]; + cast 0field r1[1u32].siblings[3u32] r212 into r218 as [field; 3u32]; + ternary r216 r217[0u32] r218[0u32] into r219; + ternary r216 r217[1u32] r218[1u32] into r220; + ternary r216 r217[2u32] r218[2u32] into r221; + cast r219 r220 r221 into r222 as [field; 3u32]; + hash.psd4 r222 into r223 as field; + is.eq r1[1u32].siblings[4u32] 0field into r224; + div r1[1u32].leaf_index 8u32 into r225; + rem r225 2u32 into r226; + is.eq r226 0u32 into r227; + cast 0field r223 r1[1u32].siblings[4u32] into r228 as [field; 3u32]; + cast 0field r1[1u32].siblings[4u32] r223 into r229 as [field; 3u32]; + ternary r227 r228[0u32] r229[0u32] into r230; + ternary r227 r228[1u32] r229[1u32] into r231; + ternary r227 r228[2u32] r229[2u32] into r232; + cast r230 r231 r232 into r233 as [field; 3u32]; + hash.psd4 r233 into r234 as field; + is.eq r1[1u32].siblings[5u32] 0field into r235; + div r1[1u32].leaf_index 16u32 into r236; + rem r236 2u32 into r237; + is.eq r237 0u32 into r238; + cast 0field r234 r1[1u32].siblings[5u32] into r239 as [field; 3u32]; + cast 0field r1[1u32].siblings[5u32] r234 into r240 as [field; 3u32]; + ternary r238 r239[0u32] r240[0u32] into r241; + ternary r238 r239[1u32] r240[1u32] into r242; + ternary r238 r239[2u32] r240[2u32] into r243; + cast r241 r242 r243 into r244 as [field; 3u32]; + hash.psd4 r244 into r245 as field; + is.eq r1[1u32].siblings[6u32] 0field into r246; + div r1[1u32].leaf_index 32u32 into r247; + rem r247 2u32 into r248; + is.eq r248 0u32 into r249; + cast 0field r245 r1[1u32].siblings[6u32] into r250 as [field; 3u32]; + cast 0field r1[1u32].siblings[6u32] r245 into r251 as [field; 3u32]; + ternary r249 r250[0u32] r251[0u32] into r252; + ternary r249 r250[1u32] r251[1u32] into r253; + ternary r249 r250[2u32] r251[2u32] into r254; + cast r252 r253 r254 into r255 as [field; 3u32]; + hash.psd4 r255 into r256 as field; + is.eq r1[1u32].siblings[7u32] 0field into r257; + div r1[1u32].leaf_index 64u32 into r258; + rem r258 2u32 into r259; + is.eq r259 0u32 into r260; + cast 0field r256 r1[1u32].siblings[7u32] into r261 as [field; 3u32]; + cast 0field r1[1u32].siblings[7u32] r256 into r262 as [field; 3u32]; + ternary r260 r261[0u32] r262[0u32] into r263; + ternary r260 r261[1u32] r262[1u32] into r264; + ternary r260 r261[2u32] r262[2u32] into r265; + cast r263 r264 r265 into r266 as [field; 3u32]; + hash.psd4 r266 into r267 as field; + is.eq r1[1u32].siblings[8u32] 0field into r268; + div r1[1u32].leaf_index 128u32 into r269; + rem r269 2u32 into r270; + is.eq r270 0u32 into r271; + cast 0field r267 r1[1u32].siblings[8u32] into r272 as [field; 3u32]; + cast 0field r1[1u32].siblings[8u32] r267 into r273 as [field; 3u32]; + ternary r271 r272[0u32] r273[0u32] into r274; + ternary r271 r272[1u32] r273[1u32] into r275; + ternary r271 r272[2u32] r273[2u32] into r276; + cast r274 r275 r276 into r277 as [field; 3u32]; + hash.psd4 r277 into r278 as field; + is.eq r1[1u32].siblings[9u32] 0field into r279; + div r1[1u32].leaf_index 256u32 into r280; + rem r280 2u32 into r281; + is.eq r281 0u32 into r282; + cast 0field r278 r1[1u32].siblings[9u32] into r283 as [field; 3u32]; + cast 0field r1[1u32].siblings[9u32] r278 into r284 as [field; 3u32]; + ternary r282 r283[0u32] r284[0u32] into r285; + ternary r282 r283[1u32] r284[1u32] into r286; + ternary r282 r283[2u32] r284[2u32] into r287; + cast r285 r286 r287 into r288 as [field; 3u32]; + hash.psd4 r288 into r289 as field; + is.eq r1[1u32].siblings[10u32] 0field into r290; + div r1[1u32].leaf_index 512u32 into r291; + rem r291 2u32 into r292; + is.eq r292 0u32 into r293; + cast 0field r289 r1[1u32].siblings[10u32] into r294 as [field; 3u32]; + cast 0field r1[1u32].siblings[10u32] r289 into r295 as [field; 3u32]; + ternary r293 r294[0u32] r295[0u32] into r296; + ternary r293 r294[1u32] r295[1u32] into r297; + ternary r293 r294[2u32] r295[2u32] into r298; + cast r296 r297 r298 into r299 as [field; 3u32]; + hash.psd4 r299 into r300 as field; + is.eq r1[1u32].siblings[11u32] 0field into r301; + div r1[1u32].leaf_index 1024u32 into r302; + rem r302 2u32 into r303; + is.eq r303 0u32 into r304; + cast 0field r300 r1[1u32].siblings[11u32] into r305 as [field; 3u32]; + cast 0field r1[1u32].siblings[11u32] r300 into r306 as [field; 3u32]; + ternary r304 r305[0u32] r306[0u32] into r307; + ternary r304 r305[1u32] r306[1u32] into r308; + ternary r304 r305[2u32] r306[2u32] into r309; + cast r307 r308 r309 into r310 as [field; 3u32]; + hash.psd4 r310 into r311 as field; + is.eq r1[1u32].siblings[12u32] 0field into r312; + div r1[1u32].leaf_index 2048u32 into r313; + rem r313 2u32 into r314; + is.eq r314 0u32 into r315; + cast 0field r311 r1[1u32].siblings[12u32] into r316 as [field; 3u32]; + cast 0field r1[1u32].siblings[12u32] r311 into r317 as [field; 3u32]; + ternary r315 r316[0u32] r317[0u32] into r318; + ternary r315 r316[1u32] r317[1u32] into r319; + ternary r315 r316[2u32] r317[2u32] into r320; + cast r318 r319 r320 into r321 as [field; 3u32]; + hash.psd4 r321 into r322 as field; + is.eq r1[1u32].siblings[13u32] 0field into r323; + div r1[1u32].leaf_index 4096u32 into r324; + rem r324 2u32 into r325; + is.eq r325 0u32 into r326; + cast 0field r322 r1[1u32].siblings[13u32] into r327 as [field; 3u32]; + cast 0field r1[1u32].siblings[13u32] r322 into r328 as [field; 3u32]; + ternary r326 r327[0u32] r328[0u32] into r329; + ternary r326 r327[1u32] r328[1u32] into r330; + ternary r326 r327[2u32] r328[2u32] into r331; + cast r329 r330 r331 into r332 as [field; 3u32]; + hash.psd4 r332 into r333 as field; + is.eq r1[1u32].siblings[14u32] 0field into r334; + div r1[1u32].leaf_index 8192u32 into r335; + rem r335 2u32 into r336; + is.eq r336 0u32 into r337; + cast 0field r333 r1[1u32].siblings[14u32] into r338 as [field; 3u32]; + cast 0field r1[1u32].siblings[14u32] r333 into r339 as [field; 3u32]; + ternary r337 r338[0u32] r339[0u32] into r340; + ternary r337 r338[1u32] r339[1u32] into r341; + ternary r337 r338[2u32] r339[2u32] into r342; + cast r340 r341 r342 into r343 as [field; 3u32]; + hash.psd4 r343 into r344 as field; + is.eq r1[1u32].siblings[15u32] 0field into r345; + div r1[1u32].leaf_index 16384u32 into r346; + rem r346 2u32 into r347; + is.eq r347 0u32 into r348; + cast 0field r344 r1[1u32].siblings[15u32] into r349 as [field; 3u32]; + cast 0field r1[1u32].siblings[15u32] r344 into r350 as [field; 3u32]; + ternary r348 r349[0u32] r350[0u32] into r351; + ternary r348 r349[1u32] r350[1u32] into r352; + ternary r348 r349[2u32] r350[2u32] into r353; + cast r351 r352 r353 into r354 as [field; 3u32]; + hash.psd4 r354 into r355 as field; + ternary r345 r344 r355 into r356; + ternary r334 r333 r356 into r357; + ternary r323 r322 r357 into r358; + ternary r312 r311 r358 into r359; + ternary r301 r300 r359 into r360; + ternary r290 r289 r360 into r361; + ternary r279 r278 r361 into r362; + ternary r268 r267 r362 into r363; + ternary r257 r256 r363 into r364; + ternary r246 r245 r364 into r365; + ternary r235 r234 r365 into r366; + ternary r224 r223 r366 into r367; + ternary r213 r212 r367 into r368; + ternary r202 r201 r368 into r369; + assert.eq r191 r369; + cast r0 into r370 as field; + is.eq r1[0u32].leaf_index r1[1u32].leaf_index into r371; + is.eq r1[0u32].leaf_index 0u32 into r372; + lt r370 r1[0u32].siblings[0u32] into r373; + and r371 r372 into r374; + not r374 into r375; + or r373 r375 into r376; + assert.eq r376 true; + not r372 into r377; + pow 2u32 r192 into r378; + sub r378 1u32 into r379; + and r371 r377 into r380; + not r380 into r381; + is.eq r1[0u32].leaf_index r379 into r382; + or r382 r381 into r383; + assert.eq r383 true; + gt r370 r1[0u32].siblings[0u32] into r384; + or r384 r381 into r385; + assert.eq r385 true; + not r371 into r386; + gt r370 r1[0u32].siblings[0u32] into r387; + not r386 into r388; + or r387 r388 into r389; + assert.eq r389 true; + lt r370 r1[1u32].siblings[0u32] into r390; + or r390 r388 into r391; + assert.eq r391 true; + lte r1[1u32].leaf_index r379 into r392; + or r392 r388 into r393; + assert.eq r393 true; + add r1[0u32].leaf_index 1u32 into r394; + is.eq r394 r1[1u32].leaf_index into r395; + or r395 r388 into r396; + assert.eq r396 true; + output r191 as field.private; + +constructor: + assert.eq edition 0u16; diff --git a/examples/private-mint/private-mint-wrapper/build/imports/test_usdcx_bridge.aleo b/examples/private-mint/private-mint-wrapper/build/imports/test_usdcx_bridge.aleo new file mode 100644 index 00000000..d78e62fe --- /dev/null +++ b/examples/private-mint/private-mint-wrapper/build/imports/test_usdcx_bridge.aleo @@ -0,0 +1,783 @@ +import merkle_tree.aleo; +import test_usdcx_multisig_core.aleo; +import test_usdcx_freezelist.aleo; +import test_usdcx_stablecoin.aleo; +program test_usdcx_bridge.aleo; + +struct ChecksumEdition: + checksum as [u8; 32u32]; + edition as u16; + +mapping circle_attester: + key as boolean.public; + value as [u8; 20u32].public; + +mapping minimum_burn_amount: + key as boolean.public; + value as u128.public; + +mapping nullifier: + key as [u8; 32u32].public; + value as boolean.public; + +mapping paused: + key as boolean.public; + value as boolean.public; + +mapping emergency_paused: + key as boolean.public; + value as boolean.public; + +function get_signing_op_id_for_deploy: + input r0 as [u8; 32u32].private; + input r1 as u16.private; + cast r0 r1 into r2 as ChecksumEdition; + hash.bhp256 r2 into r3 as field; + output r3 as field.private; + +function mint_private: + input r0 as [u8; 240u32].private; + input r1 as [u8; 65u32].private; + input r2 as [u8; 32u32].private; + input r3 as [test_usdcx_stablecoin.aleo/MerkleProof; 2u32].private; + cast r0[0u32] r0[1u32] r0[2u32] r0[3u32] into r4 as [u8; 4u32]; + cast 90u8 46u8 10u8 205u8 into r5 as [u8; 4u32]; + is.eq r4 r5 into r6; + assert.eq r6 true; + cast r0[4u32] r0[5u32] r0[6u32] r0[7u32] into r7 as [u8; 4u32]; + cast 0u8 0u8 0u8 1u8 into r8 as [u8; 4u32]; + is.eq r7 r8 into r9; + assert.eq r9 true; + cast r0[24u32] r0[25u32] r0[26u32] r0[27u32] r0[28u32] r0[29u32] r0[30u32] r0[31u32] r0[32u32] r0[33u32] r0[34u32] r0[35u32] r0[36u32] r0[37u32] r0[38u32] r0[39u32] into r10 as [u8; 16u32]; + cast r10[0u32] into r11 as u128; + mul r11 1329227995784915872903807060280344576u128 into r12; + add 0u128 r12 into r13; + cast r10[1u32] into r14 as u128; + mul r14 5192296858534827628530496329220096u128 into r15; + add r13 r15 into r16; + cast r10[2u32] into r17 as u128; + mul r17 20282409603651670423947251286016u128 into r18; + add r16 r18 into r19; + cast r10[3u32] into r20 as u128; + mul r20 79228162514264337593543950336u128 into r21; + add r19 r21 into r22; + cast r10[4u32] into r23 as u128; + mul r23 309485009821345068724781056u128 into r24; + add r22 r24 into r25; + cast r10[5u32] into r26 as u128; + mul r26 1208925819614629174706176u128 into r27; + add r25 r27 into r28; + cast r10[6u32] into r29 as u128; + mul r29 4722366482869645213696u128 into r30; + add r28 r30 into r31; + cast r10[7u32] into r32 as u128; + mul r32 18446744073709551616u128 into r33; + add r31 r33 into r34; + cast r10[8u32] into r35 as u128; + mul r35 72057594037927936u128 into r36; + add r34 r36 into r37; + cast r10[9u32] into r38 as u128; + mul r38 281474976710656u128 into r39; + add r37 r39 into r40; + cast r10[10u32] into r41 as u128; + mul r41 1099511627776u128 into r42; + add r40 r42 into r43; + cast r10[11u32] into r44 as u128; + mul r44 4294967296u128 into r45; + add r43 r45 into r46; + cast r10[12u32] into r47 as u128; + mul r47 16777216u128 into r48; + add r46 r48 into r49; + cast r10[13u32] into r50 as u128; + mul r50 65536u128 into r51; + add r49 r51 into r52; + cast r10[14u32] into r53 as u128; + mul r53 256u128 into r54; + add r52 r54 into r55; + cast r10[15u32] into r56 as u128; + mul r56 1u128 into r57; + add r55 r57 into r58; + gt r58 0u128 into r59; + assert.eq r59 true; + cast r0[40u32] r0[41u32] r0[42u32] r0[43u32] into r60 as [u8; 4u32]; + cast 0u8 0u8 39u8 18u8 into r61 as [u8; 4u32]; + is.eq r60 r61 into r62; + assert.eq r62 true; + cast 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 into r63 as [u8; 32u32]; + cast r0[108u32] r0[109u32] r0[110u32] r0[111u32] r0[112u32] r0[113u32] r0[114u32] r0[115u32] r0[116u32] r0[117u32] r0[118u32] r0[119u32] r0[120u32] r0[121u32] r0[122u32] r0[123u32] r0[124u32] r0[125u32] r0[126u32] r0[127u32] r0[128u32] r0[129u32] r0[130u32] r0[131u32] r0[132u32] r0[133u32] r0[134u32] r0[135u32] r0[136u32] r0[137u32] r0[138u32] r0[139u32] into r64 as [u8; 32u32]; + is.neq r64 r63 into r65; + assert.eq r65 true; + cast r0[76u32] r0[77u32] r0[78u32] r0[79u32] r0[80u32] r0[81u32] r0[82u32] r0[83u32] r0[84u32] r0[85u32] r0[86u32] r0[87u32] r0[88u32] r0[89u32] r0[90u32] r0[91u32] r0[92u32] r0[93u32] r0[94u32] r0[95u32] r0[96u32] r0[97u32] r0[98u32] r0[99u32] r0[100u32] r0[101u32] r0[102u32] r0[103u32] r0[104u32] r0[105u32] r0[106u32] r0[107u32] into r66 as [u8; 32u32]; + is.neq r66 r63 into r67; + assert.eq r67 true; + serialize.bits.raw r66 ([u8; 32u32]) into r68 ([boolean; 256u32]); + cast r68[0u32] r68[1u32] r68[2u32] r68[3u32] r68[4u32] r68[5u32] r68[6u32] r68[7u32] r68[8u32] r68[9u32] r68[10u32] r68[11u32] r68[12u32] r68[13u32] r68[14u32] r68[15u32] r68[16u32] r68[17u32] r68[18u32] r68[19u32] r68[20u32] r68[21u32] r68[22u32] r68[23u32] r68[24u32] r68[25u32] r68[26u32] r68[27u32] r68[28u32] r68[29u32] r68[30u32] r68[31u32] r68[32u32] r68[33u32] r68[34u32] r68[35u32] r68[36u32] r68[37u32] r68[38u32] r68[39u32] r68[40u32] r68[41u32] r68[42u32] r68[43u32] r68[44u32] r68[45u32] r68[46u32] r68[47u32] r68[48u32] r68[49u32] r68[50u32] r68[51u32] r68[52u32] r68[53u32] r68[54u32] r68[55u32] r68[56u32] r68[57u32] r68[58u32] r68[59u32] r68[60u32] r68[61u32] r68[62u32] r68[63u32] r68[64u32] r68[65u32] r68[66u32] r68[67u32] r68[68u32] r68[69u32] r68[70u32] r68[71u32] r68[72u32] r68[73u32] r68[74u32] r68[75u32] r68[76u32] r68[77u32] r68[78u32] r68[79u32] r68[80u32] r68[81u32] r68[82u32] r68[83u32] r68[84u32] r68[85u32] r68[86u32] r68[87u32] r68[88u32] r68[89u32] r68[90u32] r68[91u32] r68[92u32] r68[93u32] r68[94u32] r68[95u32] r68[96u32] r68[97u32] r68[98u32] r68[99u32] r68[100u32] r68[101u32] r68[102u32] r68[103u32] r68[104u32] r68[105u32] r68[106u32] r68[107u32] r68[108u32] r68[109u32] r68[110u32] r68[111u32] r68[112u32] r68[113u32] r68[114u32] r68[115u32] r68[116u32] r68[117u32] r68[118u32] r68[119u32] r68[120u32] r68[121u32] r68[122u32] r68[123u32] r68[124u32] r68[125u32] r68[126u32] r68[127u32] r68[128u32] r68[129u32] r68[130u32] r68[131u32] r68[132u32] r68[133u32] r68[134u32] r68[135u32] r68[136u32] r68[137u32] r68[138u32] r68[139u32] r68[140u32] r68[141u32] r68[142u32] r68[143u32] r68[144u32] r68[145u32] r68[146u32] r68[147u32] r68[148u32] r68[149u32] r68[150u32] r68[151u32] r68[152u32] r68[153u32] r68[154u32] r68[155u32] r68[156u32] r68[157u32] r68[158u32] r68[159u32] r68[160u32] r68[161u32] r68[162u32] r68[163u32] r68[164u32] r68[165u32] r68[166u32] r68[167u32] r68[168u32] r68[169u32] r68[170u32] r68[171u32] r68[172u32] r68[173u32] r68[174u32] r68[175u32] r68[176u32] r68[177u32] r68[178u32] r68[179u32] r68[180u32] r68[181u32] r68[182u32] r68[183u32] r68[184u32] r68[185u32] r68[186u32] r68[187u32] r68[188u32] r68[189u32] r68[190u32] r68[191u32] r68[192u32] r68[193u32] r68[194u32] r68[195u32] r68[196u32] r68[197u32] r68[198u32] r68[199u32] r68[200u32] r68[201u32] r68[202u32] r68[203u32] r68[204u32] r68[205u32] r68[206u32] r68[207u32] r68[208u32] r68[209u32] r68[210u32] r68[211u32] r68[212u32] r68[213u32] r68[214u32] r68[215u32] r68[216u32] r68[217u32] r68[218u32] r68[219u32] r68[220u32] r68[221u32] r68[222u32] r68[223u32] r68[224u32] r68[225u32] r68[226u32] r68[227u32] r68[228u32] r68[229u32] r68[230u32] r68[231u32] r68[232u32] r68[233u32] r68[234u32] r68[235u32] r68[236u32] r68[237u32] r68[238u32] r68[239u32] r68[240u32] r68[241u32] r68[242u32] r68[243u32] r68[244u32] r68[245u32] r68[246u32] r68[247u32] r68[248u32] r68[249u32] r68[250u32] r68[251u32] r68[252u32] into r69 as [boolean; 253u32]; + deserialize.bits.raw r69 ([boolean; 253u32]) into r70 (address); + hash.keccak256.native.raw r0 into r71 as [boolean; 256u32]; + deserialize.bits.raw r71 ([boolean; 256u32]) into r72 ([u8; 32u32]); + is.eq r72 r2 into r73; + assert.eq r73 true; + cast r0[204u32] r0[205u32] r0[206u32] r0[207u32] r0[208u32] r0[209u32] r0[210u32] r0[211u32] r0[212u32] r0[213u32] r0[214u32] r0[215u32] r0[216u32] r0[217u32] r0[218u32] r0[219u32] r0[220u32] r0[221u32] r0[222u32] r0[223u32] r0[224u32] r0[225u32] r0[226u32] r0[227u32] r0[228u32] r0[229u32] r0[230u32] r0[231u32] r0[232u32] r0[233u32] r0[234u32] r0[235u32] into r74 as [u8; 32u32]; + rem r3[0u32].leaf_index 2u32 into r75; + is.eq r75 0u32 into r76; + cast 1field r3[0u32].siblings[0u32] r3[0u32].siblings[1u32] into r77 as [field; 3u32]; + cast 1field r3[0u32].siblings[1u32] r3[0u32].siblings[0u32] into r78 as [field; 3u32]; + ternary r76 r77[0u32] r78[0u32] into r79; + ternary r76 r77[1u32] r78[1u32] into r80; + ternary r76 r77[2u32] r78[2u32] into r81; + cast r79 r80 r81 into r82 as [field; 3u32]; + hash.psd4 r82 into r83 as field; + is.eq r3[0u32].siblings[2u32] 0field into r84; + div r3[0u32].leaf_index 2u32 into r85; + rem r85 2u32 into r86; + is.eq r86 0u32 into r87; + cast 0field r83 r3[0u32].siblings[2u32] into r88 as [field; 3u32]; + cast 0field r3[0u32].siblings[2u32] r83 into r89 as [field; 3u32]; + ternary r87 r88[0u32] r89[0u32] into r90; + ternary r87 r88[1u32] r89[1u32] into r91; + ternary r87 r88[2u32] r89[2u32] into r92; + cast r90 r91 r92 into r93 as [field; 3u32]; + hash.psd4 r93 into r94 as field; + is.eq r3[0u32].siblings[3u32] 0field into r95; + div r3[0u32].leaf_index 4u32 into r96; + rem r96 2u32 into r97; + is.eq r97 0u32 into r98; + cast 0field r94 r3[0u32].siblings[3u32] into r99 as [field; 3u32]; + cast 0field r3[0u32].siblings[3u32] r94 into r100 as [field; 3u32]; + ternary r98 r99[0u32] r100[0u32] into r101; + ternary r98 r99[1u32] r100[1u32] into r102; + ternary r98 r99[2u32] r100[2u32] into r103; + cast r101 r102 r103 into r104 as [field; 3u32]; + hash.psd4 r104 into r105 as field; + is.eq r3[0u32].siblings[4u32] 0field into r106; + div r3[0u32].leaf_index 8u32 into r107; + rem r107 2u32 into r108; + is.eq r108 0u32 into r109; + cast 0field r105 r3[0u32].siblings[4u32] into r110 as [field; 3u32]; + cast 0field r3[0u32].siblings[4u32] r105 into r111 as [field; 3u32]; + ternary r109 r110[0u32] r111[0u32] into r112; + ternary r109 r110[1u32] r111[1u32] into r113; + ternary r109 r110[2u32] r111[2u32] into r114; + cast r112 r113 r114 into r115 as [field; 3u32]; + hash.psd4 r115 into r116 as field; + is.eq r3[0u32].siblings[5u32] 0field into r117; + div r3[0u32].leaf_index 16u32 into r118; + rem r118 2u32 into r119; + is.eq r119 0u32 into r120; + cast 0field r116 r3[0u32].siblings[5u32] into r121 as [field; 3u32]; + cast 0field r3[0u32].siblings[5u32] r116 into r122 as [field; 3u32]; + ternary r120 r121[0u32] r122[0u32] into r123; + ternary r120 r121[1u32] r122[1u32] into r124; + ternary r120 r121[2u32] r122[2u32] into r125; + cast r123 r124 r125 into r126 as [field; 3u32]; + hash.psd4 r126 into r127 as field; + is.eq r3[0u32].siblings[6u32] 0field into r128; + div r3[0u32].leaf_index 32u32 into r129; + rem r129 2u32 into r130; + is.eq r130 0u32 into r131; + cast 0field r127 r3[0u32].siblings[6u32] into r132 as [field; 3u32]; + cast 0field r3[0u32].siblings[6u32] r127 into r133 as [field; 3u32]; + ternary r131 r132[0u32] r133[0u32] into r134; + ternary r131 r132[1u32] r133[1u32] into r135; + ternary r131 r132[2u32] r133[2u32] into r136; + cast r134 r135 r136 into r137 as [field; 3u32]; + hash.psd4 r137 into r138 as field; + is.eq r3[0u32].siblings[7u32] 0field into r139; + div r3[0u32].leaf_index 64u32 into r140; + rem r140 2u32 into r141; + is.eq r141 0u32 into r142; + cast 0field r138 r3[0u32].siblings[7u32] into r143 as [field; 3u32]; + cast 0field r3[0u32].siblings[7u32] r138 into r144 as [field; 3u32]; + ternary r142 r143[0u32] r144[0u32] into r145; + ternary r142 r143[1u32] r144[1u32] into r146; + ternary r142 r143[2u32] r144[2u32] into r147; + cast r145 r146 r147 into r148 as [field; 3u32]; + hash.psd4 r148 into r149 as field; + is.eq r3[0u32].siblings[8u32] 0field into r150; + div r3[0u32].leaf_index 128u32 into r151; + rem r151 2u32 into r152; + is.eq r152 0u32 into r153; + cast 0field r149 r3[0u32].siblings[8u32] into r154 as [field; 3u32]; + cast 0field r3[0u32].siblings[8u32] r149 into r155 as [field; 3u32]; + ternary r153 r154[0u32] r155[0u32] into r156; + ternary r153 r154[1u32] r155[1u32] into r157; + ternary r153 r154[2u32] r155[2u32] into r158; + cast r156 r157 r158 into r159 as [field; 3u32]; + hash.psd4 r159 into r160 as field; + is.eq r3[0u32].siblings[9u32] 0field into r161; + div r3[0u32].leaf_index 256u32 into r162; + rem r162 2u32 into r163; + is.eq r163 0u32 into r164; + cast 0field r160 r3[0u32].siblings[9u32] into r165 as [field; 3u32]; + cast 0field r3[0u32].siblings[9u32] r160 into r166 as [field; 3u32]; + ternary r164 r165[0u32] r166[0u32] into r167; + ternary r164 r165[1u32] r166[1u32] into r168; + ternary r164 r165[2u32] r166[2u32] into r169; + cast r167 r168 r169 into r170 as [field; 3u32]; + hash.psd4 r170 into r171 as field; + is.eq r3[0u32].siblings[10u32] 0field into r172; + div r3[0u32].leaf_index 512u32 into r173; + rem r173 2u32 into r174; + is.eq r174 0u32 into r175; + cast 0field r171 r3[0u32].siblings[10u32] into r176 as [field; 3u32]; + cast 0field r3[0u32].siblings[10u32] r171 into r177 as [field; 3u32]; + ternary r175 r176[0u32] r177[0u32] into r178; + ternary r175 r176[1u32] r177[1u32] into r179; + ternary r175 r176[2u32] r177[2u32] into r180; + cast r178 r179 r180 into r181 as [field; 3u32]; + hash.psd4 r181 into r182 as field; + is.eq r3[0u32].siblings[11u32] 0field into r183; + div r3[0u32].leaf_index 1024u32 into r184; + rem r184 2u32 into r185; + is.eq r185 0u32 into r186; + cast 0field r182 r3[0u32].siblings[11u32] into r187 as [field; 3u32]; + cast 0field r3[0u32].siblings[11u32] r182 into r188 as [field; 3u32]; + ternary r186 r187[0u32] r188[0u32] into r189; + ternary r186 r187[1u32] r188[1u32] into r190; + ternary r186 r187[2u32] r188[2u32] into r191; + cast r189 r190 r191 into r192 as [field; 3u32]; + hash.psd4 r192 into r193 as field; + is.eq r3[0u32].siblings[12u32] 0field into r194; + div r3[0u32].leaf_index 2048u32 into r195; + rem r195 2u32 into r196; + is.eq r196 0u32 into r197; + cast 0field r193 r3[0u32].siblings[12u32] into r198 as [field; 3u32]; + cast 0field r3[0u32].siblings[12u32] r193 into r199 as [field; 3u32]; + ternary r197 r198[0u32] r199[0u32] into r200; + ternary r197 r198[1u32] r199[1u32] into r201; + ternary r197 r198[2u32] r199[2u32] into r202; + cast r200 r201 r202 into r203 as [field; 3u32]; + hash.psd4 r203 into r204 as field; + is.eq r3[0u32].siblings[13u32] 0field into r205; + div r3[0u32].leaf_index 4096u32 into r206; + rem r206 2u32 into r207; + is.eq r207 0u32 into r208; + cast 0field r204 r3[0u32].siblings[13u32] into r209 as [field; 3u32]; + cast 0field r3[0u32].siblings[13u32] r204 into r210 as [field; 3u32]; + ternary r208 r209[0u32] r210[0u32] into r211; + ternary r208 r209[1u32] r210[1u32] into r212; + ternary r208 r209[2u32] r210[2u32] into r213; + cast r211 r212 r213 into r214 as [field; 3u32]; + hash.psd4 r214 into r215 as field; + is.eq r3[0u32].siblings[14u32] 0field into r216; + div r3[0u32].leaf_index 8192u32 into r217; + rem r217 2u32 into r218; + is.eq r218 0u32 into r219; + cast 0field r215 r3[0u32].siblings[14u32] into r220 as [field; 3u32]; + cast 0field r3[0u32].siblings[14u32] r215 into r221 as [field; 3u32]; + ternary r219 r220[0u32] r221[0u32] into r222; + ternary r219 r220[1u32] r221[1u32] into r223; + ternary r219 r220[2u32] r221[2u32] into r224; + cast r222 r223 r224 into r225 as [field; 3u32]; + hash.psd4 r225 into r226 as field; + is.eq r3[0u32].siblings[15u32] 0field into r227; + div r3[0u32].leaf_index 16384u32 into r228; + rem r228 2u32 into r229; + is.eq r229 0u32 into r230; + cast 0field r226 r3[0u32].siblings[15u32] into r231 as [field; 3u32]; + cast 0field r3[0u32].siblings[15u32] r226 into r232 as [field; 3u32]; + ternary r230 r231[0u32] r232[0u32] into r233; + ternary r230 r231[1u32] r232[1u32] into r234; + ternary r230 r231[2u32] r232[2u32] into r235; + cast r233 r234 r235 into r236 as [field; 3u32]; + hash.psd4 r236 into r237 as field; + ternary r227 r226 r237 into r238; + ternary r227 14u32 15u32 into r239; + ternary r216 r215 r238 into r240; + ternary r216 13u32 r239 into r241; + ternary r205 r204 r240 into r242; + ternary r205 12u32 r241 into r243; + ternary r194 r193 r242 into r244; + ternary r194 11u32 r243 into r245; + ternary r183 r182 r244 into r246; + ternary r183 10u32 r245 into r247; + ternary r172 r171 r246 into r248; + ternary r172 9u32 r247 into r249; + ternary r161 r160 r248 into r250; + ternary r161 8u32 r249 into r251; + ternary r150 r149 r250 into r252; + ternary r150 7u32 r251 into r253; + ternary r139 r138 r252 into r254; + ternary r139 6u32 r253 into r255; + ternary r128 r127 r254 into r256; + ternary r128 5u32 r255 into r257; + ternary r117 r116 r256 into r258; + ternary r117 4u32 r257 into r259; + ternary r106 r105 r258 into r260; + ternary r106 3u32 r259 into r261; + ternary r95 r94 r260 into r262; + ternary r95 2u32 r261 into r263; + ternary r84 r83 r262 into r264; + ternary r84 1u32 r263 into r265; + rem r3[1u32].leaf_index 2u32 into r266; + is.eq r266 0u32 into r267; + cast 1field r3[1u32].siblings[0u32] r3[1u32].siblings[1u32] into r268 as [field; 3u32]; + cast 1field r3[1u32].siblings[1u32] r3[1u32].siblings[0u32] into r269 as [field; 3u32]; + ternary r267 r268[0u32] r269[0u32] into r270; + ternary r267 r268[1u32] r269[1u32] into r271; + ternary r267 r268[2u32] r269[2u32] into r272; + cast r270 r271 r272 into r273 as [field; 3u32]; + hash.psd4 r273 into r274 as field; + is.eq r3[1u32].siblings[2u32] 0field into r275; + div r3[1u32].leaf_index 2u32 into r276; + rem r276 2u32 into r277; + is.eq r277 0u32 into r278; + cast 0field r274 r3[1u32].siblings[2u32] into r279 as [field; 3u32]; + cast 0field r3[1u32].siblings[2u32] r274 into r280 as [field; 3u32]; + ternary r278 r279[0u32] r280[0u32] into r281; + ternary r278 r279[1u32] r280[1u32] into r282; + ternary r278 r279[2u32] r280[2u32] into r283; + cast r281 r282 r283 into r284 as [field; 3u32]; + hash.psd4 r284 into r285 as field; + is.eq r3[1u32].siblings[3u32] 0field into r286; + div r3[1u32].leaf_index 4u32 into r287; + rem r287 2u32 into r288; + is.eq r288 0u32 into r289; + cast 0field r285 r3[1u32].siblings[3u32] into r290 as [field; 3u32]; + cast 0field r3[1u32].siblings[3u32] r285 into r291 as [field; 3u32]; + ternary r289 r290[0u32] r291[0u32] into r292; + ternary r289 r290[1u32] r291[1u32] into r293; + ternary r289 r290[2u32] r291[2u32] into r294; + cast r292 r293 r294 into r295 as [field; 3u32]; + hash.psd4 r295 into r296 as field; + is.eq r3[1u32].siblings[4u32] 0field into r297; + div r3[1u32].leaf_index 8u32 into r298; + rem r298 2u32 into r299; + is.eq r299 0u32 into r300; + cast 0field r296 r3[1u32].siblings[4u32] into r301 as [field; 3u32]; + cast 0field r3[1u32].siblings[4u32] r296 into r302 as [field; 3u32]; + ternary r300 r301[0u32] r302[0u32] into r303; + ternary r300 r301[1u32] r302[1u32] into r304; + ternary r300 r301[2u32] r302[2u32] into r305; + cast r303 r304 r305 into r306 as [field; 3u32]; + hash.psd4 r306 into r307 as field; + is.eq r3[1u32].siblings[5u32] 0field into r308; + div r3[1u32].leaf_index 16u32 into r309; + rem r309 2u32 into r310; + is.eq r310 0u32 into r311; + cast 0field r307 r3[1u32].siblings[5u32] into r312 as [field; 3u32]; + cast 0field r3[1u32].siblings[5u32] r307 into r313 as [field; 3u32]; + ternary r311 r312[0u32] r313[0u32] into r314; + ternary r311 r312[1u32] r313[1u32] into r315; + ternary r311 r312[2u32] r313[2u32] into r316; + cast r314 r315 r316 into r317 as [field; 3u32]; + hash.psd4 r317 into r318 as field; + is.eq r3[1u32].siblings[6u32] 0field into r319; + div r3[1u32].leaf_index 32u32 into r320; + rem r320 2u32 into r321; + is.eq r321 0u32 into r322; + cast 0field r318 r3[1u32].siblings[6u32] into r323 as [field; 3u32]; + cast 0field r3[1u32].siblings[6u32] r318 into r324 as [field; 3u32]; + ternary r322 r323[0u32] r324[0u32] into r325; + ternary r322 r323[1u32] r324[1u32] into r326; + ternary r322 r323[2u32] r324[2u32] into r327; + cast r325 r326 r327 into r328 as [field; 3u32]; + hash.psd4 r328 into r329 as field; + is.eq r3[1u32].siblings[7u32] 0field into r330; + div r3[1u32].leaf_index 64u32 into r331; + rem r331 2u32 into r332; + is.eq r332 0u32 into r333; + cast 0field r329 r3[1u32].siblings[7u32] into r334 as [field; 3u32]; + cast 0field r3[1u32].siblings[7u32] r329 into r335 as [field; 3u32]; + ternary r333 r334[0u32] r335[0u32] into r336; + ternary r333 r334[1u32] r335[1u32] into r337; + ternary r333 r334[2u32] r335[2u32] into r338; + cast r336 r337 r338 into r339 as [field; 3u32]; + hash.psd4 r339 into r340 as field; + is.eq r3[1u32].siblings[8u32] 0field into r341; + div r3[1u32].leaf_index 128u32 into r342; + rem r342 2u32 into r343; + is.eq r343 0u32 into r344; + cast 0field r340 r3[1u32].siblings[8u32] into r345 as [field; 3u32]; + cast 0field r3[1u32].siblings[8u32] r340 into r346 as [field; 3u32]; + ternary r344 r345[0u32] r346[0u32] into r347; + ternary r344 r345[1u32] r346[1u32] into r348; + ternary r344 r345[2u32] r346[2u32] into r349; + cast r347 r348 r349 into r350 as [field; 3u32]; + hash.psd4 r350 into r351 as field; + is.eq r3[1u32].siblings[9u32] 0field into r352; + div r3[1u32].leaf_index 256u32 into r353; + rem r353 2u32 into r354; + is.eq r354 0u32 into r355; + cast 0field r351 r3[1u32].siblings[9u32] into r356 as [field; 3u32]; + cast 0field r3[1u32].siblings[9u32] r351 into r357 as [field; 3u32]; + ternary r355 r356[0u32] r357[0u32] into r358; + ternary r355 r356[1u32] r357[1u32] into r359; + ternary r355 r356[2u32] r357[2u32] into r360; + cast r358 r359 r360 into r361 as [field; 3u32]; + hash.psd4 r361 into r362 as field; + is.eq r3[1u32].siblings[10u32] 0field into r363; + div r3[1u32].leaf_index 512u32 into r364; + rem r364 2u32 into r365; + is.eq r365 0u32 into r366; + cast 0field r362 r3[1u32].siblings[10u32] into r367 as [field; 3u32]; + cast 0field r3[1u32].siblings[10u32] r362 into r368 as [field; 3u32]; + ternary r366 r367[0u32] r368[0u32] into r369; + ternary r366 r367[1u32] r368[1u32] into r370; + ternary r366 r367[2u32] r368[2u32] into r371; + cast r369 r370 r371 into r372 as [field; 3u32]; + hash.psd4 r372 into r373 as field; + is.eq r3[1u32].siblings[11u32] 0field into r374; + div r3[1u32].leaf_index 1024u32 into r375; + rem r375 2u32 into r376; + is.eq r376 0u32 into r377; + cast 0field r373 r3[1u32].siblings[11u32] into r378 as [field; 3u32]; + cast 0field r3[1u32].siblings[11u32] r373 into r379 as [field; 3u32]; + ternary r377 r378[0u32] r379[0u32] into r380; + ternary r377 r378[1u32] r379[1u32] into r381; + ternary r377 r378[2u32] r379[2u32] into r382; + cast r380 r381 r382 into r383 as [field; 3u32]; + hash.psd4 r383 into r384 as field; + is.eq r3[1u32].siblings[12u32] 0field into r385; + div r3[1u32].leaf_index 2048u32 into r386; + rem r386 2u32 into r387; + is.eq r387 0u32 into r388; + cast 0field r384 r3[1u32].siblings[12u32] into r389 as [field; 3u32]; + cast 0field r3[1u32].siblings[12u32] r384 into r390 as [field; 3u32]; + ternary r388 r389[0u32] r390[0u32] into r391; + ternary r388 r389[1u32] r390[1u32] into r392; + ternary r388 r389[2u32] r390[2u32] into r393; + cast r391 r392 r393 into r394 as [field; 3u32]; + hash.psd4 r394 into r395 as field; + is.eq r3[1u32].siblings[13u32] 0field into r396; + div r3[1u32].leaf_index 4096u32 into r397; + rem r397 2u32 into r398; + is.eq r398 0u32 into r399; + cast 0field r395 r3[1u32].siblings[13u32] into r400 as [field; 3u32]; + cast 0field r3[1u32].siblings[13u32] r395 into r401 as [field; 3u32]; + ternary r399 r400[0u32] r401[0u32] into r402; + ternary r399 r400[1u32] r401[1u32] into r403; + ternary r399 r400[2u32] r401[2u32] into r404; + cast r402 r403 r404 into r405 as [field; 3u32]; + hash.psd4 r405 into r406 as field; + is.eq r3[1u32].siblings[14u32] 0field into r407; + div r3[1u32].leaf_index 8192u32 into r408; + rem r408 2u32 into r409; + is.eq r409 0u32 into r410; + cast 0field r406 r3[1u32].siblings[14u32] into r411 as [field; 3u32]; + cast 0field r3[1u32].siblings[14u32] r406 into r412 as [field; 3u32]; + ternary r410 r411[0u32] r412[0u32] into r413; + ternary r410 r411[1u32] r412[1u32] into r414; + ternary r410 r411[2u32] r412[2u32] into r415; + cast r413 r414 r415 into r416 as [field; 3u32]; + hash.psd4 r416 into r417 as field; + is.eq r3[1u32].siblings[15u32] 0field into r418; + div r3[1u32].leaf_index 16384u32 into r419; + rem r419 2u32 into r420; + is.eq r420 0u32 into r421; + cast 0field r417 r3[1u32].siblings[15u32] into r422 as [field; 3u32]; + cast 0field r3[1u32].siblings[15u32] r417 into r423 as [field; 3u32]; + ternary r421 r422[0u32] r423[0u32] into r424; + ternary r421 r422[1u32] r423[1u32] into r425; + ternary r421 r422[2u32] r423[2u32] into r426; + cast r424 r425 r426 into r427 as [field; 3u32]; + hash.psd4 r427 into r428 as field; + ternary r418 r417 r428 into r429; + ternary r407 r406 r429 into r430; + ternary r396 r395 r430 into r431; + ternary r385 r384 r431 into r432; + ternary r374 r373 r432 into r433; + ternary r363 r362 r433 into r434; + ternary r352 r351 r434 into r435; + ternary r341 r340 r435 into r436; + ternary r330 r329 r436 into r437; + ternary r319 r318 r437 into r438; + ternary r308 r307 r438 into r439; + ternary r297 r296 r439 into r440; + ternary r286 r285 r440 into r441; + ternary r275 r274 r441 into r442; + assert.eq r264 r442; + cast r70 into r443 as field; + is.eq r3[0u32].leaf_index r3[1u32].leaf_index into r444; + is.eq r3[0u32].leaf_index 0u32 into r445; + lt r443 r3[0u32].siblings[0u32] into r446; + and r444 r445 into r447; + not r447 into r448; + or r446 r448 into r449; + assert.eq r449 true; + not r445 into r450; + pow 2u32 r265 into r451; + sub r451 1u32 into r452; + and r444 r450 into r453; + not r453 into r454; + is.eq r3[0u32].leaf_index r452 into r455; + or r455 r454 into r456; + assert.eq r456 true; + gt r443 r3[0u32].siblings[0u32] into r457; + or r457 r454 into r458; + assert.eq r458 true; + not r444 into r459; + gt r443 r3[0u32].siblings[0u32] into r460; + not r459 into r461; + or r460 r461 into r462; + assert.eq r462 true; + lt r443 r3[1u32].siblings[0u32] into r463; + or r463 r461 into r464; + assert.eq r464 true; + lte r3[1u32].leaf_index r452 into r465; + or r465 r461 into r466; + assert.eq r466 true; + add r3[0u32].leaf_index 1u32 into r467; + is.eq r467 r3[1u32].leaf_index into r468; + or r468 r461 into r469; + assert.eq r469 true; + call test_usdcx_stablecoin.aleo/mint_private r70 r58 into r470 r471 r472; + async mint_private r1 r72 r74 r264 r472 into r473; + output r470 as test_usdcx_stablecoin.aleo/ComplianceRecord.record; + output r471 as test_usdcx_stablecoin.aleo/Token.record; + output r473 as test_usdcx_bridge.aleo/mint_private.future; + +finalize mint_private: + input r0 as [u8; 65u32].public; + input r1 as [u8; 32u32].public; + input r2 as [u8; 32u32].public; + input r3 as field.public; + input r4 as test_usdcx_stablecoin.aleo/mint_private.future; + get.or_use paused[true] false into r5; + assert.eq r5 false; + get test_usdcx_freezelist.aleo/freeze_list_root[1u8] into r6; + get test_usdcx_freezelist.aleo/block_height_window[true] into r7; + is.neq r6 r3 into r8; + branch.eq r8 false to end_then_0_0; + get test_usdcx_freezelist.aleo/freeze_list_root[2u8] into r9; + assert.eq r3 r9; + get test_usdcx_freezelist.aleo/root_updated_height[true] into r10; + add r10 r7 into r11; + gt r11 block.height into r12; + assert.eq r12 true; + branch.eq true true to end_otherwise_0_1; + position end_then_0_0; + position end_otherwise_0_1; + get.or_use emergency_paused[true] false into r13; + assert.eq r13 false; + cast 106u8 105u8 181u8 221u8 121u8 253u8 161u8 10u8 65u8 94u8 131u8 172u8 7u8 63u8 62u8 121u8 240u8 79u8 59u8 174u8 into r14 as [u8; 20u32]; + get.or_use circle_attester[true] r14 into r15; + ecdsa.verify.digest.eth r0 r15 r1 into r16; + assert.eq r16 true; + contains nullifier[r2] into r17; + is.eq r17 false into r18; + assert.eq r18 true; + set true into nullifier[r2]; + await r4; + +function mint_public: + input r0 as [u8; 240u32].private; + input r1 as [u8; 65u32].private; + input r2 as [u8; 32u32].private; + input r3 as [u8; 32u32].private; + cast r0[0u32] r0[1u32] r0[2u32] r0[3u32] into r4 as [u8; 4u32]; + cast 90u8 46u8 10u8 205u8 into r5 as [u8; 4u32]; + is.eq r4 r5 into r6; + assert.eq r6 true; + cast r0[4u32] r0[5u32] r0[6u32] r0[7u32] into r7 as [u8; 4u32]; + cast 0u8 0u8 0u8 1u8 into r8 as [u8; 4u32]; + is.eq r7 r8 into r9; + assert.eq r9 true; + cast r0[24u32] r0[25u32] r0[26u32] r0[27u32] r0[28u32] r0[29u32] r0[30u32] r0[31u32] r0[32u32] r0[33u32] r0[34u32] r0[35u32] r0[36u32] r0[37u32] r0[38u32] r0[39u32] into r10 as [u8; 16u32]; + cast r10[0u32] into r11 as u128; + mul r11 1329227995784915872903807060280344576u128 into r12; + add 0u128 r12 into r13; + cast r10[1u32] into r14 as u128; + mul r14 5192296858534827628530496329220096u128 into r15; + add r13 r15 into r16; + cast r10[2u32] into r17 as u128; + mul r17 20282409603651670423947251286016u128 into r18; + add r16 r18 into r19; + cast r10[3u32] into r20 as u128; + mul r20 79228162514264337593543950336u128 into r21; + add r19 r21 into r22; + cast r10[4u32] into r23 as u128; + mul r23 309485009821345068724781056u128 into r24; + add r22 r24 into r25; + cast r10[5u32] into r26 as u128; + mul r26 1208925819614629174706176u128 into r27; + add r25 r27 into r28; + cast r10[6u32] into r29 as u128; + mul r29 4722366482869645213696u128 into r30; + add r28 r30 into r31; + cast r10[7u32] into r32 as u128; + mul r32 18446744073709551616u128 into r33; + add r31 r33 into r34; + cast r10[8u32] into r35 as u128; + mul r35 72057594037927936u128 into r36; + add r34 r36 into r37; + cast r10[9u32] into r38 as u128; + mul r38 281474976710656u128 into r39; + add r37 r39 into r40; + cast r10[10u32] into r41 as u128; + mul r41 1099511627776u128 into r42; + add r40 r42 into r43; + cast r10[11u32] into r44 as u128; + mul r44 4294967296u128 into r45; + add r43 r45 into r46; + cast r10[12u32] into r47 as u128; + mul r47 16777216u128 into r48; + add r46 r48 into r49; + cast r10[13u32] into r50 as u128; + mul r50 65536u128 into r51; + add r49 r51 into r52; + cast r10[14u32] into r53 as u128; + mul r53 256u128 into r54; + add r52 r54 into r55; + cast r10[15u32] into r56 as u128; + mul r56 1u128 into r57; + add r55 r57 into r58; + gt r58 0u128 into r59; + assert.eq r59 true; + cast r0[40u32] r0[41u32] r0[42u32] r0[43u32] into r60 as [u8; 4u32]; + cast 0u8 0u8 39u8 18u8 into r61 as [u8; 4u32]; + is.eq r60 r61 into r62; + assert.eq r62 true; + cast 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 into r63 as [u8; 32u32]; + cast r0[108u32] r0[109u32] r0[110u32] r0[111u32] r0[112u32] r0[113u32] r0[114u32] r0[115u32] r0[116u32] r0[117u32] r0[118u32] r0[119u32] r0[120u32] r0[121u32] r0[122u32] r0[123u32] r0[124u32] r0[125u32] r0[126u32] r0[127u32] r0[128u32] r0[129u32] r0[130u32] r0[131u32] r0[132u32] r0[133u32] r0[134u32] r0[135u32] r0[136u32] r0[137u32] r0[138u32] r0[139u32] into r64 as [u8; 32u32]; + is.neq r64 r63 into r65; + assert.eq r65 true; + cast r0[76u32] r0[77u32] r0[78u32] r0[79u32] r0[80u32] r0[81u32] r0[82u32] r0[83u32] r0[84u32] r0[85u32] r0[86u32] r0[87u32] r0[88u32] r0[89u32] r0[90u32] r0[91u32] r0[92u32] r0[93u32] r0[94u32] r0[95u32] r0[96u32] r0[97u32] r0[98u32] r0[99u32] r0[100u32] r0[101u32] r0[102u32] r0[103u32] r0[104u32] r0[105u32] r0[106u32] r0[107u32] into r66 as [u8; 32u32]; + is.neq r66 r63 into r67; + assert.eq r67 true; + serialize.bits.raw r66 ([u8; 32u32]) into r68 ([boolean; 256u32]); + cast r68[0u32] r68[1u32] r68[2u32] r68[3u32] r68[4u32] r68[5u32] r68[6u32] r68[7u32] r68[8u32] r68[9u32] r68[10u32] r68[11u32] r68[12u32] r68[13u32] r68[14u32] r68[15u32] r68[16u32] r68[17u32] r68[18u32] r68[19u32] r68[20u32] r68[21u32] r68[22u32] r68[23u32] r68[24u32] r68[25u32] r68[26u32] r68[27u32] r68[28u32] r68[29u32] r68[30u32] r68[31u32] r68[32u32] r68[33u32] r68[34u32] r68[35u32] r68[36u32] r68[37u32] r68[38u32] r68[39u32] r68[40u32] r68[41u32] r68[42u32] r68[43u32] r68[44u32] r68[45u32] r68[46u32] r68[47u32] r68[48u32] r68[49u32] r68[50u32] r68[51u32] r68[52u32] r68[53u32] r68[54u32] r68[55u32] r68[56u32] r68[57u32] r68[58u32] r68[59u32] r68[60u32] r68[61u32] r68[62u32] r68[63u32] r68[64u32] r68[65u32] r68[66u32] r68[67u32] r68[68u32] r68[69u32] r68[70u32] r68[71u32] r68[72u32] r68[73u32] r68[74u32] r68[75u32] r68[76u32] r68[77u32] r68[78u32] r68[79u32] r68[80u32] r68[81u32] r68[82u32] r68[83u32] r68[84u32] r68[85u32] r68[86u32] r68[87u32] r68[88u32] r68[89u32] r68[90u32] r68[91u32] r68[92u32] r68[93u32] r68[94u32] r68[95u32] r68[96u32] r68[97u32] r68[98u32] r68[99u32] r68[100u32] r68[101u32] r68[102u32] r68[103u32] r68[104u32] r68[105u32] r68[106u32] r68[107u32] r68[108u32] r68[109u32] r68[110u32] r68[111u32] r68[112u32] r68[113u32] r68[114u32] r68[115u32] r68[116u32] r68[117u32] r68[118u32] r68[119u32] r68[120u32] r68[121u32] r68[122u32] r68[123u32] r68[124u32] r68[125u32] r68[126u32] r68[127u32] r68[128u32] r68[129u32] r68[130u32] r68[131u32] r68[132u32] r68[133u32] r68[134u32] r68[135u32] r68[136u32] r68[137u32] r68[138u32] r68[139u32] r68[140u32] r68[141u32] r68[142u32] r68[143u32] r68[144u32] r68[145u32] r68[146u32] r68[147u32] r68[148u32] r68[149u32] r68[150u32] r68[151u32] r68[152u32] r68[153u32] r68[154u32] r68[155u32] r68[156u32] r68[157u32] r68[158u32] r68[159u32] r68[160u32] r68[161u32] r68[162u32] r68[163u32] r68[164u32] r68[165u32] r68[166u32] r68[167u32] r68[168u32] r68[169u32] r68[170u32] r68[171u32] r68[172u32] r68[173u32] r68[174u32] r68[175u32] r68[176u32] r68[177u32] r68[178u32] r68[179u32] r68[180u32] r68[181u32] r68[182u32] r68[183u32] r68[184u32] r68[185u32] r68[186u32] r68[187u32] r68[188u32] r68[189u32] r68[190u32] r68[191u32] r68[192u32] r68[193u32] r68[194u32] r68[195u32] r68[196u32] r68[197u32] r68[198u32] r68[199u32] r68[200u32] r68[201u32] r68[202u32] r68[203u32] r68[204u32] r68[205u32] r68[206u32] r68[207u32] r68[208u32] r68[209u32] r68[210u32] r68[211u32] r68[212u32] r68[213u32] r68[214u32] r68[215u32] r68[216u32] r68[217u32] r68[218u32] r68[219u32] r68[220u32] r68[221u32] r68[222u32] r68[223u32] r68[224u32] r68[225u32] r68[226u32] r68[227u32] r68[228u32] r68[229u32] r68[230u32] r68[231u32] r68[232u32] r68[233u32] r68[234u32] r68[235u32] r68[236u32] r68[237u32] r68[238u32] r68[239u32] r68[240u32] r68[241u32] r68[242u32] r68[243u32] r68[244u32] r68[245u32] r68[246u32] r68[247u32] r68[248u32] r68[249u32] r68[250u32] r68[251u32] r68[252u32] into r69 as [boolean; 253u32]; + deserialize.bits.raw r69 ([boolean; 253u32]) into r70 (address); + hash.keccak256.native.raw r0 into r71 as [boolean; 256u32]; + deserialize.bits.raw r71 ([boolean; 256u32]) into r72 ([u8; 32u32]); + is.eq r72 r2 into r73; + assert.eq r73 true; + cast r0[204u32] r0[205u32] r0[206u32] r0[207u32] r0[208u32] r0[209u32] r0[210u32] r0[211u32] r0[212u32] r0[213u32] r0[214u32] r0[215u32] r0[216u32] r0[217u32] r0[218u32] r0[219u32] r0[220u32] r0[221u32] r0[222u32] r0[223u32] r0[224u32] r0[225u32] r0[226u32] r0[227u32] r0[228u32] r0[229u32] r0[230u32] r0[231u32] r0[232u32] r0[233u32] r0[234u32] r0[235u32] into r74 as [u8; 32u32]; + is.eq r70 bridge_demo_v1.aleo into r75; + not r75 into r76; + is.neq r3 r63 into r77; + or r77 r76 into r78; + assert.eq r78 true; + call test_usdcx_stablecoin.aleo/mint_public r70 r58 into r79; + async mint_public r1 r72 r74 r70 r79 into r80; + output r80 as test_usdcx_bridge.aleo/mint_public.future; + +finalize mint_public: + input r0 as [u8; 65u32].public; + input r1 as [u8; 32u32].public; + input r2 as [u8; 32u32].public; + input r3 as address.public; + input r4 as test_usdcx_stablecoin.aleo/mint_public.future; + get.or_use paused[true] false into r5; + assert.eq r5 false; + get.or_use emergency_paused[true] false into r6; + assert.eq r6 false; + get.or_use test_usdcx_freezelist.aleo/freeze_list[r3] false into r7; + assert.eq r7 false; + cast 106u8 105u8 181u8 221u8 121u8 253u8 161u8 10u8 65u8 94u8 131u8 172u8 7u8 63u8 62u8 121u8 240u8 79u8 59u8 174u8 into r8 as [u8; 20u32]; + get.or_use circle_attester[true] r8 into r9; + ecdsa.verify.digest.eth r0 r9 r1 into r10; + assert.eq r10 true; + contains nullifier[r2] into r11; + is.eq r11 false into r12; + assert.eq r12 true; + set true into nullifier[r2]; + await r4; + +function burn: + input r0 as u128.public; + input r1 as u32.public; + input r2 as [u8; 32u32].public; + assert.neq self.caller self.caller; + call test_usdcx_stablecoin.aleo/burn_public self.caller r0 into r3; + async burn self.caller r3 into r4; + output r4 as test_usdcx_bridge.aleo/burn.future; + +finalize burn: + input r0 as address.public; + input r1 as test_usdcx_stablecoin.aleo/burn_public.future; + get.or_use paused[true] false into r2; + assert.eq r2 false; + get.or_use emergency_paused[true] false into r3; + assert.eq r3 false; + get.or_use test_usdcx_freezelist.aleo/freeze_list[r0] false into r4; + assert.eq r4 false; + await r1; + +function burn_public: + input r0 as u128.public; + input r1 as u32.public; + input r2 as [u8; 32u32].public; + call test_usdcx_stablecoin.aleo/burn_public self.caller r0 into r3; + async burn_public r0 self.caller r3 into r4; + output r4 as test_usdcx_bridge.aleo/burn_public.future; + +finalize burn_public: + input r0 as u128.public; + input r1 as address.public; + input r2 as test_usdcx_stablecoin.aleo/burn_public.future; + get.or_use paused[true] false into r3; + assert.eq r3 false; + get.or_use minimum_burn_amount[true] 1000000u128 into r4; + gte r0 r4 into r5; + assert.eq r5 true; + get.or_use test_usdcx_freezelist.aleo/freeze_list[r1] false into r6; + assert.eq r6 false; + await r2; + +function burn_public_as_signer: + input r0 as u128.public; + input r1 as u32.public; + input r2 as [u8; 32u32].public; + call test_usdcx_stablecoin.aleo/burn_public self.signer r0 into r3; + async burn_public_as_signer r0 self.signer r3 into r4; + output r4 as test_usdcx_bridge.aleo/burn_public_as_signer.future; + +finalize burn_public_as_signer: + input r0 as u128.public; + input r1 as address.public; + input r2 as test_usdcx_stablecoin.aleo/burn_public.future; + get.or_use paused[true] false into r3; + assert.eq r3 false; + get.or_use minimum_burn_amount[true] 1000000u128 into r4; + gte r0 r4 into r5; + assert.eq r5 true; + get.or_use test_usdcx_freezelist.aleo/freeze_list[r1] false into r6; + assert.eq r6 false; + await r2; + +function set_pause_status: + input r0 as boolean.private; + assert.eq self.caller aleo1rhgdu77hgyqd3xjj8ucu3jj9r2krwz6mnzyd80gncr5fxcwlh5rsvzp9px; + async set_pause_status r0 into r1; + output r1 as test_usdcx_bridge.aleo/set_pause_status.future; + +finalize set_pause_status: + input r0 as boolean.public; + set r0 into paused[true]; + +function set_circle_attester: + input r0 as [u8; 20u32].private; + assert.eq self.caller aleo1rhgdu77hgyqd3xjj8ucu3jj9r2krwz6mnzyd80gncr5fxcwlh5rsvzp9px; + async set_circle_attester r0 into r1; + output r1 as test_usdcx_bridge.aleo/set_circle_attester.future; + +finalize set_circle_attester: + input r0 as [u8; 20u32].public; + set r0 into circle_attester[true]; + +function set_minimum_burn_amount: + input r0 as u128.private; + assert.eq self.caller aleo1rhgdu77hgyqd3xjj8ucu3jj9r2krwz6mnzyd80gncr5fxcwlh5rsvzp9px; + async set_minimum_burn_amount r0 into r1; + output r1 as test_usdcx_bridge.aleo/set_minimum_burn_amount.future; + +finalize set_minimum_burn_amount: + input r0 as u128.public; + set r0 into minimum_burn_amount[true]; + +function address_to_bytes_raw: + input r0 as address.private; + serialize.bits.raw r0 (address) into r1 ([boolean; 253u32]); + cast false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false into r2 as [boolean; 256u32]; + cast r1[0u32] r1[1u32] r1[2u32] r1[3u32] r1[4u32] r1[5u32] r1[6u32] r1[7u32] r1[8u32] r1[9u32] r1[10u32] r1[11u32] r1[12u32] r1[13u32] r1[14u32] r1[15u32] r1[16u32] r1[17u32] r1[18u32] r1[19u32] r1[20u32] r1[21u32] r1[22u32] r1[23u32] r1[24u32] r1[25u32] r1[26u32] r1[27u32] r1[28u32] r1[29u32] r1[30u32] r1[31u32] r1[32u32] r1[33u32] r1[34u32] r1[35u32] r1[36u32] r1[37u32] r1[38u32] r1[39u32] r1[40u32] r1[41u32] r1[42u32] r1[43u32] r1[44u32] r1[45u32] r1[46u32] r1[47u32] r1[48u32] r1[49u32] r1[50u32] r1[51u32] r1[52u32] r1[53u32] r1[54u32] r1[55u32] r1[56u32] r1[57u32] r1[58u32] r1[59u32] r1[60u32] r1[61u32] r1[62u32] r1[63u32] r1[64u32] r1[65u32] r1[66u32] r1[67u32] r1[68u32] r1[69u32] r1[70u32] r1[71u32] r1[72u32] r1[73u32] r1[74u32] r1[75u32] r1[76u32] r1[77u32] r1[78u32] r1[79u32] r1[80u32] r1[81u32] r1[82u32] r1[83u32] r1[84u32] r1[85u32] r1[86u32] r1[87u32] r1[88u32] r1[89u32] r1[90u32] r1[91u32] r1[92u32] r1[93u32] r1[94u32] r1[95u32] r1[96u32] r1[97u32] r1[98u32] r1[99u32] r1[100u32] r1[101u32] r1[102u32] r1[103u32] r1[104u32] r1[105u32] r1[106u32] r1[107u32] r1[108u32] r1[109u32] r1[110u32] r1[111u32] r1[112u32] r1[113u32] r1[114u32] r1[115u32] r1[116u32] r1[117u32] r1[118u32] r1[119u32] r1[120u32] r1[121u32] r1[122u32] r1[123u32] r1[124u32] r1[125u32] r1[126u32] r1[127u32] r1[128u32] r1[129u32] r1[130u32] r1[131u32] r1[132u32] r1[133u32] r1[134u32] r1[135u32] r1[136u32] r1[137u32] r1[138u32] r1[139u32] r1[140u32] r1[141u32] r1[142u32] r1[143u32] r1[144u32] r1[145u32] r1[146u32] r1[147u32] r1[148u32] r1[149u32] r1[150u32] r1[151u32] r1[152u32] r1[153u32] r1[154u32] r1[155u32] r1[156u32] r1[157u32] r1[158u32] r1[159u32] r1[160u32] r1[161u32] r1[162u32] r1[163u32] r1[164u32] r1[165u32] r1[166u32] r1[167u32] r1[168u32] r1[169u32] r1[170u32] r1[171u32] r1[172u32] r1[173u32] r1[174u32] r1[175u32] r1[176u32] r1[177u32] r1[178u32] r1[179u32] r1[180u32] r1[181u32] r1[182u32] r1[183u32] r1[184u32] r1[185u32] r1[186u32] r1[187u32] r1[188u32] r1[189u32] r1[190u32] r1[191u32] r1[192u32] r1[193u32] r1[194u32] r1[195u32] r1[196u32] r1[197u32] r1[198u32] r1[199u32] r1[200u32] r1[201u32] r1[202u32] r1[203u32] r1[204u32] r1[205u32] r1[206u32] r1[207u32] r1[208u32] r1[209u32] r1[210u32] r1[211u32] r1[212u32] r1[213u32] r1[214u32] r1[215u32] r1[216u32] r1[217u32] r1[218u32] r1[219u32] r1[220u32] r1[221u32] r1[222u32] r1[223u32] r1[224u32] r1[225u32] r1[226u32] r1[227u32] r1[228u32] r1[229u32] r1[230u32] r1[231u32] r1[232u32] r1[233u32] r1[234u32] r1[235u32] r1[236u32] r1[237u32] r1[238u32] r1[239u32] r1[240u32] r1[241u32] r1[242u32] r1[243u32] r1[244u32] r1[245u32] r1[246u32] r1[247u32] r1[248u32] r1[249u32] r1[250u32] r1[251u32] r1[252u32] r2[253u32] r2[254u32] r2[255u32] into r3 as [boolean; 256u32]; + deserialize.bits.raw r3 ([boolean; 256u32]) into r4 ([u8; 32u32]); + output r4 as [u8; 32u32].private; + +constructor: + gt edition 0u16 into r0; + branch.eq r0 false to end_then_0_2; + assert.eq program_owner aleo1rhgdu77hgyqd3xjj8ucu3jj9r2krwz6mnzyd80gncr5fxcwlh5rsvzp9px; + branch.eq true true to end_otherwise_0_3; + position end_then_0_2; + position end_otherwise_0_3; diff --git a/examples/private-mint/private-mint-wrapper/build/imports/test_usdcx_freezelist.aleo b/examples/private-mint/private-mint-wrapper/build/imports/test_usdcx_freezelist.aleo new file mode 100644 index 00000000..7c697e24 --- /dev/null +++ b/examples/private-mint/private-mint-wrapper/build/imports/test_usdcx_freezelist.aleo @@ -0,0 +1,213 @@ +import merkle_tree.aleo; +import test_usdcx_multisig_core.aleo; + +program test_usdcx_freezelist.aleo; + +struct ChecksumEdition: + checksum as [u8; 32u32]; + edition as u16; + +struct MerkleProof: + siblings as [field; 16u32]; + leaf_index as u32; + +struct WalletEcdsaSigner: + wallet_id as address; + ecdsa_signer as [u8; 20u32]; + +struct WalletSigningOpId: + wallet_id as address; + signing_op_id as field; + +struct AdminOp: + op as u8; + threshold as u8; + aleo_signer as address; + ecdsa_signer as [u8; 20u32]; + +mapping freeze_list: + key as address.public; + value as boolean.public; + +mapping freeze_list_index: + key as u32.public; + value as address.public; + +mapping freeze_list_last_index: + key as boolean.public; + value as u32.public; + +mapping freeze_list_root: + key as u8.public; + value as field.public; + +mapping root_updated_height: + key as boolean.public; + value as u32.public; + +mapping block_height_window: + key as boolean.public; + value as u32.public; + +mapping address_to_role: + key as address.public; + value as u16.public; + +function get_signing_op_id_for_deploy: + input r0 as [u8; 32u32].private; + input r1 as u16.private; + cast r0 r1 into r2 as ChecksumEdition; + hash.bhp256 r2 into r3 as field; + output r3 as field.private; + +function initialize: + input r0 as address.public; + input r1 as u32.public; + async initialize r0 self.caller r1 into r2; + output r2 as test_usdcx_freezelist.aleo/initialize.future; + +finalize initialize: + input r0 as address.public; + input r1 as address.public; + input r2 as u32.public; + contains freeze_list_root[1u8] into r3; + assert.eq r3 false; + assert.eq r1 aleo1rhgdu77hgyqd3xjj8ucu3jj9r2krwz6mnzyd80gncr5fxcwlh5rsvzp9px; + set 8u16 into address_to_role[r0]; + set r2 into block_height_window[true]; + set 0u32 into freeze_list_last_index[true]; + set 3642222252059314292809609689035560016959342421640560347114299934615987159853field into freeze_list_root[1u8]; + set false into freeze_list[aleo1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq3ljyzc]; + set aleo1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq3ljyzc into freeze_list_index[0u32]; + +function update_role: + input r0 as address.public; + input r1 as u16.private; + async update_role r0 self.caller r1 into r2; + output r2 as test_usdcx_freezelist.aleo/update_role.future; + +finalize update_role: + input r0 as address.public; + input r1 as address.public; + input r2 as u16.public; + get address_to_role[r1] into r3; + and r3 8u16 into r4; + is.eq r4 8u16 into r5; + assert.eq r5 true; + is.eq r1 r0 into r6; + branch.eq r6 false to end_then_0_0; + and r2 8u16 into r7; + is.eq r7 8u16 into r8; + assert.eq r8 true; + branch.eq true true to end_otherwise_0_1; + position end_then_0_0; + position end_otherwise_0_1; + set r2 into address_to_role[r0]; + +function update_block_height_window: + input r0 as u32.public; + async update_block_height_window r0 self.caller into r1; + output r1 as test_usdcx_freezelist.aleo/update_block_height_window.future; + +finalize update_block_height_window: + input r0 as u32.public; + input r1 as address.public; + get address_to_role[r1] into r2; + and r2 16u16 into r3; + is.eq r3 16u16 into r4; + assert.eq r4 true; + set r0 into block_height_window[true]; + +function update_freeze_list: + input r0 as address.public; + input r1 as boolean.public; + input r2 as u32.public; + input r3 as field.public; + input r4 as field.public; + async update_freeze_list r0 r1 r2 self.caller r3 r4 into r5; + output r5 as test_usdcx_freezelist.aleo/update_freeze_list.future; + +finalize update_freeze_list: + input r0 as address.public; + input r1 as boolean.public; + input r2 as u32.public; + input r3 as address.public; + input r4 as field.public; + input r5 as field.public; + get address_to_role[r3] into r6; + and r6 16u16 into r7; + is.eq r7 16u16 into r8; + assert.eq r8 true; + get freeze_list_root[1u8] into r9; + assert.eq r4 r9; + set r9 into freeze_list_root[2u8]; + set r5 into freeze_list_root[1u8]; + get.or_use freeze_list[r0] false into r10; + assert.neq r1 r10; + set r1 into freeze_list[r0]; + get.or_use freeze_list_index[r2] aleo1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq3ljyzc into r11; + branch.eq r1 false to end_then_0_2; + assert.eq r11 aleo1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq3ljyzc; + get freeze_list_last_index[true] into r12; + add r12 1u32 into r13; + gte r13 r2 into r14; + assert.eq r14 true; + lt r12 r2 into r15; + branch.eq r15 false to end_then_1_4; + set r2 into freeze_list_last_index[true]; + branch.eq true true to end_otherwise_1_5; + position end_then_1_4; + position end_otherwise_1_5; + set r0 into freeze_list_index[r2]; + branch.eq true true to end_otherwise_0_3; + position end_then_0_2; + assert.eq r11 r0; + set aleo1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq3ljyzc into freeze_list_index[r2]; + position end_otherwise_0_3; + set block.height into root_updated_height[true]; + +function verify_non_inclusion_pub: + input r0 as address.public; + async verify_non_inclusion_pub r0 into r1; + output r1 as test_usdcx_freezelist.aleo/verify_non_inclusion_pub.future; + +finalize verify_non_inclusion_pub: + input r0 as address.public; + get.or_use freeze_list[r0] false into r1; + assert.eq r1 false; + +function verify_non_inclusion_priv: + input r0 as address.private; + input r1 as [MerkleProof; 2u32].private; + call merkle_tree.aleo/verify_non_inclusion r0 r1 into r2; + async verify_non_inclusion_priv r2 into r3; + output r3 as test_usdcx_freezelist.aleo/verify_non_inclusion_priv.future; + +finalize verify_non_inclusion_priv: + input r0 as field.public; + get freeze_list_root[1u8] into r1; + is.neq r1 r0 into r2; + branch.eq r2 false to end_then_0_6; + get freeze_list_root[2u8] into r3; + assert.eq r0 r3; + get block_height_window[true] into r4; + get root_updated_height[true] into r5; + add r5 r4 into r6; + gt r6 block.height into r7; + assert.eq r7 true; + branch.eq true true to end_otherwise_0_7; + position end_then_0_6; + position end_otherwise_0_7; + +constructor: + is.eq edition 0u16 into r0; + branch.eq r0 false to end_then_0_8; + branch.eq true true to end_otherwise_0_9; + position end_then_0_8; + cast checksum edition into r1 as ChecksumEdition; + hash.bhp256 r1 into r2 as field; + cast test_usdcx_freezelist.aleo r2 into r3 as WalletSigningOpId; + hash.bhp256 r3 into r4 as field; + contains test_usdcx_multisig_core.aleo/completed_signing_ops[r4] into r5; + assert.eq r5 true; + position end_otherwise_0_9; diff --git a/examples/private-mint/private-mint-wrapper/build/imports/test_usdcx_multisig_core.aleo b/examples/private-mint/private-mint-wrapper/build/imports/test_usdcx_multisig_core.aleo new file mode 100644 index 00000000..e59a1490 --- /dev/null +++ b/examples/private-mint/private-mint-wrapper/build/imports/test_usdcx_multisig_core.aleo @@ -0,0 +1,846 @@ +program test_usdcx_multisig_core.aleo; + +struct ProgramSettings: + allow_upgrades as boolean; + upgrader_address as address; + guard_create_wallet as boolean; + +struct GuardedCreateWalletOp: + wallet_id as address; + threshold as u8; + aleo_signers as [address; 4u32]; + ecdsa_signers as [[u8; 20u32]; 4u32]; + +struct WalletAleoSigner: + wallet_id as address; + aleo_signer as address; + +struct WalletEcdsaSigner: + wallet_id as address; + ecdsa_signer as [u8; 20u32]; + +struct WalletSettings: + threshold as u8; + num_signers as u8; + +struct WalletSigningOpId: + wallet_id as address; + signing_op_id as field; + +struct WalletSigningOpIdNonce: + wallet_id as address; + signing_op_id as field; + nonce as u64; + +struct WalletSigningOp: + confirmations as u8; + initiated_at_block as u32; + expires_at_block as u32; + round as u32; + +struct SigningOpConfirmation: + wallet_signing_op_id_hash as field; + wallet_signer_hash as field; + +struct AdminOp: + op as u8; + threshold as u8; + aleo_signer as address; + ecdsa_signer as [u8; 20u32]; + +mapping program_settings_map: + key as boolean.public; + value as ProgramSettings.public; + +mapping signers_map: + key as field.public; + value as boolean.public; + +mapping wallets_map: + key as address.public; + value as WalletSettings.public; + +mapping pending_signing_ops: + key as field.public; + value as WalletSigningOp.public; + +mapping pending_signing_confirmations: + key as field.public; + value as u32.public; + +mapping completed_signing_ops: + key as field.public; + value as u32.public; + +mapping used_nonces: + key as field.public; + value as boolean.public; + +mapping pending_admin_ops: + key as field.public; + value as AdminOp.public; + +function init: + input r0 as address.private; + input r1 as boolean.private; + async init self.caller r0 r1 into r2; + output r2 as test_usdcx_multisig_core.aleo/init.future; + +finalize init: + input r0 as address.public; + input r1 as address.public; + input r2 as boolean.public; + assert.eq r0 aleo1cytp7hvkrcw7x2myhzh9qgyhfaelpgcykp5yppjr7zdzekqz5qrs2dd7h6; + contains program_settings_map[true] into r3; + not r3 into r4; + assert.eq r4 true; + cast true r1 r2 into r5 as ProgramSettings; + set r5 into program_settings_map[true]; + +function disallow_upgrades: + async disallow_upgrades self.caller into r0; + output r0 as test_usdcx_multisig_core.aleo/disallow_upgrades.future; + +finalize disallow_upgrades: + input r0 as address.public; + contains program_settings_map[true] into r1; + assert.eq r1 true; + get program_settings_map[true] into r2; + assert.eq r0 r2.upgrader_address; + cast false r2.upgrader_address r2.guard_create_wallet into r3 as ProgramSettings; + set r3 into program_settings_map[true]; + +function set_upgrader_address: + input r0 as address.private; + async set_upgrader_address self.caller r0 into r1; + output r1 as test_usdcx_multisig_core.aleo/set_upgrader_address.future; + +finalize set_upgrader_address: + input r0 as address.public; + input r1 as address.public; + contains program_settings_map[true] into r2; + assert.eq r2 true; + get program_settings_map[true] into r3; + assert.eq r0 r3.upgrader_address; + assert.eq r3.allow_upgrades true; + cast r3.allow_upgrades r1 r3.guard_create_wallet into r4 as ProgramSettings; + set r4 into program_settings_map[true]; + +function create_wallet: + input r0 as address.public; + input r1 as u8.public; + input r2 as [address; 4u32].private; + input r3 as [[u8; 20u32]; 4u32].private; + gt r1 0u8 into r4; + lte r1 8u8 into r5; + and r4 r5 into r6; + assert.eq r6 true; + cast r0 r2[0u32] into r7 as WalletAleoSigner; + hash.bhp256 r7 into r8 as field; + cast r0 r2[1u32] into r9 as WalletAleoSigner; + hash.bhp256 r9 into r10 as field; + cast r0 r2[2u32] into r11 as WalletAleoSigner; + hash.bhp256 r11 into r12 as field; + cast r0 r2[3u32] into r13 as WalletAleoSigner; + hash.bhp256 r13 into r14 as field; + cast r8 r10 r12 r14 into r15 as [field; 4u32]; + cast r0 r3[0u32] into r16 as WalletEcdsaSigner; + hash.bhp256 r16 into r17 as field; + cast r0 r3[1u32] into r18 as WalletEcdsaSigner; + hash.bhp256 r18 into r19 as field; + cast r0 r3[2u32] into r20 as WalletEcdsaSigner; + hash.bhp256 r20 into r21 as field; + cast r0 r3[3u32] into r22 as WalletEcdsaSigner; + hash.bhp256 r22 into r23 as field; + cast r17 r19 r21 r23 into r24 as [field; 4u32]; + async create_wallet r0 r1 r2 r3 self.caller r15 r24 into r25; + output r25 as test_usdcx_multisig_core.aleo/create_wallet.future; + +finalize create_wallet: + input r0 as address.public; + input r1 as u8.public; + input r2 as [address; 4u32].public; + input r3 as [[u8; 20u32]; 4u32].public; + input r4 as address.public; + input r5 as [field; 4u32].public; + input r6 as [field; 4u32].public; + contains program_settings_map[true] into r7; + assert.eq r7 true; + get program_settings_map[true] into r8; + is.neq r0 test_usdcx_multisig_core.aleo into r9; + and r8.guard_create_wallet r9 into r10; + branch.eq r10 false to end_then_0_0; + cast r0 r1 r2 r3 into r11 as GuardedCreateWalletOp; + hash.bhp256 r11 into r12 as field; + cast test_usdcx_multisig_core.aleo r12 into r13 as WalletSigningOpId; + hash.bhp256 r13 into r14 as field; + contains completed_signing_ops[r14] into r15; + assert.eq r15 true; + branch.eq true true to end_otherwise_0_1; + position end_then_0_0; + is.eq r0 test_usdcx_multisig_core.aleo into r16; + branch.eq r16 false to end_then_1_2; + assert.eq r4 aleo1cytp7hvkrcw7x2myhzh9qgyhfaelpgcykp5yppjr7zdzekqz5qrs2dd7h6; + branch.eq true true to end_otherwise_1_3; + position end_then_1_2; + position end_otherwise_1_3; + position end_otherwise_0_1; + contains wallets_map[r0] into r17; + not r17 into r18; + assert.eq r18 true; + cast r0 aleo1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq3ljyzc into r19 as WalletAleoSigner; + hash.bhp256 r19 into r20 as field; + cast 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 into r21 as [u8; 20u32]; + cast r0 r21 into r22 as WalletEcdsaSigner; + hash.bhp256 r22 into r23 as field; + is.neq r5[0u32] r20 into r24; + branch.eq r24 false to end_then_0_4; + contains signers_map[r5[0u32]] into r25; + not r25 into r26; + assert.eq r26 true; + set true into signers_map[r5[0u32]]; + branch.eq true true to end_otherwise_0_5; + position end_then_0_4; + position end_otherwise_0_5; + ternary r24 1u8 0u8 into r27; + add 0u8 r27 into r28; + is.neq r6[0u32] r23 into r29; + branch.eq r29 false to end_then_0_6; + contains signers_map[r6[0u32]] into r30; + not r30 into r31; + assert.eq r31 true; + set true into signers_map[r6[0u32]]; + branch.eq true true to end_otherwise_0_7; + position end_then_0_6; + position end_otherwise_0_7; + ternary r29 1u8 0u8 into r32; + add r28 r32 into r33; + is.neq r5[1u32] r20 into r34; + branch.eq r34 false to end_then_0_8; + contains signers_map[r5[1u32]] into r35; + not r35 into r36; + assert.eq r36 true; + set true into signers_map[r5[1u32]]; + branch.eq true true to end_otherwise_0_9; + position end_then_0_8; + position end_otherwise_0_9; + ternary r34 1u8 0u8 into r37; + add r33 r37 into r38; + is.neq r6[1u32] r23 into r39; + branch.eq r39 false to end_then_0_10; + contains signers_map[r6[1u32]] into r40; + not r40 into r41; + assert.eq r41 true; + set true into signers_map[r6[1u32]]; + branch.eq true true to end_otherwise_0_11; + position end_then_0_10; + position end_otherwise_0_11; + ternary r39 1u8 0u8 into r42; + add r38 r42 into r43; + is.neq r5[2u32] r20 into r44; + branch.eq r44 false to end_then_0_12; + contains signers_map[r5[2u32]] into r45; + not r45 into r46; + assert.eq r46 true; + set true into signers_map[r5[2u32]]; + branch.eq true true to end_otherwise_0_13; + position end_then_0_12; + position end_otherwise_0_13; + ternary r44 1u8 0u8 into r47; + add r43 r47 into r48; + is.neq r6[2u32] r23 into r49; + branch.eq r49 false to end_then_0_14; + contains signers_map[r6[2u32]] into r50; + not r50 into r51; + assert.eq r51 true; + set true into signers_map[r6[2u32]]; + branch.eq true true to end_otherwise_0_15; + position end_then_0_14; + position end_otherwise_0_15; + ternary r49 1u8 0u8 into r52; + add r48 r52 into r53; + is.neq r5[3u32] r20 into r54; + branch.eq r54 false to end_then_0_16; + contains signers_map[r5[3u32]] into r55; + not r55 into r56; + assert.eq r56 true; + set true into signers_map[r5[3u32]]; + branch.eq true true to end_otherwise_0_17; + position end_then_0_16; + position end_otherwise_0_17; + ternary r54 1u8 0u8 into r57; + add r53 r57 into r58; + is.neq r6[3u32] r23 into r59; + branch.eq r59 false to end_then_0_18; + contains signers_map[r6[3u32]] into r60; + not r60 into r61; + assert.eq r61 true; + set true into signers_map[r6[3u32]]; + branch.eq true true to end_otherwise_0_19; + position end_then_0_18; + position end_otherwise_0_19; + ternary r59 1u8 0u8 into r62; + add r58 r62 into r63; + gte r63 r1 into r64; + assert.eq r64 true; + cast r1 r63 into r65 as WalletSettings; + set r65 into wallets_map[r0]; + +function initiate_signing_op: + input r0 as address.public; + input r1 as field.public; + input r2 as u32.public; + gt r2 0u32 into r3; + assert.eq r3 true; + cast r0 r1 into r4 as WalletSigningOpId; + hash.bhp256 r4 into r5 as field; + cast r0 self.signer into r6 as WalletAleoSigner; + hash.bhp256 r6 into r7 as field; + cast 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 into r8 as [u8; 20u32]; + cast 0u8 0u8 aleo1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq3ljyzc r8 into r9 as AdminOp; + async initiate_signing_op r0 r5 r7 r2 r9 into r10; + output r5 as field.private; + output r10 as test_usdcx_multisig_core.aleo/initiate_signing_op.future; + +finalize initiate_signing_op: + input r0 as address.public; + input r1 as field.public; + input r2 as field.public; + input r3 as u32.public; + input r4 as AdminOp.public; + contains wallets_map[r0] into r5; + assert.eq r5 true; + contains completed_signing_ops[r1] into r6; + not r6 into r7; + assert.eq r7 true; + contains pending_signing_ops[r1] into r8; + not r8 into r9; + branch.eq r9 false to end_then_0_20; + cast 0u8 0u32 0u32 0u32 into r10 as WalletSigningOp; + set r10 into pending_signing_ops[r1]; + branch.eq true true to end_otherwise_0_21; + position end_then_0_20; + position end_otherwise_0_21; + get pending_signing_ops[r1] into r11; + lt r11.expires_at_block block.height into r12; + assert.eq r12 true; + is.eq r3 4294967295u32 into r13; + ternary r13 0u32 r3 into r14; + add block.height r14 into r15; + ternary r13 4294967295u32 r15 into r16; + add r11.round 1u32 into r17; + contains signers_map[r2] into r18; + branch.eq r18 false to end_then_0_22; + cast 1u8 block.height r16 r17 into r19 as WalletSigningOp; + set r19 into pending_signing_ops[r1]; + cast r1 r2 into r20 as SigningOpConfirmation; + hash.bhp256 r20 into r21 as field; + get.or_use pending_signing_confirmations[r21] 0u32 into r22; + gt r17 r22 into r23; + assert.eq r23 true; + set r17 into pending_signing_confirmations[r21]; + get wallets_map[r0] into r24; + gte 1u8 r24.threshold into r25; + branch.eq r25 false to end_then_1_24; + set block.height into completed_signing_ops[r1]; + branch.eq true true to end_otherwise_1_25; + position end_then_1_24; + position end_otherwise_1_25; + branch.eq true true to end_otherwise_0_23; + position end_then_0_22; + cast 0u8 block.height r16 r17 into r26 as WalletSigningOp; + set r26 into pending_signing_ops[r1]; + position end_otherwise_0_23; + contains pending_admin_ops[r1] into r27; + branch.eq r27 false to end_then_0_26; + get pending_admin_ops[r1] into r28; + assert.eq r4 r28; + branch.eq true true to end_otherwise_0_27; + position end_then_0_26; + set r4 into pending_admin_ops[r1]; + position end_otherwise_0_27; + +function sign: + input r0 as address.public; + input r1 as field.public; + cast r0 self.signer into r2 as WalletAleoSigner; + hash.bhp256 r2 into r3 as field; + async sign r0 r1 r3 0u32 into r4; + output r4 as test_usdcx_multisig_core.aleo/sign.future; + +finalize sign: + input r0 as address.public; + input r1 as field.public; + input r2 as field.public; + input r3 as u32.public; + contains wallets_map[r0] into r4; + assert.eq r4 true; + contains signers_map[r2] into r5; + assert.eq r5 true; + cast r0 r1 into r6 as WalletSigningOpId; + hash.bhp256 r6 into r7 as field; + contains pending_signing_ops[r7] into r8; + assert.eq r8 true; + get pending_signing_ops[r7] into r9; + lt r9.expires_at_block block.height into r10; + not r10 into r11; + assert.eq r11 true; + is.eq r3 0u32 into r12; + is.eq r3 r9.round into r13; + or r12 r13 into r14; + assert.eq r14 true; + cast r7 r2 into r15 as SigningOpConfirmation; + hash.bhp256 r15 into r16 as field; + get.or_use pending_signing_confirmations[r16] 0u32 into r17; + gt r9.round r17 into r18; + assert.eq r18 true; + set r9.round into pending_signing_confirmations[r16]; + add r9.confirmations 1u8 into r19; + cast r19 r9.initiated_at_block r9.expires_at_block r9.round into r20 as WalletSigningOp; + set r20 into pending_signing_ops[r7]; + get wallets_map[r0] into r21; + gte r20.confirmations r21.threshold into r22; + branch.eq r22 false to end_then_0_28; + set block.height into completed_signing_ops[r7]; + branch.eq true true to end_otherwise_0_29; + position end_then_0_28; + position end_otherwise_0_29; + +function sign_for_round: + input r0 as address.public; + input r1 as field.public; + input r2 as u32.public; + cast r0 self.signer into r3 as WalletAleoSigner; + hash.bhp256 r3 into r4 as field; + async sign_for_round r0 r1 r4 r2 into r5; + output r5 as test_usdcx_multisig_core.aleo/sign_for_round.future; + +finalize sign_for_round: + input r0 as address.public; + input r1 as field.public; + input r2 as field.public; + input r3 as u32.public; + contains wallets_map[r0] into r4; + assert.eq r4 true; + contains signers_map[r2] into r5; + assert.eq r5 true; + cast r0 r1 into r6 as WalletSigningOpId; + hash.bhp256 r6 into r7 as field; + contains pending_signing_ops[r7] into r8; + assert.eq r8 true; + get pending_signing_ops[r7] into r9; + lt r9.expires_at_block block.height into r10; + not r10 into r11; + assert.eq r11 true; + is.eq r3 0u32 into r12; + is.eq r3 r9.round into r13; + or r12 r13 into r14; + assert.eq r14 true; + cast r7 r2 into r15 as SigningOpConfirmation; + hash.bhp256 r15 into r16 as field; + get.or_use pending_signing_confirmations[r16] 0u32 into r17; + gt r9.round r17 into r18; + assert.eq r18 true; + set r9.round into pending_signing_confirmations[r16]; + add r9.confirmations 1u8 into r19; + cast r19 r9.initiated_at_block r9.expires_at_block r9.round into r20 as WalletSigningOp; + set r20 into pending_signing_ops[r7]; + get wallets_map[r0] into r21; + gte r20.confirmations r21.threshold into r22; + branch.eq r22 false to end_then_0_30; + set block.height into completed_signing_ops[r7]; + branch.eq true true to end_otherwise_0_31; + position end_then_0_30; + position end_otherwise_0_31; + +function sign_ecdsa: + input r0 as address.public; + input r1 as field.public; + input r2 as [u8; 20u32].public; + input r3 as [u8; 65u32].public; + input r4 as u64.public; + cast r0 r2 into r5 as WalletEcdsaSigner; + async sign_ecdsa r0 r1 r5 r3 r4 0u32 into r6; + output r6 as test_usdcx_multisig_core.aleo/sign_ecdsa.future; + +finalize sign_ecdsa: + input r0 as address.public; + input r1 as field.public; + input r2 as WalletEcdsaSigner.public; + input r3 as [u8; 65u32].public; + input r4 as u64.public; + input r5 as u32.public; + contains wallets_map[r0] into r6; + assert.eq r6 true; + hash.bhp256 r2 into r7 as field; + contains signers_map[r7] into r8; + assert.eq r8 true; + cast r0 r1 r4 into r9 as WalletSigningOpIdNonce; + hash.bhp256 r9 into r10 as field; + contains used_nonces[r10] into r11; + not r11 into r12; + assert.eq r12 true; + set true into used_nonces[r10]; + cast r0 r1 into r13 as WalletSigningOpId; + hash.bhp256 r13 into r14 as field; + contains pending_signing_ops[r14] into r15; + assert.eq r15 true; + get pending_signing_ops[r14] into r16; + lt r16.expires_at_block block.height into r17; + not r17 into r18; + assert.eq r18 true; + is.eq r5 0u32 into r19; + is.eq r5 r16.round into r20; + or r19 r20 into r21; + assert.eq r21 true; + serialize.bits.raw r10 (field) into r22 ([boolean; 253u32]); + cast false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false into r23 as [boolean; 256u32]; + cast r22[0u32] r22[1u32] r22[2u32] r22[3u32] r22[4u32] r22[5u32] r22[6u32] r22[7u32] r22[8u32] r22[9u32] r22[10u32] r22[11u32] r22[12u32] r22[13u32] r22[14u32] r22[15u32] r22[16u32] r22[17u32] r22[18u32] r22[19u32] r22[20u32] r22[21u32] r22[22u32] r22[23u32] r22[24u32] r22[25u32] r22[26u32] r22[27u32] r22[28u32] r22[29u32] r22[30u32] r22[31u32] r22[32u32] r22[33u32] r22[34u32] r22[35u32] r22[36u32] r22[37u32] r22[38u32] r22[39u32] r22[40u32] r22[41u32] r22[42u32] r22[43u32] r22[44u32] r22[45u32] r22[46u32] r22[47u32] r22[48u32] r22[49u32] r22[50u32] r22[51u32] r22[52u32] r22[53u32] r22[54u32] r22[55u32] r22[56u32] r22[57u32] r22[58u32] r22[59u32] r22[60u32] r22[61u32] r22[62u32] r22[63u32] r22[64u32] r22[65u32] r22[66u32] r22[67u32] r22[68u32] r22[69u32] r22[70u32] r22[71u32] r22[72u32] r22[73u32] r22[74u32] r22[75u32] r22[76u32] r22[77u32] r22[78u32] r22[79u32] r22[80u32] r22[81u32] r22[82u32] r22[83u32] r22[84u32] r22[85u32] r22[86u32] r22[87u32] r22[88u32] r22[89u32] r22[90u32] r22[91u32] r22[92u32] r22[93u32] r22[94u32] r22[95u32] r22[96u32] r22[97u32] r22[98u32] r22[99u32] r22[100u32] r22[101u32] r22[102u32] r22[103u32] r22[104u32] r22[105u32] r22[106u32] r22[107u32] r22[108u32] r22[109u32] r22[110u32] r22[111u32] r22[112u32] r22[113u32] r22[114u32] r22[115u32] r22[116u32] r22[117u32] r22[118u32] r22[119u32] r22[120u32] r22[121u32] r22[122u32] r22[123u32] r22[124u32] r22[125u32] r22[126u32] r22[127u32] r22[128u32] r22[129u32] r22[130u32] r22[131u32] r22[132u32] r22[133u32] r22[134u32] r22[135u32] r22[136u32] r22[137u32] r22[138u32] r22[139u32] r22[140u32] r22[141u32] r22[142u32] r22[143u32] r22[144u32] r22[145u32] r22[146u32] r22[147u32] r22[148u32] r22[149u32] r22[150u32] r22[151u32] r22[152u32] r22[153u32] r22[154u32] r22[155u32] r22[156u32] r22[157u32] r22[158u32] r22[159u32] r22[160u32] r22[161u32] r22[162u32] r22[163u32] r22[164u32] r22[165u32] r22[166u32] r22[167u32] r22[168u32] r22[169u32] r22[170u32] r22[171u32] r22[172u32] r22[173u32] r22[174u32] r22[175u32] r22[176u32] r22[177u32] r22[178u32] r22[179u32] r22[180u32] r22[181u32] r22[182u32] r22[183u32] r22[184u32] r22[185u32] r22[186u32] r22[187u32] r22[188u32] r22[189u32] r22[190u32] r22[191u32] r22[192u32] r22[193u32] r22[194u32] r22[195u32] r22[196u32] r22[197u32] r22[198u32] r22[199u32] r22[200u32] r22[201u32] r22[202u32] r22[203u32] r22[204u32] r22[205u32] r22[206u32] r22[207u32] r22[208u32] r22[209u32] r22[210u32] r22[211u32] r22[212u32] r22[213u32] r22[214u32] r22[215u32] r22[216u32] r22[217u32] r22[218u32] r22[219u32] r22[220u32] r22[221u32] r22[222u32] r22[223u32] r22[224u32] r22[225u32] r22[226u32] r22[227u32] r22[228u32] r22[229u32] r22[230u32] r22[231u32] r22[232u32] r22[233u32] r22[234u32] r22[235u32] r22[236u32] r22[237u32] r22[238u32] r22[239u32] r22[240u32] r22[241u32] r22[242u32] r22[243u32] r22[244u32] r22[245u32] r22[246u32] r22[247u32] r22[248u32] r22[249u32] r22[250u32] r22[251u32] r22[252u32] r23[253u32] r23[254u32] r23[255u32] into r24 as [boolean; 256u32]; + deserialize.bits.raw r24 ([boolean; 256u32]) into r25 ([u8; 32u32]); + cast 25u8 69u8 116u8 104u8 101u8 114u8 101u8 117u8 109u8 32u8 83u8 105u8 103u8 110u8 101u8 100u8 32u8 77u8 101u8 115u8 115u8 97u8 103u8 101u8 58u8 10u8 51u8 50u8 r25[0u32] r25[1u32] r25[2u32] r25[3u32] r25[4u32] r25[5u32] r25[6u32] r25[7u32] r25[8u32] r25[9u32] r25[10u32] r25[11u32] r25[12u32] r25[13u32] r25[14u32] r25[15u32] r25[16u32] r25[17u32] r25[18u32] r25[19u32] r25[20u32] r25[21u32] r25[22u32] r25[23u32] r25[24u32] r25[25u32] r25[26u32] r25[27u32] r25[28u32] r25[29u32] r25[30u32] r25[31u32] into r26 as [u8; 60u32]; + hash.keccak256.native.raw r26 into r27 as [boolean; 256u32]; + deserialize.bits.raw r27 ([boolean; 256u32]) into r28 ([u8; 32u32]); + ecdsa.verify.digest.eth r3 r2.ecdsa_signer r28 into r29; + assert.eq r29 true; + cast r14 r7 into r30 as SigningOpConfirmation; + hash.bhp256 r30 into r31 as field; + get.or_use pending_signing_confirmations[r31] 0u32 into r32; + gt r16.round r32 into r33; + assert.eq r33 true; + set r16.round into pending_signing_confirmations[r31]; + add r16.confirmations 1u8 into r34; + cast r34 r16.initiated_at_block r16.expires_at_block r16.round into r35 as WalletSigningOp; + set r35 into pending_signing_ops[r14]; + get wallets_map[r0] into r36; + gte r35.confirmations r36.threshold into r37; + branch.eq r37 false to end_then_0_32; + set block.height into completed_signing_ops[r14]; + branch.eq true true to end_otherwise_0_33; + position end_then_0_32; + position end_otherwise_0_33; + +function sign_ecdsa_for_round: + input r0 as address.public; + input r1 as field.public; + input r2 as [u8; 20u32].public; + input r3 as [u8; 65u32].public; + input r4 as u64.public; + input r5 as u32.public; + cast r0 r2 into r6 as WalletEcdsaSigner; + async sign_ecdsa_for_round r0 r1 r6 r3 r4 r5 into r7; + output r7 as test_usdcx_multisig_core.aleo/sign_ecdsa_for_round.future; + +finalize sign_ecdsa_for_round: + input r0 as address.public; + input r1 as field.public; + input r2 as WalletEcdsaSigner.public; + input r3 as [u8; 65u32].public; + input r4 as u64.public; + input r5 as u32.public; + contains wallets_map[r0] into r6; + assert.eq r6 true; + hash.bhp256 r2 into r7 as field; + contains signers_map[r7] into r8; + assert.eq r8 true; + cast r0 r1 r4 into r9 as WalletSigningOpIdNonce; + hash.bhp256 r9 into r10 as field; + contains used_nonces[r10] into r11; + not r11 into r12; + assert.eq r12 true; + set true into used_nonces[r10]; + cast r0 r1 into r13 as WalletSigningOpId; + hash.bhp256 r13 into r14 as field; + contains pending_signing_ops[r14] into r15; + assert.eq r15 true; + get pending_signing_ops[r14] into r16; + lt r16.expires_at_block block.height into r17; + not r17 into r18; + assert.eq r18 true; + is.eq r5 0u32 into r19; + is.eq r5 r16.round into r20; + or r19 r20 into r21; + assert.eq r21 true; + serialize.bits.raw r10 (field) into r22 ([boolean; 253u32]); + cast false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false into r23 as [boolean; 256u32]; + cast r22[0u32] r22[1u32] r22[2u32] r22[3u32] r22[4u32] r22[5u32] r22[6u32] r22[7u32] r22[8u32] r22[9u32] r22[10u32] r22[11u32] r22[12u32] r22[13u32] r22[14u32] r22[15u32] r22[16u32] r22[17u32] r22[18u32] r22[19u32] r22[20u32] r22[21u32] r22[22u32] r22[23u32] r22[24u32] r22[25u32] r22[26u32] r22[27u32] r22[28u32] r22[29u32] r22[30u32] r22[31u32] r22[32u32] r22[33u32] r22[34u32] r22[35u32] r22[36u32] r22[37u32] r22[38u32] r22[39u32] r22[40u32] r22[41u32] r22[42u32] r22[43u32] r22[44u32] r22[45u32] r22[46u32] r22[47u32] r22[48u32] r22[49u32] r22[50u32] r22[51u32] r22[52u32] r22[53u32] r22[54u32] r22[55u32] r22[56u32] r22[57u32] r22[58u32] r22[59u32] r22[60u32] r22[61u32] r22[62u32] r22[63u32] r22[64u32] r22[65u32] r22[66u32] r22[67u32] r22[68u32] r22[69u32] r22[70u32] r22[71u32] r22[72u32] r22[73u32] r22[74u32] r22[75u32] r22[76u32] r22[77u32] r22[78u32] r22[79u32] r22[80u32] r22[81u32] r22[82u32] r22[83u32] r22[84u32] r22[85u32] r22[86u32] r22[87u32] r22[88u32] r22[89u32] r22[90u32] r22[91u32] r22[92u32] r22[93u32] r22[94u32] r22[95u32] r22[96u32] r22[97u32] r22[98u32] r22[99u32] r22[100u32] r22[101u32] r22[102u32] r22[103u32] r22[104u32] r22[105u32] r22[106u32] r22[107u32] r22[108u32] r22[109u32] r22[110u32] r22[111u32] r22[112u32] r22[113u32] r22[114u32] r22[115u32] r22[116u32] r22[117u32] r22[118u32] r22[119u32] r22[120u32] r22[121u32] r22[122u32] r22[123u32] r22[124u32] r22[125u32] r22[126u32] r22[127u32] r22[128u32] r22[129u32] r22[130u32] r22[131u32] r22[132u32] r22[133u32] r22[134u32] r22[135u32] r22[136u32] r22[137u32] r22[138u32] r22[139u32] r22[140u32] r22[141u32] r22[142u32] r22[143u32] r22[144u32] r22[145u32] r22[146u32] r22[147u32] r22[148u32] r22[149u32] r22[150u32] r22[151u32] r22[152u32] r22[153u32] r22[154u32] r22[155u32] r22[156u32] r22[157u32] r22[158u32] r22[159u32] r22[160u32] r22[161u32] r22[162u32] r22[163u32] r22[164u32] r22[165u32] r22[166u32] r22[167u32] r22[168u32] r22[169u32] r22[170u32] r22[171u32] r22[172u32] r22[173u32] r22[174u32] r22[175u32] r22[176u32] r22[177u32] r22[178u32] r22[179u32] r22[180u32] r22[181u32] r22[182u32] r22[183u32] r22[184u32] r22[185u32] r22[186u32] r22[187u32] r22[188u32] r22[189u32] r22[190u32] r22[191u32] r22[192u32] r22[193u32] r22[194u32] r22[195u32] r22[196u32] r22[197u32] r22[198u32] r22[199u32] r22[200u32] r22[201u32] r22[202u32] r22[203u32] r22[204u32] r22[205u32] r22[206u32] r22[207u32] r22[208u32] r22[209u32] r22[210u32] r22[211u32] r22[212u32] r22[213u32] r22[214u32] r22[215u32] r22[216u32] r22[217u32] r22[218u32] r22[219u32] r22[220u32] r22[221u32] r22[222u32] r22[223u32] r22[224u32] r22[225u32] r22[226u32] r22[227u32] r22[228u32] r22[229u32] r22[230u32] r22[231u32] r22[232u32] r22[233u32] r22[234u32] r22[235u32] r22[236u32] r22[237u32] r22[238u32] r22[239u32] r22[240u32] r22[241u32] r22[242u32] r22[243u32] r22[244u32] r22[245u32] r22[246u32] r22[247u32] r22[248u32] r22[249u32] r22[250u32] r22[251u32] r22[252u32] r23[253u32] r23[254u32] r23[255u32] into r24 as [boolean; 256u32]; + deserialize.bits.raw r24 ([boolean; 256u32]) into r25 ([u8; 32u32]); + cast 25u8 69u8 116u8 104u8 101u8 114u8 101u8 117u8 109u8 32u8 83u8 105u8 103u8 110u8 101u8 100u8 32u8 77u8 101u8 115u8 115u8 97u8 103u8 101u8 58u8 10u8 51u8 50u8 r25[0u32] r25[1u32] r25[2u32] r25[3u32] r25[4u32] r25[5u32] r25[6u32] r25[7u32] r25[8u32] r25[9u32] r25[10u32] r25[11u32] r25[12u32] r25[13u32] r25[14u32] r25[15u32] r25[16u32] r25[17u32] r25[18u32] r25[19u32] r25[20u32] r25[21u32] r25[22u32] r25[23u32] r25[24u32] r25[25u32] r25[26u32] r25[27u32] r25[28u32] r25[29u32] r25[30u32] r25[31u32] into r26 as [u8; 60u32]; + hash.keccak256.native.raw r26 into r27 as [boolean; 256u32]; + deserialize.bits.raw r27 ([boolean; 256u32]) into r28 ([u8; 32u32]); + ecdsa.verify.digest.eth r3 r2.ecdsa_signer r28 into r29; + assert.eq r29 true; + cast r14 r7 into r30 as SigningOpConfirmation; + hash.bhp256 r30 into r31 as field; + get.or_use pending_signing_confirmations[r31] 0u32 into r32; + gt r16.round r32 into r33; + assert.eq r33 true; + set r16.round into pending_signing_confirmations[r31]; + add r16.confirmations 1u8 into r34; + cast r34 r16.initiated_at_block r16.expires_at_block r16.round into r35 as WalletSigningOp; + set r35 into pending_signing_ops[r14]; + get wallets_map[r0] into r36; + gte r35.confirmations r36.threshold into r37; + branch.eq r37 false to end_then_0_34; + set block.height into completed_signing_ops[r14]; + branch.eq true true to end_otherwise_0_35; + position end_then_0_34; + position end_otherwise_0_35; + +closure assert_valid_admin_op: + input r0 as AdminOp; + is.eq r0.op 1u8 into r1; + not r1 into r2; + is.neq r0.threshold 0u8 into r3; + or r3 r2 into r4; + assert.eq r4 true; + is.eq r0.aleo_signer aleo1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq3ljyzc into r5; + or r5 r2 into r6; + assert.eq r6 true; + cast 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 into r7 as [u8; 20u32]; + is.eq r0.ecdsa_signer r7 into r8; + or r8 r2 into r9; + assert.eq r9 true; + is.eq r0.op 2u8 into r10; + is.eq r0.op 3u8 into r11; + or r10 r11 into r12; + and r2 r12 into r13; + not r13 into r14; + is.eq r0.threshold 0u8 into r15; + or r15 r14 into r16; + assert.eq r16 true; + is.eq r0.aleo_signer aleo1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq3ljyzc into r17; + is.eq r0.ecdsa_signer r7 into r18; + and r17 r18 into r19; + and r13 r19 into r20; + not r20 into r21; + or false r21 into r22; + assert.eq r22 true; + not r19 into r23; + is.neq r0.aleo_signer aleo1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq3ljyzc into r24; + is.neq r0.ecdsa_signer r7 into r25; + and r24 r25 into r26; + and r13 r23 into r27; + and r27 r26 into r28; + not r28 into r29; + or false r29 into r30; + assert.eq r30 true; + not r12 into r31; + and r2 r31 into r32; + not r32 into r33; + or false r33 into r34; + assert.eq r34 true; + +function init_admin_op: + input r0 as address.public; + input r1 as field.public; + input r2 as u32.public; + input r3 as AdminOp.private; + call assert_valid_admin_op r3; + cast r0 r1 into r4 as WalletSigningOpId; + hash.bhp256 r4 into r5 as field; + cast r0 self.signer into r6 as WalletAleoSigner; + hash.bhp256 r6 into r7 as field; + async init_admin_op r0 r5 r7 r2 r3 into r8; + output r5 as field.private; + output r8 as test_usdcx_multisig_core.aleo/init_admin_op.future; + +finalize init_admin_op: + input r0 as address.public; + input r1 as field.public; + input r2 as field.public; + input r3 as u32.public; + input r4 as AdminOp.public; + contains wallets_map[r0] into r5; + assert.eq r5 true; + contains completed_signing_ops[r1] into r6; + not r6 into r7; + assert.eq r7 true; + contains pending_signing_ops[r1] into r8; + not r8 into r9; + branch.eq r9 false to end_then_0_36; + cast 0u8 0u32 0u32 0u32 into r10 as WalletSigningOp; + set r10 into pending_signing_ops[r1]; + branch.eq true true to end_otherwise_0_37; + position end_then_0_36; + position end_otherwise_0_37; + get pending_signing_ops[r1] into r11; + lt r11.expires_at_block block.height into r12; + assert.eq r12 true; + is.eq r3 4294967295u32 into r13; + ternary r13 0u32 r3 into r14; + add block.height r14 into r15; + ternary r13 4294967295u32 r15 into r16; + add r11.round 1u32 into r17; + contains signers_map[r2] into r18; + branch.eq r18 false to end_then_0_38; + cast 1u8 block.height r16 r17 into r19 as WalletSigningOp; + set r19 into pending_signing_ops[r1]; + cast r1 r2 into r20 as SigningOpConfirmation; + hash.bhp256 r20 into r21 as field; + get.or_use pending_signing_confirmations[r21] 0u32 into r22; + gt r17 r22 into r23; + assert.eq r23 true; + set r17 into pending_signing_confirmations[r21]; + get wallets_map[r0] into r24; + gte 1u8 r24.threshold into r25; + branch.eq r25 false to end_then_1_40; + set block.height into completed_signing_ops[r1]; + branch.eq true true to end_otherwise_1_41; + position end_then_1_40; + position end_otherwise_1_41; + branch.eq true true to end_otherwise_0_39; + position end_then_0_38; + cast 0u8 block.height r16 r17 into r26 as WalletSigningOp; + set r26 into pending_signing_ops[r1]; + position end_otherwise_0_39; + contains pending_admin_ops[r1] into r27; + branch.eq r27 false to end_then_0_42; + get pending_admin_ops[r1] into r28; + assert.eq r4 r28; + branch.eq true true to end_otherwise_0_43; + position end_then_0_42; + set r4 into pending_admin_ops[r1]; + position end_otherwise_0_43; + +function exec_admin_op: + input r0 as address.public; + input r1 as field.public; + input r2 as AdminOp.private; + call assert_valid_admin_op r2; + cast r0 r1 into r3 as WalletSigningOpId; + hash.bhp256 r3 into r4 as field; + async exec_admin_op r0 r4 r2 into r5; + output r5 as test_usdcx_multisig_core.aleo/exec_admin_op.future; + +finalize exec_admin_op: + input r0 as address.public; + input r1 as field.public; + input r2 as AdminOp.public; + contains wallets_map[r0] into r3; + assert.eq r3 true; + contains completed_signing_ops[r1] into r4; + assert.eq r4 true; + get pending_admin_ops[r1] into r5; + assert.eq r5 r2; + remove pending_admin_ops[r1]; + get wallets_map[r0] into r6; + is.eq r2.op 1u8 into r7; + branch.eq r7 false to end_then_0_44; + lte r2.threshold r6.num_signers into r8; + assert.eq r8 true; + cast r2.threshold r6.num_signers into r9 as WalletSettings; + set r9 into wallets_map[r0]; + branch.eq true true to end_otherwise_0_45; + position end_then_0_44; + is.eq r2.op 2u8 into r10; + branch.eq r10 false to end_then_1_46; + is.eq r2.op 2u8 into r11; + is.eq r2.op 3u8 into r12; + or r11 r12 into r13; + assert.eq r13 true; + is.neq r2.aleo_signer aleo1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq3ljyzc into r14; + cast r0 r2.aleo_signer into r15 as WalletAleoSigner; + hash.bhp256 r15 into r16 as field; + ternary r14 r16 0field into r17; + cast 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 into r18 as [u8; 20u32]; + is.neq r2.ecdsa_signer r18 into r19; + not r19 into r20; + is.eq r17 0field into r21; + or r21 r20 into r22; + assert.eq r22 true; + cast r0 r2.ecdsa_signer into r23 as WalletEcdsaSigner; + hash.bhp256 r23 into r24 as field; + ternary r19 r24 r17 into r25; + assert.neq r25 0field; + contains signers_map[r25] into r26; + not r26 into r27; + assert.eq r27 true; + set true into signers_map[r25]; + add r6.num_signers 1u8 into r28; + cast r6.threshold r28 into r29 as WalletSettings; + set r29 into wallets_map[r0]; + branch.eq true true to end_otherwise_1_47; + position end_then_1_46; + is.eq r2.op 3u8 into r30; + branch.eq r30 false to end_then_2_48; + is.eq r2.op 2u8 into r31; + is.eq r2.op 3u8 into r32; + or r31 r32 into r33; + assert.eq r33 true; + is.neq r2.aleo_signer aleo1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq3ljyzc into r34; + cast r0 r2.aleo_signer into r35 as WalletAleoSigner; + hash.bhp256 r35 into r36 as field; + ternary r34 r36 0field into r37; + cast 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 into r38 as [u8; 20u32]; + is.neq r2.ecdsa_signer r38 into r39; + not r39 into r40; + is.eq r37 0field into r41; + or r41 r40 into r42; + assert.eq r42 true; + cast r0 r2.ecdsa_signer into r43 as WalletEcdsaSigner; + hash.bhp256 r43 into r44 as field; + ternary r39 r44 r37 into r45; + assert.neq r45 0field; + contains signers_map[r45] into r46; + assert.eq r46 true; + remove signers_map[r45]; + sub r6.num_signers 1u8 into r47; + gte r47 r6.threshold into r48; + assert.eq r48 true; + sub r6.num_signers 1u8 into r49; + cast r6.threshold r49 into r50 as WalletSettings; + set r50 into wallets_map[r0]; + branch.eq true true to end_otherwise_2_49; + position end_then_2_48; + assert.eq false true; + position end_otherwise_2_49; + position end_otherwise_1_47; + position end_otherwise_0_45; + +closure get_signing_op_id_hash_fn: + input r0 as address; + input r1 as field; + cast r0 r1 into r2 as WalletSigningOpId; + hash.bhp256 r2 into r3 as field; + output r3 as field; + +function get_signing_op_id_hash: + input r0 as address.public; + input r1 as field.public; + call get_signing_op_id_hash_fn r0 r1 into r2; + output r2 as field.private; + +function guarded_create_wallet_op_hash: + input r0 as address.public; + input r1 as u8.public; + input r2 as [address; 4u32].private; + input r3 as [[u8; 20u32]; 4u32].private; + cast r0 r1 r2 r3 into r4 as GuardedCreateWalletOp; + hash.bhp256 r4 into r5 as field; + output r5 as field.private; + +function assert_signing_completed: + input r0 as address.public; + input r1 as field.public; + async assert_signing_completed r0 r1 into r2; + output r2 as test_usdcx_multisig_core.aleo/assert_signing_completed.future; + +finalize assert_signing_completed: + input r0 as address.public; + input r1 as field.public; + cast r0 r1 into r2 as WalletSigningOpId; + hash.bhp256 r2 into r3 as field; + contains completed_signing_ops[r3] into r4; + assert.eq r4 true; + +constructor: + is.eq edition 0u16 into r0; + branch.eq r0 false to end_then_0_50; + branch.eq true true to end_otherwise_0_51; + position end_then_0_50; + contains program_settings_map[true] into r1; + assert.eq r1 true; + get program_settings_map[true] into r2; + assert.eq r2.allow_upgrades true; + assert.eq program_owner r2.upgrader_address; + position end_otherwise_0_51; diff --git a/examples/private-mint/private-mint-wrapper/build/imports/test_usdcx_stablecoin.aleo b/examples/private-mint/private-mint-wrapper/build/imports/test_usdcx_stablecoin.aleo new file mode 100644 index 00000000..893177e9 --- /dev/null +++ b/examples/private-mint/private-mint-wrapper/build/imports/test_usdcx_stablecoin.aleo @@ -0,0 +1,1832 @@ +import merkle_tree.aleo; +import test_usdcx_multisig_core.aleo; +import test_usdcx_freezelist.aleo; + +program test_usdcx_stablecoin.aleo; + +record Token: + owner as address.private; + amount as u128.private; + +record ComplianceRecord: + owner as address.private; + amount as u128.private; + sender as address.private; + recipient as address.private; + +record Credentials: + owner as address.private; + freeze_list_root as field.private; + +struct ChecksumEdition: + checksum as [u8; 32u32]; + edition as u16; + +struct TokenInfo: + name as u128; + symbol as u128; + decimals as u8; + supply as u128; + max_supply as u128; + +struct TokenAllowance: + account as address; + spender as address; + +struct MerkleProof: + siblings as [field; 16u32]; + leaf_index as u32; + +struct WalletEcdsaSigner: + wallet_id as address; + ecdsa_signer as [u8; 20u32]; + +struct WalletSigningOpId: + wallet_id as address; + signing_op_id as field; + +struct AdminOp: + op as u8; + threshold as u8; + aleo_signer as address; + ecdsa_signer as [u8; 20u32]; + +mapping token_info: + key as boolean.public; + value as TokenInfo.public; + +mapping balances: + key as address.public; + value as u128.public; + +mapping allowances: + key as field.public; + value as u128.public; + +mapping address_to_role: + key as address.public; + value as u16.public; + +mapping pause: + key as boolean.public; + value as boolean.public; + +function get_signing_op_id_for_deploy: + input r0 as [u8; 32u32].private; + input r1 as u16.private; + cast r0 r1 into r2 as ChecksumEdition; + hash.bhp256 r2 into r3 as field; + output r3 as field.private; + +function update_role: + input r0 as address.public; + input r1 as u16.private; + async update_role r0 self.caller r1 into r2; + output r2 as test_usdcx_stablecoin.aleo/update_role.future; + +finalize update_role: + input r0 as address.public; + input r1 as address.public; + input r2 as u16.public; + get address_to_role[r1] into r3; + and r3 8u16 into r4; + is.eq r4 8u16 into r5; + assert.eq r5 true; + is.eq r1 r0 into r6; + branch.eq r6 false to end_then_0_0; + and r2 8u16 into r7; + is.eq r7 8u16 into r8; + assert.eq r8 true; + branch.eq true true to end_otherwise_0_1; + position end_then_0_0; + position end_otherwise_0_1; + set r2 into address_to_role[r0]; + +function initialize: + input r0 as u128.public; + input r1 as u128.public; + input r2 as u8.public; + input r3 as u128.public; + input r4 as address.public; + async initialize r0 r1 r2 r3 r4 self.caller into r5; + output r5 as test_usdcx_stablecoin.aleo/initialize.future; + +finalize initialize: + input r0 as u128.public; + input r1 as u128.public; + input r2 as u8.public; + input r3 as u128.public; + input r4 as address.public; + input r5 as address.public; + contains token_info[true] into r6; + assert.eq r6 false; + assert.eq r5 aleo1rhgdu77hgyqd3xjj8ucu3jj9r2krwz6mnzyd80gncr5fxcwlh5rsvzp9px; + set 8u16 into address_to_role[r4]; + cast r0 r1 r2 0u128 r3 into r7 as TokenInfo; + set r7 into token_info[true]; + set false into pause[true]; + +function get_credentials: + input r0 as [MerkleProof; 2u32].private; + rem r0[0u32].leaf_index 2u32 into r1; + is.eq r1 0u32 into r2; + cast 1field r0[0u32].siblings[0u32] r0[0u32].siblings[1u32] into r3 as [field; 3u32]; + cast 1field r0[0u32].siblings[1u32] r0[0u32].siblings[0u32] into r4 as [field; 3u32]; + ternary r2 r3[0u32] r4[0u32] into r5; + ternary r2 r3[1u32] r4[1u32] into r6; + ternary r2 r3[2u32] r4[2u32] into r7; + cast r5 r6 r7 into r8 as [field; 3u32]; + hash.psd4 r8 into r9 as field; + is.eq r0[0u32].siblings[2u32] 0field into r10; + div r0[0u32].leaf_index 2u32 into r11; + rem r11 2u32 into r12; + is.eq r12 0u32 into r13; + cast 0field r9 r0[0u32].siblings[2u32] into r14 as [field; 3u32]; + cast 0field r0[0u32].siblings[2u32] r9 into r15 as [field; 3u32]; + ternary r13 r14[0u32] r15[0u32] into r16; + ternary r13 r14[1u32] r15[1u32] into r17; + ternary r13 r14[2u32] r15[2u32] into r18; + cast r16 r17 r18 into r19 as [field; 3u32]; + hash.psd4 r19 into r20 as field; + is.eq r0[0u32].siblings[3u32] 0field into r21; + div r0[0u32].leaf_index 4u32 into r22; + rem r22 2u32 into r23; + is.eq r23 0u32 into r24; + cast 0field r20 r0[0u32].siblings[3u32] into r25 as [field; 3u32]; + cast 0field r0[0u32].siblings[3u32] r20 into r26 as [field; 3u32]; + ternary r24 r25[0u32] r26[0u32] into r27; + ternary r24 r25[1u32] r26[1u32] into r28; + ternary r24 r25[2u32] r26[2u32] into r29; + cast r27 r28 r29 into r30 as [field; 3u32]; + hash.psd4 r30 into r31 as field; + is.eq r0[0u32].siblings[4u32] 0field into r32; + div r0[0u32].leaf_index 8u32 into r33; + rem r33 2u32 into r34; + is.eq r34 0u32 into r35; + cast 0field r31 r0[0u32].siblings[4u32] into r36 as [field; 3u32]; + cast 0field r0[0u32].siblings[4u32] r31 into r37 as [field; 3u32]; + ternary r35 r36[0u32] r37[0u32] into r38; + ternary r35 r36[1u32] r37[1u32] into r39; + ternary r35 r36[2u32] r37[2u32] into r40; + cast r38 r39 r40 into r41 as [field; 3u32]; + hash.psd4 r41 into r42 as field; + is.eq r0[0u32].siblings[5u32] 0field into r43; + div r0[0u32].leaf_index 16u32 into r44; + rem r44 2u32 into r45; + is.eq r45 0u32 into r46; + cast 0field r42 r0[0u32].siblings[5u32] into r47 as [field; 3u32]; + cast 0field r0[0u32].siblings[5u32] r42 into r48 as [field; 3u32]; + ternary r46 r47[0u32] r48[0u32] into r49; + ternary r46 r47[1u32] r48[1u32] into r50; + ternary r46 r47[2u32] r48[2u32] into r51; + cast r49 r50 r51 into r52 as [field; 3u32]; + hash.psd4 r52 into r53 as field; + is.eq r0[0u32].siblings[6u32] 0field into r54; + div r0[0u32].leaf_index 32u32 into r55; + rem r55 2u32 into r56; + is.eq r56 0u32 into r57; + cast 0field r53 r0[0u32].siblings[6u32] into r58 as [field; 3u32]; + cast 0field r0[0u32].siblings[6u32] r53 into r59 as [field; 3u32]; + ternary r57 r58[0u32] r59[0u32] into r60; + ternary r57 r58[1u32] r59[1u32] into r61; + ternary r57 r58[2u32] r59[2u32] into r62; + cast r60 r61 r62 into r63 as [field; 3u32]; + hash.psd4 r63 into r64 as field; + is.eq r0[0u32].siblings[7u32] 0field into r65; + div r0[0u32].leaf_index 64u32 into r66; + rem r66 2u32 into r67; + is.eq r67 0u32 into r68; + cast 0field r64 r0[0u32].siblings[7u32] into r69 as [field; 3u32]; + cast 0field r0[0u32].siblings[7u32] r64 into r70 as [field; 3u32]; + ternary r68 r69[0u32] r70[0u32] into r71; + ternary r68 r69[1u32] r70[1u32] into r72; + ternary r68 r69[2u32] r70[2u32] into r73; + cast r71 r72 r73 into r74 as [field; 3u32]; + hash.psd4 r74 into r75 as field; + is.eq r0[0u32].siblings[8u32] 0field into r76; + div r0[0u32].leaf_index 128u32 into r77; + rem r77 2u32 into r78; + is.eq r78 0u32 into r79; + cast 0field r75 r0[0u32].siblings[8u32] into r80 as [field; 3u32]; + cast 0field r0[0u32].siblings[8u32] r75 into r81 as [field; 3u32]; + ternary r79 r80[0u32] r81[0u32] into r82; + ternary r79 r80[1u32] r81[1u32] into r83; + ternary r79 r80[2u32] r81[2u32] into r84; + cast r82 r83 r84 into r85 as [field; 3u32]; + hash.psd4 r85 into r86 as field; + is.eq r0[0u32].siblings[9u32] 0field into r87; + div r0[0u32].leaf_index 256u32 into r88; + rem r88 2u32 into r89; + is.eq r89 0u32 into r90; + cast 0field r86 r0[0u32].siblings[9u32] into r91 as [field; 3u32]; + cast 0field r0[0u32].siblings[9u32] r86 into r92 as [field; 3u32]; + ternary r90 r91[0u32] r92[0u32] into r93; + ternary r90 r91[1u32] r92[1u32] into r94; + ternary r90 r91[2u32] r92[2u32] into r95; + cast r93 r94 r95 into r96 as [field; 3u32]; + hash.psd4 r96 into r97 as field; + is.eq r0[0u32].siblings[10u32] 0field into r98; + div r0[0u32].leaf_index 512u32 into r99; + rem r99 2u32 into r100; + is.eq r100 0u32 into r101; + cast 0field r97 r0[0u32].siblings[10u32] into r102 as [field; 3u32]; + cast 0field r0[0u32].siblings[10u32] r97 into r103 as [field; 3u32]; + ternary r101 r102[0u32] r103[0u32] into r104; + ternary r101 r102[1u32] r103[1u32] into r105; + ternary r101 r102[2u32] r103[2u32] into r106; + cast r104 r105 r106 into r107 as [field; 3u32]; + hash.psd4 r107 into r108 as field; + is.eq r0[0u32].siblings[11u32] 0field into r109; + div r0[0u32].leaf_index 1024u32 into r110; + rem r110 2u32 into r111; + is.eq r111 0u32 into r112; + cast 0field r108 r0[0u32].siblings[11u32] into r113 as [field; 3u32]; + cast 0field r0[0u32].siblings[11u32] r108 into r114 as [field; 3u32]; + ternary r112 r113[0u32] r114[0u32] into r115; + ternary r112 r113[1u32] r114[1u32] into r116; + ternary r112 r113[2u32] r114[2u32] into r117; + cast r115 r116 r117 into r118 as [field; 3u32]; + hash.psd4 r118 into r119 as field; + is.eq r0[0u32].siblings[12u32] 0field into r120; + div r0[0u32].leaf_index 2048u32 into r121; + rem r121 2u32 into r122; + is.eq r122 0u32 into r123; + cast 0field r119 r0[0u32].siblings[12u32] into r124 as [field; 3u32]; + cast 0field r0[0u32].siblings[12u32] r119 into r125 as [field; 3u32]; + ternary r123 r124[0u32] r125[0u32] into r126; + ternary r123 r124[1u32] r125[1u32] into r127; + ternary r123 r124[2u32] r125[2u32] into r128; + cast r126 r127 r128 into r129 as [field; 3u32]; + hash.psd4 r129 into r130 as field; + is.eq r0[0u32].siblings[13u32] 0field into r131; + div r0[0u32].leaf_index 4096u32 into r132; + rem r132 2u32 into r133; + is.eq r133 0u32 into r134; + cast 0field r130 r0[0u32].siblings[13u32] into r135 as [field; 3u32]; + cast 0field r0[0u32].siblings[13u32] r130 into r136 as [field; 3u32]; + ternary r134 r135[0u32] r136[0u32] into r137; + ternary r134 r135[1u32] r136[1u32] into r138; + ternary r134 r135[2u32] r136[2u32] into r139; + cast r137 r138 r139 into r140 as [field; 3u32]; + hash.psd4 r140 into r141 as field; + is.eq r0[0u32].siblings[14u32] 0field into r142; + div r0[0u32].leaf_index 8192u32 into r143; + rem r143 2u32 into r144; + is.eq r144 0u32 into r145; + cast 0field r141 r0[0u32].siblings[14u32] into r146 as [field; 3u32]; + cast 0field r0[0u32].siblings[14u32] r141 into r147 as [field; 3u32]; + ternary r145 r146[0u32] r147[0u32] into r148; + ternary r145 r146[1u32] r147[1u32] into r149; + ternary r145 r146[2u32] r147[2u32] into r150; + cast r148 r149 r150 into r151 as [field; 3u32]; + hash.psd4 r151 into r152 as field; + is.eq r0[0u32].siblings[15u32] 0field into r153; + div r0[0u32].leaf_index 16384u32 into r154; + rem r154 2u32 into r155; + is.eq r155 0u32 into r156; + cast 0field r152 r0[0u32].siblings[15u32] into r157 as [field; 3u32]; + cast 0field r0[0u32].siblings[15u32] r152 into r158 as [field; 3u32]; + ternary r156 r157[0u32] r158[0u32] into r159; + ternary r156 r157[1u32] r158[1u32] into r160; + ternary r156 r157[2u32] r158[2u32] into r161; + cast r159 r160 r161 into r162 as [field; 3u32]; + hash.psd4 r162 into r163 as field; + ternary r153 r152 r163 into r164; + ternary r153 14u32 15u32 into r165; + ternary r142 r141 r164 into r166; + ternary r142 13u32 r165 into r167; + ternary r131 r130 r166 into r168; + ternary r131 12u32 r167 into r169; + ternary r120 r119 r168 into r170; + ternary r120 11u32 r169 into r171; + ternary r109 r108 r170 into r172; + ternary r109 10u32 r171 into r173; + ternary r98 r97 r172 into r174; + ternary r98 9u32 r173 into r175; + ternary r87 r86 r174 into r176; + ternary r87 8u32 r175 into r177; + ternary r76 r75 r176 into r178; + ternary r76 7u32 r177 into r179; + ternary r65 r64 r178 into r180; + ternary r65 6u32 r179 into r181; + ternary r54 r53 r180 into r182; + ternary r54 5u32 r181 into r183; + ternary r43 r42 r182 into r184; + ternary r43 4u32 r183 into r185; + ternary r32 r31 r184 into r186; + ternary r32 3u32 r185 into r187; + ternary r21 r20 r186 into r188; + ternary r21 2u32 r187 into r189; + ternary r10 r9 r188 into r190; + ternary r10 1u32 r189 into r191; + rem r0[1u32].leaf_index 2u32 into r192; + is.eq r192 0u32 into r193; + cast 1field r0[1u32].siblings[0u32] r0[1u32].siblings[1u32] into r194 as [field; 3u32]; + cast 1field r0[1u32].siblings[1u32] r0[1u32].siblings[0u32] into r195 as [field; 3u32]; + ternary r193 r194[0u32] r195[0u32] into r196; + ternary r193 r194[1u32] r195[1u32] into r197; + ternary r193 r194[2u32] r195[2u32] into r198; + cast r196 r197 r198 into r199 as [field; 3u32]; + hash.psd4 r199 into r200 as field; + is.eq r0[1u32].siblings[2u32] 0field into r201; + div r0[1u32].leaf_index 2u32 into r202; + rem r202 2u32 into r203; + is.eq r203 0u32 into r204; + cast 0field r200 r0[1u32].siblings[2u32] into r205 as [field; 3u32]; + cast 0field r0[1u32].siblings[2u32] r200 into r206 as [field; 3u32]; + ternary r204 r205[0u32] r206[0u32] into r207; + ternary r204 r205[1u32] r206[1u32] into r208; + ternary r204 r205[2u32] r206[2u32] into r209; + cast r207 r208 r209 into r210 as [field; 3u32]; + hash.psd4 r210 into r211 as field; + is.eq r0[1u32].siblings[3u32] 0field into r212; + div r0[1u32].leaf_index 4u32 into r213; + rem r213 2u32 into r214; + is.eq r214 0u32 into r215; + cast 0field r211 r0[1u32].siblings[3u32] into r216 as [field; 3u32]; + cast 0field r0[1u32].siblings[3u32] r211 into r217 as [field; 3u32]; + ternary r215 r216[0u32] r217[0u32] into r218; + ternary r215 r216[1u32] r217[1u32] into r219; + ternary r215 r216[2u32] r217[2u32] into r220; + cast r218 r219 r220 into r221 as [field; 3u32]; + hash.psd4 r221 into r222 as field; + is.eq r0[1u32].siblings[4u32] 0field into r223; + div r0[1u32].leaf_index 8u32 into r224; + rem r224 2u32 into r225; + is.eq r225 0u32 into r226; + cast 0field r222 r0[1u32].siblings[4u32] into r227 as [field; 3u32]; + cast 0field r0[1u32].siblings[4u32] r222 into r228 as [field; 3u32]; + ternary r226 r227[0u32] r228[0u32] into r229; + ternary r226 r227[1u32] r228[1u32] into r230; + ternary r226 r227[2u32] r228[2u32] into r231; + cast r229 r230 r231 into r232 as [field; 3u32]; + hash.psd4 r232 into r233 as field; + is.eq r0[1u32].siblings[5u32] 0field into r234; + div r0[1u32].leaf_index 16u32 into r235; + rem r235 2u32 into r236; + is.eq r236 0u32 into r237; + cast 0field r233 r0[1u32].siblings[5u32] into r238 as [field; 3u32]; + cast 0field r0[1u32].siblings[5u32] r233 into r239 as [field; 3u32]; + ternary r237 r238[0u32] r239[0u32] into r240; + ternary r237 r238[1u32] r239[1u32] into r241; + ternary r237 r238[2u32] r239[2u32] into r242; + cast r240 r241 r242 into r243 as [field; 3u32]; + hash.psd4 r243 into r244 as field; + is.eq r0[1u32].siblings[6u32] 0field into r245; + div r0[1u32].leaf_index 32u32 into r246; + rem r246 2u32 into r247; + is.eq r247 0u32 into r248; + cast 0field r244 r0[1u32].siblings[6u32] into r249 as [field; 3u32]; + cast 0field r0[1u32].siblings[6u32] r244 into r250 as [field; 3u32]; + ternary r248 r249[0u32] r250[0u32] into r251; + ternary r248 r249[1u32] r250[1u32] into r252; + ternary r248 r249[2u32] r250[2u32] into r253; + cast r251 r252 r253 into r254 as [field; 3u32]; + hash.psd4 r254 into r255 as field; + is.eq r0[1u32].siblings[7u32] 0field into r256; + div r0[1u32].leaf_index 64u32 into r257; + rem r257 2u32 into r258; + is.eq r258 0u32 into r259; + cast 0field r255 r0[1u32].siblings[7u32] into r260 as [field; 3u32]; + cast 0field r0[1u32].siblings[7u32] r255 into r261 as [field; 3u32]; + ternary r259 r260[0u32] r261[0u32] into r262; + ternary r259 r260[1u32] r261[1u32] into r263; + ternary r259 r260[2u32] r261[2u32] into r264; + cast r262 r263 r264 into r265 as [field; 3u32]; + hash.psd4 r265 into r266 as field; + is.eq r0[1u32].siblings[8u32] 0field into r267; + div r0[1u32].leaf_index 128u32 into r268; + rem r268 2u32 into r269; + is.eq r269 0u32 into r270; + cast 0field r266 r0[1u32].siblings[8u32] into r271 as [field; 3u32]; + cast 0field r0[1u32].siblings[8u32] r266 into r272 as [field; 3u32]; + ternary r270 r271[0u32] r272[0u32] into r273; + ternary r270 r271[1u32] r272[1u32] into r274; + ternary r270 r271[2u32] r272[2u32] into r275; + cast r273 r274 r275 into r276 as [field; 3u32]; + hash.psd4 r276 into r277 as field; + is.eq r0[1u32].siblings[9u32] 0field into r278; + div r0[1u32].leaf_index 256u32 into r279; + rem r279 2u32 into r280; + is.eq r280 0u32 into r281; + cast 0field r277 r0[1u32].siblings[9u32] into r282 as [field; 3u32]; + cast 0field r0[1u32].siblings[9u32] r277 into r283 as [field; 3u32]; + ternary r281 r282[0u32] r283[0u32] into r284; + ternary r281 r282[1u32] r283[1u32] into r285; + ternary r281 r282[2u32] r283[2u32] into r286; + cast r284 r285 r286 into r287 as [field; 3u32]; + hash.psd4 r287 into r288 as field; + is.eq r0[1u32].siblings[10u32] 0field into r289; + div r0[1u32].leaf_index 512u32 into r290; + rem r290 2u32 into r291; + is.eq r291 0u32 into r292; + cast 0field r288 r0[1u32].siblings[10u32] into r293 as [field; 3u32]; + cast 0field r0[1u32].siblings[10u32] r288 into r294 as [field; 3u32]; + ternary r292 r293[0u32] r294[0u32] into r295; + ternary r292 r293[1u32] r294[1u32] into r296; + ternary r292 r293[2u32] r294[2u32] into r297; + cast r295 r296 r297 into r298 as [field; 3u32]; + hash.psd4 r298 into r299 as field; + is.eq r0[1u32].siblings[11u32] 0field into r300; + div r0[1u32].leaf_index 1024u32 into r301; + rem r301 2u32 into r302; + is.eq r302 0u32 into r303; + cast 0field r299 r0[1u32].siblings[11u32] into r304 as [field; 3u32]; + cast 0field r0[1u32].siblings[11u32] r299 into r305 as [field; 3u32]; + ternary r303 r304[0u32] r305[0u32] into r306; + ternary r303 r304[1u32] r305[1u32] into r307; + ternary r303 r304[2u32] r305[2u32] into r308; + cast r306 r307 r308 into r309 as [field; 3u32]; + hash.psd4 r309 into r310 as field; + is.eq r0[1u32].siblings[12u32] 0field into r311; + div r0[1u32].leaf_index 2048u32 into r312; + rem r312 2u32 into r313; + is.eq r313 0u32 into r314; + cast 0field r310 r0[1u32].siblings[12u32] into r315 as [field; 3u32]; + cast 0field r0[1u32].siblings[12u32] r310 into r316 as [field; 3u32]; + ternary r314 r315[0u32] r316[0u32] into r317; + ternary r314 r315[1u32] r316[1u32] into r318; + ternary r314 r315[2u32] r316[2u32] into r319; + cast r317 r318 r319 into r320 as [field; 3u32]; + hash.psd4 r320 into r321 as field; + is.eq r0[1u32].siblings[13u32] 0field into r322; + div r0[1u32].leaf_index 4096u32 into r323; + rem r323 2u32 into r324; + is.eq r324 0u32 into r325; + cast 0field r321 r0[1u32].siblings[13u32] into r326 as [field; 3u32]; + cast 0field r0[1u32].siblings[13u32] r321 into r327 as [field; 3u32]; + ternary r325 r326[0u32] r327[0u32] into r328; + ternary r325 r326[1u32] r327[1u32] into r329; + ternary r325 r326[2u32] r327[2u32] into r330; + cast r328 r329 r330 into r331 as [field; 3u32]; + hash.psd4 r331 into r332 as field; + is.eq r0[1u32].siblings[14u32] 0field into r333; + div r0[1u32].leaf_index 8192u32 into r334; + rem r334 2u32 into r335; + is.eq r335 0u32 into r336; + cast 0field r332 r0[1u32].siblings[14u32] into r337 as [field; 3u32]; + cast 0field r0[1u32].siblings[14u32] r332 into r338 as [field; 3u32]; + ternary r336 r337[0u32] r338[0u32] into r339; + ternary r336 r337[1u32] r338[1u32] into r340; + ternary r336 r337[2u32] r338[2u32] into r341; + cast r339 r340 r341 into r342 as [field; 3u32]; + hash.psd4 r342 into r343 as field; + is.eq r0[1u32].siblings[15u32] 0field into r344; + div r0[1u32].leaf_index 16384u32 into r345; + rem r345 2u32 into r346; + is.eq r346 0u32 into r347; + cast 0field r343 r0[1u32].siblings[15u32] into r348 as [field; 3u32]; + cast 0field r0[1u32].siblings[15u32] r343 into r349 as [field; 3u32]; + ternary r347 r348[0u32] r349[0u32] into r350; + ternary r347 r348[1u32] r349[1u32] into r351; + ternary r347 r348[2u32] r349[2u32] into r352; + cast r350 r351 r352 into r353 as [field; 3u32]; + hash.psd4 r353 into r354 as field; + ternary r344 r343 r354 into r355; + ternary r344 14u32 15u32 into r356; + ternary r333 r332 r355 into r357; + ternary r333 13u32 r356 into r358; + ternary r322 r321 r357 into r359; + ternary r322 12u32 r358 into r360; + ternary r311 r310 r359 into r361; + ternary r311 11u32 r360 into r362; + ternary r300 r299 r361 into r363; + ternary r300 10u32 r362 into r364; + ternary r289 r288 r363 into r365; + ternary r289 9u32 r364 into r366; + ternary r278 r277 r365 into r367; + ternary r278 8u32 r366 into r368; + ternary r267 r266 r367 into r369; + ternary r267 7u32 r368 into r370; + ternary r256 r255 r369 into r371; + ternary r256 6u32 r370 into r372; + ternary r245 r244 r371 into r373; + ternary r245 5u32 r372 into r374; + ternary r234 r233 r373 into r375; + ternary r234 4u32 r374 into r376; + ternary r223 r222 r375 into r377; + ternary r223 3u32 r376 into r378; + ternary r212 r211 r377 into r379; + ternary r212 2u32 r378 into r380; + ternary r201 r200 r379 into r381; + ternary r201 1u32 r380 into r382; + assert.eq r190 r381; + assert.eq r191 r382; + cast self.signer into r383 as field; + is.eq r0[0u32].leaf_index r0[1u32].leaf_index into r384; + is.eq r0[0u32].leaf_index 0u32 into r385; + lt r383 r0[0u32].siblings[0u32] into r386; + and r384 r385 into r387; + not r387 into r388; + or r386 r388 into r389; + assert.eq r389 true; + not r385 into r390; + pow 2u32 r191 into r391; + sub r391 1u32 into r392; + and r384 r390 into r393; + not r393 into r394; + is.eq r0[0u32].leaf_index r392 into r395; + or r395 r394 into r396; + assert.eq r396 true; + gt r383 r0[0u32].siblings[0u32] into r397; + or r397 r394 into r398; + assert.eq r398 true; + not r384 into r399; + gt r383 r0[0u32].siblings[0u32] into r400; + not r399 into r401; + or r400 r401 into r402; + assert.eq r402 true; + lt r383 r0[1u32].siblings[0u32] into r403; + or r403 r401 into r404; + assert.eq r404 true; + lte r0[1u32].leaf_index r392 into r405; + or r405 r401 into r406; + assert.eq r406 true; + add r0[0u32].leaf_index 1u32 into r407; + is.eq r407 r0[1u32].leaf_index into r408; + or r408 r401 into r409; + assert.eq r409 true; + cast self.signer r190 into r410 as Credentials.record; + async get_credentials r190 into r411; + output r410 as Credentials.record; + output r411 as test_usdcx_stablecoin.aleo/get_credentials.future; + +finalize get_credentials: + input r0 as field.public; + get test_usdcx_freezelist.aleo/freeze_list_root[1u8] into r1; + get test_usdcx_freezelist.aleo/block_height_window[true] into r2; + is.neq r1 r0 into r3; + branch.eq r3 false to end_then_0_2; + get test_usdcx_freezelist.aleo/freeze_list_root[2u8] into r4; + assert.eq r0 r4; + get test_usdcx_freezelist.aleo/root_updated_height[true] into r5; + add r5 r2 into r6; + gt r6 block.height into r7; + assert.eq r7 true; + branch.eq true true to end_otherwise_0_3; + position end_then_0_2; + position end_otherwise_0_3; + +function mint_public: + input r0 as address.public; + input r1 as u128.public; + async mint_public r0 r1 self.caller into r2; + output r2 as test_usdcx_stablecoin.aleo/mint_public.future; + +finalize mint_public: + input r0 as address.public; + input r1 as u128.public; + input r2 as address.public; + get address_to_role[r2] into r3; + and r3 1u16 into r4; + is.eq r4 1u16 into r5; + assert.eq r5 true; + get pause[true] into r6; + assert.eq r6 false; + get token_info[true] into r7; + add r7.supply r1 into r8; + lte r8 r7.max_supply into r9; + assert.eq r9 true; + get.or_use balances[r0] 0u128 into r10; + add r1 r10 into r11; + set r11 into balances[r0]; + cast r7.name r7.symbol r7.decimals r8 r7.max_supply into r12 as TokenInfo; + set r12 into token_info[true]; + +function mint_private: + input r0 as address.private; + input r1 as u128.public; + cast r0 r1 into r2 as Token.record; + cast aleo1mnldqsfrwayzfep3t9zusu4y7yknsdhfwx76v5pajla35mrqn5xsvvurhy r1 aleo1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq3ljyzc r0 into r3 as ComplianceRecord.record; + async mint_private r1 self.caller into r4; + output r3 as ComplianceRecord.record; + output r2 as Token.record; + output r4 as test_usdcx_stablecoin.aleo/mint_private.future; + +finalize mint_private: + input r0 as u128.public; + input r1 as address.public; + get address_to_role[r1] into r2; + and r2 1u16 into r3; + is.eq r3 1u16 into r4; + assert.eq r4 true; + get pause[true] into r5; + assert.eq r5 false; + get token_info[true] into r6; + add r6.supply r0 into r7; + lte r7 r6.max_supply into r8; + assert.eq r8 true; + cast r6.name r6.symbol r6.decimals r7 r6.max_supply into r9 as TokenInfo; + set r9 into token_info[true]; + +function burn_public: + input r0 as address.public; + input r1 as u128.public; + async burn_public r0 r1 self.caller into r2; + output r2 as test_usdcx_stablecoin.aleo/burn_public.future; + +finalize burn_public: + input r0 as address.public; + input r1 as u128.public; + input r2 as address.public; + get address_to_role[r2] into r3; + and r3 2u16 into r4; + is.eq r4 2u16 into r5; + assert.eq r5 true; + get pause[true] into r6; + assert.eq r6 false; + get balances[r0] into r7; + sub r7 r1 into r8; + set r8 into balances[r0]; + get token_info[true] into r9; + sub r9.supply r1 into r10; + cast r9.name r9.symbol r9.decimals r10 r9.max_supply into r11 as TokenInfo; + set r11 into token_info[true]; + +function burn_private: + input r0 as Token.record; + input r1 as u128.public; + sub r0.amount r1 into r2; + cast r0.owner r2 into r3 as Token.record; + cast aleo1mnldqsfrwayzfep3t9zusu4y7yknsdhfwx76v5pajla35mrqn5xsvvurhy r1 r0.owner aleo1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq3ljyzc into r4 as ComplianceRecord.record; + async burn_private r1 self.caller into r5; + output r4 as ComplianceRecord.record; + output r3 as Token.record; + output r5 as test_usdcx_stablecoin.aleo/burn_private.future; + +finalize burn_private: + input r0 as u128.public; + input r1 as address.public; + get address_to_role[r1] into r2; + and r2 2u16 into r3; + is.eq r3 2u16 into r4; + assert.eq r4 true; + get pause[true] into r5; + assert.eq r5 false; + get token_info[true] into r6; + sub r6.supply r0 into r7; + cast r6.name r6.symbol r6.decimals r7 r6.max_supply into r8 as TokenInfo; + set r8 into token_info[true]; + +function transfer_public: + input r0 as address.public; + input r1 as u128.public; + async transfer_public r0 r1 self.caller into r2; + output r2 as test_usdcx_stablecoin.aleo/transfer_public.future; + +finalize transfer_public: + input r0 as address.public; + input r1 as u128.public; + input r2 as address.public; + get.or_use test_usdcx_freezelist.aleo/freeze_list[r2] false into r3; + assert.eq r3 false; + get.or_use test_usdcx_freezelist.aleo/freeze_list[r0] false into r4; + assert.eq r4 false; + get pause[true] into r5; + assert.eq r5 false; + get balances[r2] into r6; + sub r6 r1 into r7; + set r7 into balances[r2]; + get.or_use balances[r0] 0u128 into r8; + add r8 r1 into r9; + set r9 into balances[r0]; + +function transfer_public_as_signer: + input r0 as address.public; + input r1 as u128.public; + async transfer_public_as_signer r0 r1 self.signer into r2; + output r2 as test_usdcx_stablecoin.aleo/transfer_public_as_signer.future; + +finalize transfer_public_as_signer: + input r0 as address.public; + input r1 as u128.public; + input r2 as address.public; + get.or_use test_usdcx_freezelist.aleo/freeze_list[r2] false into r3; + assert.eq r3 false; + get.or_use test_usdcx_freezelist.aleo/freeze_list[r0] false into r4; + assert.eq r4 false; + get pause[true] into r5; + assert.eq r5 false; + get balances[r2] into r6; + sub r6 r1 into r7; + set r7 into balances[r2]; + get.or_use balances[r0] 0u128 into r8; + add r8 r1 into r9; + set r9 into balances[r0]; + +function approve_public: + input r0 as address.public; + input r1 as u128.public; + cast self.caller r0 into r2 as TokenAllowance; + hash.bhp256 r2 into r3 as field; + async approve_public r1 r3 into r4; + output r4 as test_usdcx_stablecoin.aleo/approve_public.future; + +finalize approve_public: + input r0 as u128.public; + input r1 as field.public; + get pause[true] into r2; + assert.eq r2 false; + get.or_use allowances[r1] 0u128 into r3; + add r3 r0 into r4; + set r4 into allowances[r1]; + +function unapprove_public: + input r0 as address.public; + input r1 as u128.public; + cast self.caller r0 into r2 as TokenAllowance; + hash.bhp256 r2 into r3 as field; + async unapprove_public r1 r3 into r4; + output r4 as test_usdcx_stablecoin.aleo/unapprove_public.future; + +finalize unapprove_public: + input r0 as u128.public; + input r1 as field.public; + get pause[true] into r2; + assert.eq r2 false; + get allowances[r1] into r3; + sub r3 r0 into r4; + set r4 into allowances[r1]; + +function transfer_from_public: + input r0 as address.public; + input r1 as address.public; + input r2 as u128.public; + cast r0 self.caller into r3 as TokenAllowance; + hash.bhp256 r3 into r4 as field; + async transfer_from_public r0 r1 r2 r4 into r5; + output r5 as test_usdcx_stablecoin.aleo/transfer_from_public.future; + +finalize transfer_from_public: + input r0 as address.public; + input r1 as address.public; + input r2 as u128.public; + input r3 as field.public; + get.or_use test_usdcx_freezelist.aleo/freeze_list[r0] false into r4; + assert.eq r4 false; + get.or_use test_usdcx_freezelist.aleo/freeze_list[r1] false into r5; + assert.eq r5 false; + get pause[true] into r6; + assert.eq r6 false; + get allowances[r3] into r7; + sub r7 r2 into r8; + set r8 into allowances[r3]; + get balances[r0] into r9; + sub r9 r2 into r10; + set r10 into balances[r0]; + get.or_use balances[r1] 0u128 into r11; + add r11 r2 into r12; + set r12 into balances[r1]; + +function transfer_public_to_private: + input r0 as address.private; + input r1 as u128.public; + cast r0 r1 into r2 as Token.record; + cast aleo1mnldqsfrwayzfep3t9zusu4y7yknsdhfwx76v5pajla35mrqn5xsvvurhy r1 self.caller r0 into r3 as ComplianceRecord.record; + async transfer_public_to_private r1 self.caller into r4; + output r3 as ComplianceRecord.record; + output r2 as Token.record; + output r4 as test_usdcx_stablecoin.aleo/transfer_public_to_private.future; + +finalize transfer_public_to_private: + input r0 as u128.public; + input r1 as address.public; + get.or_use test_usdcx_freezelist.aleo/freeze_list[r1] false into r2; + assert.eq r2 false; + get pause[true] into r3; + assert.eq r3 false; + get balances[r1] into r4; + sub r4 r0 into r5; + set r5 into balances[r1]; + +function transfer_from_public_to_private: + input r0 as address.public; + input r1 as address.private; + input r2 as u128.public; + cast r1 r2 into r3 as Token.record; + cast r0 self.caller into r4 as TokenAllowance; + hash.bhp256 r4 into r5 as field; + cast aleo1mnldqsfrwayzfep3t9zusu4y7yknsdhfwx76v5pajla35mrqn5xsvvurhy r2 r0 r1 into r6 as ComplianceRecord.record; + async transfer_from_public_to_private r0 r2 r5 into r7; + output r6 as ComplianceRecord.record; + output r3 as Token.record; + output r7 as test_usdcx_stablecoin.aleo/transfer_from_public_to_private.future; + +finalize transfer_from_public_to_private: + input r0 as address.public; + input r1 as u128.public; + input r2 as field.public; + get.or_use test_usdcx_freezelist.aleo/freeze_list[r0] false into r3; + assert.eq r3 false; + get pause[true] into r4; + assert.eq r4 false; + get allowances[r2] into r5; + sub r5 r1 into r6; + set r6 into allowances[r2]; + get balances[r0] into r7; + sub r7 r1 into r8; + set r8 into balances[r0]; + +function transfer_private: + input r0 as address.private; + input r1 as u128.private; + input r2 as Token.record; + input r3 as [MerkleProof; 2u32].private; + rem r3[0u32].leaf_index 2u32 into r4; + is.eq r4 0u32 into r5; + cast 1field r3[0u32].siblings[0u32] r3[0u32].siblings[1u32] into r6 as [field; 3u32]; + cast 1field r3[0u32].siblings[1u32] r3[0u32].siblings[0u32] into r7 as [field; 3u32]; + ternary r5 r6[0u32] r7[0u32] into r8; + ternary r5 r6[1u32] r7[1u32] into r9; + ternary r5 r6[2u32] r7[2u32] into r10; + cast r8 r9 r10 into r11 as [field; 3u32]; + hash.psd4 r11 into r12 as field; + is.eq r3[0u32].siblings[2u32] 0field into r13; + div r3[0u32].leaf_index 2u32 into r14; + rem r14 2u32 into r15; + is.eq r15 0u32 into r16; + cast 0field r12 r3[0u32].siblings[2u32] into r17 as [field; 3u32]; + cast 0field r3[0u32].siblings[2u32] r12 into r18 as [field; 3u32]; + ternary r16 r17[0u32] r18[0u32] into r19; + ternary r16 r17[1u32] r18[1u32] into r20; + ternary r16 r17[2u32] r18[2u32] into r21; + cast r19 r20 r21 into r22 as [field; 3u32]; + hash.psd4 r22 into r23 as field; + is.eq r3[0u32].siblings[3u32] 0field into r24; + div r3[0u32].leaf_index 4u32 into r25; + rem r25 2u32 into r26; + is.eq r26 0u32 into r27; + cast 0field r23 r3[0u32].siblings[3u32] into r28 as [field; 3u32]; + cast 0field r3[0u32].siblings[3u32] r23 into r29 as [field; 3u32]; + ternary r27 r28[0u32] r29[0u32] into r30; + ternary r27 r28[1u32] r29[1u32] into r31; + ternary r27 r28[2u32] r29[2u32] into r32; + cast r30 r31 r32 into r33 as [field; 3u32]; + hash.psd4 r33 into r34 as field; + is.eq r3[0u32].siblings[4u32] 0field into r35; + div r3[0u32].leaf_index 8u32 into r36; + rem r36 2u32 into r37; + is.eq r37 0u32 into r38; + cast 0field r34 r3[0u32].siblings[4u32] into r39 as [field; 3u32]; + cast 0field r3[0u32].siblings[4u32] r34 into r40 as [field; 3u32]; + ternary r38 r39[0u32] r40[0u32] into r41; + ternary r38 r39[1u32] r40[1u32] into r42; + ternary r38 r39[2u32] r40[2u32] into r43; + cast r41 r42 r43 into r44 as [field; 3u32]; + hash.psd4 r44 into r45 as field; + is.eq r3[0u32].siblings[5u32] 0field into r46; + div r3[0u32].leaf_index 16u32 into r47; + rem r47 2u32 into r48; + is.eq r48 0u32 into r49; + cast 0field r45 r3[0u32].siblings[5u32] into r50 as [field; 3u32]; + cast 0field r3[0u32].siblings[5u32] r45 into r51 as [field; 3u32]; + ternary r49 r50[0u32] r51[0u32] into r52; + ternary r49 r50[1u32] r51[1u32] into r53; + ternary r49 r50[2u32] r51[2u32] into r54; + cast r52 r53 r54 into r55 as [field; 3u32]; + hash.psd4 r55 into r56 as field; + is.eq r3[0u32].siblings[6u32] 0field into r57; + div r3[0u32].leaf_index 32u32 into r58; + rem r58 2u32 into r59; + is.eq r59 0u32 into r60; + cast 0field r56 r3[0u32].siblings[6u32] into r61 as [field; 3u32]; + cast 0field r3[0u32].siblings[6u32] r56 into r62 as [field; 3u32]; + ternary r60 r61[0u32] r62[0u32] into r63; + ternary r60 r61[1u32] r62[1u32] into r64; + ternary r60 r61[2u32] r62[2u32] into r65; + cast r63 r64 r65 into r66 as [field; 3u32]; + hash.psd4 r66 into r67 as field; + is.eq r3[0u32].siblings[7u32] 0field into r68; + div r3[0u32].leaf_index 64u32 into r69; + rem r69 2u32 into r70; + is.eq r70 0u32 into r71; + cast 0field r67 r3[0u32].siblings[7u32] into r72 as [field; 3u32]; + cast 0field r3[0u32].siblings[7u32] r67 into r73 as [field; 3u32]; + ternary r71 r72[0u32] r73[0u32] into r74; + ternary r71 r72[1u32] r73[1u32] into r75; + ternary r71 r72[2u32] r73[2u32] into r76; + cast r74 r75 r76 into r77 as [field; 3u32]; + hash.psd4 r77 into r78 as field; + is.eq r3[0u32].siblings[8u32] 0field into r79; + div r3[0u32].leaf_index 128u32 into r80; + rem r80 2u32 into r81; + is.eq r81 0u32 into r82; + cast 0field r78 r3[0u32].siblings[8u32] into r83 as [field; 3u32]; + cast 0field r3[0u32].siblings[8u32] r78 into r84 as [field; 3u32]; + ternary r82 r83[0u32] r84[0u32] into r85; + ternary r82 r83[1u32] r84[1u32] into r86; + ternary r82 r83[2u32] r84[2u32] into r87; + cast r85 r86 r87 into r88 as [field; 3u32]; + hash.psd4 r88 into r89 as field; + is.eq r3[0u32].siblings[9u32] 0field into r90; + div r3[0u32].leaf_index 256u32 into r91; + rem r91 2u32 into r92; + is.eq r92 0u32 into r93; + cast 0field r89 r3[0u32].siblings[9u32] into r94 as [field; 3u32]; + cast 0field r3[0u32].siblings[9u32] r89 into r95 as [field; 3u32]; + ternary r93 r94[0u32] r95[0u32] into r96; + ternary r93 r94[1u32] r95[1u32] into r97; + ternary r93 r94[2u32] r95[2u32] into r98; + cast r96 r97 r98 into r99 as [field; 3u32]; + hash.psd4 r99 into r100 as field; + is.eq r3[0u32].siblings[10u32] 0field into r101; + div r3[0u32].leaf_index 512u32 into r102; + rem r102 2u32 into r103; + is.eq r103 0u32 into r104; + cast 0field r100 r3[0u32].siblings[10u32] into r105 as [field; 3u32]; + cast 0field r3[0u32].siblings[10u32] r100 into r106 as [field; 3u32]; + ternary r104 r105[0u32] r106[0u32] into r107; + ternary r104 r105[1u32] r106[1u32] into r108; + ternary r104 r105[2u32] r106[2u32] into r109; + cast r107 r108 r109 into r110 as [field; 3u32]; + hash.psd4 r110 into r111 as field; + is.eq r3[0u32].siblings[11u32] 0field into r112; + div r3[0u32].leaf_index 1024u32 into r113; + rem r113 2u32 into r114; + is.eq r114 0u32 into r115; + cast 0field r111 r3[0u32].siblings[11u32] into r116 as [field; 3u32]; + cast 0field r3[0u32].siblings[11u32] r111 into r117 as [field; 3u32]; + ternary r115 r116[0u32] r117[0u32] into r118; + ternary r115 r116[1u32] r117[1u32] into r119; + ternary r115 r116[2u32] r117[2u32] into r120; + cast r118 r119 r120 into r121 as [field; 3u32]; + hash.psd4 r121 into r122 as field; + is.eq r3[0u32].siblings[12u32] 0field into r123; + div r3[0u32].leaf_index 2048u32 into r124; + rem r124 2u32 into r125; + is.eq r125 0u32 into r126; + cast 0field r122 r3[0u32].siblings[12u32] into r127 as [field; 3u32]; + cast 0field r3[0u32].siblings[12u32] r122 into r128 as [field; 3u32]; + ternary r126 r127[0u32] r128[0u32] into r129; + ternary r126 r127[1u32] r128[1u32] into r130; + ternary r126 r127[2u32] r128[2u32] into r131; + cast r129 r130 r131 into r132 as [field; 3u32]; + hash.psd4 r132 into r133 as field; + is.eq r3[0u32].siblings[13u32] 0field into r134; + div r3[0u32].leaf_index 4096u32 into r135; + rem r135 2u32 into r136; + is.eq r136 0u32 into r137; + cast 0field r133 r3[0u32].siblings[13u32] into r138 as [field; 3u32]; + cast 0field r3[0u32].siblings[13u32] r133 into r139 as [field; 3u32]; + ternary r137 r138[0u32] r139[0u32] into r140; + ternary r137 r138[1u32] r139[1u32] into r141; + ternary r137 r138[2u32] r139[2u32] into r142; + cast r140 r141 r142 into r143 as [field; 3u32]; + hash.psd4 r143 into r144 as field; + is.eq r3[0u32].siblings[14u32] 0field into r145; + div r3[0u32].leaf_index 8192u32 into r146; + rem r146 2u32 into r147; + is.eq r147 0u32 into r148; + cast 0field r144 r3[0u32].siblings[14u32] into r149 as [field; 3u32]; + cast 0field r3[0u32].siblings[14u32] r144 into r150 as [field; 3u32]; + ternary r148 r149[0u32] r150[0u32] into r151; + ternary r148 r149[1u32] r150[1u32] into r152; + ternary r148 r149[2u32] r150[2u32] into r153; + cast r151 r152 r153 into r154 as [field; 3u32]; + hash.psd4 r154 into r155 as field; + is.eq r3[0u32].siblings[15u32] 0field into r156; + div r3[0u32].leaf_index 16384u32 into r157; + rem r157 2u32 into r158; + is.eq r158 0u32 into r159; + cast 0field r155 r3[0u32].siblings[15u32] into r160 as [field; 3u32]; + cast 0field r3[0u32].siblings[15u32] r155 into r161 as [field; 3u32]; + ternary r159 r160[0u32] r161[0u32] into r162; + ternary r159 r160[1u32] r161[1u32] into r163; + ternary r159 r160[2u32] r161[2u32] into r164; + cast r162 r163 r164 into r165 as [field; 3u32]; + hash.psd4 r165 into r166 as field; + ternary r156 r155 r166 into r167; + ternary r156 14u32 15u32 into r168; + ternary r145 r144 r167 into r169; + ternary r145 13u32 r168 into r170; + ternary r134 r133 r169 into r171; + ternary r134 12u32 r170 into r172; + ternary r123 r122 r171 into r173; + ternary r123 11u32 r172 into r174; + ternary r112 r111 r173 into r175; + ternary r112 10u32 r174 into r176; + ternary r101 r100 r175 into r177; + ternary r101 9u32 r176 into r178; + ternary r90 r89 r177 into r179; + ternary r90 8u32 r178 into r180; + ternary r79 r78 r179 into r181; + ternary r79 7u32 r180 into r182; + ternary r68 r67 r181 into r183; + ternary r68 6u32 r182 into r184; + ternary r57 r56 r183 into r185; + ternary r57 5u32 r184 into r186; + ternary r46 r45 r185 into r187; + ternary r46 4u32 r186 into r188; + ternary r35 r34 r187 into r189; + ternary r35 3u32 r188 into r190; + ternary r24 r23 r189 into r191; + ternary r24 2u32 r190 into r192; + ternary r13 r12 r191 into r193; + ternary r13 1u32 r192 into r194; + rem r3[1u32].leaf_index 2u32 into r195; + is.eq r195 0u32 into r196; + cast 1field r3[1u32].siblings[0u32] r3[1u32].siblings[1u32] into r197 as [field; 3u32]; + cast 1field r3[1u32].siblings[1u32] r3[1u32].siblings[0u32] into r198 as [field; 3u32]; + ternary r196 r197[0u32] r198[0u32] into r199; + ternary r196 r197[1u32] r198[1u32] into r200; + ternary r196 r197[2u32] r198[2u32] into r201; + cast r199 r200 r201 into r202 as [field; 3u32]; + hash.psd4 r202 into r203 as field; + is.eq r3[1u32].siblings[2u32] 0field into r204; + div r3[1u32].leaf_index 2u32 into r205; + rem r205 2u32 into r206; + is.eq r206 0u32 into r207; + cast 0field r203 r3[1u32].siblings[2u32] into r208 as [field; 3u32]; + cast 0field r3[1u32].siblings[2u32] r203 into r209 as [field; 3u32]; + ternary r207 r208[0u32] r209[0u32] into r210; + ternary r207 r208[1u32] r209[1u32] into r211; + ternary r207 r208[2u32] r209[2u32] into r212; + cast r210 r211 r212 into r213 as [field; 3u32]; + hash.psd4 r213 into r214 as field; + is.eq r3[1u32].siblings[3u32] 0field into r215; + div r3[1u32].leaf_index 4u32 into r216; + rem r216 2u32 into r217; + is.eq r217 0u32 into r218; + cast 0field r214 r3[1u32].siblings[3u32] into r219 as [field; 3u32]; + cast 0field r3[1u32].siblings[3u32] r214 into r220 as [field; 3u32]; + ternary r218 r219[0u32] r220[0u32] into r221; + ternary r218 r219[1u32] r220[1u32] into r222; + ternary r218 r219[2u32] r220[2u32] into r223; + cast r221 r222 r223 into r224 as [field; 3u32]; + hash.psd4 r224 into r225 as field; + is.eq r3[1u32].siblings[4u32] 0field into r226; + div r3[1u32].leaf_index 8u32 into r227; + rem r227 2u32 into r228; + is.eq r228 0u32 into r229; + cast 0field r225 r3[1u32].siblings[4u32] into r230 as [field; 3u32]; + cast 0field r3[1u32].siblings[4u32] r225 into r231 as [field; 3u32]; + ternary r229 r230[0u32] r231[0u32] into r232; + ternary r229 r230[1u32] r231[1u32] into r233; + ternary r229 r230[2u32] r231[2u32] into r234; + cast r232 r233 r234 into r235 as [field; 3u32]; + hash.psd4 r235 into r236 as field; + is.eq r3[1u32].siblings[5u32] 0field into r237; + div r3[1u32].leaf_index 16u32 into r238; + rem r238 2u32 into r239; + is.eq r239 0u32 into r240; + cast 0field r236 r3[1u32].siblings[5u32] into r241 as [field; 3u32]; + cast 0field r3[1u32].siblings[5u32] r236 into r242 as [field; 3u32]; + ternary r240 r241[0u32] r242[0u32] into r243; + ternary r240 r241[1u32] r242[1u32] into r244; + ternary r240 r241[2u32] r242[2u32] into r245; + cast r243 r244 r245 into r246 as [field; 3u32]; + hash.psd4 r246 into r247 as field; + is.eq r3[1u32].siblings[6u32] 0field into r248; + div r3[1u32].leaf_index 32u32 into r249; + rem r249 2u32 into r250; + is.eq r250 0u32 into r251; + cast 0field r247 r3[1u32].siblings[6u32] into r252 as [field; 3u32]; + cast 0field r3[1u32].siblings[6u32] r247 into r253 as [field; 3u32]; + ternary r251 r252[0u32] r253[0u32] into r254; + ternary r251 r252[1u32] r253[1u32] into r255; + ternary r251 r252[2u32] r253[2u32] into r256; + cast r254 r255 r256 into r257 as [field; 3u32]; + hash.psd4 r257 into r258 as field; + is.eq r3[1u32].siblings[7u32] 0field into r259; + div r3[1u32].leaf_index 64u32 into r260; + rem r260 2u32 into r261; + is.eq r261 0u32 into r262; + cast 0field r258 r3[1u32].siblings[7u32] into r263 as [field; 3u32]; + cast 0field r3[1u32].siblings[7u32] r258 into r264 as [field; 3u32]; + ternary r262 r263[0u32] r264[0u32] into r265; + ternary r262 r263[1u32] r264[1u32] into r266; + ternary r262 r263[2u32] r264[2u32] into r267; + cast r265 r266 r267 into r268 as [field; 3u32]; + hash.psd4 r268 into r269 as field; + is.eq r3[1u32].siblings[8u32] 0field into r270; + div r3[1u32].leaf_index 128u32 into r271; + rem r271 2u32 into r272; + is.eq r272 0u32 into r273; + cast 0field r269 r3[1u32].siblings[8u32] into r274 as [field; 3u32]; + cast 0field r3[1u32].siblings[8u32] r269 into r275 as [field; 3u32]; + ternary r273 r274[0u32] r275[0u32] into r276; + ternary r273 r274[1u32] r275[1u32] into r277; + ternary r273 r274[2u32] r275[2u32] into r278; + cast r276 r277 r278 into r279 as [field; 3u32]; + hash.psd4 r279 into r280 as field; + is.eq r3[1u32].siblings[9u32] 0field into r281; + div r3[1u32].leaf_index 256u32 into r282; + rem r282 2u32 into r283; + is.eq r283 0u32 into r284; + cast 0field r280 r3[1u32].siblings[9u32] into r285 as [field; 3u32]; + cast 0field r3[1u32].siblings[9u32] r280 into r286 as [field; 3u32]; + ternary r284 r285[0u32] r286[0u32] into r287; + ternary r284 r285[1u32] r286[1u32] into r288; + ternary r284 r285[2u32] r286[2u32] into r289; + cast r287 r288 r289 into r290 as [field; 3u32]; + hash.psd4 r290 into r291 as field; + is.eq r3[1u32].siblings[10u32] 0field into r292; + div r3[1u32].leaf_index 512u32 into r293; + rem r293 2u32 into r294; + is.eq r294 0u32 into r295; + cast 0field r291 r3[1u32].siblings[10u32] into r296 as [field; 3u32]; + cast 0field r3[1u32].siblings[10u32] r291 into r297 as [field; 3u32]; + ternary r295 r296[0u32] r297[0u32] into r298; + ternary r295 r296[1u32] r297[1u32] into r299; + ternary r295 r296[2u32] r297[2u32] into r300; + cast r298 r299 r300 into r301 as [field; 3u32]; + hash.psd4 r301 into r302 as field; + is.eq r3[1u32].siblings[11u32] 0field into r303; + div r3[1u32].leaf_index 1024u32 into r304; + rem r304 2u32 into r305; + is.eq r305 0u32 into r306; + cast 0field r302 r3[1u32].siblings[11u32] into r307 as [field; 3u32]; + cast 0field r3[1u32].siblings[11u32] r302 into r308 as [field; 3u32]; + ternary r306 r307[0u32] r308[0u32] into r309; + ternary r306 r307[1u32] r308[1u32] into r310; + ternary r306 r307[2u32] r308[2u32] into r311; + cast r309 r310 r311 into r312 as [field; 3u32]; + hash.psd4 r312 into r313 as field; + is.eq r3[1u32].siblings[12u32] 0field into r314; + div r3[1u32].leaf_index 2048u32 into r315; + rem r315 2u32 into r316; + is.eq r316 0u32 into r317; + cast 0field r313 r3[1u32].siblings[12u32] into r318 as [field; 3u32]; + cast 0field r3[1u32].siblings[12u32] r313 into r319 as [field; 3u32]; + ternary r317 r318[0u32] r319[0u32] into r320; + ternary r317 r318[1u32] r319[1u32] into r321; + ternary r317 r318[2u32] r319[2u32] into r322; + cast r320 r321 r322 into r323 as [field; 3u32]; + hash.psd4 r323 into r324 as field; + is.eq r3[1u32].siblings[13u32] 0field into r325; + div r3[1u32].leaf_index 4096u32 into r326; + rem r326 2u32 into r327; + is.eq r327 0u32 into r328; + cast 0field r324 r3[1u32].siblings[13u32] into r329 as [field; 3u32]; + cast 0field r3[1u32].siblings[13u32] r324 into r330 as [field; 3u32]; + ternary r328 r329[0u32] r330[0u32] into r331; + ternary r328 r329[1u32] r330[1u32] into r332; + ternary r328 r329[2u32] r330[2u32] into r333; + cast r331 r332 r333 into r334 as [field; 3u32]; + hash.psd4 r334 into r335 as field; + is.eq r3[1u32].siblings[14u32] 0field into r336; + div r3[1u32].leaf_index 8192u32 into r337; + rem r337 2u32 into r338; + is.eq r338 0u32 into r339; + cast 0field r335 r3[1u32].siblings[14u32] into r340 as [field; 3u32]; + cast 0field r3[1u32].siblings[14u32] r335 into r341 as [field; 3u32]; + ternary r339 r340[0u32] r341[0u32] into r342; + ternary r339 r340[1u32] r341[1u32] into r343; + ternary r339 r340[2u32] r341[2u32] into r344; + cast r342 r343 r344 into r345 as [field; 3u32]; + hash.psd4 r345 into r346 as field; + is.eq r3[1u32].siblings[15u32] 0field into r347; + div r3[1u32].leaf_index 16384u32 into r348; + rem r348 2u32 into r349; + is.eq r349 0u32 into r350; + cast 0field r346 r3[1u32].siblings[15u32] into r351 as [field; 3u32]; + cast 0field r3[1u32].siblings[15u32] r346 into r352 as [field; 3u32]; + ternary r350 r351[0u32] r352[0u32] into r353; + ternary r350 r351[1u32] r352[1u32] into r354; + ternary r350 r351[2u32] r352[2u32] into r355; + cast r353 r354 r355 into r356 as [field; 3u32]; + hash.psd4 r356 into r357 as field; + ternary r347 r346 r357 into r358; + ternary r347 14u32 15u32 into r359; + ternary r336 r335 r358 into r360; + ternary r336 13u32 r359 into r361; + ternary r325 r324 r360 into r362; + ternary r325 12u32 r361 into r363; + ternary r314 r313 r362 into r364; + ternary r314 11u32 r363 into r365; + ternary r303 r302 r364 into r366; + ternary r303 10u32 r365 into r367; + ternary r292 r291 r366 into r368; + ternary r292 9u32 r367 into r369; + ternary r281 r280 r368 into r370; + ternary r281 8u32 r369 into r371; + ternary r270 r269 r370 into r372; + ternary r270 7u32 r371 into r373; + ternary r259 r258 r372 into r374; + ternary r259 6u32 r373 into r375; + ternary r248 r247 r374 into r376; + ternary r248 5u32 r375 into r377; + ternary r237 r236 r376 into r378; + ternary r237 4u32 r377 into r379; + ternary r226 r225 r378 into r380; + ternary r226 3u32 r379 into r381; + ternary r215 r214 r380 into r382; + ternary r215 2u32 r381 into r383; + ternary r204 r203 r382 into r384; + ternary r204 1u32 r383 into r385; + assert.eq r193 r384; + assert.eq r194 r385; + cast r2.owner into r386 as field; + is.eq r3[0u32].leaf_index r3[1u32].leaf_index into r387; + is.eq r3[0u32].leaf_index 0u32 into r388; + lt r386 r3[0u32].siblings[0u32] into r389; + and r387 r388 into r390; + not r390 into r391; + or r389 r391 into r392; + assert.eq r392 true; + not r388 into r393; + pow 2u32 r194 into r394; + sub r394 1u32 into r395; + and r387 r393 into r396; + not r396 into r397; + is.eq r3[0u32].leaf_index r395 into r398; + or r398 r397 into r399; + assert.eq r399 true; + gt r386 r3[0u32].siblings[0u32] into r400; + or r400 r397 into r401; + assert.eq r401 true; + not r387 into r402; + gt r386 r3[0u32].siblings[0u32] into r403; + not r402 into r404; + or r403 r404 into r405; + assert.eq r405 true; + lt r386 r3[1u32].siblings[0u32] into r406; + or r406 r404 into r407; + assert.eq r407 true; + lte r3[1u32].leaf_index r395 into r408; + or r408 r404 into r409; + assert.eq r409 true; + add r3[0u32].leaf_index 1u32 into r410; + is.eq r410 r3[1u32].leaf_index into r411; + or r411 r404 into r412; + assert.eq r412 true; + sub r2.amount r1 into r413; + cast r2.owner r413 into r414 as Token.record; + cast r0 r1 into r415 as Token.record; + cast aleo1mnldqsfrwayzfep3t9zusu4y7yknsdhfwx76v5pajla35mrqn5xsvvurhy r1 r2.owner r0 into r416 as ComplianceRecord.record; + async transfer_private r193 into r417; + output r416 as ComplianceRecord.record; + output r414 as Token.record; + output r415 as Token.record; + output r417 as test_usdcx_stablecoin.aleo/transfer_private.future; + +finalize transfer_private: + input r0 as field.public; + get pause[true] into r1; + assert.eq r1 false; + get test_usdcx_freezelist.aleo/freeze_list_root[1u8] into r2; + get test_usdcx_freezelist.aleo/block_height_window[true] into r3; + is.neq r2 r0 into r4; + branch.eq r4 false to end_then_0_4; + get test_usdcx_freezelist.aleo/freeze_list_root[2u8] into r5; + assert.eq r0 r5; + get test_usdcx_freezelist.aleo/root_updated_height[true] into r6; + add r6 r3 into r7; + gt r7 block.height into r8; + assert.eq r8 true; + branch.eq true true to end_otherwise_0_5; + position end_then_0_4; + position end_otherwise_0_5; + +function transfer_private_to_public: + input r0 as address.public; + input r1 as u128.public; + input r2 as Token.record; + input r3 as [MerkleProof; 2u32].private; + rem r3[0u32].leaf_index 2u32 into r4; + is.eq r4 0u32 into r5; + cast 1field r3[0u32].siblings[0u32] r3[0u32].siblings[1u32] into r6 as [field; 3u32]; + cast 1field r3[0u32].siblings[1u32] r3[0u32].siblings[0u32] into r7 as [field; 3u32]; + ternary r5 r6[0u32] r7[0u32] into r8; + ternary r5 r6[1u32] r7[1u32] into r9; + ternary r5 r6[2u32] r7[2u32] into r10; + cast r8 r9 r10 into r11 as [field; 3u32]; + hash.psd4 r11 into r12 as field; + is.eq r3[0u32].siblings[2u32] 0field into r13; + div r3[0u32].leaf_index 2u32 into r14; + rem r14 2u32 into r15; + is.eq r15 0u32 into r16; + cast 0field r12 r3[0u32].siblings[2u32] into r17 as [field; 3u32]; + cast 0field r3[0u32].siblings[2u32] r12 into r18 as [field; 3u32]; + ternary r16 r17[0u32] r18[0u32] into r19; + ternary r16 r17[1u32] r18[1u32] into r20; + ternary r16 r17[2u32] r18[2u32] into r21; + cast r19 r20 r21 into r22 as [field; 3u32]; + hash.psd4 r22 into r23 as field; + is.eq r3[0u32].siblings[3u32] 0field into r24; + div r3[0u32].leaf_index 4u32 into r25; + rem r25 2u32 into r26; + is.eq r26 0u32 into r27; + cast 0field r23 r3[0u32].siblings[3u32] into r28 as [field; 3u32]; + cast 0field r3[0u32].siblings[3u32] r23 into r29 as [field; 3u32]; + ternary r27 r28[0u32] r29[0u32] into r30; + ternary r27 r28[1u32] r29[1u32] into r31; + ternary r27 r28[2u32] r29[2u32] into r32; + cast r30 r31 r32 into r33 as [field; 3u32]; + hash.psd4 r33 into r34 as field; + is.eq r3[0u32].siblings[4u32] 0field into r35; + div r3[0u32].leaf_index 8u32 into r36; + rem r36 2u32 into r37; + is.eq r37 0u32 into r38; + cast 0field r34 r3[0u32].siblings[4u32] into r39 as [field; 3u32]; + cast 0field r3[0u32].siblings[4u32] r34 into r40 as [field; 3u32]; + ternary r38 r39[0u32] r40[0u32] into r41; + ternary r38 r39[1u32] r40[1u32] into r42; + ternary r38 r39[2u32] r40[2u32] into r43; + cast r41 r42 r43 into r44 as [field; 3u32]; + hash.psd4 r44 into r45 as field; + is.eq r3[0u32].siblings[5u32] 0field into r46; + div r3[0u32].leaf_index 16u32 into r47; + rem r47 2u32 into r48; + is.eq r48 0u32 into r49; + cast 0field r45 r3[0u32].siblings[5u32] into r50 as [field; 3u32]; + cast 0field r3[0u32].siblings[5u32] r45 into r51 as [field; 3u32]; + ternary r49 r50[0u32] r51[0u32] into r52; + ternary r49 r50[1u32] r51[1u32] into r53; + ternary r49 r50[2u32] r51[2u32] into r54; + cast r52 r53 r54 into r55 as [field; 3u32]; + hash.psd4 r55 into r56 as field; + is.eq r3[0u32].siblings[6u32] 0field into r57; + div r3[0u32].leaf_index 32u32 into r58; + rem r58 2u32 into r59; + is.eq r59 0u32 into r60; + cast 0field r56 r3[0u32].siblings[6u32] into r61 as [field; 3u32]; + cast 0field r3[0u32].siblings[6u32] r56 into r62 as [field; 3u32]; + ternary r60 r61[0u32] r62[0u32] into r63; + ternary r60 r61[1u32] r62[1u32] into r64; + ternary r60 r61[2u32] r62[2u32] into r65; + cast r63 r64 r65 into r66 as [field; 3u32]; + hash.psd4 r66 into r67 as field; + is.eq r3[0u32].siblings[7u32] 0field into r68; + div r3[0u32].leaf_index 64u32 into r69; + rem r69 2u32 into r70; + is.eq r70 0u32 into r71; + cast 0field r67 r3[0u32].siblings[7u32] into r72 as [field; 3u32]; + cast 0field r3[0u32].siblings[7u32] r67 into r73 as [field; 3u32]; + ternary r71 r72[0u32] r73[0u32] into r74; + ternary r71 r72[1u32] r73[1u32] into r75; + ternary r71 r72[2u32] r73[2u32] into r76; + cast r74 r75 r76 into r77 as [field; 3u32]; + hash.psd4 r77 into r78 as field; + is.eq r3[0u32].siblings[8u32] 0field into r79; + div r3[0u32].leaf_index 128u32 into r80; + rem r80 2u32 into r81; + is.eq r81 0u32 into r82; + cast 0field r78 r3[0u32].siblings[8u32] into r83 as [field; 3u32]; + cast 0field r3[0u32].siblings[8u32] r78 into r84 as [field; 3u32]; + ternary r82 r83[0u32] r84[0u32] into r85; + ternary r82 r83[1u32] r84[1u32] into r86; + ternary r82 r83[2u32] r84[2u32] into r87; + cast r85 r86 r87 into r88 as [field; 3u32]; + hash.psd4 r88 into r89 as field; + is.eq r3[0u32].siblings[9u32] 0field into r90; + div r3[0u32].leaf_index 256u32 into r91; + rem r91 2u32 into r92; + is.eq r92 0u32 into r93; + cast 0field r89 r3[0u32].siblings[9u32] into r94 as [field; 3u32]; + cast 0field r3[0u32].siblings[9u32] r89 into r95 as [field; 3u32]; + ternary r93 r94[0u32] r95[0u32] into r96; + ternary r93 r94[1u32] r95[1u32] into r97; + ternary r93 r94[2u32] r95[2u32] into r98; + cast r96 r97 r98 into r99 as [field; 3u32]; + hash.psd4 r99 into r100 as field; + is.eq r3[0u32].siblings[10u32] 0field into r101; + div r3[0u32].leaf_index 512u32 into r102; + rem r102 2u32 into r103; + is.eq r103 0u32 into r104; + cast 0field r100 r3[0u32].siblings[10u32] into r105 as [field; 3u32]; + cast 0field r3[0u32].siblings[10u32] r100 into r106 as [field; 3u32]; + ternary r104 r105[0u32] r106[0u32] into r107; + ternary r104 r105[1u32] r106[1u32] into r108; + ternary r104 r105[2u32] r106[2u32] into r109; + cast r107 r108 r109 into r110 as [field; 3u32]; + hash.psd4 r110 into r111 as field; + is.eq r3[0u32].siblings[11u32] 0field into r112; + div r3[0u32].leaf_index 1024u32 into r113; + rem r113 2u32 into r114; + is.eq r114 0u32 into r115; + cast 0field r111 r3[0u32].siblings[11u32] into r116 as [field; 3u32]; + cast 0field r3[0u32].siblings[11u32] r111 into r117 as [field; 3u32]; + ternary r115 r116[0u32] r117[0u32] into r118; + ternary r115 r116[1u32] r117[1u32] into r119; + ternary r115 r116[2u32] r117[2u32] into r120; + cast r118 r119 r120 into r121 as [field; 3u32]; + hash.psd4 r121 into r122 as field; + is.eq r3[0u32].siblings[12u32] 0field into r123; + div r3[0u32].leaf_index 2048u32 into r124; + rem r124 2u32 into r125; + is.eq r125 0u32 into r126; + cast 0field r122 r3[0u32].siblings[12u32] into r127 as [field; 3u32]; + cast 0field r3[0u32].siblings[12u32] r122 into r128 as [field; 3u32]; + ternary r126 r127[0u32] r128[0u32] into r129; + ternary r126 r127[1u32] r128[1u32] into r130; + ternary r126 r127[2u32] r128[2u32] into r131; + cast r129 r130 r131 into r132 as [field; 3u32]; + hash.psd4 r132 into r133 as field; + is.eq r3[0u32].siblings[13u32] 0field into r134; + div r3[0u32].leaf_index 4096u32 into r135; + rem r135 2u32 into r136; + is.eq r136 0u32 into r137; + cast 0field r133 r3[0u32].siblings[13u32] into r138 as [field; 3u32]; + cast 0field r3[0u32].siblings[13u32] r133 into r139 as [field; 3u32]; + ternary r137 r138[0u32] r139[0u32] into r140; + ternary r137 r138[1u32] r139[1u32] into r141; + ternary r137 r138[2u32] r139[2u32] into r142; + cast r140 r141 r142 into r143 as [field; 3u32]; + hash.psd4 r143 into r144 as field; + is.eq r3[0u32].siblings[14u32] 0field into r145; + div r3[0u32].leaf_index 8192u32 into r146; + rem r146 2u32 into r147; + is.eq r147 0u32 into r148; + cast 0field r144 r3[0u32].siblings[14u32] into r149 as [field; 3u32]; + cast 0field r3[0u32].siblings[14u32] r144 into r150 as [field; 3u32]; + ternary r148 r149[0u32] r150[0u32] into r151; + ternary r148 r149[1u32] r150[1u32] into r152; + ternary r148 r149[2u32] r150[2u32] into r153; + cast r151 r152 r153 into r154 as [field; 3u32]; + hash.psd4 r154 into r155 as field; + is.eq r3[0u32].siblings[15u32] 0field into r156; + div r3[0u32].leaf_index 16384u32 into r157; + rem r157 2u32 into r158; + is.eq r158 0u32 into r159; + cast 0field r155 r3[0u32].siblings[15u32] into r160 as [field; 3u32]; + cast 0field r3[0u32].siblings[15u32] r155 into r161 as [field; 3u32]; + ternary r159 r160[0u32] r161[0u32] into r162; + ternary r159 r160[1u32] r161[1u32] into r163; + ternary r159 r160[2u32] r161[2u32] into r164; + cast r162 r163 r164 into r165 as [field; 3u32]; + hash.psd4 r165 into r166 as field; + ternary r156 r155 r166 into r167; + ternary r156 14u32 15u32 into r168; + ternary r145 r144 r167 into r169; + ternary r145 13u32 r168 into r170; + ternary r134 r133 r169 into r171; + ternary r134 12u32 r170 into r172; + ternary r123 r122 r171 into r173; + ternary r123 11u32 r172 into r174; + ternary r112 r111 r173 into r175; + ternary r112 10u32 r174 into r176; + ternary r101 r100 r175 into r177; + ternary r101 9u32 r176 into r178; + ternary r90 r89 r177 into r179; + ternary r90 8u32 r178 into r180; + ternary r79 r78 r179 into r181; + ternary r79 7u32 r180 into r182; + ternary r68 r67 r181 into r183; + ternary r68 6u32 r182 into r184; + ternary r57 r56 r183 into r185; + ternary r57 5u32 r184 into r186; + ternary r46 r45 r185 into r187; + ternary r46 4u32 r186 into r188; + ternary r35 r34 r187 into r189; + ternary r35 3u32 r188 into r190; + ternary r24 r23 r189 into r191; + ternary r24 2u32 r190 into r192; + ternary r13 r12 r191 into r193; + ternary r13 1u32 r192 into r194; + rem r3[1u32].leaf_index 2u32 into r195; + is.eq r195 0u32 into r196; + cast 1field r3[1u32].siblings[0u32] r3[1u32].siblings[1u32] into r197 as [field; 3u32]; + cast 1field r3[1u32].siblings[1u32] r3[1u32].siblings[0u32] into r198 as [field; 3u32]; + ternary r196 r197[0u32] r198[0u32] into r199; + ternary r196 r197[1u32] r198[1u32] into r200; + ternary r196 r197[2u32] r198[2u32] into r201; + cast r199 r200 r201 into r202 as [field; 3u32]; + hash.psd4 r202 into r203 as field; + is.eq r3[1u32].siblings[2u32] 0field into r204; + div r3[1u32].leaf_index 2u32 into r205; + rem r205 2u32 into r206; + is.eq r206 0u32 into r207; + cast 0field r203 r3[1u32].siblings[2u32] into r208 as [field; 3u32]; + cast 0field r3[1u32].siblings[2u32] r203 into r209 as [field; 3u32]; + ternary r207 r208[0u32] r209[0u32] into r210; + ternary r207 r208[1u32] r209[1u32] into r211; + ternary r207 r208[2u32] r209[2u32] into r212; + cast r210 r211 r212 into r213 as [field; 3u32]; + hash.psd4 r213 into r214 as field; + is.eq r3[1u32].siblings[3u32] 0field into r215; + div r3[1u32].leaf_index 4u32 into r216; + rem r216 2u32 into r217; + is.eq r217 0u32 into r218; + cast 0field r214 r3[1u32].siblings[3u32] into r219 as [field; 3u32]; + cast 0field r3[1u32].siblings[3u32] r214 into r220 as [field; 3u32]; + ternary r218 r219[0u32] r220[0u32] into r221; + ternary r218 r219[1u32] r220[1u32] into r222; + ternary r218 r219[2u32] r220[2u32] into r223; + cast r221 r222 r223 into r224 as [field; 3u32]; + hash.psd4 r224 into r225 as field; + is.eq r3[1u32].siblings[4u32] 0field into r226; + div r3[1u32].leaf_index 8u32 into r227; + rem r227 2u32 into r228; + is.eq r228 0u32 into r229; + cast 0field r225 r3[1u32].siblings[4u32] into r230 as [field; 3u32]; + cast 0field r3[1u32].siblings[4u32] r225 into r231 as [field; 3u32]; + ternary r229 r230[0u32] r231[0u32] into r232; + ternary r229 r230[1u32] r231[1u32] into r233; + ternary r229 r230[2u32] r231[2u32] into r234; + cast r232 r233 r234 into r235 as [field; 3u32]; + hash.psd4 r235 into r236 as field; + is.eq r3[1u32].siblings[5u32] 0field into r237; + div r3[1u32].leaf_index 16u32 into r238; + rem r238 2u32 into r239; + is.eq r239 0u32 into r240; + cast 0field r236 r3[1u32].siblings[5u32] into r241 as [field; 3u32]; + cast 0field r3[1u32].siblings[5u32] r236 into r242 as [field; 3u32]; + ternary r240 r241[0u32] r242[0u32] into r243; + ternary r240 r241[1u32] r242[1u32] into r244; + ternary r240 r241[2u32] r242[2u32] into r245; + cast r243 r244 r245 into r246 as [field; 3u32]; + hash.psd4 r246 into r247 as field; + is.eq r3[1u32].siblings[6u32] 0field into r248; + div r3[1u32].leaf_index 32u32 into r249; + rem r249 2u32 into r250; + is.eq r250 0u32 into r251; + cast 0field r247 r3[1u32].siblings[6u32] into r252 as [field; 3u32]; + cast 0field r3[1u32].siblings[6u32] r247 into r253 as [field; 3u32]; + ternary r251 r252[0u32] r253[0u32] into r254; + ternary r251 r252[1u32] r253[1u32] into r255; + ternary r251 r252[2u32] r253[2u32] into r256; + cast r254 r255 r256 into r257 as [field; 3u32]; + hash.psd4 r257 into r258 as field; + is.eq r3[1u32].siblings[7u32] 0field into r259; + div r3[1u32].leaf_index 64u32 into r260; + rem r260 2u32 into r261; + is.eq r261 0u32 into r262; + cast 0field r258 r3[1u32].siblings[7u32] into r263 as [field; 3u32]; + cast 0field r3[1u32].siblings[7u32] r258 into r264 as [field; 3u32]; + ternary r262 r263[0u32] r264[0u32] into r265; + ternary r262 r263[1u32] r264[1u32] into r266; + ternary r262 r263[2u32] r264[2u32] into r267; + cast r265 r266 r267 into r268 as [field; 3u32]; + hash.psd4 r268 into r269 as field; + is.eq r3[1u32].siblings[8u32] 0field into r270; + div r3[1u32].leaf_index 128u32 into r271; + rem r271 2u32 into r272; + is.eq r272 0u32 into r273; + cast 0field r269 r3[1u32].siblings[8u32] into r274 as [field; 3u32]; + cast 0field r3[1u32].siblings[8u32] r269 into r275 as [field; 3u32]; + ternary r273 r274[0u32] r275[0u32] into r276; + ternary r273 r274[1u32] r275[1u32] into r277; + ternary r273 r274[2u32] r275[2u32] into r278; + cast r276 r277 r278 into r279 as [field; 3u32]; + hash.psd4 r279 into r280 as field; + is.eq r3[1u32].siblings[9u32] 0field into r281; + div r3[1u32].leaf_index 256u32 into r282; + rem r282 2u32 into r283; + is.eq r283 0u32 into r284; + cast 0field r280 r3[1u32].siblings[9u32] into r285 as [field; 3u32]; + cast 0field r3[1u32].siblings[9u32] r280 into r286 as [field; 3u32]; + ternary r284 r285[0u32] r286[0u32] into r287; + ternary r284 r285[1u32] r286[1u32] into r288; + ternary r284 r285[2u32] r286[2u32] into r289; + cast r287 r288 r289 into r290 as [field; 3u32]; + hash.psd4 r290 into r291 as field; + is.eq r3[1u32].siblings[10u32] 0field into r292; + div r3[1u32].leaf_index 512u32 into r293; + rem r293 2u32 into r294; + is.eq r294 0u32 into r295; + cast 0field r291 r3[1u32].siblings[10u32] into r296 as [field; 3u32]; + cast 0field r3[1u32].siblings[10u32] r291 into r297 as [field; 3u32]; + ternary r295 r296[0u32] r297[0u32] into r298; + ternary r295 r296[1u32] r297[1u32] into r299; + ternary r295 r296[2u32] r297[2u32] into r300; + cast r298 r299 r300 into r301 as [field; 3u32]; + hash.psd4 r301 into r302 as field; + is.eq r3[1u32].siblings[11u32] 0field into r303; + div r3[1u32].leaf_index 1024u32 into r304; + rem r304 2u32 into r305; + is.eq r305 0u32 into r306; + cast 0field r302 r3[1u32].siblings[11u32] into r307 as [field; 3u32]; + cast 0field r3[1u32].siblings[11u32] r302 into r308 as [field; 3u32]; + ternary r306 r307[0u32] r308[0u32] into r309; + ternary r306 r307[1u32] r308[1u32] into r310; + ternary r306 r307[2u32] r308[2u32] into r311; + cast r309 r310 r311 into r312 as [field; 3u32]; + hash.psd4 r312 into r313 as field; + is.eq r3[1u32].siblings[12u32] 0field into r314; + div r3[1u32].leaf_index 2048u32 into r315; + rem r315 2u32 into r316; + is.eq r316 0u32 into r317; + cast 0field r313 r3[1u32].siblings[12u32] into r318 as [field; 3u32]; + cast 0field r3[1u32].siblings[12u32] r313 into r319 as [field; 3u32]; + ternary r317 r318[0u32] r319[0u32] into r320; + ternary r317 r318[1u32] r319[1u32] into r321; + ternary r317 r318[2u32] r319[2u32] into r322; + cast r320 r321 r322 into r323 as [field; 3u32]; + hash.psd4 r323 into r324 as field; + is.eq r3[1u32].siblings[13u32] 0field into r325; + div r3[1u32].leaf_index 4096u32 into r326; + rem r326 2u32 into r327; + is.eq r327 0u32 into r328; + cast 0field r324 r3[1u32].siblings[13u32] into r329 as [field; 3u32]; + cast 0field r3[1u32].siblings[13u32] r324 into r330 as [field; 3u32]; + ternary r328 r329[0u32] r330[0u32] into r331; + ternary r328 r329[1u32] r330[1u32] into r332; + ternary r328 r329[2u32] r330[2u32] into r333; + cast r331 r332 r333 into r334 as [field; 3u32]; + hash.psd4 r334 into r335 as field; + is.eq r3[1u32].siblings[14u32] 0field into r336; + div r3[1u32].leaf_index 8192u32 into r337; + rem r337 2u32 into r338; + is.eq r338 0u32 into r339; + cast 0field r335 r3[1u32].siblings[14u32] into r340 as [field; 3u32]; + cast 0field r3[1u32].siblings[14u32] r335 into r341 as [field; 3u32]; + ternary r339 r340[0u32] r341[0u32] into r342; + ternary r339 r340[1u32] r341[1u32] into r343; + ternary r339 r340[2u32] r341[2u32] into r344; + cast r342 r343 r344 into r345 as [field; 3u32]; + hash.psd4 r345 into r346 as field; + is.eq r3[1u32].siblings[15u32] 0field into r347; + div r3[1u32].leaf_index 16384u32 into r348; + rem r348 2u32 into r349; + is.eq r349 0u32 into r350; + cast 0field r346 r3[1u32].siblings[15u32] into r351 as [field; 3u32]; + cast 0field r3[1u32].siblings[15u32] r346 into r352 as [field; 3u32]; + ternary r350 r351[0u32] r352[0u32] into r353; + ternary r350 r351[1u32] r352[1u32] into r354; + ternary r350 r351[2u32] r352[2u32] into r355; + cast r353 r354 r355 into r356 as [field; 3u32]; + hash.psd4 r356 into r357 as field; + ternary r347 r346 r357 into r358; + ternary r347 14u32 15u32 into r359; + ternary r336 r335 r358 into r360; + ternary r336 13u32 r359 into r361; + ternary r325 r324 r360 into r362; + ternary r325 12u32 r361 into r363; + ternary r314 r313 r362 into r364; + ternary r314 11u32 r363 into r365; + ternary r303 r302 r364 into r366; + ternary r303 10u32 r365 into r367; + ternary r292 r291 r366 into r368; + ternary r292 9u32 r367 into r369; + ternary r281 r280 r368 into r370; + ternary r281 8u32 r369 into r371; + ternary r270 r269 r370 into r372; + ternary r270 7u32 r371 into r373; + ternary r259 r258 r372 into r374; + ternary r259 6u32 r373 into r375; + ternary r248 r247 r374 into r376; + ternary r248 5u32 r375 into r377; + ternary r237 r236 r376 into r378; + ternary r237 4u32 r377 into r379; + ternary r226 r225 r378 into r380; + ternary r226 3u32 r379 into r381; + ternary r215 r214 r380 into r382; + ternary r215 2u32 r381 into r383; + ternary r204 r203 r382 into r384; + ternary r204 1u32 r383 into r385; + assert.eq r193 r384; + assert.eq r194 r385; + cast r2.owner into r386 as field; + is.eq r3[0u32].leaf_index r3[1u32].leaf_index into r387; + is.eq r3[0u32].leaf_index 0u32 into r388; + lt r386 r3[0u32].siblings[0u32] into r389; + and r387 r388 into r390; + not r390 into r391; + or r389 r391 into r392; + assert.eq r392 true; + not r388 into r393; + pow 2u32 r194 into r394; + sub r394 1u32 into r395; + and r387 r393 into r396; + not r396 into r397; + is.eq r3[0u32].leaf_index r395 into r398; + or r398 r397 into r399; + assert.eq r399 true; + gt r386 r3[0u32].siblings[0u32] into r400; + or r400 r397 into r401; + assert.eq r401 true; + not r387 into r402; + gt r386 r3[0u32].siblings[0u32] into r403; + not r402 into r404; + or r403 r404 into r405; + assert.eq r405 true; + lt r386 r3[1u32].siblings[0u32] into r406; + or r406 r404 into r407; + assert.eq r407 true; + lte r3[1u32].leaf_index r395 into r408; + or r408 r404 into r409; + assert.eq r409 true; + add r3[0u32].leaf_index 1u32 into r410; + is.eq r410 r3[1u32].leaf_index into r411; + or r411 r404 into r412; + assert.eq r412 true; + sub r2.amount r1 into r413; + cast r2.owner r413 into r414 as Token.record; + cast aleo1mnldqsfrwayzfep3t9zusu4y7yknsdhfwx76v5pajla35mrqn5xsvvurhy r1 r2.owner r0 into r415 as ComplianceRecord.record; + async transfer_private_to_public r193 r0 r1 into r416; + output r415 as ComplianceRecord.record; + output r414 as Token.record; + output r416 as test_usdcx_stablecoin.aleo/transfer_private_to_public.future; + +finalize transfer_private_to_public: + input r0 as field.public; + input r1 as address.public; + input r2 as u128.public; + get pause[true] into r3; + assert.eq r3 false; + get test_usdcx_freezelist.aleo/freeze_list_root[1u8] into r4; + get test_usdcx_freezelist.aleo/block_height_window[true] into r5; + is.neq r4 r0 into r6; + branch.eq r6 false to end_then_0_6; + get test_usdcx_freezelist.aleo/freeze_list_root[2u8] into r7; + assert.eq r0 r7; + get test_usdcx_freezelist.aleo/root_updated_height[true] into r8; + add r8 r5 into r9; + gt r9 block.height into r10; + assert.eq r10 true; + branch.eq true true to end_otherwise_0_7; + position end_then_0_6; + position end_otherwise_0_7; + get.or_use test_usdcx_freezelist.aleo/freeze_list[r1] false into r11; + assert.eq r11 false; + get.or_use balances[r1] 0u128 into r12; + add r12 r2 into r13; + set r13 into balances[r1]; + +function set_pause_status: + input r0 as boolean.private; + async set_pause_status r0 self.caller into r1; + output r1 as test_usdcx_stablecoin.aleo/set_pause_status.future; + +finalize set_pause_status: + input r0 as boolean.public; + input r1 as address.public; + get address_to_role[r1] into r2; + and r2 4u16 into r3; + is.eq r3 4u16 into r4; + assert.eq r4 true; + set r0 into pause[true]; + +function join: + input r0 as Token.record; + input r1 as Token.record; + add r0.amount r1.amount into r2; + cast r0.owner r2 into r3 as Token.record; + output r3 as Token.record; + +function split: + input r0 as Token.record; + input r1 as u128.private; + cast r0.owner r1 into r2 as Token.record; + sub r0.amount r1 into r3; + cast r0.owner r3 into r4 as Token.record; + output r2 as Token.record; + output r4 as Token.record; + +function transfer_private_with_creds: + input r0 as address.private; + input r1 as u128.private; + input r2 as Token.record; + input r3 as Credentials.record; + sub r2.amount r1 into r4; + cast r2.owner r4 into r5 as Token.record; + cast r0 r1 into r6 as Token.record; + cast aleo1mnldqsfrwayzfep3t9zusu4y7yknsdhfwx76v5pajla35mrqn5xsvvurhy r1 r2.owner r0 into r7 as ComplianceRecord.record; + cast r3.owner r3.freeze_list_root into r8 as Credentials.record; + async transfer_private_with_creds r3.freeze_list_root into r9; + output r7 as ComplianceRecord.record; + output r5 as Token.record; + output r6 as Token.record; + output r8 as Credentials.record; + output r9 as test_usdcx_stablecoin.aleo/transfer_private_with_creds.future; + +finalize transfer_private_with_creds: + input r0 as field.public; + get pause[true] into r1; + assert.eq r1 false; + get test_usdcx_freezelist.aleo/freeze_list_root[1u8] into r2; + get test_usdcx_freezelist.aleo/block_height_window[true] into r3; + is.neq r2 r0 into r4; + branch.eq r4 false to end_then_0_8; + get test_usdcx_freezelist.aleo/freeze_list_root[2u8] into r5; + assert.eq r0 r5; + get test_usdcx_freezelist.aleo/root_updated_height[true] into r6; + add r6 r3 into r7; + gt r7 block.height into r8; + assert.eq r8 true; + branch.eq true true to end_otherwise_0_9; + position end_then_0_8; + position end_otherwise_0_9; + +function update_token_info: + input r0 as u128.public; + input r1 as u128.public; + input r2 as u128.public; + async update_token_info r0 r1 r2 self.caller into r3; + output r3 as test_usdcx_stablecoin.aleo/update_token_info.future; + +finalize update_token_info: + input r0 as u128.public; + input r1 as u128.public; + input r2 as u128.public; + input r3 as address.public; + get address_to_role[r3] into r4; + is.eq r4 8u16 into r5; + assert.eq r5 true; + get token_info[true] into r6; + cast r0 r1 r6.decimals r6.supply r2 into r7 as TokenInfo; + set r7 into token_info[true]; + +constructor: + is.eq edition 0u16 into r0; + branch.eq r0 false to end_then_0_10; + branch.eq true true to end_otherwise_0_11; + position end_then_0_10; + cast checksum edition into r1 as ChecksumEdition; + hash.bhp256 r1 into r2 as field; + cast test_usdcx_stablecoin.aleo r2 into r3 as WalletSigningOpId; + hash.bhp256 r3 into r4 as field; + contains test_usdcx_multisig_core.aleo/completed_signing_ops[r4] into r5; + assert.eq r5 true; + position end_otherwise_0_11; diff --git a/examples/private-mint/private-mint-wrapper/build/main.aleo b/examples/private-mint/private-mint-wrapper/build/main.aleo new file mode 100644 index 00000000..07591181 --- /dev/null +++ b/examples/private-mint/private-mint-wrapper/build/main.aleo @@ -0,0 +1,163 @@ +import merkle_tree.aleo; +import test_usdcx_multisig_core.aleo; +import test_usdcx_freezelist.aleo; +import test_usdcx_stablecoin.aleo; +import test_usdcx_bridge.aleo; +program bridge_demo_v1.aleo; + +closure get_amount_from_bytes: + input r0 as [u8; 16u32]; + cast r0[0u32] into r1 as u128; + mul r1 1329227995784915872903807060280344576u128 into r2; + add 0u128 r2 into r3; + cast r0[1u32] into r4 as u128; + mul r4 5192296858534827628530496329220096u128 into r5; + add r3 r5 into r6; + cast r0[2u32] into r7 as u128; + mul r7 20282409603651670423947251286016u128 into r8; + add r6 r8 into r9; + cast r0[3u32] into r10 as u128; + mul r10 79228162514264337593543950336u128 into r11; + add r9 r11 into r12; + cast r0[4u32] into r13 as u128; + mul r13 309485009821345068724781056u128 into r14; + add r12 r14 into r15; + cast r0[5u32] into r16 as u128; + mul r16 1208925819614629174706176u128 into r17; + add r15 r17 into r18; + cast r0[6u32] into r19 as u128; + mul r19 4722366482869645213696u128 into r20; + add r18 r20 into r21; + cast r0[7u32] into r22 as u128; + mul r22 18446744073709551616u128 into r23; + add r21 r23 into r24; + cast r0[8u32] into r25 as u128; + mul r25 72057594037927936u128 into r26; + add r24 r26 into r27; + cast r0[9u32] into r28 as u128; + mul r28 281474976710656u128 into r29; + add r27 r29 into r30; + cast r0[10u32] into r31 as u128; + mul r31 1099511627776u128 into r32; + add r30 r32 into r33; + cast r0[11u32] into r34 as u128; + mul r34 4294967296u128 into r35; + add r33 r35 into r36; + cast r0[12u32] into r37 as u128; + mul r37 16777216u128 into r38; + add r36 r38 into r39; + cast r0[13u32] into r40 as u128; + mul r40 65536u128 into r41; + add r39 r41 into r42; + cast r0[14u32] into r43 as u128; + mul r43 256u128 into r44; + add r42 r44 into r45; + cast r0[15u32] into r46 as u128; + mul r46 1u128 into r47; + add r45 r47 into r48; + output r48 as u128; + +function mint_and_send_private: + input r0 as [u8; 240u32].private; + input r1 as [u8; 65u32].private; + input r2 as [u8; 32u32].private; + input r3 as [u8; 32u32].private; + cast r0[24u32] r0[25u32] r0[26u32] r0[27u32] r0[28u32] r0[29u32] r0[30u32] r0[31u32] r0[32u32] r0[33u32] r0[34u32] r0[35u32] r0[36u32] r0[37u32] r0[38u32] r0[39u32] into r4 as [u8; 16u32]; + call get_amount_from_bytes r4 into r5; + call test_usdcx_bridge.aleo/mint_public r0 r1 r2 r3 into r6; + call test_usdcx_stablecoin.aleo/transfer_public_to_private self.signer r5 into r7 r8 r9; + async mint_and_send_private r6 r9 into r10; + output r8 as test_usdcx_stablecoin.aleo/Token.record; + output r10 as bridge_demo_v1.aleo/mint_and_send_private.future; + +finalize mint_and_send_private: + input r0 as test_usdcx_bridge.aleo/mint_public.future; + input r1 as test_usdcx_stablecoin.aleo/transfer_public_to_private.future; + await r0; + await r1; + +function mint_and_send_public: + input r0 as [u8; 240u32].private; + input r1 as [u8; 65u32].private; + input r2 as [u8; 32u32].private; + input r3 as [u8; 32u32].private; + assert.eq self.caller aleo1rhgdu77hgyqd3xjj8ucu3jj9r2krwz6mnzyd80gncr5fxcwlh5rsvzp9px; + cast r0[24u32] r0[25u32] r0[26u32] r0[27u32] r0[28u32] r0[29u32] r0[30u32] r0[31u32] r0[32u32] r0[33u32] r0[34u32] r0[35u32] r0[36u32] r0[37u32] r0[38u32] r0[39u32] into r4 as [u8; 16u32]; + call get_amount_from_bytes r4 into r5; + call test_usdcx_bridge.aleo/mint_public r0 r1 r2 r3 into r6; + call test_usdcx_stablecoin.aleo/transfer_public self.signer r5 into r7; + async mint_and_send_public r6 r7 into r8; + output r8 as bridge_demo_v1.aleo/mint_and_send_public.future; + +finalize mint_and_send_public: + input r0 as test_usdcx_bridge.aleo/mint_public.future; + input r1 as test_usdcx_stablecoin.aleo/transfer_public.future; + await r0; + await r1; + +function deposit_public_usdcx_to_vault: + input r0 as u128.private; + call test_usdcx_stablecoin.aleo/transfer_public_as_signer bridge_demo_v1.aleo r0 into r1; + async deposit_public_usdcx_to_vault r1 into r2; + output r2 as bridge_demo_v1.aleo/deposit_public_usdcx_to_vault.future; + +finalize deposit_public_usdcx_to_vault: + input r0 as test_usdcx_stablecoin.aleo/transfer_public_as_signer.future; + await r0; + +function deposit_private_usdcx_to_vault: + input r0 as u128.private; + input r1 as test_usdcx_stablecoin.aleo/Token.record; + input r2 as [test_usdcx_stablecoin.aleo/MerkleProof; 2u32].private; + call test_usdcx_stablecoin.aleo/transfer_private_to_public bridge_demo_v1.aleo r0 r1 r2 into r3 r4 r5; + async deposit_private_usdcx_to_vault r5 into r6; + output r6 as bridge_demo_v1.aleo/deposit_private_usdcx_to_vault.future; + +finalize deposit_private_usdcx_to_vault: + input r0 as test_usdcx_stablecoin.aleo/transfer_private_to_public.future; + await r0; + +function withdraw_from_vault_public: + input r0 as u128.private; + call test_usdcx_stablecoin.aleo/transfer_public self.signer r0 into r1; + async withdraw_from_vault_public r1 into r2; + output r2 as bridge_demo_v1.aleo/withdraw_from_vault_public.future; + +finalize withdraw_from_vault_public: + input r0 as test_usdcx_stablecoin.aleo/transfer_public.future; + await r0; + +function withdraw_from_vault_private: + input r0 as u128.private; + input r1 as address.private; + call test_usdcx_stablecoin.aleo/transfer_public_to_private self.signer r0 into r2 r3 r4; + async withdraw_from_vault_private r4 into r5; + output r5 as bridge_demo_v1.aleo/withdraw_from_vault_private.future; + +finalize withdraw_from_vault_private: + input r0 as test_usdcx_stablecoin.aleo/transfer_public_to_private.future; + await r0; + +function burn_private: + input r0 as test_usdcx_stablecoin.aleo/Token.record; + input r1 as u128.private; + input r2 as [test_usdcx_stablecoin.aleo/MerkleProof; 2u32].private; + call test_usdcx_stablecoin.aleo/transfer_private_to_public bridge_demo_v1.aleo r1 r0 r2 into r3 r4 r5; + cast 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 30u8 25u8 109u8 10u8 125u8 129u8 137u8 5u8 76u8 77u8 183u8 68u8 171u8 51u8 64u8 195u8 241u8 198u8 139u8 25u8 into r6 as [u8; 32u32]; + call test_usdcx_bridge.aleo/burn_public r1 1002u32 r6 into r7; + async burn_private r5 r7 into r8; + output r8 as bridge_demo_v1.aleo/burn_private.future; + +finalize burn_private: + input r0 as test_usdcx_stablecoin.aleo/transfer_private_to_public.future; + input r1 as test_usdcx_bridge.aleo/burn_public.future; + await r0; + await r1; + +constructor: + gt edition 0u16 into r0; + branch.eq r0 false to end_then_0_0; + assert.eq program_owner aleo1rhgdu77hgyqd3xjj8ucu3jj9r2krwz6mnzyd80gncr5fxcwlh5rsvzp9px; + branch.eq true true to end_otherwise_0_1; + position end_then_0_0; + position end_otherwise_0_1; diff --git a/examples/private-mint/private-mint-wrapper/build/program.json b/examples/private-mint/private-mint-wrapper/build/program.json new file mode 100644 index 00000000..48b8bb07 --- /dev/null +++ b/examples/private-mint/private-mint-wrapper/build/program.json @@ -0,0 +1,9 @@ +{ + "program": "bridge_demo_v1.aleo", + "version": "0.1.0", + "description": "", + "license": "", + "leo": "4.0.2", + "dependencies": null, + "dev_dependencies": null +} diff --git a/examples/private-mint/private-mint-wrapper/imports/merkle_tree.aleo b/examples/private-mint/private-mint-wrapper/imports/merkle_tree.aleo new file mode 100644 index 00000000..9e1c8d4f --- /dev/null +++ b/examples/private-mint/private-mint-wrapper/imports/merkle_tree.aleo @@ -0,0 +1,600 @@ +program merkle_tree.aleo; + +struct MerkleProof: + siblings as [field; 16u32]; + leaf_index as u32; + +function verify_inclusion: + input r0 as address.private; + input r1 as MerkleProof.private; + cast r0 into r2 as field; + assert.eq r2 r1.siblings[0u32]; + rem r1.leaf_index 2u32 into r3; + is.eq r3 0u32 into r4; + cast 1field r1.siblings[0u32] r1.siblings[1u32] into r5 as [field; 3u32]; + cast 1field r1.siblings[1u32] r1.siblings[0u32] into r6 as [field; 3u32]; + ternary r4 r5[0u32] r6[0u32] into r7; + ternary r4 r5[1u32] r6[1u32] into r8; + ternary r4 r5[2u32] r6[2u32] into r9; + cast r7 r8 r9 into r10 as [field; 3u32]; + hash.psd4 r10 into r11 as field; + is.eq r1.siblings[2u32] 0field into r12; + div r1.leaf_index 2u32 into r13; + rem r13 2u32 into r14; + is.eq r14 0u32 into r15; + cast 0field r11 r1.siblings[2u32] into r16 as [field; 3u32]; + cast 0field r1.siblings[2u32] r11 into r17 as [field; 3u32]; + ternary r15 r16[0u32] r17[0u32] into r18; + ternary r15 r16[1u32] r17[1u32] into r19; + ternary r15 r16[2u32] r17[2u32] into r20; + cast r18 r19 r20 into r21 as [field; 3u32]; + hash.psd4 r21 into r22 as field; + is.eq r1.siblings[3u32] 0field into r23; + div r1.leaf_index 4u32 into r24; + rem r24 2u32 into r25; + is.eq r25 0u32 into r26; + cast 0field r22 r1.siblings[3u32] into r27 as [field; 3u32]; + cast 0field r1.siblings[3u32] r22 into r28 as [field; 3u32]; + ternary r26 r27[0u32] r28[0u32] into r29; + ternary r26 r27[1u32] r28[1u32] into r30; + ternary r26 r27[2u32] r28[2u32] into r31; + cast r29 r30 r31 into r32 as [field; 3u32]; + hash.psd4 r32 into r33 as field; + is.eq r1.siblings[4u32] 0field into r34; + div r1.leaf_index 8u32 into r35; + rem r35 2u32 into r36; + is.eq r36 0u32 into r37; + cast 0field r33 r1.siblings[4u32] into r38 as [field; 3u32]; + cast 0field r1.siblings[4u32] r33 into r39 as [field; 3u32]; + ternary r37 r38[0u32] r39[0u32] into r40; + ternary r37 r38[1u32] r39[1u32] into r41; + ternary r37 r38[2u32] r39[2u32] into r42; + cast r40 r41 r42 into r43 as [field; 3u32]; + hash.psd4 r43 into r44 as field; + is.eq r1.siblings[5u32] 0field into r45; + div r1.leaf_index 16u32 into r46; + rem r46 2u32 into r47; + is.eq r47 0u32 into r48; + cast 0field r44 r1.siblings[5u32] into r49 as [field; 3u32]; + cast 0field r1.siblings[5u32] r44 into r50 as [field; 3u32]; + ternary r48 r49[0u32] r50[0u32] into r51; + ternary r48 r49[1u32] r50[1u32] into r52; + ternary r48 r49[2u32] r50[2u32] into r53; + cast r51 r52 r53 into r54 as [field; 3u32]; + hash.psd4 r54 into r55 as field; + is.eq r1.siblings[6u32] 0field into r56; + div r1.leaf_index 32u32 into r57; + rem r57 2u32 into r58; + is.eq r58 0u32 into r59; + cast 0field r55 r1.siblings[6u32] into r60 as [field; 3u32]; + cast 0field r1.siblings[6u32] r55 into r61 as [field; 3u32]; + ternary r59 r60[0u32] r61[0u32] into r62; + ternary r59 r60[1u32] r61[1u32] into r63; + ternary r59 r60[2u32] r61[2u32] into r64; + cast r62 r63 r64 into r65 as [field; 3u32]; + hash.psd4 r65 into r66 as field; + is.eq r1.siblings[7u32] 0field into r67; + div r1.leaf_index 64u32 into r68; + rem r68 2u32 into r69; + is.eq r69 0u32 into r70; + cast 0field r66 r1.siblings[7u32] into r71 as [field; 3u32]; + cast 0field r1.siblings[7u32] r66 into r72 as [field; 3u32]; + ternary r70 r71[0u32] r72[0u32] into r73; + ternary r70 r71[1u32] r72[1u32] into r74; + ternary r70 r71[2u32] r72[2u32] into r75; + cast r73 r74 r75 into r76 as [field; 3u32]; + hash.psd4 r76 into r77 as field; + is.eq r1.siblings[8u32] 0field into r78; + div r1.leaf_index 128u32 into r79; + rem r79 2u32 into r80; + is.eq r80 0u32 into r81; + cast 0field r77 r1.siblings[8u32] into r82 as [field; 3u32]; + cast 0field r1.siblings[8u32] r77 into r83 as [field; 3u32]; + ternary r81 r82[0u32] r83[0u32] into r84; + ternary r81 r82[1u32] r83[1u32] into r85; + ternary r81 r82[2u32] r83[2u32] into r86; + cast r84 r85 r86 into r87 as [field; 3u32]; + hash.psd4 r87 into r88 as field; + is.eq r1.siblings[9u32] 0field into r89; + div r1.leaf_index 256u32 into r90; + rem r90 2u32 into r91; + is.eq r91 0u32 into r92; + cast 0field r88 r1.siblings[9u32] into r93 as [field; 3u32]; + cast 0field r1.siblings[9u32] r88 into r94 as [field; 3u32]; + ternary r92 r93[0u32] r94[0u32] into r95; + ternary r92 r93[1u32] r94[1u32] into r96; + ternary r92 r93[2u32] r94[2u32] into r97; + cast r95 r96 r97 into r98 as [field; 3u32]; + hash.psd4 r98 into r99 as field; + is.eq r1.siblings[10u32] 0field into r100; + div r1.leaf_index 512u32 into r101; + rem r101 2u32 into r102; + is.eq r102 0u32 into r103; + cast 0field r99 r1.siblings[10u32] into r104 as [field; 3u32]; + cast 0field r1.siblings[10u32] r99 into r105 as [field; 3u32]; + ternary r103 r104[0u32] r105[0u32] into r106; + ternary r103 r104[1u32] r105[1u32] into r107; + ternary r103 r104[2u32] r105[2u32] into r108; + cast r106 r107 r108 into r109 as [field; 3u32]; + hash.psd4 r109 into r110 as field; + is.eq r1.siblings[11u32] 0field into r111; + div r1.leaf_index 1024u32 into r112; + rem r112 2u32 into r113; + is.eq r113 0u32 into r114; + cast 0field r110 r1.siblings[11u32] into r115 as [field; 3u32]; + cast 0field r1.siblings[11u32] r110 into r116 as [field; 3u32]; + ternary r114 r115[0u32] r116[0u32] into r117; + ternary r114 r115[1u32] r116[1u32] into r118; + ternary r114 r115[2u32] r116[2u32] into r119; + cast r117 r118 r119 into r120 as [field; 3u32]; + hash.psd4 r120 into r121 as field; + is.eq r1.siblings[12u32] 0field into r122; + div r1.leaf_index 2048u32 into r123; + rem r123 2u32 into r124; + is.eq r124 0u32 into r125; + cast 0field r121 r1.siblings[12u32] into r126 as [field; 3u32]; + cast 0field r1.siblings[12u32] r121 into r127 as [field; 3u32]; + ternary r125 r126[0u32] r127[0u32] into r128; + ternary r125 r126[1u32] r127[1u32] into r129; + ternary r125 r126[2u32] r127[2u32] into r130; + cast r128 r129 r130 into r131 as [field; 3u32]; + hash.psd4 r131 into r132 as field; + is.eq r1.siblings[13u32] 0field into r133; + div r1.leaf_index 4096u32 into r134; + rem r134 2u32 into r135; + is.eq r135 0u32 into r136; + cast 0field r132 r1.siblings[13u32] into r137 as [field; 3u32]; + cast 0field r1.siblings[13u32] r132 into r138 as [field; 3u32]; + ternary r136 r137[0u32] r138[0u32] into r139; + ternary r136 r137[1u32] r138[1u32] into r140; + ternary r136 r137[2u32] r138[2u32] into r141; + cast r139 r140 r141 into r142 as [field; 3u32]; + hash.psd4 r142 into r143 as field; + is.eq r1.siblings[14u32] 0field into r144; + div r1.leaf_index 8192u32 into r145; + rem r145 2u32 into r146; + is.eq r146 0u32 into r147; + cast 0field r143 r1.siblings[14u32] into r148 as [field; 3u32]; + cast 0field r1.siblings[14u32] r143 into r149 as [field; 3u32]; + ternary r147 r148[0u32] r149[0u32] into r150; + ternary r147 r148[1u32] r149[1u32] into r151; + ternary r147 r148[2u32] r149[2u32] into r152; + cast r150 r151 r152 into r153 as [field; 3u32]; + hash.psd4 r153 into r154 as field; + is.eq r1.siblings[15u32] 0field into r155; + div r1.leaf_index 16384u32 into r156; + rem r156 2u32 into r157; + is.eq r157 0u32 into r158; + cast 0field r154 r1.siblings[15u32] into r159 as [field; 3u32]; + cast 0field r1.siblings[15u32] r154 into r160 as [field; 3u32]; + ternary r158 r159[0u32] r160[0u32] into r161; + ternary r158 r159[1u32] r160[1u32] into r162; + ternary r158 r159[2u32] r160[2u32] into r163; + cast r161 r162 r163 into r164 as [field; 3u32]; + hash.psd4 r164 into r165 as field; + ternary r155 r154 r165 into r166; + ternary r144 r143 r166 into r167; + ternary r133 r132 r167 into r168; + ternary r122 r121 r168 into r169; + ternary r111 r110 r169 into r170; + ternary r100 r99 r170 into r171; + ternary r89 r88 r171 into r172; + ternary r78 r77 r172 into r173; + ternary r67 r66 r173 into r174; + ternary r56 r55 r174 into r175; + ternary r45 r44 r175 into r176; + ternary r34 r33 r176 into r177; + ternary r23 r22 r177 into r178; + ternary r12 r11 r178 into r179; + output r179 as field.private; + +function verify_non_inclusion: + input r0 as address.private; + input r1 as [MerkleProof; 2u32].private; + rem r1[0u32].leaf_index 2u32 into r2; + is.eq r2 0u32 into r3; + cast 1field r1[0u32].siblings[0u32] r1[0u32].siblings[1u32] into r4 as [field; 3u32]; + cast 1field r1[0u32].siblings[1u32] r1[0u32].siblings[0u32] into r5 as [field; 3u32]; + ternary r3 r4[0u32] r5[0u32] into r6; + ternary r3 r4[1u32] r5[1u32] into r7; + ternary r3 r4[2u32] r5[2u32] into r8; + cast r6 r7 r8 into r9 as [field; 3u32]; + hash.psd4 r9 into r10 as field; + is.eq r1[0u32].siblings[2u32] 0field into r11; + div r1[0u32].leaf_index 2u32 into r12; + rem r12 2u32 into r13; + is.eq r13 0u32 into r14; + cast 0field r10 r1[0u32].siblings[2u32] into r15 as [field; 3u32]; + cast 0field r1[0u32].siblings[2u32] r10 into r16 as [field; 3u32]; + ternary r14 r15[0u32] r16[0u32] into r17; + ternary r14 r15[1u32] r16[1u32] into r18; + ternary r14 r15[2u32] r16[2u32] into r19; + cast r17 r18 r19 into r20 as [field; 3u32]; + hash.psd4 r20 into r21 as field; + is.eq r1[0u32].siblings[3u32] 0field into r22; + div r1[0u32].leaf_index 4u32 into r23; + rem r23 2u32 into r24; + is.eq r24 0u32 into r25; + cast 0field r21 r1[0u32].siblings[3u32] into r26 as [field; 3u32]; + cast 0field r1[0u32].siblings[3u32] r21 into r27 as [field; 3u32]; + ternary r25 r26[0u32] r27[0u32] into r28; + ternary r25 r26[1u32] r27[1u32] into r29; + ternary r25 r26[2u32] r27[2u32] into r30; + cast r28 r29 r30 into r31 as [field; 3u32]; + hash.psd4 r31 into r32 as field; + is.eq r1[0u32].siblings[4u32] 0field into r33; + div r1[0u32].leaf_index 8u32 into r34; + rem r34 2u32 into r35; + is.eq r35 0u32 into r36; + cast 0field r32 r1[0u32].siblings[4u32] into r37 as [field; 3u32]; + cast 0field r1[0u32].siblings[4u32] r32 into r38 as [field; 3u32]; + ternary r36 r37[0u32] r38[0u32] into r39; + ternary r36 r37[1u32] r38[1u32] into r40; + ternary r36 r37[2u32] r38[2u32] into r41; + cast r39 r40 r41 into r42 as [field; 3u32]; + hash.psd4 r42 into r43 as field; + is.eq r1[0u32].siblings[5u32] 0field into r44; + div r1[0u32].leaf_index 16u32 into r45; + rem r45 2u32 into r46; + is.eq r46 0u32 into r47; + cast 0field r43 r1[0u32].siblings[5u32] into r48 as [field; 3u32]; + cast 0field r1[0u32].siblings[5u32] r43 into r49 as [field; 3u32]; + ternary r47 r48[0u32] r49[0u32] into r50; + ternary r47 r48[1u32] r49[1u32] into r51; + ternary r47 r48[2u32] r49[2u32] into r52; + cast r50 r51 r52 into r53 as [field; 3u32]; + hash.psd4 r53 into r54 as field; + is.eq r1[0u32].siblings[6u32] 0field into r55; + div r1[0u32].leaf_index 32u32 into r56; + rem r56 2u32 into r57; + is.eq r57 0u32 into r58; + cast 0field r54 r1[0u32].siblings[6u32] into r59 as [field; 3u32]; + cast 0field r1[0u32].siblings[6u32] r54 into r60 as [field; 3u32]; + ternary r58 r59[0u32] r60[0u32] into r61; + ternary r58 r59[1u32] r60[1u32] into r62; + ternary r58 r59[2u32] r60[2u32] into r63; + cast r61 r62 r63 into r64 as [field; 3u32]; + hash.psd4 r64 into r65 as field; + is.eq r1[0u32].siblings[7u32] 0field into r66; + div r1[0u32].leaf_index 64u32 into r67; + rem r67 2u32 into r68; + is.eq r68 0u32 into r69; + cast 0field r65 r1[0u32].siblings[7u32] into r70 as [field; 3u32]; + cast 0field r1[0u32].siblings[7u32] r65 into r71 as [field; 3u32]; + ternary r69 r70[0u32] r71[0u32] into r72; + ternary r69 r70[1u32] r71[1u32] into r73; + ternary r69 r70[2u32] r71[2u32] into r74; + cast r72 r73 r74 into r75 as [field; 3u32]; + hash.psd4 r75 into r76 as field; + is.eq r1[0u32].siblings[8u32] 0field into r77; + div r1[0u32].leaf_index 128u32 into r78; + rem r78 2u32 into r79; + is.eq r79 0u32 into r80; + cast 0field r76 r1[0u32].siblings[8u32] into r81 as [field; 3u32]; + cast 0field r1[0u32].siblings[8u32] r76 into r82 as [field; 3u32]; + ternary r80 r81[0u32] r82[0u32] into r83; + ternary r80 r81[1u32] r82[1u32] into r84; + ternary r80 r81[2u32] r82[2u32] into r85; + cast r83 r84 r85 into r86 as [field; 3u32]; + hash.psd4 r86 into r87 as field; + is.eq r1[0u32].siblings[9u32] 0field into r88; + div r1[0u32].leaf_index 256u32 into r89; + rem r89 2u32 into r90; + is.eq r90 0u32 into r91; + cast 0field r87 r1[0u32].siblings[9u32] into r92 as [field; 3u32]; + cast 0field r1[0u32].siblings[9u32] r87 into r93 as [field; 3u32]; + ternary r91 r92[0u32] r93[0u32] into r94; + ternary r91 r92[1u32] r93[1u32] into r95; + ternary r91 r92[2u32] r93[2u32] into r96; + cast r94 r95 r96 into r97 as [field; 3u32]; + hash.psd4 r97 into r98 as field; + is.eq r1[0u32].siblings[10u32] 0field into r99; + div r1[0u32].leaf_index 512u32 into r100; + rem r100 2u32 into r101; + is.eq r101 0u32 into r102; + cast 0field r98 r1[0u32].siblings[10u32] into r103 as [field; 3u32]; + cast 0field r1[0u32].siblings[10u32] r98 into r104 as [field; 3u32]; + ternary r102 r103[0u32] r104[0u32] into r105; + ternary r102 r103[1u32] r104[1u32] into r106; + ternary r102 r103[2u32] r104[2u32] into r107; + cast r105 r106 r107 into r108 as [field; 3u32]; + hash.psd4 r108 into r109 as field; + is.eq r1[0u32].siblings[11u32] 0field into r110; + div r1[0u32].leaf_index 1024u32 into r111; + rem r111 2u32 into r112; + is.eq r112 0u32 into r113; + cast 0field r109 r1[0u32].siblings[11u32] into r114 as [field; 3u32]; + cast 0field r1[0u32].siblings[11u32] r109 into r115 as [field; 3u32]; + ternary r113 r114[0u32] r115[0u32] into r116; + ternary r113 r114[1u32] r115[1u32] into r117; + ternary r113 r114[2u32] r115[2u32] into r118; + cast r116 r117 r118 into r119 as [field; 3u32]; + hash.psd4 r119 into r120 as field; + is.eq r1[0u32].siblings[12u32] 0field into r121; + div r1[0u32].leaf_index 2048u32 into r122; + rem r122 2u32 into r123; + is.eq r123 0u32 into r124; + cast 0field r120 r1[0u32].siblings[12u32] into r125 as [field; 3u32]; + cast 0field r1[0u32].siblings[12u32] r120 into r126 as [field; 3u32]; + ternary r124 r125[0u32] r126[0u32] into r127; + ternary r124 r125[1u32] r126[1u32] into r128; + ternary r124 r125[2u32] r126[2u32] into r129; + cast r127 r128 r129 into r130 as [field; 3u32]; + hash.psd4 r130 into r131 as field; + is.eq r1[0u32].siblings[13u32] 0field into r132; + div r1[0u32].leaf_index 4096u32 into r133; + rem r133 2u32 into r134; + is.eq r134 0u32 into r135; + cast 0field r131 r1[0u32].siblings[13u32] into r136 as [field; 3u32]; + cast 0field r1[0u32].siblings[13u32] r131 into r137 as [field; 3u32]; + ternary r135 r136[0u32] r137[0u32] into r138; + ternary r135 r136[1u32] r137[1u32] into r139; + ternary r135 r136[2u32] r137[2u32] into r140; + cast r138 r139 r140 into r141 as [field; 3u32]; + hash.psd4 r141 into r142 as field; + is.eq r1[0u32].siblings[14u32] 0field into r143; + div r1[0u32].leaf_index 8192u32 into r144; + rem r144 2u32 into r145; + is.eq r145 0u32 into r146; + cast 0field r142 r1[0u32].siblings[14u32] into r147 as [field; 3u32]; + cast 0field r1[0u32].siblings[14u32] r142 into r148 as [field; 3u32]; + ternary r146 r147[0u32] r148[0u32] into r149; + ternary r146 r147[1u32] r148[1u32] into r150; + ternary r146 r147[2u32] r148[2u32] into r151; + cast r149 r150 r151 into r152 as [field; 3u32]; + hash.psd4 r152 into r153 as field; + is.eq r1[0u32].siblings[15u32] 0field into r154; + div r1[0u32].leaf_index 16384u32 into r155; + rem r155 2u32 into r156; + is.eq r156 0u32 into r157; + cast 0field r153 r1[0u32].siblings[15u32] into r158 as [field; 3u32]; + cast 0field r1[0u32].siblings[15u32] r153 into r159 as [field; 3u32]; + ternary r157 r158[0u32] r159[0u32] into r160; + ternary r157 r158[1u32] r159[1u32] into r161; + ternary r157 r158[2u32] r159[2u32] into r162; + cast r160 r161 r162 into r163 as [field; 3u32]; + hash.psd4 r163 into r164 as field; + ternary r154 r153 r164 into r165; + ternary r154 14u32 15u32 into r166; + ternary r143 r142 r165 into r167; + ternary r143 13u32 r166 into r168; + ternary r132 r131 r167 into r169; + ternary r132 12u32 r168 into r170; + ternary r121 r120 r169 into r171; + ternary r121 11u32 r170 into r172; + ternary r110 r109 r171 into r173; + ternary r110 10u32 r172 into r174; + ternary r99 r98 r173 into r175; + ternary r99 9u32 r174 into r176; + ternary r88 r87 r175 into r177; + ternary r88 8u32 r176 into r178; + ternary r77 r76 r177 into r179; + ternary r77 7u32 r178 into r180; + ternary r66 r65 r179 into r181; + ternary r66 6u32 r180 into r182; + ternary r55 r54 r181 into r183; + ternary r55 5u32 r182 into r184; + ternary r44 r43 r183 into r185; + ternary r44 4u32 r184 into r186; + ternary r33 r32 r185 into r187; + ternary r33 3u32 r186 into r188; + ternary r22 r21 r187 into r189; + ternary r22 2u32 r188 into r190; + ternary r11 r10 r189 into r191; + ternary r11 1u32 r190 into r192; + rem r1[1u32].leaf_index 2u32 into r193; + is.eq r193 0u32 into r194; + cast 1field r1[1u32].siblings[0u32] r1[1u32].siblings[1u32] into r195 as [field; 3u32]; + cast 1field r1[1u32].siblings[1u32] r1[1u32].siblings[0u32] into r196 as [field; 3u32]; + ternary r194 r195[0u32] r196[0u32] into r197; + ternary r194 r195[1u32] r196[1u32] into r198; + ternary r194 r195[2u32] r196[2u32] into r199; + cast r197 r198 r199 into r200 as [field; 3u32]; + hash.psd4 r200 into r201 as field; + is.eq r1[1u32].siblings[2u32] 0field into r202; + div r1[1u32].leaf_index 2u32 into r203; + rem r203 2u32 into r204; + is.eq r204 0u32 into r205; + cast 0field r201 r1[1u32].siblings[2u32] into r206 as [field; 3u32]; + cast 0field r1[1u32].siblings[2u32] r201 into r207 as [field; 3u32]; + ternary r205 r206[0u32] r207[0u32] into r208; + ternary r205 r206[1u32] r207[1u32] into r209; + ternary r205 r206[2u32] r207[2u32] into r210; + cast r208 r209 r210 into r211 as [field; 3u32]; + hash.psd4 r211 into r212 as field; + is.eq r1[1u32].siblings[3u32] 0field into r213; + div r1[1u32].leaf_index 4u32 into r214; + rem r214 2u32 into r215; + is.eq r215 0u32 into r216; + cast 0field r212 r1[1u32].siblings[3u32] into r217 as [field; 3u32]; + cast 0field r1[1u32].siblings[3u32] r212 into r218 as [field; 3u32]; + ternary r216 r217[0u32] r218[0u32] into r219; + ternary r216 r217[1u32] r218[1u32] into r220; + ternary r216 r217[2u32] r218[2u32] into r221; + cast r219 r220 r221 into r222 as [field; 3u32]; + hash.psd4 r222 into r223 as field; + is.eq r1[1u32].siblings[4u32] 0field into r224; + div r1[1u32].leaf_index 8u32 into r225; + rem r225 2u32 into r226; + is.eq r226 0u32 into r227; + cast 0field r223 r1[1u32].siblings[4u32] into r228 as [field; 3u32]; + cast 0field r1[1u32].siblings[4u32] r223 into r229 as [field; 3u32]; + ternary r227 r228[0u32] r229[0u32] into r230; + ternary r227 r228[1u32] r229[1u32] into r231; + ternary r227 r228[2u32] r229[2u32] into r232; + cast r230 r231 r232 into r233 as [field; 3u32]; + hash.psd4 r233 into r234 as field; + is.eq r1[1u32].siblings[5u32] 0field into r235; + div r1[1u32].leaf_index 16u32 into r236; + rem r236 2u32 into r237; + is.eq r237 0u32 into r238; + cast 0field r234 r1[1u32].siblings[5u32] into r239 as [field; 3u32]; + cast 0field r1[1u32].siblings[5u32] r234 into r240 as [field; 3u32]; + ternary r238 r239[0u32] r240[0u32] into r241; + ternary r238 r239[1u32] r240[1u32] into r242; + ternary r238 r239[2u32] r240[2u32] into r243; + cast r241 r242 r243 into r244 as [field; 3u32]; + hash.psd4 r244 into r245 as field; + is.eq r1[1u32].siblings[6u32] 0field into r246; + div r1[1u32].leaf_index 32u32 into r247; + rem r247 2u32 into r248; + is.eq r248 0u32 into r249; + cast 0field r245 r1[1u32].siblings[6u32] into r250 as [field; 3u32]; + cast 0field r1[1u32].siblings[6u32] r245 into r251 as [field; 3u32]; + ternary r249 r250[0u32] r251[0u32] into r252; + ternary r249 r250[1u32] r251[1u32] into r253; + ternary r249 r250[2u32] r251[2u32] into r254; + cast r252 r253 r254 into r255 as [field; 3u32]; + hash.psd4 r255 into r256 as field; + is.eq r1[1u32].siblings[7u32] 0field into r257; + div r1[1u32].leaf_index 64u32 into r258; + rem r258 2u32 into r259; + is.eq r259 0u32 into r260; + cast 0field r256 r1[1u32].siblings[7u32] into r261 as [field; 3u32]; + cast 0field r1[1u32].siblings[7u32] r256 into r262 as [field; 3u32]; + ternary r260 r261[0u32] r262[0u32] into r263; + ternary r260 r261[1u32] r262[1u32] into r264; + ternary r260 r261[2u32] r262[2u32] into r265; + cast r263 r264 r265 into r266 as [field; 3u32]; + hash.psd4 r266 into r267 as field; + is.eq r1[1u32].siblings[8u32] 0field into r268; + div r1[1u32].leaf_index 128u32 into r269; + rem r269 2u32 into r270; + is.eq r270 0u32 into r271; + cast 0field r267 r1[1u32].siblings[8u32] into r272 as [field; 3u32]; + cast 0field r1[1u32].siblings[8u32] r267 into r273 as [field; 3u32]; + ternary r271 r272[0u32] r273[0u32] into r274; + ternary r271 r272[1u32] r273[1u32] into r275; + ternary r271 r272[2u32] r273[2u32] into r276; + cast r274 r275 r276 into r277 as [field; 3u32]; + hash.psd4 r277 into r278 as field; + is.eq r1[1u32].siblings[9u32] 0field into r279; + div r1[1u32].leaf_index 256u32 into r280; + rem r280 2u32 into r281; + is.eq r281 0u32 into r282; + cast 0field r278 r1[1u32].siblings[9u32] into r283 as [field; 3u32]; + cast 0field r1[1u32].siblings[9u32] r278 into r284 as [field; 3u32]; + ternary r282 r283[0u32] r284[0u32] into r285; + ternary r282 r283[1u32] r284[1u32] into r286; + ternary r282 r283[2u32] r284[2u32] into r287; + cast r285 r286 r287 into r288 as [field; 3u32]; + hash.psd4 r288 into r289 as field; + is.eq r1[1u32].siblings[10u32] 0field into r290; + div r1[1u32].leaf_index 512u32 into r291; + rem r291 2u32 into r292; + is.eq r292 0u32 into r293; + cast 0field r289 r1[1u32].siblings[10u32] into r294 as [field; 3u32]; + cast 0field r1[1u32].siblings[10u32] r289 into r295 as [field; 3u32]; + ternary r293 r294[0u32] r295[0u32] into r296; + ternary r293 r294[1u32] r295[1u32] into r297; + ternary r293 r294[2u32] r295[2u32] into r298; + cast r296 r297 r298 into r299 as [field; 3u32]; + hash.psd4 r299 into r300 as field; + is.eq r1[1u32].siblings[11u32] 0field into r301; + div r1[1u32].leaf_index 1024u32 into r302; + rem r302 2u32 into r303; + is.eq r303 0u32 into r304; + cast 0field r300 r1[1u32].siblings[11u32] into r305 as [field; 3u32]; + cast 0field r1[1u32].siblings[11u32] r300 into r306 as [field; 3u32]; + ternary r304 r305[0u32] r306[0u32] into r307; + ternary r304 r305[1u32] r306[1u32] into r308; + ternary r304 r305[2u32] r306[2u32] into r309; + cast r307 r308 r309 into r310 as [field; 3u32]; + hash.psd4 r310 into r311 as field; + is.eq r1[1u32].siblings[12u32] 0field into r312; + div r1[1u32].leaf_index 2048u32 into r313; + rem r313 2u32 into r314; + is.eq r314 0u32 into r315; + cast 0field r311 r1[1u32].siblings[12u32] into r316 as [field; 3u32]; + cast 0field r1[1u32].siblings[12u32] r311 into r317 as [field; 3u32]; + ternary r315 r316[0u32] r317[0u32] into r318; + ternary r315 r316[1u32] r317[1u32] into r319; + ternary r315 r316[2u32] r317[2u32] into r320; + cast r318 r319 r320 into r321 as [field; 3u32]; + hash.psd4 r321 into r322 as field; + is.eq r1[1u32].siblings[13u32] 0field into r323; + div r1[1u32].leaf_index 4096u32 into r324; + rem r324 2u32 into r325; + is.eq r325 0u32 into r326; + cast 0field r322 r1[1u32].siblings[13u32] into r327 as [field; 3u32]; + cast 0field r1[1u32].siblings[13u32] r322 into r328 as [field; 3u32]; + ternary r326 r327[0u32] r328[0u32] into r329; + ternary r326 r327[1u32] r328[1u32] into r330; + ternary r326 r327[2u32] r328[2u32] into r331; + cast r329 r330 r331 into r332 as [field; 3u32]; + hash.psd4 r332 into r333 as field; + is.eq r1[1u32].siblings[14u32] 0field into r334; + div r1[1u32].leaf_index 8192u32 into r335; + rem r335 2u32 into r336; + is.eq r336 0u32 into r337; + cast 0field r333 r1[1u32].siblings[14u32] into r338 as [field; 3u32]; + cast 0field r1[1u32].siblings[14u32] r333 into r339 as [field; 3u32]; + ternary r337 r338[0u32] r339[0u32] into r340; + ternary r337 r338[1u32] r339[1u32] into r341; + ternary r337 r338[2u32] r339[2u32] into r342; + cast r340 r341 r342 into r343 as [field; 3u32]; + hash.psd4 r343 into r344 as field; + is.eq r1[1u32].siblings[15u32] 0field into r345; + div r1[1u32].leaf_index 16384u32 into r346; + rem r346 2u32 into r347; + is.eq r347 0u32 into r348; + cast 0field r344 r1[1u32].siblings[15u32] into r349 as [field; 3u32]; + cast 0field r1[1u32].siblings[15u32] r344 into r350 as [field; 3u32]; + ternary r348 r349[0u32] r350[0u32] into r351; + ternary r348 r349[1u32] r350[1u32] into r352; + ternary r348 r349[2u32] r350[2u32] into r353; + cast r351 r352 r353 into r354 as [field; 3u32]; + hash.psd4 r354 into r355 as field; + ternary r345 r344 r355 into r356; + ternary r334 r333 r356 into r357; + ternary r323 r322 r357 into r358; + ternary r312 r311 r358 into r359; + ternary r301 r300 r359 into r360; + ternary r290 r289 r360 into r361; + ternary r279 r278 r361 into r362; + ternary r268 r267 r362 into r363; + ternary r257 r256 r363 into r364; + ternary r246 r245 r364 into r365; + ternary r235 r234 r365 into r366; + ternary r224 r223 r366 into r367; + ternary r213 r212 r367 into r368; + ternary r202 r201 r368 into r369; + assert.eq r191 r369; + cast r0 into r370 as field; + is.eq r1[0u32].leaf_index r1[1u32].leaf_index into r371; + is.eq r1[0u32].leaf_index 0u32 into r372; + lt r370 r1[0u32].siblings[0u32] into r373; + and r371 r372 into r374; + not r374 into r375; + or r373 r375 into r376; + assert.eq r376 true; + not r372 into r377; + pow 2u32 r192 into r378; + sub r378 1u32 into r379; + and r371 r377 into r380; + not r380 into r381; + is.eq r1[0u32].leaf_index r379 into r382; + or r382 r381 into r383; + assert.eq r383 true; + gt r370 r1[0u32].siblings[0u32] into r384; + or r384 r381 into r385; + assert.eq r385 true; + not r371 into r386; + gt r370 r1[0u32].siblings[0u32] into r387; + not r386 into r388; + or r387 r388 into r389; + assert.eq r389 true; + lt r370 r1[1u32].siblings[0u32] into r390; + or r390 r388 into r391; + assert.eq r391 true; + lte r1[1u32].leaf_index r379 into r392; + or r392 r388 into r393; + assert.eq r393 true; + add r1[0u32].leaf_index 1u32 into r394; + is.eq r394 r1[1u32].leaf_index into r395; + or r395 r388 into r396; + assert.eq r396 true; + output r191 as field.private; + +constructor: + assert.eq edition 0u16; diff --git a/examples/private-mint/private-mint-wrapper/imports/test_usdcx_bridge.aleo b/examples/private-mint/private-mint-wrapper/imports/test_usdcx_bridge.aleo new file mode 100644 index 00000000..d78e62fe --- /dev/null +++ b/examples/private-mint/private-mint-wrapper/imports/test_usdcx_bridge.aleo @@ -0,0 +1,783 @@ +import merkle_tree.aleo; +import test_usdcx_multisig_core.aleo; +import test_usdcx_freezelist.aleo; +import test_usdcx_stablecoin.aleo; +program test_usdcx_bridge.aleo; + +struct ChecksumEdition: + checksum as [u8; 32u32]; + edition as u16; + +mapping circle_attester: + key as boolean.public; + value as [u8; 20u32].public; + +mapping minimum_burn_amount: + key as boolean.public; + value as u128.public; + +mapping nullifier: + key as [u8; 32u32].public; + value as boolean.public; + +mapping paused: + key as boolean.public; + value as boolean.public; + +mapping emergency_paused: + key as boolean.public; + value as boolean.public; + +function get_signing_op_id_for_deploy: + input r0 as [u8; 32u32].private; + input r1 as u16.private; + cast r0 r1 into r2 as ChecksumEdition; + hash.bhp256 r2 into r3 as field; + output r3 as field.private; + +function mint_private: + input r0 as [u8; 240u32].private; + input r1 as [u8; 65u32].private; + input r2 as [u8; 32u32].private; + input r3 as [test_usdcx_stablecoin.aleo/MerkleProof; 2u32].private; + cast r0[0u32] r0[1u32] r0[2u32] r0[3u32] into r4 as [u8; 4u32]; + cast 90u8 46u8 10u8 205u8 into r5 as [u8; 4u32]; + is.eq r4 r5 into r6; + assert.eq r6 true; + cast r0[4u32] r0[5u32] r0[6u32] r0[7u32] into r7 as [u8; 4u32]; + cast 0u8 0u8 0u8 1u8 into r8 as [u8; 4u32]; + is.eq r7 r8 into r9; + assert.eq r9 true; + cast r0[24u32] r0[25u32] r0[26u32] r0[27u32] r0[28u32] r0[29u32] r0[30u32] r0[31u32] r0[32u32] r0[33u32] r0[34u32] r0[35u32] r0[36u32] r0[37u32] r0[38u32] r0[39u32] into r10 as [u8; 16u32]; + cast r10[0u32] into r11 as u128; + mul r11 1329227995784915872903807060280344576u128 into r12; + add 0u128 r12 into r13; + cast r10[1u32] into r14 as u128; + mul r14 5192296858534827628530496329220096u128 into r15; + add r13 r15 into r16; + cast r10[2u32] into r17 as u128; + mul r17 20282409603651670423947251286016u128 into r18; + add r16 r18 into r19; + cast r10[3u32] into r20 as u128; + mul r20 79228162514264337593543950336u128 into r21; + add r19 r21 into r22; + cast r10[4u32] into r23 as u128; + mul r23 309485009821345068724781056u128 into r24; + add r22 r24 into r25; + cast r10[5u32] into r26 as u128; + mul r26 1208925819614629174706176u128 into r27; + add r25 r27 into r28; + cast r10[6u32] into r29 as u128; + mul r29 4722366482869645213696u128 into r30; + add r28 r30 into r31; + cast r10[7u32] into r32 as u128; + mul r32 18446744073709551616u128 into r33; + add r31 r33 into r34; + cast r10[8u32] into r35 as u128; + mul r35 72057594037927936u128 into r36; + add r34 r36 into r37; + cast r10[9u32] into r38 as u128; + mul r38 281474976710656u128 into r39; + add r37 r39 into r40; + cast r10[10u32] into r41 as u128; + mul r41 1099511627776u128 into r42; + add r40 r42 into r43; + cast r10[11u32] into r44 as u128; + mul r44 4294967296u128 into r45; + add r43 r45 into r46; + cast r10[12u32] into r47 as u128; + mul r47 16777216u128 into r48; + add r46 r48 into r49; + cast r10[13u32] into r50 as u128; + mul r50 65536u128 into r51; + add r49 r51 into r52; + cast r10[14u32] into r53 as u128; + mul r53 256u128 into r54; + add r52 r54 into r55; + cast r10[15u32] into r56 as u128; + mul r56 1u128 into r57; + add r55 r57 into r58; + gt r58 0u128 into r59; + assert.eq r59 true; + cast r0[40u32] r0[41u32] r0[42u32] r0[43u32] into r60 as [u8; 4u32]; + cast 0u8 0u8 39u8 18u8 into r61 as [u8; 4u32]; + is.eq r60 r61 into r62; + assert.eq r62 true; + cast 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 into r63 as [u8; 32u32]; + cast r0[108u32] r0[109u32] r0[110u32] r0[111u32] r0[112u32] r0[113u32] r0[114u32] r0[115u32] r0[116u32] r0[117u32] r0[118u32] r0[119u32] r0[120u32] r0[121u32] r0[122u32] r0[123u32] r0[124u32] r0[125u32] r0[126u32] r0[127u32] r0[128u32] r0[129u32] r0[130u32] r0[131u32] r0[132u32] r0[133u32] r0[134u32] r0[135u32] r0[136u32] r0[137u32] r0[138u32] r0[139u32] into r64 as [u8; 32u32]; + is.neq r64 r63 into r65; + assert.eq r65 true; + cast r0[76u32] r0[77u32] r0[78u32] r0[79u32] r0[80u32] r0[81u32] r0[82u32] r0[83u32] r0[84u32] r0[85u32] r0[86u32] r0[87u32] r0[88u32] r0[89u32] r0[90u32] r0[91u32] r0[92u32] r0[93u32] r0[94u32] r0[95u32] r0[96u32] r0[97u32] r0[98u32] r0[99u32] r0[100u32] r0[101u32] r0[102u32] r0[103u32] r0[104u32] r0[105u32] r0[106u32] r0[107u32] into r66 as [u8; 32u32]; + is.neq r66 r63 into r67; + assert.eq r67 true; + serialize.bits.raw r66 ([u8; 32u32]) into r68 ([boolean; 256u32]); + cast r68[0u32] r68[1u32] r68[2u32] r68[3u32] r68[4u32] r68[5u32] r68[6u32] r68[7u32] r68[8u32] r68[9u32] r68[10u32] r68[11u32] r68[12u32] r68[13u32] r68[14u32] r68[15u32] r68[16u32] r68[17u32] r68[18u32] r68[19u32] r68[20u32] r68[21u32] r68[22u32] r68[23u32] r68[24u32] r68[25u32] r68[26u32] r68[27u32] r68[28u32] r68[29u32] r68[30u32] r68[31u32] r68[32u32] r68[33u32] r68[34u32] r68[35u32] r68[36u32] r68[37u32] r68[38u32] r68[39u32] r68[40u32] r68[41u32] r68[42u32] r68[43u32] r68[44u32] r68[45u32] r68[46u32] r68[47u32] r68[48u32] r68[49u32] r68[50u32] r68[51u32] r68[52u32] r68[53u32] r68[54u32] r68[55u32] r68[56u32] r68[57u32] r68[58u32] r68[59u32] r68[60u32] r68[61u32] r68[62u32] r68[63u32] r68[64u32] r68[65u32] r68[66u32] r68[67u32] r68[68u32] r68[69u32] r68[70u32] r68[71u32] r68[72u32] r68[73u32] r68[74u32] r68[75u32] r68[76u32] r68[77u32] r68[78u32] r68[79u32] r68[80u32] r68[81u32] r68[82u32] r68[83u32] r68[84u32] r68[85u32] r68[86u32] r68[87u32] r68[88u32] r68[89u32] r68[90u32] r68[91u32] r68[92u32] r68[93u32] r68[94u32] r68[95u32] r68[96u32] r68[97u32] r68[98u32] r68[99u32] r68[100u32] r68[101u32] r68[102u32] r68[103u32] r68[104u32] r68[105u32] r68[106u32] r68[107u32] r68[108u32] r68[109u32] r68[110u32] r68[111u32] r68[112u32] r68[113u32] r68[114u32] r68[115u32] r68[116u32] r68[117u32] r68[118u32] r68[119u32] r68[120u32] r68[121u32] r68[122u32] r68[123u32] r68[124u32] r68[125u32] r68[126u32] r68[127u32] r68[128u32] r68[129u32] r68[130u32] r68[131u32] r68[132u32] r68[133u32] r68[134u32] r68[135u32] r68[136u32] r68[137u32] r68[138u32] r68[139u32] r68[140u32] r68[141u32] r68[142u32] r68[143u32] r68[144u32] r68[145u32] r68[146u32] r68[147u32] r68[148u32] r68[149u32] r68[150u32] r68[151u32] r68[152u32] r68[153u32] r68[154u32] r68[155u32] r68[156u32] r68[157u32] r68[158u32] r68[159u32] r68[160u32] r68[161u32] r68[162u32] r68[163u32] r68[164u32] r68[165u32] r68[166u32] r68[167u32] r68[168u32] r68[169u32] r68[170u32] r68[171u32] r68[172u32] r68[173u32] r68[174u32] r68[175u32] r68[176u32] r68[177u32] r68[178u32] r68[179u32] r68[180u32] r68[181u32] r68[182u32] r68[183u32] r68[184u32] r68[185u32] r68[186u32] r68[187u32] r68[188u32] r68[189u32] r68[190u32] r68[191u32] r68[192u32] r68[193u32] r68[194u32] r68[195u32] r68[196u32] r68[197u32] r68[198u32] r68[199u32] r68[200u32] r68[201u32] r68[202u32] r68[203u32] r68[204u32] r68[205u32] r68[206u32] r68[207u32] r68[208u32] r68[209u32] r68[210u32] r68[211u32] r68[212u32] r68[213u32] r68[214u32] r68[215u32] r68[216u32] r68[217u32] r68[218u32] r68[219u32] r68[220u32] r68[221u32] r68[222u32] r68[223u32] r68[224u32] r68[225u32] r68[226u32] r68[227u32] r68[228u32] r68[229u32] r68[230u32] r68[231u32] r68[232u32] r68[233u32] r68[234u32] r68[235u32] r68[236u32] r68[237u32] r68[238u32] r68[239u32] r68[240u32] r68[241u32] r68[242u32] r68[243u32] r68[244u32] r68[245u32] r68[246u32] r68[247u32] r68[248u32] r68[249u32] r68[250u32] r68[251u32] r68[252u32] into r69 as [boolean; 253u32]; + deserialize.bits.raw r69 ([boolean; 253u32]) into r70 (address); + hash.keccak256.native.raw r0 into r71 as [boolean; 256u32]; + deserialize.bits.raw r71 ([boolean; 256u32]) into r72 ([u8; 32u32]); + is.eq r72 r2 into r73; + assert.eq r73 true; + cast r0[204u32] r0[205u32] r0[206u32] r0[207u32] r0[208u32] r0[209u32] r0[210u32] r0[211u32] r0[212u32] r0[213u32] r0[214u32] r0[215u32] r0[216u32] r0[217u32] r0[218u32] r0[219u32] r0[220u32] r0[221u32] r0[222u32] r0[223u32] r0[224u32] r0[225u32] r0[226u32] r0[227u32] r0[228u32] r0[229u32] r0[230u32] r0[231u32] r0[232u32] r0[233u32] r0[234u32] r0[235u32] into r74 as [u8; 32u32]; + rem r3[0u32].leaf_index 2u32 into r75; + is.eq r75 0u32 into r76; + cast 1field r3[0u32].siblings[0u32] r3[0u32].siblings[1u32] into r77 as [field; 3u32]; + cast 1field r3[0u32].siblings[1u32] r3[0u32].siblings[0u32] into r78 as [field; 3u32]; + ternary r76 r77[0u32] r78[0u32] into r79; + ternary r76 r77[1u32] r78[1u32] into r80; + ternary r76 r77[2u32] r78[2u32] into r81; + cast r79 r80 r81 into r82 as [field; 3u32]; + hash.psd4 r82 into r83 as field; + is.eq r3[0u32].siblings[2u32] 0field into r84; + div r3[0u32].leaf_index 2u32 into r85; + rem r85 2u32 into r86; + is.eq r86 0u32 into r87; + cast 0field r83 r3[0u32].siblings[2u32] into r88 as [field; 3u32]; + cast 0field r3[0u32].siblings[2u32] r83 into r89 as [field; 3u32]; + ternary r87 r88[0u32] r89[0u32] into r90; + ternary r87 r88[1u32] r89[1u32] into r91; + ternary r87 r88[2u32] r89[2u32] into r92; + cast r90 r91 r92 into r93 as [field; 3u32]; + hash.psd4 r93 into r94 as field; + is.eq r3[0u32].siblings[3u32] 0field into r95; + div r3[0u32].leaf_index 4u32 into r96; + rem r96 2u32 into r97; + is.eq r97 0u32 into r98; + cast 0field r94 r3[0u32].siblings[3u32] into r99 as [field; 3u32]; + cast 0field r3[0u32].siblings[3u32] r94 into r100 as [field; 3u32]; + ternary r98 r99[0u32] r100[0u32] into r101; + ternary r98 r99[1u32] r100[1u32] into r102; + ternary r98 r99[2u32] r100[2u32] into r103; + cast r101 r102 r103 into r104 as [field; 3u32]; + hash.psd4 r104 into r105 as field; + is.eq r3[0u32].siblings[4u32] 0field into r106; + div r3[0u32].leaf_index 8u32 into r107; + rem r107 2u32 into r108; + is.eq r108 0u32 into r109; + cast 0field r105 r3[0u32].siblings[4u32] into r110 as [field; 3u32]; + cast 0field r3[0u32].siblings[4u32] r105 into r111 as [field; 3u32]; + ternary r109 r110[0u32] r111[0u32] into r112; + ternary r109 r110[1u32] r111[1u32] into r113; + ternary r109 r110[2u32] r111[2u32] into r114; + cast r112 r113 r114 into r115 as [field; 3u32]; + hash.psd4 r115 into r116 as field; + is.eq r3[0u32].siblings[5u32] 0field into r117; + div r3[0u32].leaf_index 16u32 into r118; + rem r118 2u32 into r119; + is.eq r119 0u32 into r120; + cast 0field r116 r3[0u32].siblings[5u32] into r121 as [field; 3u32]; + cast 0field r3[0u32].siblings[5u32] r116 into r122 as [field; 3u32]; + ternary r120 r121[0u32] r122[0u32] into r123; + ternary r120 r121[1u32] r122[1u32] into r124; + ternary r120 r121[2u32] r122[2u32] into r125; + cast r123 r124 r125 into r126 as [field; 3u32]; + hash.psd4 r126 into r127 as field; + is.eq r3[0u32].siblings[6u32] 0field into r128; + div r3[0u32].leaf_index 32u32 into r129; + rem r129 2u32 into r130; + is.eq r130 0u32 into r131; + cast 0field r127 r3[0u32].siblings[6u32] into r132 as [field; 3u32]; + cast 0field r3[0u32].siblings[6u32] r127 into r133 as [field; 3u32]; + ternary r131 r132[0u32] r133[0u32] into r134; + ternary r131 r132[1u32] r133[1u32] into r135; + ternary r131 r132[2u32] r133[2u32] into r136; + cast r134 r135 r136 into r137 as [field; 3u32]; + hash.psd4 r137 into r138 as field; + is.eq r3[0u32].siblings[7u32] 0field into r139; + div r3[0u32].leaf_index 64u32 into r140; + rem r140 2u32 into r141; + is.eq r141 0u32 into r142; + cast 0field r138 r3[0u32].siblings[7u32] into r143 as [field; 3u32]; + cast 0field r3[0u32].siblings[7u32] r138 into r144 as [field; 3u32]; + ternary r142 r143[0u32] r144[0u32] into r145; + ternary r142 r143[1u32] r144[1u32] into r146; + ternary r142 r143[2u32] r144[2u32] into r147; + cast r145 r146 r147 into r148 as [field; 3u32]; + hash.psd4 r148 into r149 as field; + is.eq r3[0u32].siblings[8u32] 0field into r150; + div r3[0u32].leaf_index 128u32 into r151; + rem r151 2u32 into r152; + is.eq r152 0u32 into r153; + cast 0field r149 r3[0u32].siblings[8u32] into r154 as [field; 3u32]; + cast 0field r3[0u32].siblings[8u32] r149 into r155 as [field; 3u32]; + ternary r153 r154[0u32] r155[0u32] into r156; + ternary r153 r154[1u32] r155[1u32] into r157; + ternary r153 r154[2u32] r155[2u32] into r158; + cast r156 r157 r158 into r159 as [field; 3u32]; + hash.psd4 r159 into r160 as field; + is.eq r3[0u32].siblings[9u32] 0field into r161; + div r3[0u32].leaf_index 256u32 into r162; + rem r162 2u32 into r163; + is.eq r163 0u32 into r164; + cast 0field r160 r3[0u32].siblings[9u32] into r165 as [field; 3u32]; + cast 0field r3[0u32].siblings[9u32] r160 into r166 as [field; 3u32]; + ternary r164 r165[0u32] r166[0u32] into r167; + ternary r164 r165[1u32] r166[1u32] into r168; + ternary r164 r165[2u32] r166[2u32] into r169; + cast r167 r168 r169 into r170 as [field; 3u32]; + hash.psd4 r170 into r171 as field; + is.eq r3[0u32].siblings[10u32] 0field into r172; + div r3[0u32].leaf_index 512u32 into r173; + rem r173 2u32 into r174; + is.eq r174 0u32 into r175; + cast 0field r171 r3[0u32].siblings[10u32] into r176 as [field; 3u32]; + cast 0field r3[0u32].siblings[10u32] r171 into r177 as [field; 3u32]; + ternary r175 r176[0u32] r177[0u32] into r178; + ternary r175 r176[1u32] r177[1u32] into r179; + ternary r175 r176[2u32] r177[2u32] into r180; + cast r178 r179 r180 into r181 as [field; 3u32]; + hash.psd4 r181 into r182 as field; + is.eq r3[0u32].siblings[11u32] 0field into r183; + div r3[0u32].leaf_index 1024u32 into r184; + rem r184 2u32 into r185; + is.eq r185 0u32 into r186; + cast 0field r182 r3[0u32].siblings[11u32] into r187 as [field; 3u32]; + cast 0field r3[0u32].siblings[11u32] r182 into r188 as [field; 3u32]; + ternary r186 r187[0u32] r188[0u32] into r189; + ternary r186 r187[1u32] r188[1u32] into r190; + ternary r186 r187[2u32] r188[2u32] into r191; + cast r189 r190 r191 into r192 as [field; 3u32]; + hash.psd4 r192 into r193 as field; + is.eq r3[0u32].siblings[12u32] 0field into r194; + div r3[0u32].leaf_index 2048u32 into r195; + rem r195 2u32 into r196; + is.eq r196 0u32 into r197; + cast 0field r193 r3[0u32].siblings[12u32] into r198 as [field; 3u32]; + cast 0field r3[0u32].siblings[12u32] r193 into r199 as [field; 3u32]; + ternary r197 r198[0u32] r199[0u32] into r200; + ternary r197 r198[1u32] r199[1u32] into r201; + ternary r197 r198[2u32] r199[2u32] into r202; + cast r200 r201 r202 into r203 as [field; 3u32]; + hash.psd4 r203 into r204 as field; + is.eq r3[0u32].siblings[13u32] 0field into r205; + div r3[0u32].leaf_index 4096u32 into r206; + rem r206 2u32 into r207; + is.eq r207 0u32 into r208; + cast 0field r204 r3[0u32].siblings[13u32] into r209 as [field; 3u32]; + cast 0field r3[0u32].siblings[13u32] r204 into r210 as [field; 3u32]; + ternary r208 r209[0u32] r210[0u32] into r211; + ternary r208 r209[1u32] r210[1u32] into r212; + ternary r208 r209[2u32] r210[2u32] into r213; + cast r211 r212 r213 into r214 as [field; 3u32]; + hash.psd4 r214 into r215 as field; + is.eq r3[0u32].siblings[14u32] 0field into r216; + div r3[0u32].leaf_index 8192u32 into r217; + rem r217 2u32 into r218; + is.eq r218 0u32 into r219; + cast 0field r215 r3[0u32].siblings[14u32] into r220 as [field; 3u32]; + cast 0field r3[0u32].siblings[14u32] r215 into r221 as [field; 3u32]; + ternary r219 r220[0u32] r221[0u32] into r222; + ternary r219 r220[1u32] r221[1u32] into r223; + ternary r219 r220[2u32] r221[2u32] into r224; + cast r222 r223 r224 into r225 as [field; 3u32]; + hash.psd4 r225 into r226 as field; + is.eq r3[0u32].siblings[15u32] 0field into r227; + div r3[0u32].leaf_index 16384u32 into r228; + rem r228 2u32 into r229; + is.eq r229 0u32 into r230; + cast 0field r226 r3[0u32].siblings[15u32] into r231 as [field; 3u32]; + cast 0field r3[0u32].siblings[15u32] r226 into r232 as [field; 3u32]; + ternary r230 r231[0u32] r232[0u32] into r233; + ternary r230 r231[1u32] r232[1u32] into r234; + ternary r230 r231[2u32] r232[2u32] into r235; + cast r233 r234 r235 into r236 as [field; 3u32]; + hash.psd4 r236 into r237 as field; + ternary r227 r226 r237 into r238; + ternary r227 14u32 15u32 into r239; + ternary r216 r215 r238 into r240; + ternary r216 13u32 r239 into r241; + ternary r205 r204 r240 into r242; + ternary r205 12u32 r241 into r243; + ternary r194 r193 r242 into r244; + ternary r194 11u32 r243 into r245; + ternary r183 r182 r244 into r246; + ternary r183 10u32 r245 into r247; + ternary r172 r171 r246 into r248; + ternary r172 9u32 r247 into r249; + ternary r161 r160 r248 into r250; + ternary r161 8u32 r249 into r251; + ternary r150 r149 r250 into r252; + ternary r150 7u32 r251 into r253; + ternary r139 r138 r252 into r254; + ternary r139 6u32 r253 into r255; + ternary r128 r127 r254 into r256; + ternary r128 5u32 r255 into r257; + ternary r117 r116 r256 into r258; + ternary r117 4u32 r257 into r259; + ternary r106 r105 r258 into r260; + ternary r106 3u32 r259 into r261; + ternary r95 r94 r260 into r262; + ternary r95 2u32 r261 into r263; + ternary r84 r83 r262 into r264; + ternary r84 1u32 r263 into r265; + rem r3[1u32].leaf_index 2u32 into r266; + is.eq r266 0u32 into r267; + cast 1field r3[1u32].siblings[0u32] r3[1u32].siblings[1u32] into r268 as [field; 3u32]; + cast 1field r3[1u32].siblings[1u32] r3[1u32].siblings[0u32] into r269 as [field; 3u32]; + ternary r267 r268[0u32] r269[0u32] into r270; + ternary r267 r268[1u32] r269[1u32] into r271; + ternary r267 r268[2u32] r269[2u32] into r272; + cast r270 r271 r272 into r273 as [field; 3u32]; + hash.psd4 r273 into r274 as field; + is.eq r3[1u32].siblings[2u32] 0field into r275; + div r3[1u32].leaf_index 2u32 into r276; + rem r276 2u32 into r277; + is.eq r277 0u32 into r278; + cast 0field r274 r3[1u32].siblings[2u32] into r279 as [field; 3u32]; + cast 0field r3[1u32].siblings[2u32] r274 into r280 as [field; 3u32]; + ternary r278 r279[0u32] r280[0u32] into r281; + ternary r278 r279[1u32] r280[1u32] into r282; + ternary r278 r279[2u32] r280[2u32] into r283; + cast r281 r282 r283 into r284 as [field; 3u32]; + hash.psd4 r284 into r285 as field; + is.eq r3[1u32].siblings[3u32] 0field into r286; + div r3[1u32].leaf_index 4u32 into r287; + rem r287 2u32 into r288; + is.eq r288 0u32 into r289; + cast 0field r285 r3[1u32].siblings[3u32] into r290 as [field; 3u32]; + cast 0field r3[1u32].siblings[3u32] r285 into r291 as [field; 3u32]; + ternary r289 r290[0u32] r291[0u32] into r292; + ternary r289 r290[1u32] r291[1u32] into r293; + ternary r289 r290[2u32] r291[2u32] into r294; + cast r292 r293 r294 into r295 as [field; 3u32]; + hash.psd4 r295 into r296 as field; + is.eq r3[1u32].siblings[4u32] 0field into r297; + div r3[1u32].leaf_index 8u32 into r298; + rem r298 2u32 into r299; + is.eq r299 0u32 into r300; + cast 0field r296 r3[1u32].siblings[4u32] into r301 as [field; 3u32]; + cast 0field r3[1u32].siblings[4u32] r296 into r302 as [field; 3u32]; + ternary r300 r301[0u32] r302[0u32] into r303; + ternary r300 r301[1u32] r302[1u32] into r304; + ternary r300 r301[2u32] r302[2u32] into r305; + cast r303 r304 r305 into r306 as [field; 3u32]; + hash.psd4 r306 into r307 as field; + is.eq r3[1u32].siblings[5u32] 0field into r308; + div r3[1u32].leaf_index 16u32 into r309; + rem r309 2u32 into r310; + is.eq r310 0u32 into r311; + cast 0field r307 r3[1u32].siblings[5u32] into r312 as [field; 3u32]; + cast 0field r3[1u32].siblings[5u32] r307 into r313 as [field; 3u32]; + ternary r311 r312[0u32] r313[0u32] into r314; + ternary r311 r312[1u32] r313[1u32] into r315; + ternary r311 r312[2u32] r313[2u32] into r316; + cast r314 r315 r316 into r317 as [field; 3u32]; + hash.psd4 r317 into r318 as field; + is.eq r3[1u32].siblings[6u32] 0field into r319; + div r3[1u32].leaf_index 32u32 into r320; + rem r320 2u32 into r321; + is.eq r321 0u32 into r322; + cast 0field r318 r3[1u32].siblings[6u32] into r323 as [field; 3u32]; + cast 0field r3[1u32].siblings[6u32] r318 into r324 as [field; 3u32]; + ternary r322 r323[0u32] r324[0u32] into r325; + ternary r322 r323[1u32] r324[1u32] into r326; + ternary r322 r323[2u32] r324[2u32] into r327; + cast r325 r326 r327 into r328 as [field; 3u32]; + hash.psd4 r328 into r329 as field; + is.eq r3[1u32].siblings[7u32] 0field into r330; + div r3[1u32].leaf_index 64u32 into r331; + rem r331 2u32 into r332; + is.eq r332 0u32 into r333; + cast 0field r329 r3[1u32].siblings[7u32] into r334 as [field; 3u32]; + cast 0field r3[1u32].siblings[7u32] r329 into r335 as [field; 3u32]; + ternary r333 r334[0u32] r335[0u32] into r336; + ternary r333 r334[1u32] r335[1u32] into r337; + ternary r333 r334[2u32] r335[2u32] into r338; + cast r336 r337 r338 into r339 as [field; 3u32]; + hash.psd4 r339 into r340 as field; + is.eq r3[1u32].siblings[8u32] 0field into r341; + div r3[1u32].leaf_index 128u32 into r342; + rem r342 2u32 into r343; + is.eq r343 0u32 into r344; + cast 0field r340 r3[1u32].siblings[8u32] into r345 as [field; 3u32]; + cast 0field r3[1u32].siblings[8u32] r340 into r346 as [field; 3u32]; + ternary r344 r345[0u32] r346[0u32] into r347; + ternary r344 r345[1u32] r346[1u32] into r348; + ternary r344 r345[2u32] r346[2u32] into r349; + cast r347 r348 r349 into r350 as [field; 3u32]; + hash.psd4 r350 into r351 as field; + is.eq r3[1u32].siblings[9u32] 0field into r352; + div r3[1u32].leaf_index 256u32 into r353; + rem r353 2u32 into r354; + is.eq r354 0u32 into r355; + cast 0field r351 r3[1u32].siblings[9u32] into r356 as [field; 3u32]; + cast 0field r3[1u32].siblings[9u32] r351 into r357 as [field; 3u32]; + ternary r355 r356[0u32] r357[0u32] into r358; + ternary r355 r356[1u32] r357[1u32] into r359; + ternary r355 r356[2u32] r357[2u32] into r360; + cast r358 r359 r360 into r361 as [field; 3u32]; + hash.psd4 r361 into r362 as field; + is.eq r3[1u32].siblings[10u32] 0field into r363; + div r3[1u32].leaf_index 512u32 into r364; + rem r364 2u32 into r365; + is.eq r365 0u32 into r366; + cast 0field r362 r3[1u32].siblings[10u32] into r367 as [field; 3u32]; + cast 0field r3[1u32].siblings[10u32] r362 into r368 as [field; 3u32]; + ternary r366 r367[0u32] r368[0u32] into r369; + ternary r366 r367[1u32] r368[1u32] into r370; + ternary r366 r367[2u32] r368[2u32] into r371; + cast r369 r370 r371 into r372 as [field; 3u32]; + hash.psd4 r372 into r373 as field; + is.eq r3[1u32].siblings[11u32] 0field into r374; + div r3[1u32].leaf_index 1024u32 into r375; + rem r375 2u32 into r376; + is.eq r376 0u32 into r377; + cast 0field r373 r3[1u32].siblings[11u32] into r378 as [field; 3u32]; + cast 0field r3[1u32].siblings[11u32] r373 into r379 as [field; 3u32]; + ternary r377 r378[0u32] r379[0u32] into r380; + ternary r377 r378[1u32] r379[1u32] into r381; + ternary r377 r378[2u32] r379[2u32] into r382; + cast r380 r381 r382 into r383 as [field; 3u32]; + hash.psd4 r383 into r384 as field; + is.eq r3[1u32].siblings[12u32] 0field into r385; + div r3[1u32].leaf_index 2048u32 into r386; + rem r386 2u32 into r387; + is.eq r387 0u32 into r388; + cast 0field r384 r3[1u32].siblings[12u32] into r389 as [field; 3u32]; + cast 0field r3[1u32].siblings[12u32] r384 into r390 as [field; 3u32]; + ternary r388 r389[0u32] r390[0u32] into r391; + ternary r388 r389[1u32] r390[1u32] into r392; + ternary r388 r389[2u32] r390[2u32] into r393; + cast r391 r392 r393 into r394 as [field; 3u32]; + hash.psd4 r394 into r395 as field; + is.eq r3[1u32].siblings[13u32] 0field into r396; + div r3[1u32].leaf_index 4096u32 into r397; + rem r397 2u32 into r398; + is.eq r398 0u32 into r399; + cast 0field r395 r3[1u32].siblings[13u32] into r400 as [field; 3u32]; + cast 0field r3[1u32].siblings[13u32] r395 into r401 as [field; 3u32]; + ternary r399 r400[0u32] r401[0u32] into r402; + ternary r399 r400[1u32] r401[1u32] into r403; + ternary r399 r400[2u32] r401[2u32] into r404; + cast r402 r403 r404 into r405 as [field; 3u32]; + hash.psd4 r405 into r406 as field; + is.eq r3[1u32].siblings[14u32] 0field into r407; + div r3[1u32].leaf_index 8192u32 into r408; + rem r408 2u32 into r409; + is.eq r409 0u32 into r410; + cast 0field r406 r3[1u32].siblings[14u32] into r411 as [field; 3u32]; + cast 0field r3[1u32].siblings[14u32] r406 into r412 as [field; 3u32]; + ternary r410 r411[0u32] r412[0u32] into r413; + ternary r410 r411[1u32] r412[1u32] into r414; + ternary r410 r411[2u32] r412[2u32] into r415; + cast r413 r414 r415 into r416 as [field; 3u32]; + hash.psd4 r416 into r417 as field; + is.eq r3[1u32].siblings[15u32] 0field into r418; + div r3[1u32].leaf_index 16384u32 into r419; + rem r419 2u32 into r420; + is.eq r420 0u32 into r421; + cast 0field r417 r3[1u32].siblings[15u32] into r422 as [field; 3u32]; + cast 0field r3[1u32].siblings[15u32] r417 into r423 as [field; 3u32]; + ternary r421 r422[0u32] r423[0u32] into r424; + ternary r421 r422[1u32] r423[1u32] into r425; + ternary r421 r422[2u32] r423[2u32] into r426; + cast r424 r425 r426 into r427 as [field; 3u32]; + hash.psd4 r427 into r428 as field; + ternary r418 r417 r428 into r429; + ternary r407 r406 r429 into r430; + ternary r396 r395 r430 into r431; + ternary r385 r384 r431 into r432; + ternary r374 r373 r432 into r433; + ternary r363 r362 r433 into r434; + ternary r352 r351 r434 into r435; + ternary r341 r340 r435 into r436; + ternary r330 r329 r436 into r437; + ternary r319 r318 r437 into r438; + ternary r308 r307 r438 into r439; + ternary r297 r296 r439 into r440; + ternary r286 r285 r440 into r441; + ternary r275 r274 r441 into r442; + assert.eq r264 r442; + cast r70 into r443 as field; + is.eq r3[0u32].leaf_index r3[1u32].leaf_index into r444; + is.eq r3[0u32].leaf_index 0u32 into r445; + lt r443 r3[0u32].siblings[0u32] into r446; + and r444 r445 into r447; + not r447 into r448; + or r446 r448 into r449; + assert.eq r449 true; + not r445 into r450; + pow 2u32 r265 into r451; + sub r451 1u32 into r452; + and r444 r450 into r453; + not r453 into r454; + is.eq r3[0u32].leaf_index r452 into r455; + or r455 r454 into r456; + assert.eq r456 true; + gt r443 r3[0u32].siblings[0u32] into r457; + or r457 r454 into r458; + assert.eq r458 true; + not r444 into r459; + gt r443 r3[0u32].siblings[0u32] into r460; + not r459 into r461; + or r460 r461 into r462; + assert.eq r462 true; + lt r443 r3[1u32].siblings[0u32] into r463; + or r463 r461 into r464; + assert.eq r464 true; + lte r3[1u32].leaf_index r452 into r465; + or r465 r461 into r466; + assert.eq r466 true; + add r3[0u32].leaf_index 1u32 into r467; + is.eq r467 r3[1u32].leaf_index into r468; + or r468 r461 into r469; + assert.eq r469 true; + call test_usdcx_stablecoin.aleo/mint_private r70 r58 into r470 r471 r472; + async mint_private r1 r72 r74 r264 r472 into r473; + output r470 as test_usdcx_stablecoin.aleo/ComplianceRecord.record; + output r471 as test_usdcx_stablecoin.aleo/Token.record; + output r473 as test_usdcx_bridge.aleo/mint_private.future; + +finalize mint_private: + input r0 as [u8; 65u32].public; + input r1 as [u8; 32u32].public; + input r2 as [u8; 32u32].public; + input r3 as field.public; + input r4 as test_usdcx_stablecoin.aleo/mint_private.future; + get.or_use paused[true] false into r5; + assert.eq r5 false; + get test_usdcx_freezelist.aleo/freeze_list_root[1u8] into r6; + get test_usdcx_freezelist.aleo/block_height_window[true] into r7; + is.neq r6 r3 into r8; + branch.eq r8 false to end_then_0_0; + get test_usdcx_freezelist.aleo/freeze_list_root[2u8] into r9; + assert.eq r3 r9; + get test_usdcx_freezelist.aleo/root_updated_height[true] into r10; + add r10 r7 into r11; + gt r11 block.height into r12; + assert.eq r12 true; + branch.eq true true to end_otherwise_0_1; + position end_then_0_0; + position end_otherwise_0_1; + get.or_use emergency_paused[true] false into r13; + assert.eq r13 false; + cast 106u8 105u8 181u8 221u8 121u8 253u8 161u8 10u8 65u8 94u8 131u8 172u8 7u8 63u8 62u8 121u8 240u8 79u8 59u8 174u8 into r14 as [u8; 20u32]; + get.or_use circle_attester[true] r14 into r15; + ecdsa.verify.digest.eth r0 r15 r1 into r16; + assert.eq r16 true; + contains nullifier[r2] into r17; + is.eq r17 false into r18; + assert.eq r18 true; + set true into nullifier[r2]; + await r4; + +function mint_public: + input r0 as [u8; 240u32].private; + input r1 as [u8; 65u32].private; + input r2 as [u8; 32u32].private; + input r3 as [u8; 32u32].private; + cast r0[0u32] r0[1u32] r0[2u32] r0[3u32] into r4 as [u8; 4u32]; + cast 90u8 46u8 10u8 205u8 into r5 as [u8; 4u32]; + is.eq r4 r5 into r6; + assert.eq r6 true; + cast r0[4u32] r0[5u32] r0[6u32] r0[7u32] into r7 as [u8; 4u32]; + cast 0u8 0u8 0u8 1u8 into r8 as [u8; 4u32]; + is.eq r7 r8 into r9; + assert.eq r9 true; + cast r0[24u32] r0[25u32] r0[26u32] r0[27u32] r0[28u32] r0[29u32] r0[30u32] r0[31u32] r0[32u32] r0[33u32] r0[34u32] r0[35u32] r0[36u32] r0[37u32] r0[38u32] r0[39u32] into r10 as [u8; 16u32]; + cast r10[0u32] into r11 as u128; + mul r11 1329227995784915872903807060280344576u128 into r12; + add 0u128 r12 into r13; + cast r10[1u32] into r14 as u128; + mul r14 5192296858534827628530496329220096u128 into r15; + add r13 r15 into r16; + cast r10[2u32] into r17 as u128; + mul r17 20282409603651670423947251286016u128 into r18; + add r16 r18 into r19; + cast r10[3u32] into r20 as u128; + mul r20 79228162514264337593543950336u128 into r21; + add r19 r21 into r22; + cast r10[4u32] into r23 as u128; + mul r23 309485009821345068724781056u128 into r24; + add r22 r24 into r25; + cast r10[5u32] into r26 as u128; + mul r26 1208925819614629174706176u128 into r27; + add r25 r27 into r28; + cast r10[6u32] into r29 as u128; + mul r29 4722366482869645213696u128 into r30; + add r28 r30 into r31; + cast r10[7u32] into r32 as u128; + mul r32 18446744073709551616u128 into r33; + add r31 r33 into r34; + cast r10[8u32] into r35 as u128; + mul r35 72057594037927936u128 into r36; + add r34 r36 into r37; + cast r10[9u32] into r38 as u128; + mul r38 281474976710656u128 into r39; + add r37 r39 into r40; + cast r10[10u32] into r41 as u128; + mul r41 1099511627776u128 into r42; + add r40 r42 into r43; + cast r10[11u32] into r44 as u128; + mul r44 4294967296u128 into r45; + add r43 r45 into r46; + cast r10[12u32] into r47 as u128; + mul r47 16777216u128 into r48; + add r46 r48 into r49; + cast r10[13u32] into r50 as u128; + mul r50 65536u128 into r51; + add r49 r51 into r52; + cast r10[14u32] into r53 as u128; + mul r53 256u128 into r54; + add r52 r54 into r55; + cast r10[15u32] into r56 as u128; + mul r56 1u128 into r57; + add r55 r57 into r58; + gt r58 0u128 into r59; + assert.eq r59 true; + cast r0[40u32] r0[41u32] r0[42u32] r0[43u32] into r60 as [u8; 4u32]; + cast 0u8 0u8 39u8 18u8 into r61 as [u8; 4u32]; + is.eq r60 r61 into r62; + assert.eq r62 true; + cast 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 into r63 as [u8; 32u32]; + cast r0[108u32] r0[109u32] r0[110u32] r0[111u32] r0[112u32] r0[113u32] r0[114u32] r0[115u32] r0[116u32] r0[117u32] r0[118u32] r0[119u32] r0[120u32] r0[121u32] r0[122u32] r0[123u32] r0[124u32] r0[125u32] r0[126u32] r0[127u32] r0[128u32] r0[129u32] r0[130u32] r0[131u32] r0[132u32] r0[133u32] r0[134u32] r0[135u32] r0[136u32] r0[137u32] r0[138u32] r0[139u32] into r64 as [u8; 32u32]; + is.neq r64 r63 into r65; + assert.eq r65 true; + cast r0[76u32] r0[77u32] r0[78u32] r0[79u32] r0[80u32] r0[81u32] r0[82u32] r0[83u32] r0[84u32] r0[85u32] r0[86u32] r0[87u32] r0[88u32] r0[89u32] r0[90u32] r0[91u32] r0[92u32] r0[93u32] r0[94u32] r0[95u32] r0[96u32] r0[97u32] r0[98u32] r0[99u32] r0[100u32] r0[101u32] r0[102u32] r0[103u32] r0[104u32] r0[105u32] r0[106u32] r0[107u32] into r66 as [u8; 32u32]; + is.neq r66 r63 into r67; + assert.eq r67 true; + serialize.bits.raw r66 ([u8; 32u32]) into r68 ([boolean; 256u32]); + cast r68[0u32] r68[1u32] r68[2u32] r68[3u32] r68[4u32] r68[5u32] r68[6u32] r68[7u32] r68[8u32] r68[9u32] r68[10u32] r68[11u32] r68[12u32] r68[13u32] r68[14u32] r68[15u32] r68[16u32] r68[17u32] r68[18u32] r68[19u32] r68[20u32] r68[21u32] r68[22u32] r68[23u32] r68[24u32] r68[25u32] r68[26u32] r68[27u32] r68[28u32] r68[29u32] r68[30u32] r68[31u32] r68[32u32] r68[33u32] r68[34u32] r68[35u32] r68[36u32] r68[37u32] r68[38u32] r68[39u32] r68[40u32] r68[41u32] r68[42u32] r68[43u32] r68[44u32] r68[45u32] r68[46u32] r68[47u32] r68[48u32] r68[49u32] r68[50u32] r68[51u32] r68[52u32] r68[53u32] r68[54u32] r68[55u32] r68[56u32] r68[57u32] r68[58u32] r68[59u32] r68[60u32] r68[61u32] r68[62u32] r68[63u32] r68[64u32] r68[65u32] r68[66u32] r68[67u32] r68[68u32] r68[69u32] r68[70u32] r68[71u32] r68[72u32] r68[73u32] r68[74u32] r68[75u32] r68[76u32] r68[77u32] r68[78u32] r68[79u32] r68[80u32] r68[81u32] r68[82u32] r68[83u32] r68[84u32] r68[85u32] r68[86u32] r68[87u32] r68[88u32] r68[89u32] r68[90u32] r68[91u32] r68[92u32] r68[93u32] r68[94u32] r68[95u32] r68[96u32] r68[97u32] r68[98u32] r68[99u32] r68[100u32] r68[101u32] r68[102u32] r68[103u32] r68[104u32] r68[105u32] r68[106u32] r68[107u32] r68[108u32] r68[109u32] r68[110u32] r68[111u32] r68[112u32] r68[113u32] r68[114u32] r68[115u32] r68[116u32] r68[117u32] r68[118u32] r68[119u32] r68[120u32] r68[121u32] r68[122u32] r68[123u32] r68[124u32] r68[125u32] r68[126u32] r68[127u32] r68[128u32] r68[129u32] r68[130u32] r68[131u32] r68[132u32] r68[133u32] r68[134u32] r68[135u32] r68[136u32] r68[137u32] r68[138u32] r68[139u32] r68[140u32] r68[141u32] r68[142u32] r68[143u32] r68[144u32] r68[145u32] r68[146u32] r68[147u32] r68[148u32] r68[149u32] r68[150u32] r68[151u32] r68[152u32] r68[153u32] r68[154u32] r68[155u32] r68[156u32] r68[157u32] r68[158u32] r68[159u32] r68[160u32] r68[161u32] r68[162u32] r68[163u32] r68[164u32] r68[165u32] r68[166u32] r68[167u32] r68[168u32] r68[169u32] r68[170u32] r68[171u32] r68[172u32] r68[173u32] r68[174u32] r68[175u32] r68[176u32] r68[177u32] r68[178u32] r68[179u32] r68[180u32] r68[181u32] r68[182u32] r68[183u32] r68[184u32] r68[185u32] r68[186u32] r68[187u32] r68[188u32] r68[189u32] r68[190u32] r68[191u32] r68[192u32] r68[193u32] r68[194u32] r68[195u32] r68[196u32] r68[197u32] r68[198u32] r68[199u32] r68[200u32] r68[201u32] r68[202u32] r68[203u32] r68[204u32] r68[205u32] r68[206u32] r68[207u32] r68[208u32] r68[209u32] r68[210u32] r68[211u32] r68[212u32] r68[213u32] r68[214u32] r68[215u32] r68[216u32] r68[217u32] r68[218u32] r68[219u32] r68[220u32] r68[221u32] r68[222u32] r68[223u32] r68[224u32] r68[225u32] r68[226u32] r68[227u32] r68[228u32] r68[229u32] r68[230u32] r68[231u32] r68[232u32] r68[233u32] r68[234u32] r68[235u32] r68[236u32] r68[237u32] r68[238u32] r68[239u32] r68[240u32] r68[241u32] r68[242u32] r68[243u32] r68[244u32] r68[245u32] r68[246u32] r68[247u32] r68[248u32] r68[249u32] r68[250u32] r68[251u32] r68[252u32] into r69 as [boolean; 253u32]; + deserialize.bits.raw r69 ([boolean; 253u32]) into r70 (address); + hash.keccak256.native.raw r0 into r71 as [boolean; 256u32]; + deserialize.bits.raw r71 ([boolean; 256u32]) into r72 ([u8; 32u32]); + is.eq r72 r2 into r73; + assert.eq r73 true; + cast r0[204u32] r0[205u32] r0[206u32] r0[207u32] r0[208u32] r0[209u32] r0[210u32] r0[211u32] r0[212u32] r0[213u32] r0[214u32] r0[215u32] r0[216u32] r0[217u32] r0[218u32] r0[219u32] r0[220u32] r0[221u32] r0[222u32] r0[223u32] r0[224u32] r0[225u32] r0[226u32] r0[227u32] r0[228u32] r0[229u32] r0[230u32] r0[231u32] r0[232u32] r0[233u32] r0[234u32] r0[235u32] into r74 as [u8; 32u32]; + is.eq r70 bridge_demo_v1.aleo into r75; + not r75 into r76; + is.neq r3 r63 into r77; + or r77 r76 into r78; + assert.eq r78 true; + call test_usdcx_stablecoin.aleo/mint_public r70 r58 into r79; + async mint_public r1 r72 r74 r70 r79 into r80; + output r80 as test_usdcx_bridge.aleo/mint_public.future; + +finalize mint_public: + input r0 as [u8; 65u32].public; + input r1 as [u8; 32u32].public; + input r2 as [u8; 32u32].public; + input r3 as address.public; + input r4 as test_usdcx_stablecoin.aleo/mint_public.future; + get.or_use paused[true] false into r5; + assert.eq r5 false; + get.or_use emergency_paused[true] false into r6; + assert.eq r6 false; + get.or_use test_usdcx_freezelist.aleo/freeze_list[r3] false into r7; + assert.eq r7 false; + cast 106u8 105u8 181u8 221u8 121u8 253u8 161u8 10u8 65u8 94u8 131u8 172u8 7u8 63u8 62u8 121u8 240u8 79u8 59u8 174u8 into r8 as [u8; 20u32]; + get.or_use circle_attester[true] r8 into r9; + ecdsa.verify.digest.eth r0 r9 r1 into r10; + assert.eq r10 true; + contains nullifier[r2] into r11; + is.eq r11 false into r12; + assert.eq r12 true; + set true into nullifier[r2]; + await r4; + +function burn: + input r0 as u128.public; + input r1 as u32.public; + input r2 as [u8; 32u32].public; + assert.neq self.caller self.caller; + call test_usdcx_stablecoin.aleo/burn_public self.caller r0 into r3; + async burn self.caller r3 into r4; + output r4 as test_usdcx_bridge.aleo/burn.future; + +finalize burn: + input r0 as address.public; + input r1 as test_usdcx_stablecoin.aleo/burn_public.future; + get.or_use paused[true] false into r2; + assert.eq r2 false; + get.or_use emergency_paused[true] false into r3; + assert.eq r3 false; + get.or_use test_usdcx_freezelist.aleo/freeze_list[r0] false into r4; + assert.eq r4 false; + await r1; + +function burn_public: + input r0 as u128.public; + input r1 as u32.public; + input r2 as [u8; 32u32].public; + call test_usdcx_stablecoin.aleo/burn_public self.caller r0 into r3; + async burn_public r0 self.caller r3 into r4; + output r4 as test_usdcx_bridge.aleo/burn_public.future; + +finalize burn_public: + input r0 as u128.public; + input r1 as address.public; + input r2 as test_usdcx_stablecoin.aleo/burn_public.future; + get.or_use paused[true] false into r3; + assert.eq r3 false; + get.or_use minimum_burn_amount[true] 1000000u128 into r4; + gte r0 r4 into r5; + assert.eq r5 true; + get.or_use test_usdcx_freezelist.aleo/freeze_list[r1] false into r6; + assert.eq r6 false; + await r2; + +function burn_public_as_signer: + input r0 as u128.public; + input r1 as u32.public; + input r2 as [u8; 32u32].public; + call test_usdcx_stablecoin.aleo/burn_public self.signer r0 into r3; + async burn_public_as_signer r0 self.signer r3 into r4; + output r4 as test_usdcx_bridge.aleo/burn_public_as_signer.future; + +finalize burn_public_as_signer: + input r0 as u128.public; + input r1 as address.public; + input r2 as test_usdcx_stablecoin.aleo/burn_public.future; + get.or_use paused[true] false into r3; + assert.eq r3 false; + get.or_use minimum_burn_amount[true] 1000000u128 into r4; + gte r0 r4 into r5; + assert.eq r5 true; + get.or_use test_usdcx_freezelist.aleo/freeze_list[r1] false into r6; + assert.eq r6 false; + await r2; + +function set_pause_status: + input r0 as boolean.private; + assert.eq self.caller aleo1rhgdu77hgyqd3xjj8ucu3jj9r2krwz6mnzyd80gncr5fxcwlh5rsvzp9px; + async set_pause_status r0 into r1; + output r1 as test_usdcx_bridge.aleo/set_pause_status.future; + +finalize set_pause_status: + input r0 as boolean.public; + set r0 into paused[true]; + +function set_circle_attester: + input r0 as [u8; 20u32].private; + assert.eq self.caller aleo1rhgdu77hgyqd3xjj8ucu3jj9r2krwz6mnzyd80gncr5fxcwlh5rsvzp9px; + async set_circle_attester r0 into r1; + output r1 as test_usdcx_bridge.aleo/set_circle_attester.future; + +finalize set_circle_attester: + input r0 as [u8; 20u32].public; + set r0 into circle_attester[true]; + +function set_minimum_burn_amount: + input r0 as u128.private; + assert.eq self.caller aleo1rhgdu77hgyqd3xjj8ucu3jj9r2krwz6mnzyd80gncr5fxcwlh5rsvzp9px; + async set_minimum_burn_amount r0 into r1; + output r1 as test_usdcx_bridge.aleo/set_minimum_burn_amount.future; + +finalize set_minimum_burn_amount: + input r0 as u128.public; + set r0 into minimum_burn_amount[true]; + +function address_to_bytes_raw: + input r0 as address.private; + serialize.bits.raw r0 (address) into r1 ([boolean; 253u32]); + cast false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false into r2 as [boolean; 256u32]; + cast r1[0u32] r1[1u32] r1[2u32] r1[3u32] r1[4u32] r1[5u32] r1[6u32] r1[7u32] r1[8u32] r1[9u32] r1[10u32] r1[11u32] r1[12u32] r1[13u32] r1[14u32] r1[15u32] r1[16u32] r1[17u32] r1[18u32] r1[19u32] r1[20u32] r1[21u32] r1[22u32] r1[23u32] r1[24u32] r1[25u32] r1[26u32] r1[27u32] r1[28u32] r1[29u32] r1[30u32] r1[31u32] r1[32u32] r1[33u32] r1[34u32] r1[35u32] r1[36u32] r1[37u32] r1[38u32] r1[39u32] r1[40u32] r1[41u32] r1[42u32] r1[43u32] r1[44u32] r1[45u32] r1[46u32] r1[47u32] r1[48u32] r1[49u32] r1[50u32] r1[51u32] r1[52u32] r1[53u32] r1[54u32] r1[55u32] r1[56u32] r1[57u32] r1[58u32] r1[59u32] r1[60u32] r1[61u32] r1[62u32] r1[63u32] r1[64u32] r1[65u32] r1[66u32] r1[67u32] r1[68u32] r1[69u32] r1[70u32] r1[71u32] r1[72u32] r1[73u32] r1[74u32] r1[75u32] r1[76u32] r1[77u32] r1[78u32] r1[79u32] r1[80u32] r1[81u32] r1[82u32] r1[83u32] r1[84u32] r1[85u32] r1[86u32] r1[87u32] r1[88u32] r1[89u32] r1[90u32] r1[91u32] r1[92u32] r1[93u32] r1[94u32] r1[95u32] r1[96u32] r1[97u32] r1[98u32] r1[99u32] r1[100u32] r1[101u32] r1[102u32] r1[103u32] r1[104u32] r1[105u32] r1[106u32] r1[107u32] r1[108u32] r1[109u32] r1[110u32] r1[111u32] r1[112u32] r1[113u32] r1[114u32] r1[115u32] r1[116u32] r1[117u32] r1[118u32] r1[119u32] r1[120u32] r1[121u32] r1[122u32] r1[123u32] r1[124u32] r1[125u32] r1[126u32] r1[127u32] r1[128u32] r1[129u32] r1[130u32] r1[131u32] r1[132u32] r1[133u32] r1[134u32] r1[135u32] r1[136u32] r1[137u32] r1[138u32] r1[139u32] r1[140u32] r1[141u32] r1[142u32] r1[143u32] r1[144u32] r1[145u32] r1[146u32] r1[147u32] r1[148u32] r1[149u32] r1[150u32] r1[151u32] r1[152u32] r1[153u32] r1[154u32] r1[155u32] r1[156u32] r1[157u32] r1[158u32] r1[159u32] r1[160u32] r1[161u32] r1[162u32] r1[163u32] r1[164u32] r1[165u32] r1[166u32] r1[167u32] r1[168u32] r1[169u32] r1[170u32] r1[171u32] r1[172u32] r1[173u32] r1[174u32] r1[175u32] r1[176u32] r1[177u32] r1[178u32] r1[179u32] r1[180u32] r1[181u32] r1[182u32] r1[183u32] r1[184u32] r1[185u32] r1[186u32] r1[187u32] r1[188u32] r1[189u32] r1[190u32] r1[191u32] r1[192u32] r1[193u32] r1[194u32] r1[195u32] r1[196u32] r1[197u32] r1[198u32] r1[199u32] r1[200u32] r1[201u32] r1[202u32] r1[203u32] r1[204u32] r1[205u32] r1[206u32] r1[207u32] r1[208u32] r1[209u32] r1[210u32] r1[211u32] r1[212u32] r1[213u32] r1[214u32] r1[215u32] r1[216u32] r1[217u32] r1[218u32] r1[219u32] r1[220u32] r1[221u32] r1[222u32] r1[223u32] r1[224u32] r1[225u32] r1[226u32] r1[227u32] r1[228u32] r1[229u32] r1[230u32] r1[231u32] r1[232u32] r1[233u32] r1[234u32] r1[235u32] r1[236u32] r1[237u32] r1[238u32] r1[239u32] r1[240u32] r1[241u32] r1[242u32] r1[243u32] r1[244u32] r1[245u32] r1[246u32] r1[247u32] r1[248u32] r1[249u32] r1[250u32] r1[251u32] r1[252u32] r2[253u32] r2[254u32] r2[255u32] into r3 as [boolean; 256u32]; + deserialize.bits.raw r3 ([boolean; 256u32]) into r4 ([u8; 32u32]); + output r4 as [u8; 32u32].private; + +constructor: + gt edition 0u16 into r0; + branch.eq r0 false to end_then_0_2; + assert.eq program_owner aleo1rhgdu77hgyqd3xjj8ucu3jj9r2krwz6mnzyd80gncr5fxcwlh5rsvzp9px; + branch.eq true true to end_otherwise_0_3; + position end_then_0_2; + position end_otherwise_0_3; diff --git a/examples/private-mint/private-mint-wrapper/imports/test_usdcx_freezelist.aleo b/examples/private-mint/private-mint-wrapper/imports/test_usdcx_freezelist.aleo new file mode 100644 index 00000000..7c697e24 --- /dev/null +++ b/examples/private-mint/private-mint-wrapper/imports/test_usdcx_freezelist.aleo @@ -0,0 +1,213 @@ +import merkle_tree.aleo; +import test_usdcx_multisig_core.aleo; + +program test_usdcx_freezelist.aleo; + +struct ChecksumEdition: + checksum as [u8; 32u32]; + edition as u16; + +struct MerkleProof: + siblings as [field; 16u32]; + leaf_index as u32; + +struct WalletEcdsaSigner: + wallet_id as address; + ecdsa_signer as [u8; 20u32]; + +struct WalletSigningOpId: + wallet_id as address; + signing_op_id as field; + +struct AdminOp: + op as u8; + threshold as u8; + aleo_signer as address; + ecdsa_signer as [u8; 20u32]; + +mapping freeze_list: + key as address.public; + value as boolean.public; + +mapping freeze_list_index: + key as u32.public; + value as address.public; + +mapping freeze_list_last_index: + key as boolean.public; + value as u32.public; + +mapping freeze_list_root: + key as u8.public; + value as field.public; + +mapping root_updated_height: + key as boolean.public; + value as u32.public; + +mapping block_height_window: + key as boolean.public; + value as u32.public; + +mapping address_to_role: + key as address.public; + value as u16.public; + +function get_signing_op_id_for_deploy: + input r0 as [u8; 32u32].private; + input r1 as u16.private; + cast r0 r1 into r2 as ChecksumEdition; + hash.bhp256 r2 into r3 as field; + output r3 as field.private; + +function initialize: + input r0 as address.public; + input r1 as u32.public; + async initialize r0 self.caller r1 into r2; + output r2 as test_usdcx_freezelist.aleo/initialize.future; + +finalize initialize: + input r0 as address.public; + input r1 as address.public; + input r2 as u32.public; + contains freeze_list_root[1u8] into r3; + assert.eq r3 false; + assert.eq r1 aleo1rhgdu77hgyqd3xjj8ucu3jj9r2krwz6mnzyd80gncr5fxcwlh5rsvzp9px; + set 8u16 into address_to_role[r0]; + set r2 into block_height_window[true]; + set 0u32 into freeze_list_last_index[true]; + set 3642222252059314292809609689035560016959342421640560347114299934615987159853field into freeze_list_root[1u8]; + set false into freeze_list[aleo1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq3ljyzc]; + set aleo1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq3ljyzc into freeze_list_index[0u32]; + +function update_role: + input r0 as address.public; + input r1 as u16.private; + async update_role r0 self.caller r1 into r2; + output r2 as test_usdcx_freezelist.aleo/update_role.future; + +finalize update_role: + input r0 as address.public; + input r1 as address.public; + input r2 as u16.public; + get address_to_role[r1] into r3; + and r3 8u16 into r4; + is.eq r4 8u16 into r5; + assert.eq r5 true; + is.eq r1 r0 into r6; + branch.eq r6 false to end_then_0_0; + and r2 8u16 into r7; + is.eq r7 8u16 into r8; + assert.eq r8 true; + branch.eq true true to end_otherwise_0_1; + position end_then_0_0; + position end_otherwise_0_1; + set r2 into address_to_role[r0]; + +function update_block_height_window: + input r0 as u32.public; + async update_block_height_window r0 self.caller into r1; + output r1 as test_usdcx_freezelist.aleo/update_block_height_window.future; + +finalize update_block_height_window: + input r0 as u32.public; + input r1 as address.public; + get address_to_role[r1] into r2; + and r2 16u16 into r3; + is.eq r3 16u16 into r4; + assert.eq r4 true; + set r0 into block_height_window[true]; + +function update_freeze_list: + input r0 as address.public; + input r1 as boolean.public; + input r2 as u32.public; + input r3 as field.public; + input r4 as field.public; + async update_freeze_list r0 r1 r2 self.caller r3 r4 into r5; + output r5 as test_usdcx_freezelist.aleo/update_freeze_list.future; + +finalize update_freeze_list: + input r0 as address.public; + input r1 as boolean.public; + input r2 as u32.public; + input r3 as address.public; + input r4 as field.public; + input r5 as field.public; + get address_to_role[r3] into r6; + and r6 16u16 into r7; + is.eq r7 16u16 into r8; + assert.eq r8 true; + get freeze_list_root[1u8] into r9; + assert.eq r4 r9; + set r9 into freeze_list_root[2u8]; + set r5 into freeze_list_root[1u8]; + get.or_use freeze_list[r0] false into r10; + assert.neq r1 r10; + set r1 into freeze_list[r0]; + get.or_use freeze_list_index[r2] aleo1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq3ljyzc into r11; + branch.eq r1 false to end_then_0_2; + assert.eq r11 aleo1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq3ljyzc; + get freeze_list_last_index[true] into r12; + add r12 1u32 into r13; + gte r13 r2 into r14; + assert.eq r14 true; + lt r12 r2 into r15; + branch.eq r15 false to end_then_1_4; + set r2 into freeze_list_last_index[true]; + branch.eq true true to end_otherwise_1_5; + position end_then_1_4; + position end_otherwise_1_5; + set r0 into freeze_list_index[r2]; + branch.eq true true to end_otherwise_0_3; + position end_then_0_2; + assert.eq r11 r0; + set aleo1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq3ljyzc into freeze_list_index[r2]; + position end_otherwise_0_3; + set block.height into root_updated_height[true]; + +function verify_non_inclusion_pub: + input r0 as address.public; + async verify_non_inclusion_pub r0 into r1; + output r1 as test_usdcx_freezelist.aleo/verify_non_inclusion_pub.future; + +finalize verify_non_inclusion_pub: + input r0 as address.public; + get.or_use freeze_list[r0] false into r1; + assert.eq r1 false; + +function verify_non_inclusion_priv: + input r0 as address.private; + input r1 as [MerkleProof; 2u32].private; + call merkle_tree.aleo/verify_non_inclusion r0 r1 into r2; + async verify_non_inclusion_priv r2 into r3; + output r3 as test_usdcx_freezelist.aleo/verify_non_inclusion_priv.future; + +finalize verify_non_inclusion_priv: + input r0 as field.public; + get freeze_list_root[1u8] into r1; + is.neq r1 r0 into r2; + branch.eq r2 false to end_then_0_6; + get freeze_list_root[2u8] into r3; + assert.eq r0 r3; + get block_height_window[true] into r4; + get root_updated_height[true] into r5; + add r5 r4 into r6; + gt r6 block.height into r7; + assert.eq r7 true; + branch.eq true true to end_otherwise_0_7; + position end_then_0_6; + position end_otherwise_0_7; + +constructor: + is.eq edition 0u16 into r0; + branch.eq r0 false to end_then_0_8; + branch.eq true true to end_otherwise_0_9; + position end_then_0_8; + cast checksum edition into r1 as ChecksumEdition; + hash.bhp256 r1 into r2 as field; + cast test_usdcx_freezelist.aleo r2 into r3 as WalletSigningOpId; + hash.bhp256 r3 into r4 as field; + contains test_usdcx_multisig_core.aleo/completed_signing_ops[r4] into r5; + assert.eq r5 true; + position end_otherwise_0_9; diff --git a/examples/private-mint/private-mint-wrapper/imports/test_usdcx_multisig_core.aleo b/examples/private-mint/private-mint-wrapper/imports/test_usdcx_multisig_core.aleo new file mode 100644 index 00000000..e59a1490 --- /dev/null +++ b/examples/private-mint/private-mint-wrapper/imports/test_usdcx_multisig_core.aleo @@ -0,0 +1,846 @@ +program test_usdcx_multisig_core.aleo; + +struct ProgramSettings: + allow_upgrades as boolean; + upgrader_address as address; + guard_create_wallet as boolean; + +struct GuardedCreateWalletOp: + wallet_id as address; + threshold as u8; + aleo_signers as [address; 4u32]; + ecdsa_signers as [[u8; 20u32]; 4u32]; + +struct WalletAleoSigner: + wallet_id as address; + aleo_signer as address; + +struct WalletEcdsaSigner: + wallet_id as address; + ecdsa_signer as [u8; 20u32]; + +struct WalletSettings: + threshold as u8; + num_signers as u8; + +struct WalletSigningOpId: + wallet_id as address; + signing_op_id as field; + +struct WalletSigningOpIdNonce: + wallet_id as address; + signing_op_id as field; + nonce as u64; + +struct WalletSigningOp: + confirmations as u8; + initiated_at_block as u32; + expires_at_block as u32; + round as u32; + +struct SigningOpConfirmation: + wallet_signing_op_id_hash as field; + wallet_signer_hash as field; + +struct AdminOp: + op as u8; + threshold as u8; + aleo_signer as address; + ecdsa_signer as [u8; 20u32]; + +mapping program_settings_map: + key as boolean.public; + value as ProgramSettings.public; + +mapping signers_map: + key as field.public; + value as boolean.public; + +mapping wallets_map: + key as address.public; + value as WalletSettings.public; + +mapping pending_signing_ops: + key as field.public; + value as WalletSigningOp.public; + +mapping pending_signing_confirmations: + key as field.public; + value as u32.public; + +mapping completed_signing_ops: + key as field.public; + value as u32.public; + +mapping used_nonces: + key as field.public; + value as boolean.public; + +mapping pending_admin_ops: + key as field.public; + value as AdminOp.public; + +function init: + input r0 as address.private; + input r1 as boolean.private; + async init self.caller r0 r1 into r2; + output r2 as test_usdcx_multisig_core.aleo/init.future; + +finalize init: + input r0 as address.public; + input r1 as address.public; + input r2 as boolean.public; + assert.eq r0 aleo1cytp7hvkrcw7x2myhzh9qgyhfaelpgcykp5yppjr7zdzekqz5qrs2dd7h6; + contains program_settings_map[true] into r3; + not r3 into r4; + assert.eq r4 true; + cast true r1 r2 into r5 as ProgramSettings; + set r5 into program_settings_map[true]; + +function disallow_upgrades: + async disallow_upgrades self.caller into r0; + output r0 as test_usdcx_multisig_core.aleo/disallow_upgrades.future; + +finalize disallow_upgrades: + input r0 as address.public; + contains program_settings_map[true] into r1; + assert.eq r1 true; + get program_settings_map[true] into r2; + assert.eq r0 r2.upgrader_address; + cast false r2.upgrader_address r2.guard_create_wallet into r3 as ProgramSettings; + set r3 into program_settings_map[true]; + +function set_upgrader_address: + input r0 as address.private; + async set_upgrader_address self.caller r0 into r1; + output r1 as test_usdcx_multisig_core.aleo/set_upgrader_address.future; + +finalize set_upgrader_address: + input r0 as address.public; + input r1 as address.public; + contains program_settings_map[true] into r2; + assert.eq r2 true; + get program_settings_map[true] into r3; + assert.eq r0 r3.upgrader_address; + assert.eq r3.allow_upgrades true; + cast r3.allow_upgrades r1 r3.guard_create_wallet into r4 as ProgramSettings; + set r4 into program_settings_map[true]; + +function create_wallet: + input r0 as address.public; + input r1 as u8.public; + input r2 as [address; 4u32].private; + input r3 as [[u8; 20u32]; 4u32].private; + gt r1 0u8 into r4; + lte r1 8u8 into r5; + and r4 r5 into r6; + assert.eq r6 true; + cast r0 r2[0u32] into r7 as WalletAleoSigner; + hash.bhp256 r7 into r8 as field; + cast r0 r2[1u32] into r9 as WalletAleoSigner; + hash.bhp256 r9 into r10 as field; + cast r0 r2[2u32] into r11 as WalletAleoSigner; + hash.bhp256 r11 into r12 as field; + cast r0 r2[3u32] into r13 as WalletAleoSigner; + hash.bhp256 r13 into r14 as field; + cast r8 r10 r12 r14 into r15 as [field; 4u32]; + cast r0 r3[0u32] into r16 as WalletEcdsaSigner; + hash.bhp256 r16 into r17 as field; + cast r0 r3[1u32] into r18 as WalletEcdsaSigner; + hash.bhp256 r18 into r19 as field; + cast r0 r3[2u32] into r20 as WalletEcdsaSigner; + hash.bhp256 r20 into r21 as field; + cast r0 r3[3u32] into r22 as WalletEcdsaSigner; + hash.bhp256 r22 into r23 as field; + cast r17 r19 r21 r23 into r24 as [field; 4u32]; + async create_wallet r0 r1 r2 r3 self.caller r15 r24 into r25; + output r25 as test_usdcx_multisig_core.aleo/create_wallet.future; + +finalize create_wallet: + input r0 as address.public; + input r1 as u8.public; + input r2 as [address; 4u32].public; + input r3 as [[u8; 20u32]; 4u32].public; + input r4 as address.public; + input r5 as [field; 4u32].public; + input r6 as [field; 4u32].public; + contains program_settings_map[true] into r7; + assert.eq r7 true; + get program_settings_map[true] into r8; + is.neq r0 test_usdcx_multisig_core.aleo into r9; + and r8.guard_create_wallet r9 into r10; + branch.eq r10 false to end_then_0_0; + cast r0 r1 r2 r3 into r11 as GuardedCreateWalletOp; + hash.bhp256 r11 into r12 as field; + cast test_usdcx_multisig_core.aleo r12 into r13 as WalletSigningOpId; + hash.bhp256 r13 into r14 as field; + contains completed_signing_ops[r14] into r15; + assert.eq r15 true; + branch.eq true true to end_otherwise_0_1; + position end_then_0_0; + is.eq r0 test_usdcx_multisig_core.aleo into r16; + branch.eq r16 false to end_then_1_2; + assert.eq r4 aleo1cytp7hvkrcw7x2myhzh9qgyhfaelpgcykp5yppjr7zdzekqz5qrs2dd7h6; + branch.eq true true to end_otherwise_1_3; + position end_then_1_2; + position end_otherwise_1_3; + position end_otherwise_0_1; + contains wallets_map[r0] into r17; + not r17 into r18; + assert.eq r18 true; + cast r0 aleo1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq3ljyzc into r19 as WalletAleoSigner; + hash.bhp256 r19 into r20 as field; + cast 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 into r21 as [u8; 20u32]; + cast r0 r21 into r22 as WalletEcdsaSigner; + hash.bhp256 r22 into r23 as field; + is.neq r5[0u32] r20 into r24; + branch.eq r24 false to end_then_0_4; + contains signers_map[r5[0u32]] into r25; + not r25 into r26; + assert.eq r26 true; + set true into signers_map[r5[0u32]]; + branch.eq true true to end_otherwise_0_5; + position end_then_0_4; + position end_otherwise_0_5; + ternary r24 1u8 0u8 into r27; + add 0u8 r27 into r28; + is.neq r6[0u32] r23 into r29; + branch.eq r29 false to end_then_0_6; + contains signers_map[r6[0u32]] into r30; + not r30 into r31; + assert.eq r31 true; + set true into signers_map[r6[0u32]]; + branch.eq true true to end_otherwise_0_7; + position end_then_0_6; + position end_otherwise_0_7; + ternary r29 1u8 0u8 into r32; + add r28 r32 into r33; + is.neq r5[1u32] r20 into r34; + branch.eq r34 false to end_then_0_8; + contains signers_map[r5[1u32]] into r35; + not r35 into r36; + assert.eq r36 true; + set true into signers_map[r5[1u32]]; + branch.eq true true to end_otherwise_0_9; + position end_then_0_8; + position end_otherwise_0_9; + ternary r34 1u8 0u8 into r37; + add r33 r37 into r38; + is.neq r6[1u32] r23 into r39; + branch.eq r39 false to end_then_0_10; + contains signers_map[r6[1u32]] into r40; + not r40 into r41; + assert.eq r41 true; + set true into signers_map[r6[1u32]]; + branch.eq true true to end_otherwise_0_11; + position end_then_0_10; + position end_otherwise_0_11; + ternary r39 1u8 0u8 into r42; + add r38 r42 into r43; + is.neq r5[2u32] r20 into r44; + branch.eq r44 false to end_then_0_12; + contains signers_map[r5[2u32]] into r45; + not r45 into r46; + assert.eq r46 true; + set true into signers_map[r5[2u32]]; + branch.eq true true to end_otherwise_0_13; + position end_then_0_12; + position end_otherwise_0_13; + ternary r44 1u8 0u8 into r47; + add r43 r47 into r48; + is.neq r6[2u32] r23 into r49; + branch.eq r49 false to end_then_0_14; + contains signers_map[r6[2u32]] into r50; + not r50 into r51; + assert.eq r51 true; + set true into signers_map[r6[2u32]]; + branch.eq true true to end_otherwise_0_15; + position end_then_0_14; + position end_otherwise_0_15; + ternary r49 1u8 0u8 into r52; + add r48 r52 into r53; + is.neq r5[3u32] r20 into r54; + branch.eq r54 false to end_then_0_16; + contains signers_map[r5[3u32]] into r55; + not r55 into r56; + assert.eq r56 true; + set true into signers_map[r5[3u32]]; + branch.eq true true to end_otherwise_0_17; + position end_then_0_16; + position end_otherwise_0_17; + ternary r54 1u8 0u8 into r57; + add r53 r57 into r58; + is.neq r6[3u32] r23 into r59; + branch.eq r59 false to end_then_0_18; + contains signers_map[r6[3u32]] into r60; + not r60 into r61; + assert.eq r61 true; + set true into signers_map[r6[3u32]]; + branch.eq true true to end_otherwise_0_19; + position end_then_0_18; + position end_otherwise_0_19; + ternary r59 1u8 0u8 into r62; + add r58 r62 into r63; + gte r63 r1 into r64; + assert.eq r64 true; + cast r1 r63 into r65 as WalletSettings; + set r65 into wallets_map[r0]; + +function initiate_signing_op: + input r0 as address.public; + input r1 as field.public; + input r2 as u32.public; + gt r2 0u32 into r3; + assert.eq r3 true; + cast r0 r1 into r4 as WalletSigningOpId; + hash.bhp256 r4 into r5 as field; + cast r0 self.signer into r6 as WalletAleoSigner; + hash.bhp256 r6 into r7 as field; + cast 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 into r8 as [u8; 20u32]; + cast 0u8 0u8 aleo1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq3ljyzc r8 into r9 as AdminOp; + async initiate_signing_op r0 r5 r7 r2 r9 into r10; + output r5 as field.private; + output r10 as test_usdcx_multisig_core.aleo/initiate_signing_op.future; + +finalize initiate_signing_op: + input r0 as address.public; + input r1 as field.public; + input r2 as field.public; + input r3 as u32.public; + input r4 as AdminOp.public; + contains wallets_map[r0] into r5; + assert.eq r5 true; + contains completed_signing_ops[r1] into r6; + not r6 into r7; + assert.eq r7 true; + contains pending_signing_ops[r1] into r8; + not r8 into r9; + branch.eq r9 false to end_then_0_20; + cast 0u8 0u32 0u32 0u32 into r10 as WalletSigningOp; + set r10 into pending_signing_ops[r1]; + branch.eq true true to end_otherwise_0_21; + position end_then_0_20; + position end_otherwise_0_21; + get pending_signing_ops[r1] into r11; + lt r11.expires_at_block block.height into r12; + assert.eq r12 true; + is.eq r3 4294967295u32 into r13; + ternary r13 0u32 r3 into r14; + add block.height r14 into r15; + ternary r13 4294967295u32 r15 into r16; + add r11.round 1u32 into r17; + contains signers_map[r2] into r18; + branch.eq r18 false to end_then_0_22; + cast 1u8 block.height r16 r17 into r19 as WalletSigningOp; + set r19 into pending_signing_ops[r1]; + cast r1 r2 into r20 as SigningOpConfirmation; + hash.bhp256 r20 into r21 as field; + get.or_use pending_signing_confirmations[r21] 0u32 into r22; + gt r17 r22 into r23; + assert.eq r23 true; + set r17 into pending_signing_confirmations[r21]; + get wallets_map[r0] into r24; + gte 1u8 r24.threshold into r25; + branch.eq r25 false to end_then_1_24; + set block.height into completed_signing_ops[r1]; + branch.eq true true to end_otherwise_1_25; + position end_then_1_24; + position end_otherwise_1_25; + branch.eq true true to end_otherwise_0_23; + position end_then_0_22; + cast 0u8 block.height r16 r17 into r26 as WalletSigningOp; + set r26 into pending_signing_ops[r1]; + position end_otherwise_0_23; + contains pending_admin_ops[r1] into r27; + branch.eq r27 false to end_then_0_26; + get pending_admin_ops[r1] into r28; + assert.eq r4 r28; + branch.eq true true to end_otherwise_0_27; + position end_then_0_26; + set r4 into pending_admin_ops[r1]; + position end_otherwise_0_27; + +function sign: + input r0 as address.public; + input r1 as field.public; + cast r0 self.signer into r2 as WalletAleoSigner; + hash.bhp256 r2 into r3 as field; + async sign r0 r1 r3 0u32 into r4; + output r4 as test_usdcx_multisig_core.aleo/sign.future; + +finalize sign: + input r0 as address.public; + input r1 as field.public; + input r2 as field.public; + input r3 as u32.public; + contains wallets_map[r0] into r4; + assert.eq r4 true; + contains signers_map[r2] into r5; + assert.eq r5 true; + cast r0 r1 into r6 as WalletSigningOpId; + hash.bhp256 r6 into r7 as field; + contains pending_signing_ops[r7] into r8; + assert.eq r8 true; + get pending_signing_ops[r7] into r9; + lt r9.expires_at_block block.height into r10; + not r10 into r11; + assert.eq r11 true; + is.eq r3 0u32 into r12; + is.eq r3 r9.round into r13; + or r12 r13 into r14; + assert.eq r14 true; + cast r7 r2 into r15 as SigningOpConfirmation; + hash.bhp256 r15 into r16 as field; + get.or_use pending_signing_confirmations[r16] 0u32 into r17; + gt r9.round r17 into r18; + assert.eq r18 true; + set r9.round into pending_signing_confirmations[r16]; + add r9.confirmations 1u8 into r19; + cast r19 r9.initiated_at_block r9.expires_at_block r9.round into r20 as WalletSigningOp; + set r20 into pending_signing_ops[r7]; + get wallets_map[r0] into r21; + gte r20.confirmations r21.threshold into r22; + branch.eq r22 false to end_then_0_28; + set block.height into completed_signing_ops[r7]; + branch.eq true true to end_otherwise_0_29; + position end_then_0_28; + position end_otherwise_0_29; + +function sign_for_round: + input r0 as address.public; + input r1 as field.public; + input r2 as u32.public; + cast r0 self.signer into r3 as WalletAleoSigner; + hash.bhp256 r3 into r4 as field; + async sign_for_round r0 r1 r4 r2 into r5; + output r5 as test_usdcx_multisig_core.aleo/sign_for_round.future; + +finalize sign_for_round: + input r0 as address.public; + input r1 as field.public; + input r2 as field.public; + input r3 as u32.public; + contains wallets_map[r0] into r4; + assert.eq r4 true; + contains signers_map[r2] into r5; + assert.eq r5 true; + cast r0 r1 into r6 as WalletSigningOpId; + hash.bhp256 r6 into r7 as field; + contains pending_signing_ops[r7] into r8; + assert.eq r8 true; + get pending_signing_ops[r7] into r9; + lt r9.expires_at_block block.height into r10; + not r10 into r11; + assert.eq r11 true; + is.eq r3 0u32 into r12; + is.eq r3 r9.round into r13; + or r12 r13 into r14; + assert.eq r14 true; + cast r7 r2 into r15 as SigningOpConfirmation; + hash.bhp256 r15 into r16 as field; + get.or_use pending_signing_confirmations[r16] 0u32 into r17; + gt r9.round r17 into r18; + assert.eq r18 true; + set r9.round into pending_signing_confirmations[r16]; + add r9.confirmations 1u8 into r19; + cast r19 r9.initiated_at_block r9.expires_at_block r9.round into r20 as WalletSigningOp; + set r20 into pending_signing_ops[r7]; + get wallets_map[r0] into r21; + gte r20.confirmations r21.threshold into r22; + branch.eq r22 false to end_then_0_30; + set block.height into completed_signing_ops[r7]; + branch.eq true true to end_otherwise_0_31; + position end_then_0_30; + position end_otherwise_0_31; + +function sign_ecdsa: + input r0 as address.public; + input r1 as field.public; + input r2 as [u8; 20u32].public; + input r3 as [u8; 65u32].public; + input r4 as u64.public; + cast r0 r2 into r5 as WalletEcdsaSigner; + async sign_ecdsa r0 r1 r5 r3 r4 0u32 into r6; + output r6 as test_usdcx_multisig_core.aleo/sign_ecdsa.future; + +finalize sign_ecdsa: + input r0 as address.public; + input r1 as field.public; + input r2 as WalletEcdsaSigner.public; + input r3 as [u8; 65u32].public; + input r4 as u64.public; + input r5 as u32.public; + contains wallets_map[r0] into r6; + assert.eq r6 true; + hash.bhp256 r2 into r7 as field; + contains signers_map[r7] into r8; + assert.eq r8 true; + cast r0 r1 r4 into r9 as WalletSigningOpIdNonce; + hash.bhp256 r9 into r10 as field; + contains used_nonces[r10] into r11; + not r11 into r12; + assert.eq r12 true; + set true into used_nonces[r10]; + cast r0 r1 into r13 as WalletSigningOpId; + hash.bhp256 r13 into r14 as field; + contains pending_signing_ops[r14] into r15; + assert.eq r15 true; + get pending_signing_ops[r14] into r16; + lt r16.expires_at_block block.height into r17; + not r17 into r18; + assert.eq r18 true; + is.eq r5 0u32 into r19; + is.eq r5 r16.round into r20; + or r19 r20 into r21; + assert.eq r21 true; + serialize.bits.raw r10 (field) into r22 ([boolean; 253u32]); + cast false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false into r23 as [boolean; 256u32]; + cast r22[0u32] r22[1u32] r22[2u32] r22[3u32] r22[4u32] r22[5u32] r22[6u32] r22[7u32] r22[8u32] r22[9u32] r22[10u32] r22[11u32] r22[12u32] r22[13u32] r22[14u32] r22[15u32] r22[16u32] r22[17u32] r22[18u32] r22[19u32] r22[20u32] r22[21u32] r22[22u32] r22[23u32] r22[24u32] r22[25u32] r22[26u32] r22[27u32] r22[28u32] r22[29u32] r22[30u32] r22[31u32] r22[32u32] r22[33u32] r22[34u32] r22[35u32] r22[36u32] r22[37u32] r22[38u32] r22[39u32] r22[40u32] r22[41u32] r22[42u32] r22[43u32] r22[44u32] r22[45u32] r22[46u32] r22[47u32] r22[48u32] r22[49u32] r22[50u32] r22[51u32] r22[52u32] r22[53u32] r22[54u32] r22[55u32] r22[56u32] r22[57u32] r22[58u32] r22[59u32] r22[60u32] r22[61u32] r22[62u32] r22[63u32] r22[64u32] r22[65u32] r22[66u32] r22[67u32] r22[68u32] r22[69u32] r22[70u32] r22[71u32] r22[72u32] r22[73u32] r22[74u32] r22[75u32] r22[76u32] r22[77u32] r22[78u32] r22[79u32] r22[80u32] r22[81u32] r22[82u32] r22[83u32] r22[84u32] r22[85u32] r22[86u32] r22[87u32] r22[88u32] r22[89u32] r22[90u32] r22[91u32] r22[92u32] r22[93u32] r22[94u32] r22[95u32] r22[96u32] r22[97u32] r22[98u32] r22[99u32] r22[100u32] r22[101u32] r22[102u32] r22[103u32] r22[104u32] r22[105u32] r22[106u32] r22[107u32] r22[108u32] r22[109u32] r22[110u32] r22[111u32] r22[112u32] r22[113u32] r22[114u32] r22[115u32] r22[116u32] r22[117u32] r22[118u32] r22[119u32] r22[120u32] r22[121u32] r22[122u32] r22[123u32] r22[124u32] r22[125u32] r22[126u32] r22[127u32] r22[128u32] r22[129u32] r22[130u32] r22[131u32] r22[132u32] r22[133u32] r22[134u32] r22[135u32] r22[136u32] r22[137u32] r22[138u32] r22[139u32] r22[140u32] r22[141u32] r22[142u32] r22[143u32] r22[144u32] r22[145u32] r22[146u32] r22[147u32] r22[148u32] r22[149u32] r22[150u32] r22[151u32] r22[152u32] r22[153u32] r22[154u32] r22[155u32] r22[156u32] r22[157u32] r22[158u32] r22[159u32] r22[160u32] r22[161u32] r22[162u32] r22[163u32] r22[164u32] r22[165u32] r22[166u32] r22[167u32] r22[168u32] r22[169u32] r22[170u32] r22[171u32] r22[172u32] r22[173u32] r22[174u32] r22[175u32] r22[176u32] r22[177u32] r22[178u32] r22[179u32] r22[180u32] r22[181u32] r22[182u32] r22[183u32] r22[184u32] r22[185u32] r22[186u32] r22[187u32] r22[188u32] r22[189u32] r22[190u32] r22[191u32] r22[192u32] r22[193u32] r22[194u32] r22[195u32] r22[196u32] r22[197u32] r22[198u32] r22[199u32] r22[200u32] r22[201u32] r22[202u32] r22[203u32] r22[204u32] r22[205u32] r22[206u32] r22[207u32] r22[208u32] r22[209u32] r22[210u32] r22[211u32] r22[212u32] r22[213u32] r22[214u32] r22[215u32] r22[216u32] r22[217u32] r22[218u32] r22[219u32] r22[220u32] r22[221u32] r22[222u32] r22[223u32] r22[224u32] r22[225u32] r22[226u32] r22[227u32] r22[228u32] r22[229u32] r22[230u32] r22[231u32] r22[232u32] r22[233u32] r22[234u32] r22[235u32] r22[236u32] r22[237u32] r22[238u32] r22[239u32] r22[240u32] r22[241u32] r22[242u32] r22[243u32] r22[244u32] r22[245u32] r22[246u32] r22[247u32] r22[248u32] r22[249u32] r22[250u32] r22[251u32] r22[252u32] r23[253u32] r23[254u32] r23[255u32] into r24 as [boolean; 256u32]; + deserialize.bits.raw r24 ([boolean; 256u32]) into r25 ([u8; 32u32]); + cast 25u8 69u8 116u8 104u8 101u8 114u8 101u8 117u8 109u8 32u8 83u8 105u8 103u8 110u8 101u8 100u8 32u8 77u8 101u8 115u8 115u8 97u8 103u8 101u8 58u8 10u8 51u8 50u8 r25[0u32] r25[1u32] r25[2u32] r25[3u32] r25[4u32] r25[5u32] r25[6u32] r25[7u32] r25[8u32] r25[9u32] r25[10u32] r25[11u32] r25[12u32] r25[13u32] r25[14u32] r25[15u32] r25[16u32] r25[17u32] r25[18u32] r25[19u32] r25[20u32] r25[21u32] r25[22u32] r25[23u32] r25[24u32] r25[25u32] r25[26u32] r25[27u32] r25[28u32] r25[29u32] r25[30u32] r25[31u32] into r26 as [u8; 60u32]; + hash.keccak256.native.raw r26 into r27 as [boolean; 256u32]; + deserialize.bits.raw r27 ([boolean; 256u32]) into r28 ([u8; 32u32]); + ecdsa.verify.digest.eth r3 r2.ecdsa_signer r28 into r29; + assert.eq r29 true; + cast r14 r7 into r30 as SigningOpConfirmation; + hash.bhp256 r30 into r31 as field; + get.or_use pending_signing_confirmations[r31] 0u32 into r32; + gt r16.round r32 into r33; + assert.eq r33 true; + set r16.round into pending_signing_confirmations[r31]; + add r16.confirmations 1u8 into r34; + cast r34 r16.initiated_at_block r16.expires_at_block r16.round into r35 as WalletSigningOp; + set r35 into pending_signing_ops[r14]; + get wallets_map[r0] into r36; + gte r35.confirmations r36.threshold into r37; + branch.eq r37 false to end_then_0_32; + set block.height into completed_signing_ops[r14]; + branch.eq true true to end_otherwise_0_33; + position end_then_0_32; + position end_otherwise_0_33; + +function sign_ecdsa_for_round: + input r0 as address.public; + input r1 as field.public; + input r2 as [u8; 20u32].public; + input r3 as [u8; 65u32].public; + input r4 as u64.public; + input r5 as u32.public; + cast r0 r2 into r6 as WalletEcdsaSigner; + async sign_ecdsa_for_round r0 r1 r6 r3 r4 r5 into r7; + output r7 as test_usdcx_multisig_core.aleo/sign_ecdsa_for_round.future; + +finalize sign_ecdsa_for_round: + input r0 as address.public; + input r1 as field.public; + input r2 as WalletEcdsaSigner.public; + input r3 as [u8; 65u32].public; + input r4 as u64.public; + input r5 as u32.public; + contains wallets_map[r0] into r6; + assert.eq r6 true; + hash.bhp256 r2 into r7 as field; + contains signers_map[r7] into r8; + assert.eq r8 true; + cast r0 r1 r4 into r9 as WalletSigningOpIdNonce; + hash.bhp256 r9 into r10 as field; + contains used_nonces[r10] into r11; + not r11 into r12; + assert.eq r12 true; + set true into used_nonces[r10]; + cast r0 r1 into r13 as WalletSigningOpId; + hash.bhp256 r13 into r14 as field; + contains pending_signing_ops[r14] into r15; + assert.eq r15 true; + get pending_signing_ops[r14] into r16; + lt r16.expires_at_block block.height into r17; + not r17 into r18; + assert.eq r18 true; + is.eq r5 0u32 into r19; + is.eq r5 r16.round into r20; + or r19 r20 into r21; + assert.eq r21 true; + serialize.bits.raw r10 (field) into r22 ([boolean; 253u32]); + cast false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false false into r23 as [boolean; 256u32]; + cast r22[0u32] r22[1u32] r22[2u32] r22[3u32] r22[4u32] r22[5u32] r22[6u32] r22[7u32] r22[8u32] r22[9u32] r22[10u32] r22[11u32] r22[12u32] r22[13u32] r22[14u32] r22[15u32] r22[16u32] r22[17u32] r22[18u32] r22[19u32] r22[20u32] r22[21u32] r22[22u32] r22[23u32] r22[24u32] r22[25u32] r22[26u32] r22[27u32] r22[28u32] r22[29u32] r22[30u32] r22[31u32] r22[32u32] r22[33u32] r22[34u32] r22[35u32] r22[36u32] r22[37u32] r22[38u32] r22[39u32] r22[40u32] r22[41u32] r22[42u32] r22[43u32] r22[44u32] r22[45u32] r22[46u32] r22[47u32] r22[48u32] r22[49u32] r22[50u32] r22[51u32] r22[52u32] r22[53u32] r22[54u32] r22[55u32] r22[56u32] r22[57u32] r22[58u32] r22[59u32] r22[60u32] r22[61u32] r22[62u32] r22[63u32] r22[64u32] r22[65u32] r22[66u32] r22[67u32] r22[68u32] r22[69u32] r22[70u32] r22[71u32] r22[72u32] r22[73u32] r22[74u32] r22[75u32] r22[76u32] r22[77u32] r22[78u32] r22[79u32] r22[80u32] r22[81u32] r22[82u32] r22[83u32] r22[84u32] r22[85u32] r22[86u32] r22[87u32] r22[88u32] r22[89u32] r22[90u32] r22[91u32] r22[92u32] r22[93u32] r22[94u32] r22[95u32] r22[96u32] r22[97u32] r22[98u32] r22[99u32] r22[100u32] r22[101u32] r22[102u32] r22[103u32] r22[104u32] r22[105u32] r22[106u32] r22[107u32] r22[108u32] r22[109u32] r22[110u32] r22[111u32] r22[112u32] r22[113u32] r22[114u32] r22[115u32] r22[116u32] r22[117u32] r22[118u32] r22[119u32] r22[120u32] r22[121u32] r22[122u32] r22[123u32] r22[124u32] r22[125u32] r22[126u32] r22[127u32] r22[128u32] r22[129u32] r22[130u32] r22[131u32] r22[132u32] r22[133u32] r22[134u32] r22[135u32] r22[136u32] r22[137u32] r22[138u32] r22[139u32] r22[140u32] r22[141u32] r22[142u32] r22[143u32] r22[144u32] r22[145u32] r22[146u32] r22[147u32] r22[148u32] r22[149u32] r22[150u32] r22[151u32] r22[152u32] r22[153u32] r22[154u32] r22[155u32] r22[156u32] r22[157u32] r22[158u32] r22[159u32] r22[160u32] r22[161u32] r22[162u32] r22[163u32] r22[164u32] r22[165u32] r22[166u32] r22[167u32] r22[168u32] r22[169u32] r22[170u32] r22[171u32] r22[172u32] r22[173u32] r22[174u32] r22[175u32] r22[176u32] r22[177u32] r22[178u32] r22[179u32] r22[180u32] r22[181u32] r22[182u32] r22[183u32] r22[184u32] r22[185u32] r22[186u32] r22[187u32] r22[188u32] r22[189u32] r22[190u32] r22[191u32] r22[192u32] r22[193u32] r22[194u32] r22[195u32] r22[196u32] r22[197u32] r22[198u32] r22[199u32] r22[200u32] r22[201u32] r22[202u32] r22[203u32] r22[204u32] r22[205u32] r22[206u32] r22[207u32] r22[208u32] r22[209u32] r22[210u32] r22[211u32] r22[212u32] r22[213u32] r22[214u32] r22[215u32] r22[216u32] r22[217u32] r22[218u32] r22[219u32] r22[220u32] r22[221u32] r22[222u32] r22[223u32] r22[224u32] r22[225u32] r22[226u32] r22[227u32] r22[228u32] r22[229u32] r22[230u32] r22[231u32] r22[232u32] r22[233u32] r22[234u32] r22[235u32] r22[236u32] r22[237u32] r22[238u32] r22[239u32] r22[240u32] r22[241u32] r22[242u32] r22[243u32] r22[244u32] r22[245u32] r22[246u32] r22[247u32] r22[248u32] r22[249u32] r22[250u32] r22[251u32] r22[252u32] r23[253u32] r23[254u32] r23[255u32] into r24 as [boolean; 256u32]; + deserialize.bits.raw r24 ([boolean; 256u32]) into r25 ([u8; 32u32]); + cast 25u8 69u8 116u8 104u8 101u8 114u8 101u8 117u8 109u8 32u8 83u8 105u8 103u8 110u8 101u8 100u8 32u8 77u8 101u8 115u8 115u8 97u8 103u8 101u8 58u8 10u8 51u8 50u8 r25[0u32] r25[1u32] r25[2u32] r25[3u32] r25[4u32] r25[5u32] r25[6u32] r25[7u32] r25[8u32] r25[9u32] r25[10u32] r25[11u32] r25[12u32] r25[13u32] r25[14u32] r25[15u32] r25[16u32] r25[17u32] r25[18u32] r25[19u32] r25[20u32] r25[21u32] r25[22u32] r25[23u32] r25[24u32] r25[25u32] r25[26u32] r25[27u32] r25[28u32] r25[29u32] r25[30u32] r25[31u32] into r26 as [u8; 60u32]; + hash.keccak256.native.raw r26 into r27 as [boolean; 256u32]; + deserialize.bits.raw r27 ([boolean; 256u32]) into r28 ([u8; 32u32]); + ecdsa.verify.digest.eth r3 r2.ecdsa_signer r28 into r29; + assert.eq r29 true; + cast r14 r7 into r30 as SigningOpConfirmation; + hash.bhp256 r30 into r31 as field; + get.or_use pending_signing_confirmations[r31] 0u32 into r32; + gt r16.round r32 into r33; + assert.eq r33 true; + set r16.round into pending_signing_confirmations[r31]; + add r16.confirmations 1u8 into r34; + cast r34 r16.initiated_at_block r16.expires_at_block r16.round into r35 as WalletSigningOp; + set r35 into pending_signing_ops[r14]; + get wallets_map[r0] into r36; + gte r35.confirmations r36.threshold into r37; + branch.eq r37 false to end_then_0_34; + set block.height into completed_signing_ops[r14]; + branch.eq true true to end_otherwise_0_35; + position end_then_0_34; + position end_otherwise_0_35; + +closure assert_valid_admin_op: + input r0 as AdminOp; + is.eq r0.op 1u8 into r1; + not r1 into r2; + is.neq r0.threshold 0u8 into r3; + or r3 r2 into r4; + assert.eq r4 true; + is.eq r0.aleo_signer aleo1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq3ljyzc into r5; + or r5 r2 into r6; + assert.eq r6 true; + cast 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 into r7 as [u8; 20u32]; + is.eq r0.ecdsa_signer r7 into r8; + or r8 r2 into r9; + assert.eq r9 true; + is.eq r0.op 2u8 into r10; + is.eq r0.op 3u8 into r11; + or r10 r11 into r12; + and r2 r12 into r13; + not r13 into r14; + is.eq r0.threshold 0u8 into r15; + or r15 r14 into r16; + assert.eq r16 true; + is.eq r0.aleo_signer aleo1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq3ljyzc into r17; + is.eq r0.ecdsa_signer r7 into r18; + and r17 r18 into r19; + and r13 r19 into r20; + not r20 into r21; + or false r21 into r22; + assert.eq r22 true; + not r19 into r23; + is.neq r0.aleo_signer aleo1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq3ljyzc into r24; + is.neq r0.ecdsa_signer r7 into r25; + and r24 r25 into r26; + and r13 r23 into r27; + and r27 r26 into r28; + not r28 into r29; + or false r29 into r30; + assert.eq r30 true; + not r12 into r31; + and r2 r31 into r32; + not r32 into r33; + or false r33 into r34; + assert.eq r34 true; + +function init_admin_op: + input r0 as address.public; + input r1 as field.public; + input r2 as u32.public; + input r3 as AdminOp.private; + call assert_valid_admin_op r3; + cast r0 r1 into r4 as WalletSigningOpId; + hash.bhp256 r4 into r5 as field; + cast r0 self.signer into r6 as WalletAleoSigner; + hash.bhp256 r6 into r7 as field; + async init_admin_op r0 r5 r7 r2 r3 into r8; + output r5 as field.private; + output r8 as test_usdcx_multisig_core.aleo/init_admin_op.future; + +finalize init_admin_op: + input r0 as address.public; + input r1 as field.public; + input r2 as field.public; + input r3 as u32.public; + input r4 as AdminOp.public; + contains wallets_map[r0] into r5; + assert.eq r5 true; + contains completed_signing_ops[r1] into r6; + not r6 into r7; + assert.eq r7 true; + contains pending_signing_ops[r1] into r8; + not r8 into r9; + branch.eq r9 false to end_then_0_36; + cast 0u8 0u32 0u32 0u32 into r10 as WalletSigningOp; + set r10 into pending_signing_ops[r1]; + branch.eq true true to end_otherwise_0_37; + position end_then_0_36; + position end_otherwise_0_37; + get pending_signing_ops[r1] into r11; + lt r11.expires_at_block block.height into r12; + assert.eq r12 true; + is.eq r3 4294967295u32 into r13; + ternary r13 0u32 r3 into r14; + add block.height r14 into r15; + ternary r13 4294967295u32 r15 into r16; + add r11.round 1u32 into r17; + contains signers_map[r2] into r18; + branch.eq r18 false to end_then_0_38; + cast 1u8 block.height r16 r17 into r19 as WalletSigningOp; + set r19 into pending_signing_ops[r1]; + cast r1 r2 into r20 as SigningOpConfirmation; + hash.bhp256 r20 into r21 as field; + get.or_use pending_signing_confirmations[r21] 0u32 into r22; + gt r17 r22 into r23; + assert.eq r23 true; + set r17 into pending_signing_confirmations[r21]; + get wallets_map[r0] into r24; + gte 1u8 r24.threshold into r25; + branch.eq r25 false to end_then_1_40; + set block.height into completed_signing_ops[r1]; + branch.eq true true to end_otherwise_1_41; + position end_then_1_40; + position end_otherwise_1_41; + branch.eq true true to end_otherwise_0_39; + position end_then_0_38; + cast 0u8 block.height r16 r17 into r26 as WalletSigningOp; + set r26 into pending_signing_ops[r1]; + position end_otherwise_0_39; + contains pending_admin_ops[r1] into r27; + branch.eq r27 false to end_then_0_42; + get pending_admin_ops[r1] into r28; + assert.eq r4 r28; + branch.eq true true to end_otherwise_0_43; + position end_then_0_42; + set r4 into pending_admin_ops[r1]; + position end_otherwise_0_43; + +function exec_admin_op: + input r0 as address.public; + input r1 as field.public; + input r2 as AdminOp.private; + call assert_valid_admin_op r2; + cast r0 r1 into r3 as WalletSigningOpId; + hash.bhp256 r3 into r4 as field; + async exec_admin_op r0 r4 r2 into r5; + output r5 as test_usdcx_multisig_core.aleo/exec_admin_op.future; + +finalize exec_admin_op: + input r0 as address.public; + input r1 as field.public; + input r2 as AdminOp.public; + contains wallets_map[r0] into r3; + assert.eq r3 true; + contains completed_signing_ops[r1] into r4; + assert.eq r4 true; + get pending_admin_ops[r1] into r5; + assert.eq r5 r2; + remove pending_admin_ops[r1]; + get wallets_map[r0] into r6; + is.eq r2.op 1u8 into r7; + branch.eq r7 false to end_then_0_44; + lte r2.threshold r6.num_signers into r8; + assert.eq r8 true; + cast r2.threshold r6.num_signers into r9 as WalletSettings; + set r9 into wallets_map[r0]; + branch.eq true true to end_otherwise_0_45; + position end_then_0_44; + is.eq r2.op 2u8 into r10; + branch.eq r10 false to end_then_1_46; + is.eq r2.op 2u8 into r11; + is.eq r2.op 3u8 into r12; + or r11 r12 into r13; + assert.eq r13 true; + is.neq r2.aleo_signer aleo1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq3ljyzc into r14; + cast r0 r2.aleo_signer into r15 as WalletAleoSigner; + hash.bhp256 r15 into r16 as field; + ternary r14 r16 0field into r17; + cast 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 into r18 as [u8; 20u32]; + is.neq r2.ecdsa_signer r18 into r19; + not r19 into r20; + is.eq r17 0field into r21; + or r21 r20 into r22; + assert.eq r22 true; + cast r0 r2.ecdsa_signer into r23 as WalletEcdsaSigner; + hash.bhp256 r23 into r24 as field; + ternary r19 r24 r17 into r25; + assert.neq r25 0field; + contains signers_map[r25] into r26; + not r26 into r27; + assert.eq r27 true; + set true into signers_map[r25]; + add r6.num_signers 1u8 into r28; + cast r6.threshold r28 into r29 as WalletSettings; + set r29 into wallets_map[r0]; + branch.eq true true to end_otherwise_1_47; + position end_then_1_46; + is.eq r2.op 3u8 into r30; + branch.eq r30 false to end_then_2_48; + is.eq r2.op 2u8 into r31; + is.eq r2.op 3u8 into r32; + or r31 r32 into r33; + assert.eq r33 true; + is.neq r2.aleo_signer aleo1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq3ljyzc into r34; + cast r0 r2.aleo_signer into r35 as WalletAleoSigner; + hash.bhp256 r35 into r36 as field; + ternary r34 r36 0field into r37; + cast 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 0u8 into r38 as [u8; 20u32]; + is.neq r2.ecdsa_signer r38 into r39; + not r39 into r40; + is.eq r37 0field into r41; + or r41 r40 into r42; + assert.eq r42 true; + cast r0 r2.ecdsa_signer into r43 as WalletEcdsaSigner; + hash.bhp256 r43 into r44 as field; + ternary r39 r44 r37 into r45; + assert.neq r45 0field; + contains signers_map[r45] into r46; + assert.eq r46 true; + remove signers_map[r45]; + sub r6.num_signers 1u8 into r47; + gte r47 r6.threshold into r48; + assert.eq r48 true; + sub r6.num_signers 1u8 into r49; + cast r6.threshold r49 into r50 as WalletSettings; + set r50 into wallets_map[r0]; + branch.eq true true to end_otherwise_2_49; + position end_then_2_48; + assert.eq false true; + position end_otherwise_2_49; + position end_otherwise_1_47; + position end_otherwise_0_45; + +closure get_signing_op_id_hash_fn: + input r0 as address; + input r1 as field; + cast r0 r1 into r2 as WalletSigningOpId; + hash.bhp256 r2 into r3 as field; + output r3 as field; + +function get_signing_op_id_hash: + input r0 as address.public; + input r1 as field.public; + call get_signing_op_id_hash_fn r0 r1 into r2; + output r2 as field.private; + +function guarded_create_wallet_op_hash: + input r0 as address.public; + input r1 as u8.public; + input r2 as [address; 4u32].private; + input r3 as [[u8; 20u32]; 4u32].private; + cast r0 r1 r2 r3 into r4 as GuardedCreateWalletOp; + hash.bhp256 r4 into r5 as field; + output r5 as field.private; + +function assert_signing_completed: + input r0 as address.public; + input r1 as field.public; + async assert_signing_completed r0 r1 into r2; + output r2 as test_usdcx_multisig_core.aleo/assert_signing_completed.future; + +finalize assert_signing_completed: + input r0 as address.public; + input r1 as field.public; + cast r0 r1 into r2 as WalletSigningOpId; + hash.bhp256 r2 into r3 as field; + contains completed_signing_ops[r3] into r4; + assert.eq r4 true; + +constructor: + is.eq edition 0u16 into r0; + branch.eq r0 false to end_then_0_50; + branch.eq true true to end_otherwise_0_51; + position end_then_0_50; + contains program_settings_map[true] into r1; + assert.eq r1 true; + get program_settings_map[true] into r2; + assert.eq r2.allow_upgrades true; + assert.eq program_owner r2.upgrader_address; + position end_otherwise_0_51; diff --git a/examples/private-mint/private-mint-wrapper/imports/test_usdcx_stablecoin.aleo b/examples/private-mint/private-mint-wrapper/imports/test_usdcx_stablecoin.aleo new file mode 100644 index 00000000..893177e9 --- /dev/null +++ b/examples/private-mint/private-mint-wrapper/imports/test_usdcx_stablecoin.aleo @@ -0,0 +1,1832 @@ +import merkle_tree.aleo; +import test_usdcx_multisig_core.aleo; +import test_usdcx_freezelist.aleo; + +program test_usdcx_stablecoin.aleo; + +record Token: + owner as address.private; + amount as u128.private; + +record ComplianceRecord: + owner as address.private; + amount as u128.private; + sender as address.private; + recipient as address.private; + +record Credentials: + owner as address.private; + freeze_list_root as field.private; + +struct ChecksumEdition: + checksum as [u8; 32u32]; + edition as u16; + +struct TokenInfo: + name as u128; + symbol as u128; + decimals as u8; + supply as u128; + max_supply as u128; + +struct TokenAllowance: + account as address; + spender as address; + +struct MerkleProof: + siblings as [field; 16u32]; + leaf_index as u32; + +struct WalletEcdsaSigner: + wallet_id as address; + ecdsa_signer as [u8; 20u32]; + +struct WalletSigningOpId: + wallet_id as address; + signing_op_id as field; + +struct AdminOp: + op as u8; + threshold as u8; + aleo_signer as address; + ecdsa_signer as [u8; 20u32]; + +mapping token_info: + key as boolean.public; + value as TokenInfo.public; + +mapping balances: + key as address.public; + value as u128.public; + +mapping allowances: + key as field.public; + value as u128.public; + +mapping address_to_role: + key as address.public; + value as u16.public; + +mapping pause: + key as boolean.public; + value as boolean.public; + +function get_signing_op_id_for_deploy: + input r0 as [u8; 32u32].private; + input r1 as u16.private; + cast r0 r1 into r2 as ChecksumEdition; + hash.bhp256 r2 into r3 as field; + output r3 as field.private; + +function update_role: + input r0 as address.public; + input r1 as u16.private; + async update_role r0 self.caller r1 into r2; + output r2 as test_usdcx_stablecoin.aleo/update_role.future; + +finalize update_role: + input r0 as address.public; + input r1 as address.public; + input r2 as u16.public; + get address_to_role[r1] into r3; + and r3 8u16 into r4; + is.eq r4 8u16 into r5; + assert.eq r5 true; + is.eq r1 r0 into r6; + branch.eq r6 false to end_then_0_0; + and r2 8u16 into r7; + is.eq r7 8u16 into r8; + assert.eq r8 true; + branch.eq true true to end_otherwise_0_1; + position end_then_0_0; + position end_otherwise_0_1; + set r2 into address_to_role[r0]; + +function initialize: + input r0 as u128.public; + input r1 as u128.public; + input r2 as u8.public; + input r3 as u128.public; + input r4 as address.public; + async initialize r0 r1 r2 r3 r4 self.caller into r5; + output r5 as test_usdcx_stablecoin.aleo/initialize.future; + +finalize initialize: + input r0 as u128.public; + input r1 as u128.public; + input r2 as u8.public; + input r3 as u128.public; + input r4 as address.public; + input r5 as address.public; + contains token_info[true] into r6; + assert.eq r6 false; + assert.eq r5 aleo1rhgdu77hgyqd3xjj8ucu3jj9r2krwz6mnzyd80gncr5fxcwlh5rsvzp9px; + set 8u16 into address_to_role[r4]; + cast r0 r1 r2 0u128 r3 into r7 as TokenInfo; + set r7 into token_info[true]; + set false into pause[true]; + +function get_credentials: + input r0 as [MerkleProof; 2u32].private; + rem r0[0u32].leaf_index 2u32 into r1; + is.eq r1 0u32 into r2; + cast 1field r0[0u32].siblings[0u32] r0[0u32].siblings[1u32] into r3 as [field; 3u32]; + cast 1field r0[0u32].siblings[1u32] r0[0u32].siblings[0u32] into r4 as [field; 3u32]; + ternary r2 r3[0u32] r4[0u32] into r5; + ternary r2 r3[1u32] r4[1u32] into r6; + ternary r2 r3[2u32] r4[2u32] into r7; + cast r5 r6 r7 into r8 as [field; 3u32]; + hash.psd4 r8 into r9 as field; + is.eq r0[0u32].siblings[2u32] 0field into r10; + div r0[0u32].leaf_index 2u32 into r11; + rem r11 2u32 into r12; + is.eq r12 0u32 into r13; + cast 0field r9 r0[0u32].siblings[2u32] into r14 as [field; 3u32]; + cast 0field r0[0u32].siblings[2u32] r9 into r15 as [field; 3u32]; + ternary r13 r14[0u32] r15[0u32] into r16; + ternary r13 r14[1u32] r15[1u32] into r17; + ternary r13 r14[2u32] r15[2u32] into r18; + cast r16 r17 r18 into r19 as [field; 3u32]; + hash.psd4 r19 into r20 as field; + is.eq r0[0u32].siblings[3u32] 0field into r21; + div r0[0u32].leaf_index 4u32 into r22; + rem r22 2u32 into r23; + is.eq r23 0u32 into r24; + cast 0field r20 r0[0u32].siblings[3u32] into r25 as [field; 3u32]; + cast 0field r0[0u32].siblings[3u32] r20 into r26 as [field; 3u32]; + ternary r24 r25[0u32] r26[0u32] into r27; + ternary r24 r25[1u32] r26[1u32] into r28; + ternary r24 r25[2u32] r26[2u32] into r29; + cast r27 r28 r29 into r30 as [field; 3u32]; + hash.psd4 r30 into r31 as field; + is.eq r0[0u32].siblings[4u32] 0field into r32; + div r0[0u32].leaf_index 8u32 into r33; + rem r33 2u32 into r34; + is.eq r34 0u32 into r35; + cast 0field r31 r0[0u32].siblings[4u32] into r36 as [field; 3u32]; + cast 0field r0[0u32].siblings[4u32] r31 into r37 as [field; 3u32]; + ternary r35 r36[0u32] r37[0u32] into r38; + ternary r35 r36[1u32] r37[1u32] into r39; + ternary r35 r36[2u32] r37[2u32] into r40; + cast r38 r39 r40 into r41 as [field; 3u32]; + hash.psd4 r41 into r42 as field; + is.eq r0[0u32].siblings[5u32] 0field into r43; + div r0[0u32].leaf_index 16u32 into r44; + rem r44 2u32 into r45; + is.eq r45 0u32 into r46; + cast 0field r42 r0[0u32].siblings[5u32] into r47 as [field; 3u32]; + cast 0field r0[0u32].siblings[5u32] r42 into r48 as [field; 3u32]; + ternary r46 r47[0u32] r48[0u32] into r49; + ternary r46 r47[1u32] r48[1u32] into r50; + ternary r46 r47[2u32] r48[2u32] into r51; + cast r49 r50 r51 into r52 as [field; 3u32]; + hash.psd4 r52 into r53 as field; + is.eq r0[0u32].siblings[6u32] 0field into r54; + div r0[0u32].leaf_index 32u32 into r55; + rem r55 2u32 into r56; + is.eq r56 0u32 into r57; + cast 0field r53 r0[0u32].siblings[6u32] into r58 as [field; 3u32]; + cast 0field r0[0u32].siblings[6u32] r53 into r59 as [field; 3u32]; + ternary r57 r58[0u32] r59[0u32] into r60; + ternary r57 r58[1u32] r59[1u32] into r61; + ternary r57 r58[2u32] r59[2u32] into r62; + cast r60 r61 r62 into r63 as [field; 3u32]; + hash.psd4 r63 into r64 as field; + is.eq r0[0u32].siblings[7u32] 0field into r65; + div r0[0u32].leaf_index 64u32 into r66; + rem r66 2u32 into r67; + is.eq r67 0u32 into r68; + cast 0field r64 r0[0u32].siblings[7u32] into r69 as [field; 3u32]; + cast 0field r0[0u32].siblings[7u32] r64 into r70 as [field; 3u32]; + ternary r68 r69[0u32] r70[0u32] into r71; + ternary r68 r69[1u32] r70[1u32] into r72; + ternary r68 r69[2u32] r70[2u32] into r73; + cast r71 r72 r73 into r74 as [field; 3u32]; + hash.psd4 r74 into r75 as field; + is.eq r0[0u32].siblings[8u32] 0field into r76; + div r0[0u32].leaf_index 128u32 into r77; + rem r77 2u32 into r78; + is.eq r78 0u32 into r79; + cast 0field r75 r0[0u32].siblings[8u32] into r80 as [field; 3u32]; + cast 0field r0[0u32].siblings[8u32] r75 into r81 as [field; 3u32]; + ternary r79 r80[0u32] r81[0u32] into r82; + ternary r79 r80[1u32] r81[1u32] into r83; + ternary r79 r80[2u32] r81[2u32] into r84; + cast r82 r83 r84 into r85 as [field; 3u32]; + hash.psd4 r85 into r86 as field; + is.eq r0[0u32].siblings[9u32] 0field into r87; + div r0[0u32].leaf_index 256u32 into r88; + rem r88 2u32 into r89; + is.eq r89 0u32 into r90; + cast 0field r86 r0[0u32].siblings[9u32] into r91 as [field; 3u32]; + cast 0field r0[0u32].siblings[9u32] r86 into r92 as [field; 3u32]; + ternary r90 r91[0u32] r92[0u32] into r93; + ternary r90 r91[1u32] r92[1u32] into r94; + ternary r90 r91[2u32] r92[2u32] into r95; + cast r93 r94 r95 into r96 as [field; 3u32]; + hash.psd4 r96 into r97 as field; + is.eq r0[0u32].siblings[10u32] 0field into r98; + div r0[0u32].leaf_index 512u32 into r99; + rem r99 2u32 into r100; + is.eq r100 0u32 into r101; + cast 0field r97 r0[0u32].siblings[10u32] into r102 as [field; 3u32]; + cast 0field r0[0u32].siblings[10u32] r97 into r103 as [field; 3u32]; + ternary r101 r102[0u32] r103[0u32] into r104; + ternary r101 r102[1u32] r103[1u32] into r105; + ternary r101 r102[2u32] r103[2u32] into r106; + cast r104 r105 r106 into r107 as [field; 3u32]; + hash.psd4 r107 into r108 as field; + is.eq r0[0u32].siblings[11u32] 0field into r109; + div r0[0u32].leaf_index 1024u32 into r110; + rem r110 2u32 into r111; + is.eq r111 0u32 into r112; + cast 0field r108 r0[0u32].siblings[11u32] into r113 as [field; 3u32]; + cast 0field r0[0u32].siblings[11u32] r108 into r114 as [field; 3u32]; + ternary r112 r113[0u32] r114[0u32] into r115; + ternary r112 r113[1u32] r114[1u32] into r116; + ternary r112 r113[2u32] r114[2u32] into r117; + cast r115 r116 r117 into r118 as [field; 3u32]; + hash.psd4 r118 into r119 as field; + is.eq r0[0u32].siblings[12u32] 0field into r120; + div r0[0u32].leaf_index 2048u32 into r121; + rem r121 2u32 into r122; + is.eq r122 0u32 into r123; + cast 0field r119 r0[0u32].siblings[12u32] into r124 as [field; 3u32]; + cast 0field r0[0u32].siblings[12u32] r119 into r125 as [field; 3u32]; + ternary r123 r124[0u32] r125[0u32] into r126; + ternary r123 r124[1u32] r125[1u32] into r127; + ternary r123 r124[2u32] r125[2u32] into r128; + cast r126 r127 r128 into r129 as [field; 3u32]; + hash.psd4 r129 into r130 as field; + is.eq r0[0u32].siblings[13u32] 0field into r131; + div r0[0u32].leaf_index 4096u32 into r132; + rem r132 2u32 into r133; + is.eq r133 0u32 into r134; + cast 0field r130 r0[0u32].siblings[13u32] into r135 as [field; 3u32]; + cast 0field r0[0u32].siblings[13u32] r130 into r136 as [field; 3u32]; + ternary r134 r135[0u32] r136[0u32] into r137; + ternary r134 r135[1u32] r136[1u32] into r138; + ternary r134 r135[2u32] r136[2u32] into r139; + cast r137 r138 r139 into r140 as [field; 3u32]; + hash.psd4 r140 into r141 as field; + is.eq r0[0u32].siblings[14u32] 0field into r142; + div r0[0u32].leaf_index 8192u32 into r143; + rem r143 2u32 into r144; + is.eq r144 0u32 into r145; + cast 0field r141 r0[0u32].siblings[14u32] into r146 as [field; 3u32]; + cast 0field r0[0u32].siblings[14u32] r141 into r147 as [field; 3u32]; + ternary r145 r146[0u32] r147[0u32] into r148; + ternary r145 r146[1u32] r147[1u32] into r149; + ternary r145 r146[2u32] r147[2u32] into r150; + cast r148 r149 r150 into r151 as [field; 3u32]; + hash.psd4 r151 into r152 as field; + is.eq r0[0u32].siblings[15u32] 0field into r153; + div r0[0u32].leaf_index 16384u32 into r154; + rem r154 2u32 into r155; + is.eq r155 0u32 into r156; + cast 0field r152 r0[0u32].siblings[15u32] into r157 as [field; 3u32]; + cast 0field r0[0u32].siblings[15u32] r152 into r158 as [field; 3u32]; + ternary r156 r157[0u32] r158[0u32] into r159; + ternary r156 r157[1u32] r158[1u32] into r160; + ternary r156 r157[2u32] r158[2u32] into r161; + cast r159 r160 r161 into r162 as [field; 3u32]; + hash.psd4 r162 into r163 as field; + ternary r153 r152 r163 into r164; + ternary r153 14u32 15u32 into r165; + ternary r142 r141 r164 into r166; + ternary r142 13u32 r165 into r167; + ternary r131 r130 r166 into r168; + ternary r131 12u32 r167 into r169; + ternary r120 r119 r168 into r170; + ternary r120 11u32 r169 into r171; + ternary r109 r108 r170 into r172; + ternary r109 10u32 r171 into r173; + ternary r98 r97 r172 into r174; + ternary r98 9u32 r173 into r175; + ternary r87 r86 r174 into r176; + ternary r87 8u32 r175 into r177; + ternary r76 r75 r176 into r178; + ternary r76 7u32 r177 into r179; + ternary r65 r64 r178 into r180; + ternary r65 6u32 r179 into r181; + ternary r54 r53 r180 into r182; + ternary r54 5u32 r181 into r183; + ternary r43 r42 r182 into r184; + ternary r43 4u32 r183 into r185; + ternary r32 r31 r184 into r186; + ternary r32 3u32 r185 into r187; + ternary r21 r20 r186 into r188; + ternary r21 2u32 r187 into r189; + ternary r10 r9 r188 into r190; + ternary r10 1u32 r189 into r191; + rem r0[1u32].leaf_index 2u32 into r192; + is.eq r192 0u32 into r193; + cast 1field r0[1u32].siblings[0u32] r0[1u32].siblings[1u32] into r194 as [field; 3u32]; + cast 1field r0[1u32].siblings[1u32] r0[1u32].siblings[0u32] into r195 as [field; 3u32]; + ternary r193 r194[0u32] r195[0u32] into r196; + ternary r193 r194[1u32] r195[1u32] into r197; + ternary r193 r194[2u32] r195[2u32] into r198; + cast r196 r197 r198 into r199 as [field; 3u32]; + hash.psd4 r199 into r200 as field; + is.eq r0[1u32].siblings[2u32] 0field into r201; + div r0[1u32].leaf_index 2u32 into r202; + rem r202 2u32 into r203; + is.eq r203 0u32 into r204; + cast 0field r200 r0[1u32].siblings[2u32] into r205 as [field; 3u32]; + cast 0field r0[1u32].siblings[2u32] r200 into r206 as [field; 3u32]; + ternary r204 r205[0u32] r206[0u32] into r207; + ternary r204 r205[1u32] r206[1u32] into r208; + ternary r204 r205[2u32] r206[2u32] into r209; + cast r207 r208 r209 into r210 as [field; 3u32]; + hash.psd4 r210 into r211 as field; + is.eq r0[1u32].siblings[3u32] 0field into r212; + div r0[1u32].leaf_index 4u32 into r213; + rem r213 2u32 into r214; + is.eq r214 0u32 into r215; + cast 0field r211 r0[1u32].siblings[3u32] into r216 as [field; 3u32]; + cast 0field r0[1u32].siblings[3u32] r211 into r217 as [field; 3u32]; + ternary r215 r216[0u32] r217[0u32] into r218; + ternary r215 r216[1u32] r217[1u32] into r219; + ternary r215 r216[2u32] r217[2u32] into r220; + cast r218 r219 r220 into r221 as [field; 3u32]; + hash.psd4 r221 into r222 as field; + is.eq r0[1u32].siblings[4u32] 0field into r223; + div r0[1u32].leaf_index 8u32 into r224; + rem r224 2u32 into r225; + is.eq r225 0u32 into r226; + cast 0field r222 r0[1u32].siblings[4u32] into r227 as [field; 3u32]; + cast 0field r0[1u32].siblings[4u32] r222 into r228 as [field; 3u32]; + ternary r226 r227[0u32] r228[0u32] into r229; + ternary r226 r227[1u32] r228[1u32] into r230; + ternary r226 r227[2u32] r228[2u32] into r231; + cast r229 r230 r231 into r232 as [field; 3u32]; + hash.psd4 r232 into r233 as field; + is.eq r0[1u32].siblings[5u32] 0field into r234; + div r0[1u32].leaf_index 16u32 into r235; + rem r235 2u32 into r236; + is.eq r236 0u32 into r237; + cast 0field r233 r0[1u32].siblings[5u32] into r238 as [field; 3u32]; + cast 0field r0[1u32].siblings[5u32] r233 into r239 as [field; 3u32]; + ternary r237 r238[0u32] r239[0u32] into r240; + ternary r237 r238[1u32] r239[1u32] into r241; + ternary r237 r238[2u32] r239[2u32] into r242; + cast r240 r241 r242 into r243 as [field; 3u32]; + hash.psd4 r243 into r244 as field; + is.eq r0[1u32].siblings[6u32] 0field into r245; + div r0[1u32].leaf_index 32u32 into r246; + rem r246 2u32 into r247; + is.eq r247 0u32 into r248; + cast 0field r244 r0[1u32].siblings[6u32] into r249 as [field; 3u32]; + cast 0field r0[1u32].siblings[6u32] r244 into r250 as [field; 3u32]; + ternary r248 r249[0u32] r250[0u32] into r251; + ternary r248 r249[1u32] r250[1u32] into r252; + ternary r248 r249[2u32] r250[2u32] into r253; + cast r251 r252 r253 into r254 as [field; 3u32]; + hash.psd4 r254 into r255 as field; + is.eq r0[1u32].siblings[7u32] 0field into r256; + div r0[1u32].leaf_index 64u32 into r257; + rem r257 2u32 into r258; + is.eq r258 0u32 into r259; + cast 0field r255 r0[1u32].siblings[7u32] into r260 as [field; 3u32]; + cast 0field r0[1u32].siblings[7u32] r255 into r261 as [field; 3u32]; + ternary r259 r260[0u32] r261[0u32] into r262; + ternary r259 r260[1u32] r261[1u32] into r263; + ternary r259 r260[2u32] r261[2u32] into r264; + cast r262 r263 r264 into r265 as [field; 3u32]; + hash.psd4 r265 into r266 as field; + is.eq r0[1u32].siblings[8u32] 0field into r267; + div r0[1u32].leaf_index 128u32 into r268; + rem r268 2u32 into r269; + is.eq r269 0u32 into r270; + cast 0field r266 r0[1u32].siblings[8u32] into r271 as [field; 3u32]; + cast 0field r0[1u32].siblings[8u32] r266 into r272 as [field; 3u32]; + ternary r270 r271[0u32] r272[0u32] into r273; + ternary r270 r271[1u32] r272[1u32] into r274; + ternary r270 r271[2u32] r272[2u32] into r275; + cast r273 r274 r275 into r276 as [field; 3u32]; + hash.psd4 r276 into r277 as field; + is.eq r0[1u32].siblings[9u32] 0field into r278; + div r0[1u32].leaf_index 256u32 into r279; + rem r279 2u32 into r280; + is.eq r280 0u32 into r281; + cast 0field r277 r0[1u32].siblings[9u32] into r282 as [field; 3u32]; + cast 0field r0[1u32].siblings[9u32] r277 into r283 as [field; 3u32]; + ternary r281 r282[0u32] r283[0u32] into r284; + ternary r281 r282[1u32] r283[1u32] into r285; + ternary r281 r282[2u32] r283[2u32] into r286; + cast r284 r285 r286 into r287 as [field; 3u32]; + hash.psd4 r287 into r288 as field; + is.eq r0[1u32].siblings[10u32] 0field into r289; + div r0[1u32].leaf_index 512u32 into r290; + rem r290 2u32 into r291; + is.eq r291 0u32 into r292; + cast 0field r288 r0[1u32].siblings[10u32] into r293 as [field; 3u32]; + cast 0field r0[1u32].siblings[10u32] r288 into r294 as [field; 3u32]; + ternary r292 r293[0u32] r294[0u32] into r295; + ternary r292 r293[1u32] r294[1u32] into r296; + ternary r292 r293[2u32] r294[2u32] into r297; + cast r295 r296 r297 into r298 as [field; 3u32]; + hash.psd4 r298 into r299 as field; + is.eq r0[1u32].siblings[11u32] 0field into r300; + div r0[1u32].leaf_index 1024u32 into r301; + rem r301 2u32 into r302; + is.eq r302 0u32 into r303; + cast 0field r299 r0[1u32].siblings[11u32] into r304 as [field; 3u32]; + cast 0field r0[1u32].siblings[11u32] r299 into r305 as [field; 3u32]; + ternary r303 r304[0u32] r305[0u32] into r306; + ternary r303 r304[1u32] r305[1u32] into r307; + ternary r303 r304[2u32] r305[2u32] into r308; + cast r306 r307 r308 into r309 as [field; 3u32]; + hash.psd4 r309 into r310 as field; + is.eq r0[1u32].siblings[12u32] 0field into r311; + div r0[1u32].leaf_index 2048u32 into r312; + rem r312 2u32 into r313; + is.eq r313 0u32 into r314; + cast 0field r310 r0[1u32].siblings[12u32] into r315 as [field; 3u32]; + cast 0field r0[1u32].siblings[12u32] r310 into r316 as [field; 3u32]; + ternary r314 r315[0u32] r316[0u32] into r317; + ternary r314 r315[1u32] r316[1u32] into r318; + ternary r314 r315[2u32] r316[2u32] into r319; + cast r317 r318 r319 into r320 as [field; 3u32]; + hash.psd4 r320 into r321 as field; + is.eq r0[1u32].siblings[13u32] 0field into r322; + div r0[1u32].leaf_index 4096u32 into r323; + rem r323 2u32 into r324; + is.eq r324 0u32 into r325; + cast 0field r321 r0[1u32].siblings[13u32] into r326 as [field; 3u32]; + cast 0field r0[1u32].siblings[13u32] r321 into r327 as [field; 3u32]; + ternary r325 r326[0u32] r327[0u32] into r328; + ternary r325 r326[1u32] r327[1u32] into r329; + ternary r325 r326[2u32] r327[2u32] into r330; + cast r328 r329 r330 into r331 as [field; 3u32]; + hash.psd4 r331 into r332 as field; + is.eq r0[1u32].siblings[14u32] 0field into r333; + div r0[1u32].leaf_index 8192u32 into r334; + rem r334 2u32 into r335; + is.eq r335 0u32 into r336; + cast 0field r332 r0[1u32].siblings[14u32] into r337 as [field; 3u32]; + cast 0field r0[1u32].siblings[14u32] r332 into r338 as [field; 3u32]; + ternary r336 r337[0u32] r338[0u32] into r339; + ternary r336 r337[1u32] r338[1u32] into r340; + ternary r336 r337[2u32] r338[2u32] into r341; + cast r339 r340 r341 into r342 as [field; 3u32]; + hash.psd4 r342 into r343 as field; + is.eq r0[1u32].siblings[15u32] 0field into r344; + div r0[1u32].leaf_index 16384u32 into r345; + rem r345 2u32 into r346; + is.eq r346 0u32 into r347; + cast 0field r343 r0[1u32].siblings[15u32] into r348 as [field; 3u32]; + cast 0field r0[1u32].siblings[15u32] r343 into r349 as [field; 3u32]; + ternary r347 r348[0u32] r349[0u32] into r350; + ternary r347 r348[1u32] r349[1u32] into r351; + ternary r347 r348[2u32] r349[2u32] into r352; + cast r350 r351 r352 into r353 as [field; 3u32]; + hash.psd4 r353 into r354 as field; + ternary r344 r343 r354 into r355; + ternary r344 14u32 15u32 into r356; + ternary r333 r332 r355 into r357; + ternary r333 13u32 r356 into r358; + ternary r322 r321 r357 into r359; + ternary r322 12u32 r358 into r360; + ternary r311 r310 r359 into r361; + ternary r311 11u32 r360 into r362; + ternary r300 r299 r361 into r363; + ternary r300 10u32 r362 into r364; + ternary r289 r288 r363 into r365; + ternary r289 9u32 r364 into r366; + ternary r278 r277 r365 into r367; + ternary r278 8u32 r366 into r368; + ternary r267 r266 r367 into r369; + ternary r267 7u32 r368 into r370; + ternary r256 r255 r369 into r371; + ternary r256 6u32 r370 into r372; + ternary r245 r244 r371 into r373; + ternary r245 5u32 r372 into r374; + ternary r234 r233 r373 into r375; + ternary r234 4u32 r374 into r376; + ternary r223 r222 r375 into r377; + ternary r223 3u32 r376 into r378; + ternary r212 r211 r377 into r379; + ternary r212 2u32 r378 into r380; + ternary r201 r200 r379 into r381; + ternary r201 1u32 r380 into r382; + assert.eq r190 r381; + assert.eq r191 r382; + cast self.signer into r383 as field; + is.eq r0[0u32].leaf_index r0[1u32].leaf_index into r384; + is.eq r0[0u32].leaf_index 0u32 into r385; + lt r383 r0[0u32].siblings[0u32] into r386; + and r384 r385 into r387; + not r387 into r388; + or r386 r388 into r389; + assert.eq r389 true; + not r385 into r390; + pow 2u32 r191 into r391; + sub r391 1u32 into r392; + and r384 r390 into r393; + not r393 into r394; + is.eq r0[0u32].leaf_index r392 into r395; + or r395 r394 into r396; + assert.eq r396 true; + gt r383 r0[0u32].siblings[0u32] into r397; + or r397 r394 into r398; + assert.eq r398 true; + not r384 into r399; + gt r383 r0[0u32].siblings[0u32] into r400; + not r399 into r401; + or r400 r401 into r402; + assert.eq r402 true; + lt r383 r0[1u32].siblings[0u32] into r403; + or r403 r401 into r404; + assert.eq r404 true; + lte r0[1u32].leaf_index r392 into r405; + or r405 r401 into r406; + assert.eq r406 true; + add r0[0u32].leaf_index 1u32 into r407; + is.eq r407 r0[1u32].leaf_index into r408; + or r408 r401 into r409; + assert.eq r409 true; + cast self.signer r190 into r410 as Credentials.record; + async get_credentials r190 into r411; + output r410 as Credentials.record; + output r411 as test_usdcx_stablecoin.aleo/get_credentials.future; + +finalize get_credentials: + input r0 as field.public; + get test_usdcx_freezelist.aleo/freeze_list_root[1u8] into r1; + get test_usdcx_freezelist.aleo/block_height_window[true] into r2; + is.neq r1 r0 into r3; + branch.eq r3 false to end_then_0_2; + get test_usdcx_freezelist.aleo/freeze_list_root[2u8] into r4; + assert.eq r0 r4; + get test_usdcx_freezelist.aleo/root_updated_height[true] into r5; + add r5 r2 into r6; + gt r6 block.height into r7; + assert.eq r7 true; + branch.eq true true to end_otherwise_0_3; + position end_then_0_2; + position end_otherwise_0_3; + +function mint_public: + input r0 as address.public; + input r1 as u128.public; + async mint_public r0 r1 self.caller into r2; + output r2 as test_usdcx_stablecoin.aleo/mint_public.future; + +finalize mint_public: + input r0 as address.public; + input r1 as u128.public; + input r2 as address.public; + get address_to_role[r2] into r3; + and r3 1u16 into r4; + is.eq r4 1u16 into r5; + assert.eq r5 true; + get pause[true] into r6; + assert.eq r6 false; + get token_info[true] into r7; + add r7.supply r1 into r8; + lte r8 r7.max_supply into r9; + assert.eq r9 true; + get.or_use balances[r0] 0u128 into r10; + add r1 r10 into r11; + set r11 into balances[r0]; + cast r7.name r7.symbol r7.decimals r8 r7.max_supply into r12 as TokenInfo; + set r12 into token_info[true]; + +function mint_private: + input r0 as address.private; + input r1 as u128.public; + cast r0 r1 into r2 as Token.record; + cast aleo1mnldqsfrwayzfep3t9zusu4y7yknsdhfwx76v5pajla35mrqn5xsvvurhy r1 aleo1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq3ljyzc r0 into r3 as ComplianceRecord.record; + async mint_private r1 self.caller into r4; + output r3 as ComplianceRecord.record; + output r2 as Token.record; + output r4 as test_usdcx_stablecoin.aleo/mint_private.future; + +finalize mint_private: + input r0 as u128.public; + input r1 as address.public; + get address_to_role[r1] into r2; + and r2 1u16 into r3; + is.eq r3 1u16 into r4; + assert.eq r4 true; + get pause[true] into r5; + assert.eq r5 false; + get token_info[true] into r6; + add r6.supply r0 into r7; + lte r7 r6.max_supply into r8; + assert.eq r8 true; + cast r6.name r6.symbol r6.decimals r7 r6.max_supply into r9 as TokenInfo; + set r9 into token_info[true]; + +function burn_public: + input r0 as address.public; + input r1 as u128.public; + async burn_public r0 r1 self.caller into r2; + output r2 as test_usdcx_stablecoin.aleo/burn_public.future; + +finalize burn_public: + input r0 as address.public; + input r1 as u128.public; + input r2 as address.public; + get address_to_role[r2] into r3; + and r3 2u16 into r4; + is.eq r4 2u16 into r5; + assert.eq r5 true; + get pause[true] into r6; + assert.eq r6 false; + get balances[r0] into r7; + sub r7 r1 into r8; + set r8 into balances[r0]; + get token_info[true] into r9; + sub r9.supply r1 into r10; + cast r9.name r9.symbol r9.decimals r10 r9.max_supply into r11 as TokenInfo; + set r11 into token_info[true]; + +function burn_private: + input r0 as Token.record; + input r1 as u128.public; + sub r0.amount r1 into r2; + cast r0.owner r2 into r3 as Token.record; + cast aleo1mnldqsfrwayzfep3t9zusu4y7yknsdhfwx76v5pajla35mrqn5xsvvurhy r1 r0.owner aleo1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq3ljyzc into r4 as ComplianceRecord.record; + async burn_private r1 self.caller into r5; + output r4 as ComplianceRecord.record; + output r3 as Token.record; + output r5 as test_usdcx_stablecoin.aleo/burn_private.future; + +finalize burn_private: + input r0 as u128.public; + input r1 as address.public; + get address_to_role[r1] into r2; + and r2 2u16 into r3; + is.eq r3 2u16 into r4; + assert.eq r4 true; + get pause[true] into r5; + assert.eq r5 false; + get token_info[true] into r6; + sub r6.supply r0 into r7; + cast r6.name r6.symbol r6.decimals r7 r6.max_supply into r8 as TokenInfo; + set r8 into token_info[true]; + +function transfer_public: + input r0 as address.public; + input r1 as u128.public; + async transfer_public r0 r1 self.caller into r2; + output r2 as test_usdcx_stablecoin.aleo/transfer_public.future; + +finalize transfer_public: + input r0 as address.public; + input r1 as u128.public; + input r2 as address.public; + get.or_use test_usdcx_freezelist.aleo/freeze_list[r2] false into r3; + assert.eq r3 false; + get.or_use test_usdcx_freezelist.aleo/freeze_list[r0] false into r4; + assert.eq r4 false; + get pause[true] into r5; + assert.eq r5 false; + get balances[r2] into r6; + sub r6 r1 into r7; + set r7 into balances[r2]; + get.or_use balances[r0] 0u128 into r8; + add r8 r1 into r9; + set r9 into balances[r0]; + +function transfer_public_as_signer: + input r0 as address.public; + input r1 as u128.public; + async transfer_public_as_signer r0 r1 self.signer into r2; + output r2 as test_usdcx_stablecoin.aleo/transfer_public_as_signer.future; + +finalize transfer_public_as_signer: + input r0 as address.public; + input r1 as u128.public; + input r2 as address.public; + get.or_use test_usdcx_freezelist.aleo/freeze_list[r2] false into r3; + assert.eq r3 false; + get.or_use test_usdcx_freezelist.aleo/freeze_list[r0] false into r4; + assert.eq r4 false; + get pause[true] into r5; + assert.eq r5 false; + get balances[r2] into r6; + sub r6 r1 into r7; + set r7 into balances[r2]; + get.or_use balances[r0] 0u128 into r8; + add r8 r1 into r9; + set r9 into balances[r0]; + +function approve_public: + input r0 as address.public; + input r1 as u128.public; + cast self.caller r0 into r2 as TokenAllowance; + hash.bhp256 r2 into r3 as field; + async approve_public r1 r3 into r4; + output r4 as test_usdcx_stablecoin.aleo/approve_public.future; + +finalize approve_public: + input r0 as u128.public; + input r1 as field.public; + get pause[true] into r2; + assert.eq r2 false; + get.or_use allowances[r1] 0u128 into r3; + add r3 r0 into r4; + set r4 into allowances[r1]; + +function unapprove_public: + input r0 as address.public; + input r1 as u128.public; + cast self.caller r0 into r2 as TokenAllowance; + hash.bhp256 r2 into r3 as field; + async unapprove_public r1 r3 into r4; + output r4 as test_usdcx_stablecoin.aleo/unapprove_public.future; + +finalize unapprove_public: + input r0 as u128.public; + input r1 as field.public; + get pause[true] into r2; + assert.eq r2 false; + get allowances[r1] into r3; + sub r3 r0 into r4; + set r4 into allowances[r1]; + +function transfer_from_public: + input r0 as address.public; + input r1 as address.public; + input r2 as u128.public; + cast r0 self.caller into r3 as TokenAllowance; + hash.bhp256 r3 into r4 as field; + async transfer_from_public r0 r1 r2 r4 into r5; + output r5 as test_usdcx_stablecoin.aleo/transfer_from_public.future; + +finalize transfer_from_public: + input r0 as address.public; + input r1 as address.public; + input r2 as u128.public; + input r3 as field.public; + get.or_use test_usdcx_freezelist.aleo/freeze_list[r0] false into r4; + assert.eq r4 false; + get.or_use test_usdcx_freezelist.aleo/freeze_list[r1] false into r5; + assert.eq r5 false; + get pause[true] into r6; + assert.eq r6 false; + get allowances[r3] into r7; + sub r7 r2 into r8; + set r8 into allowances[r3]; + get balances[r0] into r9; + sub r9 r2 into r10; + set r10 into balances[r0]; + get.or_use balances[r1] 0u128 into r11; + add r11 r2 into r12; + set r12 into balances[r1]; + +function transfer_public_to_private: + input r0 as address.private; + input r1 as u128.public; + cast r0 r1 into r2 as Token.record; + cast aleo1mnldqsfrwayzfep3t9zusu4y7yknsdhfwx76v5pajla35mrqn5xsvvurhy r1 self.caller r0 into r3 as ComplianceRecord.record; + async transfer_public_to_private r1 self.caller into r4; + output r3 as ComplianceRecord.record; + output r2 as Token.record; + output r4 as test_usdcx_stablecoin.aleo/transfer_public_to_private.future; + +finalize transfer_public_to_private: + input r0 as u128.public; + input r1 as address.public; + get.or_use test_usdcx_freezelist.aleo/freeze_list[r1] false into r2; + assert.eq r2 false; + get pause[true] into r3; + assert.eq r3 false; + get balances[r1] into r4; + sub r4 r0 into r5; + set r5 into balances[r1]; + +function transfer_from_public_to_private: + input r0 as address.public; + input r1 as address.private; + input r2 as u128.public; + cast r1 r2 into r3 as Token.record; + cast r0 self.caller into r4 as TokenAllowance; + hash.bhp256 r4 into r5 as field; + cast aleo1mnldqsfrwayzfep3t9zusu4y7yknsdhfwx76v5pajla35mrqn5xsvvurhy r2 r0 r1 into r6 as ComplianceRecord.record; + async transfer_from_public_to_private r0 r2 r5 into r7; + output r6 as ComplianceRecord.record; + output r3 as Token.record; + output r7 as test_usdcx_stablecoin.aleo/transfer_from_public_to_private.future; + +finalize transfer_from_public_to_private: + input r0 as address.public; + input r1 as u128.public; + input r2 as field.public; + get.or_use test_usdcx_freezelist.aleo/freeze_list[r0] false into r3; + assert.eq r3 false; + get pause[true] into r4; + assert.eq r4 false; + get allowances[r2] into r5; + sub r5 r1 into r6; + set r6 into allowances[r2]; + get balances[r0] into r7; + sub r7 r1 into r8; + set r8 into balances[r0]; + +function transfer_private: + input r0 as address.private; + input r1 as u128.private; + input r2 as Token.record; + input r3 as [MerkleProof; 2u32].private; + rem r3[0u32].leaf_index 2u32 into r4; + is.eq r4 0u32 into r5; + cast 1field r3[0u32].siblings[0u32] r3[0u32].siblings[1u32] into r6 as [field; 3u32]; + cast 1field r3[0u32].siblings[1u32] r3[0u32].siblings[0u32] into r7 as [field; 3u32]; + ternary r5 r6[0u32] r7[0u32] into r8; + ternary r5 r6[1u32] r7[1u32] into r9; + ternary r5 r6[2u32] r7[2u32] into r10; + cast r8 r9 r10 into r11 as [field; 3u32]; + hash.psd4 r11 into r12 as field; + is.eq r3[0u32].siblings[2u32] 0field into r13; + div r3[0u32].leaf_index 2u32 into r14; + rem r14 2u32 into r15; + is.eq r15 0u32 into r16; + cast 0field r12 r3[0u32].siblings[2u32] into r17 as [field; 3u32]; + cast 0field r3[0u32].siblings[2u32] r12 into r18 as [field; 3u32]; + ternary r16 r17[0u32] r18[0u32] into r19; + ternary r16 r17[1u32] r18[1u32] into r20; + ternary r16 r17[2u32] r18[2u32] into r21; + cast r19 r20 r21 into r22 as [field; 3u32]; + hash.psd4 r22 into r23 as field; + is.eq r3[0u32].siblings[3u32] 0field into r24; + div r3[0u32].leaf_index 4u32 into r25; + rem r25 2u32 into r26; + is.eq r26 0u32 into r27; + cast 0field r23 r3[0u32].siblings[3u32] into r28 as [field; 3u32]; + cast 0field r3[0u32].siblings[3u32] r23 into r29 as [field; 3u32]; + ternary r27 r28[0u32] r29[0u32] into r30; + ternary r27 r28[1u32] r29[1u32] into r31; + ternary r27 r28[2u32] r29[2u32] into r32; + cast r30 r31 r32 into r33 as [field; 3u32]; + hash.psd4 r33 into r34 as field; + is.eq r3[0u32].siblings[4u32] 0field into r35; + div r3[0u32].leaf_index 8u32 into r36; + rem r36 2u32 into r37; + is.eq r37 0u32 into r38; + cast 0field r34 r3[0u32].siblings[4u32] into r39 as [field; 3u32]; + cast 0field r3[0u32].siblings[4u32] r34 into r40 as [field; 3u32]; + ternary r38 r39[0u32] r40[0u32] into r41; + ternary r38 r39[1u32] r40[1u32] into r42; + ternary r38 r39[2u32] r40[2u32] into r43; + cast r41 r42 r43 into r44 as [field; 3u32]; + hash.psd4 r44 into r45 as field; + is.eq r3[0u32].siblings[5u32] 0field into r46; + div r3[0u32].leaf_index 16u32 into r47; + rem r47 2u32 into r48; + is.eq r48 0u32 into r49; + cast 0field r45 r3[0u32].siblings[5u32] into r50 as [field; 3u32]; + cast 0field r3[0u32].siblings[5u32] r45 into r51 as [field; 3u32]; + ternary r49 r50[0u32] r51[0u32] into r52; + ternary r49 r50[1u32] r51[1u32] into r53; + ternary r49 r50[2u32] r51[2u32] into r54; + cast r52 r53 r54 into r55 as [field; 3u32]; + hash.psd4 r55 into r56 as field; + is.eq r3[0u32].siblings[6u32] 0field into r57; + div r3[0u32].leaf_index 32u32 into r58; + rem r58 2u32 into r59; + is.eq r59 0u32 into r60; + cast 0field r56 r3[0u32].siblings[6u32] into r61 as [field; 3u32]; + cast 0field r3[0u32].siblings[6u32] r56 into r62 as [field; 3u32]; + ternary r60 r61[0u32] r62[0u32] into r63; + ternary r60 r61[1u32] r62[1u32] into r64; + ternary r60 r61[2u32] r62[2u32] into r65; + cast r63 r64 r65 into r66 as [field; 3u32]; + hash.psd4 r66 into r67 as field; + is.eq r3[0u32].siblings[7u32] 0field into r68; + div r3[0u32].leaf_index 64u32 into r69; + rem r69 2u32 into r70; + is.eq r70 0u32 into r71; + cast 0field r67 r3[0u32].siblings[7u32] into r72 as [field; 3u32]; + cast 0field r3[0u32].siblings[7u32] r67 into r73 as [field; 3u32]; + ternary r71 r72[0u32] r73[0u32] into r74; + ternary r71 r72[1u32] r73[1u32] into r75; + ternary r71 r72[2u32] r73[2u32] into r76; + cast r74 r75 r76 into r77 as [field; 3u32]; + hash.psd4 r77 into r78 as field; + is.eq r3[0u32].siblings[8u32] 0field into r79; + div r3[0u32].leaf_index 128u32 into r80; + rem r80 2u32 into r81; + is.eq r81 0u32 into r82; + cast 0field r78 r3[0u32].siblings[8u32] into r83 as [field; 3u32]; + cast 0field r3[0u32].siblings[8u32] r78 into r84 as [field; 3u32]; + ternary r82 r83[0u32] r84[0u32] into r85; + ternary r82 r83[1u32] r84[1u32] into r86; + ternary r82 r83[2u32] r84[2u32] into r87; + cast r85 r86 r87 into r88 as [field; 3u32]; + hash.psd4 r88 into r89 as field; + is.eq r3[0u32].siblings[9u32] 0field into r90; + div r3[0u32].leaf_index 256u32 into r91; + rem r91 2u32 into r92; + is.eq r92 0u32 into r93; + cast 0field r89 r3[0u32].siblings[9u32] into r94 as [field; 3u32]; + cast 0field r3[0u32].siblings[9u32] r89 into r95 as [field; 3u32]; + ternary r93 r94[0u32] r95[0u32] into r96; + ternary r93 r94[1u32] r95[1u32] into r97; + ternary r93 r94[2u32] r95[2u32] into r98; + cast r96 r97 r98 into r99 as [field; 3u32]; + hash.psd4 r99 into r100 as field; + is.eq r3[0u32].siblings[10u32] 0field into r101; + div r3[0u32].leaf_index 512u32 into r102; + rem r102 2u32 into r103; + is.eq r103 0u32 into r104; + cast 0field r100 r3[0u32].siblings[10u32] into r105 as [field; 3u32]; + cast 0field r3[0u32].siblings[10u32] r100 into r106 as [field; 3u32]; + ternary r104 r105[0u32] r106[0u32] into r107; + ternary r104 r105[1u32] r106[1u32] into r108; + ternary r104 r105[2u32] r106[2u32] into r109; + cast r107 r108 r109 into r110 as [field; 3u32]; + hash.psd4 r110 into r111 as field; + is.eq r3[0u32].siblings[11u32] 0field into r112; + div r3[0u32].leaf_index 1024u32 into r113; + rem r113 2u32 into r114; + is.eq r114 0u32 into r115; + cast 0field r111 r3[0u32].siblings[11u32] into r116 as [field; 3u32]; + cast 0field r3[0u32].siblings[11u32] r111 into r117 as [field; 3u32]; + ternary r115 r116[0u32] r117[0u32] into r118; + ternary r115 r116[1u32] r117[1u32] into r119; + ternary r115 r116[2u32] r117[2u32] into r120; + cast r118 r119 r120 into r121 as [field; 3u32]; + hash.psd4 r121 into r122 as field; + is.eq r3[0u32].siblings[12u32] 0field into r123; + div r3[0u32].leaf_index 2048u32 into r124; + rem r124 2u32 into r125; + is.eq r125 0u32 into r126; + cast 0field r122 r3[0u32].siblings[12u32] into r127 as [field; 3u32]; + cast 0field r3[0u32].siblings[12u32] r122 into r128 as [field; 3u32]; + ternary r126 r127[0u32] r128[0u32] into r129; + ternary r126 r127[1u32] r128[1u32] into r130; + ternary r126 r127[2u32] r128[2u32] into r131; + cast r129 r130 r131 into r132 as [field; 3u32]; + hash.psd4 r132 into r133 as field; + is.eq r3[0u32].siblings[13u32] 0field into r134; + div r3[0u32].leaf_index 4096u32 into r135; + rem r135 2u32 into r136; + is.eq r136 0u32 into r137; + cast 0field r133 r3[0u32].siblings[13u32] into r138 as [field; 3u32]; + cast 0field r3[0u32].siblings[13u32] r133 into r139 as [field; 3u32]; + ternary r137 r138[0u32] r139[0u32] into r140; + ternary r137 r138[1u32] r139[1u32] into r141; + ternary r137 r138[2u32] r139[2u32] into r142; + cast r140 r141 r142 into r143 as [field; 3u32]; + hash.psd4 r143 into r144 as field; + is.eq r3[0u32].siblings[14u32] 0field into r145; + div r3[0u32].leaf_index 8192u32 into r146; + rem r146 2u32 into r147; + is.eq r147 0u32 into r148; + cast 0field r144 r3[0u32].siblings[14u32] into r149 as [field; 3u32]; + cast 0field r3[0u32].siblings[14u32] r144 into r150 as [field; 3u32]; + ternary r148 r149[0u32] r150[0u32] into r151; + ternary r148 r149[1u32] r150[1u32] into r152; + ternary r148 r149[2u32] r150[2u32] into r153; + cast r151 r152 r153 into r154 as [field; 3u32]; + hash.psd4 r154 into r155 as field; + is.eq r3[0u32].siblings[15u32] 0field into r156; + div r3[0u32].leaf_index 16384u32 into r157; + rem r157 2u32 into r158; + is.eq r158 0u32 into r159; + cast 0field r155 r3[0u32].siblings[15u32] into r160 as [field; 3u32]; + cast 0field r3[0u32].siblings[15u32] r155 into r161 as [field; 3u32]; + ternary r159 r160[0u32] r161[0u32] into r162; + ternary r159 r160[1u32] r161[1u32] into r163; + ternary r159 r160[2u32] r161[2u32] into r164; + cast r162 r163 r164 into r165 as [field; 3u32]; + hash.psd4 r165 into r166 as field; + ternary r156 r155 r166 into r167; + ternary r156 14u32 15u32 into r168; + ternary r145 r144 r167 into r169; + ternary r145 13u32 r168 into r170; + ternary r134 r133 r169 into r171; + ternary r134 12u32 r170 into r172; + ternary r123 r122 r171 into r173; + ternary r123 11u32 r172 into r174; + ternary r112 r111 r173 into r175; + ternary r112 10u32 r174 into r176; + ternary r101 r100 r175 into r177; + ternary r101 9u32 r176 into r178; + ternary r90 r89 r177 into r179; + ternary r90 8u32 r178 into r180; + ternary r79 r78 r179 into r181; + ternary r79 7u32 r180 into r182; + ternary r68 r67 r181 into r183; + ternary r68 6u32 r182 into r184; + ternary r57 r56 r183 into r185; + ternary r57 5u32 r184 into r186; + ternary r46 r45 r185 into r187; + ternary r46 4u32 r186 into r188; + ternary r35 r34 r187 into r189; + ternary r35 3u32 r188 into r190; + ternary r24 r23 r189 into r191; + ternary r24 2u32 r190 into r192; + ternary r13 r12 r191 into r193; + ternary r13 1u32 r192 into r194; + rem r3[1u32].leaf_index 2u32 into r195; + is.eq r195 0u32 into r196; + cast 1field r3[1u32].siblings[0u32] r3[1u32].siblings[1u32] into r197 as [field; 3u32]; + cast 1field r3[1u32].siblings[1u32] r3[1u32].siblings[0u32] into r198 as [field; 3u32]; + ternary r196 r197[0u32] r198[0u32] into r199; + ternary r196 r197[1u32] r198[1u32] into r200; + ternary r196 r197[2u32] r198[2u32] into r201; + cast r199 r200 r201 into r202 as [field; 3u32]; + hash.psd4 r202 into r203 as field; + is.eq r3[1u32].siblings[2u32] 0field into r204; + div r3[1u32].leaf_index 2u32 into r205; + rem r205 2u32 into r206; + is.eq r206 0u32 into r207; + cast 0field r203 r3[1u32].siblings[2u32] into r208 as [field; 3u32]; + cast 0field r3[1u32].siblings[2u32] r203 into r209 as [field; 3u32]; + ternary r207 r208[0u32] r209[0u32] into r210; + ternary r207 r208[1u32] r209[1u32] into r211; + ternary r207 r208[2u32] r209[2u32] into r212; + cast r210 r211 r212 into r213 as [field; 3u32]; + hash.psd4 r213 into r214 as field; + is.eq r3[1u32].siblings[3u32] 0field into r215; + div r3[1u32].leaf_index 4u32 into r216; + rem r216 2u32 into r217; + is.eq r217 0u32 into r218; + cast 0field r214 r3[1u32].siblings[3u32] into r219 as [field; 3u32]; + cast 0field r3[1u32].siblings[3u32] r214 into r220 as [field; 3u32]; + ternary r218 r219[0u32] r220[0u32] into r221; + ternary r218 r219[1u32] r220[1u32] into r222; + ternary r218 r219[2u32] r220[2u32] into r223; + cast r221 r222 r223 into r224 as [field; 3u32]; + hash.psd4 r224 into r225 as field; + is.eq r3[1u32].siblings[4u32] 0field into r226; + div r3[1u32].leaf_index 8u32 into r227; + rem r227 2u32 into r228; + is.eq r228 0u32 into r229; + cast 0field r225 r3[1u32].siblings[4u32] into r230 as [field; 3u32]; + cast 0field r3[1u32].siblings[4u32] r225 into r231 as [field; 3u32]; + ternary r229 r230[0u32] r231[0u32] into r232; + ternary r229 r230[1u32] r231[1u32] into r233; + ternary r229 r230[2u32] r231[2u32] into r234; + cast r232 r233 r234 into r235 as [field; 3u32]; + hash.psd4 r235 into r236 as field; + is.eq r3[1u32].siblings[5u32] 0field into r237; + div r3[1u32].leaf_index 16u32 into r238; + rem r238 2u32 into r239; + is.eq r239 0u32 into r240; + cast 0field r236 r3[1u32].siblings[5u32] into r241 as [field; 3u32]; + cast 0field r3[1u32].siblings[5u32] r236 into r242 as [field; 3u32]; + ternary r240 r241[0u32] r242[0u32] into r243; + ternary r240 r241[1u32] r242[1u32] into r244; + ternary r240 r241[2u32] r242[2u32] into r245; + cast r243 r244 r245 into r246 as [field; 3u32]; + hash.psd4 r246 into r247 as field; + is.eq r3[1u32].siblings[6u32] 0field into r248; + div r3[1u32].leaf_index 32u32 into r249; + rem r249 2u32 into r250; + is.eq r250 0u32 into r251; + cast 0field r247 r3[1u32].siblings[6u32] into r252 as [field; 3u32]; + cast 0field r3[1u32].siblings[6u32] r247 into r253 as [field; 3u32]; + ternary r251 r252[0u32] r253[0u32] into r254; + ternary r251 r252[1u32] r253[1u32] into r255; + ternary r251 r252[2u32] r253[2u32] into r256; + cast r254 r255 r256 into r257 as [field; 3u32]; + hash.psd4 r257 into r258 as field; + is.eq r3[1u32].siblings[7u32] 0field into r259; + div r3[1u32].leaf_index 64u32 into r260; + rem r260 2u32 into r261; + is.eq r261 0u32 into r262; + cast 0field r258 r3[1u32].siblings[7u32] into r263 as [field; 3u32]; + cast 0field r3[1u32].siblings[7u32] r258 into r264 as [field; 3u32]; + ternary r262 r263[0u32] r264[0u32] into r265; + ternary r262 r263[1u32] r264[1u32] into r266; + ternary r262 r263[2u32] r264[2u32] into r267; + cast r265 r266 r267 into r268 as [field; 3u32]; + hash.psd4 r268 into r269 as field; + is.eq r3[1u32].siblings[8u32] 0field into r270; + div r3[1u32].leaf_index 128u32 into r271; + rem r271 2u32 into r272; + is.eq r272 0u32 into r273; + cast 0field r269 r3[1u32].siblings[8u32] into r274 as [field; 3u32]; + cast 0field r3[1u32].siblings[8u32] r269 into r275 as [field; 3u32]; + ternary r273 r274[0u32] r275[0u32] into r276; + ternary r273 r274[1u32] r275[1u32] into r277; + ternary r273 r274[2u32] r275[2u32] into r278; + cast r276 r277 r278 into r279 as [field; 3u32]; + hash.psd4 r279 into r280 as field; + is.eq r3[1u32].siblings[9u32] 0field into r281; + div r3[1u32].leaf_index 256u32 into r282; + rem r282 2u32 into r283; + is.eq r283 0u32 into r284; + cast 0field r280 r3[1u32].siblings[9u32] into r285 as [field; 3u32]; + cast 0field r3[1u32].siblings[9u32] r280 into r286 as [field; 3u32]; + ternary r284 r285[0u32] r286[0u32] into r287; + ternary r284 r285[1u32] r286[1u32] into r288; + ternary r284 r285[2u32] r286[2u32] into r289; + cast r287 r288 r289 into r290 as [field; 3u32]; + hash.psd4 r290 into r291 as field; + is.eq r3[1u32].siblings[10u32] 0field into r292; + div r3[1u32].leaf_index 512u32 into r293; + rem r293 2u32 into r294; + is.eq r294 0u32 into r295; + cast 0field r291 r3[1u32].siblings[10u32] into r296 as [field; 3u32]; + cast 0field r3[1u32].siblings[10u32] r291 into r297 as [field; 3u32]; + ternary r295 r296[0u32] r297[0u32] into r298; + ternary r295 r296[1u32] r297[1u32] into r299; + ternary r295 r296[2u32] r297[2u32] into r300; + cast r298 r299 r300 into r301 as [field; 3u32]; + hash.psd4 r301 into r302 as field; + is.eq r3[1u32].siblings[11u32] 0field into r303; + div r3[1u32].leaf_index 1024u32 into r304; + rem r304 2u32 into r305; + is.eq r305 0u32 into r306; + cast 0field r302 r3[1u32].siblings[11u32] into r307 as [field; 3u32]; + cast 0field r3[1u32].siblings[11u32] r302 into r308 as [field; 3u32]; + ternary r306 r307[0u32] r308[0u32] into r309; + ternary r306 r307[1u32] r308[1u32] into r310; + ternary r306 r307[2u32] r308[2u32] into r311; + cast r309 r310 r311 into r312 as [field; 3u32]; + hash.psd4 r312 into r313 as field; + is.eq r3[1u32].siblings[12u32] 0field into r314; + div r3[1u32].leaf_index 2048u32 into r315; + rem r315 2u32 into r316; + is.eq r316 0u32 into r317; + cast 0field r313 r3[1u32].siblings[12u32] into r318 as [field; 3u32]; + cast 0field r3[1u32].siblings[12u32] r313 into r319 as [field; 3u32]; + ternary r317 r318[0u32] r319[0u32] into r320; + ternary r317 r318[1u32] r319[1u32] into r321; + ternary r317 r318[2u32] r319[2u32] into r322; + cast r320 r321 r322 into r323 as [field; 3u32]; + hash.psd4 r323 into r324 as field; + is.eq r3[1u32].siblings[13u32] 0field into r325; + div r3[1u32].leaf_index 4096u32 into r326; + rem r326 2u32 into r327; + is.eq r327 0u32 into r328; + cast 0field r324 r3[1u32].siblings[13u32] into r329 as [field; 3u32]; + cast 0field r3[1u32].siblings[13u32] r324 into r330 as [field; 3u32]; + ternary r328 r329[0u32] r330[0u32] into r331; + ternary r328 r329[1u32] r330[1u32] into r332; + ternary r328 r329[2u32] r330[2u32] into r333; + cast r331 r332 r333 into r334 as [field; 3u32]; + hash.psd4 r334 into r335 as field; + is.eq r3[1u32].siblings[14u32] 0field into r336; + div r3[1u32].leaf_index 8192u32 into r337; + rem r337 2u32 into r338; + is.eq r338 0u32 into r339; + cast 0field r335 r3[1u32].siblings[14u32] into r340 as [field; 3u32]; + cast 0field r3[1u32].siblings[14u32] r335 into r341 as [field; 3u32]; + ternary r339 r340[0u32] r341[0u32] into r342; + ternary r339 r340[1u32] r341[1u32] into r343; + ternary r339 r340[2u32] r341[2u32] into r344; + cast r342 r343 r344 into r345 as [field; 3u32]; + hash.psd4 r345 into r346 as field; + is.eq r3[1u32].siblings[15u32] 0field into r347; + div r3[1u32].leaf_index 16384u32 into r348; + rem r348 2u32 into r349; + is.eq r349 0u32 into r350; + cast 0field r346 r3[1u32].siblings[15u32] into r351 as [field; 3u32]; + cast 0field r3[1u32].siblings[15u32] r346 into r352 as [field; 3u32]; + ternary r350 r351[0u32] r352[0u32] into r353; + ternary r350 r351[1u32] r352[1u32] into r354; + ternary r350 r351[2u32] r352[2u32] into r355; + cast r353 r354 r355 into r356 as [field; 3u32]; + hash.psd4 r356 into r357 as field; + ternary r347 r346 r357 into r358; + ternary r347 14u32 15u32 into r359; + ternary r336 r335 r358 into r360; + ternary r336 13u32 r359 into r361; + ternary r325 r324 r360 into r362; + ternary r325 12u32 r361 into r363; + ternary r314 r313 r362 into r364; + ternary r314 11u32 r363 into r365; + ternary r303 r302 r364 into r366; + ternary r303 10u32 r365 into r367; + ternary r292 r291 r366 into r368; + ternary r292 9u32 r367 into r369; + ternary r281 r280 r368 into r370; + ternary r281 8u32 r369 into r371; + ternary r270 r269 r370 into r372; + ternary r270 7u32 r371 into r373; + ternary r259 r258 r372 into r374; + ternary r259 6u32 r373 into r375; + ternary r248 r247 r374 into r376; + ternary r248 5u32 r375 into r377; + ternary r237 r236 r376 into r378; + ternary r237 4u32 r377 into r379; + ternary r226 r225 r378 into r380; + ternary r226 3u32 r379 into r381; + ternary r215 r214 r380 into r382; + ternary r215 2u32 r381 into r383; + ternary r204 r203 r382 into r384; + ternary r204 1u32 r383 into r385; + assert.eq r193 r384; + assert.eq r194 r385; + cast r2.owner into r386 as field; + is.eq r3[0u32].leaf_index r3[1u32].leaf_index into r387; + is.eq r3[0u32].leaf_index 0u32 into r388; + lt r386 r3[0u32].siblings[0u32] into r389; + and r387 r388 into r390; + not r390 into r391; + or r389 r391 into r392; + assert.eq r392 true; + not r388 into r393; + pow 2u32 r194 into r394; + sub r394 1u32 into r395; + and r387 r393 into r396; + not r396 into r397; + is.eq r3[0u32].leaf_index r395 into r398; + or r398 r397 into r399; + assert.eq r399 true; + gt r386 r3[0u32].siblings[0u32] into r400; + or r400 r397 into r401; + assert.eq r401 true; + not r387 into r402; + gt r386 r3[0u32].siblings[0u32] into r403; + not r402 into r404; + or r403 r404 into r405; + assert.eq r405 true; + lt r386 r3[1u32].siblings[0u32] into r406; + or r406 r404 into r407; + assert.eq r407 true; + lte r3[1u32].leaf_index r395 into r408; + or r408 r404 into r409; + assert.eq r409 true; + add r3[0u32].leaf_index 1u32 into r410; + is.eq r410 r3[1u32].leaf_index into r411; + or r411 r404 into r412; + assert.eq r412 true; + sub r2.amount r1 into r413; + cast r2.owner r413 into r414 as Token.record; + cast r0 r1 into r415 as Token.record; + cast aleo1mnldqsfrwayzfep3t9zusu4y7yknsdhfwx76v5pajla35mrqn5xsvvurhy r1 r2.owner r0 into r416 as ComplianceRecord.record; + async transfer_private r193 into r417; + output r416 as ComplianceRecord.record; + output r414 as Token.record; + output r415 as Token.record; + output r417 as test_usdcx_stablecoin.aleo/transfer_private.future; + +finalize transfer_private: + input r0 as field.public; + get pause[true] into r1; + assert.eq r1 false; + get test_usdcx_freezelist.aleo/freeze_list_root[1u8] into r2; + get test_usdcx_freezelist.aleo/block_height_window[true] into r3; + is.neq r2 r0 into r4; + branch.eq r4 false to end_then_0_4; + get test_usdcx_freezelist.aleo/freeze_list_root[2u8] into r5; + assert.eq r0 r5; + get test_usdcx_freezelist.aleo/root_updated_height[true] into r6; + add r6 r3 into r7; + gt r7 block.height into r8; + assert.eq r8 true; + branch.eq true true to end_otherwise_0_5; + position end_then_0_4; + position end_otherwise_0_5; + +function transfer_private_to_public: + input r0 as address.public; + input r1 as u128.public; + input r2 as Token.record; + input r3 as [MerkleProof; 2u32].private; + rem r3[0u32].leaf_index 2u32 into r4; + is.eq r4 0u32 into r5; + cast 1field r3[0u32].siblings[0u32] r3[0u32].siblings[1u32] into r6 as [field; 3u32]; + cast 1field r3[0u32].siblings[1u32] r3[0u32].siblings[0u32] into r7 as [field; 3u32]; + ternary r5 r6[0u32] r7[0u32] into r8; + ternary r5 r6[1u32] r7[1u32] into r9; + ternary r5 r6[2u32] r7[2u32] into r10; + cast r8 r9 r10 into r11 as [field; 3u32]; + hash.psd4 r11 into r12 as field; + is.eq r3[0u32].siblings[2u32] 0field into r13; + div r3[0u32].leaf_index 2u32 into r14; + rem r14 2u32 into r15; + is.eq r15 0u32 into r16; + cast 0field r12 r3[0u32].siblings[2u32] into r17 as [field; 3u32]; + cast 0field r3[0u32].siblings[2u32] r12 into r18 as [field; 3u32]; + ternary r16 r17[0u32] r18[0u32] into r19; + ternary r16 r17[1u32] r18[1u32] into r20; + ternary r16 r17[2u32] r18[2u32] into r21; + cast r19 r20 r21 into r22 as [field; 3u32]; + hash.psd4 r22 into r23 as field; + is.eq r3[0u32].siblings[3u32] 0field into r24; + div r3[0u32].leaf_index 4u32 into r25; + rem r25 2u32 into r26; + is.eq r26 0u32 into r27; + cast 0field r23 r3[0u32].siblings[3u32] into r28 as [field; 3u32]; + cast 0field r3[0u32].siblings[3u32] r23 into r29 as [field; 3u32]; + ternary r27 r28[0u32] r29[0u32] into r30; + ternary r27 r28[1u32] r29[1u32] into r31; + ternary r27 r28[2u32] r29[2u32] into r32; + cast r30 r31 r32 into r33 as [field; 3u32]; + hash.psd4 r33 into r34 as field; + is.eq r3[0u32].siblings[4u32] 0field into r35; + div r3[0u32].leaf_index 8u32 into r36; + rem r36 2u32 into r37; + is.eq r37 0u32 into r38; + cast 0field r34 r3[0u32].siblings[4u32] into r39 as [field; 3u32]; + cast 0field r3[0u32].siblings[4u32] r34 into r40 as [field; 3u32]; + ternary r38 r39[0u32] r40[0u32] into r41; + ternary r38 r39[1u32] r40[1u32] into r42; + ternary r38 r39[2u32] r40[2u32] into r43; + cast r41 r42 r43 into r44 as [field; 3u32]; + hash.psd4 r44 into r45 as field; + is.eq r3[0u32].siblings[5u32] 0field into r46; + div r3[0u32].leaf_index 16u32 into r47; + rem r47 2u32 into r48; + is.eq r48 0u32 into r49; + cast 0field r45 r3[0u32].siblings[5u32] into r50 as [field; 3u32]; + cast 0field r3[0u32].siblings[5u32] r45 into r51 as [field; 3u32]; + ternary r49 r50[0u32] r51[0u32] into r52; + ternary r49 r50[1u32] r51[1u32] into r53; + ternary r49 r50[2u32] r51[2u32] into r54; + cast r52 r53 r54 into r55 as [field; 3u32]; + hash.psd4 r55 into r56 as field; + is.eq r3[0u32].siblings[6u32] 0field into r57; + div r3[0u32].leaf_index 32u32 into r58; + rem r58 2u32 into r59; + is.eq r59 0u32 into r60; + cast 0field r56 r3[0u32].siblings[6u32] into r61 as [field; 3u32]; + cast 0field r3[0u32].siblings[6u32] r56 into r62 as [field; 3u32]; + ternary r60 r61[0u32] r62[0u32] into r63; + ternary r60 r61[1u32] r62[1u32] into r64; + ternary r60 r61[2u32] r62[2u32] into r65; + cast r63 r64 r65 into r66 as [field; 3u32]; + hash.psd4 r66 into r67 as field; + is.eq r3[0u32].siblings[7u32] 0field into r68; + div r3[0u32].leaf_index 64u32 into r69; + rem r69 2u32 into r70; + is.eq r70 0u32 into r71; + cast 0field r67 r3[0u32].siblings[7u32] into r72 as [field; 3u32]; + cast 0field r3[0u32].siblings[7u32] r67 into r73 as [field; 3u32]; + ternary r71 r72[0u32] r73[0u32] into r74; + ternary r71 r72[1u32] r73[1u32] into r75; + ternary r71 r72[2u32] r73[2u32] into r76; + cast r74 r75 r76 into r77 as [field; 3u32]; + hash.psd4 r77 into r78 as field; + is.eq r3[0u32].siblings[8u32] 0field into r79; + div r3[0u32].leaf_index 128u32 into r80; + rem r80 2u32 into r81; + is.eq r81 0u32 into r82; + cast 0field r78 r3[0u32].siblings[8u32] into r83 as [field; 3u32]; + cast 0field r3[0u32].siblings[8u32] r78 into r84 as [field; 3u32]; + ternary r82 r83[0u32] r84[0u32] into r85; + ternary r82 r83[1u32] r84[1u32] into r86; + ternary r82 r83[2u32] r84[2u32] into r87; + cast r85 r86 r87 into r88 as [field; 3u32]; + hash.psd4 r88 into r89 as field; + is.eq r3[0u32].siblings[9u32] 0field into r90; + div r3[0u32].leaf_index 256u32 into r91; + rem r91 2u32 into r92; + is.eq r92 0u32 into r93; + cast 0field r89 r3[0u32].siblings[9u32] into r94 as [field; 3u32]; + cast 0field r3[0u32].siblings[9u32] r89 into r95 as [field; 3u32]; + ternary r93 r94[0u32] r95[0u32] into r96; + ternary r93 r94[1u32] r95[1u32] into r97; + ternary r93 r94[2u32] r95[2u32] into r98; + cast r96 r97 r98 into r99 as [field; 3u32]; + hash.psd4 r99 into r100 as field; + is.eq r3[0u32].siblings[10u32] 0field into r101; + div r3[0u32].leaf_index 512u32 into r102; + rem r102 2u32 into r103; + is.eq r103 0u32 into r104; + cast 0field r100 r3[0u32].siblings[10u32] into r105 as [field; 3u32]; + cast 0field r3[0u32].siblings[10u32] r100 into r106 as [field; 3u32]; + ternary r104 r105[0u32] r106[0u32] into r107; + ternary r104 r105[1u32] r106[1u32] into r108; + ternary r104 r105[2u32] r106[2u32] into r109; + cast r107 r108 r109 into r110 as [field; 3u32]; + hash.psd4 r110 into r111 as field; + is.eq r3[0u32].siblings[11u32] 0field into r112; + div r3[0u32].leaf_index 1024u32 into r113; + rem r113 2u32 into r114; + is.eq r114 0u32 into r115; + cast 0field r111 r3[0u32].siblings[11u32] into r116 as [field; 3u32]; + cast 0field r3[0u32].siblings[11u32] r111 into r117 as [field; 3u32]; + ternary r115 r116[0u32] r117[0u32] into r118; + ternary r115 r116[1u32] r117[1u32] into r119; + ternary r115 r116[2u32] r117[2u32] into r120; + cast r118 r119 r120 into r121 as [field; 3u32]; + hash.psd4 r121 into r122 as field; + is.eq r3[0u32].siblings[12u32] 0field into r123; + div r3[0u32].leaf_index 2048u32 into r124; + rem r124 2u32 into r125; + is.eq r125 0u32 into r126; + cast 0field r122 r3[0u32].siblings[12u32] into r127 as [field; 3u32]; + cast 0field r3[0u32].siblings[12u32] r122 into r128 as [field; 3u32]; + ternary r126 r127[0u32] r128[0u32] into r129; + ternary r126 r127[1u32] r128[1u32] into r130; + ternary r126 r127[2u32] r128[2u32] into r131; + cast r129 r130 r131 into r132 as [field; 3u32]; + hash.psd4 r132 into r133 as field; + is.eq r3[0u32].siblings[13u32] 0field into r134; + div r3[0u32].leaf_index 4096u32 into r135; + rem r135 2u32 into r136; + is.eq r136 0u32 into r137; + cast 0field r133 r3[0u32].siblings[13u32] into r138 as [field; 3u32]; + cast 0field r3[0u32].siblings[13u32] r133 into r139 as [field; 3u32]; + ternary r137 r138[0u32] r139[0u32] into r140; + ternary r137 r138[1u32] r139[1u32] into r141; + ternary r137 r138[2u32] r139[2u32] into r142; + cast r140 r141 r142 into r143 as [field; 3u32]; + hash.psd4 r143 into r144 as field; + is.eq r3[0u32].siblings[14u32] 0field into r145; + div r3[0u32].leaf_index 8192u32 into r146; + rem r146 2u32 into r147; + is.eq r147 0u32 into r148; + cast 0field r144 r3[0u32].siblings[14u32] into r149 as [field; 3u32]; + cast 0field r3[0u32].siblings[14u32] r144 into r150 as [field; 3u32]; + ternary r148 r149[0u32] r150[0u32] into r151; + ternary r148 r149[1u32] r150[1u32] into r152; + ternary r148 r149[2u32] r150[2u32] into r153; + cast r151 r152 r153 into r154 as [field; 3u32]; + hash.psd4 r154 into r155 as field; + is.eq r3[0u32].siblings[15u32] 0field into r156; + div r3[0u32].leaf_index 16384u32 into r157; + rem r157 2u32 into r158; + is.eq r158 0u32 into r159; + cast 0field r155 r3[0u32].siblings[15u32] into r160 as [field; 3u32]; + cast 0field r3[0u32].siblings[15u32] r155 into r161 as [field; 3u32]; + ternary r159 r160[0u32] r161[0u32] into r162; + ternary r159 r160[1u32] r161[1u32] into r163; + ternary r159 r160[2u32] r161[2u32] into r164; + cast r162 r163 r164 into r165 as [field; 3u32]; + hash.psd4 r165 into r166 as field; + ternary r156 r155 r166 into r167; + ternary r156 14u32 15u32 into r168; + ternary r145 r144 r167 into r169; + ternary r145 13u32 r168 into r170; + ternary r134 r133 r169 into r171; + ternary r134 12u32 r170 into r172; + ternary r123 r122 r171 into r173; + ternary r123 11u32 r172 into r174; + ternary r112 r111 r173 into r175; + ternary r112 10u32 r174 into r176; + ternary r101 r100 r175 into r177; + ternary r101 9u32 r176 into r178; + ternary r90 r89 r177 into r179; + ternary r90 8u32 r178 into r180; + ternary r79 r78 r179 into r181; + ternary r79 7u32 r180 into r182; + ternary r68 r67 r181 into r183; + ternary r68 6u32 r182 into r184; + ternary r57 r56 r183 into r185; + ternary r57 5u32 r184 into r186; + ternary r46 r45 r185 into r187; + ternary r46 4u32 r186 into r188; + ternary r35 r34 r187 into r189; + ternary r35 3u32 r188 into r190; + ternary r24 r23 r189 into r191; + ternary r24 2u32 r190 into r192; + ternary r13 r12 r191 into r193; + ternary r13 1u32 r192 into r194; + rem r3[1u32].leaf_index 2u32 into r195; + is.eq r195 0u32 into r196; + cast 1field r3[1u32].siblings[0u32] r3[1u32].siblings[1u32] into r197 as [field; 3u32]; + cast 1field r3[1u32].siblings[1u32] r3[1u32].siblings[0u32] into r198 as [field; 3u32]; + ternary r196 r197[0u32] r198[0u32] into r199; + ternary r196 r197[1u32] r198[1u32] into r200; + ternary r196 r197[2u32] r198[2u32] into r201; + cast r199 r200 r201 into r202 as [field; 3u32]; + hash.psd4 r202 into r203 as field; + is.eq r3[1u32].siblings[2u32] 0field into r204; + div r3[1u32].leaf_index 2u32 into r205; + rem r205 2u32 into r206; + is.eq r206 0u32 into r207; + cast 0field r203 r3[1u32].siblings[2u32] into r208 as [field; 3u32]; + cast 0field r3[1u32].siblings[2u32] r203 into r209 as [field; 3u32]; + ternary r207 r208[0u32] r209[0u32] into r210; + ternary r207 r208[1u32] r209[1u32] into r211; + ternary r207 r208[2u32] r209[2u32] into r212; + cast r210 r211 r212 into r213 as [field; 3u32]; + hash.psd4 r213 into r214 as field; + is.eq r3[1u32].siblings[3u32] 0field into r215; + div r3[1u32].leaf_index 4u32 into r216; + rem r216 2u32 into r217; + is.eq r217 0u32 into r218; + cast 0field r214 r3[1u32].siblings[3u32] into r219 as [field; 3u32]; + cast 0field r3[1u32].siblings[3u32] r214 into r220 as [field; 3u32]; + ternary r218 r219[0u32] r220[0u32] into r221; + ternary r218 r219[1u32] r220[1u32] into r222; + ternary r218 r219[2u32] r220[2u32] into r223; + cast r221 r222 r223 into r224 as [field; 3u32]; + hash.psd4 r224 into r225 as field; + is.eq r3[1u32].siblings[4u32] 0field into r226; + div r3[1u32].leaf_index 8u32 into r227; + rem r227 2u32 into r228; + is.eq r228 0u32 into r229; + cast 0field r225 r3[1u32].siblings[4u32] into r230 as [field; 3u32]; + cast 0field r3[1u32].siblings[4u32] r225 into r231 as [field; 3u32]; + ternary r229 r230[0u32] r231[0u32] into r232; + ternary r229 r230[1u32] r231[1u32] into r233; + ternary r229 r230[2u32] r231[2u32] into r234; + cast r232 r233 r234 into r235 as [field; 3u32]; + hash.psd4 r235 into r236 as field; + is.eq r3[1u32].siblings[5u32] 0field into r237; + div r3[1u32].leaf_index 16u32 into r238; + rem r238 2u32 into r239; + is.eq r239 0u32 into r240; + cast 0field r236 r3[1u32].siblings[5u32] into r241 as [field; 3u32]; + cast 0field r3[1u32].siblings[5u32] r236 into r242 as [field; 3u32]; + ternary r240 r241[0u32] r242[0u32] into r243; + ternary r240 r241[1u32] r242[1u32] into r244; + ternary r240 r241[2u32] r242[2u32] into r245; + cast r243 r244 r245 into r246 as [field; 3u32]; + hash.psd4 r246 into r247 as field; + is.eq r3[1u32].siblings[6u32] 0field into r248; + div r3[1u32].leaf_index 32u32 into r249; + rem r249 2u32 into r250; + is.eq r250 0u32 into r251; + cast 0field r247 r3[1u32].siblings[6u32] into r252 as [field; 3u32]; + cast 0field r3[1u32].siblings[6u32] r247 into r253 as [field; 3u32]; + ternary r251 r252[0u32] r253[0u32] into r254; + ternary r251 r252[1u32] r253[1u32] into r255; + ternary r251 r252[2u32] r253[2u32] into r256; + cast r254 r255 r256 into r257 as [field; 3u32]; + hash.psd4 r257 into r258 as field; + is.eq r3[1u32].siblings[7u32] 0field into r259; + div r3[1u32].leaf_index 64u32 into r260; + rem r260 2u32 into r261; + is.eq r261 0u32 into r262; + cast 0field r258 r3[1u32].siblings[7u32] into r263 as [field; 3u32]; + cast 0field r3[1u32].siblings[7u32] r258 into r264 as [field; 3u32]; + ternary r262 r263[0u32] r264[0u32] into r265; + ternary r262 r263[1u32] r264[1u32] into r266; + ternary r262 r263[2u32] r264[2u32] into r267; + cast r265 r266 r267 into r268 as [field; 3u32]; + hash.psd4 r268 into r269 as field; + is.eq r3[1u32].siblings[8u32] 0field into r270; + div r3[1u32].leaf_index 128u32 into r271; + rem r271 2u32 into r272; + is.eq r272 0u32 into r273; + cast 0field r269 r3[1u32].siblings[8u32] into r274 as [field; 3u32]; + cast 0field r3[1u32].siblings[8u32] r269 into r275 as [field; 3u32]; + ternary r273 r274[0u32] r275[0u32] into r276; + ternary r273 r274[1u32] r275[1u32] into r277; + ternary r273 r274[2u32] r275[2u32] into r278; + cast r276 r277 r278 into r279 as [field; 3u32]; + hash.psd4 r279 into r280 as field; + is.eq r3[1u32].siblings[9u32] 0field into r281; + div r3[1u32].leaf_index 256u32 into r282; + rem r282 2u32 into r283; + is.eq r283 0u32 into r284; + cast 0field r280 r3[1u32].siblings[9u32] into r285 as [field; 3u32]; + cast 0field r3[1u32].siblings[9u32] r280 into r286 as [field; 3u32]; + ternary r284 r285[0u32] r286[0u32] into r287; + ternary r284 r285[1u32] r286[1u32] into r288; + ternary r284 r285[2u32] r286[2u32] into r289; + cast r287 r288 r289 into r290 as [field; 3u32]; + hash.psd4 r290 into r291 as field; + is.eq r3[1u32].siblings[10u32] 0field into r292; + div r3[1u32].leaf_index 512u32 into r293; + rem r293 2u32 into r294; + is.eq r294 0u32 into r295; + cast 0field r291 r3[1u32].siblings[10u32] into r296 as [field; 3u32]; + cast 0field r3[1u32].siblings[10u32] r291 into r297 as [field; 3u32]; + ternary r295 r296[0u32] r297[0u32] into r298; + ternary r295 r296[1u32] r297[1u32] into r299; + ternary r295 r296[2u32] r297[2u32] into r300; + cast r298 r299 r300 into r301 as [field; 3u32]; + hash.psd4 r301 into r302 as field; + is.eq r3[1u32].siblings[11u32] 0field into r303; + div r3[1u32].leaf_index 1024u32 into r304; + rem r304 2u32 into r305; + is.eq r305 0u32 into r306; + cast 0field r302 r3[1u32].siblings[11u32] into r307 as [field; 3u32]; + cast 0field r3[1u32].siblings[11u32] r302 into r308 as [field; 3u32]; + ternary r306 r307[0u32] r308[0u32] into r309; + ternary r306 r307[1u32] r308[1u32] into r310; + ternary r306 r307[2u32] r308[2u32] into r311; + cast r309 r310 r311 into r312 as [field; 3u32]; + hash.psd4 r312 into r313 as field; + is.eq r3[1u32].siblings[12u32] 0field into r314; + div r3[1u32].leaf_index 2048u32 into r315; + rem r315 2u32 into r316; + is.eq r316 0u32 into r317; + cast 0field r313 r3[1u32].siblings[12u32] into r318 as [field; 3u32]; + cast 0field r3[1u32].siblings[12u32] r313 into r319 as [field; 3u32]; + ternary r317 r318[0u32] r319[0u32] into r320; + ternary r317 r318[1u32] r319[1u32] into r321; + ternary r317 r318[2u32] r319[2u32] into r322; + cast r320 r321 r322 into r323 as [field; 3u32]; + hash.psd4 r323 into r324 as field; + is.eq r3[1u32].siblings[13u32] 0field into r325; + div r3[1u32].leaf_index 4096u32 into r326; + rem r326 2u32 into r327; + is.eq r327 0u32 into r328; + cast 0field r324 r3[1u32].siblings[13u32] into r329 as [field; 3u32]; + cast 0field r3[1u32].siblings[13u32] r324 into r330 as [field; 3u32]; + ternary r328 r329[0u32] r330[0u32] into r331; + ternary r328 r329[1u32] r330[1u32] into r332; + ternary r328 r329[2u32] r330[2u32] into r333; + cast r331 r332 r333 into r334 as [field; 3u32]; + hash.psd4 r334 into r335 as field; + is.eq r3[1u32].siblings[14u32] 0field into r336; + div r3[1u32].leaf_index 8192u32 into r337; + rem r337 2u32 into r338; + is.eq r338 0u32 into r339; + cast 0field r335 r3[1u32].siblings[14u32] into r340 as [field; 3u32]; + cast 0field r3[1u32].siblings[14u32] r335 into r341 as [field; 3u32]; + ternary r339 r340[0u32] r341[0u32] into r342; + ternary r339 r340[1u32] r341[1u32] into r343; + ternary r339 r340[2u32] r341[2u32] into r344; + cast r342 r343 r344 into r345 as [field; 3u32]; + hash.psd4 r345 into r346 as field; + is.eq r3[1u32].siblings[15u32] 0field into r347; + div r3[1u32].leaf_index 16384u32 into r348; + rem r348 2u32 into r349; + is.eq r349 0u32 into r350; + cast 0field r346 r3[1u32].siblings[15u32] into r351 as [field; 3u32]; + cast 0field r3[1u32].siblings[15u32] r346 into r352 as [field; 3u32]; + ternary r350 r351[0u32] r352[0u32] into r353; + ternary r350 r351[1u32] r352[1u32] into r354; + ternary r350 r351[2u32] r352[2u32] into r355; + cast r353 r354 r355 into r356 as [field; 3u32]; + hash.psd4 r356 into r357 as field; + ternary r347 r346 r357 into r358; + ternary r347 14u32 15u32 into r359; + ternary r336 r335 r358 into r360; + ternary r336 13u32 r359 into r361; + ternary r325 r324 r360 into r362; + ternary r325 12u32 r361 into r363; + ternary r314 r313 r362 into r364; + ternary r314 11u32 r363 into r365; + ternary r303 r302 r364 into r366; + ternary r303 10u32 r365 into r367; + ternary r292 r291 r366 into r368; + ternary r292 9u32 r367 into r369; + ternary r281 r280 r368 into r370; + ternary r281 8u32 r369 into r371; + ternary r270 r269 r370 into r372; + ternary r270 7u32 r371 into r373; + ternary r259 r258 r372 into r374; + ternary r259 6u32 r373 into r375; + ternary r248 r247 r374 into r376; + ternary r248 5u32 r375 into r377; + ternary r237 r236 r376 into r378; + ternary r237 4u32 r377 into r379; + ternary r226 r225 r378 into r380; + ternary r226 3u32 r379 into r381; + ternary r215 r214 r380 into r382; + ternary r215 2u32 r381 into r383; + ternary r204 r203 r382 into r384; + ternary r204 1u32 r383 into r385; + assert.eq r193 r384; + assert.eq r194 r385; + cast r2.owner into r386 as field; + is.eq r3[0u32].leaf_index r3[1u32].leaf_index into r387; + is.eq r3[0u32].leaf_index 0u32 into r388; + lt r386 r3[0u32].siblings[0u32] into r389; + and r387 r388 into r390; + not r390 into r391; + or r389 r391 into r392; + assert.eq r392 true; + not r388 into r393; + pow 2u32 r194 into r394; + sub r394 1u32 into r395; + and r387 r393 into r396; + not r396 into r397; + is.eq r3[0u32].leaf_index r395 into r398; + or r398 r397 into r399; + assert.eq r399 true; + gt r386 r3[0u32].siblings[0u32] into r400; + or r400 r397 into r401; + assert.eq r401 true; + not r387 into r402; + gt r386 r3[0u32].siblings[0u32] into r403; + not r402 into r404; + or r403 r404 into r405; + assert.eq r405 true; + lt r386 r3[1u32].siblings[0u32] into r406; + or r406 r404 into r407; + assert.eq r407 true; + lte r3[1u32].leaf_index r395 into r408; + or r408 r404 into r409; + assert.eq r409 true; + add r3[0u32].leaf_index 1u32 into r410; + is.eq r410 r3[1u32].leaf_index into r411; + or r411 r404 into r412; + assert.eq r412 true; + sub r2.amount r1 into r413; + cast r2.owner r413 into r414 as Token.record; + cast aleo1mnldqsfrwayzfep3t9zusu4y7yknsdhfwx76v5pajla35mrqn5xsvvurhy r1 r2.owner r0 into r415 as ComplianceRecord.record; + async transfer_private_to_public r193 r0 r1 into r416; + output r415 as ComplianceRecord.record; + output r414 as Token.record; + output r416 as test_usdcx_stablecoin.aleo/transfer_private_to_public.future; + +finalize transfer_private_to_public: + input r0 as field.public; + input r1 as address.public; + input r2 as u128.public; + get pause[true] into r3; + assert.eq r3 false; + get test_usdcx_freezelist.aleo/freeze_list_root[1u8] into r4; + get test_usdcx_freezelist.aleo/block_height_window[true] into r5; + is.neq r4 r0 into r6; + branch.eq r6 false to end_then_0_6; + get test_usdcx_freezelist.aleo/freeze_list_root[2u8] into r7; + assert.eq r0 r7; + get test_usdcx_freezelist.aleo/root_updated_height[true] into r8; + add r8 r5 into r9; + gt r9 block.height into r10; + assert.eq r10 true; + branch.eq true true to end_otherwise_0_7; + position end_then_0_6; + position end_otherwise_0_7; + get.or_use test_usdcx_freezelist.aleo/freeze_list[r1] false into r11; + assert.eq r11 false; + get.or_use balances[r1] 0u128 into r12; + add r12 r2 into r13; + set r13 into balances[r1]; + +function set_pause_status: + input r0 as boolean.private; + async set_pause_status r0 self.caller into r1; + output r1 as test_usdcx_stablecoin.aleo/set_pause_status.future; + +finalize set_pause_status: + input r0 as boolean.public; + input r1 as address.public; + get address_to_role[r1] into r2; + and r2 4u16 into r3; + is.eq r3 4u16 into r4; + assert.eq r4 true; + set r0 into pause[true]; + +function join: + input r0 as Token.record; + input r1 as Token.record; + add r0.amount r1.amount into r2; + cast r0.owner r2 into r3 as Token.record; + output r3 as Token.record; + +function split: + input r0 as Token.record; + input r1 as u128.private; + cast r0.owner r1 into r2 as Token.record; + sub r0.amount r1 into r3; + cast r0.owner r3 into r4 as Token.record; + output r2 as Token.record; + output r4 as Token.record; + +function transfer_private_with_creds: + input r0 as address.private; + input r1 as u128.private; + input r2 as Token.record; + input r3 as Credentials.record; + sub r2.amount r1 into r4; + cast r2.owner r4 into r5 as Token.record; + cast r0 r1 into r6 as Token.record; + cast aleo1mnldqsfrwayzfep3t9zusu4y7yknsdhfwx76v5pajla35mrqn5xsvvurhy r1 r2.owner r0 into r7 as ComplianceRecord.record; + cast r3.owner r3.freeze_list_root into r8 as Credentials.record; + async transfer_private_with_creds r3.freeze_list_root into r9; + output r7 as ComplianceRecord.record; + output r5 as Token.record; + output r6 as Token.record; + output r8 as Credentials.record; + output r9 as test_usdcx_stablecoin.aleo/transfer_private_with_creds.future; + +finalize transfer_private_with_creds: + input r0 as field.public; + get pause[true] into r1; + assert.eq r1 false; + get test_usdcx_freezelist.aleo/freeze_list_root[1u8] into r2; + get test_usdcx_freezelist.aleo/block_height_window[true] into r3; + is.neq r2 r0 into r4; + branch.eq r4 false to end_then_0_8; + get test_usdcx_freezelist.aleo/freeze_list_root[2u8] into r5; + assert.eq r0 r5; + get test_usdcx_freezelist.aleo/root_updated_height[true] into r6; + add r6 r3 into r7; + gt r7 block.height into r8; + assert.eq r8 true; + branch.eq true true to end_otherwise_0_9; + position end_then_0_8; + position end_otherwise_0_9; + +function update_token_info: + input r0 as u128.public; + input r1 as u128.public; + input r2 as u128.public; + async update_token_info r0 r1 r2 self.caller into r3; + output r3 as test_usdcx_stablecoin.aleo/update_token_info.future; + +finalize update_token_info: + input r0 as u128.public; + input r1 as u128.public; + input r2 as u128.public; + input r3 as address.public; + get address_to_role[r3] into r4; + is.eq r4 8u16 into r5; + assert.eq r5 true; + get token_info[true] into r6; + cast r0 r1 r6.decimals r6.supply r2 into r7 as TokenInfo; + set r7 into token_info[true]; + +constructor: + is.eq edition 0u16 into r0; + branch.eq r0 false to end_then_0_10; + branch.eq true true to end_otherwise_0_11; + position end_then_0_10; + cast checksum edition into r1 as ChecksumEdition; + hash.bhp256 r1 into r2 as field; + cast test_usdcx_stablecoin.aleo r2 into r3 as WalletSigningOpId; + hash.bhp256 r3 into r4 as field; + contains test_usdcx_multisig_core.aleo/completed_signing_ops[r4] into r5; + assert.eq r5 true; + position end_otherwise_0_11; diff --git a/examples/private-mint/private-mint-wrapper/program.json b/examples/private-mint/private-mint-wrapper/program.json new file mode 100644 index 00000000..695beffc --- /dev/null +++ b/examples/private-mint/private-mint-wrapper/program.json @@ -0,0 +1,40 @@ +{ + "program": "bridge_demo_v1.aleo", + "version": "0.1.0", + "description": "", + "license": "MIT", + "leo": "3.5.0", + "dependencies": [ + { + "name": "merkle_tree.aleo", + "location": "local", + "path": "imports/merkle_tree.aleo", + "edition": null + }, + { + "name": "test_usdcx_multisig_core.aleo", + "location": "local", + "path": "imports/test_usdcx_multisig_core.aleo", + "edition": null + }, + { + "name": "test_usdcx_freezelist.aleo", + "location": "local", + "path": "imports/test_usdcx_freezelist.aleo", + "edition": null + }, + { + "name": "test_usdcx_stablecoin.aleo", + "location": "local", + "path": "imports/test_usdcx_stablecoin.aleo", + "edition": null + }, + { + "name": "test_usdcx_bridge.aleo", + "location": "local", + "path": "imports/test_usdcx_bridge.aleo", + "edition": null + } + ], + "dev_dependencies": null +} diff --git a/examples/private-mint/private-mint-wrapper/src/main.leo b/examples/private-mint/private-mint-wrapper/src/main.leo new file mode 100644 index 00000000..badc7fb6 --- /dev/null +++ b/examples/private-mint/private-mint-wrapper/src/main.leo @@ -0,0 +1,95 @@ +import test_usdcx_bridge.aleo; +import test_usdcx_stablecoin.aleo; +import test_usdcx_multisig_core.aleo; +import test_usdcx_freezelist.aleo; +import merkle_tree.aleo; + +const NATIVE_DOMAIN: u32 = 1002u32; +const ETH_ADDRESS: [u8;32] = [0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 30u8, 25u8, 109u8, 10u8, 125u8, 129u8, 137u8, 5u8, 76u8, 77u8, 183u8, 68u8, 171u8, 51u8, 64u8, 195u8, 241u8, 198u8, 139u8, 25u8]; + +fn get_amount_from_bytes(amount_bytes: [u8; 16]) -> u128 { + let sum: u128 = 0; + for i in 0u8..16u8 { + sum = sum + (amount_bytes[i] as u128) * (2u128.pow(8u32 * (15u32 - (i as u32))) as u128); + } + return sum; +} + +// The 'bridge demo' program. +program bridge_demo_v1.aleo { + @custom() + constructor() { + if self.edition > 0u16 { + assert_eq(self.program_owner, aleo1rhgdu77hgyqd3xjj8ucu3jj9r2krwz6mnzyd80gncr5fxcwlh5rsvzp9px); + } + } + + fn mint_and_send_private(payload: [u8; 240], sig: [u8; 65], hash: [u8; 32], hook_data: [u8; 32]) -> (test_usdcx_stablecoin.aleo::Token, Final) { + let amount_bytes: [u8; 16] =[0u8; 16]; // Initialize an array to hold the amount bytes + for i in 0u8..16u8{ + amount_bytes[i] = payload[24u8 + i]; + } + let amount: u128 = get_amount_from_bytes(amount_bytes); + let mint_to_vault_final: Final = test_usdcx_bridge.aleo::mint_public(payload, sig, hash, hook_data); + + // let mint_to_hyp_vault: Final = hyp_warp_token_usad::process(...); + + let (receipt, token_record, transfer_final) = test_usdcx_stablecoin.aleo::transfer_public_to_private(self.signer, amount); + return (token_record, final { + mint_to_vault_final.run(); + transfer_final.run(); + }); + } + + fn mint_and_send_public(payload: [u8; 240], sig: [u8; 65], hash: [u8; 32], hook_data: [u8; 32]) -> Final { + assert_eq(self.caller, aleo1rhgdu77hgyqd3xjj8ucu3jj9r2krwz6mnzyd80gncr5fxcwlh5rsvzp9px); + let amount_bytes: [u8; 16] =[0u8; 16]; // Initialize an array to hold the amount bytes + for i in 0u8..16u8{ + amount_bytes[i] = payload[24u8 + i]; + } + let amount: u128 = get_amount_from_bytes(amount_bytes); + let mint_to_vault_final: Final = test_usdcx_bridge.aleo::mint_public(payload, sig, hash, hook_data); + let transfer_final = test_usdcx_stablecoin.aleo::transfer_public(self.signer, amount); + return final { + mint_to_vault_final.run(); + transfer_final.run(); + }; + } + + fn deposit_public_usdcx_to_vault(amount: u128)-> Final { + let transfer_final: Final = test_usdcx_stablecoin.aleo::transfer_public_as_signer(self.address, amount); + return final { + transfer_final.run(); + }; + } + + fn deposit_private_usdcx_to_vault(amount: u128, user_record: test_usdcx_stablecoin.aleo::Token, merkle_proof: [test_usdcx_stablecoin.aleo::MerkleProof; 2]) -> Final { + let (receipt, return_token, transfer_final) = test_usdcx_stablecoin.aleo::transfer_private_to_public(self.address, amount, user_record, merkle_proof); + return final { + transfer_final.run(); + }; + } + + fn withdraw_from_vault_public(amount: u128) -> Final { + let transfer_final = test_usdcx_stablecoin.aleo::transfer_public(self.signer, amount); + return final { + transfer_final.run(); + }; + } + + fn withdraw_from_vault_private(amount: u128, recipient: address) -> Final { + let (receipt, token_record, transfer_final) = test_usdcx_stablecoin.aleo::transfer_public_to_private(self.signer, amount); + return final { + transfer_final.run(); + }; + } + + fn burn_private(user_record: test_usdcx_stablecoin.aleo::Token, amount: u128, merkle_proof: [test_usdcx_stablecoin.aleo::MerkleProof; 2]) -> Final { + let (receipt, return_token, transfer_final) = test_usdcx_stablecoin.aleo::transfer_private_to_public(self.address, amount, user_record, merkle_proof); + let burn_final = test_usdcx_bridge.aleo::burn_public(amount, NATIVE_DOMAIN, ETH_ADDRESS); + return final { + transfer_final.run(); + burn_final.run(); + }; + } +} \ No newline at end of file diff --git a/examples/private-mint/program.json b/examples/private-mint/program.json new file mode 100644 index 00000000..aac3465e --- /dev/null +++ b/examples/private-mint/program.json @@ -0,0 +1,8 @@ +{ + "name": "@veil/wrapper-program-demo", + "private": true, + "type": "module", + "scripts": { + "test": "PRIVATE_MINT=1 pnpm -w exec vitest run examples/usdcx-private-mints/wrapper-program-test.ts" + } +} \ No newline at end of file diff --git a/examples/private-mint/tests/private-mint.test.ts b/examples/private-mint/tests/private-mint.test.ts new file mode 100644 index 00000000..c1960583 --- /dev/null +++ b/examples/private-mint/tests/private-mint.test.ts @@ -0,0 +1,185 @@ +/** + * Private mint with wrapper program E2E test suite. + * + * Run with: + * usdcx-private-mint=1 pnpm vitest run examples/usdcx-private-mint/private-mint-test.ts + * + * All tests share a single devnode started in beforeAll. They run sequentially + * because each suite builds on the on-chain state from the previous one. + */ + +import { describe, it, expect, beforeAll, afterAll } from 'vitest' +import { readFileSync } from 'node:fs' +import { resolve, dirname } from 'node:path' +import { fileURLToPath } from 'node:url' + +import { createTestClient, http, type TestClient, type WalletClient, type PublicClient } from '@veil/core' +import type { LocalAccount } from '@veil/core' +import { startDevnode, type DevnodeInstance } from '@veil/devnode' +import { createDevnodeClient } from '@veil/provable' +import { createLeoClient } from '@veil/leo' + + +const RUN = process.env.PRIVATE_MINT_E2E === '1' + +const __filename = fileURLToPath(import.meta.url) +const __dirname = dirname(__filename) +const WRAPPER_DIR = resolve(__dirname, '..', 'private-mint-wrapper') + +// ── Test constants ──────────────────────────────────────────────────────────── + + + +// ── Shared state (populated in beforeAll / setup tests) ──────────────────────── + +let devnode: DevnodeInstance +let testClient: TestClient + +let adminWallet: WalletClient +let adminAccount: LocalAccount<'privateKey'> +let publicClient: PublicClient + + +// ── Deployment helpers ──────────────────────────────────────────────────────── + +async function buildAndDeploy(_name: string, aleoPath: string, leoDir?: string) { + if (leoDir) { + const leo = createLeoClient({ cwd: leoDir, quiet: true, network: 'testnet', endpoint: `http://${devnode.socketAddr}` }) + await leo.build() + } + const source = readFileSync(aleoPath, 'utf-8') + const txId = await adminWallet.deployContract({ program: source }) + return txId +} + +async function deployAllPrograms() { + await buildAndDeploy( + 'merkle_tree', + resolve(WRAPPER_DIR, 'build/imports/merkle_tree.aleo'), + WRAPPER_DIR, + ) + await buildAndDeploy( + 'test_usdcx_multisig_core', + resolve(WRAPPER_DIR, 'imports/test_usdcx_multisig_core.aleo'), + ) + await buildAndDeploy( + 'test_usdcx_freezelist', + resolve(WRAPPER_DIR, 'imports/test_usdcx_freezelist.aleo'), + ) + await buildAndDeploy( + 'test_usdcx_stablecoin', + resolve(WRAPPER_DIR, 'imports/test_usdcx_stablecoin.aleo'), + ) + await buildAndDeploy( + 'test_usdcx_bridge', + resolve(WRAPPER_DIR, 'imports/test_usdcx_bridge.aleo'), + ) + await buildAndDeploy( + 'wrapper_demo', + resolve(WRAPPER_DIR, 'build/main.aleo'), + ) +} + + + +// ── Test suite ──────────────────────────────────────────────────────────────── + +describe.runIf(RUN)('PRIVATE MINT E2E', () => { + beforeAll(async () => { + devnode = await startDevnode({ readyTimeout: 45_000, manualBlockCreation: false }) + + testClient = createTestClient({ transport: http(`http://${devnode.socketAddr}`, { network: 'testnet' }) }) + + const admin = createDevnodeClient({ socketAddr: devnode.socketAddr }) + adminWallet = admin.walletClient + adminAccount = admin.account + publicClient = admin.publicClient + + await deployAllPrograms() + }, 300_000) + + afterAll(async () => { + try { await testClient.shutdown() } catch {} + try { await devnode.stop() } catch {} + }, 30_000) + + // ── 01 Initialize USDCx stablecoin and bridge ──────────────────────────────── + + describe('01 - initialize stablecoin and bridge', () => { + it('initializes the freeze list', async () => { + await adminWallet.writeContract({ + program: 'test_usdcx_freezelist.aleo', + function: 'initialize', + inputs: [adminAccount.address, '100u32'], + }) + const role = await publicClient.readMapping({ + programId: 'test_usdcx_freezelist.aleo', + mapping: 'address_to_role', + key: adminAccount.address, + }) + expect(role).toBe('8u16') + }) + + it('initializes the USDCX stablecoin program', async () => { + await adminWallet.writeContract({ + program: 'test_usdcx_stablecoin.aleo', + function: 'initialize', + inputs: ['1u128', '1u128', '6u8', '123456789123456789u128', adminAccount.address], + }) + const role = await publicClient.readMapping({ + programId: 'test_usdcx_stablecoin.aleo', + mapping: 'address_to_role', + key: adminAccount.address, + }) + expect(role).toBe('8u16') + }) + + it('grants minter/burner role to the bridge', async () => { + const bridgeAddress = 'aleo1khwgr8x8f9ywwx2p4w55hm0x7rczcf2weqn7nsxcwqckpcgwvczq3wzkwx' + await adminWallet.writeContract({ + program: 'test_usdcx_stablecoin.aleo', + function: 'update_role', + inputs: [bridgeAddress, '3u16'], + }) + const role = await publicClient.readMapping({ + programId: 'test_usdcx_stablecoin.aleo', + mapping: 'address_to_role', + key: bridgeAddress, + }) + expect(role).toBe('3u16') + }) + }) + + // ── 02 Private mint ────────────────────────────────────────────────────────── + + describe('02 - mint_and_send_private', () => { + const payload = '[90u8, 46u8, 10u8, 205u8, 0u8, 0u8, 0u8, 1u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 152u8, 150u8, 128u8, 0u8, 0u8, 39u8, 18u8, 177u8, 67u8, 237u8, 82u8, 199u8, 116u8, 205u8, 29u8, 74u8, 81u8, 157u8, 14u8, 121u8, 111u8, 21u8, 145u8, 107u8, 229u8, 169u8, 225u8, 212u8, 94u8, 220u8, 217u8, 133u8, 45u8, 210u8, 63u8, 104u8, 245u8, 52u8, 1u8, 95u8, 61u8, 75u8, 246u8, 135u8, 83u8, 141u8, 76u8, 35u8, 213u8, 12u8, 86u8, 111u8, 12u8, 81u8, 194u8, 124u8, 133u8, 60u8, 16u8, 183u8, 39u8, 31u8, 81u8, 31u8, 149u8, 178u8, 63u8, 51u8, 76u8, 25u8, 10u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 28u8, 125u8, 75u8, 25u8, 108u8, 176u8, 199u8, 176u8, 29u8, 116u8, 63u8, 188u8, 97u8, 22u8, 169u8, 2u8, 55u8, 156u8, 114u8, 56u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 30u8, 25u8, 109u8, 10u8, 125u8, 129u8, 137u8, 5u8, 76u8, 77u8, 183u8, 68u8, 171u8, 51u8, 64u8, 195u8, 241u8, 198u8, 139u8, 25u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 1u8, 134u8, 160u8, 180u8, 125u8, 34u8, 77u8, 134u8, 8u8, 93u8, 12u8, 86u8, 236u8, 88u8, 230u8, 162u8, 93u8, 169u8, 246u8, 188u8, 109u8, 110u8, 75u8, 174u8, 134u8, 165u8, 59u8, 62u8, 120u8, 204u8, 241u8, 104u8, 66u8, 113u8, 75u8, 0u8, 0u8, 0u8, 0u8]' + const sig = '[19u8, 105u8, 51u8, 13u8, 237u8, 80u8, 138u8, 87u8, 161u8, 185u8, 166u8, 77u8, 142u8, 5u8, 15u8, 79u8, 105u8, 101u8, 86u8, 91u8, 73u8, 88u8, 251u8, 29u8, 230u8, 60u8, 245u8, 68u8, 132u8, 149u8, 166u8, 112u8, 7u8, 24u8, 78u8, 69u8, 194u8, 178u8, 93u8, 35u8, 73u8, 67u8, 114u8, 247u8, 191u8, 1u8, 156u8, 216u8, 15u8, 222u8, 122u8, 52u8, 140u8, 250u8, 209u8, 16u8, 228u8, 5u8, 144u8, 181u8, 64u8, 226u8, 220u8, 212u8, 28u8]' + const digest = '[173u8, 0u8, 115u8, 131u8, 217u8, 69u8, 125u8, 6u8, 56u8, 241u8, 5u8, 99u8, 8u8, 32u8, 76u8, 245u8, 109u8, 176u8, 182u8, 163u8, 59u8, 114u8, 149u8, 129u8, 255u8, 60u8, 211u8, 36u8, 253u8, 162u8, 64u8, 155u8]' + const hookData = '[1u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8]' + const nonce = '[180u8, 125u8, 34u8, 77u8, 134u8, 8u8, 93u8, 12u8, 86u8, 236u8, 88u8, 230u8, 162u8, 93u8, 169u8, 246u8, 188u8, 109u8, 110u8, 75u8, 174u8, 134u8, 165u8, 59u8, 62u8, 120u8, 204u8, 241u8, 104u8, 66u8, 113u8, 75u8]' + + it('nullifier is unset before mint', async () => { + const result = await publicClient.readMapping({ + programId: 'test_usdcx_bridge.aleo', + mapping: 'nullifier', + key: nonce, + }) + expect(result).toBeNull() + }) + + it('mints USDCx privately to the recipient', async () => { + await adminWallet.writeContract({ + program: 'bridge_demo_v1.aleo', + function: 'mint_and_send_private', + inputs: [payload, sig, digest, hookData], + }) + const nullifierSet = await publicClient.readMapping({ + programId: 'test_usdcx_bridge.aleo', + mapping: 'nullifier', + key: nonce, + }) + expect(nullifierSet).toBe('true') + }) + }) +}) \ No newline at end of file diff --git a/packages/core/src/transports/http.ts b/packages/core/src/transports/http.ts index 1fbb67d3..fe8c94b7 100644 --- a/packages/core/src/transports/http.ts +++ b/packages/core/src/transports/http.ts @@ -80,7 +80,7 @@ function buildUrl( case 'findTransactionId': return { url: `${base}/find/transactionID/${enc(params?.transitionId)}`, httpMethod: 'GET' } case 'sendTransaction': - return { url: `${base}/transaction/broadcast`, httpMethod: 'POST', body: JSON.stringify(params?.transaction) } + return { url: `${base}/transaction/broadcast`, httpMethod: 'POST', body: params?.transaction as string } // --- Transition --- case 'getTransitions': @@ -93,7 +93,7 @@ function buildUrl( case 'getProgram': return { url: `${base}/program/${enc(params?.programId)}`, httpMethod: 'GET' } case 'getMappingValue': - return { url: `${base}/program/${enc(params?.programId)}/mapping/${enc(params?.mapping)}/${enc(params?.key)}`, httpMethod: 'GET' } + return { url: `${base}/program/${enc(params?.programId)}/mapping/${enc(params?.mapping)}/${String(params?.key ?? '').replace(/ /g, '%20')}`, httpMethod: 'GET' } case 'getMappingNames': return { url: `${base}/program/${enc(params?.programId)}/mappings`, httpMethod: 'GET' } case 'getDeploymentTransaction': diff --git a/vitest.config.ts b/vitest.config.ts index 9b9b945f..1c6c7cd9 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -4,7 +4,7 @@ import path from 'path' export default defineConfig({ test: { globals: true, - include: ['packages/*/test/**/*.test.ts', 'examples/**/*.ts'], + include: ['packages/*/test/**/*.test.ts', 'examples/**/*.test.ts'], }, resolve: { alias: { @@ -13,6 +13,8 @@ export default defineConfig({ '@veil/core': path.resolve(__dirname, 'packages/core/src/index.ts'), '@veil/wallet-adapter': path.resolve(__dirname, 'packages/wallet-adapter/src/index.ts'), '@veil/provable': path.resolve(__dirname, 'packages/provable/src/index.ts'), + '@veil/leo': path.resolve(__dirname, 'packages/leo/src/index.ts'), + '@veil/devnode': path.resolve(__dirname, 'packages/devnode/src/index.ts'), }, }, })