The explorer is out of sync. The last synced block is 195 hours ago. Current block height: explorer: 2206528 / node: 2332785 / ref: 2332785

Program arcane_amm_v2_1.aleo

Program ID
arcane_amm_v2_1.aleo
Owner signature
sign1yzra905r9vkh2fcyz7njhv2anysp3ss3x59d8qxphd9220zrvypspy2z96h5wp4v8yyxyeutq5qxu3xtv2f3sefefzy2f9v8qea7vqgm8555plq8qm58hteazn04fgnvceu4hnp7zj3ekzquseymgmanpdnzxhqtsugxlmvxwjmkv6xc8al30jgjgj4cfrs9ks4pt9temfjpzu3clg0
Times called
1
Similar programs
Mappings
amm_pools (field -> PoolInfo)
amm_deposits (field -> u128)
amm_extras (field -> ExtraAmount)
protocol_fee (field -> ProtocolFeeConfig)
accrued_protocol_fees (u64 -> u128)
Structs
PoolKey
PoolInfo
DepositKey
ExtraAmount
CollectedFee
ProtocolFeeConfig
Records
PoolAdmin
LpTokenReceipt
ExtraAmountVoucher
Functions
-
Transitions
set_protocol_fee_private(arcane_access.aleo/Access, field, ProtocolFeeConfig) -> arcane_access.aleo/Access finalize(field, ProtocolFeeConfig)
set_protocol_fee_public(field, ProtocolFeeConfig) -> () finalize(field, ProtocolFeeConfig)
transfer_protocol_fees(u64, address, u128) -> () finalize(u64, address, u128)
create_pool(address, arcanetoken_v2_0.aleo/ArcaneToken, u128, arcanetoken_v2_0.aleo/ArcaneToken, u128, u128) -> (PoolAdmin, arcanetoken_v2_0.aleo/ArcaneToken, arcanetoken_v2_0.aleo/ArcaneToken) finalize(field, u64, u128, u64, u128, u128)
transfer_pool_ownership(PoolAdmin, address) -> PoolAdmin
add_amm_liquidity(address, arcanetoken_v2_0.aleo/ArcaneToken, u128, u128, arcanetoken_v2_0.aleo/ArcaneToken, u128, u128, field) -> (arcanetoken_v2_0.aleo/ArcaneToken, arcanetoken_v2_0.aleo/ArcaneToken, LpTokenReceipt) finalize(field, u64, u128, u128, u64, u128, u128)
remove_amm_liquidity(address, LpTokenReceipt, u128, u128, field, field) -> (arcanetoken_v2_0.aleo/ArcaneToken, arcanetoken_v2_0.aleo/ArcaneToken, ExtraAmountVoucher, ExtraAmountVoucher) finalize(field, u64, u64, u128, u128, field, field)
remove_amm_liquidity_part(address, LpTokenReceipt, u128, u128) -> (arcanetoken_v2_0.aleo/ArcaneToken, arcanetoken_v2_0.aleo/ArcaneToken, LpTokenReceipt) finalize(field, u64, u64, u128, u128)
swap_amm(address, arcanetoken_v2_0.aleo/ArcaneToken, u128, u64, u128, field) -> (arcanetoken_v2_0.aleo/ArcaneToken, arcanetoken_v2_0.aleo/ArcaneToken, ExtraAmountVoucher) finalize(u64, u128, u64, u128, field)
swap_public_amm(address, u64, u128, u64, u128, field) -> ExtraAmountVoucher finalize(u64, u128, u64, u128, field)
redeem_voucher(ExtraAmountVoucher, u128) -> arcanetoken_v2_0.aleo/ArcaneToken finalize(u64, field, u128)
Program Source Code (Aleo Instruction) Upload Leo source

import arcane_access.aleo;
import arcanetoken_v2_0.aleo;

program arcane_amm_v2_1.aleo;

struct PoolKey:
    token1 as u64;
    token2 as u64;

record PoolAdmin:
    owner as address.private;
    pool_key as field.private;

