slot-vrng

Cartridge's Verifiable Random Number Generator provides cheap, atomic, verifiable randomness for onchain games. Randomness is generated and verified within a single transaction.

Safety Notice

This listing is imported from skills.sh public index metadata. Review upstream SKILL.md and repository scripts before running.

Copy this and send it to your AI assistant to learn

Install skill "slot-vrng" with this command: npx skills add cartridge-gg/docs/cartridge-gg-docs-slot-vrng

Slot vRNG

Cartridge's Verifiable Random Number Generator provides cheap, atomic, verifiable randomness for onchain games. Randomness is generated and verified within a single transaction.

Contract Addresses

Network Address

Mainnet 0x051fea4450da9d6aee758bdeba88b2f665bcbf549d2c61421aa724e9ac0ced8f

Sepolia 0x051fea4450da9d6aee758bdeba88b2f665bcbf549d2c61421aa724e9ac0ced8f

Cairo Interface

#[starknet::interface] trait IVrfProvider<TContractState> { fn request_random(self: @TContractState, caller: ContractAddress, source: Source); fn consume_random(ref self: TContractState, source: Source) -> felt252; }

#[derive(Drop, Copy, Clone, Serde)] pub enum Source { Nonce: ContractAddress, Salt: felt252, }

Source Types

  • Source::Nonce(ContractAddress) : Uses the address's internal nonce. Each request generates a different seed.

  • Source::Salt(felt252) : Uses a provided salt. Same salt = same random value.

Usage in Contracts

const VRF_PROVIDER_ADDRESS: starknet::ContractAddress = starknet::contract_address_const::<0x051fea4450da9d6aee758bdeba88b2f665bcbf549d2c61421aa724e9ac0ced8f>();

fn roll_dice(ref self: ContractState) { let vrf_provider = IVrfProviderDispatcher { contract_address: VRF_PROVIDER_ADDRESS }; let player_id = get_caller_address(); let random_value = vrf_provider.consume_random(Source::Nonce(player_id)); // Use random_value in game logic }

Executing vRNG Transactions

request_random must be the first call in the multicall. The Cartridge Paymaster wraps the multicall with submit_random and assert_consumed .

const call = await account.execute([ // First: request_random { contractAddress: VRF_PROVIDER_ADDRESS, entrypoint: 'request_random', calldata: CallData.compile({ caller: GAME_CONTRACT, // Source::Nonce(address) source: { type: 0, address: account.address }, // Or Source::Salt(felt252) // source: { type: 1, salt: 0x123 }, }), }, // Then: your game call { contractAddress: GAME_CONTRACT, entrypoint: 'roll_dice', // ... }, ]);

The source in request_random must match the source in consume_random .

Controller Policy

Add the vRNG contract to your Controller policies:

const policies: Policy[] = [ // ... your existing policies ... { target: VRF_PROVIDER_ADDRESS, method: "request_random", description: "Allows requesting random numbers from the VRF provider", }, ];

Security

Phase 0 assumes the Provider has not revealed the private key and does not collude with players. Future plans include moving the Provider to a Trusted Execution Environment (TEE).

Source Transparency

This detail page is rendered from real SKILL.md content. Trust labels are metadata-based hints, not a safety guarantee.

Related Skills

Related by shared tags or category signals.

General

controller-sessions

No summary provided by upstream source.

Repository SourceNeeds Review
General

controller-setup

No summary provided by upstream source.

Repository SourceNeeds Review
General

controller-react

No summary provided by upstream source.

Repository SourceNeeds Review
General

controller-signers

No summary provided by upstream source.

Repository SourceNeeds Review