@orao-network/zkvrf
v0.3.6
Published
ORAO zkVRF SDK library for Solidity
Downloads
311
Maintainers
Readme
ORAO zkVRF JS SDK
zkVRF is currently deployed to:
| Network | OraoVRF |
|------------------|--------------------------------------------|
| Avalanche Fuji | 0x35d0a63c248490810705e895d1Ba4fD8fF454a19 |
| Polygon Amoy | 0x8587eBdBED9280A493d4105238b2b3e373931816 |
| Zircuit Sepolia | 0xDA2Fc58785B299b731174948D15E5959619d56d2 |
| Arbitrum Sepolia | 0x77B95E9e8203A4EEBF89664642f835b0C33F9416 |
Features
- ability to pre-pay for VRF requests (on-chain treasury per wallet)
- callback option
- gas setting for faster tx
Integration example
We've built a simple Solidity contract which mints an NFT with Random features. The source code is available here
Compile and deploy:
cd examples/sol
npm run compile
npm run deploy
Solidity example:
contract OraoVRFConsumer is OraoVRFConsumerBase {
bytes32 public seed;
bytes32 public part1;
bytes32 public part2;
IOraoVRF internal _vrfCoordinator;
constructor(address vrfCoordinator) OraoVRFConsumerBase(vrfCoordinator) {
_vrfCoordinator = IOraoVRF(vrfCoordinator);
}
function calcGasUsed() public override returns (uint256 gasUsed) {
uint256 startGas = gasleft();
fulfillRandomness(
0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff,
0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff,
0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
);
gasUsed = startGas - gasleft();
}
function fulfillRandomness(bytes32 _seed, bytes32 _part1, bytes32 _part2) internal override {
seed = _seed;
part1 = _part1;
part2 = _part2;
}
function request(bytes32 _seed) public payable override {
seed = _seed;
super.request(_seed);
}
}
const provider = new ethers.providers.InfuraWebSocketProvider(
"matic",
process.env.INFURA_API_KEY
);
const wallet = new ethers.Wallet(process.env.PRIVATE_KEY, provider);
const signerAddress = wallet.address;
const oraoVrfConsumer = new ethers.Contract(
ORAO_VRF_CONSUMER_ADDRESS,
CONSUMER_ABI,
signer
);
const gasPrice = await provider.getGasPrice();
const txValue = await oraoVrfConsumer.calcTxValue(gasPrice);
const seed = new Uint8Array(randomBytes(32));
await oraoVrfConsumer.request(seed, { value: txValue });