tentaclepay Move package signs payment payloads through Ika 2PC-MPC dWallets. It exposes pay_and_sign, which collects a USDC payment and routes a message to Ika’s DWalletCoordinator for threshold signing — gated by a verifier attestation.
This is the on-chain half of cross-chain payments. Most integrations reach it through the cross-chain SDK rather than calling it directly, but the entry point is public.
Shared objects
A payment references two shared objects, both passed intopay_and_sign:
Protocol
Holds the verifier’s public key (used to authorize each call) and the USDC vault that collects payments.
Signer
Holds the dWallet capability, the pool of single-use presigns, and the sponsored IKA and SUI fee pools — so callers don’t supply protocol fees themselves.
pay_and_sign
A caller pays USDC and asks the dWallet to signmessage, authorized by a verifier attestation bound to this exact call.
Checks the attestation is live
Asserts
clock.timestamp_ms() <= valid_before against Sui’s on-chain Clock.Verifies the verifier signature
Rebuilds the attested digest from the call parameters and checks it against the verifier key with
ed25519_verify. See the digest.sign_id and emits a MessageSigned event carrying the sign_id and the amount paid.
Errors
Apay_and_sign call can abort with:
| Code | Constant | Meaning |
|---|---|---|
0 | EInvalidVerifierSignature | The verifier signature didn’t validate against the stored public key. |
2 | EAttestationExpired | valid_before is at or before the current Clock time. |
Provisioning the
Signer and Protocol, rotating the verifier key, funding the fee pools, and refilling presigns are operated by Tentacle Pay and aren’t part of the integration surface.Develop
tentaclepay under sources/tentaclepay.move.
The package is live on Sui testnet. See Deployments for the package and object addresses. Mainnet is on the roadmap.