Full ABI for the Shaka smart contract.
ABI
[
{
"inputs": [],
"name": "ReentrancyGuardReentrantCall",
"type": "error"
},
{
"inputs": [
{ "internalType": "bytes32", "name": "slot", "type": "bytes32" },
{ "internalType": "address", "name": "recipient", "type": "address" },
{ "internalType": "uint256", "name": "amount", "type": "uint256" }
],
"name": "TransferFailed",
"type": "error"
},
{
"anonymous": false,
"inputs": [
{ "indexed": true, "internalType": "bytes32", "name": "dealId", "type": "bytes32" },
{ "indexed": true, "internalType": "address", "name": "creator", "type": "address" }
],
"name": "DealCancelled",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{ "indexed": true, "internalType": "bytes32", "name": "dealId", "type": "bytes32" },
{ "indexed": true, "internalType": "address", "name": "creator", "type": "address" },
{ "indexed": true, "internalType": "address", "name": "referrer", "type": "address" },
{ "indexed": false, "internalType": "uint256", "name": "total", "type": "uint256" },
{ "indexed": false, "internalType": "uint256", "name": "grandTotal", "type": "uint256" },
{ "indexed": false, "internalType": "bool", "name": "verificationRequired", "type": "bool" }
],
"name": "DealCreated",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{ "indexed": true, "internalType": "bytes32", "name": "dealId", "type": "bytes32" },
{ "indexed": true, "internalType": "address", "name": "payer", "type": "address" },
{ "indexed": false, "internalType": "uint256", "name": "referrerAmount", "type": "uint256" },
{ "indexed": false, "internalType": "uint256", "name": "shakaAmount", "type": "uint256" },
{ "indexed": false, "internalType": "uint256", "name": "grandTotal", "type": "uint256" }
],
"name": "DealPaid",
"type": "event"
},
{
"inputs": [
{ "internalType": "bytes32", "name": "dealId", "type": "bytes32" },
{ "internalType": "address", "name": "recipient", "type": "address" },
{ "internalType": "uint256", "name": "amount", "type": "uint256" }
],
"name": "approvalDigest",
"outputs": [
{ "internalType": "bytes32", "name": "", "type": "bytes32" }
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{ "internalType": "bytes32", "name": "dealId", "type": "bytes32" }
],
"name": "cancel",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{ "internalType": "address[]", "name": "recipients", "type": "address[]" },
{ "internalType": "uint256[]", "name": "amounts", "type": "uint256[]" },
{ "internalType": "address", "name": "referrer", "type": "address" },
{ "internalType": "string", "name": "dealReference", "type": "string" },
{ "internalType": "bool", "name": "verificationRequired", "type": "bool" }
],
"name": "createDeal",
"outputs": [
{ "internalType": "bytes32", "name": "dealId", "type": "bytes32" }
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{ "internalType": "bytes32", "name": "", "type": "bytes32" }
],
"name": "deals",
"outputs": [
{ "internalType": "address", "name": "creator", "type": "address" },
{ "internalType": "address", "name": "referrer", "type": "address" },
{ "internalType": "uint256", "name": "total", "type": "uint256" },
{ "internalType": "bool", "name": "paid", "type": "bool" },
{ "internalType": "bool", "name": "cancelled", "type": "bool" },
{ "internalType": "bool", "name": "verificationRequired", "type": "bool" },
{ "internalType": "string", "name": "dealReference", "type": "string" }
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{ "internalType": "bytes32", "name": "dealId", "type": "bytes32" }
],
"name": "getDeal",
"outputs": [
{ "internalType": "address[]", "name": "recipients", "type": "address[]" },
{ "internalType": "uint256[]", "name": "amounts", "type": "uint256[]" },
{ "internalType": "address", "name": "creator", "type": "address" },
{ "internalType": "address", "name": "referrer", "type": "address" },
{ "internalType": "bool", "name": "paid", "type": "bool" },
{ "internalType": "bool", "name": "cancelled", "type": "bool" },
{ "internalType": "bool", "name": "verificationRequired", "type": "bool" },
{ "internalType": "string", "name": "dealReference", "type": "string" }
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{ "internalType": "bytes32", "name": "dealId", "type": "bytes32" },
{ "internalType": "bytes[]", "name": "signatures", "type": "bytes[]" }
],
"name": "pay",
"outputs": [],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [
{ "internalType": "bytes32", "name": "dealId", "type": "bytes32" }
],
"name": "quote",
"outputs": [
{ "internalType": "uint256", "name": "grandTotal", "type": "uint256" }
],
"stateMutability": "view",
"type": "function"
},
{
"stateMutability": "payable",
"type": "receive"
}
]
Function reference
createDeal(recipients, amounts, referrer, dealReference, verificationRequired)
Creates a new deal onchain. Returns a bytes32 deal ID.
| Param | Type | Description |
|---|---|---|
recipients |
address[] |
Wallet addresses to receive funds |
amounts |
uint256[] |
Amount each recipient receives, in wei — must be the same length as recipients |
referrer |
address |
Wallet that receives Shaka’s automatic 1% creator bonus. Use address(0) if there isn’t one |
dealReference |
string |
Free-form reference stored onchain. It’s arbitrary user input — escape it before rendering |
verificationRequired |
bool |
When true, every recipient must approve the deal (EIP-712 signature) before it can be paid. When false, the deal is payable immediately |
pay(dealId, signatures)
Pays a deal in native ETH. msg.value must equal the value returned by quote(dealId) — call quote() right before paying to get the exact figure.
| Param | Type | Description |
|---|---|---|
dealId |
bytes32 |
The deal to pay |
signatures |
bytes[] |
Recipient approval signatures. Required only when the deal was created with verificationRequired = true — one signature per recipient, each matching approvalDigest(). Pass an empty array for a deal that doesn’t require verification |
If a recipient or the referrer transfer fails, the whole payment reverts.
approvalDigest(dealId, recipient, amount)
Returns the bytes32 digest a recipient signs to approve a deal created with verificationRequired = true. The recovered signer must equal the recipient, and the amount must match that recipient’s share on the deal, or pay() reverts.
cancel(dealId)
Cancels a deal. Creator-only — reverts if the deal is already paid or already cancelled. Once cancelled, a deal can no longer be paid. Note this can race a pending pay(): if a buyer’s transaction is in flight when cancel() lands first, the pay() call reverts and the buyer is never charged.
quote(dealId)
Returns the exact grandTotal, in wei, to send as msg.value to pay() — the sum of the recipient amounts plus the referrer and Shaka fee. See the Fees page for how that total is broken down. Reverts if the deal is already paid or cancelled.
getDeal(dealId)
Returns the full deal configuration and status: recipients, amounts, creator, referrer, paid, cancelled, verificationRequired, dealReference.
deals(dealId)
Public getter for the underlying deals mapping. Returns the deal’s scalar fields — creator, referrer, total, paid, cancelled, verificationRequired, dealReference — but not the recipients / amounts arrays. Use getDeal() when you need those.
Errors
| Error | Thrown when |
|---|---|
ReentrancyGuardReentrantCall() |
A reentrant call is detected during pay() |
TransferFailed(slot, recipient, amount) |
A required ETH transfer (a recipient or the referrer) failed, reverting the whole payment |