The explorer is out of sync. The last synced block is 571 hours ago. Current block height: explorer: 2206528 / node: 2571078 / ref: 2492275

Program teststake1x2.aleo

Program ID
teststake1x2.aleo
Owner signature
sign18y8e9tw6xecqwssykmd9d8taeggk44tylpejx2sjcg3xus3n5gph5s50m5zk9lwqqk84ujcnvanedaxwf406whxqvygcr4uk25607q2eyh9qchd8p5lcs49gafznx5hekrmdhg6p4ftpcjf9at8sqzarz8g4jk7jd08dfhmhrx9p6kq0n0m262e3tu86pqgtc6d6n3nul3askt9pf55
Times called
111
Similar programs
0
Imports
Mappings
account (address -> u64)
approvals (field -> u64)
metadata (boolean -> Metadata)
state (boolean -> State)
settings (boolean -> Settings)
unstakings (address -> Unstaking)
admins (address -> boolean)
operators (address -> boolean)
Structs
Metadata
State
Settings
Unstaking
ApprovalKey
Records
PrivateToken
Functions
-
Transitions
stake(credits.aleo/credits, public u64, public address) -> credits.aleo/credits finalize(u64, address)
unstake_token(public u64) -> () finalize(address, u64)
unstake_aleo(public u64) -> () finalize(address, u64)
withdraw(public u64, public address) -> () finalize(address, u64)
withdraw_private(public u64, address) -> credits.aleo/credits finalize(address, u64)
transfer_public(public address, public u64) -> () finalize(address, address, u64)
transfer_private(PrivateToken, address, u64) -> (PrivateToken, PrivateToken)
transfer_public_to_private(address, public u64) -> PrivateToken finalize(address, u64)
transfer_private_to_public(PrivateToken, public address, public u64) -> PrivateToken finalize(address, u64)
approve_public(public address, public u64) -> () finalize(field, u64)
unapprove_public(public address, public u64) -> () finalize(field, u64)
transfer_from_public(public address, public address, public u64) -> () finalize(field, address, address, u64)
join(PrivateToken, PrivateToken) -> PrivateToken
notify_reward(public u64, public u64) -> () finalize(address, u64, u64)
bond(public address, public u64) -> () finalize(address)
unbond(public u64) -> () finalize(address)
claim() -> ()
emergency_withdraw(public u64) -> () finalize(address)
update_settings(public Settings) -> () finalize(address, Settings)
set_admin(public address, public boolean) -> () finalize(address, address, boolean)
set_operator(public address, public boolean) -> () finalize(address, address, boolean)
init() -> () finalize(address)
Program Source Code (Aleo Instruction) Upload Leo source

import credits.aleo;

program teststake1x2.aleo;

record PrivateToken:
    owner as address.private;
    amount as u64.private;

struct Metadata:
    name as field;
    symbol as field;
    decimals as u8;

struct State:
    total_supply as u64;
    total_reserve as u64;
    total_unstaking as u64;
    total_reward as u64;

struct Settings:
    unstake_wait as u32;
    stake_paused as boolean;
    global_paused as boolean;
    max_reward_per_notify as u64;
    protocol_fee as u16;
    fee_account as address;

struct Unstaking:
    microcredits as u64;
    height as u32;

struct ApprovalKey:
    approver as address;
    spender as address;

mapping account:
    key as address.public;
    value as u64.public;

mapping approvals:
    key as field.public;
    value as u64.public;

mapping metadata:
    key as boolean.public;
    value as Metadata.public;

mapping state:
    key as boolean.public;
    value as State.public;

mapping settings:
    key as boolean.public;
    value as Settings.public;

mapping unstakings:
    key as address.public;
    value as Unstaking.public;

mapping admins:
    key as address.public;
    value as boolean.public;

mapping operators:
    key as address.public;
    value as boolean.public;

function stake:
    input r0 as credits.aleo/credits.record;
    input r1 as u64.public;
    input r2 as address.public;
    assert.neq r1 0u64;
    call credits.aleo/transfer_private_to_public r0 aleo12u8xqgyt5egdfq3usyd94xz9wpyudy2w4wg8yjwc766jxxnuvuysm368xn r1 into r3 r4;
    async stake r4 r1 r2 into r5;
    output r3 as credits.aleo/credits.record;
    output r5 as teststake1x2.aleo/stake.future;
