Demonstration environment — simulated contracts and approvals, nothing stored
Royex Technologies RoyexTokenization
Investor sign in Open an account
Adding a property Investor onboarding Funding an account Buying tokens and issuing the deed Reselling on the secondary market A transfer that gets refused Paying out rental income
Walkthrough · 6 steps

Reselling on the secondary market

The exit route — order, match, dual registry check, transfer, certificates reissued

All walkthroughs

Both parties are re-checked at execution, because the contract enforces the whitelist on every transfer and not just at issue. The seller's certificate is then cancelled and reissued for the balance, and the realised gain is booked against the specific lot sold.

Real elapsed time: under a minute once a buyer appears · 2 external system call(s) · simulated round trip 4,252 ms
Investor
Browser or mobile app
Platform
Application + database
Compliance registry
On-chain whitelist
EXT
Custody
Key management + signing
EXT
Token contract
Permissioned token on chain
EXT
Bank
Segregated client account
Step 0 of 6
Step 01 Completed 42 ms

Holder lists tokens for sale

A holder offers 60 tokens at AED 1,040.00, a 4% premium to the issue price. Those tokens are locked against the position so they cannot be offered twice.

Investor ──▶ Platform HTTPS POST
/Market/ListForSale
Request Investor → Platform
{
  "accountRef"    : "INV-101",
  "assetRef"      : "PRP-1001",
  "tokens"        : 60,
  "pricePerToken" : 1040.00
}
Response 201 Created
{
  "orderId"        : "ORD-418772",
  "status"         : "Open",
  "spreadVsIssue"  : "+4.0%",
  "priceBandCheck" : "pass — under 200% of issue",
  "tokensLocked"   : 60,
  "sellableRemaining" : 260
}

What changed

  • Order ORD-418772 live on the order book
  • 60 tokens committed and locked
Say this

The price band and the lock are both refusals waiting to happen. Try to list the same tokens twice, or at triple the issue price, and the platform declines.

Step 02 Completed 40 ms

Buyer takes the order

A second registry-verified holder buys part of the order. Partial fills are supported, so the remainder stays live.

Investor ──▶ Platform HTTPS POST
/Market/Buy
Request Investor → Platform
{
  "accountRef" : "INV-104",
  "orderId"    : "ORD-418772",
  "tokens"     : 60
}
Response 202 Accepted
{
  "accepted"        : true,
  "consideration"   : 62400.00,
  "selfDealingCheck": "pass — different accounts",
  "fundsCheck"      : "pass",
  "nextCheck"       : "registry, both sides"
}

What changed

  • Trade held pending compliance
  • Nothing transferred yet
Step 03 Completed 260 ms

Registry checked on both sides

Buyer and seller are both verified. A seller who has fallen off the registry cannot transfer out — losing whitelist status locks a position rather than freeing it.

Platform ──▶ Compliance registry JSON-RPC (read)
IdentityRegistry.isVerified() ×2
Request Platform → Compliance registry
{
  "checks" : [
    { "role" : "seller", "address" : "0x1d77...4a29", "accountRef" : "INV-101" },
    { "role" : "buyer",  "address" : "0x4b8e...c6b8", "accountRef" : "INV-104" }
  ]
}
Response 200 OK
{
  "seller" : { "verified" : true, "claimExpiry" : "valid" },
  "buyer"  : { "verified" : true, "claimExpiry" : "valid" },
  "transferAllowed" : true
}

What changed

  • Both parties verified
  • Transfer released for settlement
Step 04 Completed 1,100 ms

Cash legs settle

Consideration moves buyer to seller inside the segregated client account. The SPV is not a party to a secondary trade — this is between two holders.

