Contract 8e9b6760c249d5a67c3e6c4ff7cedcd5dfd7f5049f1c5956a52480fbf7bf447f

← Back to Index 📥 Download WASM

Meta

cliver 26.0.0#60f7458e7ecffddf2f2d91dc6d0d2db4fab03ecc
rssdkver 26.0.1#f52b6aad85f18c5e312ff3f60e57cb613274e6bb
rsver 1.95.0

Instances

  • CA4OKKG2XLNZYDXSS26QKBH2LFRHSIAA44BMIETL6OEDDIEQPECAQA4W
  • CA6KX7GAEZCA5SROJ5LH5YHMEEFOU447XND23627RZWDXWBNX3XVSRHP
  • CA6ZSF2PY2N55X5LQLISBODFMMTWP24YOSW4PGMJD5QN56NJL5JHOTZK
  • CACIQDL5KYLMR5I33VPCXOQTGWX2DVFV4QG6Z3VPXL2ANIOCMXP5FVAB
  • CAE7QZNLDJLOCFWXAXX3PEQUKB52DJ7PXNQRFCNKDHUK4KQI5IXONHHL
  • CAGNFM5OMYNPRWM7PKGPKV75KA6SE4URLUCFNAQYDDP6WYRM53ZAVA4U
  • CAHRKP4HGARUWN3MTX6TKTDRJFFTDNDQYGVFG2IO7BGAMQLGT47DVTIY
  • CAIEOQMJUOPQROEMHDPUC4KZJL37KQD6X2NHEH553PKNVQJKH6ZZIOOS
  • CAOCALZOB75763WD7MPJ7I2XBE726H6OU25QRNFED7GF7EXPHNSEW3NP
  • CAOPHNKO4YNDX5255XZX647HXW6E74PFIMSFKA3GIRDZTOA2IUZYKQLX
  • CAQQ3FGKW7H4JQXUJFPIOJ27PMLF2FMFZ46DJXCREVQMDFQE5W46AISN
  • CAQYKKL2NR6C526EGXXGSMU4WZ5CYKVXGKNZLRSDVCUG5GY4FYPO5FKX
  • CAUTEIG7EUCA4ZLXOG5J3MLM7RNQK2JWPINDXYW4P46TLGJWWMLXKJNX
  • CAV7OADN7GNJHKHF46T33ZRVHQTBNPLZSG72DELJV3EJEDXYTN3LEDNG
  • CAXHUMHIYZNYXES4P7EIDEDIC4UE6CWLLKJXNVQJYT7OKUH7QMBF6KM5
  • CB2T6PFLYUDQW3YYMHFQWHHSR6IPLERZRKB3PQ7VHTPLFPW7ILV54QBE
  • CB3MAN72SR52TX2S7OJOQS2GWNT4NN7ZKDO7TUEEHQ5IIWKCWKRNFBYH
  • CB3VNMVFCHWY4JQCNVDI7MTTXCN737V2YAENJDS3LVWPKCN3YJSXQNMP
  • CB6MNN2JUSRAKVKUQ676I4DABU4JCSBVKFYSS3LAQLFC5HSCARB363DP
  • CB6PHMUX5XGL45WQK3WUVWY6SASQQFPSDHXDPL7GNMASYX6RSIQZINCD
  • CBAX4AQSZMVB6VYILXCPGAEM2JYUQIA77NMLK2X3D67GAP3DF3X4PQH6
  • CBDM5O6R267RAGJ2QGYTQAQCUGTSFDYKL3AUU3DL4GML6JEWW4PDFT45
  • CBFK4BHFHNKKHSFRRUKRMNKIYWSNEXMSX7DGA7OTRGATJYSR2JCFD3EB
  • CBHDKUCB7V54MRJKHYLU4NOXLMUI7NFBK6IHWTEELHPU7UIXDQ7PTMUH
  • CBHMFKZWSHHXRVX3TNDTYGXZSCPI67MTYEFHFBM3ABDVJPU637IYPBOE
  • CBHWSE47ZOMLWSGIPKY5TJCPKPE54RODEI3YRAEYLPYWXHZIV4GKBCXZ
  • CBI4ZSYQLHMF44MYJVO2CNT3DMNT2LHRNZCP7NXQIS3OYV47M2HFOFM4
  • CBIA6KH7VXY3NV7OMMAVZCK5MDMAYOYQLFEINHYXKFHK3F5CRODHQIQC
  • CBIZCU24EHSGY3A7G7HOXUTRR2X2PVFRDM5YHPKIICUSLR2ZPKXXXMKY
  • CBKCYYEMLC2IRQDWEWF2MEOC75FWCISHG26UQVUHCRT4JNKBAOXXJ55L
  • CBKYFQ5DBS73MD3QRKFN7LMTIQLSU4D6VYLP3MKJUXFYEFINXHKVGJ2X
  • CBPBCDXMDBRZQ5SOQ7INSDHNH555OZKM4O5SAJ7YHGWZ5DA7NIDDLPI5
  • CBRWRKT5NBIYKJXXY6XHU3PHOSICKHDOJF5OODQCJIOH77IOAZQXKJWP
  • CBSOBYNYX6JPYAQTQPRBTTIQ2NEDC7MQQ4IQGS4QKNP6AKTJ52B2RPMF
  • CBUA7IREEAILNNYNMV7PGZYXVR4QHOYM7OLGJFWVNTPGDXNXE4BSERYH
  • CBUU4PWQXV7FDBOWRZZSODRSU4UIDILBI352S5EKAUJGOUNZDNI3K6WL
  • CBWOCDD64ZQHF2ME2DADLO52XPHUFCQGJH3KNZEVMAEZQ3TE5YN22IXA
  • CC3GX67CFYQRO67CTHEOFPS7FXL7FFQAF2HAI3VB3YXNFN2GRBGV2C4L
  • CC4NANHSVNTGPAQZCA5S7PKPYDANXKNJCQCNYC2C5KAQNNS2F4LFFWXV
  • CC4WSKE3OM7RJWCOPZJ3O42XZC4VABV6NCZ6PYF3O4XREAJCP64CLJ4T
  • CC5W7OYM2TSSBUVXSL5QRTW2ZO4ECEI3SCJLR65COSHOCH67TBMVGUCM
  • CC73JOX7SABI6I2VMCWOHUJIEZBZNEILVWETHKR4OWCEZ2VC7PBZD6DJ
  • CC7HOCCD4NBEQPGZWTWX2IHGL55M6MPFX4FKWT4UYQBFHTFTKXYVXG6A
  • CC7MUBR65WXRPVS3GEYT6LSJ3XZKNMKQ5KJEKPKBZL6OP5HLSHBL4HSY
  • CCA552MAIUH67O6R57P2WGMYC2RMRINBREYNM3LDZNGWJFRS2REAZRTL
  • CCBF6ZC7JZSTIC2GALRPJBAGXEVMNSON45533LOWJGCWTCNFXZCHSQJO
  • CCD2UEU6KPMFH7AUGLQAC6RPO7CTZMZBBIQJFG4O4EXMPIMFXUX5EV4L
  • CCDU2242XT7Q7EKIFUFC6D3O4SG4MNZTREWXOAI7JGSBDIDOA6OMRH7F
  • CCEF3N4N6I6H5JJQ7LT3GUDQCASG6UQVFKTC6TBLJSW6HA6YJXQRYA4W
  • CCFO6MZYXLPYLG7CVOYYF7IY5467UPI35KMDEVAYH5XW6H2IMHA4NDFT
  • CCFPZKCAETDCPJKNWV7MBTLBXRIXFRYLARZI7DDK43HISZSGIDXBPI4P
  • CCFSSGHPAP2FIWCKVFUCQHOUQEZHLIAXMLC554TR5JKHPORCZ7HYPP6F
  • CCGG7DYIBYEECTIZ6LTCAZGDKDF4IR7AJ66CI7BLNMVSV4ZHGO4SLHJL
  • CCHCYMP3WL6QSETBJX74WVAAZRIHSHD2QSHYMZQNZTU2CJPXD3GU2QXG
  • CCHF3MCZ5EXLF7X7VFV6IUFC35JCM5HOUDPBNU2J4ABYPO3EDXGZPNBG
  • CCHTEQNPOU4RBQELP6NU5KC6TPSIXBJEOTTR3AMDIOPTRZLJZFKX33LI
  • CCJNY23YXQ47QXAXQ4K2PATJKRMVUKWVHBRE62HKH5PFRWDKBGHOHZEU
  • CCMNMNH7TDWKJB4W3XSJHIXG2UDKAXSYFE7E2UEIYD237JTRN5OJHR4L
  • CCOEWRCRJB4MZDNKT7Z7QUF34S2OQE6LWTH4UHYLWUUT32HW5TIEFIRK
  • CCQAFJVIKYJFNNPPLWWT7NZ7C3I75VDGERME4LMPLD5EGZDESSMPPNYF
  • CCRC46UJG73ELZR6XFXQMGDT7PAU4CKJOZLOUPZECFEPTPNU346LWEM2
  • CCRFZZOPJDEVN7S55ZAKC336DYLRL5SUVO43NR3TUNNM2DI43HVJ4PTO
  • CCT4GBECPGIKTUWL3RZPLX6ZK5W7XHRBRODULS27T7QEHFZK4IXG632O
  • CCUC2UZXII6TU4QPE3OGKRLIC46FWCKJBLOJVK5JAR5APABFK2ZUAJVA
  • CCVIZBQ47SYO34HA7OKFDZJHP6FNLDW73K72HRIUTVTMRYACMRA6NIFM
  • CCWXUVECCRFVJHH2BYIKWDX5QL5YRDW5UD33O4NPFMXAPAZO33YXSDQ7
  • CD33FR6GKUU4T37J4X5STRQGPET564W23AS33IMK2TFAZ6CIW5IKXF66
  • CD43PGNCI5KBR6HPHS26IXBCR5T6KSDESJAEUMV5M77GN6BJJZPCSN2U
  • CD4GVESTXTIR7MPYYWRDLLJZEJCIEKYDOAPZOKKLIBPR5K37ZEXOMCQK
  • CDBHQFU75GDU56IUDSLTZC2SUNGLNC2DAVUOU55IWCRWLESBC2OQAJSZ
  • CDCCXS2SMZYGV7ON3ZEEPLIJXMLMKHROX6JPV4MXNGYJHJHLLMPY7X6L
  • CDDAUCSGMSEBVAYTB6JWGGZXGY4IB7PN4JFHW7U2UZV4U6IBH4SWMUUZ
  • CDFAVC47OOJ3K56GPPKEKKVJEVVOJZE5QTRJX7DV2CILI5JSW6G27UHP
  • CDGFXQTQ6Y2R5SV2TSBOYXHRCAYDMBH6KFCTPYXAKSJO2OEBSWH6UHQN
  • CDMIEXEKXM5YP57JM5A3EVEH2YIY6DOVTYOQX6PCHMQNSJ2LWY6GYOBC
  • CDOS5JDLE33Z64B6ETIQD65TNA4SKFKDUTEKUYKH2L22UZWGH7YZ3LOR
  • CDPCDHWENFVVTPIR3YFL6ERTLO4ZO2WEDUQ5XTC4GO3LQDS2KBBJQEXH
  • CDPHYALKIFDBDCEOV2AOJEH7LXGOII3GIKTEIDCPYWUC75UCNZ2GMJVL
  • CDQDWPUXUWGKTVYH6HKMDA4KW37OX2P6Y4OZEUPWOK7227URK6RAEZKZ
  • CDQM4WETQOAGK7DMI3D66D2BTW6ZD5PNZC3WSNACI4GEZQQVYVN2CS2C
  • CDT6CT3T5IH5RTWBMLBGOIULDQSEGFS7PTB37Z5EGDHCUX24DIBFDM6B
  • CDUZTXSHC25UV6ASY43F2O5YCU7Z5AJJDEJ7DCXM6KAZNPNHS2UPD7VV
  • CDV7RBPHC7HTAGDISDOTNECATFEFRYNMYZ62G323KSTJBBG5TMZLX5KZ