finalize stake:
    input r0 as credits.aleo/transfer_private_to_public.future;
    input r1 as u64.public;
    input r2 as address.public;
    await r0;
    get settings[true] into r3;
    assert.eq r3.stake_paused false;
    assert.eq r3.global_paused false;
    get state[true] into r4;
    is.eq r4.total_reserve 0u64 into r5;
    cast r4.total_reserve into r6 as u128;
    ternary r5 1u128 r6 into r7;
    is.eq r4.total_reserve 0u64 into r8;
    cast r1 into r9 as u128;
    cast r4.total_supply into r10 as u128;
    mul r9 r10 into r11;
    div r11 r7 into r12;
    cast r12 into r13 as u64;
    ternary r8 r1 r13 into r14;
    assert.neq r14 0u64;
    add r4.total_supply r14 into r15;
    add r4.total_reserve r1 into r16;
    cast r15 r16 r4.total_unstaking r4.total_reward into r17 as State;
    set r17 into state[true];
    get.or_use account[r2] 0u64 into r18;
    add r18 r14 into r19;
    set r19 into account[r2];

function unstake_token:
    input r0 as u64.public;
    assert.neq r0 0u64;
    async unstake_token self.caller r0 into r1;
    output r1 as teststake1x2.aleo/unstake_token.future;
finalize unstake_token:
    input r0 as address.public;
    input r1 as u64.public;
    get settings[true] into r2;
    assert.eq r2.global_paused false;
    get.or_use account[r0] 0u64 into r3;
    sub r3 r1 into r4;
    set r4 into account[r0];
    get state[true] into r5;
    cast r1 into r6 as u128;
    cast r5.total_reserve into r7 as u128;
    mul r6 r7 into r8;
    cast r5.total_supply into r9 as u128;
    div r8 r9 into r10;
    cast r10 into r11 as u64;
    assert.neq r11 0u64;
    sub r5.total_supply r1 into r12;
    sub r5.total_reserve r11 into r13;
    add r5.total_unstaking r11 into r14;
    cast r12 r13 r14 r5.total_reward into r15 as State;
    set r15 into state[true];
    cast 0u64 0u32 into r16 as Unstaking;
    get.or_use unstakings[r0] r16 into r17;
    add r17.microcredits r11 into r18;
    get settings[true] into r19;
    add block.height r19.unstake_wait into r20;
    cast r18 r20 into r21 as Unstaking;
    set r21 into unstakings[r0];

function unstake_aleo:
    input r0 as u64.public;
    assert.neq r0 0u64;
    async unstake_aleo self.caller r0 into r1;
    output r1 as teststake1x2.aleo/unstake_aleo.future;
finalize unstake_aleo:
    input r0 as address.public;
    input r1 as u64.public;
    get settings[true] into r2;
    assert.eq r2.global_paused false;
    get state[true] into r3;
    cast r1 into r4 as u128;
    cast r3.total_supply into r5 as u128;
    mul r4 r5 into r6;
    cast r3.total_reserve into r7 as u128;
    add r6 r7 into r8;
    sub r8 1u128 into r9;
    cast r3.total_reserve into r10 as u128;
    div r9 r10 into r11;
    cast r11 into r12 as u64;
    assert.neq r12 0u64;
    get.or_use account[r0] 0u64 into r13;
    sub r13 r12 into r14;
    set r14 into account[r0];
    sub r3.total_supply r12 into r15;
    sub r3.total_reserve r1 into r16;
    add r3.total_unstaking r1 into r17;
    cast r15 r16 r17 r3.total_reward into r18 as State;
    set r18 into state[true];
    cast 0u64 0u32 into r19 as Unstaking;
    get.or_use unstakings[r0] r19 into r20;
    add r20.microcredits r1 into r21;
    get settings[true] into r22;
    add block.height r22.unstake_wait into r23;
    cast r21 r23 into r24 as Unstaking;
    set r24 into unstakings[r0];

function withdraw:
    input r0 as u64.public;
    input r1 as address.public;
    call credits.aleo/transfer_public r1 r0 into r2;
    async withdraw r2 self.caller r0 into r3;
    output r3 as teststake1x2.aleo/withdraw.future;