struct PoolInfo:
    id as field;
    token1_id as u64;
    token2_id as u64;
    reserve1 as u128;
    reserve2 as u128;
    lp_total_supply as u128;
    swap_fee as u128;

struct DepositKey:
    holder as address;
    pool_key as field;
    deposit_id as field;

record LpTokenReceipt:
    owner as address.private;
    token1_id as u64.private;
    token2_id as u64.private;
    deposit_id as field.private;

struct ExtraAmount:
    token_id as u64;
    token_amount as u128;

struct CollectedFee:
    fee_token_id as u64;
    pool_fee as u128;
    protocol_fee as u128;

struct ProtocolFeeConfig:
    rate as u64;
    foundation as address;

record ExtraAmountVoucher:
    owner as address.private;
    token_id as u64.private;
    voucher as field.private;

mapping amm_pools:
    key as field.public;
    value as PoolInfo.public;

mapping amm_deposits:
    key as field.public;
    value as u128.public;

mapping amm_extras:
    key as field.public;
    value as ExtraAmount.public;

mapping protocol_fee:
    key as field.public;
    value as ProtocolFeeConfig.public;

mapping accrued_protocol_fees:
    key as u64.public;
    value as u128.public;

function set_protocol_fee_private:
    input r0 as arcane_access.aleo/Access.record;
    input r1 as field.private;
    input r2 as ProtocolFeeConfig.private;
    call arcane_access.aleo/check_access_private r0 into r3 r4;
    async set_protocol_fee_private r4 r1 r2 into r5;
    output r3 as arcane_access.aleo/Access.record;
    output r5 as arcane_amm_v2_1.aleo/set_protocol_fee_private.future;
finalize set_protocol_fee_private:
    input r0 as arcane_access.aleo/check_access_private.future;
    input r1 as field.public;
    input r2 as ProtocolFeeConfig.public;
    await r0;
    is.eq r1 1field into r3;
    contains amm_pools[r1] into r4;
    or r3 r4 into r5;
    assert.eq r5 true;
    set r2 into protocol_fee[r1];

function set_protocol_fee_public:
    input r0 as field.private;
    input r1 as ProtocolFeeConfig.private;
    call arcane_access.aleo/check_access_public self.caller into r2;
    async set_protocol_fee_public r2 r0 r1 into r3;
    output r3 as arcane_amm_v2_1.aleo/set_protocol_fee_public.future;
finalize set_protocol_fee_public:
    input r0 as arcane_access.aleo/check_access_public.future;
    input r1 as field.public;
    input r2 as ProtocolFeeConfig.public;
    await r0;
    is.eq r1 1field into r3;
    contains amm_pools[r1] into r4;
    or r3 r4 into r5;
    assert.eq r5 true;
    set r2 into protocol_fee[r1];

function transfer_protocol_fees:
    input r0 as u64.private;
    input r1 as address.private;
    input r2 as u128.private;
    call arcanetoken_v2_0.aleo/transfer_public r0 r1 r2 into r3;
    async transfer_protocol_fees r3 r0 r1 r2 into r4;
    output r4 as arcane_amm_v2_1.aleo/transfer_protocol_fees.future;
finalize transfer_protocol_fees:
    input r0 as arcanetoken_v2_0.aleo/transfer_public.future;
    input r1 as u64.public;
    input r2 as address.public;
    input r3 as u128.public;
    await r0;
    get.or_use accrued_protocol_fees[r1] 0u128 into r4;
    gte r4 r3 into r5;
    assert.eq r5 true;
    get protocol_fee[1field] into r6;
    is.eq r6.foundation r2 into r7;
    assert.eq r7 true;
    sub r4 r3 into r8;
    set r8 into accrued_protocol_fees[r1];

