From 5632fc2e12605bb60c6ed8563554a404a334291b Mon Sep 17 00:00:00 2001 From: superical Date: Fri, 30 Dec 2022 16:29:35 +0800 Subject: [PATCH] feat: remove unused gsn contracts (#126) * feat: remove unused gsn contracts * refactor: gsn related functions --- contracts/GsnCapable.sol | 34 ----- contracts/GsnCapableDocumentStore.sol | 33 ----- contracts/NaivePaymaster.sol | 88 ------------- contracts/test/ConfigurableTrustForwarder.sol | 15 --- src/config/config.ts | 7 -- test/GsnCapableDocumentStore.js | 116 ------------------ test/NaivePaymaster.js | 79 ------------ 7 files changed, 372 deletions(-) delete mode 100644 contracts/GsnCapable.sol delete mode 100644 contracts/GsnCapableDocumentStore.sol delete mode 100644 contracts/NaivePaymaster.sol delete mode 100644 contracts/test/ConfigurableTrustForwarder.sol delete mode 100644 test/GsnCapableDocumentStore.js delete mode 100644 test/NaivePaymaster.js diff --git a/contracts/GsnCapable.sol b/contracts/GsnCapable.sol deleted file mode 100644 index dd76fa1..0000000 --- a/contracts/GsnCapable.sol +++ /dev/null @@ -1,34 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 - -pragma solidity ^0.8.0; - -import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; -import "@openzeppelin/contracts/utils/introspection/ERC165Storage.sol"; - -contract GsnCapable is ERC165Storage, OwnableUpgradeable { - address public paymaster; - bytes4 private constant _INTERFACE_ID_GSN_CAPABLE = 0xa5a23640; - - event PaymasterSet(address indexed target); - - constructor() { - // register the supported interface to conform to TradeTrustERC721 via ERC165 - _registerInterface(_INTERFACE_ID_GSN_CAPABLE); - } - - function setPaymaster(address target) external onlyOwner { - paymaster = target; - emit PaymasterSet(target); - } - - function getPaymaster() external view returns (address) { - return paymaster; - } -} - -contract CalculateGsnCapableSelector { - function calculateSelector() public pure returns (bytes4) { - GsnCapable i; - return i.setPaymaster.selector ^ i.getPaymaster.selector; - } -} diff --git a/contracts/GsnCapableDocumentStore.sol b/contracts/GsnCapableDocumentStore.sol deleted file mode 100644 index 895abbc..0000000 --- a/contracts/GsnCapableDocumentStore.sol +++ /dev/null @@ -1,33 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 - -pragma solidity ^0.8.0; - -import "@opengsn/contracts/src/BaseRelayRecipient.sol"; - -import "./DocumentStore.sol"; -import "./GsnCapable.sol"; -import "../interfaces/IKnowForwarderAddress.sol"; - -contract GsnCapableDocumentStore is DocumentStore, BaseRelayRecipient, IKnowForwarderAddress, GsnCapable { - string public override versionRecipient = "2.0.0"; - - constructor(string memory name, address owner, address _forwarder) DocumentStore(name, owner) { - _setTrustedForwarder(_forwarder); - } - - function _msgSender() internal view override(ContextUpgradeable, BaseRelayRecipient) returns (address) { - return BaseRelayRecipient._msgSender(); - } - - function _msgData() internal view override(ContextUpgradeable, BaseRelayRecipient) returns (bytes memory) { - return BaseRelayRecipient._msgData(); - } - - function getTrustedForwarder() public view override returns (address) { - return trustedForwarder(); - } - - function setTrustedForwarder(address _forwarder) public onlyOwner { - _setTrustedForwarder(_forwarder); - } -} diff --git a/contracts/NaivePaymaster.sol b/contracts/NaivePaymaster.sol deleted file mode 100644 index f50ebaa..0000000 --- a/contracts/NaivePaymaster.sol +++ /dev/null @@ -1,88 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; -pragma experimental ABIEncoderV2; - -import "@opengsn/contracts/src/forwarder/IForwarder.sol"; -import "@opengsn/contracts/src/BasePaymaster.sol"; - -/** - * @dev Implementation of the {BasePaymaster} interface. - * - * Contracts may inherit from this and call {setTarget}, {removeTarget} to declare - * if they are willing to pay for relay call to given address. - */ -contract NaivePaymaster is BasePaymaster { - string public name; - string public version = "1.0.0"; - - // TODO: Do we need a withdraw function? - - /** - * @dev Mapping of the addresses we are willing to pay for. - */ - mapping(address => bool) private targetAddresses; - - constructor(string memory _name) { - name = _name; - } - - event TargetSet(address indexed target); - event TargetRemoved(address indexed target); - - /** - * @dev Registers the contract paymaster is willing to pay for. - */ - function setTarget(address target) external onlyOwner { - targetAddresses[target] = true; - emit TargetSet(target); - } - - /** - * @dev Revoke the contract paymaster no longer willing to pay. - */ - function removeTarget(address target) external onlyOwner { - targetAddresses[target] = false; - emit TargetRemoved(target); - } - - /** - * @dev Returns true if this paymaster willing to pay for relayed transaction - * This function call must use less than 30 000 gas. - */ - function supportsAddress(address target) external view returns (bool) { - return targetAddresses[target]; - } - - event PreRelayed(uint256); - event PostRelayed(uint256); - - function preRelayedCall( - GsnTypes.RelayRequest calldata relayRequest, - bytes calldata signature, - bytes calldata approvalData, - uint256 maxPossibleGas - ) external virtual override returns (bytes memory context, bool) { - _verifyForwarder(relayRequest); - (signature, approvalData, maxPossibleGas); - - // check if relayed request is to a accepted address - require(targetAddresses[relayRequest.request.to]); - emit PreRelayed(block.timestamp); - return (abi.encode(block.timestamp), false); - } - - function postRelayedCall( - bytes calldata context, - bool success, - uint256 gasUseWithoutPost, - GsnTypes.RelayData calldata relayData - ) external virtual override { - (context, success, gasUseWithoutPost, relayData); - emit PostRelayed(abi.decode(context, (uint256))); - } - - function versionPaymaster() external view virtual override returns (string memory) { - return version; - } -} diff --git a/contracts/test/ConfigurableTrustForwarder.sol b/contracts/test/ConfigurableTrustForwarder.sol deleted file mode 100644 index f24fadb..0000000 --- a/contracts/test/ConfigurableTrustForwarder.sol +++ /dev/null @@ -1,15 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 - -pragma solidity ^0.8.0; - -contract ConfigurableTrustForwarder { - function execute( - bytes calldata data, - address from, - address to - ) public returns (bool success, bytes memory ret) { - (success, ret) = to.call(abi.encodePacked(data, from)); - require(success); - return (success, ret); - } -} diff --git a/src/config/config.ts b/src/config/config.ts index 7b3a8dd..e602ec7 100644 --- a/src/config/config.ts +++ b/src/config/config.ts @@ -2,8 +2,6 @@ export const DOCUMENT_STORE_CREATOR_ROPSTEN = "0x4077534e82C97Be03A07FB10f5c853d export const DOCUMENT_STORE_CREATOR_MAINNET = "0x0"; export const PROXY_FACTORY_ROPSTEN = "0xba2501bf20593f156879c17d38b6c245ca65de80"; export const PROXY_FACTORY_MAINNET = "0x0"; -export const TRUST_FORWARDER_ROPSTEN = "0x25CEd1955423BA34332Ec1B60154967750a0297D"; -export const TRUST_FORWARDER_MAINNET = "0xa530F85085C6FE2f866E7FdB716849714a89f4CD"; export const getDocumentStoreCreatorAddress = (networkId?: number) => { if (networkId === 3) return DOCUMENT_STORE_CREATOR_ROPSTEN; @@ -14,8 +12,3 @@ export const getProxyFactoryAddress = (networkId?: number) => { if (networkId === 3) return PROXY_FACTORY_ROPSTEN; return PROXY_FACTORY_MAINNET; }; - -export const getTrustForwarderAddress = (networkId?: number) => { - if (networkId === 3) return TRUST_FORWARDER_ROPSTEN; - return TRUST_FORWARDER_MAINNET; -}; diff --git a/test/GsnCapableDocumentStore.js b/test/GsnCapableDocumentStore.js deleted file mode 100644 index f8ad0dd..0000000 --- a/test/GsnCapableDocumentStore.js +++ /dev/null @@ -1,116 +0,0 @@ -const { expect } = require("chai").use(require("chai-as-promised")); -const { ethers } = require("hardhat"); -const config = require("../config.js"); - -describe("GsnCapableDocumentStore", async () => { - let Accounts; - let GsnCapableDocumentStore; - let CalculateSelector; - - before("", async () => { - Accounts = await ethers.getSigners(); - GsnCapableDocumentStore = await ethers.getContractFactory("GsnCapableDocumentStore"); - CalculateSelector = await ethers.getContractFactory("CalculateGsnCapableSelector"); - GsnCapableDocumentStore.numberFormat = "String"; - }); - - let GsnCapableDocumentStoreInstance; - let CalculatorSelectorInstance; - - beforeEach("", async () => { - GsnCapableDocumentStoreInstance = await GsnCapableDocumentStore.connect(Accounts[0]).deploy( - config.INSTITUTE_NAME, - Accounts[0].address, - Accounts[1].address - ); - CalculatorSelectorInstance = await CalculateSelector.connect(Accounts[0]).deploy(); - }); - - describe("trustedForwarder", () => { - it("returns trustedForwarder address", async () => { - const trustedForwarder = await GsnCapableDocumentStoreInstance.getTrustedForwarder(); - expect(trustedForwarder).to.be.equal(Accounts[1].address); - }); - - it("should set trustedForwarder to given address", async () => { - await GsnCapableDocumentStoreInstance.setTrustedForwarder(Accounts[2].address); - const trustedForwarder = await GsnCapableDocumentStoreInstance.getTrustedForwarder(); - expect(trustedForwarder).to.be.equal(Accounts[2].address); - }); - }); - - describe("supportsInterface", () => { - it("returns true if supportsInterface for GsnCapable", async () => { - const expectedInterface = await CalculatorSelectorInstance.calculateSelector(); - const supportsGsnCapableInterface = await GsnCapableDocumentStoreInstance.supportsInterface(expectedInterface); - expect(supportsGsnCapableInterface).to.be.equal(true, `Expected selector: ${expectedInterface}`); - }); - - it("return false if does not support given interface", async () => { - const supportsGsnCapableInterface = await GsnCapableDocumentStoreInstance.supportsInterface("0xffffffff"); - expect(supportsGsnCapableInterface).to.be.false; - }); - }); - - describe("paymaster", () => { - it("should set paymaster address", async () => { - const tx = await GsnCapableDocumentStoreInstance.setPaymaster(Accounts[2].address); - const receipt = await tx.wait(); - - expect(receipt.events[0].event).to.be.equal("PaymasterSet"); - expect(receipt.events[0].args.target).to.be.equal(Accounts[2].address); - - const paymaster = await GsnCapableDocumentStoreInstance.getPaymaster(); - expect(paymaster).to.be.equal(Accounts[2].address); - }); - }); - - describe("able to receive relayed message", async () => { - let owner; - let relayer; - let dsInterface; - let issueFnData; - let ConfigurableTrustForwarder; - - before("", async () => { - Accounts = await ethers.getSigners(); - GsnCapableDocumentStore = await ethers.getContractFactory("GsnCapableDocumentStore"); - ConfigurableTrustForwarder = await ethers.getContractFactory("ConfigurableTrustForwarder"); - GsnCapableDocumentStore.numberFormat = "String"; - // eslint-disable-next-line no-underscore-dangle - dsInterface = new ethers.utils.Interface(JSON.parse(GsnCapableDocumentStore.interface.format("json"))); - issueFnData = dsInterface.encodeFunctionData("issue", [ - "0xe44e17b840f424f3764363e0fe331e812ef1a4d08ff8f63cbef5bfffe91a5e02", - ]); - [owner, relayer] = Accounts; - }); - - let configurableInstance; - let configurableForwarder; - - beforeEach("", async () => { - configurableForwarder = await ConfigurableTrustForwarder.deploy(); - configurableInstance = await GsnCapableDocumentStore.connect(owner).deploy( - config.INSTITUTE_NAME, - owner.address, - configurableForwarder.address - ); - }); - - it("should issue document when receive a relayed call by owner from relayer", async () => { - const configurableInstanceAddress = configurableInstance.address; - await configurableForwarder.connect(relayer).execute(issueFnData, owner.address, configurableInstanceAddress); - const documentIssued = await configurableInstance.isIssued( - "0xe44e17b840f424f3764363e0fe331e812ef1a4d08ff8f63cbef5bfffe91a5e02" - ); - expect(documentIssued).to.be.true; - }); - - it("should not allow issue document when receive a relayed call not by owner", async () => { - const configurableInstanceAddress = configurableInstance.address; - await expect( - configurableForwarder.connect(relayer).execute(issueFnData, relayer.address, configurableInstanceAddress) - ).to.be.rejectedWith(/revert/); - }); - }); -}); diff --git a/test/NaivePaymaster.js b/test/NaivePaymaster.js deleted file mode 100644 index e50b2e3..0000000 --- a/test/NaivePaymaster.js +++ /dev/null @@ -1,79 +0,0 @@ -const { expect } = require("chai").use(require("chai-as-promised")); -const { ethers } = require("hardhat"); -const config = require("../config.js"); - -const assertTargetAddressLog = (logs, event, target) => { - expect(logs.event).to.deep.equal(event); - expect(logs.args[0]).to.deep.equal(target); -}; - -describe("NaivePaymaster", async () => { - let Accounts; - let NaivePaymaster; - - before("", async () => { - Accounts = await ethers.getSigners(); - NaivePaymaster = await ethers.getContractFactory("NaivePaymaster"); - }); - - let NaivePaymasterInstance; - - beforeEach("", async () => { - NaivePaymasterInstance = await NaivePaymaster.connect(Accounts[0]).deploy(config.INSTITUTE_NAME); - }); - - const sampleGsnCapableDocumentStoreAddress1 = "0x29e41C2b329fF4921d8AC654CEc909a0B575df20"; - const sampleGsnCapableDocumentStoreAddress2 = "0x762A4D5F51d8b2F9bA1B0412B45687cE0EfFD92B"; - - describe("constructor", () => { - it("should have correct name", async () => { - const name = await NaivePaymasterInstance.name(); - expect(name).to.be.equal(config.INSTITUTE_NAME, "Name of institute does not match"); - }); - }); - - describe("version", () => { - it("should have a version field value that should be bumped on new versions of the contract", async () => { - const versionFromSolidity = await NaivePaymasterInstance.version(); - expect(versionFromSolidity).to.be.equal("1.0.0"); - }); - - it("should return version when versionRecipient called", async () => { - const versionFromSolidity = await NaivePaymasterInstance.versionPaymaster(); - expect(versionFromSolidity).to.be.equal("1.0.0"); - }); - }); - - describe("targetAddresses", () => { - beforeEach(async () => { - await NaivePaymasterInstance.setTarget(sampleGsnCapableDocumentStoreAddress1); - }); - - it("return true if target address is supported", async () => { - const isSupportedAddress = await NaivePaymasterInstance.supportsAddress(sampleGsnCapableDocumentStoreAddress1); - expect(isSupportedAddress).to.be.true; - }); - - it("should set target address", async () => { - const tx = await NaivePaymasterInstance.setTarget(sampleGsnCapableDocumentStoreAddress2); - const receipt = await tx.wait(); - const setTargetLog = receipt.events.find((log) => log.event === "TargetSet"); - assertTargetAddressLog(setTargetLog, "TargetSet", sampleGsnCapableDocumentStoreAddress2); - - const isSupportedAddress1 = await NaivePaymasterInstance.supportsAddress(sampleGsnCapableDocumentStoreAddress1); - expect(isSupportedAddress1).to.be.true; - const isSupportedAddress2 = await NaivePaymasterInstance.supportsAddress(sampleGsnCapableDocumentStoreAddress1); - expect(isSupportedAddress2).to.be.true; - }); - - it("should remove target address", async () => { - const tx = await NaivePaymasterInstance.removeTarget(sampleGsnCapableDocumentStoreAddress1); - const receipt = await tx.wait(); - const removeTargetLog = receipt.events.find((log) => log.event === "TargetRemoved"); - assertTargetAddressLog(removeTargetLog, "TargetRemoved", sampleGsnCapableDocumentStoreAddress1); - - const isSupportedAddress = await NaivePaymasterInstance.supportsAddress(sampleGsnCapableDocumentStoreAddress1); - expect(isSupportedAddress).to.be.false; - }); - }); -});