finalize withdraw:
    input r0 as credits.aleo/transfer_public.future;
    input r1 as address.public;
    input r2 as u64.public;
    await r0;
    get settings[true] into r3;
    assert.eq r3.global_paused false;
    get unstakings[r1] into r4;
    gte block.height r4.height into r5;
    assert.eq r5 true;
    gte r4.microcredits r2 into r6;
    assert.eq r6 true;
    sub r4.microcredits r2 into r7;
    cast r7 r4.height into r8 as Unstaking;
    set r8 into unstakings[r1];
    get state[true] into r9;
    sub r9.total_unstaking r2 into r10;
    cast r9.total_supply r9.total_reserve r10 r9.total_reward into r11 as State;
    set r11 into state[true];

function withdraw_private:
    input r0 as u64.public;
    input r1 as address.private;
    assert.neq r0 0u64;
    call credits.aleo/transfer_public_to_private r1 r0 into r2 r3;
    async withdraw_private r3 self.caller r0 into r4;
    output r2 as credits.aleo/credits.record;
    output r4 as teststake1x2.aleo/withdraw_private.future;
finalize withdraw_private:
    input r0 as credits.aleo/transfer_public_to_private.future;
    input r1 as address.public;
    input r2 as u64.public;
    await r0;
    get settings[true] into r3;
    assert.eq r3.global_paused false;
    get unstakings[r1] into r4;
    gte block.height r4.height into r5;
    assert.eq r5 true;
    gte r4.microcredits r2 into r6;
    assert.eq r6 true;
    sub r4.microcredits r2 into r7;
    cast r7 r4.height into r8 as Unstaking;
    set r8 into unstakings[r1];
    get state[true] into r9;
    sub r9.total_unstaking r2 into r10;
    cast r9.total_supply r9.total_reserve r10 r9.total_reward into r11 as State;
    set r11 into state[true];

function transfer_public:
    input r0 as address.public;
    input r1 as u64.public;
    async transfer_public self.caller r0 r1 into r2;
    output r2 as teststake1x2.aleo/transfer_public.future;
finalize transfer_public:
    input r0 as address.public;
    input r1 as address.public;
    input r2 as u64.public;
    get account[r0] into r3;
    sub r3 r2 into r4;
    set r4 into account[r0];
    get.or_use account[r1] 0u64 into r5;
    add r5 r2 into r6;
    set r6 into account[r1];

function transfer_private:
    input r0 as PrivateToken.record;
    input r1 as address.private;
    input r2 as u64.private;
    cast r1 r2 into r3 as PrivateToken.record;
    sub r0.amount r2 into r4;
    cast r0.owner r4 into r5 as PrivateToken.record;
    output r3 as PrivateToken.record;
    output r5 as PrivateToken.record;

function transfer_public_to_private:
    input r0 as address.private;
    input r1 as u64.public;
    cast r0 r1 into r2 as PrivateToken.record;
    async transfer_public_to_private self.caller r1 into r3;
    output r2 as PrivateToken.record;
    output r3 as teststake1x2.aleo/transfer_public_to_private.future;
finalize transfer_public_to_private:
    input r0 as address.public;
    input r1 as u64.public;
    get account[r0] into r2;
    sub r2 r1 into r3;
    set r3 into account[r0];

function transfer_private_to_public:
    input r0 as PrivateToken.record;
    input r1 as address.public;
    input r2 as u64.public;
    sub r0.amount r2 into r3;
    cast r0.owner r3 into r4 as PrivateToken.record;
    async transfer_private_to_public r1 r2 into r5;
    output r4 as PrivateToken.record;
    output r5 as teststake1x2.aleo/transfer_private_to_public.future;
finalize transfer_private_to_public:
    input r0 as address.public;
    input r1 as u64.public;
    get.or_use account[r0] 0u64 into r2;
    add r2 r1 into r3;
    set r3 into account[r0];

function approve_public:
    input r0 as address.public;
    input r1 as u64.public;
    cast self.caller r0 into r2 as ApprovalKey;
    hash.bhp256 r2 into r3 as field;
    async approve_public r3 r1 into r4;
    output r4 as teststake1x2.aleo/approve_public.future;
