diff --git a/.github/workflows/handler.deploy-to-testnets.yml b/.github/workflows/handler.deploy-to-testnets.yml index 239a5fadbc..5ed1426bc9 100644 --- a/.github/workflows/handler.deploy-to-testnets.yml +++ b/.github/workflows/handler.deploy-to-testnets.yml @@ -22,21 +22,41 @@ jobs: env: RELEASE_VERSION: ${{ github.event.inputs.release_version }} + GOERLI_MNEMONIC: ${{ secrets.BUILD_AGENT_MNEMONIC }} GOERLI_PROVIDER_URL: ${{ secrets.GOERLI_PROVIDER_URL }} + RINKEBY_MNEMONIC: ${{ secrets.BUILD_AGENT_MNEMONIC }} RINKEBY_PROVIDER_URL: ${{ secrets.RINKEBY_PROVIDER_URL }} + ROPSTEN_MNEMONIC: ${{ secrets.BUILD_AGENT_MNEMONIC }} ROPSTEN_PROVIDER_URL: ${{ secrets.ROPSTEN_PROVIDER_URL }} + MUMBAI_MNEMONIC: ${{ secrets.BUILD_AGENT_MNEMONIC }} MUMBAI_PROVIDER_URL: ${{ secrets.MUMBAI_PROVIDER_URL }} + KOVAN_MNEMONIC: ${{ secrets.BUILD_AGENT_MNEMONIC }} KOVAN_PROVIDER_URL: ${{ secrets.KOVAN_PROVIDER_URL }} + XDAI_MNEMONIC: ${{ secrets.BUILD_AGENT_MNEMONIC }} + XDAI_PROVIDER_URL: ${{ secrets.XDAI_PROVIDER_URL }} + + MATIC_MNEMONIC: ${{ secrets.BUILD_AGENT_MNEMONIC }} + MATIC_PROVIDER_URL: ${{ secrets.MATIC_PROVIDER_URL }} + + OPTIMISM_KOVAN_MNEMONIC: ${{ secrets.BUILD_AGENT_MNEMONIC }} + OPTIMISM_KOVAN_PROVIDER_URL: ${{ secrets.OPTIMISM_KOVAN_PROVIDER_URL }} + + ARBITRUM_RINKEBY_MNEMONIC: ${{ secrets.BUILD_AGENT_MNEMONIC }} + ARBITRUM_RINKEBY_PROVIDER_URL: ${{ secrets.ARBITRUM_RINKEBY_PROVIDER_URL }} + + AVALANCHE_FUJI_MNEMONIC: ${{ secrets.BUILD_AGENT_MNEMONIC }} + AVALANCHE_FUJI_PROVIDER_URL: ${{ secrets.AVALANCHE_FUJI_PROVIDER_URL }} + strategy: fail-fast: false matrix: - network: [goerli, rinkeby, ropsten, kovan, mumbai] + network: [eth-goerli, eth-rinkeby, eth-ropsten, eth-kovan, eth-mumbai, optimism-kovan, arbitrum-rinkeby, avalanche-fuji] steps: - uses: actions/checkout@v2 @@ -75,3 +95,4 @@ jobs: env: ETHERSCAN_API_KEY: ${{ secrets.ETHERSCAN_API_KEY }} POLYGONSCAN_API_KEY: ${{ secrets.POLYGONSCAN_API_KEY }} + SNOWTRACE_API_KEY: ${{ secrets.SNOWTRACE_API_KEY }} diff --git a/.github/workflows/handler.run-ethereum-contracts-script.yml b/.github/workflows/handler.run-ethereum-contracts-script.yml index 2045037fcf..c78bea6485 100644 --- a/.github/workflows/handler.run-ethereum-contracts-script.yml +++ b/.github/workflows/handler.run-ethereum-contracts-script.yml @@ -60,17 +60,33 @@ jobs: ${{ github.event.inputs.script_args }} env: RELEASE_VERSION: ${{ github.event.inputs.release_version }} + GOERLI_MNEMONIC: ${{ secrets.BUILD_AGENT_MNEMONIC }} GOERLI_PROVIDER_URL: ${{ secrets.GOERLI_PROVIDER_URL }} + RINKEBY_MNEMONIC: ${{ secrets.BUILD_AGENT_MNEMONIC }} RINKEBY_PROVIDER_URL: ${{ secrets.RINKEBY_PROVIDER_URL }} + ROPSTEN_MNEMONIC: ${{ secrets.BUILD_AGENT_MNEMONIC }} ROPSTEN_PROVIDER_URL: ${{ secrets.ROPSTEN_PROVIDER_URL }} + MUMBAI_MNEMONIC: ${{ secrets.BUILD_AGENT_MNEMONIC }} MUMBAI_PROVIDER_URL: ${{ secrets.MUMBAI_PROVIDER_URL }} + KOVAN_MNEMONIC: ${{ secrets.BUILD_AGENT_MNEMONIC }} KOVAN_PROVIDER_URL: ${{ secrets.KOVAN_PROVIDER_URL }} + XDAI_MNEMONIC: ${{ secrets.BUILD_AGENT_MNEMONIC }} XDAI_PROVIDER_URL: ${{ secrets.XDAI_PROVIDER_URL }} + MATIC_MNEMONIC: ${{ secrets.BUILD_AGENT_MNEMONIC }} MATIC_PROVIDER_URL: ${{ secrets.MATIC_PROVIDER_URL }} + + OPTIMISM_KOVAN_PROVIDER_URL: ${{ secrets.OPTIMISM_KOVAN_PROVIDER_URL }} + OPTIMISM_KOVAN_MNEMONIC: ${{ secrets.BUILD_AGENT_MNEMONIC }} + + ARBITRUM_RINKEBY_PROVIDER_URL: ${{ secrets.ARBITRUM_RINKEBY_PROVIDER_URL }} + ARBITRUM_RINKEBY_MNEMONIC: ${{ secrets.BUILD_AGENT_MNEMONIC }} + + AVALANCHE_FUJI_PROVIDER_URL: ${{ secrets.AVALANCHE_FUJI_PROVIDER_URL }} + AVALANCHE_FUJI_MNEMONIC: ${{ secrets.BUILD_AGENT_MNEMONIC }} diff --git a/packages/ethereum-contracts/README.md b/packages/ethereum-contracts/README.md index 903e3f101f..daa1c43877 100644 --- a/packages/ethereum-contracts/README.md +++ b/packages/ethereum-contracts/README.md @@ -94,12 +94,12 @@ Clone a project, modify and play! In the example test code, you have seen how to deploy protocol contracts from JS code. In truffle projects, this deploy scripts can also be used on a CLI. E.g. in order to deploy to a local ganache dev chain: ```sh -NEW_TEST_RESOLVER=1 DISABLE_NATIVE_TRUFFLE=true truffle --network ganache exec "node_modules/@superfluid-finance/ethereum-contracts/scripts/deploy-test-environment.js" +CREATE_NEW_RESOLVER=1 DISABLE_NATIVE_TRUFFLE=true truffle --network ganache exec "node_modules/@superfluid-finance/ethereum-contracts/scripts/deploy-test-environment.js" ``` In order to deploy to another network, set the `network` argument accordingly. -`NEW_TEST_RESOLVER=1` forces the script to deploy a new resolver even if there's one already deployed (this is the case on Ethereum testnets). That's useful because otherwise the script would try to use the pre-existing resolver and have failing transactions due to lacking permissions. +`CREATE_NEW_RESOLVER=1` forces the script to deploy a new resolver even if there's one already deployed (this is the case on Ethereum testnets). That's useful because otherwise the script would try to use the pre-existing resolver and have failing transactions due to lacking permissions. `DISABLE_NATIVE_TRUFFLE=true` tells the script to use the contract binaries bundled with the npm package. @@ -108,10 +108,10 @@ After successful execution of this command, you should get something like this: ... ======== Super token deployed ======== =============== TEST ENVIRONMENT RESOLVER ====================== -export TEST_RESOLVER_ADDRESS=0x43098b8d85Fe90eCE6B055e135759B558d2c0224 +export RESOLVER_ADDRESS=0x43098b8d85Fe90eCE6B055e135759B558d2c0224 ``` -Run the export command to save `TEST_RESOLVER_ADDRESS` to your local environment. +Run the export command to save `RESOLVER_ADDRESS` to your local environment. This allows tests/scripts running later in the same environment to find and use the contracts just deployed. ## Contributing @@ -203,7 +203,7 @@ This will deploy the protocol contracts and a Super Token named _TEST_ (which is If you have set the env `TESTENV_SNAPSHOT_VARS` before, the file it's set to should now exist and look something like this: ```sh $ cat testenv.ignore.vars -TEST_RESOLVER_ADDRESS=0xF12b5dd4EAD5F743C6BaA640B0216200e89B60Da +RESOLVER_ADDRESS=0xF12b5dd4EAD5F743C6BaA640B0216200e89B60Da TESTENV_EVM_SNAPSHOT_ID=0x1 ``` diff --git a/packages/ethereum-contracts/contracts/interfaces/misc/IResolver.sol b/packages/ethereum-contracts/contracts/interfaces/ux/IResolver.sol similarity index 87% rename from packages/ethereum-contracts/contracts/interfaces/misc/IResolver.sol rename to packages/ethereum-contracts/contracts/interfaces/ux/IResolver.sol index 66a67e4eae..ef17e1b3e1 100644 --- a/packages/ethereum-contracts/contracts/interfaces/misc/IResolver.sol +++ b/packages/ethereum-contracts/contracts/interfaces/ux/IResolver.sol @@ -8,6 +8,8 @@ pragma solidity >= 0.5.0; */ interface IResolver { + event NameSet(string indexed name, address target); + /** * @dev Set resolver address name. */ diff --git a/packages/ethereum-contracts/contracts/test/TestToken.sol b/packages/ethereum-contracts/contracts/test/TestToken.sol index 1bd6b17b31..54ccd8ae79 100644 --- a/packages/ethereum-contracts/contracts/test/TestToken.sol +++ b/packages/ethereum-contracts/contracts/test/TestToken.sol @@ -8,6 +8,8 @@ import { ERC20 } from "@openzeppelin/contracts/token/ERC20/ERC20.sol"; */ contract TestToken is ERC20 { + uint256 public constant MINT_LIMIT = 1e12 ether; + constructor(string memory name, string memory symbol, uint8 decimals) ERC20(name, symbol) { @@ -18,6 +20,7 @@ contract TestToken is ERC20 { * @dev See {ERC20-_mint}. */ function mint(address account, uint256 amount) public returns (bool) { + require(amount <= MINT_LIMIT, "Don't mint too many"); ERC20._mint(account, amount); return true; } diff --git a/packages/ethereum-contracts/contracts/test/TestResolver.sol b/packages/ethereum-contracts/contracts/ux/Resolver.sol similarity index 60% rename from packages/ethereum-contracts/contracts/test/TestResolver.sol rename to packages/ethereum-contracts/contracts/ux/Resolver.sol index 8bf60cc395..bd700b2c40 100644 --- a/packages/ethereum-contracts/contracts/test/TestResolver.sol +++ b/packages/ethereum-contracts/contracts/ux/Resolver.sol @@ -2,10 +2,18 @@ pragma solidity 0.7.6; import { AccessControl } from "@openzeppelin/contracts/access/AccessControl.sol"; -import { IResolver } from "../interfaces/misc/IResolver.sol"; +import { IResolver } from "../interfaces/ux/IResolver.sol"; -contract TestResolver is IResolver, AccessControl { +/** + * @dev A simple implementation of IResolver using OZ AccessControl + * + * NOTE: + * Relevant events for indexing: + * - OZ Access Control events `RoleGranted`/`RoleRevoked`: admin add/remove + * - IResolver event `NameSet`: resolver name updates + */ +contract Resolver is IResolver, AccessControl { mapping(string => address) private _registry; @@ -16,6 +24,7 @@ contract TestResolver is IResolver, AccessControl { function set(string calldata name, address target) external override { require(hasRole(DEFAULT_ADMIN_ROLE, _msgSender()), "Caller is not an admin"); _registry[name] = target; + emit NameSet(name, target); } function get(string calldata name) external view override returns (address) { diff --git a/packages/ethereum-contracts/contracts/ux/SuperfluidLoader.sol b/packages/ethereum-contracts/contracts/ux/SuperfluidLoader.sol index b7db3f08fb..233dda34de 100644 --- a/packages/ethereum-contracts/contracts/ux/SuperfluidLoader.sol +++ b/packages/ethereum-contracts/contracts/ux/SuperfluidLoader.sol @@ -2,7 +2,7 @@ pragma abicoder v2; pragma solidity 0.7.6; -import { IResolver } from "../interfaces/misc/IResolver.sol"; +import { IResolver } from "../interfaces/ux/IResolver.sol"; import { ISuperfluid, ISuperTokenFactory, diff --git a/packages/ethereum-contracts/package.json b/packages/ethereum-contracts/package.json index 88b99110a5..b6796c9c0d 100644 --- a/packages/ethereum-contracts/package.json +++ b/packages/ethereum-contracts/package.json @@ -34,7 +34,7 @@ "generate-ethers-types": "typechain --target=ethers-v5 --out-dir=typechain './build/**/*.json'", "lint": "run-s lint:*", "lint:sol": "solhint -w 0 contracts/*.sol contracts/*/*.sol && echo '✔ Your .sol files look good.'", - "lint:js-eslint": "eslint . --max-warnings=0 --report-unused-disable-directives --fix && echo '✔ Your .js files look good.'", + "lint:js-eslint": "eslint . --max-warnings=0 --report-unused-disable-directives && echo '✔ Your .js files look good.'", "check-no-focused-tests": "grep -FR .only test || { echo 'No test is focused.';exit 0; } && { echo '✘ You have focused tests.'; exit 1; }", "pre-commit": "run-s pre-commit:*", "pre-commit:lint": "yarn lint", @@ -63,7 +63,7 @@ "solidity-coverage": "0.7.17", "truffle": "5.4.21", "truffle-flattener": "^1.5.0", - "truffle-plugin-verify": "^0.5.18", + "truffle-plugin-verify": "^0.5.19", "typechain": "^6.0.3" } } diff --git a/packages/ethereum-contracts/scripts/deploy-erc1820.js b/packages/ethereum-contracts/scripts/deploy-erc1820.js index 959f36583a..e7ab8e559f 100644 --- a/packages/ethereum-contracts/scripts/deploy-erc1820.js +++ b/packages/ethereum-contracts/scripts/deploy-erc1820.js @@ -4,7 +4,7 @@ const assert = require("assert").strict; const Transaction = require("ethereumjs-tx").Transaction; const ethUtils = require("ethereumjs-util"); const ERC1820Registry = require("../artifacts/ERC1820Registry.json"); -const {hasCode} = require("./libs/common"); +const {getScriptRunnerFactory: S, hasCode} = require("./libs/common"); /** * @dev Deploy ERC1820 to the network. @@ -13,60 +13,58 @@ const {hasCode} = require("./libs/common"); * * Usage: npx truffle exec scripts/deploy-erc1820.js */ -module.exports = async function (callback, {web3, from} = {}) { - try { - web3 = web3 || global.web3; +module.exports = eval(`(${S.toString()})({skipArgv: true})`)(async function ( + args, + options = {} +) { + web3 = web3 || options.web3; - const rawTransaction = { - nonce: 0, - gasPrice: 100000000000, - value: 0, - data: "0x" + ERC1820Registry.bin, - gasLimit: 800000, - v: 27, - r: "0x1820182018201820182018201820182018201820182018201820182018201820", - s: "0x1820182018201820182018201820182018201820182018201820182018201820", - }; - const tx = new Transaction(rawTransaction); - const res = { - sender: ethUtils.toChecksumAddress( - "0x" + tx.getSenderAddress().toString("hex") - ), - rawTx: "0x" + tx.serialize().toString("hex"), - contractAddr: ethUtils.toChecksumAddress( - "0x" + - ethUtils - .generateAddress( - tx.getSenderAddress(), - ethUtils.toBuffer(0) - ) - .toString("hex") - ), - }; - assert.equal("0xa990077c3205cbDf861e17Fa532eeB069cE9fF96", res.sender); - assert.equal( - "0x1820a4B7618BdE71Dce8cdc73aAB6C95905faD24", - res.contractAddr - ); + const rawTransaction = { + nonce: 0, + gasPrice: 100000000000, + value: 0, + data: "0x" + ERC1820Registry.bin, + gasLimit: 800000, + v: 27, + r: "0x1820182018201820182018201820182018201820182018201820182018201820", + s: "0x1820182018201820182018201820182018201820182018201820182018201820", + }; + const tx = new Transaction(rawTransaction); + const res = { + sender: ethUtils.toChecksumAddress( + "0x" + tx.getSenderAddress().toString("hex") + ), + rawTx: "0x" + tx.serialize().toString("hex"), + contractAddr: ethUtils.toChecksumAddress( + "0x" + + ethUtils + .generateAddress( + tx.getSenderAddress(), + ethUtils.toBuffer(0) + ) + .toString("hex") + ), + }; + assert.equal("0xa990077c3205cbDf861e17Fa532eeB069cE9fF96", res.sender); + assert.equal( + "0x1820a4B7618BdE71Dce8cdc73aAB6C95905faD24", + res.contractAddr + ); - console.log("Checking ERC1820 deployment at", res.contractAddr); - if (!(await hasCode(web3, res.contractAddr))) { - console.log("Deploying..."); - const account = from || (await web3.eth.getAccounts())[0]; - console.log("Step 1: send ETH"); - await web3.eth.sendTransaction({ - from: account, - to: res.sender, - value: "100000000000000000", //web3.utils.toWei(0.1) - }); - console.log("Step 2: send signed transaction"); - await web3.eth.sendSignedTransaction(res.rawTx); - console.log("Deployment done."); - } else { - console.log("ERC1820 is already deployed."); - } - callback(); - } catch (err) { - callback(err); + console.log("Checking ERC1820 deployment at", res.contractAddr); + if (!(await hasCode(web3, res.contractAddr))) { + console.log("Deploying..."); + const account = options.from || (await web3.eth.getAccounts())[0]; + console.log("Step 1: send ETH"); + await web3.eth.sendTransaction({ + from: account, + to: res.sender, + value: "100000000000000000", //web3.utils.toWei(0.1) + }); + console.log("Step 2: send signed transaction"); + await web3.eth.sendSignedTransaction(res.rawTx); + console.log("Deployment done."); + } else { + console.log("ERC1820 is already deployed."); } -}; +}); diff --git a/packages/ethereum-contracts/scripts/deploy-framework.js b/packages/ethereum-contracts/scripts/deploy-framework.js index 5ba46185ba..c88905098a 100644 --- a/packages/ethereum-contracts/scripts/deploy-framework.js +++ b/packages/ethereum-contracts/scripts/deploy-framework.js @@ -15,7 +15,7 @@ const { } = require("./libs/common"); let resetSuperfluidFramework; -let testResolver; +let resolver; async function deployAndRegisterContractIf( Contract, @@ -25,13 +25,13 @@ async function deployAndRegisterContractIf( ) { let contractDeployed; const contractName = Contract.contractName; - const contractAddress = await testResolver.get.call(resolverKey); + const contractAddress = await resolver.get.call(resolverKey); console.log(`${resolverKey} address`, contractAddress); if (resetSuperfluidFramework || (await cond(contractAddress))) { console.log(`${contractName} needs new deployment.`); contractDeployed = await deployFunc(); console.log(`${resolverKey} deployed to`, contractDeployed.address); - await web3tx(testResolver.set, `Resolver set ${resolverKey}`)( + await web3tx(resolver.set, `Resolver set ${resolverKey}`)( resolverKey, contractDeployed.address ); @@ -76,7 +76,7 @@ async function deployContractIfCodeChanged( * @param {boolean} options.isTruffle Whether the script is used within native truffle framework * @param {Web3} options.web3 Injected web3 instance * @param {Address} options.from Address to deploy contracts from - * @param {boolean} options.newTestResolver Force to create a new resolver (overridng env: NEW_TEST_RESOLVER) + * @param {boolean} options.newTestResolver Force to create a new resolver (overridng env: CREATE_NEW_RESOLVER) * @param {boolean} options.useMocks Use mock contracts instead (overridng env: USE_MOCKS) * @param {boolean} options.nonUpgradable Deploy contracts configured to be non-upgradable * (overridng env: NON_UPGRADABLE) @@ -90,7 +90,7 @@ async function deployContractIfCodeChanged( * Usage: npx truffle exec scripts/deploy-framework.js */ -module.exports = eval(`(${S.toString()})({ skipArgv: true })`)(async function ( +module.exports = eval(`(${S.toString()})({skipArgv: true})`)(async function ( args, options = {} ) { @@ -108,9 +108,9 @@ module.exports = eval(`(${S.toString()})({ skipArgv: true })`)(async function ( resetSuperfluidFramework || !!process.env.RESET_SUPERFLUID_FRAMEWORK; console.log("reset superfluid framework: ", resetSuperfluidFramework); - const networkType = await this.web3.eth.net.getNetworkType(); + const networkType = await web3.eth.net.getNetworkType(); const networkId = await web3.eth.net.getId(); - const chainId = await this.web3.eth.getChainId(); + const chainId = await web3.eth.getChainId(); console.log("network Type: ", networkType); console.log("network ID: ", networkId); console.log("chain ID: ", chainId); @@ -123,7 +123,7 @@ module.exports = eval(`(${S.toString()})({ skipArgv: true })`)(async function ( "org.superfluid-finance.agreements.InstantDistributionAgreement.v1" ); - newTestResolver = newTestResolver || !!process.env.NEW_TEST_RESOLVER; + newTestResolver = newTestResolver || !!process.env.CREATE_NEW_RESOLVER; useMocks = useMocks || !!process.env.USE_MOCKS; nonUpgradable = nonUpgradable || !!process.env.NON_UPGRADABLE; appWhiteListing = @@ -143,18 +143,15 @@ module.exports = eval(`(${S.toString()})({ skipArgv: true })`)(async function ( console.log("**** !ATTN! ENABLING APP WHITELISTING ****"); } - await deployERC1820( - (err) => { - if (err) throw err; - }, - {web3, ...(options.from ? {from: options.from} : {})} - ); + await deployERC1820((err) => { + if (err) throw err; + }, options); const contracts = [ "Ownable", "IMultiSigWallet", "SuperfluidGovernanceBase", - "TestResolver", + "Resolver", "SuperfluidLoader", "Superfluid", "SuperTokenFactory", @@ -178,7 +175,7 @@ module.exports = eval(`(${S.toString()})({ skipArgv: true })`)(async function ( Ownable, IMultiSigWallet, SuperfluidGovernanceBase, - TestResolver, + Resolver, SuperfluidLoader, Superfluid, SuperfluidMock, @@ -203,13 +200,13 @@ module.exports = eval(`(${S.toString()})({ skipArgv: true })`)(async function ( }); if (!newTestResolver && config.resolverAddress) { - testResolver = await TestResolver.at(config.resolverAddress); + resolver = await Resolver.at(config.resolverAddress); } else { - testResolver = await web3tx(TestResolver.new, "TestResolver.new")(); + resolver = await web3tx(Resolver.new, "Resolver.new")(); // make it available for the sdk for testing purpose - process.env.TEST_RESOLVER_ADDRESS = testResolver.address; + process.env.RESOLVER_ADDRESS = resolver.address; } - console.log("Resolver address", testResolver.address); + console.log("Resolver address", resolver.address); // deploy new governance contract let governanceInitializationRequired = false; @@ -236,7 +233,7 @@ module.exports = eval(`(${S.toString()})({ skipArgv: true })`)(async function ( return await web3tx( SuperfluidLoader.new, "SuperfluidLoader.new" - )(testResolver.address); + )(resolver.address); } ); @@ -533,12 +530,10 @@ module.exports = eval(`(${S.toString()})({ skipArgv: true })`)(async function ( console.log("======== Superfluid framework deployed ========"); - if (process.env.TEST_RESOLVER_ADDRESS) { + if (process.env.RESOLVER_ADDRESS) { console.log( "=============== TEST ENVIRONMENT RESOLVER ======================" ); - console.log( - `export TEST_RESOLVER_ADDRESS=${process.env.TEST_RESOLVER_ADDRESS}` - ); + console.log(`export RESOLVER_ADDRESS=${process.env.RESOLVER_ADDRESS}`); } }); diff --git a/packages/ethereum-contracts/scripts/deploy-super-token.js b/packages/ethereum-contracts/scripts/deploy-super-token.js index 4b8f408ead..d40e34e65f 100644 --- a/packages/ethereum-contracts/scripts/deploy-super-token.js +++ b/packages/ethereum-contracts/scripts/deploy-super-token.js @@ -50,7 +50,7 @@ module.exports = eval(`(${S.toString()})()`)(async function ( "Ownable", "IMultiSigWallet", "SuperfluidGovernanceBase", - "TestResolver", + "Resolver", "UUPSProxiable", "SETHProxy", ], @@ -59,7 +59,7 @@ module.exports = eval(`(${S.toString()})()`)(async function ( await sf.initialize(); const { - TestResolver, + Resolver, UUPSProxiable, ERC20WithTokenInfo, ISuperToken, @@ -185,8 +185,8 @@ module.exports = eval(`(${S.toString()})()`)(async function ( const superToken = await deploymentFn(); console.log("Wrapper created at", superToken.address); console.log("Resolver setting new address..."); - const testResolver = await TestResolver.at(sf.resolver.address); - await testResolver.set(superTokenKey, superToken.address); + const resolver = await Resolver.at(sf.resolver.address); + await resolver.set(superTokenKey, superToken.address); console.log("Resolver set done."); } diff --git a/packages/ethereum-contracts/scripts/deploy-test-environment.js b/packages/ethereum-contracts/scripts/deploy-test-environment.js index d3e55ccabe..e7b9508f7b 100644 --- a/packages/ethereum-contracts/scripts/deploy-test-environment.js +++ b/packages/ethereum-contracts/scripts/deploy-test-environment.js @@ -32,14 +32,17 @@ async function takeEvmSnapshot() { * where TOKENS_TO_DEPLOY is an optional list of token symbols, e.g. TEST1,TEST2. * For each such token, an underlying ERC20 and a wrapping Super Token will be deployed. */ -module.exports = eval(`(${S.toString()})()`)(async function (args) { +module.exports = eval(`(${S.toString()})()`)(async function ( + args, + options = {} +) { const errorHandler = (err) => { if (err) throw err; }; - const networkType = await this.web3.eth.net.getNetworkType(); + const networkType = await web3.eth.net.getNetworkType(); const networkId = await web3.eth.net.getId(); - const chainId = await this.web3.eth.getChainId(); + const chainId = await web3.eth.getChainId(); console.log("network Type: ", networkType); console.log("network ID: ", networkId); console.log("chain ID: ", chainId); @@ -55,33 +58,31 @@ module.exports = eval(`(${S.toString()})()`)(async function (args) { console.log("Tokens to be deployed", tokens); console.log("======== Deploying superfluid framework ========"); - await deployFramework(errorHandler, {web3}); + await deployFramework(errorHandler, options); console.log("==== Superfluid framework deployed ========"); for (let i = 0; i < tokens.length; ++i) { if (tokens[i] !== deploySuperToken) { console.log(`======== Deploying test token ${tokens[i]} ========`); - await deployTestToken(errorHandler, [":", tokens[i]], {web3}); + await deployTestToken(errorHandler, [":", tokens[i]], options); console.log(`======== Test token ${tokens[i]} deployed ========`); } console.log(`======== Creating super token for ${tokens[i]} ========`); - await deploySuperToken(errorHandler, [":", tokens[i]], {web3}); + await deploySuperToken(errorHandler, [":", tokens[i]], options); console.log(`======== Super token for ${tokens[i]} deployed ========`); } - if (process.env.TEST_RESOLVER_ADDRESS) { + if (process.env.RESOLVER_ADDRESS) { console.log( "=============== TEST ENVIRONMENT VARS ======================" ); - console.log( - `export TEST_RESOLVER_ADDRESS=${process.env.TEST_RESOLVER_ADDRESS}` - ); + console.log(`export RESOLVER_ADDRESS=${process.env.RESOLVER_ADDRESS}`); } if (process.env.TESTENV_SNAPSHOT_VARS) { let output = ""; - output += `TEST_RESOLVER_ADDRESS=${process.env.TEST_RESOLVER_ADDRESS}\n`; + output += `RESOLVER_ADDRESS=${process.env.RESOLVER_ADDRESS}\n`; output += `TESTENV_EVM_SNAPSHOT_ID=${await takeEvmSnapshot()}\n`; await util.promisify(fs.writeFile)( process.env.TESTENV_SNAPSHOT_VARS, diff --git a/packages/ethereum-contracts/scripts/deploy-test-token.js b/packages/ethereum-contracts/scripts/deploy-test-token.js index da103cd9ad..8de388cb1d 100644 --- a/packages/ethereum-contracts/scripts/deploy-test-token.js +++ b/packages/ethereum-contracts/scripts/deploy-test-token.js @@ -34,26 +34,26 @@ module.exports = eval(`(${S.toString()})()`)(async function ( resetToken = resetToken || !!process.env.RESET_TOKEN; console.log("reset token: ", resetToken); - const networkType = await this.web3.eth.net.getNetworkType(); + const networkType = await web3.eth.net.getNetworkType(); const networkId = await web3.eth.net.getId(); - const chainId = await this.web3.eth.getChainId(); + const chainId = await web3.eth.getChainId(); console.log("network Type: ", networkType); console.log("network ID: ", networkId); console.log("chain ID: ", chainId); const config = getConfig(chainId); - const {TestResolver, TestToken} = await SuperfluidSDK.loadContracts({ + const {Resolver, TestToken} = await SuperfluidSDK.loadContracts({ ...extractWeb3Options(options), - additionalContracts: ["TestResolver", "TestToken"], + additionalContracts: ["Resolver", "TestToken"], contractLoader: builtTruffleContractLoader, }); - const testResolver = await TestResolver.at(config.resolverAddress); - console.log("Resolver address", testResolver.address); + const resolver = await Resolver.at(config.resolverAddress); + console.log("Resolver address", resolver.address); // deploy test token and its super token const name = `tokens.${tokenSymbol}`; - let testTokenAddress = await testResolver.get(name); + let testTokenAddress = await resolver.get(name); if ( resetToken || testTokenAddress === "0x0000000000000000000000000000000000000000" @@ -64,7 +64,7 @@ module.exports = eval(`(${S.toString()})()`)(async function ( 18 ); testTokenAddress = testToken.address; - await web3tx(testResolver.set, `TestResolver set ${name}`)( + await web3tx(resolver.set, `Resolver set ${name}`)( name, testTokenAddress ); diff --git a/packages/ethereum-contracts/scripts/gov-upgrade-super-token-logic.js b/packages/ethereum-contracts/scripts/gov-upgrade-super-token-logic.js index 9e160f0722..7410c0974d 100644 --- a/packages/ethereum-contracts/scripts/gov-upgrade-super-token-logic.js +++ b/packages/ethereum-contracts/scripts/gov-upgrade-super-token-logic.js @@ -36,7 +36,7 @@ module.exports = eval(`(${S.toString()})()`)(async function ( "Ownable", "IMultiSigWallet", "SuperfluidGovernanceBase", - "TestResolver", + "Resolver", "UUPSProxiable", "SETHProxy", ], diff --git a/packages/ethereum-contracts/scripts/info-print-contract-addresses.js b/packages/ethereum-contracts/scripts/info-print-contract-addresses.js index 1cec372227..7c3a646cec 100644 --- a/packages/ethereum-contracts/scripts/info-print-contract-addresses.js +++ b/packages/ethereum-contracts/scripts/info-print-contract-addresses.js @@ -30,9 +30,9 @@ module.exports = eval(`(${S.toString()})()`)(async function ( } const outputFilename = args.shift(); - const networkType = await this.web3.eth.net.getNetworkType(); + const networkType = await web3.eth.net.getNetworkType(); const networkId = await web3.eth.net.getId(); - const chainId = await this.web3.eth.getChainId(); + const chainId = await web3.eth.getChainId(); console.log("network Type: ", networkType); console.log("network ID: ", networkId); console.log("chain ID: ", chainId); diff --git a/packages/ethereum-contracts/scripts/info-scan-deployments.js b/packages/ethereum-contracts/scripts/info-scan-deployments.js index 4e60e71b07..588d86b55d 100644 --- a/packages/ethereum-contracts/scripts/info-scan-deployments.js +++ b/packages/ethereum-contracts/scripts/info-scan-deployments.js @@ -3,9 +3,9 @@ const getConfig = require("./libs/getConfig"); const {getScriptRunnerFactory: S, getPastEvents} = require("./libs/common"); module.exports = eval(`(${S.toString()})()`)(async function () { - const networkType = await this.web3.eth.net.getNetworkType(); + const networkType = await web3.eth.net.getNetworkType(); const networkId = await web3.eth.net.getId(); - const chainId = await this.web3.eth.getChainId(); + const chainId = await web3.eth.getChainId(); console.log("network Type: ", networkType); console.log("network ID: ", networkId); console.log("chain ID: ", chainId); diff --git a/packages/ethereum-contracts/scripts/info-show-protocol.js b/packages/ethereum-contracts/scripts/info-show-protocol.js index 96f7892fc9..182b14f0ed 100644 --- a/packages/ethereum-contracts/scripts/info-show-protocol.js +++ b/packages/ethereum-contracts/scripts/info-show-protocol.js @@ -1,6 +1,7 @@ const _ = require("lodash"); const async = require("async"); const SuperfluidSDK = require("@superfluid-finance/js-sdk"); +const getConfig = require("./libs/getConfig"); const { getScriptRunnerFactory: S, ZERO_ADDRESS, @@ -260,6 +261,14 @@ module.exports = eval(`(${S.toString()})()`)(async function ( ) { let {protocolReleaseVersion} = options; + const networkType = await web3.eth.net.getNetworkType(); + const networkId = await web3.eth.net.getId(); + const chainId = await web3.eth.getChainId(); + console.log("network Type: ", networkType); + console.log("network ID: ", networkId); + console.log("chain ID: ", chainId); + const config = getConfig(chainId); + const sf = new SuperfluidSDK.Framework({ ...extractWeb3Options(options), version: protocolReleaseVersion, @@ -272,6 +281,7 @@ module.exports = eval(`(${S.toString()})()`)(async function ( "SuperToken", "SuperfluidGovernanceBase", ], + tokens: config.tokenList, loadSuperNativeToken: true, }); await sf.initialize(); diff --git a/packages/ethereum-contracts/scripts/libs/common.js b/packages/ethereum-contracts/scripts/libs/common.js index 19392f8eab..020bdc17c4 100644 --- a/packages/ethereum-contracts/scripts/libs/common.js +++ b/packages/ethereum-contracts/scripts/libs/common.js @@ -154,7 +154,7 @@ async function getCodeAddress(UUPSProxiable, proxyAddress) { */ async function setResolver(sf, key, value) { console.log(`Setting resolver ${key} -> ${value} ...`); - const resolver = await sf.contracts.TestResolver.at(sf.resolver.address); + const resolver = await sf.contracts.Resolver.at(sf.resolver.address); switch (process.env.RESOLVER_ADMIN_TYPE) { case "MULTISIG": { console.log("Resolver Admin type: MultiSig"); diff --git a/packages/ethereum-contracts/scripts/libs/truffleScriptRunnerFactory.js b/packages/ethereum-contracts/scripts/libs/truffleScriptRunnerFactory.js index c26d84284f..24ea1e2539 100644 --- a/packages/ethereum-contracts/scripts/libs/truffleScriptRunnerFactory.js +++ b/packages/ethereum-contracts/scripts/libs/truffleScriptRunnerFactory.js @@ -50,7 +50,10 @@ module.exports = function (ctxFn, logicFn, runnerOpts) { } // normalize web3 environment - console.log("use truffle native environment", options.isTruffle); + console.log( + "use truffle native environment (isTruffle)", + options.isTruffle + ); if (options.isTruffle) { if (options.web3) { throw Error( diff --git a/packages/ethereum-contracts/scripts/resolver-list-super-token.js b/packages/ethereum-contracts/scripts/resolver-list-super-token.js index ee51ac80ad..6cfada4042 100644 --- a/packages/ethereum-contracts/scripts/resolver-list-super-token.js +++ b/packages/ethereum-contracts/scripts/resolver-list-super-token.js @@ -41,7 +41,7 @@ module.exports = eval(`(${S.toString()})()`)(async function ( "IMultiSigWallet", "SuperfluidGovernanceBase", "SuperToken", - "TestResolver", + "Resolver", ], contractLoader: builtTruffleContractLoader, }); @@ -60,7 +60,7 @@ module.exports = eval(`(${S.toString()})()`)(async function ( const superTokenKey = `supertokens.${protocolReleaseVersion}.${tokenSymbol}`; console.log("Super token key", superTokenKey); - const resolver = await sf.contracts.TestResolver.at(sf.resolver.address); + const resolver = await sf.contracts.Resolver.at(sf.resolver.address); if ( (await resolver.get.call(superTokenKey)) !== ZERO_ADDRESS && !resetToken diff --git a/packages/ethereum-contracts/scripts/resolver-register-token.js b/packages/ethereum-contracts/scripts/resolver-register-token.js index 7561dd5051..a8215d406d 100644 --- a/packages/ethereum-contracts/scripts/resolver-register-token.js +++ b/packages/ethereum-contracts/scripts/resolver-register-token.js @@ -40,26 +40,23 @@ module.exports = eval(`(${S.toString()})()`)(async function ( console.log("reset token: ", resetToken); console.log("chain ID: ", chainId); - const {TestResolver} = await SuperfluidSDK.loadContracts({ + const {Resolver} = await SuperfluidSDK.loadContracts({ ...extractWeb3Options(options), - additionalContracts: ["TestResolver"], + additionalContracts: ["Resolver"], contractLoader: builtTruffleContractLoader, }); - const testResolver = await TestResolver.at(config.resolverAddress); - console.log("Resolver address", testResolver.address); + const resolver = await Resolver.at(config.resolverAddress); + console.log("Resolver address", resolver.address); const name = `tokens.${tokenName}`; - let testTokenAddress = await testResolver.get(name); + let testTokenAddress = await resolver.get(name); if ( resetToken || testTokenAddress === "0x0000000000000000000000000000000000000000" ) { - await web3tx(testResolver.set, `TestResolver set ${name}`)( - name, - tokenAddress - ); + await web3tx(resolver.set, `Resolver set ${name}`)(name, tokenAddress); } else { console.log("Token already set"); } diff --git a/packages/ethereum-contracts/scripts/resolver-reset-deployment.js b/packages/ethereum-contracts/scripts/resolver-reset-deployment.js index 9e5ae440f8..8ba8fe3f44 100644 --- a/packages/ethereum-contracts/scripts/resolver-reset-deployment.js +++ b/packages/ethereum-contracts/scripts/resolver-reset-deployment.js @@ -1,6 +1,6 @@ const {web3tx} = require("@decentral.ee/web3-helpers"); const {setWeb3Provider} = require("@decentral.ee/web3-helpers/src/config"); -const TestResolver = artifacts.require("TestResolver"); +const Resolver = artifacts.require("Resolver"); const getConfig = require("./libs/getConfig"); const {getScriptRunnerFactory: S, rl} = require("./libs/common"); @@ -22,9 +22,9 @@ module.exports = eval(`(${S.toString()})()`)(async function (args) { return; } - const networkType = await this.web3.eth.net.getNetworkType(); + const networkType = await web3.eth.net.getNetworkType(); const networkId = await web3.eth.net.getId(); - const chainId = await this.web3.eth.getChainId(); + const chainId = await web3.eth.getChainId(); console.log("network Type: ", networkType); console.log("network ID: ", networkId); console.log("chain ID: ", chainId); @@ -33,21 +33,21 @@ module.exports = eval(`(${S.toString()})()`)(async function (args) { // make sure that we are using the same web3 provider in the helpers setWeb3Provider(web3.currentProvider); - let testResolver; + let resolver; if (config.resolverAddress) { - testResolver = await TestResolver.at(config.resolverAddress); + resolver = await Resolver.at(config.resolverAddress); } else { - testResolver = await web3tx(TestResolver.new, "TestResolver.new")(); + resolver = await web3tx(Resolver.new, "Resolver.new")(); // make it available for the sdk for testing purpose - process.env.TEST_RESOLVER_ADDRESS = testResolver.address; + process.env.RESOLVER_ADDRESS = resolver.address; } - console.log("Resolver address", testResolver.address); + console.log("Resolver address", resolver.address); - await web3tx(testResolver.set, "Clear Superfluid deployment")( + await web3tx(resolver.set, "Clear Superfluid deployment")( `Superfluid.${version}`, "0x" + "0".repeat(40) ); - await web3tx(testResolver.set, "Clear TestGovernance deployment")( + await web3tx(resolver.set, "Clear TestGovernance deployment")( `TestGovernance.${version}`, "0x" + "0".repeat(40) ); diff --git a/packages/ethereum-contracts/tasks/etherscan-verify-framework.sh b/packages/ethereum-contracts/tasks/etherscan-verify-framework.sh index 4bea3f1684..842492f09c 100644 --- a/packages/ethereum-contracts/tasks/etherscan-verify-framework.sh +++ b/packages/ethereum-contracts/tasks/etherscan-verify-framework.sh @@ -11,7 +11,7 @@ npx truffle --network $TRUFFLE_NETWORK run verify Superfluid@${SUPERFLUID_HOST_L echo SUPERFLUID_GOVERNANCE case $TRUFFLE_NETWORK in - goerli | rinkeby | ropsten | kovan | mumbai | opkovan | arbrinkeby | avafuji ) + eth-goerli | eth-rinkeby | eth-ropsten | eth-kovan | polygon-mumbai | optimism-kovan | arbitrum-rinkeby | avalanche-fuji ) IS_TESTNET=1 esac diff --git a/packages/ethereum-contracts/tasks/supports-etherscan.sh b/packages/ethereum-contracts/tasks/supports-etherscan.sh index d7d2dfb12e..747690165a 100755 --- a/packages/ethereum-contracts/tasks/supports-etherscan.sh +++ b/packages/ethereum-contracts/tasks/supports-etherscan.sh @@ -1,7 +1,12 @@ TRUFFLE_NETWORK=$1 case $TRUFFLE_NETWORK in - goerli | rinkeby | ropsten | kovan | mumbai | matic | opmainnet | opkovan | arbone | arbrinkeby | avalanche | avafuji | bsc ) + eth-goerli | eth-rinkeby | eth-ropsten | eth-kovan | \ + polygon-mumbai | polygon-matic | \ + optimism-mainnet | optimism-kovan | \ + arbitrum-one | arbitrum-rinkeby | \ + avalanche-mainnet | avalanche-fuji | \ + bsc ) echo "$TRUFFLE_NETWORK is supported by Etherscan or alike" exit 0; ;; diff --git a/packages/ethereum-contracts/test/TestEnvironment.js b/packages/ethereum-contracts/test/TestEnvironment.js index 5aba662468..77f2134e1a 100644 --- a/packages/ethereum-contracts/test/TestEnvironment.js +++ b/packages/ethereum-contracts/test/TestEnvironment.js @@ -106,7 +106,7 @@ module.exports = class TestEnvironment { let evmSnapshotId = await this._takeEvmSnapshot(); this._evmSnapshots.push({ id: evmSnapshotId, - resolverAddress: process.env.TEST_RESOLVER_ADDRESS, + resolverAddress: process.env.RESOLVER_ADDRESS, }); console.debug( "pushEvmSnapshot", @@ -122,17 +122,15 @@ module.exports = class TestEnvironment { async useLastEvmSnapshot() { let oldEvmSnapshotId; - ({ - id: oldEvmSnapshotId, - resolverAddress: process.env.TEST_RESOLVER_ADDRESS, - } = this._evmSnapshots.pop()); + ({id: oldEvmSnapshotId, resolverAddress: process.env.RESOLVER_ADDRESS} = + this._evmSnapshots.pop()); await this._revertToEvmSnapShot(oldEvmSnapshotId); // move the time to now await traveler.advanceBlockAndSetTime(parseInt(Date.now() / 1000)); const newEvmSnapshotId = await this._takeEvmSnapshot(); this._evmSnapshots.push({ id: newEvmSnapshotId, - resolverAddress: process.env.TEST_RESOLVER_ADDRESS, + resolverAddress: process.env.RESOLVER_ADDRESS, }); console.debug( "useLastEvmSnapshot", @@ -179,7 +177,7 @@ module.exports = class TestEnvironment { }); await this._evmSnapshots.push({ id: process.env.TESTENV_EVM_SNAPSHOT_ID, - resolverAddress: process.env.TEST_RESOLVER_ADDRESS, + resolverAddress: process.env.RESOLVER_ADDRESS, }); await this.useLastEvmSnapshot(); await this.mintTestTokensAndApprove("TEST", { diff --git a/packages/ethereum-contracts/test/contracts/misc.test.js b/packages/ethereum-contracts/test/contracts/misc.test.js index 4fa68764e9..ad30787c4f 100644 --- a/packages/ethereum-contracts/test/contracts/misc.test.js +++ b/packages/ethereum-contracts/test/contracts/misc.test.js @@ -74,11 +74,11 @@ describe("Miscellaneous for test coverages", function () { }); }); - describe("TestResolver", () => { - const TestResolver = artifacts.require("TestResolver"); + describe("Resolver", () => { + const Resolver = artifacts.require("Resolver"); - it("TestResolver.set should only be called by admin", async () => { - const resolver = await TestResolver.new({from: admin}); + it("Resolver.set should only be called by admin", async () => { + const resolver = await Resolver.new({from: admin}); await expectRevert( resolver.set("alice", alice, {from: alice}), "Caller is not an admin" diff --git a/packages/ethereum-contracts/test/scripts/deployment.test.js b/packages/ethereum-contracts/test/scripts/deployment.test.js index 243ada3f64..44c472757b 100644 --- a/packages/ethereum-contracts/test/scripts/deployment.test.js +++ b/packages/ethereum-contracts/test/scripts/deployment.test.js @@ -6,7 +6,7 @@ const deployFramework = require("../../scripts/deploy-framework"); const deployTestToken = require("../../scripts/deploy-test-token"); const deploySuperToken = require("../../scripts/deploy-super-token"); const deployTestEnvironment = require("../../scripts/deploy-test-environment"); -const TestResolver = artifacts.require("TestResolver"); +const Resolver = artifacts.require("Resolver"); const UUPSProxiable = artifacts.require("UUPSProxiable"); const Superfluid = artifacts.require("Superfluid"); const ISuperTokenFactory = artifacts.require("ISuperTokenFactory"); @@ -27,27 +27,25 @@ contract("Embeded deployment scripts", () => { // cleanup environment variables that might affect the test delete process.env.RESET_TOKEN; delete process.env.RELEASE_VERSION; - delete process.env.TEST_RESOLVER_ADDRESS; + delete process.env.RESOLVER_ADDRESS; }); afterEach(() => { // cleanup environment after each test - delete process.env.TEST_RESOLVER_ADDRESS; + delete process.env.RESOLVER_ADDRESS; }); async function getSuperfluidAddresses() { const version = "test"; const superfluidName = `Superfluid.${version}`; const govName = `TestGovernance.${version}`; - const testResolver = await TestResolver.at( - process.env.TEST_RESOLVER_ADDRESS - ); - const superfluidLoader = await testResolver.get("SuperfluidLoader-v1"); + const resolver = await Resolver.at(process.env.RESOLVER_ADDRESS); + const superfluidLoader = await resolver.get("SuperfluidLoader-v1"); const superfluid = await Superfluid.at( - await testResolver.get(superfluidName) + await resolver.get(superfluidName) ); const superfluidCode = await superfluid.getCodeAddress.call(); - const gov = await testResolver.get(govName); + const gov = await resolver.get(govName); const superTokenFactory = await superfluid.getSuperTokenFactory.call(); const superTokenFactoryLogic = await superfluid.getSuperTokenFactoryLogic.call(); @@ -190,11 +188,8 @@ contract("Embeded deployment scripts", () => { it("nonUpgradable deployment", async () => { // use the same resolver for the entire test - const testResolver = await web3tx( - TestResolver.new, - "TestResolver.new" - )(); - process.env.TEST_RESOLVER_ADDRESS = testResolver.address; + const resolver = await web3tx(Resolver.new, "Resolver.new")(); + process.env.RESOLVER_ADDRESS = resolver.address; await deployFramework(errorHandler, { ...deploymentOptions, @@ -213,11 +208,8 @@ contract("Embeded deployment scripts", () => { it("upgrades", async () => { // use the same resolver for the entire test - const testResolver = await web3tx( - TestResolver.new, - "TestResolver.new" - )(); - process.env.TEST_RESOLVER_ADDRESS = testResolver.address; + const resolver = await web3tx(Resolver.new, "Resolver.new")(); + process.env.RESOLVER_ADDRESS = resolver.address; console.log("==== First deployment"); await deployFramework(errorHandler, deploymentOptions); @@ -343,27 +335,21 @@ contract("Embeded deployment scripts", () => { }); it("scripts/deploy-test-token.js", async () => { - const testResolver = await web3tx( - TestResolver.new, - "TestResolver.new" - )(); - process.env.TEST_RESOLVER_ADDRESS = testResolver.address; + const resolver = await web3tx(Resolver.new, "Resolver.new")(); + process.env.RESOLVER_ADDRESS = resolver.address; await deployFramework(errorHandler, { ...deploymentOptions, resetSuperfluidFramework: true, }); // first deployment - assert.equal( - await testResolver.get("tokens.TEST7262"), - ZERO_ADDRESS - ); + assert.equal(await resolver.get("tokens.TEST7262"), ZERO_ADDRESS); await deployTestToken( errorHandler, [":", "TEST7262"], deploymentOptions ); - const address1 = await testResolver.get("tokens.TEST7262"); + const address1 = await resolver.get("tokens.TEST7262"); assert.notEqual(address1, ZERO_ADDRESS); // second deployment @@ -372,7 +358,7 @@ contract("Embeded deployment scripts", () => { [":", "TEST7262"], deploymentOptions ); - const address2 = await testResolver.get("tokens.TEST7262"); + const address2 = await resolver.get("tokens.TEST7262"); assert.equal(address2, address1); // new deployment after framework reset @@ -385,16 +371,13 @@ contract("Embeded deployment scripts", () => { [":", "TEST7262"], deploymentOptions ); - const address3 = await testResolver.get("tokens.TEST7262"); + const address3 = await resolver.get("tokens.TEST7262"); assert.equal(address3, address2); }); it("scripts/deploy-super-token.js", async () => { - const testResolver = await web3tx( - TestResolver.new, - "TestResolver.new" - )(); - process.env.TEST_RESOLVER_ADDRESS = testResolver.address; + const resolver = await web3tx(Resolver.new, "Resolver.new")(); + process.env.RESOLVER_ADDRESS = resolver.address; await deployFramework(errorHandler, deploymentOptions); @@ -407,7 +390,7 @@ contract("Embeded deployment scripts", () => { // first deployment assert.equal( - await testResolver.get("supertokens.test.TEST7262x"), + await resolver.get("supertokens.test.TEST7262x"), ZERO_ADDRESS ); await deploySuperToken( @@ -416,9 +399,7 @@ contract("Embeded deployment scripts", () => { deploymentOptions ); const s1 = await getSuperfluidAddresses(); - const address1 = await testResolver.get( - "supertokens.test.TEST7262x" - ); + const address1 = await resolver.get("supertokens.test.TEST7262x"); assert.notEqual(address1, ZERO_ADDRESS); assert.equal( s1.superTokenLogic, @@ -432,9 +413,7 @@ contract("Embeded deployment scripts", () => { deploymentOptions ); const s2 = await getSuperfluidAddresses(); - const address2 = await testResolver.get( - "supertokens.test.TEST7262x" - ); + const address2 = await resolver.get("supertokens.test.TEST7262x"); assert.equal(address1, address2); assert.equal( s2.superTokenLogic, @@ -452,9 +431,7 @@ contract("Embeded deployment scripts", () => { deploymentOptions ); const s3 = await getSuperfluidAddresses(); - const address3 = await testResolver.get( - "supertokens.test.TEST7262x" - ); + const address3 = await resolver.get("supertokens.test.TEST7262x"); assert.equal(address1, address2); assert.equal( s3.superTokenLogic, @@ -472,9 +449,7 @@ contract("Embeded deployment scripts", () => { deploymentOptions ); const s4 = await getSuperfluidAddresses(); - const address4 = await testResolver.get( - "supertokens.test.TEST7262x" - ); + const address4 = await resolver.get("supertokens.test.TEST7262x"); assert.notEqual(address4, address3); assert.equal( s4.superTokenLogic, diff --git a/packages/ethereum-contracts/test/scripts/deployment.test.sh b/packages/ethereum-contracts/test/scripts/deployment.test.sh index 46f14b78fe..603b172b29 100755 --- a/packages/ethereum-contracts/test/scripts/deployment.test.sh +++ b/packages/ethereum-contracts/test/scripts/deployment.test.sh @@ -23,8 +23,8 @@ sleep 5 # # unset potential interfering environment varibles -unset TEST_RESOLVER_ADDRESS -unset NEW_TEST_RESOLVER +unset RESOLVER_ADDRESS +unset CREATE_NEW_RESOLVER unset RESET_SUPERFLUID_FRAMEWORK unset RELEASE_VERSION unset USE_MOCKS @@ -44,7 +44,7 @@ cat $TESTENV_SNAPSHOT_VARS # Use the newly created resolver source $TESTENV_SNAPSHOT_VARS -export TEST_RESOLVER_ADDRESS=$TEST_RESOLVER_ADDRESS +export RESOLVER_ADDRESS=$RESOLVER_ADDRESS # Test all info scripts npx truffle exec scripts/info-scan-deployments.js diff --git a/packages/ethereum-contracts/test/testenv-ctl.sh b/packages/ethereum-contracts/test/testenv-ctl.sh index b067e126f0..40f35a7eb7 100755 --- a/packages/ethereum-contracts/test/testenv-ctl.sh +++ b/packages/ethereum-contracts/test/testenv-ctl.sh @@ -1,6 +1,7 @@ #!/bin/bash -set -ex +# make sure that if any step fails, the script fails +set -xe TESTENV_MNEMONIC="candy maple cake sugar pudding cream honey rich smooth crumble sweet treat" diff --git a/packages/ethereum-contracts/truffle-config.js b/packages/ethereum-contracts/truffle-config.js index f99233a5e7..e4c97d890e 100644 --- a/packages/ethereum-contracts/truffle-config.js +++ b/packages/ethereum-contracts/truffle-config.js @@ -27,31 +27,66 @@ try { ); } +const ALIASES = { + "eth-mainnet": ["mainnet"], + "eth-ropsten": ["ropsten"], + "eth-rinkeby": ["rinkeby"], + "eth-kovan": ["kovan"], + "eth-goerli": ["goerli"], + + "xdai-mainnet": ["xdai"], + + "polygon-mainnet": ["matic"], + "polygon-mumbai": ["mumbai"], + + "optimism-mainnet": ["opmainnet"], + "optimism-kovan": ["opkovan"], + + "arbitrum-one": ["arbone"], + "arbitrum-rinkeby": ["arbrinkeby"], + + "avalanche-C": ["avalanche"], + "avalanche-fuji": ["avafuji"], + + "bsc-mainnet": ["bsc"], + + "celo-mainnet": ["celo"], +}; + const DEFAULT_NETWORK_TIMEOUT = 60000; -// -// This is a hack to resolve that HDWallet doesn't work with openethereum (xdai & kovan) -// -// Related issues: -// - https://github.com/trufflesuite/truffle/issues/3182 -// - https://github.com/openethereum/parity-ethereum/issues/11824 -// - https://github.com/MetaMask/web3-provider-engine/issues/311 -function createProviderForOpenEthereum(url) { - let provider; - const Web3WsProvider = require("web3-providers-ws"); - if (url.startsWith("ws:") || url.startsWith("wss:")) { - provider = new Web3WsProvider(url); - // apply the skipCache hack - const origSend = provider.__proto__.send; - provider.__proto__.send = function (payload, callback) { - delete payload.skipCache; - origSend.call(provider, payload, callback); - }; - } else { - // let hdwallet provider handle the url directly - provider = url; - } - return provider; +/** + * Get the environment value for the network, supporting network aliases + * + * E.g. for MNEMONIC key, these environment keys are tried (high to low priority): + * ETH_MAINNET_MNEMONIC + * MAINNET_MNEMONIC + * DEFAULT_MNEMONIC, + */ +function getEnvValue(networkName, key) { + const keysToTry = [networkName, ...ALIASES[networkName]] + .map((i) => i.replace(/-/g, "_").toUpperCase() + "_" + key) + .concat("DEFAULT_" + key); + const values = keysToTry.map((i) => process.env[i]).filter((i) => !!i); + return values[0]; +} + +/** + * Create default network configurations + */ +function createNetworkDefaultConfiguration(networkName, chainId) { + return { + provider: () => + new HDWalletProvider({ + mnemonic: getEnvValue(networkName, "MNEMONIC"), + url: getEnvValue(networkName, "PROVIDER_URL"), + addressIndex: 0, + numberOfAddresses: 10, + shareNonce: true, + chainId, // optional + }), + gasPrice: +getEnvValue(networkName, "GAS_PRICE"), + }; } const E = (module.exports = { @@ -81,83 +116,40 @@ const E = (module.exports = { // ETHEREUM: https://ethereum.org/ // "eth-mainnet": { - provider: () => - new HDWalletProvider( - process.env.MAINNET_MNEMONIC, - process.env.MAINNET_PROVIDER_URL, - 0, //address_index - 10, // num_addresses - true // shareNonce - ), + ...createNetworkDefaultConfiguration("eth-mainnet"), network_id: 1, // mainnet's id - gasPrice: +process.env.MAINNET_GAS_PRICE, timeoutBlocks: 50, // # of blocks before a deployment times out (minimum/default: 50) skipDryRun: false, // Skip dry run before migrations? (default: false for public nets ) networkCheckTimeout: DEFAULT_NETWORK_TIMEOUT, }, "eth-rinkeby": { - provider: () => - new HDWalletProvider( - process.env.RINKEBY_MNEMONIC, - process.env.RINKEBY_PROVIDER_URL, - 0, //address_index - 10, // num_addresses - true // shareNonce - ), + ...createNetworkDefaultConfiguration("eth-rinkeby"), network_id: 4, - gasPrice: +process.env.RINKEBY_GAS_PRICE, timeoutBlocks: 50, // # of blocks before a deployment times out (minimum/default: 50) skipDryRun: false, // Skip dry run before migrations? (default: false for public nets ) networkCheckTimeout: DEFAULT_NETWORK_TIMEOUT, }, "eth-ropsten": { - provider: () => - new HDWalletProvider( - process.env.ROPSTEN_MNEMONIC, - process.env.ROPSTEN_PROVIDER_URL, - 0, //address_index - 10, // num_addresses - true // shareNonce - ), + ...createNetworkDefaultConfiguration("eth-ropsten"), network_id: 3, - gasPrice: +process.env.ROPSTEN_GAS_PRICE, timeoutBlocks: 50, // # of blocks before a deployment times out (minimum/default: 50) skipDryRun: false, // Skip dry run before migrations? (default: false for public nets ) networkCheckTimeout: DEFAULT_NETWORK_TIMEOUT, }, "eth-goerli": { - provider: () => - new HDWalletProvider( - process.env.GOERLI_MNEMONIC, - process.env.GOERLI_PROVIDER_URL, - 0, //address_index - 10, // num_addresses - true // shareNonce - ), + ...createNetworkDefaultConfiguration("eth-goerli"), network_id: 5, - gasPrice: +process.env.GOERLI_GAS_PRICE, timeoutBlocks: 50, // # of blocks before a deployment times out (minimum/default: 50) skipDryRun: false, // Skip dry run before migrations? (default: false for public nets ) networkCheckTimeout: DEFAULT_NETWORK_TIMEOUT, }, "eth-kovan": { - provider: () => { - return new HDWalletProvider( - process.env.KOVAN_MNEMONIC, - createProviderForOpenEthereum( - process.env.KOVAN_PROVIDER_URL - ), - 0, //address_index - 10, // num_addresses - true // shareNonce - ); - }, + ...createNetworkDefaultConfiguration("eth-kovan"), network_id: 42, - gasPrice: +process.env.KOVAN_GAS_PRICE, timeoutBlocks: 50, // # of blocks before a deployment times out (minimum/default: 50) skipDryRun: false, // Skip dry run before migrations? (default: false for public nets ) networkCheckTimeout: DEFAULT_NETWORK_TIMEOUT, @@ -167,33 +159,16 @@ const E = (module.exports = { // Polygon: https://docs.polygon.technology/docs/develop/network-details/network/ // "polygon-mainnet": { - provider: () => { - return new HDWalletProvider( - process.env.MATIC_MNEMONIC, - process.env.MATIC_PROVIDER_URL, - 0, //address_index - 10, // num_addresses - true // shareNonce - ); - }, + ...createNetworkDefaultConfiguration("polygon-mainnet"), network_id: 137, - gasPrice: +process.env.MATIC_GAS_PRICE, timeoutBlocks: 50, // # of blocks before a deployment times out (minimum/default: 50) skipDryRun: false, // Skip dry run before migrations? (default: false for public nets ) networkCheckTimeout: DEFAULT_NETWORK_TIMEOUT, }, "polygon-mumbai": { - provider: () => - new HDWalletProvider( - process.env.MUMBAI_MNEMONIC, - process.env.MUMBAI_PROVIDER_URL, - 0, //address_index - 10, // num_addresses - true // shareNonce - ), + ...createNetworkDefaultConfiguration("polygon-mumbai"), network_id: 80001, - gasPrice: +process.env.MUMBAI_GAS_PRICE, timeoutBlocks: 50, // # of blocks before a deployment times out (minimum/default: 50) skipDryRun: false, // Skip dry run before migrations? (default: false for public nets ) networkCheckTimeout: DEFAULT_NETWORK_TIMEOUT, @@ -203,19 +178,8 @@ const E = (module.exports = { // xDAI: https://www.xdaichain.com/for-users/wallets/metamask/metamask-setup // "xdai-mainnet": { - provider: () => { - return new HDWalletProvider( - process.env.XDAI_MNEMONIC, - createProviderForOpenEthereum( - process.env.XDAI_PROVIDER_URL - ), - 0, //address_index - 10, // num_addresses - true // shareNonce - ); - }, + ...createNetworkDefaultConfiguration("xdai-mainnet"), network_id: 100, - gasPrice: +process.env.XDAI_GAS_PRICE, timeoutBlocks: 50, // # of blocks before a deployment times out (minimum/default: 50) skipDryRun: false, // Skip dry run before migrations? (default: false for public nets ) networkCheckTimeout: DEFAULT_NETWORK_TIMEOUT, @@ -225,34 +189,18 @@ const E = (module.exports = { // Optimistic Ethereum: https://community.optimism.io/docs/ // "optimism-mainnet": { - provider: function () { - return new HDWalletProvider( - process.env.OPMAINNET_MNEMONIC, - process.env.OPMAINNET_PROVIDER_URL, - 0, //address_index - 10, // num_addresses - true // shareNonce - ); - }, + ...createNetworkDefaultConfiguration("optimism-mainnet"), network_id: 10, - gasPrice: +process.env.OPMAINNET_GAS_PRICE, timeoutBlocks: 50, // # of blocks before a deployment times out (minimum/default: 50) skipDryRun: false, // Skip dry run before migrations? (default: false for public nets ) networkCheckTimeout: DEFAULT_NETWORK_TIMEOUT, }, "optimism-kovan": { - provider: function () { - return new HDWalletProvider( - process.env.OPKOVAN_MNEMONIC, - process.env.OPKOVAN_PROVIDER_URL, - 0, //address_index - 10, // num_addresses - true // shareNonce - ); - }, + ...createNetworkDefaultConfiguration("optimism-kovan"), network_id: 69, - gasPrice: +process.env.OPKOVAN_GAS_PRICE, + timeoutBlocks: 50, // # of blocks before a deployment times out (minimum/default: 50) + skipDryRun: false, // Skip dry run before migrations? (default: false for public nets ) networkCheckTimeout: DEFAULT_NETWORK_TIMEOUT, }, @@ -260,32 +208,20 @@ const E = (module.exports = { // Arbitrum: https://developer.offchainlabs.com // "arbitrum-one": { - provider: function () { - return new HDWalletProvider( - process.env.ARBONE_MNEMONIC, - process.env.ARBONE_PROVIDER_URL, - 0, //address_index - 10, // num_addresses - true // shareNonce - ); - }, + ...createNetworkDefaultConfiguration("arbitrum-one"), network_id: 42161, - gasPrice: +process.env.ARBONE_GAS_PRICE, + gas: 250e6, // arbgas is different and estimation fails for expensive txs + timeoutBlocks: 50, // # of blocks before a deployment times out (minimum/default: 50) + skipDryRun: false, // Skip dry run before migrations? (default: false for public nets ) networkCheckTimeout: DEFAULT_NETWORK_TIMEOUT, }, "arbitrum-rinkeby": { - provider: function () { - return new HDWalletProvider( - process.env.ARBRINKEBY_MNEMONIC, - process.env.ARBRINKEBY_PROVIDER_URL, - 0, //address_index - 10, // num_addresses - true // shareNonce - ); - }, + ...createNetworkDefaultConfiguration("arbitrum-rinkeby"), network_id: 421611, - gasPrice: +process.env.ARBRINKEBY_GAS_PRICE, + gas: 250e6, // arbgas is different and estimation fails for expensive txs + timeoutBlocks: 50, // # of blocks before a deployment times out (minimum/default: 50) + skipDryRun: false, // Skip dry run before migrations? (default: false for public nets ) networkCheckTimeout: DEFAULT_NETWORK_TIMEOUT, }, @@ -293,36 +229,22 @@ const E = (module.exports = { // Avalanche C-Chain: https://docs.avax.network/learn/platform-overview#contract-chain-c-chain // "avalanche-C": { - provider: () => - new HDWalletProvider( - process.env.AVALANCHE_MNEMONIC, - process.env.AVALANCHE_PROVIDER_URL, - 0, //address_index - 10, // num_addresses - true, // shareNonce - "m/44'/60'/0'/0/", // needed bcs we want to add chainId - 43114 // chainId - ), + ...createNetworkDefaultConfiguration( + "avalanche-C", + 43114 /* chainId */ + ), network_id: 1, - gasPrice: +process.env.AVALANCHE_GAS_PRICE, timeoutBlocks: 50, // # of blocks before a deployment times out (minimum/default: 50) skipDryRun: false, // Skip dry run before migrations? (default: false for public nets ) networkCheckTimeout: DEFAULT_NETWORK_TIMEOUT, }, "avalanche-fuji": { - provider: () => - new HDWalletProvider( - process.env.AVAFUJI_MNEMONIC, - process.env.AVAFUJI_PROVIDER_URL, - 0, //address_index - 10, // num_addresses - true, // shareNonce - "m/44'/60'/0'/0/", // needed bcs we want to add chainId - 43113 // chainId - ), + ...createNetworkDefaultConfiguration( + "avalanche-fuji", + 43113 /* chainId */ + ), network_id: 1, - gasPrice: +process.env.AVAFUJI_GAS_PRICE, timeoutBlocks: 50, // # of blocks before a deployment times out (minimum/default: 50) skipDryRun: false, // Skip dry run before migrations? (default: false for public nets ) networkCheckTimeout: DEFAULT_NETWORK_TIMEOUT, @@ -332,16 +254,8 @@ const E = (module.exports = { // Binance Smart Chain: https://docs.binance.org/smart-chain/developer/rpc.html // "bsc-mainnet": { - provider: () => - new HDWalletProvider( - process.env.BSC_MNEMONIC, - process.env.BSC_PROVIDER_URL, - 0, //address_index - 10, // num_addresses - true // shareNonce - ), + ...createNetworkDefaultConfiguration("bsc-mainnet"), network_id: 56, - gasPrice: +process.env.BSC_GAS_PRICE, timeoutBlocks: 50, // # of blocks before a deployment times out (minimum/default: 50) skipDryRun: false, // Skip dry run before migrations? (default: false for public nets ) networkCheckTimeout: DEFAULT_NETWORK_TIMEOUT, @@ -351,17 +265,10 @@ const E = (module.exports = { // Celo: https://docs.celo.org/getting-started/choosing-a-network // "celo-mainnet": { - provider: function () { - return new HDWalletProvider( - process.env.CELO_MNEMONIC, - process.env.CELO_PROVIDER_URL, - 0, //address_index - 10, // num_addresses - true // shareNonce - ); - }, + ...createNetworkDefaultConfiguration("celo-mainnet"), network_id: 42220, - gasPrice: +process.env.CELO_GAS_PRICE, + timeoutBlocks: 50, // # of blocks before a deployment times out (minimum/default: 50) + skipDryRun: false, // Skip dry run before migrations? (default: false for public nets ) networkCheckTimeout: DEFAULT_NETWORK_TIMEOUT, }, @@ -456,25 +363,9 @@ const E = (module.exports = { }, }); -// // Creating network aliases -// - -// The OGs -E.networks.ropsten = E.networks["eth-ropsten"]; -E.networks.rinkeby = E.networks["eth-rinkeby"]; -E.networks.kovan = E.networks["eth-kovan"]; -E.networks.goerli = E.networks["eth-goerli"]; -E.networks.xdai = E.networks["xdai-mainnet"]; -E.networks.matic = E.networks["polygon-mainnet"]; -E.networks.mumbai = E.networks["polygon-mumbai"]; - -// Other aliases -E.networks.opmainnet = E.networks["optimism-mainnet"]; -E.networks.opkovan = E.networks["optimism-kovan"]; -E.networks.arbone = E.networks["arbitrum-one"]; -E.networks.arbrinkeby = E.networks["arbitrum-rinkeby"]; -E.networks.avalanche = E.networks["avalanche-C"]; -E.networks.avafuji = E.networks["avalanche-fuji"]; -E.networks.bsc = E.networks["bsc-mainnet"]; -E.networks.celo = E.networks["celo-mainnet"]; +Object.keys(ALIASES).forEach((networkName) => { + ALIASES[networkName].forEach((alias) => { + E.networks[alias] = E.networks[networkName]; + }); +}); diff --git a/packages/js-sdk/package.json b/packages/js-sdk/package.json index c5c002611e..142dd362af 100644 --- a/packages/js-sdk/package.json +++ b/packages/js-sdk/package.json @@ -29,7 +29,7 @@ "watch": "webpack --watch", "stats": "webpack --profile --json > stats.json && webpack-bundle-analyzer ./stats.json", "lint": "run-s lint:*", - "lint:js-eslint": "eslint . --max-warnings=0 --report-unused-disable-directives --fix && echo '✔ Your .js files look good.'", + "lint:js-eslint": "eslint . --max-warnings=0 --report-unused-disable-directives && echo '✔ Your .js files look good.'", "check-no-focused-tests": "grep -FR .only test || { echo '✔ No test is focused.';exit 0; } && { echo '✘ You have focused tests.'; exit 1; }", "pre-commit": "run-s pre-commit:*", "pre-commit:lint": "yarn lint", diff --git a/packages/js-sdk/src/getConfig.js b/packages/js-sdk/src/getConfig.js index 6c84305c8a..28d0874eac 100644 --- a/packages/js-sdk/src/getConfig.js +++ b/packages/js-sdk/src/getConfig.js @@ -127,9 +127,15 @@ Superfluid_getConfig = module.exports = function getConfig(chainId, version) { nativeTokenSymbol: "ETH", }, 69: { - // op kovan + // op kovan testnet nativeTokenSymbol: "ETH", - resolverAddress: "0xE5ed6b5bFcDBcae6BA32082adaB05A6F21e7B923", + resolverAddress: "0x218B65780615Ff134f9Ad810CB98839534D3C0D6", + versions: { + v1: { + subgraphQueryEndpoint: + "https://api.thegraph.com/subgraphs/name/superfluid-finance/protocol-dev-optimism-kovan", + }, + }, }, // @@ -140,9 +146,15 @@ Superfluid_getConfig = module.exports = function getConfig(chainId, version) { nativeTokenSymbol: "ETH", }, 421611: { - // arbitrum testnet + // arbitrum rinkeby testnet nativeTokenSymbol: "ETH", - resolverAddress: "0x79D426CD219eDCFEB2dCbcf7ea0F8B3642C56F47", + resolverAddress: "0xa2C0C70A1E922f5f060ec20EE3aF002C163b4567", + versions: { + v1: { + subgraphQueryEndpoint: + "https://api.thegraph.com/subgraphs/name/superfluid-finance/protocol-dev-arbitrum-rinkeby", + }, + }, }, // @@ -155,7 +167,13 @@ Superfluid_getConfig = module.exports = function getConfig(chainId, version) { 43113: { // avalanche c-chain fuji testnet nativeTokenSymbol: "AVAX", - resolverAddress: "0xb76d7c14caD40Cc434655Ce0a9B5b49220C362cA", + resolverAddress: "0x141920741bC45b962B59c833cd849bA617F7ef38", + versions: { + v1: { + subgraphQueryEndpoint: + "https://api.thegraph.com/subgraphs/name/superfluid-finance/protocol-dev-avalanche-fuji", + }, + }, }, // @@ -179,8 +197,8 @@ Superfluid_getConfig = module.exports = function getConfig(chainId, version) { delete configs.versions; } // overriding environment variables - if (global && global.process && global.process.env.TEST_RESOLVER_ADDRESS) { - configs.resolverAddress = global.process.env.TEST_RESOLVER_ADDRESS; + if (global && global.process && global.process.env.RESOLVER_ADDRESS) { + configs.resolverAddress = global.process.env.RESOLVER_ADDRESS; } return configs; diff --git a/packages/js-sdk/test/Framework.subgraph.test.js b/packages/js-sdk/test/Framework.subgraph.test.js index bb40ab5a08..f22476eb7f 100644 --- a/packages/js-sdk/test/Framework.subgraph.test.js +++ b/packages/js-sdk/test/Framework.subgraph.test.js @@ -10,7 +10,7 @@ describe("Framework subgraph (goerli) support", function () { before(async function () { // make sure no test resolver passed to the testsuite - delete process.env.TEST_RESOLVER_ADDRESS; + delete process.env.RESOLVER_ADDRESS; try { require("dotenv").config({ diff --git a/packages/js-sdk/test/getConfig.test.js b/packages/js-sdk/test/getConfig.test.js index af3ff64ec4..0e2975d501 100644 --- a/packages/js-sdk/test/getConfig.test.js +++ b/packages/js-sdk/test/getConfig.test.js @@ -3,7 +3,7 @@ const SuperfluidSDK = require("../src"); describe("getConfig", () => { before(() => { - delete process.env.TEST_RESOLVER_ADDRESS; + delete process.env.RESOLVER_ADDRESS; }); it("goerli v1", async () => { @@ -31,10 +31,10 @@ describe("getConfig", () => { it("defaultConfig overriding RESOLVER_ADDRESS", async () => { // test environment - process.env.TEST_RESOLVER_ADDRESS = "0x42"; + process.env.RESOLVER_ADDRESS = "0x42"; const testConfig = SuperfluidSDK.getConfig(5555); assert.equal(testConfig.resolverAddress, "0x42"); assert.isUndefined(testConfig.versions); - delete process.env.TEST_RESOLVER_ADDRESS; + delete process.env.RESOLVER_ADDRESS; }); }); diff --git a/packages/sdk-core/package.json b/packages/sdk-core/package.json index a9f1241f3b..863ad735a8 100644 --- a/packages/sdk-core/package.json +++ b/packages/sdk-core/package.json @@ -23,7 +23,7 @@ "doc:html": "typedoc --out build/docs --entryPoints ./src/index.ts", "lint": "run-s lint:*", "lint:prettier": "prettier \"src/**/*.ts\" --write", - "lint:lint": "eslint src --ext .ts --fix", + "lint:lint": "eslint src --ext .ts", "pre-commit": "run-s pre-commit:*", "pre-commit:lint": "echo no pre-commit currently", "generate-abi-files": "rm -rf src/abi && mkdir src/abi && tasks/build-abi-json.sh", diff --git a/packages/sdk-core/test/0_framework.test.ts b/packages/sdk-core/test/0_framework.test.ts index 9084a63c59..d9e3d6201b 100644 --- a/packages/sdk-core/test/0_framework.test.ts +++ b/packages/sdk-core/test/0_framework.test.ts @@ -24,7 +24,7 @@ describe("Framework Tests", () => { before(async () => { const { frameworkClass, Deployer, SuperToken } = await setup({ - amount: "10000000000000", + amount: "10000000000", subgraphEndpoint: ROPSTEN_SUBGRAPH_ENDPOINT, }); framework = frameworkClass; diff --git a/packages/sdk-core/test/2_ida.test.ts b/packages/sdk-core/test/2_ida.test.ts index b6876879eb..3fd0dfd0e0 100644 --- a/packages/sdk-core/test/2_ida.test.ts +++ b/packages/sdk-core/test/2_ida.test.ts @@ -221,11 +221,12 @@ describe("IDA V1 Tests", () => { }); it("Should be able to update index value", async () => { + console.log("balance", await (await superToken.balanceOf(deployer.address)).toString()); await expect( framework.idaV1 .updateIndexValue({ indexId: "0", - indexValue: ethers.utils.parseUnits("0.002").toString(), + indexValue: ethers.utils.parseUnits("0.000000001").toString(), superToken: superToken.address, }) .exec(deployer) @@ -236,9 +237,9 @@ describe("IDA V1 Tests", () => { deployer.address, 0, "500", - ethers.utils.parseUnits("0.002").toString(), + ethers.utils.parseUnits("0.000000001").toString(), "0", - ethers.utils.parseUnits("0.002").toString(), + "2000000000000000", "0x" ); }); @@ -286,7 +287,7 @@ describe("IDA V1 Tests", () => { framework.idaV1 .updateIndexValue({ indexId: "0", - indexValue: ethers.utils.parseUnits("0.003").toString(), + indexValue: ethers.utils.parseUnits("0.000000003").toString(), superToken: superToken.address, }) .exec(deployer) @@ -296,9 +297,9 @@ describe("IDA V1 Tests", () => { superToken.address, deployer.address, 0, - ethers.utils.parseUnits("0.002").toString(), - ethers.utils.parseUnits("0.003").toString(), - ethers.utils.parseUnits("0.002").toString(), + ethers.utils.parseUnits("0.000000001").toString(), + ethers.utils.parseUnits("0.000000003").toString(), + "2000000000000000", "0", "0x" ); @@ -321,7 +322,7 @@ describe("IDA V1 Tests", () => { alpha.address, deployer.address, 0, - ethers.utils.parseUnits("1000000000000") + "2000000000000000000000000" ); await expect( @@ -340,7 +341,7 @@ describe("IDA V1 Tests", () => { deployer.address, 0, bravo.address, - ethers.utils.parseUnits("1000000000000") + "2000000000000000000000000" ); }); diff --git a/packages/sdk-core/test/3_supertoken.test.ts b/packages/sdk-core/test/3_supertoken.test.ts index d2953d7eb5..ee903d7e36 100644 --- a/packages/sdk-core/test/3_supertoken.test.ts +++ b/packages/sdk-core/test/3_supertoken.test.ts @@ -13,7 +13,7 @@ import { setup } from "../scripts/setup"; import { ROPSTEN_SUBGRAPH_ENDPOINT } from "./0_framework.test"; import { ethers } from "ethers"; -const INITIAL_AMOUNT_PER_USER = "10000000000000"; +const INITIAL_AMOUNT_PER_USER = "10000000000"; describe("SuperToken Tests", () => { let framework: Framework; @@ -561,7 +561,7 @@ describe("SuperToken Tests", () => { daix .updateIndexValue({ indexId: "0", - indexValue: ethers.utils.parseUnits("0.002").toString(), + indexValue: ethers.utils.parseUnits("0.000000002").toString(), }) .exec(alpha) ) @@ -571,9 +571,9 @@ describe("SuperToken Tests", () => { alpha.address, 0, "500", - ethers.utils.parseUnits("0.002").toString(), + ethers.utils.parseUnits("0.000000002").toString(), "0", - ethers.utils.parseUnits("0.002").toString(), + "2000000000000000", "0x" ); }); @@ -619,7 +619,7 @@ describe("SuperToken Tests", () => { daix .updateIndexValue({ indexId: "0", - indexValue: ethers.utils.parseUnits("0.003").toString(), + indexValue: ethers.utils.parseUnits("0.000000003").toString(), }) .exec(alpha) ) @@ -628,9 +628,9 @@ describe("SuperToken Tests", () => { superToken.address, alpha.address, 0, - ethers.utils.parseUnits("0.002").toString(), - ethers.utils.parseUnits("0.003").toString(), - ethers.utils.parseUnits("0.002").toString(), + ethers.utils.parseUnits("0.000000002").toString(), + ethers.utils.parseUnits("0.000000003").toString(), + "2000000000000000", "0", "0x" ); @@ -653,7 +653,7 @@ describe("SuperToken Tests", () => { deployer.address, alpha.address, 0, - ethers.utils.parseUnits("1000000000000") + "1000000000000000000000000" ); await expect( @@ -671,7 +671,7 @@ describe("SuperToken Tests", () => { alpha.address, 0, bravo.address, - ethers.utils.parseUnits("1000000000000") + "1000000000000000000000000" ); }); diff --git a/packages/subgraph/README.md b/packages/subgraph/README.md index 8494a16d1e..d12f90bca9 100644 --- a/packages/subgraph/README.md +++ b/packages/subgraph/README.md @@ -391,6 +391,13 @@ If the subgraph has not been created yet, you must create it first using the das - Merge `origin/dev` to the LTS branch. - Create a new release in github. +## Developer Notes + +When adding new networks, we must do the following: +- Add the new network to `networks.json` and add a new file to `/config` with the same name as the network e.g. adding network `avalanche-fuji` to the array in `networks.json` and then adding `avalanche-fuji.json` to `/config`. The name of the network here is dicated by and must match how we name the network for our subgraph endpoint, e.g. `protocol-dev-avalanche-fuji` +- The name of the network in the `/config` json file should match the official naming of the network name from the [subgraph docs](https://thegraph.com/docs/developer/create-subgraph-hosted#supported-networks) +- Therefore, the `network` we are comparing in the `addresses.template.test` file should also match the official naming. + # Contributing Contributions, suggestions, and issues are welcome. At the moment, there are no strict guidelines to follow. diff --git a/packages/subgraph/config/arbitrum-one.json b/packages/subgraph/config/arbitrum-one.json new file mode 100644 index 0000000000..0d1b98246c --- /dev/null +++ b/packages/subgraph/config/arbitrum-one.json @@ -0,0 +1,10 @@ +{ + "network": "arbitrum-one", + "hostStartBlock": 0, + "hostAddress": "", + "cfaAddress": "", + "idaAddress": "", + "superTokenFactoryAddress": "", + "superfluidGovernanceAddress": "", + "resolverV1Address": "" +} \ No newline at end of file diff --git a/packages/subgraph/config/arbitrum-rinkeby.json b/packages/subgraph/config/arbitrum-rinkeby.json new file mode 100644 index 0000000000..a180b46b3d --- /dev/null +++ b/packages/subgraph/config/arbitrum-rinkeby.json @@ -0,0 +1,10 @@ +{ + "network": "arbitrum-rinkeby", + "hostStartBlock": 7340308, + "hostAddress": "0xE01F8743677Da897F4e7De9073b57Bf034FC2433", + "cfaAddress": "0xcA0569223e56B479FaC6d554FA0D3867A4384657", + "idaAddress": "0x038405394F2B791F71c2C68d36dc91C568DfAB05", + "superTokenFactoryAddress": "0xc11eC618c1d559705E853741e366663Fe9302362", + "superfluidGovernanceAddress": "0xdE62033F32B1D0b5911290105f39E006cffC7a9e", + "resolverV1Address": "0xa2C0C70A1E922f5f060ec20EE3aF002C163b4567" +} \ No newline at end of file diff --git a/packages/subgraph/config/avalanche-fuji.json b/packages/subgraph/config/avalanche-fuji.json new file mode 100644 index 0000000000..bd3b74b117 --- /dev/null +++ b/packages/subgraph/config/avalanche-fuji.json @@ -0,0 +1,10 @@ +{ + "network": "fuji", + "hostStartBlock": 3233244, + "hostAddress": "0xf04F2C525819691ed9ABD3D2B7109E1633795e68", + "cfaAddress": "0xED74d30B8034152b0638CB03cc5c3c906dd1c482", + "idaAddress": "0x997d745884F54a93E6662b055c5e6c09F688718b", + "superTokenFactoryAddress": "0xA25dbEa94C5824892006b30a629213E7Bf238624", + "superfluidGovernanceAddress": "0x9e6C7Fb511090E9A0dE0Bf6A0E5358dd90EC0432", + "resolverV1Address": "0x141920741bC45b962B59c833cd849bA617F7ef38" +} \ No newline at end of file diff --git a/packages/subgraph/config/avalanche-main.json b/packages/subgraph/config/avalanche-main.json new file mode 100644 index 0000000000..5445c59e22 --- /dev/null +++ b/packages/subgraph/config/avalanche-main.json @@ -0,0 +1,10 @@ +{ + "network": "avalanche", + "hostStartBlock": 0, + "hostAddress": "", + "cfaAddress": "", + "idaAddress": "", + "superTokenFactoryAddress": "", + "superfluidGovernanceAddress": "", + "resolverV1Address": "" +} \ No newline at end of file diff --git a/packages/subgraph/config/optimism-kovan.json b/packages/subgraph/config/optimism-kovan.json new file mode 100644 index 0000000000..bd7ad85326 --- /dev/null +++ b/packages/subgraph/config/optimism-kovan.json @@ -0,0 +1,10 @@ +{ + "network": "optimism-kovan", + "hostStartBlock": 318221, + "hostAddress": "0x74b57883f8ce9F2BD330286E884CfD8BB24AC4ED", + "cfaAddress": "0x523481a8a5455efB1F301C6e00B5525Eb12a51da", + "idaAddress": "0x98E5E5d915Bf79ceeF02c72D1bf8f5b26f0bcBaA", + "superTokenFactoryAddress": "0xB5f0501908ca8A99fD31bEFCAc1cA458F3588671", + "superfluidGovernanceAddress": "0x6813edE4E78ecb830d380d0F7F684c12aAc95F02", + "resolverV1Address": "0x218B65780615Ff134f9Ad810CB98839534D3C0D6" +} \ No newline at end of file diff --git a/packages/subgraph/config/optimism-main.json b/packages/subgraph/config/optimism-main.json new file mode 100644 index 0000000000..4f52c24df9 --- /dev/null +++ b/packages/subgraph/config/optimism-main.json @@ -0,0 +1,10 @@ +{ + "network": "optimism", + "hostStartBlock": 0, + "hostAddress": "", + "cfaAddress": "", + "idaAddress": "", + "superTokenFactoryAddress": "", + "superfluidGovernanceAddress": "", + "resolverV1Address": "" +} \ No newline at end of file diff --git a/packages/subgraph/networks.json b/packages/subgraph/networks.json index 64cf23f479..703ffd948c 100644 --- a/packages/subgraph/networks.json +++ b/packages/subgraph/networks.json @@ -1,4 +1,7 @@ [ + "arbitrum-rinkeby", + "avalanche-fuji", + "optimism-kovan", "goerli", "kovan", "matic", @@ -6,4 +9,4 @@ "rinkeby", "ropsten", "xdai" -] +] \ No newline at end of file diff --git a/packages/subgraph/package.json b/packages/subgraph/package.json index 7a81277e71..314e6e529d 100644 --- a/packages/subgraph/package.json +++ b/packages/subgraph/package.json @@ -35,7 +35,7 @@ "deploy:to-v1": "yarn deploy-to v1", "deploy:to-feature": "yarn deploy-to feature", "lint": "run-s lint:*", - "lint:js-eslint": "eslint . --max-warnings=0 --report-unused-disable-directives --fix && echo '✔ Your .js files look good.'", + "lint:js-eslint": "eslint . --max-warnings=0 --report-unused-disable-directives && echo '✔ Your .js files look good.'", "pre-commit": "run-s pre-commit:*", "pre-commit:lint": "yarn lint", "generate-sf-meta": "./tasks/getSFMeta.sh", diff --git a/packages/subgraph/scripts/getAbi.js b/packages/subgraph/scripts/getAbi.js index 8eb8d49b03..b05c609e69 100755 --- a/packages/subgraph/scripts/getAbi.js +++ b/packages/subgraph/scripts/getAbi.js @@ -7,7 +7,7 @@ const contracts = [ "ISuperTokenFactory", "ISuperToken", "ISuperfluid", - "TestResolver", + "Resolver", "IInstantDistributionAgreementV1", "SuperfluidGovernanceBase", "TestToken", diff --git a/packages/subgraph/src/addresses.template.ts b/packages/subgraph/src/addresses.template.ts index 2de0c992f8..4cd610d79f 100644 --- a/packages/subgraph/src/addresses.template.ts +++ b/packages/subgraph/src/addresses.template.ts @@ -31,6 +31,24 @@ export function getHostAddress(): Address { if (network == "xdai") { address = "0x2dFe937cD98Ab92e59cF3139138f18c823a4efE7"; } + if (network == "fuji") { + address = "0xb1Cb9e86Fe1E6B45F44A3D90ed08E71403D6fA36"; + } + if (network == "arbitrum-rinkeby") { + address = "0xE01F8743677Da897F4e7De9073b57Bf034FC2433"; + } + if (network == "optimism-kovan") { + address = "0x74b57883f8ce9F2BD330286E884CfD8BB24AC4ED"; + } + if (network == "avalanche") { + address = ""; + } + if (network == "arbitrum-one") { + address = ""; + } + if (network == "optimism") { + address = ""; + } return Address.fromString(address); } @@ -61,5 +79,23 @@ export function getResolverAddress(): Address { if (network == "xdai") { address = "0xD2009765189164b495c110D61e4D301729079911"; } + if (network == "fuji") { + address = "0xb76d7c14caD40Cc434655Ce0a9B5b49220C362cA"; + } + if (network == "arbitrum-rinkeby") { + address = "0xa2C0C70A1E922f5f060ec20EE3aF002C163b4567"; + } + if (network == "optimism-kovan") { + address = "0x218B65780615Ff134f9Ad810CB98839534D3C0D6"; + } + if (network == "avalanche") { + address = ""; + } + if (network == "arbitrum-one") { + address = ""; + } + if (network == "optimism") { + address = ""; + } return Address.fromString(address); } diff --git a/packages/subgraph/src/mappings/resolver.ts b/packages/subgraph/src/mappings/resolver.ts index e4128abcda..d4a5dd233a 100644 --- a/packages/subgraph/src/mappings/resolver.ts +++ b/packages/subgraph/src/mappings/resolver.ts @@ -2,7 +2,7 @@ import { RoleAdminChanged, RoleGranted, RoleRevoked, -} from "../../generated/ResolverV1/TestResolver"; +} from "../../generated/ResolverV1/Resolver"; import { RoleAdminChangedEvent, RoleGrantedEvent, diff --git a/packages/subgraph/src/utils.ts b/packages/subgraph/src/utils.ts index 098470b51f..06d5635366 100644 --- a/packages/subgraph/src/utils.ts +++ b/packages/subgraph/src/utils.ts @@ -1,6 +1,6 @@ import { BigInt, Bytes, ethereum, Address, log } from "@graphprotocol/graph-ts"; import { ISuperToken as SuperToken } from "../generated/templates/SuperToken/ISuperToken"; -import { TestResolver } from "../generated/ResolverV1/TestResolver"; +import { Resolver } from "../generated/ResolverV1/Resolver"; import { StreamRevision, IndexSubscription, @@ -60,7 +60,7 @@ export function getIsListedToken( tokenAddress: Address, resolverAddress: Address ): Token { - let resolverContract = TestResolver.bind(resolverAddress); + let resolverContract = Resolver.bind(resolverAddress); let version = resolverAddress.toHex() == "0xe7f1725e7734ce288f8367e1bb143e90bb3f0512" ? "test" diff --git a/packages/subgraph/subgraph.template.yaml b/packages/subgraph/subgraph.template.yaml index a59da125ce..ddb1d6f17c 100644 --- a/packages/subgraph/subgraph.template.yaml +++ b/packages/subgraph/subgraph.template.yaml @@ -23,8 +23,8 @@ dataSources: - Token - TokenStatistic abis: - - name: TestResolver - file: ./abis/TestResolver.json + - name: Resolver + file: ./abis/Resolver.json - name: ISuperTokenFactory file: ./abis/ISuperTokenFactory.json - name: ISuperToken @@ -100,8 +100,8 @@ dataSources: abis: - name: IConstantFlowAgreementV1 file: ./abis/IConstantFlowAgreementV1.json - - name: TestResolver - file: ./abis/TestResolver.json + - name: Resolver + file: ./abis/Resolver.json - name: ISuperToken file: ./abis/ISuperToken.json - name: ISuperfluid @@ -141,8 +141,8 @@ dataSources: abis: - name: IInstantDistributionAgreementV1 file: ./abis/IInstantDistributionAgreementV1.json - - name: TestResolver - file: ./abis/TestResolver.json + - name: Resolver + file: ./abis/Resolver.json - name: ISuperToken file: ./abis/ISuperToken.json - name: ISuperfluid @@ -202,7 +202,7 @@ dataSources: network: {{ network }} source: address: "{{ resolverV1Address }}" - abi: TestResolver + abi: Resolver startBlock: {{ hostStartBlock }} mapping: kind: ethereum/events @@ -214,8 +214,8 @@ dataSources: - RoleGrantedEvent - RoleRevokedEvent abis: - - name: TestResolver - file: ./abis/TestResolver.json + - name: Resolver + file: ./abis/Resolver.json eventHandlers: - event: RoleAdminChanged(indexed bytes32,indexed bytes32,indexed bytes32) handler: handleRoleAdminChanged @@ -247,8 +247,8 @@ templates: - TokenStatistic - TransferEvent abis: - - name: TestResolver - file: ./abis/TestResolver.json + - name: Resolver + file: ./abis/Resolver.json - name: ISuperToken file: ./abis/ISuperToken.json - name: ISuperfluid diff --git a/packages/subgraph/test-subgraph.template.yaml b/packages/subgraph/test-subgraph.template.yaml index a59da125ce..ddb1d6f17c 100644 --- a/packages/subgraph/test-subgraph.template.yaml +++ b/packages/subgraph/test-subgraph.template.yaml @@ -23,8 +23,8 @@ dataSources: - Token - TokenStatistic abis: - - name: TestResolver - file: ./abis/TestResolver.json + - name: Resolver + file: ./abis/Resolver.json - name: ISuperTokenFactory file: ./abis/ISuperTokenFactory.json - name: ISuperToken @@ -100,8 +100,8 @@ dataSources: abis: - name: IConstantFlowAgreementV1 file: ./abis/IConstantFlowAgreementV1.json - - name: TestResolver - file: ./abis/TestResolver.json + - name: Resolver + file: ./abis/Resolver.json - name: ISuperToken file: ./abis/ISuperToken.json - name: ISuperfluid @@ -141,8 +141,8 @@ dataSources: abis: - name: IInstantDistributionAgreementV1 file: ./abis/IInstantDistributionAgreementV1.json - - name: TestResolver - file: ./abis/TestResolver.json + - name: Resolver + file: ./abis/Resolver.json - name: ISuperToken file: ./abis/ISuperToken.json - name: ISuperfluid @@ -202,7 +202,7 @@ dataSources: network: {{ network }} source: address: "{{ resolverV1Address }}" - abi: TestResolver + abi: Resolver startBlock: {{ hostStartBlock }} mapping: kind: ethereum/events @@ -214,8 +214,8 @@ dataSources: - RoleGrantedEvent - RoleRevokedEvent abis: - - name: TestResolver - file: ./abis/TestResolver.json + - name: Resolver + file: ./abis/Resolver.json eventHandlers: - event: RoleAdminChanged(indexed bytes32,indexed bytes32,indexed bytes32) handler: handleRoleAdminChanged @@ -247,8 +247,8 @@ templates: - TokenStatistic - TransferEvent abis: - - name: TestResolver - file: ./abis/TestResolver.json + - name: Resolver + file: ./abis/Resolver.json - name: ISuperToken file: ./abis/ISuperToken.json - name: ISuperfluid diff --git a/packages/subgraph/test/helpers/helpers.ts b/packages/subgraph/test/helpers/helpers.ts index 991bd839f3..4aa0ce2f2b 100644 --- a/packages/subgraph/test/helpers/helpers.ts +++ b/packages/subgraph/test/helpers/helpers.ts @@ -9,7 +9,7 @@ import { FlowActionType } from "./constants"; import IResolverABI from "../../abis/IResolver.json"; import { ConstantFlowAgreementV1 } from "../../typechain/ConstantFlowAgreementV1"; import { ConstantFlowAgreementV1Helper } from "@superfluid-finance/js-sdk/src/ConstantFlowAgreementV1Helper"; -import { TestResolver } from "../../typechain"; +import { Resolver } from "../../typechain"; // the resolver address should be consistent as long as you use the // first account retrieved by hardhat's ethers.getSigners(): @@ -71,7 +71,7 @@ export const beforeSetup = async (tokenAmount: number) => { const resolver = (await ethers.getContractAt( IResolverABI, RESOLVER_ADDRESS - )) as TestResolver; + )) as Resolver; // NOTE: although we already set this in initialization, we need to reset it here to ensure // we wait for the indexer to catch up before the tests start diff --git a/yarn.lock b/yarn.lock index 2c63c259e0..d1518aecdd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -21806,10 +21806,10 @@ truffle-flattener@^1.5.0: mkdirp "^1.0.4" tsort "0.0.1" -truffle-plugin-verify@^0.5.18: - version "0.5.18" - resolved "https://registry.yarnpkg.com/truffle-plugin-verify/-/truffle-plugin-verify-0.5.18.tgz#55bbafae034ee5c52ad1f72fddaca2be1eb8a5fe" - integrity sha512-yqozlnupddTyabpUETwPZkaNSZWOtfeijy7qaDYlWGOmxfWdI3TYjRsKJVqdLf22BPpE1VK4081RLXXfNbISGg== +truffle-plugin-verify@^0.5.19: + version "0.5.19" + resolved "https://registry.yarnpkg.com/truffle-plugin-verify/-/truffle-plugin-verify-0.5.19.tgz#c96895c513d7f8d954b6917b4fb79885b200738c" + integrity sha512-Gh9sQc36ZuyiLxBIAswt123CZIJ+/Ip82P9X0WGITgfRAOzPLMIDoH3FnyRzuxJ5YHgS8S9xufUL1ldDl5I7Sg== dependencies: axios "^0.21.1" cli-logger "^0.5.40"