function create_pool:
    input r0 as address.private;
    input r1 as arcanetoken_v2_0.aleo/ArcaneToken.record;
    input r2 as u128.private;
    input r3 as arcanetoken_v2_0.aleo/ArcaneToken.record;
    input r4 as u128.private;
    input r5 as u128.private;
    gt r2 0u128 into r6;
    gt r4 0u128 into r7;
    and r6 r7 into r8;
    assert.eq r8 true;
    lte r5 10000u128 into r9;
    assert.eq r9 true;
    is.neq r1.token_id r3.token_id into r10;
    assert.eq r10 true;
    gte r1.amount r2 into r11;
    gte r3.amount r4 into r12;
    and r11 r12 into r13;
    assert.eq r13 true;
    lt r1.token_id r3.token_id into r14;
    assert.eq r14 true;
    call arcanetoken_v2_0.aleo/transfer_private_to_public r1 aleo1hy8w46tflux7zwpeaw8ny7tq6wkzqux40z75a9ah3q9tqa4t758qltkqu7 r2 into r15 r16;
    call arcanetoken_v2_0.aleo/transfer_private_to_public r3 aleo1hy8w46tflux7zwpeaw8ny7tq6wkzqux40z75a9ah3q9tqa4t758qltkqu7 r4 into r17 r18;
    gt r1.token_id r3.token_id into r19;
    ternary r19 r3.token_id r1.token_id into r20;
    lte r1.token_id r3.token_id into r21;
    ternary r21 r3.token_id r1.token_id into r22;
    cast r20 r22 into r23 as PoolKey;
    hash.bhp256 r23 into r24 as field;
    cast r0 r24 into r25 as PoolAdmin.record;
    async create_pool r16 r18 r24 r1.token_id r2 r3.token_id r4 r5 into r26;
    output r25 as PoolAdmin.record;
    output r15 as arcanetoken_v2_0.aleo/ArcaneToken.record;
    output r17 as arcanetoken_v2_0.aleo/ArcaneToken.record;
    output r26 as arcane_amm_v2_1.aleo/create_pool.future;
finalize create_pool:
    input r0 as arcanetoken_v2_0.aleo/transfer_private_to_public.future;
    input r1 as arcanetoken_v2_0.aleo/transfer_private_to_public.future;
    input r2 as field.public;
    input r3 as u64.public;
    input r4 as u128.public;
    input r5 as u64.public;
    input r6 as u128.public;
    input r7 as u128.public;
    await r0;
    await r1;
    contains amm_pools[r2] into r8;
    not r8 into r9;
    assert.eq r9 true;
    mul r4 r6 into r10;
    cast r2 r3 r5 r4 r6 r10 r7 into r11 as PoolInfo;
    set r11 into amm_pools[r2];

function transfer_pool_ownership:
    input r0 as PoolAdmin.record;
    input r1 as address.private;
    is.eq r0.owner self.caller into r2;
    assert.eq r2 true;
    cast r1 r0.pool_key into r3 as PoolAdmin.record;
    output r3 as PoolAdmin.record;

function add_amm_liquidity:
    input r0 as address.private;
    input r1 as arcanetoken_v2_0.aleo/ArcaneToken.record;
    input r2 as u128.private;
    input r3 as u128.private;
    input r4 as arcanetoken_v2_0.aleo/ArcaneToken.record;
    input r5 as u128.private;
    input r6 as u128.private;
    input r7 as field.private;
    call arcanetoken_v2_0.aleo/transfer_private_to_public r1 aleo1hy8w46tflux7zwpeaw8ny7tq6wkzqux40z75a9ah3q9tqa4t758qltkqu7 r2 into r8 r9;
    call arcanetoken_v2_0.aleo/transfer_private_to_public r4 aleo1hy8w46tflux7zwpeaw8ny7tq6wkzqux40z75a9ah3q9tqa4t758qltkqu7 r5 into r10 r11;
    cast r0 r1.token_id r4.token_id r7 into r12 as LpTokenReceipt.record;
    async add_amm_liquidity r9 r11 r7 r1.token_id r2 r3 r4.token_id r5 r6 into r13;
    output r8 as arcanetoken_v2_0.aleo/ArcaneToken.record;
    output r10 as arcanetoken_v2_0.aleo/ArcaneToken.record;
    output r12 as LpTokenReceipt.record;
    output r13 as arcane_amm_v2_1.aleo/add_amm_liquidity.future;
