0.3.6 • Published 2 years ago

@orao-network/zkvrf v0.3.6

Weekly downloads
-
License
MIT
Repository
github
Last release
2 years ago

ORAO zkVRF JS SDK

zkVRF is currently deployed to:

NetworkOraoVRF
Avalanche Fuji0x35d0a63c248490810705e895d1Ba4fD8fF454a19
Polygon Amoy0x8587eBdBED9280A493d4105238b2b3e373931816
Zircuit Sepolia0xDA2Fc58785B299b731174948D15E5959619d56d2
Arbitrum Sepolia0x77B95E9e8203A4EEBF89664642f835b0C33F9416

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 });