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

Program betastaking.aleo

Program ID
betastaking.aleo
Owner signature
sign16kgzhwzxy9qlkaju2el5xac4zq5sxur36xmstw7j5s78c5q9nyp0zs302rvgxn5aqw5py793pyutzzzv9w633e3g9tqxdlcst4ksgq6eyh9qchd8p5lcs49gafznx5hekrmdhg6p4ftpcjf9at8sqzarz8g4jk7jd08dfhmhrx9p6kq0n0m262e3tu86pqgtc6d6n3nul3askje0vvw
Times called
53
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
transfer_public(public address, public u64) -> () finalize(address, address, u64)
transfer_private(PrivateToken, address, u64) -> (PrivateToken, PrivateToken)
transfer_private_to_public(PrivateToken, public address, public u64) -> PrivateToken finalize(address, u64)
transfer_public_to_private(address, public u64) -> PrivateToken finalize(address, u64)
join(PrivateToken, PrivateToken) -> PrivateToken
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)
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)
notify_reward(public u64, public u64) -> () finalize(address, u64, u64)
bond(public address, public u64) -> () finalize(address)
unbond(public u64) -> () finalize(address)
claim() -> () finalize(address)
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 betastaking.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 transfer_public:
    input r0 as address.public;
    input r1 as u64.public;
    async transfer_public self.caller r0 r1 into r2;
    output r2 as betastaking.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_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 betastaking.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 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 betastaking.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 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 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 aleo1pclqcgqnxc3dqj07sl9sdv6zkr4vy86saqsx0tfty3sfe5w22vpq493vlh r1 into r3 r4;
    async stake r4 r1 r2 into r5;
    output r3 as credits.aleo/credits.record;
    output r5 as betastaking.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 betastaking.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 betastaking.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;
    assert.neq r0 0u64;
    call credits.aleo/transfer_public r1 r0 into r2;
    async withdraw r2 self.caller r0 into r3;
    output r3 as betastaking.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 betastaking.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 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 betastaking.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 betastaking.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 betastaking.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 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 betastaking.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 betastaking.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;
    assert.neq r0 0u64;
    call credits.aleo/unbond_public r0 into r1;
    async unbond r1 self.caller into r2;
    output r2 as betastaking.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 self.caller into r1;
    output r1 as betastaking.aleo/claim.future;