finalize add_amm_liquidity:
    input r0 as arcanetoken_v2_0.aleo/transfer_private_to_public.future;
    input r1 as arcanetoken_v2_0.aleo/transfer_private_to_public.future;
    input r2 as field.public;
    input r3 as u64.public;
    input r4 as u128.public;
    input r5 as u128.public;
    input r6 as u64.public;
    input r7 as u128.public;
    input r8 as u128.public;
    await r0;
    await r1;
    gt r3 r6 into r9;
    ternary r9 r6 r3 into r10;
    lte r3 r6 into r11;
    ternary r11 r6 r3 into r12;
    cast r10 r12 into r13 as PoolKey;
    hash.bhp256 r13 into r14 as field;
    get amm_pools[r14] into r15;
    mul r4 r15.lp_total_supply into r16;
    div r16 r15.reserve1 into r17;
    mul r7 r15.lp_total_supply into r18;
    div r18 r15.reserve2 into r19;
    lt r17 r19 into r20;
    ternary r20 r17 r19 into r21;
    add r15.reserve1 r4 into r22;
    add r15.reserve2 r7 into r23;
    add r15.lp_total_supply r21 into r24;
    cast r15.id r15.token1_id r15.token2_id r22 r23 r24 r15.swap_fee into r25 as PoolInfo;
    set r25 into amm_pools[r14];
    contains amm_deposits[r2] into r26;
    not r26 into r27;
    assert.eq r27 true;
    set r21 into amm_deposits[r2];

function remove_amm_liquidity:
    input r0 as address.private;
    input r1 as LpTokenReceipt.record;
    input r2 as u128.private;
    input r3 as u128.private;
    input r4 as field.private;
    input r5 as field.private;
    is.neq r4 r5 into r6;
    assert.eq r6 true;
    call arcanetoken_v2_0.aleo/transfer_public_to_private r1.token1_id r0 r2 into r7 r8;
    call arcanetoken_v2_0.aleo/transfer_public_to_private r1.token2_id r0 r3 into r9 r10;
    cast r0 r1.token1_id r4 into r11 as ExtraAmountVoucher.record;
    cast r0 r1.token2_id r5 into r12 as ExtraAmountVoucher.record;
    async remove_amm_liquidity r8 r10 r1.deposit_id r1.token1_id r1.token2_id r2 r3 r4 r5 into r13;
    output r7 as arcanetoken_v2_0.aleo/ArcaneToken.record;
    output r9 as arcanetoken_v2_0.aleo/ArcaneToken.record;
    output r11 as ExtraAmountVoucher.record;
    output r12 as ExtraAmountVoucher.record;
    output r13 as arcane_amm_v2_1.aleo/remove_amm_liquidity.future;
finalize remove_amm_liquidity:
    input r0 as arcanetoken_v2_0.aleo/transfer_public_to_private.future;
    input r1 as arcanetoken_v2_0.aleo/transfer_public_to_private.future;
    input r2 as field.public;
    input r3 as u64.public;
    input r4 as u64.public;
    input r5 as u128.public;
    input r6 as u128.public;
    input r7 as field.public;
    input r8 as field.public;
    await r0;
    await r1;
    gt r3 r4 into r9;
    ternary r9 r4 r3 into r10;
    lte r3 r4 into r11;
    ternary r11 r4 r3 into r12;
    cast r10 r12 into r13 as PoolKey;
    hash.bhp256 r13 into r14 as field;
    get amm_pools[r14] into r15;
    get amm_deposits[r2] into r16;
    mul r16 r15.reserve1 into r17;
    div r17 r15.lp_total_supply into r18;
    mul r16 r15.reserve2 into r19;
    div r19 r15.lp_total_supply into r20;
    sub r18 r5 into r21;
    sub r20 r6 into r22;
    contains amm_extras[r7] into r23;
    not r23 into r24;
    assert.eq r24 true;
    cast r3 r21 into r25 as ExtraAmount;
    set r25 into amm_extras[r7];
    contains amm_extras[r8] into r26;
    not r26 into r27;
    assert.eq r27 true;
    cast r4 r22 into r28 as ExtraAmount;
    set r28 into amm_extras[r8];
    sub r15.reserve1 r18 into r29;
    sub r15.reserve2 r20 into r30;
    sub r15.lp_total_supply r16 into r31;
    cast r15.id r15.token1_id r15.token2_id r29 r30 r31 r15.swap_fee into r32 as PoolInfo;
    set r32 into amm_pools[r14];
    remove amm_deposits[r2];