Platform ──▶ Bank HTTPS POST
https://api.bank.ae/v1/internal-transfers
Request Platform → Bank
{
  "from"      : "client money — INV-104",
  "to"        : "client money — INV-101",
  "amount"    : 62400.00,
  "currency"  : "AED",
  "reference" : "secondary trade ORD-418772"
}
Response 200 OK
{
  "settled"    : true,
  "tradeRef"   : "TRD-660419",
  "buyerDebit" : 62400.00,
  "sellerCredit" : 62400.00,
  "spvInvolved" : false
}

What changed

  • Buyer debited AED 62,400.00
  • Seller credited AED 62,400.00
Step 05 Completed 2,700 ms

Tokens transferred on the contract

The transfer hook re-checks the registry inside the contract itself. If the registry said no, this call would revert and the platform would roll the cash legs back.

Custody ──▶ Token contract JSON-RPC (signed)
Marina Heights 1204 token → transferFrom()
Request Custody → Token contract
{
  "method" : "transferFrom",
  "params" : {
    "from"   : "0x1d77...4a29",
    "to"     : "0x4b8e...c6b8",
    "amount" : 60
  },
  "contract" : "0x41945f556471d0ff07411f2c39587b68a42a6c83",
  "signedBy" : "custody HSM, 2-of-3 quorum"
}
Response 200 OK
{
  "success"         : true,
  "txHash"          : "0xe81b...3f4d",
  "transferHook"    : "registry verified both parties",
  "sellerBalance"   : 260,
  "buyerBalance"    : 60,
  "supplyUnchanged" : true
}

What changed

  • 60 tokens moved between holders
  • Total supply unchanged — no mint, no burn
Step 06 Completed 110 ms

Certificates cancelled and reissued

The seller's certificate is not edited. It is cancelled, marked superseded, and a replacement is issued for the balance — carrying the original acquisition date and the surviving proportion of the cost. A printed certificate can therefore never contradict the register.

Platform ──▶ Investor Document generation
/Portfolio/Deed/{deedNumber}
Register update Platform → Investor
{
  "costBasis" : "FIFO — earliest acquisition lot consumed first",
  "lotConsumed" : {
    "certificate"     : "RXT-2026-118204",
    "lotAcquired"     : "2026-01-14",
    "tokensOnFace"    : 1000,
    "tokensDisposed"  : 60,
    "costPerToken"    : 1000.00,
    "costConsumed"    : 60000.00,
    "newStatus"       : "Superseded"
  },
  "replacementIssued" : {
    "certificate"      : "RXT-2026-884210",
    "tokens"           : 940,
    "attributableCost" : 940000.00,
    "lotAcquired"      : "2026-01-14 (carried forward unchanged)",
    "supersedes"       : "RXT-2026-118204"
  },
  "buyerCertificate" : {
    "certificate"  : "RXT-2026-731905",
    "holder"       : "Omar Haddad (INV-104)",
    "tokens"       : 60,
    "unitPrice"    : 1040.00,
    "origin"       : "Secondary transfer",
    "lotAcquired"  : "today — a new lot for the buyer",
    "settlementTx" : "0xe81b...3f4d"
  }
}
Result 201 Created
{
  "sellerRealised" : {
    "disposalRef"    : "DSP-604118",
    "proceeds"       : 62400.00,
    "costOfLotsSold" : 60000.00,
    "realisedGain"   : 2400.00,
    "basis"          : "FIFO"
  },
  "certificatesIssued"     : 2,
  "certificatesSuperseded" : 1,
  "markUpdated" : "last traded price now drives portfolio valuation",
  "auditEntries" : 4
}

What changed

  • Seller's old certificate superseded, balance carried forward
  • Buyer holds a new certificate — new lot, new acquisition date
  • Realised gain of AED 2,400.00 booked against the seller
  • Seller's cost basis reduced by the cost of the lot sold
  • Last traded price now marks every holder's portfolio
Say this

Two points here. Cancel-and-reissue is what a lawyer expects — the old certificate is visibly dead rather than quietly wrong. And the realised gain is booked against the specific lot consumed, which is the figure the investor's accountant needs at year end.