Interface

SECURITY_AUDIT C2 · guarded no-op kept only to default-deny a stray init call. Initialization is now atomic via __constructor, so by the time the contract exists PasskeyPubkey is always present. Any direct init invocation — e.g. a front-runner attempting the old C2 exploit — therefore always errors AlreadyInitialized. It can never (re)claim ownership or reset state.

fn init(
    env: soroban_sdk::Env,
    passkey_pubkey: soroban_sdk::BytesN<65>,
    passkey_cred_id: soroban_sdk::BytesN<32>,
    admin: soroban_sdk::Address,
)

Read-only accessor used by the frontend to render the four-guarantee panel. Returns the policy as stored or panics with PolicyNotFound.

fn get_policy(env: soroban_sdk::Env, merchant: soroban_sdk::Address) -> Policy

Custom account interface (CAP-46-11). Called by the Soroban host on every auth attempt where this contract is the authorizing principal.

Authorization rule (SECURITY_AUDIT A1 — dispatch on credential FIRST, exactly one authorization model per entry):

  • WalletAuth::Agent: authenticate the ed25519 session key, then authorize EVERY context against the session's allowlist + windowed budget. This path NEVER runs the pull-policy loop, so an agent credential can never mutate policy last_charge_at.
  • WalletAuth::Passkey: first try the pull-policy path — if every auth_context matches an active on-chain policy (a token.transfer(this_wallet, merchant, amount) with a non-revoked, non-expired policy, amount <= max_per_charge, interval elapsed), authorize without consulting the signature, bumping last_charge_at per matched policy. Otherwise verify the passkey secp256r1 signature over signature_payload (panics on failure → host auth rejection).