finalize approve_public:
    input r0 as field.public;
    input r1 as u64.public;
    get.or_use approvals[r0] 0u64 into r2;
    sub 18446744073709551615u64 r2 into r3;
    lt r1 r3 into r4;
    add.w r2 r1 into r5;
    ternary r4 r5 18446744073709551615u64 into r6;
    set r6 into approvals[r0];

function unapprove_public:
    input r0 as address.public;
    input r1 as u64.public;
    cast self.caller r0 into r2 as ApprovalKey;
    hash.bhp256 r2 into r3 as field;
    async unapprove_public r3 r1 into r4;
    output r4 as teststake1x2.aleo/unapprove_public.future;
finalize unapprove_public:
    input r0 as field.public;
    input r1 as u64.public;
    get approvals[r0] into r2;
    gt r2 r1 into r3;
    sub.w r2 r1 into r4;
    ternary r3 r4 0u64 into r5;
    set r5 into approvals[r0];

function transfer_from_public:
    input r0 as address.public;
    input r1 as address.public;
    input r2 as u64.public;
    cast r0 self.caller into r3 as ApprovalKey;
    hash.bhp256 r3 into r4 as field;
    async transfer_from_public r4 r0 r1 r2 into r5;
    output r5 as teststake1x2.aleo/transfer_from_public.future;
finalize transfer_from_public:
    input r0 as field.public;
    input r1 as address.public;
    input r2 as address.public;
    input r3 as u64.public;
    get approvals[r0] into r4;
    sub r4 r3 into r5;
    set r5 into approvals[r0];
    get account[r1] into r6;
    sub r6 r3 into r7;
    set r7 into account[r1];
    get.or_use account[r2] 0u64 into r8;
    add r8 r3 into r9;
    set r9 into account[r2];

function join:
    input r0 as PrivateToken.record;
    input r1 as PrivateToken.record;
    add r0.amount r1.amount into r2;
    cast r0.owner r2 into r3 as PrivateToken.record;
    output r3 as PrivateToken.record;

function notify_reward:
    input r0 as u64.public;
    input r1 as u64.public;
    assert.neq r1 0u64;
    async notify_reward self.caller r0 r1 into r2;
    output r2 as teststake1x2.aleo/notify_reward.future;
finalize notify_reward:
    input r0 as address.public;
    input r1 as u64.public;
    input r2 as u64.public;
    get operators[r0] into r3;
    assert.eq r3 true;
    get settings[true] into r4;
    lte r2 r4.max_reward_per_notify into r5;
    assert.eq r5 true;
    get state[true] into r6;
    assert.eq r6.total_reward r1;
    lt r2 r6.total_reserve into r7;
    assert.eq r7 true;
    cast r6.total_reserve into r8 as u128;
    mul r8 10000u128 into r9;
    cast r2 into r10 as u128;
    cast r4.protocol_fee into r11 as u128;
    sub 10000u128 r11 into r12;
    mul r10 r12 into r13;
    add r9 r13 into r14;
    cast r4.protocol_fee into r15 as u128;
    cast r2 into r16 as u128;
    mul r15 r16 into r17;
    cast r6.total_supply into r18 as u128;
    mul r17 r18 into r19;
    div r19 r14 into r20;
    cast r20 into r21 as u64;
    add r6.total_supply r21 into r22;
    add r6.total_reserve r2 into r23;
    add r6.total_reward r2 into r24;
    cast r22 r23 r6.total_unstaking r24 into r25 as State;
    set r25 into state[true];
    get.or_use account[r4.fee_account] 0u64 into r26;
    add r26 r21 into r27;
    set r27 into account[r4.fee_account];

function bond:
    input r0 as address.public;
    input r1 as u64.public;
    call credits.aleo/bond_public r0 r1 into r2;
    async bond r2 self.caller into r3;
    output r3 as teststake1x2.aleo/bond.future;
finalize bond:
    input r0 as credits.aleo/bond_public.future;
    input r1 as address.public;
    await r0;
    get operators[r1] into r2;
    assert.eq r2 true;

function unbond:
    input r0 as u64.public;
    call credits.aleo/unbond_public r0 into r1;
    async unbond r1 self.caller into r2;
    output r2 as teststake1x2.aleo/unbond.future;
finalize unbond:
    input r0 as credits.aleo/unbond_public.future;
    input r1 as address.public;
    await r0;
    get operators[r1] into r2;
    assert.eq r2 true;

