Live on NEAR mainnet, 16 transactions you can re-check

Invoicing for freelancers, paid from any chain

Your client pays with any major token on any major chain. You receive USDC on NEAR, and the payment itself closes the invoice on-chain and sets the tax and subcontractor shares aside in the same step.

No wallet to install, no gas to buy. Shares split on-chain.

Invoice 1-3

Number 0003, NEAR mainnet

Paid

1.00USDC

Billed to
Private, encrypted on device
Merchant account
aaada435…2e05b9

Paid with USDC on

  • Base
  • Arbitrum
  • Optimism
  • Polygon
  • Gnosis
  • NEAR

1.002210 USDC sent from Base

  1. Base
  2. NEAR Intents
  3. dulypay.near

31.8 sfrom the Base block to invoice 1-3 closed on NEAR

Merchant 0.80 USDC
Tax set-aside 0.20 USDC

Settled on NEAR by ft_on_transfer. Both shares split in the same receipt, no server in the path.

GceCNYM3…6pkreF

One link out, one payment in, books sorted

Your client never needs an account. You never install a wallet or buy gas.

  1. Send a link

    Sign in with your fingerprint or face, add line items and share the link. Client names and line items are encrypted on your device; only the amount, dates and a fingerprint of the document go on-chain.

  2. Your client pays from any chain

    Any major token on any major chain. NEAR Intents converts it to USDC and delivers it with the invoice number attached, so the payment closes the invoice on-chain.

  3. Shares land in their own balances

    Tax and subcontractor shares move into their own balances in the same step. Export a CSV your accountant can open.

Proof on NEAR mainnet

On 2026-11-01 a client paid 1.00 USDC from Base. The payment itself closed invoice 1-3 on NEAR 31.8 seconds later, with 0.20 USDC already moved to the tax set-aside. No server marked it paid. Amounts were kept tiny and all of the money was ours.

Contract
dulypay.near
Code hash
7jt6GbQnA7VyUGs65Azim73ypuZbBZa2GSKfXHkMQqvj
Transactions
16 on NEAR and Base

Invoice 1-3

1.00 USDCPaid
  1. PaymentClient pays 1.00 USDC for invoice 1-3 from Base, through the pay page

  2. SettlementNEAR Intents delivers 1.00 USDC by ft_transfer_call. ft_on_transfer closes invoice 1-3 and moves 0.20 USDC to the tax set-aside in the same receipt, 31.8 s after the Base block

Read from the chain at 2026-11-13 06:52:46 UTC: 4 invoices, 1.25 USDC received in total. The contract holds 1.10 USDC and owes 1.10.

Check it without trusting this page
$ git clone https://code.swiftbotlab.workers.dev/duly && \
  cd duly && \
  node scripts/verify-mainnet.mjs

Re-checks all 16 transactions, the code hash, the agent's key and the invoice state against public NEAR and Base RPCs, with no keys. Explorer pages block some automated readers; the same data is in JSON at api.nearblocks.io and on Blockscout.

Four ways to check Duly yourself

Start with test money in the browser, pay a real invoice for about 10 cents, or re-run everything from a terminal.

NEAR testnet

No wallet, no passkey, no money

  1. Open /test/app and press Start.
  2. Press New invoice, fill it in and press Issue invoice and get link.
  3. In Settings keep the Tax 20% row and press Save.
  4. Open the invoice, press Open as client, then Simulate the client paying: you see a PAID stamp and the settlement transaction.
  5. Money shows your balance and the tax jar, split in that transaction. Download CSV gives one row per invoice.

This is the real contract on testnet with worthless test USDC; only the cross-chain conversion is simulated, because NEAR Intents has no testnet.

NEAR mainnet, optional

Real money, about 10 cents

Invoice 1-4 is open for 0.10 USDC until 2026-11-30. Open it in a browser, pick USDC on Arbitrum, Optimism, Polygon, Gnosis or NEAR (on Base and Ethereum 0.10 is below the route minimum), enter your own address for refunds, press See the price, then Get payment address. The page checks the NEAR Intents quote signature before it shows an address. When the money lands the invoice closes on-chain by itself.

The first payment closes it; anything paid after that is recorded as extra and stays refundable.

Terminal

From a terminal

node scripts/demo-testnet.mjs runs the whole loop on testnet in about a minute and prints every transaction; node scripts/verify-mainnet.mjs re-checks the mainnet run.

What is real and what is simulated

Mainnet runs the whole path with real USDC. Test mode runs the same contract on testnet; only the cross-chain leg is simulated.

PieceLive (mainnet)Test mode (testnet)
Contract: invoices, set-asides, refundsReal: dulypay.near, unaudited; new invoices 0.50 to 25 USDCReal: dulypay.testnet
Gas sponsorship (NEP-366 meta transactions)RealReal
Client payment from another chainReal, through the NEAR Intents 1Click APISimulated: the Simulate button sends test USDC
Subcontractor share at settlementSame code; the mainnet run used a tax share onlyReal: 20% tax and 10% subcontractor in one transaction
Collections agentPlain rules on a timer with a function-call key; no language model