The picture is the regtest smoke test, pnpm smoke:regtest. The oracle service issues one identity unit and deploys the beacon. The ark client funds two intents and the desk. The desk finalizes one covered call, the writer cancels the other, and the oracle publishes the strike. Settlement then pays the writer the collateral minus the 1,000-sat read fee. A solid green border is a gain, a dashed red border the matching loss, and party colour is the owner. Prices other than the strike are the same formula and were not run.
1,000 sats. The desk vtxo equals this, so finalize has no change.
Strike K, and the published price
9,700,000 cents
Oracle funding
10,000 sats, Q_MIN. Deploy pays 330, DUST_SATS, to the beacon.
readFee
1,000 sats, BEACON_READ_FEE
Exit
2,048 seconds, unilateral leaves only
Fill deadline
now + 3,600 seconds
Cancel deadline
now + 45 seconds
Expiry
now + 120 seconds. Publish waits until expiry + expiryLag 60.
bindContracts sets intent side to 0. The writer and holder programs are payoutVtxo. The smoke test does not set payoutKey. The 30-second QUOTE_TTL_S is validUntil on the quote row. It is not a script check.
Local regtest /v1/info, 2026-10-09
Endpoint
http://127.0.0.1:7070/v1/info
dust
330
vtxoMinAmount
1
vtxoMaxAmount
−1 (no cap)
utxoMinAmount
330
maxOpReturnOutputs
3
maxTxWeight
40,000
unilateralExitDelay
2,048
Intent fees
0.0 on every input and output
txFeeRate
0
Protocol fare on every drawn transaction is 0. The premium is the option price, not this fare. This page does not weigh the fixture transactions against maxTxWeight.
The regtest smoke test
pnpm smoke:regtest starts arkade-regtest, then the oracle service in this repo. The seeded ark client sends 10,000 sats to the oracle wallet. POST /api/issue mints one unit on that coin. POST /api/deploy pays 330 of it into the beacon. The same client then sends 50,000 to the fill intent, 50,000 to the cancel intent, and 1,000 to the desk. fillQuote finalizes the first. After the cancel deadline, cancel refunds the second. POST /api/samples stores the strike, and POST /api/publish writes that price once the clock has passed expiry + 60. settleQuote spends the vault and the beacon. Transaction ids change every run. Intent fees on this node are 0.0, so none of these pictures include a protocol fare.
Earlier Mutinynet run, different amounts
That run used 20,000 sats of collateral and a beacon script this build does not spend. It is not the picture below.
21,330 in. Beacon 430, holder 600, writer 19,400, change 900.
1. The oracle service issues one unit, then deploys the beacon
Vaults commit to an asset id, not to a script. The id is the issue’s txid, and the beacon script commits to that id, so the beacon cannot be an output of the issue itself. It takes two transactions. No covenant runs in either: the oracle service’s wallet signs both.
Oracle service · signs the wallet spend
10,000 sats
The seeded ark client sent Q_MIN here. The wallet signs this spend. Sats are unchanged; the unit is new.
issue
1 in → 1 out
10,000 = 10,000
sats in = out
unit: 0 in, 1 minted
Oracle service
10,000 sats
Gain of 1 identity unit. assetManager.issue({ amount: 1n }) selects coins until dustAmount and pays their full value here. No control asset, so arkd refuses any reissue. The asset id is this txid, group 0.
Extension
0 sats
Asset packet: one fresh group, one output of 1.
Anchor
0 sats
Oracle service · 10,000 sats · the only unit. The beacon script can now be built from this txid.
Oracle service · signs the wallet spend
10,000 sats
Loss. 1 identity unit. genesisOutputs builds the outputs.
deploy
1 in → 2 out
10,000 = 10,000
sats in = out
unit in = out
AttestationBeacon · output 0
330 sats
Gain. 1 identity unit. Round 0, eight empty slots. The smoke test binds one oracle key, expiry lag 60, read fee 1,000, admin key the oracle wallet.
Oracle service · change
9,670 sats
No asset. Any other asset on the input goes here, not onto the beacon.
Extension
0 sats
Asset packet: the unit from input 0 to output 0. State packet: version 1, round 0, eight empty slots.
Anchor
0 sats
No script checks either transaction. The desk takes BEACON_TXID as given.
Oracle service
−330
keeps 9,670. The unit is on the beacon.
Beacon coin
+330
and 1 identity unit
2. The ark client funds both intents and the desk
One ark send names three receivers. Fees are 0, so this no-change shape spends exactly their sum. A larger client coin would add change back to the ark client. Who is paid would not change. No option script runs. The round’s tree is not an OptionIntent leaf.
Gain. Locked. Deadline now + 3,600. Equals collateral.
Cancel intent
50,000 sats
Gain. Locked. Deadline now + 45. Same collateral, strike, expiry, and beacon.
Desk vtxo
1,000 sats
Gain. Exactly the premium. payoutVtxo of the desk key.
Two intents locked · 50,000 each. Desk holds 1,000. The fill deadline has not been reached.
Fill intent · emulator
50,000 sats
Loss. Leaf finalize, side 0. The writer does not sign. The server signs the checkpoint.
Desk · forfeit leaf
1,000 sats
Loss. Sender: the desk. One vtxo equal to the premium, so there is no change.
finalize
2 in → 2 out
51,000 = 51,000
fare 0
sats in = out
Writer vtxo
1,000 sats
Gain. Output 0. Premium, plus any sats above collateral. That extra is 0. payoutVtxo of the writer key.
OptionVault
50,000 sats
Gain. Output 1. Exactly collateral. Committed to the deployed beacon, strike 9,700,000, expiry now + 120, read fee 1,000. No price yet.
Extension
0 sats
Emulator packet. Not a payment.
Anchor
0 sats
51024e73. Not an OP_RETURN.
Same chapter, second shape. The desk’s vtxos sum to 1,330. The 330 above the premium is at or under dust, so selectFloat folds it into the writer’s output. A surplus above 330 would be spend.change back to the desk.
On Mutinynet the vault committed to asset 9b183c…50e0, group 0. The writer’s coin was 99,670, so the deposit returned 79,670 as change (4d6494…). The desk’s coin was 79,670, so finalize had a third output of 78,670, change to the desk script (7d59dc…). Who is paid does not change.
Desk change folded into the premium
OptionIntent
50,000 sats
Loss. Same locked collateral. This shape was not the smoke test. The smoke test’s desk coin was 1,000.
Desk · forfeit
1,330 sats
Loss. Premium 1,000 plus 330 that cannot be a change output.
finalize
2 in → 2 out
51,330 = 51,330
sats in = out
Writer
1,330 sats
Gain. Premium plus the folded 330.
OptionVault
50,000 sats
Gain. Still exactly collateral.
Extension
0 sats
Emulator packet.
Anchor
0 sats
Amount 0.
Finalize, side 0: !checkTime(deadline), input ≥ collateral, output 0 is the writer program and ≥ premium + (locked − collateral), output 1 is the vault program and ≥ collateral.
The desk signs funding inputs on the forfeit leaf. The intent leaf is server and emulator.
Writer, this shape then the 10,000,000 settle
−1,170
1,330 received, then 47,500 of the 50,000
Desk, this shape then that settle
+170
paid 1,330, receives 1,500
Back to the 1,000 premium
After the exact fill the writer has 1,000 on hand and 50,000 still locked. A price of 10,000,000 cents, which the smoke test does not publish, would pay the holder 1,500 and return 47,500 to the writer after the 1,000 read fee. The chapter net is that whole path.
Writer, exact fill then 10,000,000
−1,500
1,000 premium + 47,500 − 50,000 locked
Desk, exact fill then 10,000,000
+500
paid 1,000, receives 1,500
3. The oracle publishes the strike
The smoke test uses one oracle key. POST /api/samples stores the strike, 9,700,000 cents, at the service clock, which is inside [expiry, expiry + 60]. POST /api/publish runs after checkTime(expiry + expiryLag). The sample digest is sha256(ctrlTxid || BTCUSD || price_le64 || time_le64). The vault’s 50,000 does not move.
Beacon · round 0 · eight empty slots · 330 sats · 1 identity unit. The next transaction writes the strike into slot 0.
AttestationBeacon · input 0
330 sats
1 identity unit. Leaf attest. Witness: the expiry key, the price, the sample time, and that one oracle signature. Server and emulator sign the leaf.
attest
1 in → 1 out
330 = 330
sats in = out
unit in = out
AttestationBeacon
330 sats
Same script, same 330, same unit. Round 1. Newest slot: the expiry is the test’s expiry, value num2bin(9,700,000, 32). The vault reads the first 8 bytes.
Extension
0 sats
Asset packet, state packet, emulator packet with the 38-item witness.
Anchor
0 sats
Amount 0.
Price 1 to 1,000,000,000 cents. Sample time is inside [expiry, expiry + expiryLag]. At least threshold signatures from the first signersN keys. The smoke test uses one key and threshold 1.
The new slot is (expiry, price || time). Expiry > 1,800, not already in a slot, and checkTime(expiry + expiryLag). Round + 1. Output 0 keeps the script, the value, and the unit.
4. Settlement spends the vault and the beacon together
Covered call: if the price is above the strike, the holder’s sats are Q × (price − K) / price, division truncating. Limited put: if the price is below the strike, min(Q, Q × (K − price) / price). A leg of 330 sats or less is folded into the other output. Output 0 is the beacon. Payouts start at output 1.
Covered call, Q = 50,000, K = 9,700,000 cents, read fee 1,000. Flat until the strike. At 9,764,641 cents the formula pays 330 and the script folds it. At 9,764,642 cents it pays 331 and the script splits. The smoke test publishes the strike, payoff 0.
Loss. Leaf settle. No witness. Server and emulator sign the leaf. checkTime(expiry).
AttestationBeacon · input 1
330 sats
1 identity unit. Leaf read, witness selfIndex = 1. State carried, not rewritten.
settle
2 in → 2 out
50,330 = 50,330
sats in = out
unit in = out
AttestationBeacon · output 0
1,330 sats
Gain of the 1,000 read fee. Same script, same unit, same state. 330 + 1,000.
Holder
0 sats
Gain. The holder program. Hidden when the payoff is 0.
Writer · output 1
49,000 sats
Gain. At the strike the holder payoff is 0, so this is the 50,000 minus the 1,000 read fee.
Extension
0 sats
Asset unit from input 1 to output 0, the same state packet, two emulator entries.
Anchor
0 sats
Amount 0.
The control starts at the strike, which is the price pnpm smoke:regtest publishes. Moving the price redraws this same transaction with holderPayoff and settlementOutputs, including the 1,000 read fee. A second output appears only when both legs are above 330 sats.
What each covenant checks in this one transaction
Check
OptionVault settle
AttestationBeacon read
Where it sits
Input 0
selfIndex equals its input index. Here that is 1.
Clock
checkTime(expiry)
None on this leaf.
Identity
Input 1 holds 1 unit of the committed asset
Output 0 holds 1 unit of the beacon’s own asset
State
Input 1’s packet is 329 bytes, version 0x01, and the newest slot whose key equals the expiry supplies the price
The current packet equals the packet on its own input
Value
Payouts at outputs 1 and 2, or one of them when a leg is dust
Output 0 value ≥ input value + readFee
Script
The payout programs committed at creation
Output 0 script equals the input script
Writer, exact fill then the strike
0
premium 1,000 + 49,000 − 50,000 locked
Desk, exact fill then the strike
−1,000
paid 1,000, receives none of the collateral
Beacon coin
+1,000
330 becomes 1,330
The settlement the smoke test runs, at the strike
At 9,700,000 cents the call payoff is 0, which is at or under dust, so the only payout is the writer. It is 50,000 − 1,000. The holder receives nothing of the collateral. The 1,000 premium and the 1,000 read fee cancel in the writer’s net.
OptionVault
50,000 sats
Loss.
AttestationBeacon
330 sats
1 unit. Read.
settle
2 in → 2 out
50,330 = 50,330
sats in = out
unit in = out
AttestationBeacon
1,330 sats
Gain of 1,000. State unchanged. The price was already in the slot.
Writer · output 1
49,000 sats
Gain. 50,000 − 1,000. There is no holder output.
Extension
0 sats
Unit, state, two emulator entries.
Anchor
0 sats
Amount 0.
Writer
0
1,000 premium + 49,000 − 50,000
Desk
−1,000
the premium, and none of the collateral
Beacon
+1,000
the read fee
The dust kink, two prices
With Q = 50,000 and a 1,000 read fee, the call formula pays 330 at 9,764,641 cents. That leg is not its own output, so the writer receives 49,000, the same shape as the strike. At 9,764,642 cents it pays 331 and the outputs split. These prices were not published by the smoke test. The nets are the 331 split after the 1,000 premium.
OptionVault
50,000 sats
Loss. Price 9,764,641 cents.
AttestationBeacon
330 sats
1 unit.
settle · fold
2 in → 2 out
50,330 = 50,330
sats in = out
AttestationBeacon
1,330 sats
Gain of the read fee.
Writer
49,000 sats
Gain. Payoff 330 is not paid as its own output.
Extension
0 sats
Anchor
0 sats
OptionVault
50,000 sats
Loss. Price 9,764,642 cents.
AttestationBeacon
330 sats
1 unit.
settle · split
2 in → 3 out
50,330 = 50,330
sats in = out
AttestationBeacon
1,330 sats
Gain of the read fee.
Holder
331 sats
Gain. First split above dust.
Writer
48,669 sats
Gain. 49,000 − 331.
Extension
0 sats
Anchor
0 sats
Writer, 331 split
−331
1,000 + 48,669 − 50,000
Desk, 331 split
−669
331 − 1,000
Limited put, the holder takes the pot
Kind 1 at half the strike, 4,850,000 cents. The raw payoff is the whole 50,000. After the 1,000 read fee the writer’s leg is 0, so output 1 is 49,000 to the holder. This price was not published by the smoke test.
OptionVault · kind 1
50,000 sats
Loss.
AttestationBeacon
330 sats
1 unit. Key equals this put’s expiry.
settle
2 in → 2 out
50,330 = 50,330
sats in = out
AttestationBeacon
1,330 sats
Gain of the read fee.
Holder · output 1
49,000 sats
Gain. The pot after the read fee.
Extension
0 sats
Anchor
0 sats
Writer
−49,000
kept the 1,000 premium, settlement pays 0
Desk
+48,000
paid 1,000, receives 49,000
5. The second intent is cancelled
The smoke test does this after the fill. checkTime has passed the cancel deadline, now + 45. cancel pays the 50,000 to the writer program. The writer key is not a signer. The ark client, who funded the intent, is not paid back.
Cancel intent · emulator
50,000 sats
Loss. Leaf cancel. One input. Server signs the checkpoint.
cancel
1 in → 1 out
50,000 = 50,000
sats in = out
Writer vtxo
50,000 sats
Gain. Output 0 ≥ the input. Same payoutVtxo as the premium.
Extension
0 sats
Anchor
0 sats
Writer
+50,000
the cancelled collateral
Desk
0
never paid this intent
6. Recovery after 2,048 seconds
Each unilateral leaf is the owner’s signature after older(exit). The spent program stores that delay as seconds. The compiler artifact stores it as blocks; secondsExit flips the type and leaves the integer. Outputs are not pinned, so each picture returns the input amount and flags the destination. No caller sends these leaves.
OptionIntent · writer
50,000 sats
After 2,048 seconds. No server signature.
unilateral
1 in → 1 out
50,000 = 50,000
sats in = out
Not pinned
50,000 sats
The script does not check this output.
OptionVault · close
50,000 sats
Writer and holder signatures inside the script, plus server and emulator. No CSV. No caller.
close
1 in → 1 out
50,000 = 50,000
sats in = out
Not pinned
50,000 sats
Drawn at the input amount. The script does not choose who is paid.
OptionVault · writer
50,000 sats
After 2,048 seconds. The holder does not sign. No caller.
unilateral
1 in → 1 out
50,000 = 50,000
sats in = out
Not pinned
50,000 sats
The script does not check this output.
AttestationBeacon · admin
330 sats
1 unit. Admin signature after 2,048 seconds. No caller.
unilateral
1 in → 1 out
330 = 330
sats in = out
unit in = out
Not pinned
330 sats
1 unit, drawn on the same output because the script does not pin it. A vault still waiting on this unit cannot settle until a new coin carries it.
7. The beacon can move without touching open vaults
migrate pays the identity unit to a new 32-byte program, for example one with other oracle keys. Three of the five oracle keys and the oracle service sign the migrate digest. Neither side can move the unit alone. Nothing limits the next program, so together they could move it anywhere, and vaults would read whatever it writes. The digest includes the round, so a signature is good for one state. The state packet is copied. Vaults commit to the asset id, not to the beacon script, so they keep reading after the move.
AttestationBeacon · input 0
330 sats
Loss of this script. 1 unit. 3 of 5 oracle signatures and the oracle service’s, over the migrate digest. Sats do not change hands.
migrate
1 in → 1 out
330 = 330
sats in = out
unit in = out
Next program
330 sats
Gain of the new script. Same 330, same unit, same packet. The eight slots are not rewritten.
Extension
0 sats
Unit and the unchanged state.
Anchor
0 sats
Rejected, or not submitted
OptionIntent
50,000 sats
Desk
330 sats
A premium of 330.
finalize
50,330 in
50,330 out
script rejects
Would be the writer
330 sats
Would be the vault
50,000 sats
The script requires premium > 330. A formula premium at or below 330 is quoted at 331, which is the amount the desk pays. premiumRefusal still returns “premium below dust” for an unlifted 330.
OptionIntent
50,000 sats
The deadline has passed.
Desk
1,000 sats
finalize
21,000 in
21,000 out
script rejects
Would be the writer
1,000 sats
Would be the vault
50,000 sats
finalize requires !checkTime(deadline). cancel requires checkTime(deadline). At the deadline those two leaves do not both succeed. fillQuote returns expired and does not send.
Writer
9,999 sats
Above the script’s 330 floor. Below the desk’s 10,000 floor.
quote
not submitted
desk refuses
Would be an intent coin
9,999 sats
requestRefusal returns “collateral” under Q_MIN (10,000) or over 1,000,000,000. The script’s cap is the same 1,000,000,000. Its floor is 330.
OptionIntent
50,000 sats
Collateral is locked. The deadline has not passed.
Desk
999 sats
Short of the 1,000 premium by 1 sat.
fillQuote
50,999 on hand
51,000 required
not submitted
Wanted
1,000 sats
Not created.
Wanted
50,000 sats
Not created.
selectFloat returns null. fillQuote returns short and does not call send.
OptionVault
50,000 sats
Expiry has passed.
Some other coin
330 sats
No identity unit.
settle
50,330 in
50,330 out
script rejects
Would continue
330 sats
Would be a payout
50,000 sats
Settle requires tx.inputs[1].assets.lookup(beaconTxid, beaconGidx) == 1. A coin without that unit fails closed. A missing slot for the expiry fails the same way.
AttestationBeacon
330 sats
1 unit. A second attest of an expiry already in a slot.
attest
330 in
330 out
script rejects
Would be the beacon
330 sats
A second slot with the same price.
absent rejects an expiry already in a slot. The same leaf also rejects a sample after expiry + expiryLag, a publish before checkTime(expiry + expiryLag), and fewer signatures than threshold.
Caller, before the extension
51,000 sats
Not a transaction fill.ts builds.
buildOffchainTx
51,000 in
51,000 out
SDK rejects
Payment
1,000 sats
Payment
50,000 sats
OP_RETURN 1
0 sats
OP_RETURN 2
0 sats
OP_RETURN 3
0 sats
MAX_OP_RETURN is 2. The throw happens before the anchor and before attachExtension.
A real finalize passes zero OP_RETURN outputs into that check, then one extension is attached. On the wire that is one OP_RETURN, under the SDK cap of 2 and the live server cap of 3.
Swap and SingleSig
NonInteractiveSwap is the pattern OptionIntent copies. The desk does not send it. Asset amounts are the program check: offer 1,000, want 2,000. The script does not pin the sats on those outputs, so this picture does not invent a sat split.
Swap coin · maker
1,000 offer
Leaf signers: server and emulator. The script also checks takerSig.
Taker funding · index not pinned
2,000 want
Some input supplies the want asset. The script does not name its index.
swap
offer 1,000 in
want 2,000 in
assets in = out
sats not pinned
Output 0 · maker program
2,000 want
Must equal the committed vtxo_SingleSig_makerPk_exit. swapMakerProgram sets that to a payout vtxo key, not to a compiled SingleSig address.
SingleSig asks for the user’s signature and does not pin outputs. The swap source imports it. This repo does not load a SingleSig artifact, and the desk does not call either leaf.
Server and emulator. No price signatures in this script.
buildSettle
Output 0 is the beacon’s. Payouts follow, folded at 330 sats.
OptionVault.close
Writer, holder, server, emulator.
No caller.
None.
OptionVault.unilateral
Writer, after 2,048 seconds.
No caller.
None.
AttestationBeacon.attest
Nine oracle prints and the oracle service key inside the script. Server and emulator.
buildAttest, from POST /api/publish
Output 0: same script, value, and identity unit. New state.
AttestationBeacon.read
Server and emulator. No oracle signature.
buildSettle
Output 0: same script and unit, value ≥ input + readFee, packet unchanged.
AttestationBeacon.migrate
3 of the 5 oracle keys and the oracle service key inside the script. Server and emulator.
No caller.
Output 0: the signed next program, value, and unit. Packet unchanged.
AttestationBeacon.unilateral
Admin, the oracle service key, after 2,048 seconds.
No caller.
None.
NonInteractiveSwap.swap
Taker inside the script. Server and emulator.
No caller. bindSwap derives an address.
Output 0 maker program and want asset. Output 1 taker script and offer asset.
NonInteractiveSwap.cancel
Maker, server, emulator.
No caller.
None. Locktime ≥ expiration.
NonInteractiveSwap.unilateral
Maker, after 2,048 seconds.
No caller.
None.
Contention
Shared coin
Who can spend it
Who wins
What the loser rebuilds
OptionIntent
Finalize before the deadline. Cancel at the deadline. Unilateral after 2,048 seconds.
The first confirmed spend. Finalize and cancel do not both pass checkTime.
The other leaf is spent. There is no second coin to rebuild.
OptionVault
Settle after expiry, with the beacon. Close any time both parties sign. Unilateral after 2,048 seconds.
The first confirmed spend.
Close or unilateral spends the collateral. Settle cannot be rebuilt.
AttestationBeacon
Attest, read, migrate, or the admin’s unilateral. One identity unit.
The first confirmed spend. A read that is not this vault’s settle still moves the coin.
The vault’s settle names an outpoint. It is rebuilt against the continuation. A read carries the state, so the price is still there. An attest changes the slots. A key that falls off the eight slots can be attested again with the same oracle signatures. The oracle service signs the new packet. Until then the vault has no fixing.
Enforced
The premium output exists before the vault output. Finalize will not pay the vault without paying the writer at least the premium.
Settle pays from one slot whose key equals the expiry, newest first, using the integer formula above, and folds a leg of 330 sats or less.
Settle sees that price only by spending the identity unit. The beacon’s read leaf carries the packet unchanged and adds readFee, 1,000 sats, on output 0. The vault pays it.
Attest stores the signed price. The sample is sha256(ctrlTxid || BTCUSD || expiry || price || time). At least threshold of the oracle keys must sign. The smoke test uses one key. The sample time is inside [expiry, expiry + expiryLag], and checkTime(expiry + expiryLag) has passed.
Attest moves the round by one, refuses a key already in a slot, and continues the same script and the same unit.
Migrate needs three of the five oracle keys and the oracle service key, and continues the unit and the packet onto the signed next program. The vault’s constructor does not contain the beacon script or the committee keys.
Cancel after the deadline returns the intent coin to the writer program. Unilateral leaves wait 2,048 seconds.
arkd, not a script: no second unit can be minted, because the issue named no control asset. A burn is not blocked: the beacon’s own leaves cannot burn the unit, but a program reached through migrate could, and every vault would then have no fixing.
Not claimed
The oracle’s price matches the market. The script checks the signatures and the arithmetic, not where the price came from. The smoke test signs the strike with its own oracle key.
Which valid prints are used. When more than three oracles sign inside a slice, the oracle service picks the three. The script accepts any valid three.
A print names no beacon, so an oracle’s signature is valid on every beacon that lists its key. That is the design.
The oracle service publishes the expiry key before it falls out of the eight slots, and someone submits the settle. A read is free. Lateness of a fixing is not bounded. A version byte other than 0x01 fails settle and leaves the coin to the writer’s unilateral leaf after the delay.
Three oracle keys and the oracle service together can migrate the unit to any program. Vaults then settle from whatever packet that program writes.
The server and the emulator sign every covenant leaf, and the scripts hold only if the emulator runs them before it signs. The emulator binds each input’s previous transaction to that input; the script cannot see a forged previous packet, and that binding was not re-checked here.
Close, every unilateral leaf, and side 1 have no caller. Unpinned outputs are drawn at the input amount so the picture balances.
The desk’s 10,000-sat collateral floor, the 30-second quote validity, and quoting a formula premium at or below 330 as 331 are client policy. The script’s premium and collateral floor is 330, and its cap is 1,000,000,000.
No script sees the issue or the deploy. The desk takes BEACON_TXID as given.
Amounts from scripts/smoke-regtest.test.ts and app/settle-math.jsholderPayoff / settlementOutputs. Scripts: contracts/option_intent.ark, contracts/option_vault.ark, contracts/attestation_beacon.ark. Builders: desk/fill.ts, protocol/cospend.ts, protocol/beacon.ts, oracle/service.ts, settle/vault.ts. Live parameters: regtest http://127.0.0.1:7070/v1/info on 2026-10-09. English only.