function claim:
    call credits.aleo/claim_unbond_public  into r0;
    async claim r0 into r1;
    output r1 as teststake1x2.aleo/claim.future;
finalize claim:
    input r0 as credits.aleo/claim_unbond_public.future;
    await r0;

function emergency_withdraw:
    input r0 as u64.public;
    call credits.aleo/transfer_public self.caller r0 into r1;
    async emergency_withdraw r1 self.caller into r2;
    output r2 as teststake1x2.aleo/emergency_withdraw.future;
finalize emergency_withdraw:
    input r0 as credits.aleo/transfer_public.future;
    input r1 as address.public;
    await r0;
    get admins[r1] into r2;
    assert.eq r2 true;

function update_settings:
    input r0 as Settings.public;
    async update_settings self.caller r0 into r1;
    output r1 as teststake1x2.aleo/update_settings.future;
finalize update_settings:
    input r0 as address.public;
    input r1 as Settings.public;
    get admins[r0] into r2;
    assert.eq r2 true;
    lte r1.protocol_fee 10000u16 into r3;
    assert.eq r3 true;
    set r1 into settings[true];

function set_admin:
    input r0 as address.public;
    input r1 as boolean.public;
    async set_admin self.caller r0 r1 into r2;
    output r2 as teststake1x2.aleo/set_admin.future;
finalize set_admin:
    input r0 as address.public;
    input r1 as address.public;
    input r2 as boolean.public;
    get admins[r0] into r3;
    assert.eq r3 true;
    set r2 into admins[r1];

function set_operator:
    input r0 as address.public;
    input r1 as boolean.public;
    async set_operator self.caller r0 r1 into r2;
    output r2 as teststake1x2.aleo/set_operator.future;
finalize set_operator:
    input r0 as address.public;
    input r1 as address.public;
    input r2 as boolean.public;
    get admins[r0] into r3;
    assert.eq r3 true;
    set r2 into operators[r1];

function init:
    assert.eq self.caller aleo18jfrqsz4m853grpgzflrlzdkcm9art926668g80vd9ruyzv8rsqqlchzyj;
    async init self.caller into r0;
    output r0 as teststake1x2.aleo/init.future;
finalize init:
    input r0 as address.public;
    contains metadata[true] into r1;
    not r1 into r2;
    assert.eq r2 true;
    cast 394103260206656316532079field 126943148918095field 6u8 into r3 as Metadata;
    set r3 into metadata[true];
    set true into admins[r0];
    set true into operators[r0];
    cast 0u64 0u64 0u64 0u64 into r4 as State;
    set r4 into state[true];
    cast 360u32 false false 1000000000u64 1000u16 r0 into r5 as Settings;
    set r5 into settings[true];

