Developers · EVM
EVM onchain eligibility gate
You deploy your own gate. Abraxas issues a short-lived EIP-712 authorization. Your contract consumes it once and decides whether a named action may proceed.
Local sequence
- Holder completes private Partner Flow verification.
- Your server verifies the current public receipt.
- Your backend calls POST /api/v1/chain-attestations with a server API key.
- Abraxas signs the canonical Chain Eligibility Attestation (EIP-712 name AbraxasEligibilityVerifier, version 2).
- Your transaction calls consumeEligibility on your gate. The nonce is marked consumed onchain.
- Your partner consumer records that the named action may proceed. No token transfer, approval, swap, payment, or mint.
cd contracts/evm-eligibility-verifier forge test -vv # Human-only local Anvil deploy (operator supplies RPC and key; never commit them): # forge script script/DeployPartnerGate.s.sol --rpc-url http://127.0.0.1:8545 --broadcast
RPC URL and deployer keys are supplied by the human operator at deploy time. They are not stored in this repository or Vercel env. CREATE2 prediction is for your factory; Abraxas does not deploy the contract.
ABI entry points
consumeEligibility, addTrustedSigner, retireTrustedSigner, revokeTrustedSigner, domainSeparator, consumedNonces
AuthorizationConsumed emits nonce, attestation id, and partner/policy/action hashes only.
Deployment manifest
Status is local_test or partner_deployed. Never live. Fields: schema_version, status, network_id, chain_id, gate_address, bytecode_hash, partner_hash, policy_hash, action_hash, environment, signer_key_id, require_subject, create2_salt, predicted_address.
Launchpad readiness: not_configured, local_test_ready, partner_deployed_recorded, production_review_required. Browser input is not authority.
Network posture
evm_sandbox is the local Foundry/Anvil target. evm_mainnet stays on Production review. Arc/Circle testnet is a future compatible EVM target in the registry without a published chain ID in this kit. Arc/Circle Mainnet remains disabled. Circle settlement and USDC transfers are a separate path.
Server example
import { AbraxasPartnerKit } from "@abraxas/partner-kit";
const kit = new AbraxasPartnerKit({
partnerId: process.env.ABRAXAS_PARTNER_ID!,
policyId: process.env.ABRAXAS_POLICY_ID!,
policyVersion: 1,
requirePolicyVersion: true,
environment: "sandbox",
});
export async function issueEvmOnchainGate(receiptId: string) {
const res = await fetch(process.env.ABRAXAS_BASE_URL + "/api/v1/chain-attestations", {
method: "POST",
headers: {
authorization: "Bearer " + process.env.ABRAXAS_SANDBOX_API_KEY,
"content-type": "application/json",
},
body: JSON.stringify({
receipt_id: receiptId,
action_type: "enable_protocol_access",
action_scope: "sandbox:protocol_access",
network_id: "evm_sandbox",
deployment_ref: process.env.ABRAXAS_GATE_DEPLOYMENT_REF,
}),
});
const issued = await res.json();
if (!issued.allowed) return issued;
// Encode consumeEligibility on YOUR gate. Owner-only addTrustedSigner / retireTrustedSigner / revokeTrustedSigner.
// Abraxas never broadcasts the signer-update transaction.
return issued;
}