function remove_amm_liquidity_part:
    input r0 as address.private;
    input r1 as LpTokenReceipt.record;
    input r2 as u128.private;
    input r3 as u128.private;
    call arcanetoken_v2_0.aleo/transfer_public_to_private r1.token1_id r0 r2 into r4 r5;
    call arcanetoken_v2_0.aleo/transfer_public_to_private r1.token2_id r0 r3 into r6 r7;
    cast r1.owner r1.token1_id r1.token2_id r1.deposit_id into r8 as LpTokenReceipt.record;
    async remove_amm_liquidity_part r5 r7 r1.deposit_id r1.token1_id r1.token2_id r2 r3 into r9;
    output r4 as arcanetoken_v2_0.aleo/ArcaneToken.record;
    output r6 as arcanetoken_v2_0.aleo/ArcaneToken.record;
    output r8 as LpTokenReceipt.record;
    output r9 as arcane_amm_v2_1.aleo/remove_amm_liquidity_part.future;
finalize remove_amm_liquidity_part:
    input r0 as arcanetoken_v2_0.aleo/transfer_public_to_private.future;
    input r1 as arcanetoken_v2_0.aleo/transfer_public_to_private.future;
    input r2 as field.public;
    input r3 as u64.public;
    input r4 as u64.public;
    input r5 as u128.public;
    input r6 as u128.public;
    await r0;
    await r1;
    gt r3 r4 into r7;
    ternary r7 r4 r3 into r8;
    lte r3 r4 into r9;
    ternary r9 r4 r3 into r10;
    cast r8 r10 into r11 as PoolKey;
    hash.bhp256 r11 into r12 as field;
    get amm_pools[r12] into r13;
    get amm_deposits[r2] into r14;
    mul r14 r13.reserve1 into r15;
    div r15 r13.lp_total_supply into r16;
    mul r14 r13.reserve2 into r17;
    div r17 r13.lp_total_supply into r18;
    sub r16 r5 into r19;
    sub r18 r6 into r20;
    mul r19 r13.lp_total_supply into r21;
    div r21 r13.reserve1 into r22;
    mul r20 r13.lp_total_supply into r23;
    div r23 r13.reserve2 into r24;
    lt r22 r24 into r25;
    ternary r25 r22 r24 into r26;
    sub r13.reserve1 r5 into r27;
    sub r13.reserve2 r6 into r28;
    sub r13.lp_total_supply r14 into r29;
    add r29 r26 into r30;
    cast r13.id r13.token1_id r13.token2_id r27 r28 r30 r13.swap_fee into r31 as PoolInfo;
    set r31 into amm_pools[r12];
    set r26 into amm_deposits[r2];

function swap_amm:
    input r0 as address.private;
    input r1 as arcanetoken_v2_0.aleo/ArcaneToken.record;
    input r2 as u128.private;
    input r3 as u64.private;
    input r4 as u128.private;
    input r5 as field.private;
    gt r4 0u128 into r6;
    assert.eq r6 true;
    call arcanetoken_v2_0.aleo/transfer_private_to_public r1 aleo1hy8w46tflux7zwpeaw8ny7tq6wkzqux40z75a9ah3q9tqa4t758qltkqu7 r2 into r7 r8;
    call arcanetoken_v2_0.aleo/transfer_public_to_private r3 r0 r4 into r9 r10;
    cast r0 r3 r5 into r11 as ExtraAmountVoucher.record;
    async swap_amm r8 r10 r1.token_id r2 r3 r4 r5 into r12;
    output r7 as arcanetoken_v2_0.aleo/ArcaneToken.record;
    output r9 as arcanetoken_v2_0.aleo/ArcaneToken.record;
    output r11 as ExtraAmountVoucher.record;
    output r12 as arcane_amm_v2_1.aleo/swap_amm.future;