Block heightTimestampTransition IDFunction callState
2,123,4282024-04-21 03:28:53au1cfwunnk537s37fymldvsgag2uh47cec4u0rskvsaawku6p5v5qxsdx3h85claimAccepted
2,123,0602024-04-21 02:54:07au1u8rpx48y4xqeaqwexmvtmvzn4uzsq60fegjxaq8lwm7dtg2jxgqstks92cbondAccepted
2,123,0142024-04-21 02:49:23au1hs8nhf9wmnmqcc5f80d5028ra4ycj4jwwnpc2ufuepwrlsuz6vysqx6wvzunbondAccepted
2,065,7732024-04-17 10:09:05au1ttamg3u5sv7ptlztqnjrnf9xz80pt9ftelu9meq82seufg84w5psc3zraybondAccepted
2,065,1002024-04-17 09:09:37au1z4gprxawepmqe5tdcz8zze8k506syeekt8tsztu702dp8u656gysp0m6l3notify_rewardAccepted
2,064,4122024-04-17 08:09:12au1snd5uu5fp58sy4y2uzyps7n2rxf99whjfq8hmer2yj6lajfx9vfqxlfdpmbondAccepted
2,064,0612024-04-17 07:38:49au1wn5txjjvxq4j2g2za8ax7g48vuvp5vyx082y7jlps579lm57lsqsalf5z4notify_rewardAccepted
2,049,3982024-04-16 08:47:13au1hn7szw8hatw5yr5ff4wm6ne5ql6u96kp25yt6952y6q2et4tucqstdpjxqbondAccepted
2,049,3742024-04-16 08:44:48au1qzd0lhwp0gqcve6rhyean7hqr7cywgt72mzy762lhfgw4stkvsqqj70455stakeAccepted
2,028,7552024-04-15 00:00:25au1h8dww4480gg0gmsh6jkq7v2d65raqhwpkxxef55nvg7snmfveuzsemyhzwnotify_rewardAccepted
1,864,9422024-04-04 00:00:49au1r4srh5mps0annuw0l7cf0r4fdpyra9j9tf3z23rxdph4v9dpysyq8p7hutnotify_rewardAccepted
1,730,1442024-03-14 07:16:45au14z4q2tyuxq7dvw00x4uvq3dj594kvr5xsv2s2xsm68ulfhvf8czs05uzexclaimAccepted
1,729,7452024-03-14 06:41:23au1tn4e4rz86py5l3sksah07uw6pp85h78ch4yw7e58q65537zu6sxssgj3nsbondRejected
1,729,6892024-03-14 06:36:50au1p0y780rachc5mz3hljaxtlgjup98ec6qee9cyp2nr6llcd8e4ugqee9zthunbondAccepted
1,729,6212024-03-14 06:31:22au1tn3nd07se8j0f9x5405vkwrp4c85h0k3xlljssqagk26d0lutyrqx9f3z7bondAccepted
1,717,7022024-03-13 10:36:43au1faqy3z44cej8nd79gqnhkrrh5k8n7epktlc448sxgdtsjhp6lvxs4hvdehclaimAccepted
1,717,2962024-03-13 10:01:48au1c66ztawg6xnvf68jwh8v340g0a0zymwrqfl0z9n9mr0k7g67vupsk379aqunbondAccepted
1,717,2702024-03-13 09:58:38au1jjekwgrd5nu9p6p8jla2l8jg2ht0x864j8y3vk6t4f2ghj495qgqt8hd0kunstake_tokenAccepted
1,716,4452024-03-13 08:36:56au1l6rla56qm8fa6uw2rpsl7vghpt0cwhkjrsftq28jmg3pwee0cgyq0tf5atbondAccepted
1,716,4012024-03-13 08:33:03au1ckv8dx27y4qvgarc6rh5rvqu86s4cfm539473n4tupqlc0fk3qzsydehevstakeAccepted
1,716,3362024-03-13 08:26:40au1es3tjfmhgzaws4hade2e65h2wxtt9s56pvzp4cpejxdkqg2wqgpqa35mddclaimAccepted
1,716,0042024-03-13 07:57:03au1n5z3czrctcnkry3m37w8vl0yq5jcpqy6qujpj7ufkqm9wuv5mu8su9pugqwithdraw_privateAccepted
1,715,9462024-03-13 07:51:47au16edyezj6df44lu83apumv9ejnhzjdqdamvtljrumy2g2p5t7t5yqhxuyxgunbondAccepted
1,715,8832024-03-13 07:46:34au198hap57kjulfmc4k599vmegqmyswzepv3qpzal7v66mnxzprj5yshey8usclaimAccepted
1,715,5022024-03-13 07:13:08au1jfkhqz04rtmluxmy87cjws544hp2tkmjvk4m40u4v624q0dtpyqqsvw4qdunstake_tokenAccepted
1,715,4392024-03-13 07:06:50au1umfrnt6ur3axq3zx0332czqfxlpfs4rqjgapda86dr55kueezcys9mctxpunbondAccepted
1,715,3642024-03-13 07:00:43au15c8s2zue7ls7uq4duxcdurhx0vgr4yqs7hmf2gwr5f7hm7ud9vfqy8km9sunstake_tokenAccepted
1,715,2882024-03-13 06:54:20au1hlpr3nnmxw372dsskp6mqn0u5ass8guehk4r2ls7ck4qnr8g9cxq2eqvkqwithdraw_privateAccepted
1,713,6302024-03-13 04:06:53au1edtyydm276cyua683nf9nntz0mfdqturqc2djadpm9936quzyv9q04gwn4bondAccepted
1,713,5132024-03-13 03:56:31au1sts7uynmd9ezclct7f3f09c6g5c34ayfx7a4305pkn6r745zgu8q4fl9avstakeAccepted
















Not implemented