fn __check_auth(
    env: soroban_sdk::Env,
    signature_payload: soroban_sdk::BytesN<32>,
    auth: WalletAuth,
    auth_contexts: soroban_sdk::Vec,
) -> Result<(), soroban_sdk::Error>

SECURITY_AUDIT C2 · atomic deploy+init constructor. Soroban runs __constructor exactly once, in the SAME transaction as the deploy that creates the contract. There is therefore NO un-inited window between deploy and init for an observer to front-run with their own passkey + admin (the C2 finding). The wallet is fully owned by the deployer-chosen principals the instant it exists on-chain.

Args:

  • passkey_pubkey: the passkey's secp256r1 public key (65-byte uncompressed X9.62 = 0x04 || X || Y).
  • passkey_cred_id: the WebAuthn credential id.
  • admin: gates install_policy / revoke_policy / agent-session mutations in v0.1. For the spike, callers pass the deployer's classic G-account so the trusted-setup server can sign these. v0.2 migrates the admin to the wallet's own contract address so install/revoke flow back through __check_auth and are gated by the user's passkey.
  • max_absolute_per_charge: SECURITY_AUDIT C3 · the IMMUTABLE absolute ceiling on any single per-charge amount/cap. Set once here
fn __constructor(
    env: soroban_sdk::Env,
    passkey_pubkey: soroban_sdk::BytesN<65>,
    passkey_cred_id: soroban_sdk::BytesN<32>,
    admin: soroban_sdk::Address,
    max_absolute_per_charge: i128,
)