finalize swap_amm:
    input r0 as arcanetoken_v2_0.aleo/transfer_private_to_public.future;
    input r1 as arcanetoken_v2_0.aleo/transfer_public_to_private.future;
    input r2 as u64.public;
    input r3 as u128.public;
    input r4 as u64.public;
    input r5 as u128.public;
    input r6 as field.public;
    await r0;
    await r1;
    gt r2 r4 into r7;
    ternary r7 r4 r2 into r8;
    lte r2 r4 into r9;
    ternary r9 r4 r2 into r10;
    cast r8 r10 into r11 as PoolKey;
    hash.bhp256 r11 into r12 as field;
    get amm_pools[r12] into r13;
    cast 0u64 aleo1hy8w46tflux7zwpeaw8ny7tq6wkzqux40z75a9ah3q9tqa4t758qltkqu7 into r14 as ProtocolFeeConfig;
    get.or_use protocol_fee[1field] r14 into r15;
    get.or_use protocol_fee[r12] r15 into r16;
    is.eq r13.token1_id r2 into r17;
    ternary r17 r13.reserve1 r13.reserve2 into r18;
    is.eq r13.token2_id r2 into r19;
    ternary r19 r13.reserve1 r13.reserve2 into r20;
    sub 10000u128 r13.swap_fee into r21;
    mul r3 r21 into r22;
    mul r22 r20 into r23;
    mul r18 10000u128 into r24;
    add r24 r22 into r25;
    div r23 r25 into r26;
    gte r26 r5 into r27;
    assert.eq r27 true;
    mul r3 10000u128 into r28;
    mul r28 r20 into r29;
    mul r18 10000u128 into r30;
    add r30 r28 into r31;
    div r29 r31 into r32;
    sub r32 r26 into r33;
    cast r16.rate into r34 as u128;
    mul r33 r34 into r35;
    div.w r35 10000u128 into r36;
    sub r33 r36 into r37;
    sub r26 r5 into r38;
    cast r4 r38 into r39 as ExtraAmount;
    add r18 r3 into r40;
    sub r20 r26 into r41;
    sub r41 r36 into r42;
    is.eq r13.token1_id r2 into r43;
    ternary r43 r40 r42 into r44;
    is.eq r13.token2_id r2 into r45;
    ternary r45 r40 r42 into r46;
    cast r13.id r13.token1_id r13.token2_id r44 r46 r13.lp_total_supply r13.swap_fee into r47 as PoolInfo;
    cast r4 r37 r36 into r48 as CollectedFee;
    set r39 into amm_extras[r6];
    set r47 into amm_pools[r12];
    get.or_use accrued_protocol_fees[r48.fee_token_id] 0u128 into r49;
    add r49 r48.protocol_fee into r50;
    set r50 into accrued_protocol_fees[r48.fee_token_id];

function swap_public_amm:
    input r0 as address.private;
    input r1 as u64.private;
    input r2 as u128.private;
    input r3 as u64.private;
    input r4 as u128.private;
    input r5 as field.private;
    gt r4 0u128 into r6;
    assert.eq r6 true;
    call arcanetoken_v2_0.aleo/transfer_public_from r1 self.caller aleo1hy8w46tflux7zwpeaw8ny7tq6wkzqux40z75a9ah3q9tqa4t758qltkqu7 r2 into r7;
    call arcanetoken_v2_0.aleo/transfer_public r3 r0 r4 into r8;
    cast r0 r3 r5 into r9 as ExtraAmountVoucher.record;
    async swap_public_amm r7 r8 r1 r2 r3 r4 r5 into r10;
    output r9 as ExtraAmountVoucher.record;
    output r10 as arcane_amm_v2_1.aleo/swap_public_amm.future;
