From 9e7b6d94ff3ccb7384f3026ef4d0b11c1e4b4392 Mon Sep 17 00:00:00 2001 From: Amin Moghaddam Date: Thu, 29 Feb 2024 08:10:50 +0100 Subject: [PATCH] feat(per): Per solidity sdk (#1325) * feat(per): add solidity sdk * refactor(evm): refactor abi generator script * feat(evm): add abi_generator package --- express_relay/sdk/js/package.json | 6 +- .../sdk/solidity/IPERFeeReceiver.sol | 11 + express_relay/sdk/solidity/IPERMulticall.sol | 15 + express_relay/sdk/solidity/README.md | 27 ++ .../sdk/solidity/abis/IPERFeeReceiver.json | 15 + .../sdk/solidity/abis/IPERMulticall.json | 26 ++ express_relay/sdk/solidity/package.json | 34 +++ package-lock.json | 266 ++++++++---------- package.json | 2 + .../ethereum/abi_generator/package.json | 28 ++ .../ethereum/abi_generator/src/generate.js | 5 + .../ethereum/abi_generator/src/index.js | 56 ++++ .../entropy_sdk/solidity/package.json | 4 +- .../solidity/scripts/generateAbi.js | 54 ---- .../ethereum/sdk/solidity/package.json | 4 +- .../sdk/solidity/scripts/generateAbi.js | 55 ---- 16 files changed, 347 insertions(+), 261 deletions(-) create mode 100644 express_relay/sdk/solidity/IPERFeeReceiver.sol create mode 100644 express_relay/sdk/solidity/IPERMulticall.sol create mode 100644 express_relay/sdk/solidity/README.md create mode 100644 express_relay/sdk/solidity/abis/IPERFeeReceiver.json create mode 100644 express_relay/sdk/solidity/abis/IPERMulticall.json create mode 100644 express_relay/sdk/solidity/package.json create mode 100644 target_chains/ethereum/abi_generator/package.json create mode 100755 target_chains/ethereum/abi_generator/src/generate.js create mode 100644 target_chains/ethereum/abi_generator/src/index.js delete mode 100644 target_chains/ethereum/entropy_sdk/solidity/scripts/generateAbi.js delete mode 100644 target_chains/ethereum/sdk/solidity/scripts/generateAbi.js diff --git a/express_relay/sdk/js/package.json b/express_relay/sdk/js/package.json index 125c07f2..4e018a01 100644 --- a/express_relay/sdk/js/package.json +++ b/express_relay/sdk/js/package.json @@ -2,10 +2,8 @@ "name": "@pythnetwork/express-relay-evm-js", "version": "0.1.1", "description": "Utilities for interacting with the express relay protocol", - "homepage": "https://pyth.network", - "author": { - "name": "Pyth Data Association" - }, + "homepage": "https://github.com/pyth-network/pyth-crosschain/tree/main/express_relay/sdk/js", + "author": "Douro Labs", "main": "lib/index.js", "types": "lib/index.d.ts", "files": [ diff --git a/express_relay/sdk/solidity/IPERFeeReceiver.sol b/express_relay/sdk/solidity/IPERFeeReceiver.sol new file mode 100644 index 00000000..6d285e04 --- /dev/null +++ b/express_relay/sdk/solidity/IPERFeeReceiver.sol @@ -0,0 +1,11 @@ +// SPDX-License-Identifier: UNLICENSED +// Copyright (C) 2024 Lavra Holdings Limited - All Rights Reserved +pragma solidity ^0.8.0; + +interface IPERFeeReceiver { + // Receive the proceeds of an auction. + // @param permissionKey The permission key where the auction was conducted on. + function receiveAuctionProceedings( + bytes calldata permissionKey + ) external payable; +} diff --git a/express_relay/sdk/solidity/IPERMulticall.sol b/express_relay/sdk/solidity/IPERMulticall.sol new file mode 100644 index 00000000..4d149a6a --- /dev/null +++ b/express_relay/sdk/solidity/IPERMulticall.sol @@ -0,0 +1,15 @@ +// SPDX-License-Identifier: UNLICENSED +// Copyright (C) 2024 Lavra Holdings Limited - All Rights Reserved +pragma solidity ^0.8.0; + +interface IPERMulticall { + // Check if the combination of protocol and permissionKey is allowed within this transaction. + // This will return true if and only if it's being called while executing the auction winner call. + // @param protocol The address of the protocol that is gating an action behind this permission + // @param permissionKey The permission key that is being checked + // @return permissioned True if the permission is allowed, false otherwise + function isPermissioned( + address protocol, + bytes calldata permissionKey + ) external view returns (bool permissioned); +} diff --git a/express_relay/sdk/solidity/README.md b/express_relay/sdk/solidity/README.md new file mode 100644 index 00000000..c05959a4 --- /dev/null +++ b/express_relay/sdk/solidity/README.md @@ -0,0 +1,27 @@ +# Pyth Express Relay Solidity SDK + +## Install + +### Truffle/Hardhat + +If you are using Truffle or Hardhat, simply install the NPM package: + +```bash +npm install @pythnetwork/per-sdk-solidity +``` + +### Foundry + +If you are using Foundry, you will need to create an NPM project if you don't already have one. +From the root directory of your project, run: + +```bash +npm init -y +npm install @pythnetwork/per-sdk-solidity +``` + +Then add the following line to your `remappings.txt` file: + +```text +@pythnetwork/per-sdk-solidity/=node_modules/@pythnetwork/per-sdk-solidity +``` diff --git a/express_relay/sdk/solidity/abis/IPERFeeReceiver.json b/express_relay/sdk/solidity/abis/IPERFeeReceiver.json new file mode 100644 index 00000000..1758be0d --- /dev/null +++ b/express_relay/sdk/solidity/abis/IPERFeeReceiver.json @@ -0,0 +1,15 @@ +[ + { + "inputs": [ + { + "internalType": "bytes", + "name": "permissionKey", + "type": "bytes" + } + ], + "name": "receiveAuctionProceedings", + "outputs": [], + "stateMutability": "payable", + "type": "function" + } +] diff --git a/express_relay/sdk/solidity/abis/IPERMulticall.json b/express_relay/sdk/solidity/abis/IPERMulticall.json new file mode 100644 index 00000000..c8588fee --- /dev/null +++ b/express_relay/sdk/solidity/abis/IPERMulticall.json @@ -0,0 +1,26 @@ +[ + { + "inputs": [ + { + "internalType": "address", + "name": "protocol", + "type": "address" + }, + { + "internalType": "bytes", + "name": "permissionKey", + "type": "bytes" + } + ], + "name": "isPermissioned", + "outputs": [ + { + "internalType": "bool", + "name": "permissioned", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + } +] diff --git a/express_relay/sdk/solidity/package.json b/express_relay/sdk/solidity/package.json new file mode 100644 index 00000000..d19d3d2e --- /dev/null +++ b/express_relay/sdk/solidity/package.json @@ -0,0 +1,34 @@ +{ + "name": "@pythnetwork/per-sdk-solidity", + "version": "0.1.0", + "description": "Solidity SDK for interacting with Pyth express relay contracts", + "repository": { + "type": "git", + "url": "https://github.com/pyth-network/pyth-crosschain", + "directory": "express_relay/sdk/solidity" + }, + "publishConfig": { + "access": "public" + }, + "scripts": { + "format": "npx prettier --write .", + "generate-abi": "npx generate-abis IPERMulticall IPERFeeReceiver", + "check-abi": "git diff --exit-code abis" + }, + "keywords": [ + "pyth", + "oracle", + "relay" + ], + "author": "Douro Labs", + "license": "Apache-2.0", + "bugs": { + "url": "https://github.com/pyth-network/pyth-crosschain/issues" + }, + "homepage": "https://github.com/pyth-network/pyth-crosschain/tree/main/express_relay/sdk/solidity", + "devDependencies": { + "prettier": "^2.7.1", + "prettier-plugin-solidity": "^1.0.0-rc.1", + "abi_generator": "*" + } +} diff --git a/package-lock.json b/package-lock.json index ed04eda0..ea53bf7c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7,6 +7,7 @@ "name": "root", "workspaces": [ "express_relay/sdk/js", + "express_relay/sdk/solidity", "governance/xc_admin/packages/*", "governance/multisig_wh_message_builder", "price_pusher", @@ -17,6 +18,7 @@ "target_chains/cosmwasm/tools", "target_chains/cosmwasm/deploy-scripts", "target_chains/ethereum/contracts", + "target_chains/ethereum/abi_generator", "target_chains/ethereum/entropy_sdk/solidity", "target_chains/ethereum/sdk/js", "target_chains/ethereum/sdk/solidity", @@ -2065,6 +2067,16 @@ "node": ">=12" } }, + "express_relay/sdk/solidity": { + "name": "@pythnetwork/per-sdk-solidity", + "version": "0.1.0", + "license": "Apache-2.0", + "devDependencies": { + "abi_generator": "*", + "prettier": "^2.7.1", + "prettier-plugin-solidity": "^1.0.0-rc.1" + } + }, "governance/multisig_wh_message_builder": { "name": "@pythnetwork/pyth-multisig-wh-message-builder", "version": "0.1.0", @@ -13166,6 +13178,10 @@ "resolved": "express_relay/sdk/js", "link": true }, + "node_modules/@pythnetwork/per-sdk-solidity": { + "resolved": "express_relay/sdk/solidity", + "link": true + }, "node_modules/@pythnetwork/price-pusher": { "resolved": "price_pusher", "link": true @@ -21721,6 +21737,10 @@ "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", "dev": true }, + "node_modules/abi_generator": { + "resolved": "target_chains/ethereum/abi_generator", + "link": true + }, "node_modules/abort-controller": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", @@ -58311,6 +58331,56 @@ "node": ">=12" } }, + "target_chains/ethereum/abi_generator": { + "version": "0.0.0", + "license": "Apache 2", + "bin": { + "generate-abis": "src/generate.js" + }, + "devDependencies": { + "prettier": "^2.7.1", + "solc": "^0.8.15" + } + }, + "target_chains/ethereum/abi_generator/node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "dev": true, + "engines": { + "node": ">= 12" + } + }, + "target_chains/ethereum/abi_generator/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "target_chains/ethereum/abi_generator/node_modules/solc": { + "version": "0.8.24", + "resolved": "https://registry.npmjs.org/solc/-/solc-0.8.24.tgz", + "integrity": "sha512-G5yUqjTUPc8Np74sCFwfsevhBPlUifUOfhYrgyu6CmYlC6feSw0YS6eZW47XDT23k3JYdKx5nJ+Q7whCEmNcoA==", + "dev": true, + "dependencies": { + "command-exists": "^1.2.8", + "commander": "^8.1.0", + "follow-redirects": "^1.12.1", + "js-sha3": "0.8.0", + "memorystream": "^0.3.1", + "semver": "^5.5.0", + "tmp": "0.0.33" + }, + "bin": { + "solcjs": "solc.js" + }, + "engines": { + "node": ">=10.0.0" + } + }, "target_chains/ethereum/contracts": { "name": "@pythnetwork/pyth-evm-contract", "version": "1.4.0", @@ -58902,48 +58972,9 @@ "version": "1.1.3", "license": "Apache-2.0", "devDependencies": { + "abi_generator": "*", "prettier": "^2.7.1", - "prettier-plugin-solidity": "^1.0.0-rc.1", - "solc": "^0.8.15" - } - }, - "target_chains/ethereum/entropy_sdk/solidity/node_modules/commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", - "dev": true, - "engines": { - "node": ">= 12" - } - }, - "target_chains/ethereum/entropy_sdk/solidity/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "target_chains/ethereum/entropy_sdk/solidity/node_modules/solc": { - "version": "0.8.21", - "resolved": "https://registry.npmjs.org/solc/-/solc-0.8.21.tgz", - "integrity": "sha512-N55ogy2dkTRwiONbj4e6wMZqUNaLZkiRcjGyeafjLYzo/tf/IvhHY5P5wpe+H3Fubh9idu071i8eOGO31s1ylg==", - "dev": true, - "dependencies": { - "command-exists": "^1.2.8", - "commander": "^8.1.0", - "follow-redirects": "^1.12.1", - "js-sha3": "0.8.0", - "memorystream": "^0.3.1", - "semver": "^5.5.0", - "tmp": "0.0.33" - }, - "bin": { - "solcjs": "solc.js" - }, - "engines": { - "node": ">=10.0.0" + "prettier-plugin-solidity": "^1.0.0-rc.1" } }, "target_chains/ethereum/examples/coin_flip/app": { @@ -59486,48 +59517,9 @@ "version": "2.4.1", "license": "Apache-2.0", "devDependencies": { + "abi_generator": "*", "prettier": "^2.7.1", - "prettier-plugin-solidity": "^1.0.0-rc.1", - "solc": "^0.8.15" - } - }, - "target_chains/ethereum/sdk/solidity/node_modules/commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", - "dev": true, - "engines": { - "node": ">= 12" - } - }, - "target_chains/ethereum/sdk/solidity/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "target_chains/ethereum/sdk/solidity/node_modules/solc": { - "version": "0.8.19", - "resolved": "https://registry.npmjs.org/solc/-/solc-0.8.19.tgz", - "integrity": "sha512-yqurS3wzC4LdEvmMobODXqprV4MYJcVtinuxgrp61ac8K2zz40vXA0eSAskSHPgv8dQo7Nux39i3QBsHx4pqyA==", - "dev": true, - "dependencies": { - "command-exists": "^1.2.8", - "commander": "^8.1.0", - "follow-redirects": "^1.12.1", - "js-sha3": "0.8.0", - "memorystream": "^0.3.1", - "semver": "^5.5.0", - "tmp": "0.0.33" - }, - "bin": { - "solcjs": "solc.js" - }, - "engines": { - "node": ">=10.0.0" + "prettier-plugin-solidity": "^1.0.0-rc.1" } }, "target_chains/solana/sdk/js/pyth_solana_receiver": { @@ -67482,38 +67474,9 @@ "@pythnetwork/entropy-sdk-solidity": { "version": "file:target_chains/ethereum/entropy_sdk/solidity", "requires": { + "abi_generator": "*", "prettier": "^2.7.1", - "prettier-plugin-solidity": "^1.0.0-rc.1", - "solc": "^0.8.15" - }, - "dependencies": { - "commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", - "dev": true - }, - "semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true - }, - "solc": { - "version": "0.8.21", - "resolved": "https://registry.npmjs.org/solc/-/solc-0.8.21.tgz", - "integrity": "sha512-N55ogy2dkTRwiONbj4e6wMZqUNaLZkiRcjGyeafjLYzo/tf/IvhHY5P5wpe+H3Fubh9idu071i8eOGO31s1ylg==", - "dev": true, - "requires": { - "command-exists": "^1.2.8", - "commander": "^8.1.0", - "follow-redirects": "^1.12.1", - "js-sha3": "0.8.0", - "memorystream": "^0.3.1", - "semver": "^5.5.0", - "tmp": "0.0.33" - } - } + "prettier-plugin-solidity": "^1.0.0-rc.1" } }, "@pythnetwork/eth-coin-flip-example": { @@ -68814,6 +68777,14 @@ } } }, + "@pythnetwork/per-sdk-solidity": { + "version": "file:express_relay/sdk/solidity", + "requires": { + "abi_generator": "*", + "prettier": "^2.7.1", + "prettier-plugin-solidity": "^1.0.0-rc.1" + } + }, "@pythnetwork/price-pusher": { "version": "file:price_pusher", "requires": { @@ -71462,38 +71433,9 @@ "@pythnetwork/pyth-sdk-solidity": { "version": "file:target_chains/ethereum/sdk/solidity", "requires": { + "abi_generator": "*", "prettier": "^2.7.1", - "prettier-plugin-solidity": "^1.0.0-rc.1", - "solc": "^0.8.15" - }, - "dependencies": { - "commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", - "dev": true - }, - "semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true - }, - "solc": { - "version": "0.8.19", - "resolved": "https://registry.npmjs.org/solc/-/solc-0.8.19.tgz", - "integrity": "sha512-yqurS3wzC4LdEvmMobODXqprV4MYJcVtinuxgrp61ac8K2zz40vXA0eSAskSHPgv8dQo7Nux39i3QBsHx4pqyA==", - "dev": true, - "requires": { - "command-exists": "^1.2.8", - "commander": "^8.1.0", - "follow-redirects": "^1.12.1", - "js-sha3": "0.8.0", - "memorystream": "^0.3.1", - "semver": "^5.5.0", - "tmp": "0.0.33" - } - } + "prettier-plugin-solidity": "^1.0.0-rc.1" } }, "@pythnetwork/pyth-solana-receiver": { @@ -78479,6 +78421,42 @@ "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", "dev": true }, + "abi_generator": { + "version": "file:target_chains/ethereum/abi_generator", + "requires": { + "prettier": "^2.7.1", + "solc": "^0.8.15" + }, + "dependencies": { + "commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "dev": true + }, + "semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true + }, + "solc": { + "version": "0.8.24", + "resolved": "https://registry.npmjs.org/solc/-/solc-0.8.24.tgz", + "integrity": "sha512-G5yUqjTUPc8Np74sCFwfsevhBPlUifUOfhYrgyu6CmYlC6feSw0YS6eZW47XDT23k3JYdKx5nJ+Q7whCEmNcoA==", + "dev": true, + "requires": { + "command-exists": "^1.2.8", + "commander": "^8.1.0", + "follow-redirects": "^1.12.1", + "js-sha3": "0.8.0", + "memorystream": "^0.3.1", + "semver": "^5.5.0", + "tmp": "0.0.33" + } + } + } + }, "abort-controller": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", diff --git a/package.json b/package.json index f40fb634..0a5bab84 100644 --- a/package.json +++ b/package.json @@ -2,6 +2,7 @@ "name": "root", "workspaces": [ "express_relay/sdk/js", + "express_relay/sdk/solidity", "governance/xc_admin/packages/*", "governance/multisig_wh_message_builder", "price_pusher", @@ -12,6 +13,7 @@ "target_chains/cosmwasm/tools", "target_chains/cosmwasm/deploy-scripts", "target_chains/ethereum/contracts", + "target_chains/ethereum/abi_generator", "target_chains/ethereum/entropy_sdk/solidity", "target_chains/ethereum/sdk/js", "target_chains/ethereum/sdk/solidity", diff --git a/target_chains/ethereum/abi_generator/package.json b/target_chains/ethereum/abi_generator/package.json new file mode 100644 index 00000000..c6d29afd --- /dev/null +++ b/target_chains/ethereum/abi_generator/package.json @@ -0,0 +1,28 @@ +{ + "name": "abi_generator", + "version": "0.0.0", + "private": "true", + "description": "", + "author": "", + "homepage": "https://github.com/pyth-network/pyth-crosschain", + "license": "Apache 2", + "main": "src/index.js", + "repository": { + "type": "git", + "url": "git+https://github.com/pyth-network/pyth-crosschain.git" + }, + "bugs": { + "url": "https://github.com/pyth-network/pyth-crosschain/issues" + }, + "bin": { + "generate-abis": "src/generate.js" + }, + "scripts": { + "format": "npx prettier --write .", + "generate": "node src/generate.js" + }, + "devDependencies": { + "prettier": "^2.7.1", + "solc": "^0.8.15" + } +} diff --git a/target_chains/ethereum/abi_generator/src/generate.js b/target_chains/ethereum/abi_generator/src/generate.js new file mode 100755 index 00000000..3e201a94 --- /dev/null +++ b/target_chains/ethereum/abi_generator/src/generate.js @@ -0,0 +1,5 @@ +#!/usr/bin/env node + +const { generateAbi } = require("./index"); +const contracts = process.argv.slice(2); +generateAbi(contracts); diff --git a/target_chains/ethereum/abi_generator/src/index.js b/target_chains/ethereum/abi_generator/src/index.js new file mode 100644 index 00000000..ac92065c --- /dev/null +++ b/target_chains/ethereum/abi_generator/src/index.js @@ -0,0 +1,56 @@ +const fs = require("fs"); +const solc = require("solc"); + +/** + * Generate ABI files for the given contracts and save them in the `abis` directory. + * Creates the `abis` directory if it does not exist. + * + * @param contracts List of file names assuming each contract is in the file with the same name. + */ +function generateAbi(contracts) { + var sources = {}; + var outputSelection = {}; + + for (let contract of contracts) { + const contractFile = `${contract}.sol`; + sources[contractFile] = { + content: fs.readFileSync(contractFile).toString(), + }; + outputSelection[contractFile] = {}; + outputSelection[contractFile][contract] = ["abi"]; + } + + var input = { + language: "Solidity", + sources, + settings: { + outputSelection, + }, + }; + + function findImports(path) { + return { + contents: fs.readFileSync(path).toString(), + }; + } + + const output = JSON.parse( + solc.compile(JSON.stringify(input), { import: findImports }) + ); + + if (!fs.existsSync("abis")) { + fs.mkdirSync("abis"); + } + + for (let contract of contracts) { + const contractFile = `${contract}.sol`; + + const abi = output.contracts[contractFile][contract].abi; + fs.writeFileSync( + `abis/${contract}.json`, + JSON.stringify(abi, null, 2) + "\n" + ); + } +} + +module.exports = { generateAbi }; diff --git a/target_chains/ethereum/entropy_sdk/solidity/package.json b/target_chains/ethereum/entropy_sdk/solidity/package.json index 3f6d8244..c660be45 100644 --- a/target_chains/ethereum/entropy_sdk/solidity/package.json +++ b/target_chains/ethereum/entropy_sdk/solidity/package.json @@ -12,7 +12,7 @@ }, "scripts": { "format": "npx prettier --write .", - "generate-abi": "node scripts/generateAbi.js", + "generate-abi": "npx generate-abis IEntropy EntropyErrors EntropyEvents EntropyStructs", "check-abi": "git diff --exit-code abis" }, "keywords": [ @@ -29,6 +29,6 @@ "devDependencies": { "prettier": "^2.7.1", "prettier-plugin-solidity": "^1.0.0-rc.1", - "solc": "^0.8.15" + "abi_generator": "*" } } diff --git a/target_chains/ethereum/entropy_sdk/solidity/scripts/generateAbi.js b/target_chains/ethereum/entropy_sdk/solidity/scripts/generateAbi.js deleted file mode 100644 index 13d8fa17..00000000 --- a/target_chains/ethereum/entropy_sdk/solidity/scripts/generateAbi.js +++ /dev/null @@ -1,54 +0,0 @@ -const fs = require("fs"); -const solc = require("solc"); - -// Assuming each contract is in the file with the same name. -var contracts = [ - "IEntropy", - "EntropyErrors", - "EntropyEvents", - "EntropyStructs", -]; - -var sources = {}; -var outputSelection = {}; - -for (let contract of contracts) { - const contractFile = `${contract}.sol`; - sources[contractFile] = { - content: fs.readFileSync(contractFile).toString(), - }; - outputSelection[contractFile] = {}; - outputSelection[contractFile][contract] = ["abi"]; -} - -var input = { - language: "Solidity", - sources, - settings: { - outputSelection, - }, -}; - -function findImports(path) { - return { - contents: fs.readFileSync(path).toString(), - }; -} - -const output = JSON.parse( - solc.compile(JSON.stringify(input), { import: findImports }) -); - -if (!fs.existsSync("abis")) { - fs.mkdirSync("abis"); -} - -for (let contract of contracts) { - const contractFile = `${contract}.sol`; - - const abi = output.contracts[contractFile][contract].abi; - fs.writeFileSync( - `abis/${contract}.json`, - JSON.stringify(abi, null, 2) + "\n" - ); -} diff --git a/target_chains/ethereum/sdk/solidity/package.json b/target_chains/ethereum/sdk/solidity/package.json index 02deabf9..04db459e 100644 --- a/target_chains/ethereum/sdk/solidity/package.json +++ b/target_chains/ethereum/sdk/solidity/package.json @@ -9,7 +9,7 @@ }, "scripts": { "format": "npx prettier --write .", - "generate-abi": "node scripts/generateAbi.js", + "generate-abi": "npx generate-abis IPyth IPythEvents AbstractPyth MockPyth PythErrors", "check-abi": "git diff --exit-code abis", "build": "solcjs --bin MockPyth.sol --base-path . -o build/" }, @@ -27,6 +27,6 @@ "devDependencies": { "prettier": "^2.7.1", "prettier-plugin-solidity": "^1.0.0-rc.1", - "solc": "^0.8.15" + "abi_generator": "*" } } diff --git a/target_chains/ethereum/sdk/solidity/scripts/generateAbi.js b/target_chains/ethereum/sdk/solidity/scripts/generateAbi.js deleted file mode 100644 index 196d5ff1..00000000 --- a/target_chains/ethereum/sdk/solidity/scripts/generateAbi.js +++ /dev/null @@ -1,55 +0,0 @@ -const fs = require("fs"); -const solc = require("solc"); - -// Assuming each contract is in the file with the same name. -var contracts = [ - "IPyth", - "IPythEvents", - "AbstractPyth", - "MockPyth", - "PythErrors", -]; - -var sources = {}; -var outputSelection = {}; - -for (let contract of contracts) { - const contractFile = `${contract}.sol`; - sources[contractFile] = { - content: fs.readFileSync(contractFile).toString(), - }; - outputSelection[contractFile] = {}; - outputSelection[contractFile][contract] = ["abi"]; -} - -var input = { - language: "Solidity", - sources, - settings: { - outputSelection, - }, -}; - -function findImports(path) { - return { - contents: fs.readFileSync(path).toString(), - }; -} - -const output = JSON.parse( - solc.compile(JSON.stringify(input), { import: findImports }) -); - -if (!fs.existsSync("abis")) { - fs.mkdirSync("abis"); -} - -for (let contract of contracts) { - const contractFile = `${contract}.sol`; - - const abi = output.contracts[contractFile][contract].abi; - fs.writeFileSync( - `abis/${contract}.json`, - JSON.stringify(abi, null, 2) + "\n" - ); -}