User-controlled kill switch. After this call, all further merchant pulls fail authorization until install_policy is called again with a fresh passkey signature.

fn revoke_policy(env: soroban_sdk::Env, merchant: soroban_sdk::Address)

Install (or replace) a spending policy for a specific merchant. Requires the wallet's own auth — i.e., a passkey signature validated by __check_auth. This is the only path to grant a merchant the right to pull funds.

fn install_policy(
    env: soroban_sdk::Env,
    merchant: soroban_sdk::Address,
    token: soroban_sdk::Address,
    amount_per_charge: i128,
    max_per_charge: i128,
    interval_seconds: u64,
    expires_at: u64,
)

Read-only accessor for a delegated agent session.

fn get_agent_session(
    env: soroban_sdk::Env,
    session_pubkey: soroban_sdk::BytesN<32>,
) -> AgentSession

User-controlled kill switch for a delegated agent session. After this call, all agent transfers under this key fail until the session is re-installed.

fn revoke_agent_session(env: soroban_sdk::Env, session_pubkey: soroban_sdk::BytesN<32>)

Install (or replace) a delegated agent spending session. Gated by the same admin as install_policy in v0.1.

fn install_agent_session(
    env: soroban_sdk::Env,
    session_pubkey: soroban_sdk::BytesN<32>,
    token: soroban_sdk::Address,
    per_tx_cap: i128,
    window_seconds: u64,
    window_cap: i128,
    expires_at: u64,
    allow_recipients: soroban_sdk::Vec,
    ssl_hash: soroban_sdk::BytesN<32>,
)

Imports

WebAssembly Text (WAT) ▶