finalize swap_public_amm:
    input r0 as arcanetoken_v2_0.aleo/transfer_public_from.future;
    input r1 as arcanetoken_v2_0.aleo/transfer_public.future;
    input r2 as u64.public;
    input r3 as u128.public;
    input r4 as u64.public;
    input r5 as u128.public;
    input r6 as field.public;
    await r0;
    await r1;
    gt r2 r4 into r7;
    ternary r7 r4 r2 into r8;
    lte r2 r4 into r9;
    ternary r9 r4 r2 into r10;
    cast r8 r10 into r11 as PoolKey;
    hash.bhp256 r11 into r12 as field;
    get amm_pools[r12] into r13;
    cast 0u64 aleo1hy8w46tflux7zwpeaw8ny7tq6wkzqux40z75a9ah3q9tqa4t758qltkqu7 into r14 as ProtocolFeeConfig;
    get.or_use protocol_fee[1field] r14 into r15;
    get.or_use protocol_fee[r12] r15 into r16;
    is.eq r13.token1_id r2 into r17;
    ternary r17 r13.reserve1 r13.reserve2 into r18;
    is.eq r13.token2_id r2 into r19;
    ternary r19 r13.reserve1 r13.reserve2 into r20;
    sub 10000u128 r13.swap_fee into r21;
    mul r3 r21 into r22;
    mul r22 r20 into r23;
    mul r18 10000u128 into r24;
    add r24 r22 into r25;
    div r23 r25 into r26;
    gte r26 r5 into r27;
    assert.eq r27 true;
    mul r3 10000u128 into r28;
    mul r28 r20 into r29;
    mul r18 10000u128 into r30;
    add r30 r28 into r31;
    div r29 r31 into r32;
    sub r32 r26 into r33;
    cast r16.rate into r34 as u128;
    mul r33 r34 into r35;
    div.w r35 10000u128 into r36;
    sub r33 r36 into r37;
    sub r26 r5 into r38;
    cast r4 r38 into r39 as ExtraAmount;
    add r18 r3 into r40;
    sub r20 r26 into r41;
    sub r41 r36 into r42;
    is.eq r13.token1_id r2 into r43;
    ternary r43 r40 r42 into r44;
    is.eq r13.token2_id r2 into r45;
    ternary r45 r40 r42 into r46;
    cast r13.id r13.token1_id r13.token2_id r44 r46 r13.lp_total_supply r13.swap_fee into r47 as PoolInfo;
    cast r4 r37 r36 into r48 as CollectedFee;
    set r39 into amm_extras[r6];
    set r47 into amm_pools[r12];
    get.or_use accrued_protocol_fees[r48.fee_token_id] 0u128 into r49;
    add r49 r48.protocol_fee into r50;
    set r50 into accrued_protocol_fees[r48.fee_token_id];

function redeem_voucher:
    input r0 as ExtraAmountVoucher.record;
    input r1 as u128.private;
    call arcanetoken_v2_0.aleo/transfer_public_to_private r0.token_id r0.owner r1 into r2 r3;
    async redeem_voucher r3 r0.token_id r0.voucher r1 into r4;
    output r2 as arcanetoken_v2_0.aleo/ArcaneToken.record;
    output r4 as arcane_amm_v2_1.aleo/redeem_voucher.future;
finalize redeem_voucher:
    input r0 as arcanetoken_v2_0.aleo/transfer_public_to_private.future;
    input r1 as u64.public;
    input r2 as field.public;
    input r3 as u128.public;
    await r0;
    get amm_extras[r2] into r4;
    is.eq r4.token_id r1 into r5;
    is.eq r4.token_amount r3 into r6;
    and r5 r6 into r7;
    assert.eq r7 true;
    remove amm_extras[r2];

Block heightTimestampTransition IDFunction callState
1,944,2852024-04-09 10:23:48au1t0f28rmlkqpl8qhs7kqzc9tuzzq8wzl2r6alcerzqq0vg5ngayqq6vzp3mset_protocol_fee_publicAccepted










Not implemented