Skip to content

Commit

Permalink
VRF: Settings, CLI, deployment (#171)
Browse files Browse the repository at this point in the history
* docs: Update adapter and aggregator options

* docs: How to setup VRF keys

* docs: How to setup node

* feat: Update VRF deployment

* chore: Specify var names: `paymentConfig` -> `directPaymentConfig`

* refactor: Reorder functions in VRF deployment

* chore: eslint

* chore: Bump up contracts 0.2.0 -> 0.3.0

* chore: Remove outdated setting variables

* docs: Temporal fix for overriding `CHAIN` env var

* feat: Add named account `vrfOracle0`

* fix: Remove default hardhat account for deployer

* feat: Allow to deploy Prepayment anywhere

* feat: Deploy consumer mocks only to local network

* feat: Copy solidity files to `dist/`

* docs: How to setup listener

* feat: Copy non-js files through `files` directive in package.json

* chore: Fix formatting
  • Loading branch information
martinkersner authored Jan 23, 2023
1 parent 2f52822 commit 9fd99cf
Show file tree
Hide file tree
Showing 20 changed files with 254 additions and 78 deletions.
10 changes: 7 additions & 3 deletions contracts/.eslintrc
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@
{
"root": true,
"extends": [
"prettier"
"prettier",
"plugin:@typescript-eslint/eslint-recommended",
"plugin:@typescript-eslint/recommended"
],
"plugins": [
"prettier"
"prettier",
"@typescript-eslint"
],
"rules": {
"prettier/prettier": [
Expand All @@ -13,6 +16,7 @@
},
"parserOptions": {
"sourceType": "module",
"ecmaVersion": 2022
"ecmaVersion": 2022,
"parser": "@typescript-eslint/parser"
}
}
29 changes: 29 additions & 0 deletions contracts/config/baobab/vrf.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
{
"minimumRequestConfirmations": 3,
"maxGasLimit": 2500000,
"gasAfterPaymentCalculation": 33285,
"feeConfig": {
"fulfillmentFlatFeeKlayPPMTier1": 0,
"fulfillmentFlatFeeKlayPPMTier2": 0,
"fulfillmentFlatFeeKlayPPMTier3": 0,
"fulfillmentFlatFeeKlayPPMTier4": 0,
"fulfillmentFlatFeeKlayPPMTier5": 0,
"reqsForTier2": 0,
"reqsForTier3": 0,
"reqsForTier4": 0,
"reqsForTier5": 0
},
"directPaymentConfig": {
"fulfillmentFee": "0",
"baseFee": "0"
},
"oracle": [
{
"address": "0xdD2FD4581271e230360230F9337D5c0430Bf44C0",
"publicProvingKey": [
"95162740466861161360090244754314042169116280320223422208903791243647772670481",
"53113177277038648369733569993581365384831203706597936686768754351087979105423"
]
}
]
}
1 change: 1 addition & 0 deletions contracts/config/hardhat
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
"reqsForTier4": 0,
"reqsForTier5": 0
},
"paymentConfig": {
"directPaymentConfig": {
"fulfillmentFee": "250000000000000000",
"baseFee": "500000000000000000"
},
Expand Down
5 changes: 0 additions & 5 deletions contracts/deploy/0-Prepayment.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,6 @@ const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) {

console.log('0-Prepayment.ts')

if (network.name == 'baobab') {
console.log('Skipping')
return
}

const prepaymentDeployment = await deploy('Prepayment', {
from: deployer,
log: true
Expand Down
56 changes: 33 additions & 23 deletions contracts/deploy/2-VRFCoordinator.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { HardhatRuntimeEnvironment } from 'hardhat/types'
import { DeployFunction } from 'hardhat-deploy/types'
const vrfConfig = require('../config/vrf.json')
import { loadJson } from '../scripts/v0.1/utils'
import { IVrfConfig } from '../scripts/v0.1/types'

const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) {
const { deployments, getNamedAccounts, network } = hre
Expand All @@ -9,10 +10,7 @@ const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) {

console.log('2-VRFCoordinator.ts')

if (network.name == 'baobab') {
console.log('Skipping')
return
}
const vrfConfig: IVrfConfig = await loadJson(`config/${network.name}/vrf.json`)

const prepayment = await ethers.getContract('Prepayment')

Expand All @@ -39,16 +37,33 @@ const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) {

// Configure VRF coordinator
console.log('Configure VRF coordinator')
await vrfCoordinator.setConfig(
vrfConfig.minimumRequestConfirmations,
vrfConfig.maxGasLimit,
vrfConfig.gasAfterPaymentCalculation,
vrfConfig.feeConfig
await (
await vrfCoordinator.setConfig(
vrfConfig.minimumRequestConfirmations,
vrfConfig.maxGasLimit,
vrfConfig.gasAfterPaymentCalculation,
vrfConfig.feeConfig
)
).wait()

// Configure payment for direct VRF request
await (await vrfCoordinator.setDirectPaymentConfig(vrfConfig.directPaymentConfig)).wait()

// Add VRFCoordinator to Prepayment
const prepaymentDeployerSigner = await ethers.getContractAt(
'Prepayment',
prepayment.address,
deployer
)
await (await prepaymentDeployerSigner.addCoordinator(vrfCoordinatorDeployment.address)).wait()

await vrfCoordinator.setPaymentConfig(vrfConfig.paymentConfig)
if (['localhost', 'hardhat'].includes(network.name)) {
await localhostDeployment({ deploy, vrfCoordinator, consumer, prepayment })
}
}

// TODO deploy only for tests
async function localhostDeployment(args) {
const { deploy, vrfCoordinator, prepayment, consumer } = args
const vrfConsumerMockDeployment = await deploy('VRFConsumerMock', {
args: [vrfCoordinator.address],
from: consumer,
Expand All @@ -66,19 +81,14 @@ const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) {
const { accId } = accountReceipt.events[0].args

// Deposit 1 KLAY
await prepaymentConsumerSigner.deposit(accId, { value: ethers.utils.parseUnits('1', 'ether') })
await (
await prepaymentConsumerSigner.deposit(accId, { value: ethers.utils.parseUnits('1', 'ether') })
).wait()

// Add consumer to account
await prepaymentConsumerSigner.addConsumer(accId, vrfConsumerMockDeployment.address)

// Add VRFCoordinator to Prepayment
const prepaymentDeployerSigner = await ethers.getContractAt(
'Prepayment',
prepayment.address,
deployer
)

await prepaymentDeployerSigner.addCoordinator(vrfCoordinatorDeployment.address)
await (
await prepaymentConsumerSigner.addConsumer(accId, vrfConsumerMockDeployment.address)
).wait()
}

export default func
Expand Down
34 changes: 22 additions & 12 deletions contracts/deploy/3-DataFeed.ts → contracts/deploy/3-Aggregator.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) {
const { deploy } = deployments
const { deployer, consumer, feedOracle0, feedOracle1, feedOracle2 } = await getNamedAccounts()

console.log('3-DataFeed.ts')
console.log('3-Aggregator.ts')

// Aggregator
const config = dataFeedConfig['KLAY/USD']
Expand All @@ -29,22 +29,24 @@ const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) {

// Charge KLAY to Aggregator (usedd for paying oracles)
const value = ethers.utils.parseEther('1.0')
await aggregator.deposit({ value })
await (await aggregator.deposit({ value })).wait()

// Setup oracles that will contribute to Aggregator
const removed = []
const added = [feedOracle0]
// FIXME Most likely wrong. Learn more about addedAdmins.
const addedAdmins = [feedOracle0]

await aggregator.changeOracles(
removed,
added,
addedAdmins,
config.minSubmissionCount,
config.maxSubmissionCount,
config.restartDelay
)
await (
await aggregator.changeOracles(
removed,
added,
addedAdmins,
config.minSubmissionCount,
config.maxSubmissionCount,
config.restartDelay
)
).wait()

// Aggregator Proxy
const aggregatorProxyDeployment = await deploy('AggregatorProxy', {
Expand All @@ -53,6 +55,14 @@ const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) {
log: true
})

if (['localhost', 'hardhat'].includes(network.name)) {
await localhostDeployment({ deploy, consumer, aggregatorProxyDeployment })
}
}

async function localhostDeployment(args) {
const { deploy, consumer, aggregatorProxyDeployment } = args

// Data feed consumer
await deploy('DataFeedConsumerMock', {
args: [aggregatorProxyDeployment.address],
Expand All @@ -62,5 +72,5 @@ const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) {
}

export default func
func.id = 'deploy-data-feed'
func.tags = ['data-feed']
func.id = 'deploy-aggregator'
func.tags = ['aggregator']
7 changes: 5 additions & 2 deletions contracts/hardhat.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -47,8 +47,7 @@ const config: HardhatUserConfig = {
},
namedAccounts: {
deployer: {
default: 0,
baobab: '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266'
default: 0
},
consumer: {
default: 1,
Expand All @@ -65,6 +64,10 @@ const config: HardhatUserConfig = {
feedOracle2: {
default: 4,
baobab: '0x15d34AAf54267DB7D7c367839AAf71A00a2C6A65'
},
vrfOracle0: {
default: 18,
baobab: '0xdd2fd4581271e230360230f9337d5c0430bf44c0'
}
}
}
Expand Down
5 changes: 3 additions & 2 deletions contracts/package.json
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
{
"name": "@bisonai-cic/icn-contracts",
"version": "0.2.0",
"version": "0.3.2",
"description": "",
"files": [
"dist"
"./dist",
"./src"
],
"engines": {
"node": ">=18.12"
Expand Down
1 change: 0 additions & 1 deletion contracts/scripts/v0.1/off-chain-vrf/request-vrf-direct.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ import { ethers } from 'hardhat'
import hre from 'hardhat'

async function main() {
const vrfCoordinator = await ethers.getContract('VRFCoordinator')
const vrfConsumerMock = await ethers.getContract('VRFConsumerMock')
const { consumer } = await hre.getNamedAccounts()

Expand Down
1 change: 0 additions & 1 deletion contracts/scripts/v0.1/off-chain-vrf/request-vrf.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ import { ethers } from 'hardhat'
import hre from 'hardhat'

async function main() {
const vrfCoordinator = await ethers.getContract('VRFCoordinator')
const vrfConsumerMock = await ethers.getContract('VRFConsumerMock')
const { consumer } = await hre.getNamedAccounts()

Expand Down
30 changes: 30 additions & 0 deletions contracts/scripts/v0.1/types.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
interface IDirectPaymentConfig {
fulfillmentFee: string
baseFee: string
}

interface IFeeConfig {
fulfillmentFlatFeeKlayPPMTier1: number
fulfillmentFlatFeeKlayPPMTier2: number
fulfillmentFlatFeeKlayPPMTier3: number
fulfillmentFlatFeeKlayPPMTier4: number
fulfillmentFlatFeeKlayPPMTier5: number
reqsForTier2: number
reqsForTier3: number
reqsForTier4: number
reqsForTier5: number
}

interface IVrfOracle {
address: string
publicProvingKey: [string, string]
}

export interface IVrfConfig {
minimumRequestConfirmations: number
maxGasLimit: number
gasAfterPaymentCalculation: number
feeConfig: IFeeConfig
paymentConfig: IDirectPaymentConfig
oracle: IVrfOracle[]
}
6 changes: 6 additions & 0 deletions contracts/scripts/v0.1/utils.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
import { readFile } from 'node:fs/promises'

export async function loadJson(filepath: string) {
const json = await readFile(filepath, 'utf8')
return JSON.parse(json)
}
23 changes: 14 additions & 9 deletions contracts/src/v0.1/VRFCoordinator.sol
Original file line number Diff line number Diff line change
Expand Up @@ -73,12 +73,12 @@ contract VRFCoordinator is

PrepaymentInterface Prepayment;

struct PaymentConfig {
struct DirectPaymentConfig {
uint256 fulfillmentFee;
uint256 baseFee;
}

PaymentConfig s_paymentConfig;
DirectPaymentConfig s_directPaymentConfig;

error InvalidKeyHash(bytes32 keyHash);
error InvalidConsumer(uint64 accId, address consumer);
Expand Down Expand Up @@ -119,7 +119,7 @@ contract VRFCoordinator is
uint32 gasAfterPaymentCalculation,
FeeConfig feeConfig
);
event PaymentConfigSet(uint256 fulfillmentFee, uint256 baseFee);
event DirectPaymentConfigSet(uint256 fulfillmentFee, uint256 baseFee);

modifier nonReentrant() {
if (s_config.reentrancyLock) {
Expand Down Expand Up @@ -266,17 +266,22 @@ contract VRFCoordinator is
return (s_config.minimumRequestConfirmations, s_config.maxGasLimit, s_provingKeyHashes);
}

function setPaymentConfig(PaymentConfig memory paymentConfig) public onlyOwner {
s_paymentConfig = paymentConfig;
emit PaymentConfigSet(paymentConfig.fulfillmentFee, paymentConfig.baseFee);
function setDirectPaymentConfig(
DirectPaymentConfig memory directPaymentConfig
) public onlyOwner {
s_directPaymentConfig = directPaymentConfig;
emit DirectPaymentConfigSet(
directPaymentConfig.fulfillmentFee,
directPaymentConfig.baseFee
);
}

function getPaymentConfig() external view returns (uint256, uint256) {
return (s_paymentConfig.fulfillmentFee, s_paymentConfig.baseFee);
function getDirectPaymentConfig() external view returns (uint256, uint256) {
return (s_directPaymentConfig.fulfillmentFee, s_directPaymentConfig.baseFee);
}

function estimateDirectPaymentFee() public view returns (uint256) {
return s_paymentConfig.fulfillmentFee + s_paymentConfig.baseFee;
return s_directPaymentConfig.fulfillmentFee + s_directPaymentConfig.baseFee;
}

/**
Expand Down
2 changes: 1 addition & 1 deletion core/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@
"eslint": "DEBUG=eslint:cli-engine npx eslint 'src/**/*.ts' 'src/*.ts' 'test/*.ts'"
},
"dependencies": {
"@bisonai-cic/icn-contracts": "^0.2.0",
"@bisonai-cic/icn-contracts": "^0.3.0",
"axios": "^1.2.2",
"bn.js": "^5.2.1",
"bullmq": "^3.2.2",
Expand Down
2 changes: 1 addition & 1 deletion core/src/cli/operator/adapter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import { printObject } from '../../utils'
import { ReadFile } from './types'

export function adapterSub(db) {
// adapter list
// adapter list [--active] [--chain [chain]]
// adapter insert --file-path [file-path] --chain [chain] [--dryrun]
// adapter remove --id [id] [--dryrun]

Expand Down
Loading

0 comments on commit 9fd99cf

Please sign in to comment.