finalize claim:
    input r0 as credits.aleo/claim_unbond_public.future;
    input r1 as address.public;
    await r0;
    get operators[r1] into r2;
    assert.eq r2 true;

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 betastaking.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 betastaking.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 betastaking.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 betastaking.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 betastaking.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,199,1272024-04-26 03:24:44au1wyugz96qw0u03n9swuq8m3w7ul2t3mh5ggmmn6275ldtaysrfyzqu94k3aunstake_tokenAccepted
2,170,6522024-04-24 06:06:21au1zhp9re2skw94njgyvclpymx3ea0kh0w48hu78ur5laf3qjemdugqfaactcwithdraw_privateAccepted
2,170,6122024-04-24 06:01:57au1uu62vr7hw88vm04uv78u08js79tj8zypzwrc7ef00x5esav2pgrqjn44shstakeAccepted
2,169,5912024-04-24 04:18:58au1cltgpe86k8z58kl5plwgwnqpujuld6ay7rv96n80frstty7pecyqqc7vlfclaimAccepted
2,169,1772024-04-24 03:38:59au1etk5qthmstt2pcnq3ves3ceq89q7v00tv7pqcrev7epkxv3kxgxsc33safunbondAccepted
2,169,0142024-04-24 03:24:03au1zspzleepd9wpgswhd9n8u8t4tgcrlu04jxaz3axw2a3rmgfymg8qh6k68junstake_tokenAccepted
2,153,5602024-04-23 02:54:09au1pyx7t7mdgef2kqwq2jfgdmlyy84rmkq58wfd4qtd3axft6yshvyszznhwsbondAccepted
2,153,3022024-04-23 02:31:46au13v8knnqg0psjrwwhssw4mw9sm52upvx4tn93z8alpjsg3ky2cqyqeg7mr3stakeAccepted
2,151,6012024-04-23 00:00:29au1ru7v42f75pqmhz5gf856k3tuspurvn9u6yhl8m5a8vylt5d5fvyslfzt5ynotify_rewardAccepted
2,141,1582024-04-22 07:30:58au1sjsxzh4h4sd0uf68m4tanjh6q54g7rntfsuahm0p6yhakwr02s8q3mt7lawithdraw_privateRejected
2,141,1542024-04-22 07:30:33au1qsj5sv3h44xvuv3ygkwqa3jfpc2yrkk6j723k9qudjhgvm8thyxqvuhlrdwithdraw_privateAccepted
2,121,1042024-04-21 00:00:25au1w0jrzxvttzsgmzz8kdltjmtkpqusf2lqkrjnwpqpyeczzgrqayzq6zprrlnotify_rewardAccepted
2,102,2182024-04-19 18:22:56au1ewzl84ufvfnlauu5cqgjsvw435mc43grqy3g2p8k2s4hrlu07qxq929hpjstakeAccepted
2,090,1782024-04-19 00:00:21au1hpm0rnrsqy2erz2x88tjg5nvtp6ye9kg63099dp7smr8j0v67u9se8p9cgnotify_rewardAccepted
2,059,0422024-04-17 00:00:26au1gxrp2vf3kyu5fs3arw6xkm6f5famf4agnnutcq20hg646lkmxy9qfuk7jqnotify_rewardAccepted
2,050,0682024-04-16 09:50:56au1jsfaq04n463dlg9qltfxlk4muazlurx9fvnkzvdmjdkvwnu05y9sfa3hezstakeAccepted
2,049,9352024-04-16 09:37:44au1llyn82407qgnhfqduc2pn5ptu9lnf0ft4aq64y70h3yatfcw75xqweg75vstakeAccepted
2,043,8532024-04-16 00:00:25au1qg6shkse8zs636rtfphw55x9rx349lah4ydr05d7yv47fdkt6yyqd3hqernotify_rewardAccepted
2,033,5312024-04-15 07:35:58au1w5tg362pyjh3rzg2xtz0gyl88mzl4m2tywhnu9q6y64qz5xjuqgsjfuvjmclaimAccepted
2,033,1552024-04-15 07:01:03au10yke362zadh4tduxkq4xxytt68xjxf23sjrg95w8v7us3fwpeupsuhp3m7unbondAccepted
2,033,1012024-04-15 06:56:07au1y9veh6v6cwlnrfq9zndxkwrf262n9g3n9r7uv7gy5n8wfxpzcvps889khyunstake_tokenAccepted
2,032,9952024-04-15 06:46:08au1y5srgu928nf9us5ywjm3jlmh8mtgqqcee69rskfa5scmqfntkqpqyzhg0wbondAccepted
2,032,3992024-04-15 05:49:59au19a7wg2zaq085k65vmtyvqsxkluvmxjdmgs9uqu2zmddwlcaejsgsljp400stakeAccepted
2,013,5542024-04-14 00:00:28au1rdh8rjwgltccgf49d8l6a5mlkx9rmhj22d5qhq6u0tv7raggeygs0ukujunotify_rewardAccepted
1,983,3252024-04-12 00:00:29au18j562lvqqzrskdktvr2ea0e4pgcnca36jfzu0qr83sk4cxtufgyqf6c6xsnotify_rewardAccepted
1,952,8562024-04-10 00:00:26au1tje7eqmnaelfu7lf2ulfnqy5f3q06eue6lzcddm0jawygzuqvuzsnlkhtvnotify_rewardAccepted
1,946,6482024-04-09 14:03:54au1yfh5zyylnypjdsrxzxaskhrcdkjkypkw786gu9z3lswjnn63jcys89yz49stakeAccepted
1,923,2132024-04-08 00:00:24au1v8zq9ca0gdgpdxa5lhl0d3k7w4m006g2hypzezrqlsjgn5v76q8sw33tvsnotify_rewardAccepted
1,893,9792024-04-06 00:00:24au1zax8a07kjjkh5k5ur8f7wqfysp0mlrcn5m8ezl287ftxml8sscqsnld84ynotify_rewardAccepted
1,864,9412024-04-04 00:00:43au1xlecq6vhu7wv8mqs0qau5j58flrl77qfe46mwwnrwx7xp3cpcq8q3fhmhunotify_rewardAccepted
















Not implemented