Showcase · Live on testnet

Fund once. The protocol runs payroll.

Top up the contract. On the 1st of every month, the chain itself pays every team member their salary — in the same block, on the same minute, in any country. No Deel, no Wise, no payroll provider, no monthly portal login.

$0
platform fees
~200
countries supported
1 tx
pays the whole team
0
days to onboard a hire
Contract Source

Payroll is ~40 lines of JavaScript.

// Payroll — monthly pay run, fired by the chain.
// Fund the contract. On payday, every employee receives
// their salary in the same block. No Stripe, no Deel.

contract Payroll {
  init({ team }) {
    // team = [{ addr, monthly }] — monthly is in 1e18 ASE units.
    storage.set('team', team);
    storage.set('runs', 0);
    cron.schedule(this.address, 'payday', '0 9 1 * *'); // 1st of month, 09:00 UTC
    emit('PayrollStarted', { headcount: team.length });
  }

  // Anyone can top up the treasury — usually the company wallet.
  fund() { /* msg.value lands in the contract balance */ }

  // Cron fires this on the 1st of every month. The chain itself
  // walks the team and sends each their salary. No keeper.
  payday() {
    const team = storage.get('team');
    let total = 0;
    for (const e of team) total += e.monthly;
    assert(chain.balance >= total, 'treasury underfunded');

    for (const e of team) {
      transfer(e.addr, e.monthly);
      emit('Paid', { to: e.addr, amount: e.monthly });
    }
    storage.set('runs', storage.get('runs') + 1);
    cron.schedule(this.address, 'payday', '0 9 1 * *');
  }

  // Read-only — what's still in the treasury after the last run?
  treasuryBalance() { return chain.balance; }
}

payday() is registered with the chain's cron at deploy time. On the 1st of every month at 09:00 UTC, the chain itself walks the team and pays each in the same block. The contract guards against underfunding before sending a single transfer.

June 1, 09:00 UTC · one block
TREASURY
48,000 ASE
cron fires · payday()
Maya · MX
6,500 ASE
Kemi · NG
7,200 ASE
Diego · AR
6,800 ASE
Anya · PH
5,800 ASE
Linh · VN
6,000 ASE
Yusuf · TR
6,500 ASE
Six countries. One on-chain tx. Zero SWIFT codes.
01Hire

Add someone to the team list.

Push a row to the team array. No I-9 form, no contractor onboarding, no payroll provider account creation. They have a wallet address — that's it.

02Fund

Top up the treasury once.

Send ASE to the contract. Cover one month or twelve. The contract holds it. No bank, no escrow, no payment provider.

03Payday

Chain fires payroll on the 1st.

Cron triggers payday(). Every employee receives their salary in the same block. They watch the balance increase in real time, from anywhere in the world.

Why this matters

Paying a distributed team is absurdly broken today.

Global day one

Hire from anywhere. Wallet addresses don't care about your EOR provider's country list. Day-one parity for every team member.

No EOR markup

Deel, Remote, Oyster all charge $500-700/mo per employee. For a team of 20, that's $144k/year — gone, before anyone gets paid.

No FX skim

No converting USD → EUR → MXN with a 3% bid-ask spread on every conversion. Pay in ASE, the recipient swaps locally if they want.

Instant settlement

Salaries land in the same block. No SWIFT (3-5 days), no ACH (1-3 days), no “processing” window.

Public payroll

Optional — anyone can verify your team gets paid. For DAOs, foundations, and transparency-by-default companies, this is a feature.

No provider risk

Your payment provider goes down, gets acquired, decides to leave your country — none of it touches you. The chain doesn't.

What you can build

Same primitive. Eight variations.

Swap the cron schedule, swap the team list, swap the amount logic — everything else stays the same.

Bi-weekly payroll

Cron schedule "0 9 1,15 * *" instead of monthly.

Contractor pay

Per-invoice amounts pushed by an admin, no fixed list.

DAO contributor

Bounties + retainers, paid from a treasury vote.

Streamed salary

Per-second accrual via cron; withdraw any time.

Performance bonus

Quarterly payday with on-chain KPI multiplier.

Equity vesting

Cliff + linear vesting fired by daily cron.

Per-diem expenses

Per-employee allowance topped up monthly.

Retainer + bonus

Base salary + optional performance top-up per cycle.

Source

Read the contract on GitHub.

Payroll.js — ~40 lines. Fork it, tweak the cron, change the team format, redeploy.

Pattern

Cron under the hood.

Payday is just ARC-21 cron. Same primitive subs.asentum.com uses, same primitive AI agents use.

Reference

Integrate via Pay SDK.

@asentum/pay can register payroll runs as recurring “subscriptions” with you as the merchant. Same hook, different framing.

Testnet Live

Stop paying Deel $500/seat. Let the chain run payroll.