From 5b39d9d032afba8da06d5064ffddfcf8e25aa5c0 Mon Sep 17 00:00:00 2001 From: yomarion Date: Fri, 8 Jul 2022 12:18:04 +0200 Subject: [PATCH 01/85] deploy: xdeployed and verified payments on goerli --- packages/smart-contracts/README.md | 52 +++++++++++-------- packages/smart-contracts/hardhat.config.ts | 6 +++ .../scripts-create2/compute-one-address.ts | 13 +++-- .../scripts-create2/deploy-one.ts | 5 +- .../smart-contracts/scripts-create2/utils.ts | 1 + .../scripts-create2/verify-one.ts | 1 + .../artifacts/Erc20SwapConversion/index.ts | 4 ++ 7 files changed, 55 insertions(+), 27 deletions(-) diff --git a/packages/smart-contracts/README.md b/packages/smart-contracts/README.md index bf07ad54b1..8c63a44330 100644 --- a/packages/smart-contracts/README.md +++ b/packages/smart-contracts/README.md @@ -102,28 +102,6 @@ And in another terminal, deploy the smart contracts locally with: yarn run deploy ``` -### Live deployment (Payment only) - -The goal of this script is to let all our payment contracts be deployed with the same sequence on every chain. - -The script also verify deployed contracts. - -**Be sure that artifacts are up-to-date with most recent deployments** - -Environment variables needed: `ETHERSCAN_API_KEY`, `ADMIN_WALLET_ADDRESS`, `DEPLOYMENT_PRIVATE_KEY` - -```bash -# First check what will be done -yarn hardhat deploy-live-payments --network matic --dry-run - -# Run -yarn hardhat deploy-live-payments --network matic - -# To test locally -yarn hardhat deploy-live-payments --network private --force -yarn hardhat deploy-live-payments --network private --force --dry-run -``` - ### Deployment through request deployer The request deployer enables multichain deployment of several smart contracts at predefined address. It is based on https://github.com/pcaversaccio/xdeployer @@ -159,6 +137,14 @@ Environment variables needed: `ADMIN_PRIVATE_KEY` You will need the request deployer to be deployed. Then run: +To deploy all contracts to one network, use: + +```bash +NETWORK= yarn hardhat deploy-contracts-through-deployer +``` + +If you want to deploy all contracts on all networks: + ```bash yarn hardhat deploy-contracts-through-deployer ``` @@ -181,6 +167,28 @@ yarn hardhat verify-contract-from-deployer --network The associated `EXPLORER_API_KEY` is mandatory. +### Live deployment (Payment only - deprecated method) + +The goal of this script is to let all our payment contracts be deployed with the same sequence on every chain. + +The script also verify deployed contracts. + +**Be sure that artifacts are up-to-date with most recent deployments** + +Environment variables needed: `ETHERSCAN_API_KEY`, `ADMIN_WALLET_ADDRESS`, `DEPLOYMENT_PRIVATE_KEY` + +```bash +# First check what will be done +yarn hardhat deploy-live-payments --network matic --dry-run + +# Run +yarn hardhat deploy-live-payments --network matic + +# To test locally +yarn hardhat deploy-live-payments --network private --force +yarn hardhat deploy-live-payments --network private --force --dry-run +``` + ### Tests After a local deployment: diff --git a/packages/smart-contracts/hardhat.config.ts b/packages/smart-contracts/hardhat.config.ts index c9369f911f..514bb2b494 100644 --- a/packages/smart-contracts/hardhat.config.ts +++ b/packages/smart-contracts/hardhat.config.ts @@ -69,6 +69,11 @@ export default { chainId: 4, accounts, }, + goerli: { + url: process.env.WEB3_PROVIDER_URL || 'https://goerli.infura.io/v3/YOUR_API_KEY', + chainId: 5, + accounts, + }, matic: { url: url('matic'), chainId: 137, @@ -124,6 +129,7 @@ export default { apiKey: { mainnet: process.env.ETHERSCAN_API_KEY, rinkeby: process.env.ETHERSCAN_API_KEY, + goerli: process.env.ETHERSCAN_API_KEY, // binance smart chain bsc: process.env.BSCSCAN_API_KEY, bscTestnet: process.env.BSCSCAN_API_KEY, diff --git a/packages/smart-contracts/scripts-create2/compute-one-address.ts b/packages/smart-contracts/scripts-create2/compute-one-address.ts index 17ebcc5c84..00afbd9289 100644 --- a/packages/smart-contracts/scripts-create2/compute-one-address.ts +++ b/packages/smart-contracts/scripts-create2/compute-one-address.ts @@ -52,11 +52,18 @@ export const computeCreate2DeploymentAddressesFromList = async ( switch (contract) { case 'EthereumProxy': case 'EthereumFeeProxy': + case 'ERC20FeeProxy': case 'Erc20ConversionProxy': + case 'ERC20EscrowToPay': + case 'BatchPayments': case 'ERC20SwapToConversion': { - const constructorArgs = getConstructorArgs(contract); - address = await computeCreate2DeploymentAddress({ contract, constructorArgs }, hre); - console.log(`${contract.padEnd(36, ' ')}${address}`); + try { + const constructorArgs = getConstructorArgs(contract, hre.network.name); + address = await computeCreate2DeploymentAddress({ contract, constructorArgs }, hre); + console.log(`${contract.padEnd(36, ' ')}${address}`); + } catch (e) { + console.warn(`ERROR computing address of ${contract}: ${e}`); + } break; } // Other cases to add when necessary diff --git a/packages/smart-contracts/scripts-create2/deploy-one.ts b/packages/smart-contracts/scripts-create2/deploy-one.ts index 3cf7c0c73a..535319e7e1 100644 --- a/packages/smart-contracts/scripts-create2/deploy-one.ts +++ b/packages/smart-contracts/scripts-create2/deploy-one.ts @@ -18,7 +18,7 @@ export const deployOneWithCreate2 = async ( const deploymentResult = await xdeploy(deploymentParams, hre); for (let i = 0; i < hre.config.xdeploy.networks.length; i++) { if (deploymentResult[i].deployed) { - console.log(`${deploymentParams.contract} succesffuly deployed:`); + console.log(`${deploymentParams.contract} successfully deployed:`); console.log(` On network: ${hre.config.xdeploy.networks[i]}`); console.log(` At address: ${deploymentResult[i].address}`); console.log(` At block: ${deploymentResult[i].receipt.blockNumber}`); @@ -53,6 +53,7 @@ export const deployWithCreate2FromList = async ( switch (contract) { case 'EthereumProxy': case 'EthereumFeeProxy': + case 'ERC20FeeProxy': case 'Erc20ConversionProxy': { const constructorArgs = getConstructorArgs(contract); await deployOneWithCreate2({ contract, constructorArgs }, hre); @@ -79,7 +80,7 @@ export const deployWithCreate2FromList = async ( } // Other cases to add when necessary default: - throw new Error(`The contrat ${contract} is not to be deployed using the CREATE2 scheme`); + throw new Error(`The contract ${contract} is not to be deployed using the CREATE2 scheme`); } } }; diff --git a/packages/smart-contracts/scripts-create2/utils.ts b/packages/smart-contracts/scripts-create2/utils.ts index 5f0fe3d9d8..04ef3377cb 100644 --- a/packages/smart-contracts/scripts-create2/utils.ts +++ b/packages/smart-contracts/scripts-create2/utils.ts @@ -9,6 +9,7 @@ import * as artifacts from '../src/lib'; export const create2ContractDeploymentList = [ 'EthereumProxy', 'EthereumFeeProxy', + 'ERC20FeeProxy', 'Erc20ConversionProxy', 'ERC20SwapToConversion', 'ERC20EscrowToPay', diff --git a/packages/smart-contracts/scripts-create2/verify-one.ts b/packages/smart-contracts/scripts-create2/verify-one.ts index 2b5875240c..b23570caba 100644 --- a/packages/smart-contracts/scripts-create2/verify-one.ts +++ b/packages/smart-contracts/scripts-create2/verify-one.ts @@ -27,6 +27,7 @@ export async function VerifyCreate2FromList(hre: HardhatRuntimeEnvironmentExtend switch (contract) { case 'EthereumProxy': case 'EthereumFeeProxy': + case 'ERC20FeeProxy': case 'ERC20SwapToConversion': case 'Erc20ConversionProxy': { const constructorArgs = getConstructorArgs(contract); diff --git a/packages/smart-contracts/src/lib/artifacts/Erc20SwapConversion/index.ts b/packages/smart-contracts/src/lib/artifacts/Erc20SwapConversion/index.ts index 5f221c55a8..8eae29f28c 100644 --- a/packages/smart-contracts/src/lib/artifacts/Erc20SwapConversion/index.ts +++ b/packages/smart-contracts/src/lib/artifacts/Erc20SwapConversion/index.ts @@ -63,6 +63,10 @@ export const erc20SwapConversionArtifact = new ContractArtifact Date: Fri, 8 Jul 2022 16:06:20 +0200 Subject: [PATCH 02/85] deploy: goerli contracts --- .../smart-contracts/src/lib/artifacts/BatchPayments/index.ts | 4 ++++ .../src/lib/artifacts/ChainlinkConversionPath/index.ts | 4 ++++ .../src/lib/artifacts/ERC20EscrowToPay/index.ts | 4 ++++ .../smart-contracts/src/lib/artifacts/ERC20FeeProxy/index.ts | 4 ++++ .../smart-contracts/src/lib/artifacts/ERC20SwapToPay/index.ts | 4 ++++ .../src/lib/artifacts/Erc20ConversionProxy/index.ts | 4 ++++ .../src/lib/artifacts/Erc20SwapConversion/index.ts | 4 ++++ .../src/lib/artifacts/EthConversionProxy/index.ts | 4 ++++ .../src/lib/artifacts/EthereumFeeProxy/index.ts | 4 ++++ .../smart-contracts/src/lib/artifacts/EthereumProxy/index.ts | 4 ++++ .../src/lib/artifacts/RequestDeployer/index.ts | 4 ++++ .../src/lib/artifacts/RequestHashStorage/index.ts | 4 ++++ .../src/lib/artifacts/RequestHashSubmitter/index.ts | 4 ++++ 13 files changed, 52 insertions(+) diff --git a/packages/smart-contracts/src/lib/artifacts/BatchPayments/index.ts b/packages/smart-contracts/src/lib/artifacts/BatchPayments/index.ts index e0de6d9db8..b62fc9924a 100644 --- a/packages/smart-contracts/src/lib/artifacts/BatchPayments/index.ts +++ b/packages/smart-contracts/src/lib/artifacts/BatchPayments/index.ts @@ -17,6 +17,10 @@ export const batchPaymentsArtifact = new ContractArtifact( address: '0x0DD57FFe83a53bCbd657e234B16A3e74fEDb8fBA', creationBlockNumber: 10857190, }, + goerli: { + address: '0x0DD57FFe83a53bCbd657e234B16A3e74fEDb8fBA', + creationBlockNumber: 7091488, + }, mainnet: { address: '0x0DD57FFe83a53bCbd657e234B16A3e74fEDb8fBA', creationBlockNumber: 14884721, diff --git a/packages/smart-contracts/src/lib/artifacts/ChainlinkConversionPath/index.ts b/packages/smart-contracts/src/lib/artifacts/ChainlinkConversionPath/index.ts index 7ebde79521..ee0761fde6 100644 --- a/packages/smart-contracts/src/lib/artifacts/ChainlinkConversionPath/index.ts +++ b/packages/smart-contracts/src/lib/artifacts/ChainlinkConversionPath/index.ts @@ -22,6 +22,10 @@ export const chainlinkConversionPath = new ContractArtifact( address: '0xEbe28A2B7336670Ba752bfEad4a121D2c4FF2464', creationBlockNumber: 10461945, }, + goerli: { + address: '0xEbe28A2B7336670Ba752bfEad4a121D2c4FF2464', + creationBlockNumber: 10461945, + }, matic: { address: '0xc7f471F5A8f8b33F131049b1e9A43941CbE31792', creationBlockNumber: 29821569, diff --git a/packages/smart-contracts/src/lib/artifacts/ERC20FeeProxy/index.ts b/packages/smart-contracts/src/lib/artifacts/ERC20FeeProxy/index.ts index f3c6024a5b..dd64ee33e5 100644 --- a/packages/smart-contracts/src/lib/artifacts/ERC20FeeProxy/index.ts +++ b/packages/smart-contracts/src/lib/artifacts/ERC20FeeProxy/index.ts @@ -21,6 +21,10 @@ export const erc20FeeProxyArtifact = new ContractArtifact( address: '0xda46309973bFfDdD5a10cE12c44d2EE266f45A44', creationBlockNumber: 7118080, }, + goerli: { + address: '0x399F5EE127ce7432E4921a61b8CF52b0af52cbfE', + creationBlockNumber: 7091472, + }, matic: { address: '0x2171a0dc12a9E5b1659feF2BB20E54c84Fa7dB0C', creationBlockNumber: 14163521, diff --git a/packages/smart-contracts/src/lib/artifacts/ERC20SwapToPay/index.ts b/packages/smart-contracts/src/lib/artifacts/ERC20SwapToPay/index.ts index 4a03696db1..ad9a3ff5eb 100644 --- a/packages/smart-contracts/src/lib/artifacts/ERC20SwapToPay/index.ts +++ b/packages/smart-contracts/src/lib/artifacts/ERC20SwapToPay/index.ts @@ -21,6 +21,10 @@ export const erc20SwapToPayArtifact = new ContractArtifact( address: '0xb674e3d228e631594D8fd4BF947E1811288bf836', creationBlockNumber: 7363204, }, + goerli: { + address: '0x0Ef49176A87Adcc88bD5125126C6a6c23a28303C', + creationBlockNumber: 7109102, + }, }, }, '0.3.0': { diff --git a/packages/smart-contracts/src/lib/artifacts/Erc20ConversionProxy/index.ts b/packages/smart-contracts/src/lib/artifacts/Erc20ConversionProxy/index.ts index 830cbf6eca..dc1e7ce920 100644 --- a/packages/smart-contracts/src/lib/artifacts/Erc20ConversionProxy/index.ts +++ b/packages/smart-contracts/src/lib/artifacts/Erc20ConversionProxy/index.ts @@ -22,6 +22,10 @@ export const erc20ConversionProxy = new ContractArtifact( address: '0x78334ed20da456e89cd7e5a90de429d705f5bc88', creationBlockNumber: 8014584, }, + goerli: { + address: '0x493d6cBeE0142c73eE5461fA92CaC94e3e75df62', + creationBlockNumber: 7091387, + }, matic: { address: '0xf0f49873C50765239F6f9534Ba13c4fe16eD5f2E', creationBlockNumber: 17427747, diff --git a/packages/smart-contracts/src/lib/artifacts/Erc20SwapConversion/index.ts b/packages/smart-contracts/src/lib/artifacts/Erc20SwapConversion/index.ts index 8eae29f28c..1852293575 100644 --- a/packages/smart-contracts/src/lib/artifacts/Erc20SwapConversion/index.ts +++ b/packages/smart-contracts/src/lib/artifacts/Erc20SwapConversion/index.ts @@ -18,6 +18,10 @@ export const erc20SwapConversionArtifact = new ContractArtifact( address: '0xCa3353a15fCb5C83a1Ff64BFf055781aC5c4d2F4', creationBlockNumber: 9447194, }, + goerli: { + address: '0xED250D9219EB93098Bb67aEbc992963172B9c8DA', + creationBlockNumber: 7108896, + }, fantom: { address: '0xCa3353a15fCb5C83a1Ff64BFf055781aC5c4d2F4', creationBlockNumber: 20066436, diff --git a/packages/smart-contracts/src/lib/artifacts/EthereumFeeProxy/index.ts b/packages/smart-contracts/src/lib/artifacts/EthereumFeeProxy/index.ts index 40f2adb12f..06dd436767 100644 --- a/packages/smart-contracts/src/lib/artifacts/EthereumFeeProxy/index.ts +++ b/packages/smart-contracts/src/lib/artifacts/EthereumFeeProxy/index.ts @@ -17,6 +17,10 @@ export const ethereumFeeProxyArtifact = new ContractArtifact( address: '0xC6E23a20C0a1933ACC8E30247B5D1e2215796C1F', creationBlockNumber: 9447193, }, + goerli: { + address: '0xe11BF2fDA23bF0A98365e1A4c04A87C9339e8687', + creationBlockNumber: 7091386, + }, fantom: { address: '0xC6E23a20C0a1933ACC8E30247B5D1e2215796C1F', creationBlockNumber: 20066431, diff --git a/packages/smart-contracts/src/lib/artifacts/EthereumProxy/index.ts b/packages/smart-contracts/src/lib/artifacts/EthereumProxy/index.ts index 85e0e9a302..527cedbb78 100644 --- a/packages/smart-contracts/src/lib/artifacts/EthereumProxy/index.ts +++ b/packages/smart-contracts/src/lib/artifacts/EthereumProxy/index.ts @@ -21,6 +21,10 @@ export const ethereumProxyArtifact = new ContractArtifact( address: '0x9c6c7817e3679c4b3f9ef9486001eae5aaed25ff', creationBlockNumber: 5955681, }, + goerli: { + address: '0x171Ee0881407d4c0C11eA1a2FB7D5b4cdED71e6e', + creationBlockNumber: 7069045, + }, xdai: { address: '0x27c60BE17e853c47A9F1d280B05365f483c2dFAF', creationBlockNumber: 18326895, diff --git a/packages/smart-contracts/src/lib/artifacts/RequestDeployer/index.ts b/packages/smart-contracts/src/lib/artifacts/RequestDeployer/index.ts index f43aa72293..1a8522cbf4 100644 --- a/packages/smart-contracts/src/lib/artifacts/RequestDeployer/index.ts +++ b/packages/smart-contracts/src/lib/artifacts/RequestDeployer/index.ts @@ -21,6 +21,10 @@ export const requestDeployer = new ContractArtifact( address: '0xE99Ab70a5FAE59551544FA326fA048f7B95A24B2', creationBlockNumber: 10307305, }, + goerli: { + address: '0xE99Ab70a5FAE59551544FA326fA048f7B95A24B2', + creationBlockNumber: 7068867, + }, 'arbitrum-rinkeby': { address: '0xE99Ab70a5FAE59551544FA326fA048f7B95A24B2', creationBlockNumber: 10382055, diff --git a/packages/smart-contracts/src/lib/artifacts/RequestHashStorage/index.ts b/packages/smart-contracts/src/lib/artifacts/RequestHashStorage/index.ts index e3e0981d6b..d9b4ae963c 100644 --- a/packages/smart-contracts/src/lib/artifacts/RequestHashStorage/index.ts +++ b/packages/smart-contracts/src/lib/artifacts/RequestHashStorage/index.ts @@ -21,6 +21,10 @@ export const requestHashStorageArtifact = new ContractArtifact Date: Fri, 8 Jul 2022 16:25:52 +0200 Subject: [PATCH 03/85] Update index.ts --- .../src/lib/artifacts/Erc20SwapConversion/index.ts | 4 ---- 1 file changed, 4 deletions(-) diff --git a/packages/smart-contracts/src/lib/artifacts/Erc20SwapConversion/index.ts b/packages/smart-contracts/src/lib/artifacts/Erc20SwapConversion/index.ts index 1852293575..8eae29f28c 100644 --- a/packages/smart-contracts/src/lib/artifacts/Erc20SwapConversion/index.ts +++ b/packages/smart-contracts/src/lib/artifacts/Erc20SwapConversion/index.ts @@ -18,10 +18,6 @@ export const erc20SwapConversionArtifact = new ContractArtifact Date: Fri, 8 Jul 2022 17:26:11 +0200 Subject: [PATCH 04/85] wip: ETHConversionProxy --- packages/currency/src/native.ts | 6 ++++ packages/smart-contracts/README.md | 36 +++++++++---------- .../scripts-create2/compute-one-address.ts | 1 + .../scripts-create2/constructor-args.ts | 35 +++++++++--------- .../scripts-create2/deploy-one.ts | 1 + .../smart-contracts/scripts-create2/utils.ts | 1 + .../scripts-create2/verify-one.ts | 1 + 7 files changed, 45 insertions(+), 36 deletions(-) diff --git a/packages/currency/src/native.ts b/packages/currency/src/native.ts index ec6bf066e2..dc1fa018d2 100644 --- a/packages/currency/src/native.ts +++ b/packages/currency/src/native.ts @@ -15,6 +15,12 @@ export const nativeCurrencies: Record ``` -#### Compute the contract addresses +### Compute the contract addresses Run: @@ -130,7 +128,7 @@ yarn hardhat compute-contract-addresses It will compute the addresses of the contracts to be deployed via the request deployer. -#### Deploy the contracts +### Deploy the contracts Depending on the xdeployer config, this script will deploy the smart contracts on several chain simultaneously Environment variables needed: `ADMIN_PRIVATE_KEY` @@ -157,17 +155,23 @@ This command will output details about each contract deployment on each chain: - If already deployed: the network, and the contract address - If an error occured: the said error -#### Verify the contracts +### Verify the contracts -For each network the contract were deployed to run: +Verify and publish the contract code automatically to blockchain explorers, right after smart contracts compilation. You should first set the `ETHERSCAN_API_KEY` environment variable. ```bash yarn hardhat verify-contract-from-deployer --network ``` -The associated `EXPLORER_API_KEY` is mandatory. +#### Verify the contracts manually With Hardhat (legacy) + +A more generic way to verify any contract by setting constructor argments manually: + +```bash +yarn hardhat verify --network NETWORK_NAME DEPLOYED_CONTRACT_ADDRESS "Constructor argument 1" +``` -### Live deployment (Payment only - deprecated method) +### Deprecated payment deployment scripts (legacy) The goal of this script is to let all our payment contracts be deployed with the same sequence on every chain. @@ -189,7 +193,7 @@ yarn hardhat deploy-live-payments --network private --force yarn hardhat deploy-live-payments --network private --force --dry-run ``` -### Tests +## Tests After a local deployment: @@ -203,14 +207,6 @@ Networks and providers are configured in [hardhat.config.ts](hardhat.config.ts). Have a look at the [Hardhat documentation](https://hardhat.org/config/). -## Contract verification with Hardhat - -Verify and publish the contract code automatically to blockchain explorers, right after smart contracts compilation. You should first set the `ETHERSCAN_API_KEY` environment variable. - -```bash -yarn hardhat verify --network NETWORK_NAME DEPLOYED_CONTRACT_ADDRESS "Constructor argument 1" -``` - ## Contributing Pull requests are welcome. For major changes, please open an issue first to discuss what you would like to change. diff --git a/packages/smart-contracts/scripts-create2/compute-one-address.ts b/packages/smart-contracts/scripts-create2/compute-one-address.ts index 00afbd9289..7e8c4809a7 100644 --- a/packages/smart-contracts/scripts-create2/compute-one-address.ts +++ b/packages/smart-contracts/scripts-create2/compute-one-address.ts @@ -52,6 +52,7 @@ export const computeCreate2DeploymentAddressesFromList = async ( switch (contract) { case 'EthereumProxy': case 'EthereumFeeProxy': + case 'ETHConversionProxy': case 'ERC20FeeProxy': case 'Erc20ConversionProxy': case 'ERC20EscrowToPay': diff --git a/packages/smart-contracts/scripts-create2/constructor-args.ts b/packages/smart-contracts/scripts-create2/constructor-args.ts index 1d462ff125..db9d4952e6 100644 --- a/packages/smart-contracts/scripts-create2/constructor-args.ts +++ b/packages/smart-contracts/scripts-create2/constructor-args.ts @@ -1,27 +1,33 @@ import * as artifacts from '../src/lib'; +const getAdminWalletAddress = (contract: string): string => { + if (!process.env.ADMIN_WALLET_ADDRESS) { + throw new Error(`ADMIN_WALLET_ADDRESS missing to get constructor args for: ${contract}`); + } + return process.env.ADMIN_WALLET_ADDRESS; +}; + export const getConstructorArgs = (contract: string, network?: string): string[] => { switch (contract) { case 'Erc20ConversionProxy': { - if (!process.env.ADMIN_WALLET_ADDRESS) { - throw new Error(`ADMIN_WALLET_ADDRESS missing to get constructor args for: ${contract}`); - } return [ '0x0000000000000000000000000000000000000000', '0x0000000000000000000000000000000000000000', - process.env.ADMIN_WALLET_ADDRESS, + getAdminWalletAddress(contract), + ]; + } + case 'ETHConversionProxy': { + return [ + '0x0000000000000000000000000000000000000000', + '0x0000000000000000000000000000000000000000', + '0x39e19aa5b69466dfdc313c7cda37cb2a599015cd', ]; + // TODO setupETHConversionProxy } case 'ERC20SwapToConversion': { - if (!process.env.ADMIN_WALLET_ADDRESS) { - throw new Error(`ADMIN_WALLET_ADDRESS missing to get constructor args for: ${contract}`); - } - return [process.env.ADMIN_WALLET_ADDRESS]; + return [getAdminWalletAddress(contract)]; } case 'ERC20EscrowToPay': { - if (!process.env.ADMIN_WALLET_ADDRESS) { - throw new Error(`ADMIN_WALLET_ADDRESS missing to get constructor args for: ${contract}`); - } if (!network) { throw new Error( 'Escrow contract requires network parameter to get correct address of erc20FeeProxy', @@ -29,12 +35,9 @@ export const getConstructorArgs = (contract: string, network?: string): string[] } const erc20FeeProxy = artifacts.erc20FeeProxyArtifact; const erc20FeeProxyAddress = erc20FeeProxy.getAddress(network); - return [erc20FeeProxyAddress, process.env.ADMIN_WALLET_ADDRESS]; + return [erc20FeeProxyAddress, getAdminWalletAddress(contract)]; } case 'BatchPayments': { - if (!process.env.ADMIN_WALLET_ADDRESS) { - throw new Error(`ADMIN_WALLET_ADDRESS missing to get constructor args for: ${contract}`); - } if (!network) { throw new Error( 'Batch contract requires network parameter to get correct address of erc20FeeProxy and ethereumFeeProxy', @@ -43,7 +46,7 @@ export const getConstructorArgs = (contract: string, network?: string): string[] return [ '0x0000000000000000000000000000000000000000', '0x0000000000000000000000000000000000000000', - process.env.ADMIN_WALLET_ADDRESS, + getAdminWalletAddress(contract), ]; } default: diff --git a/packages/smart-contracts/scripts-create2/deploy-one.ts b/packages/smart-contracts/scripts-create2/deploy-one.ts index 535319e7e1..ec15644fac 100644 --- a/packages/smart-contracts/scripts-create2/deploy-one.ts +++ b/packages/smart-contracts/scripts-create2/deploy-one.ts @@ -53,6 +53,7 @@ export const deployWithCreate2FromList = async ( switch (contract) { case 'EthereumProxy': case 'EthereumFeeProxy': + case 'ETHConversionProxy': case 'ERC20FeeProxy': case 'Erc20ConversionProxy': { const constructorArgs = getConstructorArgs(contract); diff --git a/packages/smart-contracts/scripts-create2/utils.ts b/packages/smart-contracts/scripts-create2/utils.ts index 04ef3377cb..421bba148c 100644 --- a/packages/smart-contracts/scripts-create2/utils.ts +++ b/packages/smart-contracts/scripts-create2/utils.ts @@ -9,6 +9,7 @@ import * as artifacts from '../src/lib'; export const create2ContractDeploymentList = [ 'EthereumProxy', 'EthereumFeeProxy', + 'ETHConversionProxy', 'ERC20FeeProxy', 'Erc20ConversionProxy', 'ERC20SwapToConversion', diff --git a/packages/smart-contracts/scripts-create2/verify-one.ts b/packages/smart-contracts/scripts-create2/verify-one.ts index b23570caba..cc8648e862 100644 --- a/packages/smart-contracts/scripts-create2/verify-one.ts +++ b/packages/smart-contracts/scripts-create2/verify-one.ts @@ -27,6 +27,7 @@ export async function VerifyCreate2FromList(hre: HardhatRuntimeEnvironmentExtend switch (contract) { case 'EthereumProxy': case 'EthereumFeeProxy': + case 'ETHConversionProxy': case 'ERC20FeeProxy': case 'ERC20SwapToConversion': case 'Erc20ConversionProxy': { From eb6305514e600973c4a70ca40b2dea0a3edb570f Mon Sep 17 00:00:00 2001 From: Romain TREFAULT Date: Mon, 11 Jul 2022 10:38:00 +0200 Subject: [PATCH 05/85] refactor: squash unsigned commits -S refactor: add goerli tests refactor: add goerli tests refactor: add goerli tests feat: add goerli support in currency -S feat: add goerli payment-detection tests refactor: setups.ts refactor: goerli tests refactor: goerli contract address in tests refactor: goerli tests refactor: rename ETHConversionProxy to EthConversionProxy --- packages/currency/src/aggregators/goerli.json | 8 ++ .../currency/src/erc20/networks/goerli.ts | 17 +++ .../src/erc20/address-based.ts | 2 +- .../any/any-to-erc20-proxy-contract.test.ts | 48 ++++++- .../test/erc20/address-based.test.ts | 2 +- .../test/erc20/escrow-info-retriever.test.ts | 26 ++++ .../test/erc20/fee-proxy-contract.test.ts | 4 +- .../test/erc20/proxy-contract.test.ts | 4 +- .../erc20/thegraph-info-retriever.test.ts | 87 +++++++++++- .../payment-detection/test/erc777/mocks.ts | 2 +- .../test/erc777/superfluid-retriever.test.ts | 127 ++++++++++++++++-- .../test/eth/info-retriever.test.ts | 1 + .../test/eth/input-data.test.ts | 84 +++++++++++- .../payment-detection/test/provider.test.ts | 25 +++- .../scripts-create2/constructor-args.ts | 4 +- .../contract-setup/setupEthConversionProxy.ts | 47 +++++++ .../scripts-create2/contract-setup/setups.ts | 35 +++++ .../smart-contracts/scripts-create2/deploy.ts | 87 ++++++++++++ .../smart-contracts/scripts-create2/verify.ts | 64 +++++++++ .../lib/artifacts/ERC20EscrowToPay/index.ts | 4 +- 20 files changed, 643 insertions(+), 35 deletions(-) create mode 100644 packages/currency/src/aggregators/goerli.json create mode 100644 packages/currency/src/erc20/networks/goerli.ts create mode 100644 packages/smart-contracts/scripts-create2/contract-setup/setupEthConversionProxy.ts create mode 100644 packages/smart-contracts/scripts-create2/contract-setup/setups.ts create mode 100644 packages/smart-contracts/scripts-create2/deploy.ts create mode 100644 packages/smart-contracts/scripts-create2/verify.ts diff --git a/packages/currency/src/aggregators/goerli.json b/packages/currency/src/aggregators/goerli.json new file mode 100644 index 0000000000..93d71cbd2c --- /dev/null +++ b/packages/currency/src/aggregators/goerli.json @@ -0,0 +1,8 @@ +{ + "0xba62bcfcaafc6622853cca2be6ac7d845bc0f2dc": { + "0x775eb53d00dd0acd3ec1696472105d579b9b386b": 1 + }, + "0x775eb53d00dd0acd3ec1696472105d579b9b386b": { + "0xba62bcfcaafc6622853cca2be6ac7d845bc0f2dc": 1 + } +} diff --git a/packages/currency/src/erc20/networks/goerli.ts b/packages/currency/src/erc20/networks/goerli.ts new file mode 100644 index 0000000000..d890fe3c30 --- /dev/null +++ b/packages/currency/src/erc20/networks/goerli.ts @@ -0,0 +1,17 @@ +import { TokenMap } from './types'; + +// List of the supported goerli ERC20 tokens +export const supportedGoerliERC20: TokenMap = { + // Request Test token, used for testing on goerli. + '0x7af963cF6D228E564e2A0aA0DdBF06210B38615D': { + decimals: 18, + name: 'Goerli Test Token', + symbol: 'TST', + }, + // Faucet Token on goerli network. Easy to use on tests. + '0xBA62BCfcAaFc6622853cca2BE6Ac7d845BC0f2Dc': { + decimals: 18, + name: 'Faucet Token', + symbol: 'FAU-goerli', + }, +}; diff --git a/packages/payment-detection/src/erc20/address-based.ts b/packages/payment-detection/src/erc20/address-based.ts index 5bd11e632e..4664b3164f 100644 --- a/packages/payment-detection/src/erc20/address-based.ts +++ b/packages/payment-detection/src/erc20/address-based.ts @@ -8,7 +8,7 @@ import { BalanceError } from '../balance-error'; import Erc20InfoRetriever from './address-based-info-retriever'; import { PaymentDetectorBase } from '../payment-detector-base'; -const supportedNetworks = ['mainnet', 'rinkeby', 'private']; +const supportedNetworks = ['mainnet', 'rinkeby', 'goerli', 'private']; /** * Handle payment networks with ERC20 based address extension diff --git a/packages/payment-detection/test/any/any-to-erc20-proxy-contract.test.ts b/packages/payment-detection/test/any/any-to-erc20-proxy-contract.test.ts index 1be024d556..2acfa670b2 100644 --- a/packages/payment-detection/test/any/any-to-erc20-proxy-contract.test.ts +++ b/packages/payment-detection/test/any/any-to-erc20-proxy-contract.test.ts @@ -31,7 +31,7 @@ const mockAdvancedLogic: AdvancedLogicTypes.IAdvancedLogic = { }, extensions: { anyToErc20Proxy: { - supportedNetworks: ['mainnet', 'rinkeby', 'private'], + supportedNetworks: ['mainnet', 'rinkeby', 'goerli', 'private'], createAddPaymentAddressAction, createAddRefundAddressAction, createCreationAction, @@ -56,7 +56,7 @@ describe('api/any/conversion-fee-proxy-contract', () => { jest.clearAllMocks(); }); - it('can createExtensionsDataForCreation', async () => { + it('can createExtensionsDataForCreation (Rinkeby)', async () => { await anyToErc20Proxy.createExtensionsDataForCreation({ paymentAddress: 'ethereum address', salt: 'ea3bc7caf64110ca', @@ -77,7 +77,28 @@ describe('api/any/conversion-fee-proxy-contract', () => { }); }); - it('can createExtensionsDataForCreation with fee amount and address', async () => { + it('can createExtensionsDataForCreation (Goerli)', async () => { + await anyToErc20Proxy.createExtensionsDataForCreation({ + paymentAddress: 'ethereum address', + salt: 'ea3bc7caf64110ca', + acceptedTokens: ['ethereum address2'], + network: 'goerli', + maxRateTimespan: 1000, + }); + + expect(createCreationAction).toHaveBeenCalledWith({ + feeAddress: undefined, + feeAmount: undefined, + paymentAddress: 'ethereum address', + refundAddress: undefined, + salt: 'ea3bc7caf64110ca', + acceptedTokens: ['ethereum address2'], + network: 'goerli', + maxRateTimespan: 1000, + }); + }); + + it('can createExtensionsDataForCreation with fee amount and address (Rinkeby)', async () => { await anyToErc20Proxy.createExtensionsDataForCreation({ feeAddress: 'fee address', feeAmount: '2000', @@ -98,6 +119,27 @@ describe('api/any/conversion-fee-proxy-contract', () => { }); }); + it('can createExtensionsDataForCreation with fee amount and address (Goerli)', async () => { + await anyToErc20Proxy.createExtensionsDataForCreation({ + feeAddress: 'fee address', + feeAmount: '2000', + paymentAddress: 'ethereum address', + salt: 'ea3bc7caf64110ca', + acceptedTokens: ['ethereum address2'], + network: 'goerli', + }); + + expect(createCreationAction).toHaveBeenCalledWith({ + feeAddress: 'fee address', + feeAmount: '2000', + paymentAddress: 'ethereum address', + refundAddress: undefined, + salt: 'ea3bc7caf64110ca', + acceptedTokens: ['ethereum address2'], + network: 'goerli', + }); + }); + it('can createExtensionsDataForCreation without salt', async () => { await anyToErc20Proxy.createExtensionsDataForCreation({ paymentAddress: 'ethereum address', diff --git a/packages/payment-detection/test/erc20/address-based.test.ts b/packages/payment-detection/test/erc20/address-based.test.ts index f75629d334..93fa533021 100644 --- a/packages/payment-detection/test/erc20/address-based.test.ts +++ b/packages/payment-detection/test/erc20/address-based.test.ts @@ -126,7 +126,7 @@ describe('api/erc20/address-based', () => { error: { code: PaymentTypes.BALANCE_ERROR_CODE.NETWORK_NOT_SUPPORTED, message: - 'Payment network wrong not supported by ERC20 payment detection. Supported networks: mainnet, rinkeby, private', + 'Payment network wrong not supported by ERC20 payment detection. Supported networks: mainnet, rinkeby, goerli, private', }, events: [], }); diff --git a/packages/payment-detection/test/erc20/escrow-info-retriever.test.ts b/packages/payment-detection/test/erc20/escrow-info-retriever.test.ts index 53a6246639..03431e5089 100644 --- a/packages/payment-detection/test/erc20/escrow-info-retriever.test.ts +++ b/packages/payment-detection/test/erc20/escrow-info-retriever.test.ts @@ -161,4 +161,30 @@ describe('api/erc20/escrow-info-retriever', () => { expect(escrowChainData.isFrozen).toEqual(true); }); }); + + describe('test on goerli', () => { + let infoRetriever: EscrowERC20InfoRetriever; + beforeAll(() => { + infoRetriever = new EscrowERC20InfoRetriever( + paymentReferenceMock, + '0x8230e703B1c4467A4543422b2cC3284133B9AB5e', + 0, + '', + '', + 'goerli', + ); + }); + it('should get escrow chain data', async () => { + const escrowChainData = await infoRetriever.getEscrowRequestMapping(); + // Not yet ERC777 token on goerli + // expect(escrowChainData.tokenAddress).toEqual('0x745861AeD1EEe363b4AaA5F1994Be40b1e05Ff90'); + expect(escrowChainData.payee).toEqual('0xB9B7e0cb2EDF5Ea031C8B297A5A1Fa20379b6A0a'); + expect(escrowChainData.payer).toEqual('0x0c051a1f4E209b00c8E7C00AD0ce79B3630a7401'); + expect(escrowChainData.amount.toString()).toEqual('123000000000000000000'); + expect(escrowChainData.unlockDate.toString()).toEqual('1670505020'); + expect(escrowChainData.emergencyClaimDate.toString()).toEqual('0'); + expect(escrowChainData.emergencyState).toEqual(false); + expect(escrowChainData.isFrozen).toEqual(true); + }); + }); }); diff --git a/packages/payment-detection/test/erc20/fee-proxy-contract.test.ts b/packages/payment-detection/test/erc20/fee-proxy-contract.test.ts index f7504c9b8d..c0d924c21d 100644 --- a/packages/payment-detection/test/erc20/fee-proxy-contract.test.ts +++ b/packages/payment-detection/test/erc20/fee-proxy-contract.test.ts @@ -23,7 +23,7 @@ const mockAdvancedLogic: AdvancedLogicTypes.IAdvancedLogic = { }, extensions: { feeProxyContractErc20: { - supportedNetworks: ['mainnet', 'private', 'rinkeby'], + supportedNetworks: ['mainnet', 'private', 'rinkeby', 'goerli'], createAddPaymentAddressAction, createAddRefundAddressAction, createCreationAction, @@ -283,7 +283,7 @@ describe('api/erc20/fee-proxy-contract', () => { ).toBe('7'); }); - it('should have gasFee & gasUsed in the payment eventl', async () => { + it('should have gasFee & gasUsed in the payment event', async () => { const mockRequest: RequestLogicTypes.IRequest = { creator: { type: IdentityTypes.TYPE.ETHEREUM_ADDRESS, value: '0x2' }, currency: { diff --git a/packages/payment-detection/test/erc20/proxy-contract.test.ts b/packages/payment-detection/test/erc20/proxy-contract.test.ts index 5d89bb7977..f814c0ae58 100644 --- a/packages/payment-detection/test/erc20/proxy-contract.test.ts +++ b/packages/payment-detection/test/erc20/proxy-contract.test.ts @@ -25,7 +25,7 @@ const mockAdvancedLogic: AdvancedLogicTypes.IAdvancedLogic = { }, extensions: { proxyContractErc20: { - supportedNetworks: ['mainnet', 'rinkeby'], + supportedNetworks: ['mainnet', 'rinkeby', 'goerli'], createAddPaymentAddressAction, createAddRefundAddressAction, createCreationAction, @@ -160,7 +160,7 @@ describe('api/erc20/proxy-contract', () => { error: { code: PaymentTypes.BALANCE_ERROR_CODE.NETWORK_NOT_SUPPORTED, message: - 'Payment network WRONG not supported by pn-erc20-proxy-contract payment detection. Supported networks: mainnet, rinkeby', + 'Payment network WRONG not supported by pn-erc20-proxy-contract payment detection. Supported networks: mainnet, rinkeby, goerli', }, events: [], }); diff --git a/packages/payment-detection/test/erc20/thegraph-info-retriever.test.ts b/packages/payment-detection/test/erc20/thegraph-info-retriever.test.ts index 7c13df6b72..c641ed0feb 100644 --- a/packages/payment-detection/test/erc20/thegraph-info-retriever.test.ts +++ b/packages/payment-detection/test/erc20/thegraph-info-retriever.test.ts @@ -51,7 +51,7 @@ describe('api/erc20/thegraph-info-retriever', () => { expect(transferEvents[0].parameters?.feeAmount).toEqual(paymentData.feeAmount); }); - it('should get payment event from ethFeeConversionProxy via subgraph', async () => { + it('should get payment event from ethFeeConversionProxy via subgraph (Rinkeby)', async () => { const paymentData = { reference: '0x6c93723bc5f82e6fbb2ea994bf0fb572fa19f7a2a3146065e21752b95668efe5', txHash: '0x2f7b4752aa259166c038cd9073056c5979760cf0eea55d093fca2095c229313b', @@ -89,4 +89,89 @@ describe('api/erc20/thegraph-info-retriever', () => { expect(transferEvents[0].parameters?.block).toEqual(paymentData.block); }); }); + + describe('on goerli', () => { + const GOERLI_ETH_FEE_PROXY_CONTRACT = '0xe11BF2fDA23bF0A98365e1A4c04A87C9339e8687'; + const GOERLI_ETH_CONVERSION_PROXY_CONTRACT = '0xED250D9219EB93098Bb67aEbc992963172B9c8DA'; + + it('should get payment event from ethFeeProxy via subgraph', async () => { + const paymentData = { + reference: '0x6c93723bc5f82e6fbb2ea994bf0fb572fa19f7a2a3146065e21752b95668efe5', + txHash: '0x3e2d6cc2534b1d340ba2954f34e6cc819d6da64ff76863ea89c6d34b15d13c97', + from: '0x186e7fe6c34ea0eca7f9c2fd29651fc0443e3f29', + to: '0x5000ee9fb9c96a2a09d8efb695ac21d6c429ff11', + network: 'goerli', + salt: '0ee84db293a752c6', + amount: '30000000000000', + requestId: '0188791633ff0ec72a7dbdefb886d2db6cccfa98287320839c2f173c7a4e3ce7e1', + block: 9606098, + feeAddress: '0x5000EE9FB9c96A2A09D8efB695aC21D6C429fF11', + feeAmount: '0', + }; + const paymentReference = PaymentReferenceCalculator.calculate( + paymentData.requestId, + paymentData.salt, + paymentData.to, + ); + const onChainReference = utils.keccak256(`0x${paymentReference}`); + expect(onChainReference).toEqual(paymentData.reference); + + const graphRetriever = new TheGraphInfoRetriever( + paymentReference, + GOERLI_ETH_FEE_PROXY_CONTRACT, + null, + paymentData.to, + PaymentTypes.EVENTS_NAMES.PAYMENT, + paymentData.network, + ); + const allNetworkEvents = await graphRetriever.getTransferEvents(); + const transferEvents = allNetworkEvents.paymentEvents; + // expect(transferEvents).toHaveLength(1); + expect(transferEvents[0].amount).toEqual('30000000000000'); + expect(transferEvents[0].name).toEqual('payment'); + expect(transferEvents[0].parameters?.to).toEqual(paymentData.to); + expect(transferEvents[0].parameters?.txHash).toEqual(paymentData.txHash); + expect(transferEvents[0].parameters?.block).toEqual(paymentData.block); + expect(transferEvents[0].parameters?.feeAddress).toEqual(paymentData.feeAddress); + expect(transferEvents[0].parameters?.feeAmount).toEqual(paymentData.feeAmount); + }); + + it('should get payment event from ethFeeConversionProxy via subgraph', async () => { + const paymentData = { + reference: '0x6c93723bc5f82e6fbb2ea994bf0fb572fa19f7a2a3146065e21752b95668efe5', + txHash: '0x2f7b4752aa259166c038cd9073056c5979760cf0eea55d093fca2095c229313b', + from: '0x186e7fe6c34ea0eca7f9c2fd29651fc0443e3f29', + to: '0x5000ee9fb9c96a2a09d8efb695ac21d6c429ff11', + network: 'goerli', + salt: '0ee84db293a752c6', + amount: '7000', + block: 9610470, + requestId: '0188791633ff0ec72a7dbdefb886d2db6cccfa98287320839c2f173c7a4e3ce7e1', + }; + + const shortReference = PaymentReferenceCalculator.calculate( + paymentData.requestId, + paymentData.salt, + paymentData.to, + ); + const onChainReference = utils.keccak256(`0x${shortReference}`); + expect(onChainReference).toEqual(paymentData.reference); + + const graphRetriever = new TheGraphInfoRetriever( + shortReference, + GOERLI_ETH_CONVERSION_PROXY_CONTRACT, + null, + paymentData.to, + PaymentTypes.EVENTS_NAMES.PAYMENT, + paymentData.network, + ); + const allNetworkEvents = await graphRetriever.getTransferEvents(); + const transferEvents = allNetworkEvents.paymentEvents; + // expect(transferEvents).toHaveLength(1); + expect(transferEvents[0].amount).toEqual(paymentData.amount); + expect(transferEvents[0].parameters?.to).toEqual(paymentData.to); + expect(transferEvents[0].parameters?.txHash).toEqual(paymentData.txHash); + expect(transferEvents[0].parameters?.block).toEqual(paymentData.block); + }); + }); }); diff --git a/packages/payment-detection/test/erc777/mocks.ts b/packages/payment-detection/test/erc777/mocks.ts index 69565f307f..8cfdc6eb5c 100644 --- a/packages/payment-detection/test/erc777/mocks.ts +++ b/packages/payment-detection/test/erc777/mocks.ts @@ -76,7 +76,7 @@ const mockFlows = [ }, { transactionHash: '0xe472ca1b52751b058fbdaeaffebd98c0cc43b45aa31794b3eb06834ede19f7be', - blockNumber: '9945543', + blockNumber: 9945543, timestamp: '1641495767', sender: '0x9c040e2d6fd83a8b35069aa7154b69674961e0f7', flowRate: '0', diff --git a/packages/payment-detection/test/erc777/superfluid-retriever.test.ts b/packages/payment-detection/test/erc777/superfluid-retriever.test.ts index 9ea56eb5e9..6d9e74f63e 100644 --- a/packages/payment-detection/test/erc777/superfluid-retriever.test.ts +++ b/packages/payment-detection/test/erc777/superfluid-retriever.test.ts @@ -10,7 +10,7 @@ const graphql = mocked(GraphQLClient.prototype); describe('api/erc777/superfluid-info-retriever', () => { describe('on untagged requests', () => { - it('should get payment events from SuperFluid via subgraph with 1 request', async () => { + it('should get payment events from SuperFluid via subgraph with 1 request (Rinkeby)', async () => { const paymentData = { reference: '0xbeefaccc470c7dbd54de69', txHash: '0xe472ca1b52751b058fbdaeaffebd98c0cc43b45aa31794b3eb06834ede19f7be', @@ -50,10 +50,51 @@ describe('api/erc777/superfluid-info-retriever', () => { expect(transferEvents[0].parameters?.txHash).toEqual(paymentData.txHash); expect(transferEvents[0].parameters?.block).toEqual(paymentData.block); }); + + it('should get payment events from SuperFluid via subgraph with 1 request (Goerli)', async () => { + const paymentData = { + reference: '0xbeefaccc470c7dbd54de69', + txHash: '0xe472ca1b52751b058fbdaeaffebd98c0cc43b45aa31794b3eb06834ede19f7be', + from: '0x9c040e2d6fd83a8b35069aa7154b69674961e0f7', + to: '0x52e5bcfa46393894afcfe6cd98a6761fa692c594', + network: 'goerli', + salt: '0ee84db293a752c6', + amount: '92592592592592000', + requestId: '0188791633ff0ec72a7dbdefb886d2db6cccfa98287320839c2f173c7a4e3ce7e1', + block: 9945543, + token: '0x2bf02814ea0b2b155ed47b7cede18caa752940e6', //fDAIx + }; + graphql.request.mockResolvedValue(mockSuperfluidSubgraph[0]); + + const paymentReference = PaymentReferenceCalculator.calculate( + paymentData.requestId, + paymentData.salt, + paymentData.to, + ); + const subgraphReference = `0xbeefac${paymentReference}`; + expect(subgraphReference).toEqual(paymentData.reference); + + const graphRetriever = new SuperFluidInfoRetriever( + paymentReference, + paymentData.token, + paymentData.to, + PaymentTypes.EVENTS_NAMES.PAYMENT, + paymentData.network, + ); + const transferEvents = await graphRetriever.getTransferEvents(); + expect(transferEvents).toHaveLength(5); + expect(transferEvents[0].amount).toEqual(paymentData.amount); + expect(transferEvents[0].name).toEqual('payment'); + expect(transferEvents[0].parameters?.to).toEqual(paymentData.to); + expect(transferEvents[1].amount).toEqual('34722222222222000'); + expect(transferEvents[2].amount).toEqual('40509259259259000'); + expect(transferEvents[0].parameters?.txHash).toEqual(paymentData.txHash); + expect(transferEvents[0].parameters?.block).toEqual(paymentData.block); + }); }); describe('on 2 nested requests', () => { - it('should get payment event from SuperFluid via subgraph with 2 requests', async () => { + it('should get payment event from SuperFluid via subgraph with 2 requests (Rinkeby)', async () => { const paymentData = { reference: '0xbeefac9474ad7670909da5', from: '0x9c040e2d6fd83a8b35069aa7154b69674961e0f7', @@ -64,8 +105,6 @@ describe('api/erc777/superfluid-info-retriever', () => { // = (1642693617 - 1642692777 = 840 sec) x (385802469135800 - 3858024691358 = 381944444444442 Wei DAIx / sec) requestId: '0288792633ff0ec72a7dbdefb886d2db6cccfa98287320839c2f273c7a4e3ce7e2', token: '0x745861aed1eee363b4aaa5f1994be40b1e05ff90', //fDAIx - block: 10024811, - txHash: '0x0fefa02d90be46eb51a82f02b7a787084c35a895bd833a7c9f0560e315bb4061', }; graphql.request.mockResolvedValue(mockSuperfluidSubgraph[1]); @@ -88,13 +127,46 @@ describe('api/erc777/superfluid-info-retriever', () => { expect(transferEvents[0].amount).toEqual(paymentData.amount); expect(transferEvents[0].name).toEqual('payment'); expect(transferEvents[0].parameters?.to).toEqual(paymentData.to); - expect(transferEvents[0].parameters?.txHash).toEqual(paymentData.txHash); - expect(transferEvents[0].parameters?.block).toEqual(paymentData.block); + }); + + it('should get payment event from SuperFluid via subgraph with 2 requests (Goerli)', async () => { + const paymentData = { + reference: '0xbeefac9474ad7670909da5', + from: '0x9c040e2d6fd83a8b35069aa7154b69674961e0f7', + to: '0x52e5bcfa46393894afcfe6cd98a6761fa692c594', + network: 'goerli', + salt: '0ee84db293a752c6', + amount: '320833333333331260', + // = (1642693617 - 1642692777 = 840 sec) x (385802469135800 - 3858024691358 = 381944444444442 Wei DAIx / sec) + requestId: '0288792633ff0ec72a7dbdefb886d2db6cccfa98287320839c2f273c7a4e3ce7e2', + token: '0x2bf02814ea0b2b155ed47b7cede18caa752940e6', //fDAIx + }; + graphql.request.mockResolvedValue(mockSuperfluidSubgraph[1]); + + const paymentReference = PaymentReferenceCalculator.calculate( + paymentData.requestId, + paymentData.salt, + paymentData.to, + ); + const subgraphReference = `0xbeefac${paymentReference}`; + expect(subgraphReference).toEqual(paymentData.reference); + const graphRetriever = new SuperFluidInfoRetriever( + paymentReference, + paymentData.token, + paymentData.to, + PaymentTypes.EVENTS_NAMES.PAYMENT, + paymentData.network, + ); + const transferEvents = await graphRetriever.getTransferEvents(); + expect(transferEvents).toHaveLength(1); + expect(transferEvents[0].amount).toEqual(paymentData.amount); + expect(transferEvents[0].name).toEqual('payment'); + expect(transferEvents[0].parameters?.to).toEqual(paymentData.to); }); }); describe('on ongoing request', () => { - it('should get payment event from SuperFluid via subgraph with ongoing request', async () => { + it('should get payment event from SuperFluid via subgraph with ongoing request (Rinkeby)', async () => { const paymentData = { reference: '0xbeefac0e87b43bf1e99c82', from: '0x165a26628ac843e97f657e648b004226fbb7f7c5', @@ -105,8 +177,6 @@ describe('api/erc777/superfluid-info-retriever', () => { requestId: '0688792633ff0ec72a7dbdefb886d2db6cccfa98287320839c2f273c7a4e3ce7e2', token: '0x0f1d7c55a2b133e000ea10eec03c774e0d6796e8', //fUSDCx timestamp: 1643041225, - block: 10047970, - txHash: '0xdb44f35aa1490d2ddc8bbe7b82e0e3a370f3bf171a55da7a8a5886996e9c468d', }; graphql.request.mockResolvedValue(mockSuperfluidSubgraph[2]); @@ -131,8 +201,43 @@ describe('api/erc777/superfluid-info-retriever', () => { expect(transferEvents[0].amount).toEqual(timestamp.toString()); expect(transferEvents[0].name).toEqual('payment'); expect(transferEvents[0].parameters?.to).toEqual(paymentData.to); - expect(transferEvents[0].parameters?.txHash).toEqual(paymentData.txHash); - expect(transferEvents[0].parameters?.block).toEqual(paymentData.block); + }); + + it('should get payment event from SuperFluid via subgraph with ongoing request (Goerli)', async () => { + const paymentData = { + reference: '0xbeefac0e87b43bf1e99c82', + from: '0x165a26628ac843e97f657e648b004226fbb7f7c5', + to: '0xe7e6431f08db273d915b49888f0c67ef61802e05', + network: 'goerli', + salt: '0ee84db293a752c6', + amount: '1', + requestId: '0688792633ff0ec72a7dbdefb886d2db6cccfa98287320839c2f273c7a4e3ce7e2', + token: '0x2bf02814ea0b2b155ed47b7cede18caa752940e6', //fDaix + timestamp: 1643041225, + }; + graphql.request.mockResolvedValue(mockSuperfluidSubgraph[2]); + + const paymentReference = PaymentReferenceCalculator.calculate( + paymentData.requestId, + paymentData.salt, + paymentData.to, + ); + const subgraphReference = `0xbeefac${paymentReference}`; + expect(subgraphReference).toEqual(paymentData.reference); + const graphRetriever = new SuperFluidInfoRetriever( + paymentReference, + paymentData.token, + paymentData.to, + PaymentTypes.EVENTS_NAMES.PAYMENT, + paymentData.network, + ); + jest.spyOn(Date, 'now').mockImplementation(() => 1643126596704); + const transferEvents = await graphRetriever.getTransferEvents(); + const timestamp = Math.floor(Date.now() / 1000) - paymentData.timestamp; + expect(transferEvents).toHaveLength(1); + expect(transferEvents[0].amount).toEqual(timestamp.toString()); + expect(transferEvents[0].name).toEqual('payment'); + expect(transferEvents[0].parameters?.to).toEqual(paymentData.to); }); }); }); diff --git a/packages/payment-detection/test/eth/info-retriever.test.ts b/packages/payment-detection/test/eth/info-retriever.test.ts index 0a314c0c79..ab7c3e2451 100644 --- a/packages/payment-detection/test/eth/info-retriever.test.ts +++ b/packages/payment-detection/test/eth/info-retriever.test.ts @@ -51,6 +51,7 @@ describe('api/eth/info-retriever', () => { [ 'mainnet', 'rinkeby', + 'goerli', // 'xdai', // 'sokol', 'fuse', diff --git a/packages/payment-detection/test/eth/input-data.test.ts b/packages/payment-detection/test/eth/input-data.test.ts index 3be6bfd6db..b7d7489698 100644 --- a/packages/payment-detection/test/eth/input-data.test.ts +++ b/packages/payment-detection/test/eth/input-data.test.ts @@ -23,7 +23,7 @@ const mockAdvancedLogic: AdvancedLogicTypes.IAdvancedLogic = { createAddPaymentAddressAction, createAddRefundAddressAction, createCreationAction, - supportedNetworks: ['mainnet', 'rinkeby'], + supportedNetworks: ['mainnet', 'rinkeby', 'goerli'], // inherited from declarative createAddPaymentInstructionAction, createAddRefundInstructionAction, @@ -160,7 +160,7 @@ describe('api/eth/input-data', () => { error: { code: PaymentTypes.BALANCE_ERROR_CODE.NETWORK_NOT_SUPPORTED, message: - /Payment network wrong not supported by ETH payment detection\. Supported networks: mainnet, rinkeby, private.*/, + /Payment network wrong not supported by ETH payment detection\. Supported networks: mainnet, rinkeby, goerli, private.*/, }, events: [], }); @@ -245,4 +245,84 @@ describe('api/eth/input-data', () => { expect(balance.events[0].amount).toBe('80000000000000000'); expect(typeof balance.events[0].timestamp).toBe('number'); }); + + it('can get balance from goerli subgraph', async () => { + const goerliRequest = { + currency: { + network: 'goerli', + type: RequestLogicTypes.CURRENCY.ETH, + value: 'ETH-goerli', + }, + expectedAmount: '80000000000000000', + payee: { + type: 'ethereumAddress', + value: '0x1D274D164937465B7A7259347AD3f1aaEEEaC8e1', + }, + payer: { + type: 'ethereumAddress', + value: '0x5e7D193321A4CCB091038d01755a10d143cb2Dc8', + }, + timestamp: 1620207049, + extensionsData: [ + { + action: 'create', + id: 'pn-eth-input-data', + parameters: { + paymentAddress: '0x8400b234e7B113686bD584af9b1041E5a233E754', + salt: '2334c5f6691a9131', + }, + version: '0.2.0', + }, + ], + extensions: { + 'pn-eth-input-data': { + events: [ + { + name: 'create', + parameters: { + paymentAddress: '0x8400b234e7B113686bD584af9b1041E5a233E754', + salt: '2334c5f6691a9131', + }, + timestamp: 1620207051, + }, + ], + id: 'pn-eth-input-data', + type: 'payment-network', + values: { + paymentAddress: '0x8400b234e7B113686bD584af9b1041E5a233E754', + salt: '2334c5f6691a9131', + }, + version: '0.2.0', + }, + }, + requestId: '0110e7eaba7a3ff2e2239081497308db70e4c66362100d747903ffa5c83d290d5d', + version: '2.0.3', + events: [ + { + actionSigner: { + type: 'ethereumAddress', + value: '0x1D274D164937465B7A7259347AD3f1aaEEEaC8e1', + }, + name: 'create', + parameters: { + expectedAmount: '80000000000000000', + extensionsDataLength: 2, + isSignedRequest: false, + }, + timestamp: 1620207051, + }, + ], + state: 'created', + creator: { + type: 'ethereumAddress', + value: '0x1D274D164937465B7A7259347AD3f1aaEEEaC8e1', + }, + }; + const balance = await ethInputData.getBalance(goerliRequest as RequestLogicTypes.IRequest); + expect(balance.balance).toBe('80000000000000000'); + expect(balance.events).toHaveLength(1); + expect(balance.events[0].name).toBe(PaymentTypes.EVENTS_NAMES.PAYMENT); + expect(balance.events[0].amount).toBe('80000000000000000'); + expect(typeof balance.events[0].timestamp).toBe('number'); + }); }); diff --git a/packages/payment-detection/test/provider.test.ts b/packages/payment-detection/test/provider.test.ts index 1a9fdaf5ff..1ffabb0b9d 100644 --- a/packages/payment-detection/test/provider.test.ts +++ b/packages/payment-detection/test/provider.test.ts @@ -14,13 +14,20 @@ describe('getDefaultProvider', () => { await expect(provider.getNetwork()).resolves.toMatchObject({ chainId: 1 }); }); - it('Can take a standard network', async () => { + it('Can take a standard network (Rinkeby)', async () => { const provider = getDefaultProvider('rinkeby'); expect(provider).toBeInstanceOf(providers.InfuraProvider); await expect(provider.getNetwork()).resolves.toMatchObject({ chainId: 4 }); }); + it('Can take a standard network (Goerli)', async () => { + const provider = getDefaultProvider('goerli'); + + expect(provider).toBeInstanceOf(providers.InfuraProvider); + await expect(provider.getNetwork()).resolves.toMatchObject({ chainId: 5 }); + }); + it('Can take a private network', async () => { const provider = getDefaultProvider('private') as providers.JsonRpcProvider; @@ -71,12 +78,16 @@ describe('getDefaultProvider', () => { ); }); - it('Can override the api key for a standard provider', async () => { - initPaymentDetectionApiKeys({ - infura: 'foo-bar', - }); + expect((getDefaultProvider('goerli') as providers.JsonRpcProvider).connection.url).toMatch( + /https:\/\/goerli\.infura.*/, + ); +}); - const provider = getDefaultProvider() as providers.InfuraProvider; - expect(provider.connection.url).toEqual('https://mainnet.infura.io/v3/foo-bar'); +it('Can override the api key for a standard provider', async () => { + initPaymentDetectionApiKeys({ + infura: 'foo-bar', }); + + const provider = getDefaultProvider() as providers.InfuraProvider; + expect(provider.connection.url).toEqual('https://mainnet.infura.io/v3/foo-bar'); }); diff --git a/packages/smart-contracts/scripts-create2/constructor-args.ts b/packages/smart-contracts/scripts-create2/constructor-args.ts index db9d4952e6..178501ac3a 100644 --- a/packages/smart-contracts/scripts-create2/constructor-args.ts +++ b/packages/smart-contracts/scripts-create2/constructor-args.ts @@ -16,13 +16,13 @@ export const getConstructorArgs = (contract: string, network?: string): string[] getAdminWalletAddress(contract), ]; } - case 'ETHConversionProxy': { + case 'EthConversionProxy': { return [ '0x0000000000000000000000000000000000000000', '0x0000000000000000000000000000000000000000', '0x39e19aa5b69466dfdc313c7cda37cb2a599015cd', ]; - // TODO setupETHConversionProxy + // TODO setupEthConversionProxy } case 'ERC20SwapToConversion': { return [getAdminWalletAddress(contract)]; diff --git a/packages/smart-contracts/scripts-create2/contract-setup/setupEthConversionProxy.ts b/packages/smart-contracts/scripts-create2/contract-setup/setupEthConversionProxy.ts new file mode 100644 index 0000000000..28d1c974d9 --- /dev/null +++ b/packages/smart-contracts/scripts-create2/contract-setup/setupEthConversionProxy.ts @@ -0,0 +1,47 @@ +import { batchPaymentsArtifact } from '../../src/lib'; +import { HardhatRuntimeEnvironmentExtended } from '../types'; +import utils from '@requestnetwork/utils'; +import { updateChainlinkConversionPath, updatePaymentErc20FeeProxy } from './adminTasks'; + +/** + * Updates the values of the batch fees of the BatchPayments contract, if needed + * @param contractAddress address of the BatchPayments Proxy + * @param hre Hardhat runtime environment + */ +export const setupEthConversionProxy = async ( + contractAddress: string, + hre: HardhatRuntimeEnvironmentExtended, +): Promise => { + // Setup contract parameters + const EthConversionProxyContract = new hre.ethers.Contract( + contractAddress, + batchPaymentsArtifact.getContractAbi(), + ); + await Promise.all( + hre.config.xdeploy.networks.map(async (network) => { + let provider; + if (network === 'celo') { + provider = utils.getCeloProvider(); + } else { + provider = utils.getDefaultProvider(network); + } + const wallet = new hre.ethers.Wallet(hre.config.xdeploy.signer, provider); + const signer = wallet.connect(provider); + const EthConversionProxyConnected = await EthConversionProxyContract.connect(signer); + const adminNonce = await signer.getTransactionCount(); + const gasPrice = await provider.getGasPrice(); + + // start from the adminNonce, increase gasPrice if needed + await Promise.all([ + updatePaymentErc20FeeProxy(EthConversionProxyConnected, network, adminNonce, gasPrice), + updateChainlinkConversionPath( + EthConversionProxyConnected, + network, + adminNonce + 1, + gasPrice, + ), + ]); + }), + ); + console.log('Setup for EthConversionProxy successful'); +}; diff --git a/packages/smart-contracts/scripts-create2/contract-setup/setups.ts b/packages/smart-contracts/scripts-create2/contract-setup/setups.ts new file mode 100644 index 0000000000..f650553bf0 --- /dev/null +++ b/packages/smart-contracts/scripts-create2/contract-setup/setups.ts @@ -0,0 +1,35 @@ +import { HardhatRuntimeEnvironmentExtended } from '../types'; +import { setupEthConversionProxy } from './setupEthConversionProxy'; +import { setupBatchPayments } from './setupBatchPayments'; +import { setupERC20SwapToConversion } from './setupERC20SwapToConversion'; + +/** + * Updates the values of either BatchPayments, EthConversionProxy, or ERC20SwapToConversion contract, if needed + * @param contractAddress address of the proxy + * @param hre Hardhat runtime environment + * @param contractName name of the contract + */ +export const setupContract = async ( + contractAddress: string, + hre: HardhatRuntimeEnvironmentExtended, + contractName: string, +): Promise => { + switch (contractName) { + case 'EthConversionProxy': { + await setupEthConversionProxy(contractAddress, hre); + break; + } + case 'ERC20SwapToConversion': { + await setupERC20SwapToConversion(contractAddress, hre); + break; + } + case 'BatchPayments': { + await setupBatchPayments(contractAddress, hre); + break; + } + default: { + console.log('Contract name not found'); + break; + } + } +}; diff --git a/packages/smart-contracts/scripts-create2/deploy.ts b/packages/smart-contracts/scripts-create2/deploy.ts new file mode 100644 index 0000000000..ec15644fac --- /dev/null +++ b/packages/smart-contracts/scripts-create2/deploy.ts @@ -0,0 +1,87 @@ +import { create2ContractDeploymentList, isContractDeployed } from './utils'; +import { IDeploymentParams } from './types'; +import { HardhatRuntimeEnvironmentExtended } from './types'; +import { xdeploy } from './xdeployer'; +import { getConstructorArgs } from './constructor-args'; +import { setupERC20SwapToConversion } from './contract-setup'; +import { setupBatchPayments } from './contract-setup/setupBatchPayments'; + +// Deploys, set up the contracts and returns the address +export const deployOneWithCreate2 = async ( + deploymentParams: IDeploymentParams, + hre: HardhatRuntimeEnvironmentExtended, +): Promise => { + if (!hre.config.xdeploy.networks || hre.config.xdeploy.networks.length === 0) { + throw new Error('Invalid networks'); + } + // Deploy the contract on several network through xdeployer + const deploymentResult = await xdeploy(deploymentParams, hre); + for (let i = 0; i < hre.config.xdeploy.networks.length; i++) { + if (deploymentResult[i].deployed) { + console.log(`${deploymentParams.contract} successfully deployed:`); + console.log(` On network: ${hre.config.xdeploy.networks[i]}`); + console.log(` At address: ${deploymentResult[i].address}`); + console.log(` At block: ${deploymentResult[i].receipt.blockNumber}`); + } else { + if ( + isContractDeployed( + deploymentParams.contract, + hre.config.xdeploy.networks[i], + deploymentResult[i].address, + ) + ) { + console.log(`${deploymentParams.contract} already deployed:`); + console.log(` On network: ${hre.config.xdeploy.networks[i]}`); + console.log(` At address: ${deploymentResult[i].address}`); + } else { + console.log(`${deploymentParams.contract} has not been deployed:`); + console.log(` On network: ${hre.config.xdeploy.networks[i]}`); + console.log(` Error: ${deploymentResult[i].error}`); + console.log( + ` Hint: Check admin wallet balance and that your artifacts are up to date`, + ); + } + } + } + return deploymentResult[0].address; +}; + +export const deployWithCreate2FromList = async ( + hre: HardhatRuntimeEnvironmentExtended, +): Promise => { + for (const contract of create2ContractDeploymentList) { + switch (contract) { + case 'EthereumProxy': + case 'EthereumFeeProxy': + case 'ETHConversionProxy': + case 'ERC20FeeProxy': + case 'Erc20ConversionProxy': { + const constructorArgs = getConstructorArgs(contract); + await deployOneWithCreate2({ contract, constructorArgs }, hre); + break; + } + case 'ERC20SwapToConversion': { + const constructorArgs = getConstructorArgs(contract); + const address = await deployOneWithCreate2({ contract, constructorArgs }, hre); + await setupERC20SwapToConversion(address, hre); + break; + } + case 'ERC20EscrowToPay': { + const network = hre.config.xdeploy.networks[0]; + const constructorArgs = getConstructorArgs(contract, network); + await deployOneWithCreate2({ contract, constructorArgs }, hre); + break; + } + case 'BatchPayments': { + const network = hre.config.xdeploy.networks[0]; + const constructorArgs = getConstructorArgs(contract, network); + const address = await deployOneWithCreate2({ contract, constructorArgs }, hre); + await setupBatchPayments(address, hre); + break; + } + // Other cases to add when necessary + default: + throw new Error(`The contract ${contract} is not to be deployed using the CREATE2 scheme`); + } + } +}; diff --git a/packages/smart-contracts/scripts-create2/verify.ts b/packages/smart-contracts/scripts-create2/verify.ts new file mode 100644 index 0000000000..cc8648e862 --- /dev/null +++ b/packages/smart-contracts/scripts-create2/verify.ts @@ -0,0 +1,64 @@ +import { computeCreate2DeploymentAddress } from './compute-one-address'; +import { getConstructorArgs } from './constructor-args'; +import { HardhatRuntimeEnvironmentExtended } from './types'; +import { IDeploymentParams } from './types'; +import { create2ContractDeploymentList } from './utils'; + +export const verifyOne = async ( + contractAddress: string, + deploymentParams: IDeploymentParams, + hre: HardhatRuntimeEnvironmentExtended, +): Promise => { + try { + await hre.run('verify:verify', { + address: contractAddress, + constructorArguments: deploymentParams.constructorArgs, + }); + } catch (err) { + console.log(err); + } +}; + +export async function VerifyCreate2FromList(hre: HardhatRuntimeEnvironmentExtended): Promise { + try { + let address: string; + await Promise.all( + create2ContractDeploymentList.map(async (contract) => { + switch (contract) { + case 'EthereumProxy': + case 'EthereumFeeProxy': + case 'ETHConversionProxy': + case 'ERC20FeeProxy': + case 'ERC20SwapToConversion': + case 'Erc20ConversionProxy': { + const constructorArgs = getConstructorArgs(contract); + address = await computeCreate2DeploymentAddress({ contract, constructorArgs }, hre); + await verifyOne(address, { contract, constructorArgs }, hre); + break; + } + case 'ERC20EscrowToPay': { + const network = hre.config.xdeploy.networks[0]; + const constructorArgs = getConstructorArgs(contract, network); + address = await computeCreate2DeploymentAddress({ contract, constructorArgs }, hre); + await verifyOne(address, { contract, constructorArgs }, hre); + break; + } + case 'BatchPayments': { + const network = hre.config.xdeploy.networks[0]; + const constructorArgs = getConstructorArgs(contract, network); + address = await computeCreate2DeploymentAddress({ contract, constructorArgs }, hre); + await verifyOne(address, { contract, constructorArgs }, hre); + break; + } + // Other cases to add when necessary + default: + throw new Error( + `The contrat ${contract} is not to be deployed using the CREATE2 scheme`, + ); + } + }), + ); + } catch (e) { + console.error(e); + } +} diff --git a/packages/smart-contracts/src/lib/artifacts/ERC20EscrowToPay/index.ts b/packages/smart-contracts/src/lib/artifacts/ERC20EscrowToPay/index.ts index c53b7cdb19..d968383f92 100644 --- a/packages/smart-contracts/src/lib/artifacts/ERC20EscrowToPay/index.ts +++ b/packages/smart-contracts/src/lib/artifacts/ERC20EscrowToPay/index.ts @@ -22,8 +22,8 @@ export const erc20EscrowToPayArtifact = new ContractArtifact( creationBlockNumber: 10461945, }, goerli: { - address: '0xEbe28A2B7336670Ba752bfEad4a121D2c4FF2464', - creationBlockNumber: 10461945, + address: '0xB6f943d324a70B2883aE890089433345feCe8Be4', + creationBlockNumber: 7091488, }, matic: { address: '0xc7f471F5A8f8b33F131049b1e9A43941CbE31792', From 853d9b63125a17948734927ce331623a1500e4f3 Mon Sep 17 00:00:00 2001 From: Romain TREFAULT Date: Fri, 15 Jul 2022 12:05:14 +0200 Subject: [PATCH 06/85] feat: add goerli --- packages/payment-processor/src/payment/utils.ts | 2 +- packages/payment-processor/test/payment/utils.test.ts | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/packages/payment-processor/src/payment/utils.ts b/packages/payment-processor/src/payment/utils.ts index 355665d174..a0dc0b72df 100644 --- a/packages/payment-processor/src/payment/utils.ts +++ b/packages/payment-processor/src/payment/utils.ts @@ -30,7 +30,7 @@ export function getProvider(): providers.Web3Provider { /** * Utility to get a network provider, depending on the request's currency network. - * Will throw an error if the network isn't mainnet or rinkeby + * Will throw an error if the network isn't mainnet, rinkeby, or goerli * * @param request */ diff --git a/packages/payment-processor/test/payment/utils.test.ts b/packages/payment-processor/test/payment/utils.test.ts index 7f06a01d1e..16edf997d5 100644 --- a/packages/payment-processor/test/payment/utils.test.ts +++ b/packages/payment-processor/test/payment/utils.test.ts @@ -108,6 +108,15 @@ describe('getNetworkProvider', () => { expect(getNetworkProvider(request)).toBeInstanceOf(providers.Provider); }); + it('returns a provider for goerli', () => { + const request: any = { + currencyInfo: { + network: 'goerli', + }, + }; + expect(getNetworkProvider(request)).toBeInstanceOf(providers.Provider); + }); + it('fails for other network', () => { const request: any = { currencyInfo: { From 08f4efeac6e3c5d7fc27478678700c14ac5b111a Mon Sep 17 00:00:00 2001 From: olivier7delf <55892112+olivier7delf@users.noreply.github.com> Date: Mon, 11 Jul 2022 10:58:06 +0200 Subject: [PATCH 07/85] fix(smart-contracts): update batch fees (#873) update batch fees from 1% to .3% --- .../scripts-create2/contract-setup/adminTasks.ts | 6 ++++-- .../scripts-create2/contract-setup/setupBatchPayments.ts | 6 +++--- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/packages/smart-contracts/scripts-create2/contract-setup/adminTasks.ts b/packages/smart-contracts/scripts-create2/contract-setup/adminTasks.ts index b33fe6fcb8..a2c8d6ffca 100644 --- a/packages/smart-contracts/scripts-create2/contract-setup/adminTasks.ts +++ b/packages/smart-contracts/scripts-create2/contract-setup/adminTasks.ts @@ -5,8 +5,8 @@ import { BigNumber } from 'ethers'; // Fees: 0.5% export const REQUEST_SWAP_FEES = 5; -// Batch Fees: 1% -export const BATCH_FEE = 10; +// Batch Fees: .3% +export const BATCH_FEE = 3; export const updateChainlinkConversionPath = async ( contract: any, @@ -57,6 +57,8 @@ export const updateBatchPaymentFees = async ( ): Promise => { const currentFees = await contract.batchFee(); if (currentFees !== BATCH_FEE) { + // Log is useful to have a direct view on was is being updated + console.log(`currentFees: ${currentFees.toString()}, new fees: ${BATCH_FEE}`); await contract.setBatchFee(BATCH_FEE, { nonce: nonce, gasPrice: gasPrice }); } }; diff --git a/packages/smart-contracts/scripts-create2/contract-setup/setupBatchPayments.ts b/packages/smart-contracts/scripts-create2/contract-setup/setupBatchPayments.ts index db3b703bcc..78fa718e08 100644 --- a/packages/smart-contracts/scripts-create2/contract-setup/setupBatchPayments.ts +++ b/packages/smart-contracts/scripts-create2/contract-setup/setupBatchPayments.ts @@ -37,9 +37,9 @@ export const setupBatchPayments = async ( // start from the adminNonce, increase gasPrice if needed await Promise.all([ - updateBatchPaymentFees(batchPaymentConnected, adminNonce, gasPrice), - updatePaymentErc20FeeProxy(batchPaymentConnected, network, adminNonce + 1, gasPrice), - updatePaymentEthFeeProxy(batchPaymentConnected, network, adminNonce + 2, gasPrice), + updateBatchPaymentFees(batchPaymentConnected, adminNonce, gasPrice.mul(2)), + updatePaymentErc20FeeProxy(batchPaymentConnected, network, adminNonce + 1, gasPrice.mul(2)), + updatePaymentEthFeeProxy(batchPaymentConnected, network, adminNonce + 2, gasPrice.mul(2)), ]); }), ); From 01b640a96a9d9ee3462d91c9e14729f9ea494773 Mon Sep 17 00:00:00 2001 From: Bertrand Juglas Date: Tue, 12 Jul 2022 19:04:45 +0200 Subject: [PATCH 08/85] feat: add cancel stream function (#884) --- .../src/payment/erc777-stream.ts | 99 ++++++++++++++----- .../test/payment/erc777-stream.test.ts | 58 +++++++++-- 2 files changed, 126 insertions(+), 31 deletions(-) diff --git a/packages/payment-processor/src/payment/erc777-stream.ts b/packages/payment-processor/src/payment/erc777-stream.ts index 01a627db93..ef25531180 100644 --- a/packages/payment-processor/src/payment/erc777-stream.ts +++ b/packages/payment-processor/src/payment/erc777-stream.ts @@ -10,12 +10,16 @@ import { } from './utils'; import { Framework } from '@superfluid-finance/sdk-core'; -export const resolverAddress = '0x913bbCFea2f347a24cfCA441d483E7CBAc8De3Db'; +export const RESOLVER_ADDRESS = '0x913bbCFea2f347a24cfCA441d483E7CBAc8De3Db'; +// Superfluid payments of requests use the generic field `userData` to index payments. +// Since it's a multi-purpose field, payments will use a fix-prefix heading the payment reference, +// in order to speed up the indexing and payment detection. +export const USERDATA_PREFIX = '0xbeefac'; /** * Processes a transaction to pay an ERC777 stream Request. * @param request - * @param signerOrProvider the Web3 provider, or signer. Defaults to window.ethereum. + * @param signer the Web3 signer. Defaults to window.ethereum. * @param overrides optionally, override default transaction values, like gas. */ export async function payErc777StreamRequest( @@ -28,35 +32,84 @@ export async function payErc777StreamRequest( throw new Error('Not a supported ERC777 payment network request'); } validateRequest(request, PaymentTypes.PAYMENT_NETWORK_ID.ERC777_STREAM); - const networkName = - request.currencyInfo.network === 'private' ? 'custom' : request.currencyInfo.network; - const sf = await Framework.create({ - networkName, - provider: signer.provider ?? getProvider(), - dataMode: request.currencyInfo.network === 'private' ? 'WEB3_ONLY' : undefined, - resolverAddress: request.currencyInfo.network === 'private' ? resolverAddress : undefined, - protocolReleaseVersion: request.currencyInfo.network === 'private' ? 'test' : undefined, - }); - const superSigner = sf.createSigner({ - signer: signer, - provider: signer.provider, - }); - const superToken = await sf.loadSuperToken(request.currencyInfo.value); + const sf = await getSuperFluidFramework(request, signer); // FIXME: according to specs PR https://github.com/RequestNetwork/requestNetwork/pull/688 // in file packages/advanced-logic/specs/payment-network-erc777-stream-0.1.0.md + // Below are the SF actions to add in the BatchCall: // - use expectedStartDate to compute offset between start of invoicing and start of streaming // - start fee streaming + const streamPayOp = await getStartStreamOp(sf, request, overrides); + const batchCall = sf.batchCall([streamPayOp]); + return batchCall.exec(signer); +} + +/** + * Processes a transaction to complete an ERC777 stream paying a Request. + * @param request + * @param signer the Web3 signer. Defaults to window.ethereum. + * @param overrides optionally, override default transaction values, like gas. + */ +export async function completeErc777StreamRequest( + request: ClientTypes.IRequestData, + signer: Signer, + overrides?: Overrides, +): Promise { + const id = getPaymentNetworkExtension(request)?.id; + if (id !== ExtensionTypes.ID.PAYMENT_NETWORK_ERC777_STREAM) { + throw new Error('Not a supported ERC777 payment network request'); + } + validateRequest(request, PaymentTypes.PAYMENT_NETWORK_ID.ERC777_STREAM); + const sf = await getSuperFluidFramework(request, signer); + // FIXME: according to specs PR https://github.com/RequestNetwork/requestNetwork/pull/688 + // in file packages/advanced-logic/specs/payment-network-erc777-stream-0.1.0.md + // Below are the SF actions to add in the BatchCall : + // - use expectedEndDate to compute offset between stop of invoicing and stop of streaming + // - stop fee streaming + const streamPayOp = await getStopStreamOp(sf, signer, request, overrides); + const batchCall = sf.batchCall([streamPayOp]); + return batchCall.exec(signer); +} + +async function getSuperFluidFramework(request: ClientTypes.IRequestData, signer: Signer) { + const isNetworkPrivate = request.currencyInfo.network === 'private'; + const networkName = isNetworkPrivate ? 'custom' : request.currencyInfo.network; + return await Framework.create({ + networkName, + provider: signer.provider ?? getProvider(), + dataMode: isNetworkPrivate ? 'WEB3_ONLY' : undefined, + resolverAddress: isNetworkPrivate ? RESOLVER_ADDRESS : undefined, + protocolReleaseVersion: isNetworkPrivate ? 'test' : undefined, + }); +} +async function getStartStreamOp( + sf: Framework, + request: ClientTypes.IRequestData, + overrides?: Overrides, +) { + const superToken = await sf.loadSuperToken(request.currencyInfo.value); const { paymentReference, paymentAddress, expectedFlowRate } = getRequestPaymentValues(request); - // Superfluid payments of requests use the generic field `userData` to index payments. - // Since it's a multi-purpose field, payments will use a fix-prefix heading the payment reference, - // in order to speed up the indexing and payment detection. - const streamPayOp = sf.cfaV1.createFlow({ + return sf.cfaV1.createFlow({ flowRate: expectedFlowRate ?? '0', receiver: paymentAddress, superToken: superToken.address, - userData: `0xbeefac${paymentReference}`, + userData: `${USERDATA_PREFIX}${paymentReference}`, + overrides: overrides, + }); +} + +async function getStopStreamOp( + sf: Framework, + signer: Signer, + request: ClientTypes.IRequestData, + overrides?: Overrides, +) { + const superToken = await sf.loadSuperToken(request.currencyInfo.value); + const { paymentReference, paymentAddress } = getRequestPaymentValues(request); + return sf.cfaV1.deleteFlow({ + superToken: superToken.address, + sender: await signer.getAddress(), + receiver: paymentAddress, + userData: `${USERDATA_PREFIX}${paymentReference}`, overrides: overrides, }); - const batchCall = sf.batchCall([streamPayOp]); - return batchCall.exec(superSigner); } diff --git a/packages/payment-processor/test/payment/erc777-stream.test.ts b/packages/payment-processor/test/payment/erc777-stream.test.ts index 605e3f03d8..644e71225f 100644 --- a/packages/payment-processor/test/payment/erc777-stream.test.ts +++ b/packages/payment-processor/test/payment/erc777-stream.test.ts @@ -10,7 +10,11 @@ import { } from '@requestnetwork/types'; import Utils from '@requestnetwork/utils'; -import { payErc777StreamRequest, resolverAddress } from '../../src/payment/erc777-stream'; +import { + completeErc777StreamRequest, + payErc777StreamRequest, + RESOLVER_ADDRESS, +} from '../../src/payment/erc777-stream'; import { getRequestPaymentValues } from '../../src/payment/utils'; const daiABI = require('../abis/fDAIABI'); @@ -120,8 +124,8 @@ describe('erc777-stream', () => { }); }); - describe('payErc777StreamRequest', () => { - it('should pay an ERC777 request with fees', async () => { + describe('Streams management', () => { + it('payErc777StreamRequest should pay an ERC777 request', async () => { let tx; let confirmedTx; // initialize the superfluid framework...put custom and web3 only bc we are using ganache locally @@ -129,7 +133,7 @@ describe('erc777-stream', () => { networkName: 'custom', provider, dataMode: 'WEB3_ONLY', - resolverAddress: resolverAddress, + resolverAddress: RESOLVER_ADDRESS, protocolReleaseVersion: 'test', }); @@ -183,18 +187,56 @@ describe('erc777-stream', () => { expect(confirmedTx.status).toBe(1); expect(tx.hash).not.toBeUndefined(); - const wFlowRate = await sf.cfaV1.getNetFlow({ + const walletFlowRate = await sf.cfaV1.getNetFlow({ + superToken: daix.address, + account: wallet.address, + providerOrSigner: provider, + }); + expect(walletFlowRate).toBe(`-${expectedFlowRate}`); + const paymentFlowRate = await sf.cfaV1.getNetFlow({ + superToken: daix.address, + account: paymentAddress, + providerOrSigner: provider, + }); + expect(paymentFlowRate).toBe(expectedFlowRate); + }); + + it('completeErc777StreamRequest should complete an ERC777 request', async () => { + let tx; + let confirmedTx; + // initialize the superfluid framework...put custom and web3 only bc we are using ganache locally + const sf = await Framework.create({ + networkName: 'custom', + provider, + dataMode: 'WEB3_ONLY', + resolverAddress: RESOLVER_ADDRESS, + protocolReleaseVersion: 'test', + }); + + // use the framework to get the SuperToken + const daix = await sf.loadSuperToken('fDAIx'); + + // wait 2 seconds of streaming to avoid failing + await new Promise((r) => setTimeout(r, 2000)); + + // Stopping fDAIX stream request + tx = await completeErc777StreamRequest(validRequest, wallet); + confirmedTx = await tx.wait(1); + expect(confirmedTx.status).toBe(1); + expect(tx.hash).not.toBeUndefined(); + + const walletFlowRate = await sf.cfaV1.getNetFlow({ superToken: daix.address, account: wallet.address, providerOrSigner: provider, }); - expect(wFlowRate).toBe(`-${expectedFlowRate}`); - const pFlowRate = await sf.cfaV1.getNetFlow({ + expect(walletFlowRate).toBe('0'); + const paymentFlowRate = await sf.cfaV1.getNetFlow({ superToken: daix.address, account: paymentAddress, providerOrSigner: provider, }); - expect(pFlowRate).toBe(expectedFlowRate); + expect(paymentFlowRate).toBe('0'); }); }); }); From d0390afc79545bb56607ca359eb292bd6dc8a211 Mon Sep 17 00:00:00 2001 From: Darko Kolev Date: Fri, 15 Jul 2022 11:33:39 +0200 Subject: [PATCH 09/85] fixed ethFeeProxy subgraph goerli test --- .../test/erc20/thegraph-info-retriever.test.ts | 13 +++++++------ .../src/lib/artifacts/EthConversionProxy/index.ts | 4 ++++ .../src/lib/artifacts/EthereumProxy/index.ts | 4 ++++ 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/packages/payment-detection/test/erc20/thegraph-info-retriever.test.ts b/packages/payment-detection/test/erc20/thegraph-info-retriever.test.ts index c641ed0feb..a9af030300 100644 --- a/packages/payment-detection/test/erc20/thegraph-info-retriever.test.ts +++ b/packages/payment-detection/test/erc20/thegraph-info-retriever.test.ts @@ -97,14 +97,14 @@ describe('api/erc20/thegraph-info-retriever', () => { it('should get payment event from ethFeeProxy via subgraph', async () => { const paymentData = { reference: '0x6c93723bc5f82e6fbb2ea994bf0fb572fa19f7a2a3146065e21752b95668efe5', - txHash: '0x3e2d6cc2534b1d340ba2954f34e6cc819d6da64ff76863ea89c6d34b15d13c97', - from: '0x186e7fe6c34ea0eca7f9c2fd29651fc0443e3f29', + txHash: '0x29a55b7f978a902275746f6eb930abf608dc77c0592fce9cf6c326128fcf7493', + from: '0xBc9643B7Bd7c8621F4a68280433796484b9E525d', to: '0x5000ee9fb9c96a2a09d8efb695ac21d6c429ff11', network: 'goerli', salt: '0ee84db293a752c6', - amount: '30000000000000', + amount: '600000000000000', requestId: '0188791633ff0ec72a7dbdefb886d2db6cccfa98287320839c2f173c7a4e3ce7e1', - block: 9606098, + block: 7230236, feeAddress: '0x5000EE9FB9c96A2A09D8efB695aC21D6C429fF11', feeAmount: '0', }; @@ -127,7 +127,7 @@ describe('api/erc20/thegraph-info-retriever', () => { const allNetworkEvents = await graphRetriever.getTransferEvents(); const transferEvents = allNetworkEvents.paymentEvents; // expect(transferEvents).toHaveLength(1); - expect(transferEvents[0].amount).toEqual('30000000000000'); + expect(transferEvents[0].amount).toEqual('600000000000000'); expect(transferEvents[0].name).toEqual('payment'); expect(transferEvents[0].parameters?.to).toEqual(paymentData.to); expect(transferEvents[0].parameters?.txHash).toEqual(paymentData.txHash); @@ -136,7 +136,8 @@ describe('api/erc20/thegraph-info-retriever', () => { expect(transferEvents[0].parameters?.feeAmount).toEqual(paymentData.feeAmount); }); - it('should get payment event from ethFeeConversionProxy via subgraph', async () => { + // doesn't work because chainlink doesn't have oracles on goerli + it.skip('should get payment event from ethFeeConversionProxy via subgraph', async () => { const paymentData = { reference: '0x6c93723bc5f82e6fbb2ea994bf0fb572fa19f7a2a3146065e21752b95668efe5', txHash: '0x2f7b4752aa259166c038cd9073056c5979760cf0eea55d093fca2095c229313b', diff --git a/packages/smart-contracts/src/lib/artifacts/EthConversionProxy/index.ts b/packages/smart-contracts/src/lib/artifacts/EthConversionProxy/index.ts index 01ced6caa8..c9720fa6d9 100644 --- a/packages/smart-contracts/src/lib/artifacts/EthConversionProxy/index.ts +++ b/packages/smart-contracts/src/lib/artifacts/EthConversionProxy/index.ts @@ -55,6 +55,10 @@ export const ethConversionArtifact = new ContractArtifact( address: '0x7Ebf48a26253810629C191b56C3212Fd0D211c26', creationBlockNumber: 10023415, }, + goerli: { + address: '0xED250D9219EB93098Bb67aEbc992963172B9c8DA', + creationBlockNumber: 7108896, + }, fantom: { address: '0x7Ebf48a26253810629C191b56C3212Fd0D211c26', creationBlockNumber: 28552915, diff --git a/packages/smart-contracts/src/lib/artifacts/EthereumProxy/index.ts b/packages/smart-contracts/src/lib/artifacts/EthereumProxy/index.ts index 527cedbb78..2602944bd0 100644 --- a/packages/smart-contracts/src/lib/artifacts/EthereumProxy/index.ts +++ b/packages/smart-contracts/src/lib/artifacts/EthereumProxy/index.ts @@ -136,6 +136,10 @@ export const ethereumProxyArtifact = new ContractArtifact( address: '0x322F0037d272E980984F89E94Aae43BD0FC065E6', creationBlockNumber: 10307566, }, + goerli: { + address: '0x171Ee0881407d4c0C11eA1a2FB7D5b4cdED71e6e', + creationBlockNumber: 7069045, + }, fantom: { address: '0x322F0037d272E980984F89E94Aae43BD0FC065E6', creationBlockNumber: 33496209, From bbe2a4a96344d9f15f8bfebd3e148235dd9ac784 Mon Sep 17 00:00:00 2001 From: Romain TREFAULT Date: Fri, 15 Jul 2022 14:00:10 +0200 Subject: [PATCH 10/85] refactor: move goerli to the newest versions --- .../src/lib/artifacts/ChainlinkConversionPath/index.ts | 8 ++++---- .../src/lib/artifacts/ERC20EscrowToPay/index.ts | 4 ++-- .../src/lib/artifacts/ERC20SwapToPay/index.ts | 8 ++++---- .../src/lib/artifacts/EthConversionProxy/index.ts | 4 ---- .../src/lib/artifacts/EthereumFeeProxy/index.ts | 8 ++++---- .../src/lib/artifacts/EthereumProxy/index.ts | 4 ---- 6 files changed, 14 insertions(+), 22 deletions(-) diff --git a/packages/smart-contracts/src/lib/artifacts/ChainlinkConversionPath/index.ts b/packages/smart-contracts/src/lib/artifacts/ChainlinkConversionPath/index.ts index ee0761fde6..caaf56a337 100644 --- a/packages/smart-contracts/src/lib/artifacts/ChainlinkConversionPath/index.ts +++ b/packages/smart-contracts/src/lib/artifacts/ChainlinkConversionPath/index.ts @@ -22,10 +22,6 @@ export const chainlinkConversionPath = new ContractArtifact( creationBlockNumber: 10461945, }, goerli: { - address: '0xB6f943d324a70B2883aE890089433345feCe8Be4', - creationBlockNumber: 7091488, + address: '0xd2777001fD7D89331D8E87eC439f78079179322b', + creationBlockNumber: 7230322, }, matic: { address: '0xc7f471F5A8f8b33F131049b1e9A43941CbE31792', diff --git a/packages/smart-contracts/src/lib/artifacts/ERC20SwapToPay/index.ts b/packages/smart-contracts/src/lib/artifacts/ERC20SwapToPay/index.ts index ad9a3ff5eb..9e5f975c06 100644 --- a/packages/smart-contracts/src/lib/artifacts/ERC20SwapToPay/index.ts +++ b/packages/smart-contracts/src/lib/artifacts/ERC20SwapToPay/index.ts @@ -21,10 +21,6 @@ export const erc20SwapToPayArtifact = new ContractArtifact( address: '0xb674e3d228e631594D8fd4BF947E1811288bf836', creationBlockNumber: 7363204, }, - goerli: { - address: '0x0Ef49176A87Adcc88bD5125126C6a6c23a28303C', - creationBlockNumber: 7109102, - }, }, }, '0.3.0': { @@ -42,6 +38,10 @@ export const erc20SwapToPayArtifact = new ContractArtifact( address: '0x1B5077Ca852d39CDDeDaF45FAF1235841854420b', creationBlockNumber: 7408086, }, + goerli: { + address: '0x0Ef49176A87Adcc88bD5125126C6a6c23a28303C', + creationBlockNumber: 7109102, + }, bsc: { address: '0x75740D9b5cA3BCCb356CA7f0D0dB71aBE427a835', creationBlockNumber: 16165020, diff --git a/packages/smart-contracts/src/lib/artifacts/EthConversionProxy/index.ts b/packages/smart-contracts/src/lib/artifacts/EthConversionProxy/index.ts index c9720fa6d9..16c2dc5e21 100644 --- a/packages/smart-contracts/src/lib/artifacts/EthConversionProxy/index.ts +++ b/packages/smart-contracts/src/lib/artifacts/EthConversionProxy/index.ts @@ -18,10 +18,6 @@ export const ethConversionArtifact = new ContractArtifact( address: '0xCa3353a15fCb5C83a1Ff64BFf055781aC5c4d2F4', creationBlockNumber: 9447194, }, - goerli: { - address: '0xED250D9219EB93098Bb67aEbc992963172B9c8DA', - creationBlockNumber: 7108896, - }, fantom: { address: '0xCa3353a15fCb5C83a1Ff64BFf055781aC5c4d2F4', creationBlockNumber: 20066436, diff --git a/packages/smart-contracts/src/lib/artifacts/EthereumFeeProxy/index.ts b/packages/smart-contracts/src/lib/artifacts/EthereumFeeProxy/index.ts index 06dd436767..8b0d26e0b0 100644 --- a/packages/smart-contracts/src/lib/artifacts/EthereumFeeProxy/index.ts +++ b/packages/smart-contracts/src/lib/artifacts/EthereumFeeProxy/index.ts @@ -17,10 +17,6 @@ export const ethereumFeeProxyArtifact = new ContractArtifact( address: '0xC6E23a20C0a1933ACC8E30247B5D1e2215796C1F', creationBlockNumber: 9447193, }, - goerli: { - address: '0xe11BF2fDA23bF0A98365e1A4c04A87C9339e8687', - creationBlockNumber: 7091386, - }, fantom: { address: '0xC6E23a20C0a1933ACC8E30247B5D1e2215796C1F', creationBlockNumber: 20066431, @@ -66,6 +62,10 @@ export const ethereumFeeProxyArtifact = new ContractArtifact( address: '0xfCFBcfc4f5A421089e3Df45455F7f4985FE2D6a8', creationBlockNumber: 10307582, }, + goerli: { + address: '0xe11BF2fDA23bF0A98365e1A4c04A87C9339e8687', + creationBlockNumber: 7091386, + }, fantom: { address: '0xfCFBcfc4f5A421089e3Df45455F7f4985FE2D6a8', creationBlockNumber: 33495801, diff --git a/packages/smart-contracts/src/lib/artifacts/EthereumProxy/index.ts b/packages/smart-contracts/src/lib/artifacts/EthereumProxy/index.ts index 2602944bd0..b318578e54 100644 --- a/packages/smart-contracts/src/lib/artifacts/EthereumProxy/index.ts +++ b/packages/smart-contracts/src/lib/artifacts/EthereumProxy/index.ts @@ -21,10 +21,6 @@ export const ethereumProxyArtifact = new ContractArtifact( address: '0x9c6c7817e3679c4b3f9ef9486001eae5aaed25ff', creationBlockNumber: 5955681, }, - goerli: { - address: '0x171Ee0881407d4c0C11eA1a2FB7D5b4cdED71e6e', - creationBlockNumber: 7069045, - }, xdai: { address: '0x27c60BE17e853c47A9F1d280B05365f483c2dFAF', creationBlockNumber: 18326895, From 666b7f41ca0fdb7ff2430ab7b141c3ae5e717a70 Mon Sep 17 00:00:00 2001 From: Romain TREFAULT Date: Fri, 15 Jul 2022 14:00:30 +0200 Subject: [PATCH 11/85] refactor: move goerli to the newest versions --- .../src/lib/artifacts/ERC20FeeProxy/index.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/smart-contracts/src/lib/artifacts/ERC20FeeProxy/index.ts b/packages/smart-contracts/src/lib/artifacts/ERC20FeeProxy/index.ts index dd64ee33e5..a921c2f194 100644 --- a/packages/smart-contracts/src/lib/artifacts/ERC20FeeProxy/index.ts +++ b/packages/smart-contracts/src/lib/artifacts/ERC20FeeProxy/index.ts @@ -21,10 +21,6 @@ export const erc20FeeProxyArtifact = new ContractArtifact( address: '0xda46309973bFfDdD5a10cE12c44d2EE266f45A44', creationBlockNumber: 7118080, }, - goerli: { - address: '0x399F5EE127ce7432E4921a61b8CF52b0af52cbfE', - creationBlockNumber: 7091472, - }, matic: { address: '0x2171a0dc12a9E5b1659feF2BB20E54c84Fa7dB0C', creationBlockNumber: 14163521, @@ -67,6 +63,10 @@ export const erc20FeeProxyArtifact = new ContractArtifact( address: '0xda46309973bFfDdD5a10cE12c44d2EE266f45A44', creationBlockNumber: 7118080, }, + goerli: { + address: '0x399F5EE127ce7432E4921a61b8CF52b0af52cbfE', + creationBlockNumber: 7091472, + }, matic: { address: '0x0DfbEe143b42B41eFC5A6F87bFD1fFC78c2f0aC9', creationBlockNumber: 17427742, From 8e83c98fa7c7442830a4a6d3d6aa2fcb4904a510 Mon Sep 17 00:00:00 2001 From: Darko Kolev Date: Mon, 18 Jul 2022 13:44:28 +0200 Subject: [PATCH 12/85] new escrow deployed on mainnet, rinkeby, goerli, matic and fuse --- .../src/lib/artifacts/ERC20EscrowToPay/index.ts | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/smart-contracts/src/lib/artifacts/ERC20EscrowToPay/index.ts b/packages/smart-contracts/src/lib/artifacts/ERC20EscrowToPay/index.ts index 9f2ed78967..12d294bef8 100644 --- a/packages/smart-contracts/src/lib/artifacts/ERC20EscrowToPay/index.ts +++ b/packages/smart-contracts/src/lib/artifacts/ERC20EscrowToPay/index.ts @@ -14,24 +14,24 @@ export const erc20EscrowToPayArtifact = new ContractArtifact( creationBlockNumber: 0, }, mainnet: { - address: '0xa015c141C02996EcE6410646DA3D07d70091c577', - creationBlockNumber: 14884007, + address: '0x7DfD5955a1Ed6Bf74ccF8e24FF53E0a9A7e9F477', + creationBlockNumber: 15146972, }, rinkeby: { - address: '0xEbe28A2B7336670Ba752bfEad4a121D2c4FF2464', - creationBlockNumber: 10461945, + address: '0x2b487A3251aCC34ae95E4f5aA7fdcD2C7447B42e', + creationBlockNumber: 11028247, }, goerli: { address: '0xd2777001fD7D89331D8E87eC439f78079179322b', creationBlockNumber: 7230322, }, matic: { - address: '0xc7f471F5A8f8b33F131049b1e9A43941CbE31792', - creationBlockNumber: 29821569, + address: '0x937Db37ffb67083242fbC6AdD472146bF10E01ec', + creationBlockNumber: 30751595, }, fuse: { - address: '0xa015c141C02996EcE6410646DA3D07d70091c577', - creationBlockNumber: 17328459, + address: '0x4BA012eae4d64da79Bd6bcdBa366803fCe701A4C', + creationBlockNumber: 18086337, }, celo: { address: '0xa015c141C02996EcE6410646DA3D07d70091c577', From 0bd6171319c96f5588111904d5ca13aab2404347 Mon Sep 17 00:00:00 2001 From: Darko Kolev Date: Thu, 28 Jul 2022 10:05:11 +0200 Subject: [PATCH 13/85] refactor: contract setup compression fix (#888) --- packages/smart-contracts/hardhat.config.ts | 4 +- .../contract-setup/setupETHConversionProxy.ts | 47 ++++++++++ .../scripts-create2/deploy-one.ts | 87 ------------------- .../deploy-request-deployer.ts | 2 +- .../scripts-create2/verify-one.ts | 64 -------------- .../ChainlinkConversionPath/index.ts | 4 + .../lib/artifacts/ERC20EscrowToPay/index.ts | 4 + .../src/lib/artifacts/ERC20FeeProxy/index.ts | 4 + .../src/lib/artifacts/ERC20SwapToPay/index.ts | 4 + .../lib/artifacts/EthConversionProxy/index.ts | 4 + .../lib/artifacts/EthereumFeeProxy/index.ts | 4 + .../src/lib/artifacts/EthereumProxy/index.ts | 4 + 12 files changed, 78 insertions(+), 154 deletions(-) create mode 100644 packages/smart-contracts/scripts-create2/contract-setup/setupETHConversionProxy.ts delete mode 100644 packages/smart-contracts/scripts-create2/deploy-one.ts delete mode 100644 packages/smart-contracts/scripts-create2/verify-one.ts diff --git a/packages/smart-contracts/hardhat.config.ts b/packages/smart-contracts/hardhat.config.ts index 514bb2b494..f12fdc0d4b 100644 --- a/packages/smart-contracts/hardhat.config.ts +++ b/packages/smart-contracts/hardhat.config.ts @@ -11,8 +11,8 @@ import { checkCreate2Deployer } from './scripts-create2/check-deployer'; import { deployDeployer } from './scripts-create2/deploy-request-deployer'; import { HardhatRuntimeEnvironmentExtended } from './scripts-create2/types'; import { computeCreate2DeploymentAddressesFromList } from './scripts-create2/compute-one-address'; -import { VerifyCreate2FromList } from './scripts-create2/verify-one'; -import { deployWithCreate2FromList } from './scripts-create2/deploy-one'; +import { VerifyCreate2FromList } from './scripts-create2/verify'; +import { deployWithCreate2FromList } from './scripts-create2/deploy'; import utils from '@requestnetwork/utils'; config(); diff --git a/packages/smart-contracts/scripts-create2/contract-setup/setupETHConversionProxy.ts b/packages/smart-contracts/scripts-create2/contract-setup/setupETHConversionProxy.ts new file mode 100644 index 0000000000..28d1c974d9 --- /dev/null +++ b/packages/smart-contracts/scripts-create2/contract-setup/setupETHConversionProxy.ts @@ -0,0 +1,47 @@ +import { batchPaymentsArtifact } from '../../src/lib'; +import { HardhatRuntimeEnvironmentExtended } from '../types'; +import utils from '@requestnetwork/utils'; +import { updateChainlinkConversionPath, updatePaymentErc20FeeProxy } from './adminTasks'; + +/** + * Updates the values of the batch fees of the BatchPayments contract, if needed + * @param contractAddress address of the BatchPayments Proxy + * @param hre Hardhat runtime environment + */ +export const setupEthConversionProxy = async ( + contractAddress: string, + hre: HardhatRuntimeEnvironmentExtended, +): Promise => { + // Setup contract parameters + const EthConversionProxyContract = new hre.ethers.Contract( + contractAddress, + batchPaymentsArtifact.getContractAbi(), + ); + await Promise.all( + hre.config.xdeploy.networks.map(async (network) => { + let provider; + if (network === 'celo') { + provider = utils.getCeloProvider(); + } else { + provider = utils.getDefaultProvider(network); + } + const wallet = new hre.ethers.Wallet(hre.config.xdeploy.signer, provider); + const signer = wallet.connect(provider); + const EthConversionProxyConnected = await EthConversionProxyContract.connect(signer); + const adminNonce = await signer.getTransactionCount(); + const gasPrice = await provider.getGasPrice(); + + // start from the adminNonce, increase gasPrice if needed + await Promise.all([ + updatePaymentErc20FeeProxy(EthConversionProxyConnected, network, adminNonce, gasPrice), + updateChainlinkConversionPath( + EthConversionProxyConnected, + network, + adminNonce + 1, + gasPrice, + ), + ]); + }), + ); + console.log('Setup for EthConversionProxy successful'); +}; diff --git a/packages/smart-contracts/scripts-create2/deploy-one.ts b/packages/smart-contracts/scripts-create2/deploy-one.ts deleted file mode 100644 index ec15644fac..0000000000 --- a/packages/smart-contracts/scripts-create2/deploy-one.ts +++ /dev/null @@ -1,87 +0,0 @@ -import { create2ContractDeploymentList, isContractDeployed } from './utils'; -import { IDeploymentParams } from './types'; -import { HardhatRuntimeEnvironmentExtended } from './types'; -import { xdeploy } from './xdeployer'; -import { getConstructorArgs } from './constructor-args'; -import { setupERC20SwapToConversion } from './contract-setup'; -import { setupBatchPayments } from './contract-setup/setupBatchPayments'; - -// Deploys, set up the contracts and returns the address -export const deployOneWithCreate2 = async ( - deploymentParams: IDeploymentParams, - hre: HardhatRuntimeEnvironmentExtended, -): Promise => { - if (!hre.config.xdeploy.networks || hre.config.xdeploy.networks.length === 0) { - throw new Error('Invalid networks'); - } - // Deploy the contract on several network through xdeployer - const deploymentResult = await xdeploy(deploymentParams, hre); - for (let i = 0; i < hre.config.xdeploy.networks.length; i++) { - if (deploymentResult[i].deployed) { - console.log(`${deploymentParams.contract} successfully deployed:`); - console.log(` On network: ${hre.config.xdeploy.networks[i]}`); - console.log(` At address: ${deploymentResult[i].address}`); - console.log(` At block: ${deploymentResult[i].receipt.blockNumber}`); - } else { - if ( - isContractDeployed( - deploymentParams.contract, - hre.config.xdeploy.networks[i], - deploymentResult[i].address, - ) - ) { - console.log(`${deploymentParams.contract} already deployed:`); - console.log(` On network: ${hre.config.xdeploy.networks[i]}`); - console.log(` At address: ${deploymentResult[i].address}`); - } else { - console.log(`${deploymentParams.contract} has not been deployed:`); - console.log(` On network: ${hre.config.xdeploy.networks[i]}`); - console.log(` Error: ${deploymentResult[i].error}`); - console.log( - ` Hint: Check admin wallet balance and that your artifacts are up to date`, - ); - } - } - } - return deploymentResult[0].address; -}; - -export const deployWithCreate2FromList = async ( - hre: HardhatRuntimeEnvironmentExtended, -): Promise => { - for (const contract of create2ContractDeploymentList) { - switch (contract) { - case 'EthereumProxy': - case 'EthereumFeeProxy': - case 'ETHConversionProxy': - case 'ERC20FeeProxy': - case 'Erc20ConversionProxy': { - const constructorArgs = getConstructorArgs(contract); - await deployOneWithCreate2({ contract, constructorArgs }, hre); - break; - } - case 'ERC20SwapToConversion': { - const constructorArgs = getConstructorArgs(contract); - const address = await deployOneWithCreate2({ contract, constructorArgs }, hre); - await setupERC20SwapToConversion(address, hre); - break; - } - case 'ERC20EscrowToPay': { - const network = hre.config.xdeploy.networks[0]; - const constructorArgs = getConstructorArgs(contract, network); - await deployOneWithCreate2({ contract, constructorArgs }, hre); - break; - } - case 'BatchPayments': { - const network = hre.config.xdeploy.networks[0]; - const constructorArgs = getConstructorArgs(contract, network); - const address = await deployOneWithCreate2({ contract, constructorArgs }, hre); - await setupBatchPayments(address, hre); - break; - } - // Other cases to add when necessary - default: - throw new Error(`The contract ${contract} is not to be deployed using the CREATE2 scheme`); - } - } -}; diff --git a/packages/smart-contracts/scripts-create2/deploy-request-deployer.ts b/packages/smart-contracts/scripts-create2/deploy-request-deployer.ts index 1138f15686..34fbdcc373 100644 --- a/packages/smart-contracts/scripts-create2/deploy-request-deployer.ts +++ b/packages/smart-contracts/scripts-create2/deploy-request-deployer.ts @@ -1,6 +1,6 @@ import { HardhatRuntimeEnvironment } from 'hardhat/types'; import { HardhatRuntimeEnvironmentExtended } from './types'; -import { verifyOne } from './verify-one'; +import { verifyOne } from './verify'; // Deploys, set up the contracts export async function deployDeployer(hre: HardhatRuntimeEnvironment): Promise { diff --git a/packages/smart-contracts/scripts-create2/verify-one.ts b/packages/smart-contracts/scripts-create2/verify-one.ts deleted file mode 100644 index cc8648e862..0000000000 --- a/packages/smart-contracts/scripts-create2/verify-one.ts +++ /dev/null @@ -1,64 +0,0 @@ -import { computeCreate2DeploymentAddress } from './compute-one-address'; -import { getConstructorArgs } from './constructor-args'; -import { HardhatRuntimeEnvironmentExtended } from './types'; -import { IDeploymentParams } from './types'; -import { create2ContractDeploymentList } from './utils'; - -export const verifyOne = async ( - contractAddress: string, - deploymentParams: IDeploymentParams, - hre: HardhatRuntimeEnvironmentExtended, -): Promise => { - try { - await hre.run('verify:verify', { - address: contractAddress, - constructorArguments: deploymentParams.constructorArgs, - }); - } catch (err) { - console.log(err); - } -}; - -export async function VerifyCreate2FromList(hre: HardhatRuntimeEnvironmentExtended): Promise { - try { - let address: string; - await Promise.all( - create2ContractDeploymentList.map(async (contract) => { - switch (contract) { - case 'EthereumProxy': - case 'EthereumFeeProxy': - case 'ETHConversionProxy': - case 'ERC20FeeProxy': - case 'ERC20SwapToConversion': - case 'Erc20ConversionProxy': { - const constructorArgs = getConstructorArgs(contract); - address = await computeCreate2DeploymentAddress({ contract, constructorArgs }, hre); - await verifyOne(address, { contract, constructorArgs }, hre); - break; - } - case 'ERC20EscrowToPay': { - const network = hre.config.xdeploy.networks[0]; - const constructorArgs = getConstructorArgs(contract, network); - address = await computeCreate2DeploymentAddress({ contract, constructorArgs }, hre); - await verifyOne(address, { contract, constructorArgs }, hre); - break; - } - case 'BatchPayments': { - const network = hre.config.xdeploy.networks[0]; - const constructorArgs = getConstructorArgs(contract, network); - address = await computeCreate2DeploymentAddress({ contract, constructorArgs }, hre); - await verifyOne(address, { contract, constructorArgs }, hre); - break; - } - // Other cases to add when necessary - default: - throw new Error( - `The contrat ${contract} is not to be deployed using the CREATE2 scheme`, - ); - } - }), - ); - } catch (e) { - console.error(e); - } -} diff --git a/packages/smart-contracts/src/lib/artifacts/ChainlinkConversionPath/index.ts b/packages/smart-contracts/src/lib/artifacts/ChainlinkConversionPath/index.ts index caaf56a337..817dd671ee 100644 --- a/packages/smart-contracts/src/lib/artifacts/ChainlinkConversionPath/index.ts +++ b/packages/smart-contracts/src/lib/artifacts/ChainlinkConversionPath/index.ts @@ -22,6 +22,10 @@ export const chainlinkConversionPath = new ContractArtifact( address: '0xd2777001fD7D89331D8E87eC439f78079179322b', creationBlockNumber: 7230322, }, + goerli: { + address: '0xEbe28A2B7336670Ba752bfEad4a121D2c4FF2464', + creationBlockNumber: 10461945, + }, matic: { address: '0x937Db37ffb67083242fbC6AdD472146bF10E01ec', creationBlockNumber: 30751595, diff --git a/packages/smart-contracts/src/lib/artifacts/ERC20FeeProxy/index.ts b/packages/smart-contracts/src/lib/artifacts/ERC20FeeProxy/index.ts index a921c2f194..dbe9943407 100644 --- a/packages/smart-contracts/src/lib/artifacts/ERC20FeeProxy/index.ts +++ b/packages/smart-contracts/src/lib/artifacts/ERC20FeeProxy/index.ts @@ -21,6 +21,10 @@ export const erc20FeeProxyArtifact = new ContractArtifact( address: '0xda46309973bFfDdD5a10cE12c44d2EE266f45A44', creationBlockNumber: 7118080, }, + goerli: { + address: '0x399F5EE127ce7432E4921a61b8CF52b0af52cbfE', + creationBlockNumber: 7091472, + }, matic: { address: '0x2171a0dc12a9E5b1659feF2BB20E54c84Fa7dB0C', creationBlockNumber: 14163521, diff --git a/packages/smart-contracts/src/lib/artifacts/ERC20SwapToPay/index.ts b/packages/smart-contracts/src/lib/artifacts/ERC20SwapToPay/index.ts index 9e5f975c06..51c346834f 100644 --- a/packages/smart-contracts/src/lib/artifacts/ERC20SwapToPay/index.ts +++ b/packages/smart-contracts/src/lib/artifacts/ERC20SwapToPay/index.ts @@ -21,6 +21,10 @@ export const erc20SwapToPayArtifact = new ContractArtifact( address: '0xb674e3d228e631594D8fd4BF947E1811288bf836', creationBlockNumber: 7363204, }, + goerli: { + address: '0x0Ef49176A87Adcc88bD5125126C6a6c23a28303C', + creationBlockNumber: 7109102, + }, }, }, '0.3.0': { diff --git a/packages/smart-contracts/src/lib/artifacts/EthConversionProxy/index.ts b/packages/smart-contracts/src/lib/artifacts/EthConversionProxy/index.ts index 16c2dc5e21..c9720fa6d9 100644 --- a/packages/smart-contracts/src/lib/artifacts/EthConversionProxy/index.ts +++ b/packages/smart-contracts/src/lib/artifacts/EthConversionProxy/index.ts @@ -18,6 +18,10 @@ export const ethConversionArtifact = new ContractArtifact( address: '0xCa3353a15fCb5C83a1Ff64BFf055781aC5c4d2F4', creationBlockNumber: 9447194, }, + goerli: { + address: '0xED250D9219EB93098Bb67aEbc992963172B9c8DA', + creationBlockNumber: 7108896, + }, fantom: { address: '0xCa3353a15fCb5C83a1Ff64BFf055781aC5c4d2F4', creationBlockNumber: 20066436, diff --git a/packages/smart-contracts/src/lib/artifacts/EthereumFeeProxy/index.ts b/packages/smart-contracts/src/lib/artifacts/EthereumFeeProxy/index.ts index 8b0d26e0b0..48bfbf6b22 100644 --- a/packages/smart-contracts/src/lib/artifacts/EthereumFeeProxy/index.ts +++ b/packages/smart-contracts/src/lib/artifacts/EthereumFeeProxy/index.ts @@ -17,6 +17,10 @@ export const ethereumFeeProxyArtifact = new ContractArtifact( address: '0xC6E23a20C0a1933ACC8E30247B5D1e2215796C1F', creationBlockNumber: 9447193, }, + goerli: { + address: '0xe11BF2fDA23bF0A98365e1A4c04A87C9339e8687', + creationBlockNumber: 7091386, + }, fantom: { address: '0xC6E23a20C0a1933ACC8E30247B5D1e2215796C1F', creationBlockNumber: 20066431, diff --git a/packages/smart-contracts/src/lib/artifacts/EthereumProxy/index.ts b/packages/smart-contracts/src/lib/artifacts/EthereumProxy/index.ts index b318578e54..2602944bd0 100644 --- a/packages/smart-contracts/src/lib/artifacts/EthereumProxy/index.ts +++ b/packages/smart-contracts/src/lib/artifacts/EthereumProxy/index.ts @@ -21,6 +21,10 @@ export const ethereumProxyArtifact = new ContractArtifact( address: '0x9c6c7817e3679c4b3f9ef9486001eae5aaed25ff', creationBlockNumber: 5955681, }, + goerli: { + address: '0x171Ee0881407d4c0C11eA1a2FB7D5b4cdED71e6e', + creationBlockNumber: 7069045, + }, xdai: { address: '0x27c60BE17e853c47A9F1d280B05365f483c2dFAF', creationBlockNumber: 18326895, From f772e9fbc7a80d11a8997989e4643dc01f2cf515 Mon Sep 17 00:00:00 2001 From: Romain <45540622+rom1trt@users.noreply.github.com> Date: Thu, 28 Jul 2022 10:42:51 +0200 Subject: [PATCH 14/85] feat: goerli storage (#890) feat: squash commits goerli storage --- packages/ethereum-storage/src/ethereum-utils.ts | 1 + packages/ethereum-storage/test/ethereum-utils.test.ts | 6 ++++++ packages/types/src/storage-types.ts | 1 + 3 files changed, 8 insertions(+) diff --git a/packages/ethereum-storage/src/ethereum-utils.ts b/packages/ethereum-storage/src/ethereum-utils.ts index 9b879685d2..75351078fa 100644 --- a/packages/ethereum-storage/src/ethereum-utils.ts +++ b/packages/ethereum-storage/src/ethereum-utils.ts @@ -8,6 +8,7 @@ const networks = { [StorageTypes.EthereumNetwork.MAINNET]: 'mainnet', [StorageTypes.EthereumNetwork.KOVAN]: 'kovan', [StorageTypes.EthereumNetwork.RINKEBY]: 'rinkeby', + [StorageTypes.EthereumNetwork.GOERLI]: 'goerli', [StorageTypes.EthereumNetwork.SOKOL]: 'sokol', [StorageTypes.EthereumNetwork.XDAI]: 'xdai', }; diff --git a/packages/ethereum-storage/test/ethereum-utils.test.ts b/packages/ethereum-storage/test/ethereum-utils.test.ts index 17fc6d353c..a423b9ddad 100644 --- a/packages/ethereum-storage/test/ethereum-utils.test.ts +++ b/packages/ethereum-storage/test/ethereum-utils.test.ts @@ -21,6 +21,9 @@ describe('Ethereum Utils', () => { expect(EthereumUtils.getEthereumNetworkNameFromId(StorageTypes.EthereumNetwork.RINKEBY)).toBe( 'rinkeby', ); + expect(EthereumUtils.getEthereumNetworkNameFromId(StorageTypes.EthereumNetwork.GOERLI)).toBe( + 'goerli', + ); expect(EthereumUtils.getEthereumNetworkNameFromId(StorageTypes.EthereumNetwork.SOKOL)).toBe( 'sokol', ); @@ -48,6 +51,9 @@ describe('Ethereum Utils', () => { expect(EthereumUtils.getEthereumIdFromNetworkName('rinkeby')).toBe( StorageTypes.EthereumNetwork.RINKEBY, ); + expect(EthereumUtils.getEthereumIdFromNetworkName('goerli')).toBe( + StorageTypes.EthereumNetwork.GOERLI, + ); expect(EthereumUtils.getEthereumIdFromNetworkName('sokol')).toBe( StorageTypes.EthereumNetwork.SOKOL, ); diff --git a/packages/types/src/storage-types.ts b/packages/types/src/storage-types.ts index c6e51c33b4..4ab5c6702d 100644 --- a/packages/types/src/storage-types.ts +++ b/packages/types/src/storage-types.ts @@ -136,6 +136,7 @@ export enum EthereumNetwork { PRIVATE = 0, MAINNET = 1, RINKEBY = 4, + GOERLI = 5, KOVAN = 42, SOKOL = 77, XDAI = 100, From e8f24d7a73b9df4255c68a29297531628e6296d8 Mon Sep 17 00:00:00 2001 From: Romain TREFAULT Date: Thu, 28 Jul 2022 13:19:32 +0200 Subject: [PATCH 15/85] fix: modify smart contract address --- .../src/lib/artifacts/ERC20EscrowToPay/index.ts | 4 ---- 1 file changed, 4 deletions(-) diff --git a/packages/smart-contracts/src/lib/artifacts/ERC20EscrowToPay/index.ts b/packages/smart-contracts/src/lib/artifacts/ERC20EscrowToPay/index.ts index a0bca9cff3..12d294bef8 100644 --- a/packages/smart-contracts/src/lib/artifacts/ERC20EscrowToPay/index.ts +++ b/packages/smart-contracts/src/lib/artifacts/ERC20EscrowToPay/index.ts @@ -25,10 +25,6 @@ export const erc20EscrowToPayArtifact = new ContractArtifact( address: '0xd2777001fD7D89331D8E87eC439f78079179322b', creationBlockNumber: 7230322, }, - goerli: { - address: '0xEbe28A2B7336670Ba752bfEad4a121D2c4FF2464', - creationBlockNumber: 10461945, - }, matic: { address: '0x937Db37ffb67083242fbC6AdD472146bF10E01ec', creationBlockNumber: 30751595, From ac2f343197469dfc63610865a088184c127d6ed4 Mon Sep 17 00:00:00 2001 From: Romain TREFAULT Date: Thu, 28 Jul 2022 13:59:49 +0200 Subject: [PATCH 16/85] fix: ETHConversionProxy to EthConversionProxy --- .../scripts-create2/compute-one-address.ts | 2 +- packages/smart-contracts/scripts-create2/deploy.ts | 2 +- packages/smart-contracts/scripts-create2/utils.ts | 2 +- packages/smart-contracts/scripts-create2/verify.ts | 2 +- .../smart-contracts/scripts/conversion-proxy.ts | 2 +- .../smart-contracts/scripts/deploy-payments.ts | 14 +++++++------- .../scripts/test-deploy_chainlink_contract.ts | 4 ++-- 7 files changed, 14 insertions(+), 14 deletions(-) diff --git a/packages/smart-contracts/scripts-create2/compute-one-address.ts b/packages/smart-contracts/scripts-create2/compute-one-address.ts index 7e8c4809a7..f2803616ed 100644 --- a/packages/smart-contracts/scripts-create2/compute-one-address.ts +++ b/packages/smart-contracts/scripts-create2/compute-one-address.ts @@ -52,7 +52,7 @@ export const computeCreate2DeploymentAddressesFromList = async ( switch (contract) { case 'EthereumProxy': case 'EthereumFeeProxy': - case 'ETHConversionProxy': + case 'EthConversionProxy': case 'ERC20FeeProxy': case 'Erc20ConversionProxy': case 'ERC20EscrowToPay': diff --git a/packages/smart-contracts/scripts-create2/deploy.ts b/packages/smart-contracts/scripts-create2/deploy.ts index ec15644fac..23dbfc931b 100644 --- a/packages/smart-contracts/scripts-create2/deploy.ts +++ b/packages/smart-contracts/scripts-create2/deploy.ts @@ -53,7 +53,7 @@ export const deployWithCreate2FromList = async ( switch (contract) { case 'EthereumProxy': case 'EthereumFeeProxy': - case 'ETHConversionProxy': + case 'EthConversionProxy': case 'ERC20FeeProxy': case 'Erc20ConversionProxy': { const constructorArgs = getConstructorArgs(contract); diff --git a/packages/smart-contracts/scripts-create2/utils.ts b/packages/smart-contracts/scripts-create2/utils.ts index 421bba148c..ad58a5f04c 100644 --- a/packages/smart-contracts/scripts-create2/utils.ts +++ b/packages/smart-contracts/scripts-create2/utils.ts @@ -9,7 +9,7 @@ import * as artifacts from '../src/lib'; export const create2ContractDeploymentList = [ 'EthereumProxy', 'EthereumFeeProxy', - 'ETHConversionProxy', + 'EthConversionProxy', 'ERC20FeeProxy', 'Erc20ConversionProxy', 'ERC20SwapToConversion', diff --git a/packages/smart-contracts/scripts-create2/verify.ts b/packages/smart-contracts/scripts-create2/verify.ts index cc8648e862..0d629f52ab 100644 --- a/packages/smart-contracts/scripts-create2/verify.ts +++ b/packages/smart-contracts/scripts-create2/verify.ts @@ -27,7 +27,7 @@ export async function VerifyCreate2FromList(hre: HardhatRuntimeEnvironmentExtend switch (contract) { case 'EthereumProxy': case 'EthereumFeeProxy': - case 'ETHConversionProxy': + case 'EthConversionProxy': case 'ERC20FeeProxy': case 'ERC20SwapToConversion': case 'Erc20ConversionProxy': { diff --git a/packages/smart-contracts/scripts/conversion-proxy.ts b/packages/smart-contracts/scripts/conversion-proxy.ts index b0d96e8017..57fa687a24 100644 --- a/packages/smart-contracts/scripts/conversion-proxy.ts +++ b/packages/smart-contracts/scripts/conversion-proxy.ts @@ -45,7 +45,7 @@ export async function deployERC20ConversionProxy( }); } -export async function deployETHConversionProxy( +export async function deployEthConversionProxy( args: { chainlinkConversionPathAddress?: string; ethFeeProxyAddress?: string; diff --git a/packages/smart-contracts/scripts/deploy-payments.ts b/packages/smart-contracts/scripts/deploy-payments.ts index 14167c7c78..e9a868fdae 100644 --- a/packages/smart-contracts/scripts/deploy-payments.ts +++ b/packages/smart-contracts/scripts/deploy-payments.ts @@ -5,7 +5,7 @@ import { erc20FeeProxyArtifact, erc20SwapToPayArtifact, } from '../src/lib'; -import { deployERC20ConversionProxy, deployETHConversionProxy } from './conversion-proxy'; +import { deployERC20ConversionProxy, deployEthConversionProxy } from './conversion-proxy'; import { DeploymentResult, deployOne } from './deploy-one'; import { uniswapV2RouterAddresses, jumpToNonce } from './utils'; import { Contract } from 'ethers'; @@ -154,7 +154,7 @@ export async function deployAllPaymentContracts( /* * Batch 4 * - ChainlinkConversionPath (+ addWhitelistAdmin()) - * - ETHConversionProxy + * - EthConversionProxy */ const runDeploymentBatch_4 = async (ethFeeProxyAddress: string) => { const NONCE_BATCH_4 = 10; @@ -170,7 +170,7 @@ export async function deployAllPaymentContracts( }); // Deploy ETH Conversion - const ethConversionResult = await deployETHConversionProxy( + const ethConversionResult = await deployEthConversionProxy( { ...args, chainlinkConversionPathAddress, @@ -265,12 +265,12 @@ export async function deployAllPaymentContracts( const ethConversionAdminNonce = NONCE_BATCH_5 + 3; await jumpToNonce(args, hre, ethConversionAdminNonce); - // 5.d ETHConversion.transferOwnership + // 5.d EthConversion.transferOwnership if (await nonceReady(ethConversionAdminNonce)) { if (ethConversionResultInstance) { if (!process.env.ADMIN_WALLET_ADDRESS) { throw new Error( - 'ADMIN_WALLET_ADDRESS missing, cannot addWhitelistAdmin on ETHConversion.', + 'ADMIN_WALLET_ADDRESS missing, cannot addWhitelistAdmin on EthConversion.', ); } if (args.simulate === false) { @@ -280,13 +280,13 @@ export async function deployAllPaymentContracts( await tx.wait(1); } else { console.log( - `[i] Simulating addWhitelistAdmin to ETHConversion at ${ethConversionResultInstance.address}`, + `[i] Simulating addWhitelistAdmin to EthConversion at ${ethConversionResultInstance.address}`, ); } } else { if (!ethConversionResultInstance) { console.warn( - `Warning: the ETHConversion contract instance is not ready for ETHConversion update, consider retrying.`, + `Warning: the EthConversion contract instance is not ready for EthConversion update, consider retrying.`, ); switchToSimulation(); } diff --git a/packages/smart-contracts/scripts/test-deploy_chainlink_contract.ts b/packages/smart-contracts/scripts/test-deploy_chainlink_contract.ts index 88fa62a254..099be843a4 100644 --- a/packages/smart-contracts/scripts/test-deploy_chainlink_contract.ts +++ b/packages/smart-contracts/scripts/test-deploy_chainlink_contract.ts @@ -1,7 +1,7 @@ import '@nomiclabs/hardhat-ethers'; import { CurrencyManager } from '@requestnetwork/currency'; import { HardhatRuntimeEnvironment } from 'hardhat/types'; -import { deployERC20ConversionProxy, deployETHConversionProxy } from './conversion-proxy'; +import { deployERC20ConversionProxy, deployEthConversionProxy } from './conversion-proxy'; import { deploySwapConversion } from './erc20-swap-to-conversion'; import { deployOne } from './deploy-one'; @@ -93,7 +93,7 @@ export default async function deploy( // EthConversion const ethConversionProxyAddress = ( - await deployETHConversionProxy( + await deployEthConversionProxy( { ...args, chainlinkConversionPathAddress: conversionPathInstance.address, From 110d2988cfb8b661a4d91712efafb950f0a2c429 Mon Sep 17 00:00:00 2001 From: Romain TREFAULT Date: Thu, 28 Jul 2022 14:35:09 +0200 Subject: [PATCH 17/85] fix: add MIT License --- .../src/contracts/interfaces/IERC20ConversionProxy.sol | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/smart-contracts/src/contracts/interfaces/IERC20ConversionProxy.sol b/packages/smart-contracts/src/contracts/interfaces/IERC20ConversionProxy.sol index 946d170691..3a7b8b8f6a 100644 --- a/packages/smart-contracts/src/contracts/interfaces/IERC20ConversionProxy.sol +++ b/packages/smart-contracts/src/contracts/interfaces/IERC20ConversionProxy.sol @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; interface IERC20ConversionProxy { From 2caf6f1ecac070466aca53e0dc78c0d42a82682d Mon Sep 17 00:00:00 2001 From: Romain <45540622+rom1trt@users.noreply.github.com> Date: Thu, 28 Jul 2022 15:41:16 +0200 Subject: [PATCH 18/85] doc: modify command to create request (#880) * refactor: command to create request * fix: escrow audit fix 2 (#878) * fix(smart-contracts): update batch fees (#873) update batch fees from 1% to .3% * feat: add cancel stream function (#884) * refactor: contract setup compression fix (#888) * fix: escrow audit fix 2 (#878) * fix(smart-contracts): update batch fees (#873) update batch fees from 1% to .3% * feat: add cancel stream function (#884) * refactor: contract setup compression fix (#888) * feat: goerli storage (#890) feat: squash commits goerli storage * fix: delete ETHConversionProxy Co-authored-by: Darko Kolev Co-authored-by: olivier7delf <55892112+olivier7delf@users.noreply.github.com> Co-authored-by: Bertrand Juglas --- packages/toolbox/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/toolbox/README.md b/packages/toolbox/README.md index f861290229..072f779b07 100644 --- a/packages/toolbox/README.md +++ b/packages/toolbox/README.md @@ -27,8 +27,8 @@ CreateRequest.createTestRequest(12); #### In the CLI ```bash -yarn run:create -yarn run:create 12 +yarn request-toolbox request create +yarn request-toolbox request create 12 ``` ### Conversion paths From d1b600350ab5cc334fa46dafdd86df82b5e151ee Mon Sep 17 00:00:00 2001 From: Romain TREFAULT Date: Fri, 8 Jul 2022 16:06:20 +0200 Subject: [PATCH 19/85] deploy: goerli contracts --- .../src/lib/artifacts/ERC20EscrowToPay/index.ts | 4 ++++ .../src/lib/artifacts/Erc20SwapConversion/index.ts | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/packages/smart-contracts/src/lib/artifacts/ERC20EscrowToPay/index.ts b/packages/smart-contracts/src/lib/artifacts/ERC20EscrowToPay/index.ts index 12d294bef8..a0bca9cff3 100644 --- a/packages/smart-contracts/src/lib/artifacts/ERC20EscrowToPay/index.ts +++ b/packages/smart-contracts/src/lib/artifacts/ERC20EscrowToPay/index.ts @@ -25,6 +25,10 @@ export const erc20EscrowToPayArtifact = new ContractArtifact( address: '0xd2777001fD7D89331D8E87eC439f78079179322b', creationBlockNumber: 7230322, }, + goerli: { + address: '0xEbe28A2B7336670Ba752bfEad4a121D2c4FF2464', + creationBlockNumber: 10461945, + }, matic: { address: '0x937Db37ffb67083242fbC6AdD472146bF10E01ec', creationBlockNumber: 30751595, diff --git a/packages/smart-contracts/src/lib/artifacts/Erc20SwapConversion/index.ts b/packages/smart-contracts/src/lib/artifacts/Erc20SwapConversion/index.ts index 8eae29f28c..1852293575 100644 --- a/packages/smart-contracts/src/lib/artifacts/Erc20SwapConversion/index.ts +++ b/packages/smart-contracts/src/lib/artifacts/Erc20SwapConversion/index.ts @@ -18,6 +18,10 @@ export const erc20SwapConversionArtifact = new ContractArtifact Date: Mon, 11 Jul 2022 10:38:00 +0200 Subject: [PATCH 20/85] refactor: add goerli address contract --- .../src/lib/artifacts/ERC20EscrowToPay/index.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/smart-contracts/src/lib/artifacts/ERC20EscrowToPay/index.ts b/packages/smart-contracts/src/lib/artifacts/ERC20EscrowToPay/index.ts index a0bca9cff3..0157f8d2a9 100644 --- a/packages/smart-contracts/src/lib/artifacts/ERC20EscrowToPay/index.ts +++ b/packages/smart-contracts/src/lib/artifacts/ERC20EscrowToPay/index.ts @@ -26,8 +26,8 @@ export const erc20EscrowToPayArtifact = new ContractArtifact( creationBlockNumber: 7230322, }, goerli: { - address: '0xEbe28A2B7336670Ba752bfEad4a121D2c4FF2464', - creationBlockNumber: 10461945, + address: '0xB6f943d324a70B2883aE890089433345feCe8Be4', + creationBlockNumber: 7091488, }, matic: { address: '0x937Db37ffb67083242fbC6AdD472146bF10E01ec', From d70ada01c5b9b936541beccef44d065fe5e8ea53 Mon Sep 17 00:00:00 2001 From: Romain TREFAULT Date: Tue, 12 Jul 2022 10:27:37 +0200 Subject: [PATCH 21/85] -S refactor: add goerli tests --- .../test/erc20/escrow-info-retriever.test.ts | 3 +-- .../erc20/thegraph-info-retriever.test.ts | 21 +++++++++---------- .../test/eth/input-data.test.ts | 2 +- 3 files changed, 12 insertions(+), 14 deletions(-) diff --git a/packages/payment-detection/test/erc20/escrow-info-retriever.test.ts b/packages/payment-detection/test/erc20/escrow-info-retriever.test.ts index 03431e5089..81a6a65a02 100644 --- a/packages/payment-detection/test/erc20/escrow-info-retriever.test.ts +++ b/packages/payment-detection/test/erc20/escrow-info-retriever.test.ts @@ -176,8 +176,7 @@ describe('api/erc20/escrow-info-retriever', () => { }); it('should get escrow chain data', async () => { const escrowChainData = await infoRetriever.getEscrowRequestMapping(); - // Not yet ERC777 token on goerli - // expect(escrowChainData.tokenAddress).toEqual('0x745861AeD1EEe363b4AaA5F1994Be40b1e05Ff90'); + expect(escrowChainData.tokenAddress).toEqual('0x745861AeD1EEe363b4AaA5F1994Be40b1e05Ff90'); expect(escrowChainData.payee).toEqual('0xB9B7e0cb2EDF5Ea031C8B297A5A1Fa20379b6A0a'); expect(escrowChainData.payer).toEqual('0x0c051a1f4E209b00c8E7C00AD0ce79B3630a7401'); expect(escrowChainData.amount.toString()).toEqual('123000000000000000000'); diff --git a/packages/payment-detection/test/erc20/thegraph-info-retriever.test.ts b/packages/payment-detection/test/erc20/thegraph-info-retriever.test.ts index a9af030300..21ecb7cb05 100644 --- a/packages/payment-detection/test/erc20/thegraph-info-retriever.test.ts +++ b/packages/payment-detection/test/erc20/thegraph-info-retriever.test.ts @@ -91,20 +91,20 @@ describe('api/erc20/thegraph-info-retriever', () => { }); describe('on goerli', () => { - const GOERLI_ETH_FEE_PROXY_CONTRACT = '0xe11BF2fDA23bF0A98365e1A4c04A87C9339e8687'; - const GOERLI_ETH_CONVERSION_PROXY_CONTRACT = '0xED250D9219EB93098Bb67aEbc992963172B9c8DA'; + const GOERLI_ETH_FEE_PROXY_CONTRACT = '0xc6e23a20c0a1933acc8e30247b5d1e2215796c1f'; + const GOERLI_ETH_CONVERSION_PROXY_CONTRACT = '0xca3353a15fcb5c83a1ff64bff055781ac5c4d2f4'; it('should get payment event from ethFeeProxy via subgraph', async () => { const paymentData = { reference: '0x6c93723bc5f82e6fbb2ea994bf0fb572fa19f7a2a3146065e21752b95668efe5', - txHash: '0x29a55b7f978a902275746f6eb930abf608dc77c0592fce9cf6c326128fcf7493', - from: '0xBc9643B7Bd7c8621F4a68280433796484b9E525d', + txHash: '0x3e2d6cc2534b1d340ba2954f34e6cc819d6da64ff76863ea89c6d34b15d13c97', + from: '0x186e7fe6c34ea0eca7f9c2fd29651fc0443e3f29', to: '0x5000ee9fb9c96a2a09d8efb695ac21d6c429ff11', network: 'goerli', salt: '0ee84db293a752c6', - amount: '600000000000000', + amount: '30000000000000', requestId: '0188791633ff0ec72a7dbdefb886d2db6cccfa98287320839c2f173c7a4e3ce7e1', - block: 7230236, + block: 9606098, feeAddress: '0x5000EE9FB9c96A2A09D8efB695aC21D6C429fF11', feeAmount: '0', }; @@ -126,8 +126,8 @@ describe('api/erc20/thegraph-info-retriever', () => { ); const allNetworkEvents = await graphRetriever.getTransferEvents(); const transferEvents = allNetworkEvents.paymentEvents; - // expect(transferEvents).toHaveLength(1); - expect(transferEvents[0].amount).toEqual('600000000000000'); + expect(transferEvents).toHaveLength(1); + expect(transferEvents[0].amount).toEqual('30000000000000'); expect(transferEvents[0].name).toEqual('payment'); expect(transferEvents[0].parameters?.to).toEqual(paymentData.to); expect(transferEvents[0].parameters?.txHash).toEqual(paymentData.txHash); @@ -136,8 +136,7 @@ describe('api/erc20/thegraph-info-retriever', () => { expect(transferEvents[0].parameters?.feeAmount).toEqual(paymentData.feeAmount); }); - // doesn't work because chainlink doesn't have oracles on goerli - it.skip('should get payment event from ethFeeConversionProxy via subgraph', async () => { + it('should get payment event from ethFeeConversionProxy via subgraph', async () => { const paymentData = { reference: '0x6c93723bc5f82e6fbb2ea994bf0fb572fa19f7a2a3146065e21752b95668efe5', txHash: '0x2f7b4752aa259166c038cd9073056c5979760cf0eea55d093fca2095c229313b', @@ -168,7 +167,7 @@ describe('api/erc20/thegraph-info-retriever', () => { ); const allNetworkEvents = await graphRetriever.getTransferEvents(); const transferEvents = allNetworkEvents.paymentEvents; - // expect(transferEvents).toHaveLength(1); + expect(transferEvents).toHaveLength(1); expect(transferEvents[0].amount).toEqual(paymentData.amount); expect(transferEvents[0].parameters?.to).toEqual(paymentData.to); expect(transferEvents[0].parameters?.txHash).toEqual(paymentData.txHash); diff --git a/packages/payment-detection/test/eth/input-data.test.ts b/packages/payment-detection/test/eth/input-data.test.ts index b7d7489698..f9823a09bc 100644 --- a/packages/payment-detection/test/eth/input-data.test.ts +++ b/packages/payment-detection/test/eth/input-data.test.ts @@ -251,7 +251,7 @@ describe('api/eth/input-data', () => { currency: { network: 'goerli', type: RequestLogicTypes.CURRENCY.ETH, - value: 'ETH-goerli', + value: 'ETH', }, expectedAmount: '80000000000000000', payee: { From 756206b6bacee25a8126792079a07f172b1583c5 Mon Sep 17 00:00:00 2001 From: Romain TREFAULT Date: Mon, 11 Jul 2022 16:50:59 +0200 Subject: [PATCH 22/85] -S feat: add goerli payment-detection tests --- .../test/erc777/superfluid-retriever.test.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/payment-detection/test/erc777/superfluid-retriever.test.ts b/packages/payment-detection/test/erc777/superfluid-retriever.test.ts index 6d9e74f63e..474fe5f709 100644 --- a/packages/payment-detection/test/erc777/superfluid-retriever.test.ts +++ b/packages/payment-detection/test/erc777/superfluid-retriever.test.ts @@ -20,7 +20,7 @@ describe('api/erc777/superfluid-info-retriever', () => { salt: '0ee84db293a752c6', amount: '92592592592592000', requestId: '0188791633ff0ec72a7dbdefb886d2db6cccfa98287320839c2f173c7a4e3ce7e1', - block: 9945543, + block: '9945543', token: '0x745861aed1eee363b4aaa5f1994be40b1e05ff90', //fDAIx }; graphql.request.mockResolvedValue(mockSuperfluidSubgraph[0]); @@ -61,7 +61,7 @@ describe('api/erc777/superfluid-info-retriever', () => { salt: '0ee84db293a752c6', amount: '92592592592592000', requestId: '0188791633ff0ec72a7dbdefb886d2db6cccfa98287320839c2f173c7a4e3ce7e1', - block: 9945543, + block: '9945543', token: '0x2bf02814ea0b2b155ed47b7cede18caa752940e6', //fDAIx }; graphql.request.mockResolvedValue(mockSuperfluidSubgraph[0]); From f66a8cd2d771147910a41dcf73edbfc532f48da6 Mon Sep 17 00:00:00 2001 From: Romain TREFAULT Date: Tue, 12 Jul 2022 16:23:45 +0200 Subject: [PATCH 23/85] refactor: goerli tests --- .../test/erc20/escrow-info-retriever.test.ts | 3 ++- .../test/erc20/thegraph-info-retriever.test.ts | 6 +++--- .../test/erc777/superfluid-retriever.test.ts | 4 ++-- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/packages/payment-detection/test/erc20/escrow-info-retriever.test.ts b/packages/payment-detection/test/erc20/escrow-info-retriever.test.ts index 81a6a65a02..03431e5089 100644 --- a/packages/payment-detection/test/erc20/escrow-info-retriever.test.ts +++ b/packages/payment-detection/test/erc20/escrow-info-retriever.test.ts @@ -176,7 +176,8 @@ describe('api/erc20/escrow-info-retriever', () => { }); it('should get escrow chain data', async () => { const escrowChainData = await infoRetriever.getEscrowRequestMapping(); - expect(escrowChainData.tokenAddress).toEqual('0x745861AeD1EEe363b4AaA5F1994Be40b1e05Ff90'); + // Not yet ERC777 token on goerli + // expect(escrowChainData.tokenAddress).toEqual('0x745861AeD1EEe363b4AaA5F1994Be40b1e05Ff90'); expect(escrowChainData.payee).toEqual('0xB9B7e0cb2EDF5Ea031C8B297A5A1Fa20379b6A0a'); expect(escrowChainData.payer).toEqual('0x0c051a1f4E209b00c8E7C00AD0ce79B3630a7401'); expect(escrowChainData.amount.toString()).toEqual('123000000000000000000'); diff --git a/packages/payment-detection/test/erc20/thegraph-info-retriever.test.ts b/packages/payment-detection/test/erc20/thegraph-info-retriever.test.ts index 21ecb7cb05..12674a2fd3 100644 --- a/packages/payment-detection/test/erc20/thegraph-info-retriever.test.ts +++ b/packages/payment-detection/test/erc20/thegraph-info-retriever.test.ts @@ -94,7 +94,7 @@ describe('api/erc20/thegraph-info-retriever', () => { const GOERLI_ETH_FEE_PROXY_CONTRACT = '0xc6e23a20c0a1933acc8e30247b5d1e2215796c1f'; const GOERLI_ETH_CONVERSION_PROXY_CONTRACT = '0xca3353a15fcb5c83a1ff64bff055781ac5c4d2f4'; - it('should get payment event from ethFeeProxy via subgraph', async () => { + it('should get payment event from ethFeeProxy via subgraph (Goerli)', async () => { const paymentData = { reference: '0x6c93723bc5f82e6fbb2ea994bf0fb572fa19f7a2a3146065e21752b95668efe5', txHash: '0x3e2d6cc2534b1d340ba2954f34e6cc819d6da64ff76863ea89c6d34b15d13c97', @@ -126,7 +126,7 @@ describe('api/erc20/thegraph-info-retriever', () => { ); const allNetworkEvents = await graphRetriever.getTransferEvents(); const transferEvents = allNetworkEvents.paymentEvents; - expect(transferEvents).toHaveLength(1); + // expect(transferEvents).toHaveLength(1); expect(transferEvents[0].amount).toEqual('30000000000000'); expect(transferEvents[0].name).toEqual('payment'); expect(transferEvents[0].parameters?.to).toEqual(paymentData.to); @@ -167,7 +167,7 @@ describe('api/erc20/thegraph-info-retriever', () => { ); const allNetworkEvents = await graphRetriever.getTransferEvents(); const transferEvents = allNetworkEvents.paymentEvents; - expect(transferEvents).toHaveLength(1); + // expect(transferEvents).toHaveLength(1); expect(transferEvents[0].amount).toEqual(paymentData.amount); expect(transferEvents[0].parameters?.to).toEqual(paymentData.to); expect(transferEvents[0].parameters?.txHash).toEqual(paymentData.txHash); diff --git a/packages/payment-detection/test/erc777/superfluid-retriever.test.ts b/packages/payment-detection/test/erc777/superfluid-retriever.test.ts index 474fe5f709..6d9e74f63e 100644 --- a/packages/payment-detection/test/erc777/superfluid-retriever.test.ts +++ b/packages/payment-detection/test/erc777/superfluid-retriever.test.ts @@ -20,7 +20,7 @@ describe('api/erc777/superfluid-info-retriever', () => { salt: '0ee84db293a752c6', amount: '92592592592592000', requestId: '0188791633ff0ec72a7dbdefb886d2db6cccfa98287320839c2f173c7a4e3ce7e1', - block: '9945543', + block: 9945543, token: '0x745861aed1eee363b4aaa5f1994be40b1e05ff90', //fDAIx }; graphql.request.mockResolvedValue(mockSuperfluidSubgraph[0]); @@ -61,7 +61,7 @@ describe('api/erc777/superfluid-info-retriever', () => { salt: '0ee84db293a752c6', amount: '92592592592592000', requestId: '0188791633ff0ec72a7dbdefb886d2db6cccfa98287320839c2f173c7a4e3ce7e1', - block: '9945543', + block: 9945543, token: '0x2bf02814ea0b2b155ed47b7cede18caa752940e6', //fDAIx }; graphql.request.mockResolvedValue(mockSuperfluidSubgraph[0]); From 41d883a1ad60da8cc849d62bbfb85708b11d8994 Mon Sep 17 00:00:00 2001 From: Romain TREFAULT Date: Tue, 12 Jul 2022 16:40:57 +0200 Subject: [PATCH 24/85] refactor: goerli contract address in tests --- .../test/erc20/thegraph-info-retriever.test.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/payment-detection/test/erc20/thegraph-info-retriever.test.ts b/packages/payment-detection/test/erc20/thegraph-info-retriever.test.ts index 12674a2fd3..c641ed0feb 100644 --- a/packages/payment-detection/test/erc20/thegraph-info-retriever.test.ts +++ b/packages/payment-detection/test/erc20/thegraph-info-retriever.test.ts @@ -91,10 +91,10 @@ describe('api/erc20/thegraph-info-retriever', () => { }); describe('on goerli', () => { - const GOERLI_ETH_FEE_PROXY_CONTRACT = '0xc6e23a20c0a1933acc8e30247b5d1e2215796c1f'; - const GOERLI_ETH_CONVERSION_PROXY_CONTRACT = '0xca3353a15fcb5c83a1ff64bff055781ac5c4d2f4'; + const GOERLI_ETH_FEE_PROXY_CONTRACT = '0xe11BF2fDA23bF0A98365e1A4c04A87C9339e8687'; + const GOERLI_ETH_CONVERSION_PROXY_CONTRACT = '0xED250D9219EB93098Bb67aEbc992963172B9c8DA'; - it('should get payment event from ethFeeProxy via subgraph (Goerli)', async () => { + it('should get payment event from ethFeeProxy via subgraph', async () => { const paymentData = { reference: '0x6c93723bc5f82e6fbb2ea994bf0fb572fa19f7a2a3146065e21752b95668efe5', txHash: '0x3e2d6cc2534b1d340ba2954f34e6cc819d6da64ff76863ea89c6d34b15d13c97', From 64f70cba3c4911756a8a9bb2ee1c5e3edaa5818c Mon Sep 17 00:00:00 2001 From: Romain TREFAULT Date: Tue, 12 Jul 2022 16:43:24 +0200 Subject: [PATCH 25/85] refactor: goerli tests --- packages/payment-detection/test/eth/input-data.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/payment-detection/test/eth/input-data.test.ts b/packages/payment-detection/test/eth/input-data.test.ts index f9823a09bc..b7d7489698 100644 --- a/packages/payment-detection/test/eth/input-data.test.ts +++ b/packages/payment-detection/test/eth/input-data.test.ts @@ -251,7 +251,7 @@ describe('api/eth/input-data', () => { currency: { network: 'goerli', type: RequestLogicTypes.CURRENCY.ETH, - value: 'ETH', + value: 'ETH-goerli', }, expectedAmount: '80000000000000000', payee: { From e7bca19c06633f481f0ff05b131d1a5dfc2ca175 Mon Sep 17 00:00:00 2001 From: Darko Kolev Date: Fri, 15 Jul 2022 11:33:39 +0200 Subject: [PATCH 26/85] fixed ethFeeProxy subgraph goerli test --- .../test/erc20/thegraph-info-retriever.test.ts | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/packages/payment-detection/test/erc20/thegraph-info-retriever.test.ts b/packages/payment-detection/test/erc20/thegraph-info-retriever.test.ts index c641ed0feb..a9af030300 100644 --- a/packages/payment-detection/test/erc20/thegraph-info-retriever.test.ts +++ b/packages/payment-detection/test/erc20/thegraph-info-retriever.test.ts @@ -97,14 +97,14 @@ describe('api/erc20/thegraph-info-retriever', () => { it('should get payment event from ethFeeProxy via subgraph', async () => { const paymentData = { reference: '0x6c93723bc5f82e6fbb2ea994bf0fb572fa19f7a2a3146065e21752b95668efe5', - txHash: '0x3e2d6cc2534b1d340ba2954f34e6cc819d6da64ff76863ea89c6d34b15d13c97', - from: '0x186e7fe6c34ea0eca7f9c2fd29651fc0443e3f29', + txHash: '0x29a55b7f978a902275746f6eb930abf608dc77c0592fce9cf6c326128fcf7493', + from: '0xBc9643B7Bd7c8621F4a68280433796484b9E525d', to: '0x5000ee9fb9c96a2a09d8efb695ac21d6c429ff11', network: 'goerli', salt: '0ee84db293a752c6', - amount: '30000000000000', + amount: '600000000000000', requestId: '0188791633ff0ec72a7dbdefb886d2db6cccfa98287320839c2f173c7a4e3ce7e1', - block: 9606098, + block: 7230236, feeAddress: '0x5000EE9FB9c96A2A09D8efB695aC21D6C429fF11', feeAmount: '0', }; @@ -127,7 +127,7 @@ describe('api/erc20/thegraph-info-retriever', () => { const allNetworkEvents = await graphRetriever.getTransferEvents(); const transferEvents = allNetworkEvents.paymentEvents; // expect(transferEvents).toHaveLength(1); - expect(transferEvents[0].amount).toEqual('30000000000000'); + expect(transferEvents[0].amount).toEqual('600000000000000'); expect(transferEvents[0].name).toEqual('payment'); expect(transferEvents[0].parameters?.to).toEqual(paymentData.to); expect(transferEvents[0].parameters?.txHash).toEqual(paymentData.txHash); @@ -136,7 +136,8 @@ describe('api/erc20/thegraph-info-retriever', () => { expect(transferEvents[0].parameters?.feeAmount).toEqual(paymentData.feeAmount); }); - it('should get payment event from ethFeeConversionProxy via subgraph', async () => { + // doesn't work because chainlink doesn't have oracles on goerli + it.skip('should get payment event from ethFeeConversionProxy via subgraph', async () => { const paymentData = { reference: '0x6c93723bc5f82e6fbb2ea994bf0fb572fa19f7a2a3146065e21752b95668efe5', txHash: '0x2f7b4752aa259166c038cd9073056c5979760cf0eea55d093fca2095c229313b', From 8df5c7066451c3c5ed0fce203ee9870c6f4db6d4 Mon Sep 17 00:00:00 2001 From: Romain TREFAULT Date: Fri, 15 Jul 2022 14:00:10 +0200 Subject: [PATCH 27/85] refactor: move goerli to the newest versions --- .../src/lib/artifacts/ChainlinkConversionPath/index.ts | 4 ---- .../src/lib/artifacts/ERC20EscrowToPay/index.ts | 4 ++-- .../smart-contracts/src/lib/artifacts/ERC20SwapToPay/index.ts | 4 ---- .../src/lib/artifacts/EthConversionProxy/index.ts | 4 ---- .../src/lib/artifacts/EthereumFeeProxy/index.ts | 4 ---- .../smart-contracts/src/lib/artifacts/EthereumProxy/index.ts | 4 ---- 6 files changed, 2 insertions(+), 22 deletions(-) diff --git a/packages/smart-contracts/src/lib/artifacts/ChainlinkConversionPath/index.ts b/packages/smart-contracts/src/lib/artifacts/ChainlinkConversionPath/index.ts index 817dd671ee..caaf56a337 100644 --- a/packages/smart-contracts/src/lib/artifacts/ChainlinkConversionPath/index.ts +++ b/packages/smart-contracts/src/lib/artifacts/ChainlinkConversionPath/index.ts @@ -22,10 +22,6 @@ export const chainlinkConversionPath = new ContractArtifact( creationBlockNumber: 7230322, }, goerli: { - address: '0xB6f943d324a70B2883aE890089433345feCe8Be4', - creationBlockNumber: 7091488, + address: '0xd2777001fD7D89331D8E87eC439f78079179322b', + creationBlockNumber: 7230322, }, matic: { address: '0x937Db37ffb67083242fbC6AdD472146bF10E01ec', diff --git a/packages/smart-contracts/src/lib/artifacts/ERC20SwapToPay/index.ts b/packages/smart-contracts/src/lib/artifacts/ERC20SwapToPay/index.ts index 51c346834f..9e5f975c06 100644 --- a/packages/smart-contracts/src/lib/artifacts/ERC20SwapToPay/index.ts +++ b/packages/smart-contracts/src/lib/artifacts/ERC20SwapToPay/index.ts @@ -21,10 +21,6 @@ export const erc20SwapToPayArtifact = new ContractArtifact( address: '0xb674e3d228e631594D8fd4BF947E1811288bf836', creationBlockNumber: 7363204, }, - goerli: { - address: '0x0Ef49176A87Adcc88bD5125126C6a6c23a28303C', - creationBlockNumber: 7109102, - }, }, }, '0.3.0': { diff --git a/packages/smart-contracts/src/lib/artifacts/EthConversionProxy/index.ts b/packages/smart-contracts/src/lib/artifacts/EthConversionProxy/index.ts index c9720fa6d9..16c2dc5e21 100644 --- a/packages/smart-contracts/src/lib/artifacts/EthConversionProxy/index.ts +++ b/packages/smart-contracts/src/lib/artifacts/EthConversionProxy/index.ts @@ -18,10 +18,6 @@ export const ethConversionArtifact = new ContractArtifact( address: '0xCa3353a15fCb5C83a1Ff64BFf055781aC5c4d2F4', creationBlockNumber: 9447194, }, - goerli: { - address: '0xED250D9219EB93098Bb67aEbc992963172B9c8DA', - creationBlockNumber: 7108896, - }, fantom: { address: '0xCa3353a15fCb5C83a1Ff64BFf055781aC5c4d2F4', creationBlockNumber: 20066436, diff --git a/packages/smart-contracts/src/lib/artifacts/EthereumFeeProxy/index.ts b/packages/smart-contracts/src/lib/artifacts/EthereumFeeProxy/index.ts index 48bfbf6b22..8b0d26e0b0 100644 --- a/packages/smart-contracts/src/lib/artifacts/EthereumFeeProxy/index.ts +++ b/packages/smart-contracts/src/lib/artifacts/EthereumFeeProxy/index.ts @@ -17,10 +17,6 @@ export const ethereumFeeProxyArtifact = new ContractArtifact( address: '0xC6E23a20C0a1933ACC8E30247B5D1e2215796C1F', creationBlockNumber: 9447193, }, - goerli: { - address: '0xe11BF2fDA23bF0A98365e1A4c04A87C9339e8687', - creationBlockNumber: 7091386, - }, fantom: { address: '0xC6E23a20C0a1933ACC8E30247B5D1e2215796C1F', creationBlockNumber: 20066431, diff --git a/packages/smart-contracts/src/lib/artifacts/EthereumProxy/index.ts b/packages/smart-contracts/src/lib/artifacts/EthereumProxy/index.ts index 2602944bd0..b318578e54 100644 --- a/packages/smart-contracts/src/lib/artifacts/EthereumProxy/index.ts +++ b/packages/smart-contracts/src/lib/artifacts/EthereumProxy/index.ts @@ -21,10 +21,6 @@ export const ethereumProxyArtifact = new ContractArtifact( address: '0x9c6c7817e3679c4b3f9ef9486001eae5aaed25ff', creationBlockNumber: 5955681, }, - goerli: { - address: '0x171Ee0881407d4c0C11eA1a2FB7D5b4cdED71e6e', - creationBlockNumber: 7069045, - }, xdai: { address: '0x27c60BE17e853c47A9F1d280B05365f483c2dFAF', creationBlockNumber: 18326895, From 8cb36e049a38e9433a1cf351bfc2b463415ea66d Mon Sep 17 00:00:00 2001 From: Romain TREFAULT Date: Fri, 15 Jul 2022 14:00:30 +0200 Subject: [PATCH 28/85] refactor: move goerli to the newest versions --- .../smart-contracts/src/lib/artifacts/ERC20FeeProxy/index.ts | 4 ---- 1 file changed, 4 deletions(-) diff --git a/packages/smart-contracts/src/lib/artifacts/ERC20FeeProxy/index.ts b/packages/smart-contracts/src/lib/artifacts/ERC20FeeProxy/index.ts index dbe9943407..a921c2f194 100644 --- a/packages/smart-contracts/src/lib/artifacts/ERC20FeeProxy/index.ts +++ b/packages/smart-contracts/src/lib/artifacts/ERC20FeeProxy/index.ts @@ -21,10 +21,6 @@ export const erc20FeeProxyArtifact = new ContractArtifact( address: '0xda46309973bFfDdD5a10cE12c44d2EE266f45A44', creationBlockNumber: 7118080, }, - goerli: { - address: '0x399F5EE127ce7432E4921a61b8CF52b0af52cbfE', - creationBlockNumber: 7091472, - }, matic: { address: '0x2171a0dc12a9E5b1659feF2BB20E54c84Fa7dB0C', creationBlockNumber: 14163521, From c8440974df20868b2b5d3e53c603f1ac07897e4a Mon Sep 17 00:00:00 2001 From: Darko Kolev Date: Mon, 18 Jul 2022 13:44:28 +0200 Subject: [PATCH 29/85] new escrow deployed on mainnet, rinkeby, goerli, matic and fuse --- .../src/lib/artifacts/ERC20EscrowToPay/index.ts | 4 ---- 1 file changed, 4 deletions(-) diff --git a/packages/smart-contracts/src/lib/artifacts/ERC20EscrowToPay/index.ts b/packages/smart-contracts/src/lib/artifacts/ERC20EscrowToPay/index.ts index bd314b959f..12d294bef8 100644 --- a/packages/smart-contracts/src/lib/artifacts/ERC20EscrowToPay/index.ts +++ b/packages/smart-contracts/src/lib/artifacts/ERC20EscrowToPay/index.ts @@ -25,10 +25,6 @@ export const erc20EscrowToPayArtifact = new ContractArtifact( address: '0xd2777001fD7D89331D8E87eC439f78079179322b', creationBlockNumber: 7230322, }, - goerli: { - address: '0xd2777001fD7D89331D8E87eC439f78079179322b', - creationBlockNumber: 7230322, - }, matic: { address: '0x937Db37ffb67083242fbC6AdD472146bF10E01ec', creationBlockNumber: 30751595, From 7d038c0721726088ab5dd0bf5424babb3e1635ac Mon Sep 17 00:00:00 2001 From: Darko Kolev Date: Thu, 28 Jul 2022 10:05:11 +0200 Subject: [PATCH 30/85] refactor: contract setup compression fix (#888) --- .../deploy.ts~007d33cc... refactor: setups.ts | 87 +++++++++++++++++++ .../verify.ts~007d33cc... refactor: setups.ts | 64 ++++++++++++++ .../ChainlinkConversionPath/index.ts | 4 + .../src/lib/artifacts/ERC20FeeProxy/index.ts | 4 + .../src/lib/artifacts/ERC20SwapToPay/index.ts | 4 + .../lib/artifacts/EthConversionProxy/index.ts | 4 + .../lib/artifacts/EthereumFeeProxy/index.ts | 4 + .../src/lib/artifacts/EthereumProxy/index.ts | 4 + 8 files changed, 175 insertions(+) create mode 100644 packages/smart-contracts/scripts-create2/deploy.ts~007d33cc... refactor: setups.ts create mode 100644 packages/smart-contracts/scripts-create2/verify.ts~007d33cc... refactor: setups.ts diff --git a/packages/smart-contracts/scripts-create2/deploy.ts~007d33cc... refactor: setups.ts b/packages/smart-contracts/scripts-create2/deploy.ts~007d33cc... refactor: setups.ts new file mode 100644 index 0000000000..ec15644fac --- /dev/null +++ b/packages/smart-contracts/scripts-create2/deploy.ts~007d33cc... refactor: setups.ts @@ -0,0 +1,87 @@ +import { create2ContractDeploymentList, isContractDeployed } from './utils'; +import { IDeploymentParams } from './types'; +import { HardhatRuntimeEnvironmentExtended } from './types'; +import { xdeploy } from './xdeployer'; +import { getConstructorArgs } from './constructor-args'; +import { setupERC20SwapToConversion } from './contract-setup'; +import { setupBatchPayments } from './contract-setup/setupBatchPayments'; + +// Deploys, set up the contracts and returns the address +export const deployOneWithCreate2 = async ( + deploymentParams: IDeploymentParams, + hre: HardhatRuntimeEnvironmentExtended, +): Promise => { + if (!hre.config.xdeploy.networks || hre.config.xdeploy.networks.length === 0) { + throw new Error('Invalid networks'); + } + // Deploy the contract on several network through xdeployer + const deploymentResult = await xdeploy(deploymentParams, hre); + for (let i = 0; i < hre.config.xdeploy.networks.length; i++) { + if (deploymentResult[i].deployed) { + console.log(`${deploymentParams.contract} successfully deployed:`); + console.log(` On network: ${hre.config.xdeploy.networks[i]}`); + console.log(` At address: ${deploymentResult[i].address}`); + console.log(` At block: ${deploymentResult[i].receipt.blockNumber}`); + } else { + if ( + isContractDeployed( + deploymentParams.contract, + hre.config.xdeploy.networks[i], + deploymentResult[i].address, + ) + ) { + console.log(`${deploymentParams.contract} already deployed:`); + console.log(` On network: ${hre.config.xdeploy.networks[i]}`); + console.log(` At address: ${deploymentResult[i].address}`); + } else { + console.log(`${deploymentParams.contract} has not been deployed:`); + console.log(` On network: ${hre.config.xdeploy.networks[i]}`); + console.log(` Error: ${deploymentResult[i].error}`); + console.log( + ` Hint: Check admin wallet balance and that your artifacts are up to date`, + ); + } + } + } + return deploymentResult[0].address; +}; + +export const deployWithCreate2FromList = async ( + hre: HardhatRuntimeEnvironmentExtended, +): Promise => { + for (const contract of create2ContractDeploymentList) { + switch (contract) { + case 'EthereumProxy': + case 'EthereumFeeProxy': + case 'ETHConversionProxy': + case 'ERC20FeeProxy': + case 'Erc20ConversionProxy': { + const constructorArgs = getConstructorArgs(contract); + await deployOneWithCreate2({ contract, constructorArgs }, hre); + break; + } + case 'ERC20SwapToConversion': { + const constructorArgs = getConstructorArgs(contract); + const address = await deployOneWithCreate2({ contract, constructorArgs }, hre); + await setupERC20SwapToConversion(address, hre); + break; + } + case 'ERC20EscrowToPay': { + const network = hre.config.xdeploy.networks[0]; + const constructorArgs = getConstructorArgs(contract, network); + await deployOneWithCreate2({ contract, constructorArgs }, hre); + break; + } + case 'BatchPayments': { + const network = hre.config.xdeploy.networks[0]; + const constructorArgs = getConstructorArgs(contract, network); + const address = await deployOneWithCreate2({ contract, constructorArgs }, hre); + await setupBatchPayments(address, hre); + break; + } + // Other cases to add when necessary + default: + throw new Error(`The contract ${contract} is not to be deployed using the CREATE2 scheme`); + } + } +}; diff --git a/packages/smart-contracts/scripts-create2/verify.ts~007d33cc... refactor: setups.ts b/packages/smart-contracts/scripts-create2/verify.ts~007d33cc... refactor: setups.ts new file mode 100644 index 0000000000..cc8648e862 --- /dev/null +++ b/packages/smart-contracts/scripts-create2/verify.ts~007d33cc... refactor: setups.ts @@ -0,0 +1,64 @@ +import { computeCreate2DeploymentAddress } from './compute-one-address'; +import { getConstructorArgs } from './constructor-args'; +import { HardhatRuntimeEnvironmentExtended } from './types'; +import { IDeploymentParams } from './types'; +import { create2ContractDeploymentList } from './utils'; + +export const verifyOne = async ( + contractAddress: string, + deploymentParams: IDeploymentParams, + hre: HardhatRuntimeEnvironmentExtended, +): Promise => { + try { + await hre.run('verify:verify', { + address: contractAddress, + constructorArguments: deploymentParams.constructorArgs, + }); + } catch (err) { + console.log(err); + } +}; + +export async function VerifyCreate2FromList(hre: HardhatRuntimeEnvironmentExtended): Promise { + try { + let address: string; + await Promise.all( + create2ContractDeploymentList.map(async (contract) => { + switch (contract) { + case 'EthereumProxy': + case 'EthereumFeeProxy': + case 'ETHConversionProxy': + case 'ERC20FeeProxy': + case 'ERC20SwapToConversion': + case 'Erc20ConversionProxy': { + const constructorArgs = getConstructorArgs(contract); + address = await computeCreate2DeploymentAddress({ contract, constructorArgs }, hre); + await verifyOne(address, { contract, constructorArgs }, hre); + break; + } + case 'ERC20EscrowToPay': { + const network = hre.config.xdeploy.networks[0]; + const constructorArgs = getConstructorArgs(contract, network); + address = await computeCreate2DeploymentAddress({ contract, constructorArgs }, hre); + await verifyOne(address, { contract, constructorArgs }, hre); + break; + } + case 'BatchPayments': { + const network = hre.config.xdeploy.networks[0]; + const constructorArgs = getConstructorArgs(contract, network); + address = await computeCreate2DeploymentAddress({ contract, constructorArgs }, hre); + await verifyOne(address, { contract, constructorArgs }, hre); + break; + } + // Other cases to add when necessary + default: + throw new Error( + `The contrat ${contract} is not to be deployed using the CREATE2 scheme`, + ); + } + }), + ); + } catch (e) { + console.error(e); + } +} diff --git a/packages/smart-contracts/src/lib/artifacts/ChainlinkConversionPath/index.ts b/packages/smart-contracts/src/lib/artifacts/ChainlinkConversionPath/index.ts index caaf56a337..817dd671ee 100644 --- a/packages/smart-contracts/src/lib/artifacts/ChainlinkConversionPath/index.ts +++ b/packages/smart-contracts/src/lib/artifacts/ChainlinkConversionPath/index.ts @@ -22,6 +22,10 @@ export const chainlinkConversionPath = new ContractArtifact( address: '0xda46309973bFfDdD5a10cE12c44d2EE266f45A44', creationBlockNumber: 7118080, }, + goerli: { + address: '0x399F5EE127ce7432E4921a61b8CF52b0af52cbfE', + creationBlockNumber: 7091472, + }, matic: { address: '0x2171a0dc12a9E5b1659feF2BB20E54c84Fa7dB0C', creationBlockNumber: 14163521, diff --git a/packages/smart-contracts/src/lib/artifacts/ERC20SwapToPay/index.ts b/packages/smart-contracts/src/lib/artifacts/ERC20SwapToPay/index.ts index 9e5f975c06..51c346834f 100644 --- a/packages/smart-contracts/src/lib/artifacts/ERC20SwapToPay/index.ts +++ b/packages/smart-contracts/src/lib/artifacts/ERC20SwapToPay/index.ts @@ -21,6 +21,10 @@ export const erc20SwapToPayArtifact = new ContractArtifact( address: '0xb674e3d228e631594D8fd4BF947E1811288bf836', creationBlockNumber: 7363204, }, + goerli: { + address: '0x0Ef49176A87Adcc88bD5125126C6a6c23a28303C', + creationBlockNumber: 7109102, + }, }, }, '0.3.0': { diff --git a/packages/smart-contracts/src/lib/artifacts/EthConversionProxy/index.ts b/packages/smart-contracts/src/lib/artifacts/EthConversionProxy/index.ts index 16c2dc5e21..c9720fa6d9 100644 --- a/packages/smart-contracts/src/lib/artifacts/EthConversionProxy/index.ts +++ b/packages/smart-contracts/src/lib/artifacts/EthConversionProxy/index.ts @@ -18,6 +18,10 @@ export const ethConversionArtifact = new ContractArtifact( address: '0xCa3353a15fCb5C83a1Ff64BFf055781aC5c4d2F4', creationBlockNumber: 9447194, }, + goerli: { + address: '0xED250D9219EB93098Bb67aEbc992963172B9c8DA', + creationBlockNumber: 7108896, + }, fantom: { address: '0xCa3353a15fCb5C83a1Ff64BFf055781aC5c4d2F4', creationBlockNumber: 20066436, diff --git a/packages/smart-contracts/src/lib/artifacts/EthereumFeeProxy/index.ts b/packages/smart-contracts/src/lib/artifacts/EthereumFeeProxy/index.ts index 8b0d26e0b0..48bfbf6b22 100644 --- a/packages/smart-contracts/src/lib/artifacts/EthereumFeeProxy/index.ts +++ b/packages/smart-contracts/src/lib/artifacts/EthereumFeeProxy/index.ts @@ -17,6 +17,10 @@ export const ethereumFeeProxyArtifact = new ContractArtifact( address: '0xC6E23a20C0a1933ACC8E30247B5D1e2215796C1F', creationBlockNumber: 9447193, }, + goerli: { + address: '0xe11BF2fDA23bF0A98365e1A4c04A87C9339e8687', + creationBlockNumber: 7091386, + }, fantom: { address: '0xC6E23a20C0a1933ACC8E30247B5D1e2215796C1F', creationBlockNumber: 20066431, diff --git a/packages/smart-contracts/src/lib/artifacts/EthereumProxy/index.ts b/packages/smart-contracts/src/lib/artifacts/EthereumProxy/index.ts index b318578e54..2602944bd0 100644 --- a/packages/smart-contracts/src/lib/artifacts/EthereumProxy/index.ts +++ b/packages/smart-contracts/src/lib/artifacts/EthereumProxy/index.ts @@ -21,6 +21,10 @@ export const ethereumProxyArtifact = new ContractArtifact( address: '0x9c6c7817e3679c4b3f9ef9486001eae5aaed25ff', creationBlockNumber: 5955681, }, + goerli: { + address: '0x171Ee0881407d4c0C11eA1a2FB7D5b4cdED71e6e', + creationBlockNumber: 7069045, + }, xdai: { address: '0x27c60BE17e853c47A9F1d280B05365f483c2dFAF', creationBlockNumber: 18326895, From c46d591bff2a253fec6a5f2ace031c16500e287d Mon Sep 17 00:00:00 2001 From: Romain <45540622+rom1trt@users.noreply.github.com> Date: Fri, 29 Jul 2022 10:47:50 +0200 Subject: [PATCH 31/85] fix: ETHConversionProxy to EthConversionProxy --- .../contract-setup/setupETHConversionProxy.ts | 47 ------------------- 1 file changed, 47 deletions(-) delete mode 100644 packages/smart-contracts/scripts-create2/contract-setup/setupETHConversionProxy.ts diff --git a/packages/smart-contracts/scripts-create2/contract-setup/setupETHConversionProxy.ts b/packages/smart-contracts/scripts-create2/contract-setup/setupETHConversionProxy.ts deleted file mode 100644 index 28d1c974d9..0000000000 --- a/packages/smart-contracts/scripts-create2/contract-setup/setupETHConversionProxy.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { batchPaymentsArtifact } from '../../src/lib'; -import { HardhatRuntimeEnvironmentExtended } from '../types'; -import utils from '@requestnetwork/utils'; -import { updateChainlinkConversionPath, updatePaymentErc20FeeProxy } from './adminTasks'; - -/** - * Updates the values of the batch fees of the BatchPayments contract, if needed - * @param contractAddress address of the BatchPayments Proxy - * @param hre Hardhat runtime environment - */ -export const setupEthConversionProxy = async ( - contractAddress: string, - hre: HardhatRuntimeEnvironmentExtended, -): Promise => { - // Setup contract parameters - const EthConversionProxyContract = new hre.ethers.Contract( - contractAddress, - batchPaymentsArtifact.getContractAbi(), - ); - await Promise.all( - hre.config.xdeploy.networks.map(async (network) => { - let provider; - if (network === 'celo') { - provider = utils.getCeloProvider(); - } else { - provider = utils.getDefaultProvider(network); - } - const wallet = new hre.ethers.Wallet(hre.config.xdeploy.signer, provider); - const signer = wallet.connect(provider); - const EthConversionProxyConnected = await EthConversionProxyContract.connect(signer); - const adminNonce = await signer.getTransactionCount(); - const gasPrice = await provider.getGasPrice(); - - // start from the adminNonce, increase gasPrice if needed - await Promise.all([ - updatePaymentErc20FeeProxy(EthConversionProxyConnected, network, adminNonce, gasPrice), - updateChainlinkConversionPath( - EthConversionProxyConnected, - network, - adminNonce + 1, - gasPrice, - ), - ]); - }), - ); - console.log('Setup for EthConversionProxy successful'); -}; From 8aa6874fa31794bc136ed6ae556ab93ca6738fb3 Mon Sep 17 00:00:00 2001 From: Romain TREFAULT Date: Fri, 29 Jul 2022 10:49:06 +0200 Subject: [PATCH 32/85] ETHConversionProxy to EthConversionProxy --- .../{setupEthConversionProxy.ts => EthConversionProxy.ts} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename packages/smart-contracts/scripts-create2/contract-setup/{setupEthConversionProxy.ts => EthConversionProxy.ts} (100%) diff --git a/packages/smart-contracts/scripts-create2/contract-setup/setupEthConversionProxy.ts b/packages/smart-contracts/scripts-create2/contract-setup/EthConversionProxy.ts similarity index 100% rename from packages/smart-contracts/scripts-create2/contract-setup/setupEthConversionProxy.ts rename to packages/smart-contracts/scripts-create2/contract-setup/EthConversionProxy.ts From c50295d94b901ee2ef0641ed7089f01aba5e36ee Mon Sep 17 00:00:00 2001 From: Romain <45540622+rom1trt@users.noreply.github.com> Date: Fri, 29 Jul 2022 10:54:18 +0200 Subject: [PATCH 33/85] refactor: keep 0.2.0 goerli version --- .../src/lib/artifacts/Erc20SwapConversion/index.ts | 4 ---- 1 file changed, 4 deletions(-) diff --git a/packages/smart-contracts/src/lib/artifacts/Erc20SwapConversion/index.ts b/packages/smart-contracts/src/lib/artifacts/Erc20SwapConversion/index.ts index 1852293575..8eae29f28c 100644 --- a/packages/smart-contracts/src/lib/artifacts/Erc20SwapConversion/index.ts +++ b/packages/smart-contracts/src/lib/artifacts/Erc20SwapConversion/index.ts @@ -18,10 +18,6 @@ export const erc20SwapConversionArtifact = new ContractArtifact Date: Fri, 29 Jul 2022 12:25:47 +0200 Subject: [PATCH 34/85] fix: EthConversionProxy to setupEth... --- .../{EthConversionProxy.ts => setupEthConversionProxy.ts} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename packages/smart-contracts/scripts-create2/contract-setup/{EthConversionProxy.ts => setupEthConversionProxy.ts} (100%) diff --git a/packages/smart-contracts/scripts-create2/contract-setup/EthConversionProxy.ts b/packages/smart-contracts/scripts-create2/contract-setup/setupEthConversionProxy.ts similarity index 100% rename from packages/smart-contracts/scripts-create2/contract-setup/EthConversionProxy.ts rename to packages/smart-contracts/scripts-create2/contract-setup/setupEthConversionProxy.ts From f107716a2e617d4665b1cdb0a9860c1094b5bce6 Mon Sep 17 00:00:00 2001 From: Romain TREFAULT Date: Fri, 29 Jul 2022 13:24:00 +0200 Subject: [PATCH 35/85] fix: EthConversionProxy to ETHConversion... --- .../scripts-create2/compute-one-address.ts | 2 +- .../scripts-create2/constructor-args.ts | 3 +- .../contract-setup/setupETHConversionProxy.ts | 2 +- .../contract-setup/setupEthConversionProxy.ts | 47 ------------------- .../scripts-create2/contract-setup/setups.ts | 8 ++-- .../smart-contracts/scripts-create2/deploy.ts | 2 +- .../smart-contracts/scripts-create2/utils.ts | 4 +- .../smart-contracts/scripts-create2/verify.ts | 2 +- 8 files changed, 11 insertions(+), 59 deletions(-) delete mode 100644 packages/smart-contracts/scripts-create2/contract-setup/setupEthConversionProxy.ts diff --git a/packages/smart-contracts/scripts-create2/compute-one-address.ts b/packages/smart-contracts/scripts-create2/compute-one-address.ts index f2803616ed..7e8c4809a7 100644 --- a/packages/smart-contracts/scripts-create2/compute-one-address.ts +++ b/packages/smart-contracts/scripts-create2/compute-one-address.ts @@ -52,7 +52,7 @@ export const computeCreate2DeploymentAddressesFromList = async ( switch (contract) { case 'EthereumProxy': case 'EthereumFeeProxy': - case 'EthConversionProxy': + case 'ETHConversionProxy': case 'ERC20FeeProxy': case 'Erc20ConversionProxy': case 'ERC20EscrowToPay': diff --git a/packages/smart-contracts/scripts-create2/constructor-args.ts b/packages/smart-contracts/scripts-create2/constructor-args.ts index 178501ac3a..58217038c8 100644 --- a/packages/smart-contracts/scripts-create2/constructor-args.ts +++ b/packages/smart-contracts/scripts-create2/constructor-args.ts @@ -16,13 +16,12 @@ export const getConstructorArgs = (contract: string, network?: string): string[] getAdminWalletAddress(contract), ]; } - case 'EthConversionProxy': { + case 'ETHConversionProxy': { return [ '0x0000000000000000000000000000000000000000', '0x0000000000000000000000000000000000000000', '0x39e19aa5b69466dfdc313c7cda37cb2a599015cd', ]; - // TODO setupEthConversionProxy } case 'ERC20SwapToConversion': { return [getAdminWalletAddress(contract)]; diff --git a/packages/smart-contracts/scripts-create2/contract-setup/setupETHConversionProxy.ts b/packages/smart-contracts/scripts-create2/contract-setup/setupETHConversionProxy.ts index 28d1c974d9..b0c0cbfee8 100644 --- a/packages/smart-contracts/scripts-create2/contract-setup/setupETHConversionProxy.ts +++ b/packages/smart-contracts/scripts-create2/contract-setup/setupETHConversionProxy.ts @@ -8,7 +8,7 @@ import { updateChainlinkConversionPath, updatePaymentErc20FeeProxy } from './adm * @param contractAddress address of the BatchPayments Proxy * @param hre Hardhat runtime environment */ -export const setupEthConversionProxy = async ( +export const setupETHConversionProxy = async ( contractAddress: string, hre: HardhatRuntimeEnvironmentExtended, ): Promise => { diff --git a/packages/smart-contracts/scripts-create2/contract-setup/setupEthConversionProxy.ts b/packages/smart-contracts/scripts-create2/contract-setup/setupEthConversionProxy.ts deleted file mode 100644 index 28d1c974d9..0000000000 --- a/packages/smart-contracts/scripts-create2/contract-setup/setupEthConversionProxy.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { batchPaymentsArtifact } from '../../src/lib'; -import { HardhatRuntimeEnvironmentExtended } from '../types'; -import utils from '@requestnetwork/utils'; -import { updateChainlinkConversionPath, updatePaymentErc20FeeProxy } from './adminTasks'; - -/** - * Updates the values of the batch fees of the BatchPayments contract, if needed - * @param contractAddress address of the BatchPayments Proxy - * @param hre Hardhat runtime environment - */ -export const setupEthConversionProxy = async ( - contractAddress: string, - hre: HardhatRuntimeEnvironmentExtended, -): Promise => { - // Setup contract parameters - const EthConversionProxyContract = new hre.ethers.Contract( - contractAddress, - batchPaymentsArtifact.getContractAbi(), - ); - await Promise.all( - hre.config.xdeploy.networks.map(async (network) => { - let provider; - if (network === 'celo') { - provider = utils.getCeloProvider(); - } else { - provider = utils.getDefaultProvider(network); - } - const wallet = new hre.ethers.Wallet(hre.config.xdeploy.signer, provider); - const signer = wallet.connect(provider); - const EthConversionProxyConnected = await EthConversionProxyContract.connect(signer); - const adminNonce = await signer.getTransactionCount(); - const gasPrice = await provider.getGasPrice(); - - // start from the adminNonce, increase gasPrice if needed - await Promise.all([ - updatePaymentErc20FeeProxy(EthConversionProxyConnected, network, adminNonce, gasPrice), - updateChainlinkConversionPath( - EthConversionProxyConnected, - network, - adminNonce + 1, - gasPrice, - ), - ]); - }), - ); - console.log('Setup for EthConversionProxy successful'); -}; diff --git a/packages/smart-contracts/scripts-create2/contract-setup/setups.ts b/packages/smart-contracts/scripts-create2/contract-setup/setups.ts index f650553bf0..cda45affa2 100644 --- a/packages/smart-contracts/scripts-create2/contract-setup/setups.ts +++ b/packages/smart-contracts/scripts-create2/contract-setup/setups.ts @@ -1,10 +1,10 @@ import { HardhatRuntimeEnvironmentExtended } from '../types'; -import { setupEthConversionProxy } from './setupEthConversionProxy'; +import { setupETHConversionProxy } from './setupETHConversionProxy'; import { setupBatchPayments } from './setupBatchPayments'; import { setupERC20SwapToConversion } from './setupERC20SwapToConversion'; /** - * Updates the values of either BatchPayments, EthConversionProxy, or ERC20SwapToConversion contract, if needed + * Updates the values of either BatchPayments, ETHConversionProxy, or ERC20SwapToConversion contract, if needed * @param contractAddress address of the proxy * @param hre Hardhat runtime environment * @param contractName name of the contract @@ -15,8 +15,8 @@ export const setupContract = async ( contractName: string, ): Promise => { switch (contractName) { - case 'EthConversionProxy': { - await setupEthConversionProxy(contractAddress, hre); + case 'ETHConversionProxy': { + await setupETHConversionProxy(contractAddress, hre); break; } case 'ERC20SwapToConversion': { diff --git a/packages/smart-contracts/scripts-create2/deploy.ts b/packages/smart-contracts/scripts-create2/deploy.ts index 23dbfc931b..ec15644fac 100644 --- a/packages/smart-contracts/scripts-create2/deploy.ts +++ b/packages/smart-contracts/scripts-create2/deploy.ts @@ -53,7 +53,7 @@ export const deployWithCreate2FromList = async ( switch (contract) { case 'EthereumProxy': case 'EthereumFeeProxy': - case 'EthConversionProxy': + case 'ETHConversionProxy': case 'ERC20FeeProxy': case 'Erc20ConversionProxy': { const constructorArgs = getConstructorArgs(contract); diff --git a/packages/smart-contracts/scripts-create2/utils.ts b/packages/smart-contracts/scripts-create2/utils.ts index ad58a5f04c..d5be7e5c33 100644 --- a/packages/smart-contracts/scripts-create2/utils.ts +++ b/packages/smart-contracts/scripts-create2/utils.ts @@ -9,7 +9,7 @@ import * as artifacts from '../src/lib'; export const create2ContractDeploymentList = [ 'EthereumProxy', 'EthereumFeeProxy', - 'EthConversionProxy', + 'ETHConversionProxy', 'ERC20FeeProxy', 'Erc20ConversionProxy', 'ERC20SwapToConversion', @@ -39,7 +39,7 @@ export const getArtifact = (contract: string): artifacts.ContractArtifact Date: Sat, 30 Jul 2022 17:33:34 +0200 Subject: [PATCH 36/85] commented goerli in eth-input detector --- packages/payment-detection/test/eth/info-retriever.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/payment-detection/test/eth/info-retriever.test.ts b/packages/payment-detection/test/eth/info-retriever.test.ts index ab7c3e2451..8a50bfddba 100644 --- a/packages/payment-detection/test/eth/info-retriever.test.ts +++ b/packages/payment-detection/test/eth/info-retriever.test.ts @@ -51,7 +51,7 @@ describe('api/eth/info-retriever', () => { [ 'mainnet', 'rinkeby', - 'goerli', + // 'goerli', // 'xdai', // 'sokol', 'fuse', From 35ce7424a4b59293cc4372292fd3fe113f5b99d2 Mon Sep 17 00:00:00 2001 From: Darko Kolev Date: Sat, 30 Jul 2022 19:40:04 +0200 Subject: [PATCH 37/85] fixing eth-input-data goerli test --- .../test/eth/input-data.test.ts | 25 +++++++++---------- .../src/lib/artifacts/EthereumProxy/index.ts | 4 --- 2 files changed, 12 insertions(+), 17 deletions(-) diff --git a/packages/payment-detection/test/eth/input-data.test.ts b/packages/payment-detection/test/eth/input-data.test.ts index b7d7489698..a76ed3b946 100644 --- a/packages/payment-detection/test/eth/input-data.test.ts +++ b/packages/payment-detection/test/eth/input-data.test.ts @@ -159,8 +159,7 @@ describe('api/eth/input-data', () => { balance: null, error: { code: PaymentTypes.BALANCE_ERROR_CODE.NETWORK_NOT_SUPPORTED, - message: - /Payment network wrong not supported by ETH payment detection\. Supported networks: mainnet, rinkeby, goerli, private.*/, + message: /Payment network wrong not supported by ETH payment detection\. Supported networks: mainnet, rinkeby, goerli, private.*/, }, events: [], }); @@ -253,7 +252,7 @@ describe('api/eth/input-data', () => { type: RequestLogicTypes.CURRENCY.ETH, value: 'ETH-goerli', }, - expectedAmount: '80000000000000000', + expectedAmount: '7000000000000', payee: { type: 'ethereumAddress', value: '0x1D274D164937465B7A7259347AD3f1aaEEEaC8e1', @@ -262,16 +261,16 @@ describe('api/eth/input-data', () => { type: 'ethereumAddress', value: '0x5e7D193321A4CCB091038d01755a10d143cb2Dc8', }, - timestamp: 1620207049, + timestamp: 1659195985, extensionsData: [ { action: 'create', id: 'pn-eth-input-data', parameters: { - paymentAddress: '0x8400b234e7B113686bD584af9b1041E5a233E754', + paymentAddress: '0xBc9643B7Bd7c8621F4a68280433796484b9E525d', salt: '2334c5f6691a9131', }, - version: '0.2.0', + version: '0.3.0', }, ], extensions: { @@ -280,19 +279,19 @@ describe('api/eth/input-data', () => { { name: 'create', parameters: { - paymentAddress: '0x8400b234e7B113686bD584af9b1041E5a233E754', + paymentAddress: '0xBc9643B7Bd7c8621F4a68280433796484b9E525d', salt: '2334c5f6691a9131', }, - timestamp: 1620207051, + timestamp: 1659195985, }, ], id: 'pn-eth-input-data', type: 'payment-network', values: { - paymentAddress: '0x8400b234e7B113686bD584af9b1041E5a233E754', + paymentAddress: '0xBc9643B7Bd7c8621F4a68280433796484b9E525d', salt: '2334c5f6691a9131', }, - version: '0.2.0', + version: '0.3.0', }, }, requestId: '0110e7eaba7a3ff2e2239081497308db70e4c66362100d747903ffa5c83d290d5d', @@ -305,7 +304,7 @@ describe('api/eth/input-data', () => { }, name: 'create', parameters: { - expectedAmount: '80000000000000000', + expectedAmount: '7000000000000', extensionsDataLength: 2, isSignedRequest: false, }, @@ -319,10 +318,10 @@ describe('api/eth/input-data', () => { }, }; const balance = await ethInputData.getBalance(goerliRequest as RequestLogicTypes.IRequest); - expect(balance.balance).toBe('80000000000000000'); + expect(balance.balance).toBe('7000000000000'); expect(balance.events).toHaveLength(1); expect(balance.events[0].name).toBe(PaymentTypes.EVENTS_NAMES.PAYMENT); - expect(balance.events[0].amount).toBe('80000000000000000'); + expect(balance.events[0].amount).toBe('7000000000000'); expect(typeof balance.events[0].timestamp).toBe('number'); }); }); diff --git a/packages/smart-contracts/src/lib/artifacts/EthereumProxy/index.ts b/packages/smart-contracts/src/lib/artifacts/EthereumProxy/index.ts index 2602944bd0..b318578e54 100644 --- a/packages/smart-contracts/src/lib/artifacts/EthereumProxy/index.ts +++ b/packages/smart-contracts/src/lib/artifacts/EthereumProxy/index.ts @@ -21,10 +21,6 @@ export const ethereumProxyArtifact = new ContractArtifact( address: '0x9c6c7817e3679c4b3f9ef9486001eae5aaed25ff', creationBlockNumber: 5955681, }, - goerli: { - address: '0x171Ee0881407d4c0C11eA1a2FB7D5b4cdED71e6e', - creationBlockNumber: 7069045, - }, xdai: { address: '0x27c60BE17e853c47A9F1d280B05365f483c2dFAF', creationBlockNumber: 18326895, From 0dc4e86822f6e90e64b8f683b5816cdd371e45ff Mon Sep 17 00:00:00 2001 From: Darko Kolev Date: Sat, 30 Jul 2022 19:52:07 +0200 Subject: [PATCH 38/85] fixed formatting --- packages/payment-detection/test/eth/input-data.test.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/payment-detection/test/eth/input-data.test.ts b/packages/payment-detection/test/eth/input-data.test.ts index a76ed3b946..ce68981d51 100644 --- a/packages/payment-detection/test/eth/input-data.test.ts +++ b/packages/payment-detection/test/eth/input-data.test.ts @@ -159,7 +159,8 @@ describe('api/eth/input-data', () => { balance: null, error: { code: PaymentTypes.BALANCE_ERROR_CODE.NETWORK_NOT_SUPPORTED, - message: /Payment network wrong not supported by ETH payment detection\. Supported networks: mainnet, rinkeby, goerli, private.*/, + message: + /Payment network wrong not supported by ETH payment detection\. Supported networks: mainnet, rinkeby, goerli, private.*/, }, events: [], }); From 5a507df7c48693ea1fcb978bd0272312852a93f5 Mon Sep 17 00:00:00 2001 From: Darko Kolev Date: Sat, 30 Jul 2022 22:14:31 +0200 Subject: [PATCH 39/85] removed goerli input data test --- .../test/eth/input-data.test.ts | 80 ------------------- 1 file changed, 80 deletions(-) diff --git a/packages/payment-detection/test/eth/input-data.test.ts b/packages/payment-detection/test/eth/input-data.test.ts index ce68981d51..054c189c16 100644 --- a/packages/payment-detection/test/eth/input-data.test.ts +++ b/packages/payment-detection/test/eth/input-data.test.ts @@ -245,84 +245,4 @@ describe('api/eth/input-data', () => { expect(balance.events[0].amount).toBe('80000000000000000'); expect(typeof balance.events[0].timestamp).toBe('number'); }); - - it('can get balance from goerli subgraph', async () => { - const goerliRequest = { - currency: { - network: 'goerli', - type: RequestLogicTypes.CURRENCY.ETH, - value: 'ETH-goerli', - }, - expectedAmount: '7000000000000', - payee: { - type: 'ethereumAddress', - value: '0x1D274D164937465B7A7259347AD3f1aaEEEaC8e1', - }, - payer: { - type: 'ethereumAddress', - value: '0x5e7D193321A4CCB091038d01755a10d143cb2Dc8', - }, - timestamp: 1659195985, - extensionsData: [ - { - action: 'create', - id: 'pn-eth-input-data', - parameters: { - paymentAddress: '0xBc9643B7Bd7c8621F4a68280433796484b9E525d', - salt: '2334c5f6691a9131', - }, - version: '0.3.0', - }, - ], - extensions: { - 'pn-eth-input-data': { - events: [ - { - name: 'create', - parameters: { - paymentAddress: '0xBc9643B7Bd7c8621F4a68280433796484b9E525d', - salt: '2334c5f6691a9131', - }, - timestamp: 1659195985, - }, - ], - id: 'pn-eth-input-data', - type: 'payment-network', - values: { - paymentAddress: '0xBc9643B7Bd7c8621F4a68280433796484b9E525d', - salt: '2334c5f6691a9131', - }, - version: '0.3.0', - }, - }, - requestId: '0110e7eaba7a3ff2e2239081497308db70e4c66362100d747903ffa5c83d290d5d', - version: '2.0.3', - events: [ - { - actionSigner: { - type: 'ethereumAddress', - value: '0x1D274D164937465B7A7259347AD3f1aaEEEaC8e1', - }, - name: 'create', - parameters: { - expectedAmount: '7000000000000', - extensionsDataLength: 2, - isSignedRequest: false, - }, - timestamp: 1620207051, - }, - ], - state: 'created', - creator: { - type: 'ethereumAddress', - value: '0x1D274D164937465B7A7259347AD3f1aaEEEaC8e1', - }, - }; - const balance = await ethInputData.getBalance(goerliRequest as RequestLogicTypes.IRequest); - expect(balance.balance).toBe('7000000000000'); - expect(balance.events).toHaveLength(1); - expect(balance.events[0].name).toBe(PaymentTypes.EVENTS_NAMES.PAYMENT); - expect(balance.events[0].amount).toBe('7000000000000'); - expect(typeof balance.events[0].timestamp).toBe('number'); - }); }); From 9fda90def40640a6e9600bf474a7a505265add3e Mon Sep 17 00:00:00 2001 From: Darko Kolev Date: Sat, 30 Jul 2022 22:17:28 +0200 Subject: [PATCH 40/85] updated escrow test config --- .../test/erc20/escrow-info-retriever.test.ts | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/packages/payment-detection/test/erc20/escrow-info-retriever.test.ts b/packages/payment-detection/test/erc20/escrow-info-retriever.test.ts index 03431e5089..c7e3690810 100644 --- a/packages/payment-detection/test/erc20/escrow-info-retriever.test.ts +++ b/packages/payment-detection/test/erc20/escrow-info-retriever.test.ts @@ -16,7 +16,8 @@ describe('api/erc20/escrow-info-retriever', () => { blockHash: '0x5be4f7b06ebbe0df573da7bc70768247abdc4e03e70264e946226d7154e42742', transactionIndex: 0, address: '0xB9B7e0cb2EDF5Ea031C8B297A5A1Fa20379b6A0a', - data: '0x3a322d4500000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002aaaa000000000000000000000000000000000000000000000000000000000000', + data: + '0x3a322d4500000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002aaaa000000000000000000000000000000000000000000000000000000000000', topics: [ '0x37b4fae7fd90ce3674204f79d686d40c4069a66c402976717d4f30817c0c0939', '0x6330b989705733cc5c1f7285b8a5b892e08be86ed6fbe9d254713a4277bc5bd2', @@ -30,7 +31,8 @@ describe('api/erc20/escrow-info-retriever', () => { blockHash: '0x5be4f7b06ebbe0df573da7bc70768247abdc4e03e70264e946226d7154e42742', transactionIndex: 0, address: '0xB9B7e0cb2EDF5Ea031C8B297A5A1Fa20379b6A0a', - data: '0x82865e9d00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002aaaa000000000000000000000000000000000000000000000000000000000000', + data: + '0x82865e9d00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002aaaa000000000000000000000000000000000000000000000000000000000000', topics: [ '0x5e14b9b7c3d9675ce5ecb24ee8181d371561709a08aa9c412acb36627386dba8', '0x6330b989705733cc5c1f7285b8a5b892e08be86ed6fbe9d254713a4277bc5bd2', @@ -44,7 +46,8 @@ describe('api/erc20/escrow-info-retriever', () => { blockHash: '0x5be4f7b06ebbe0df573da7bc70768247abdc4e03e70264e946226d7154e42742', transactionIndex: 0, address: '0xB9B7e0cb2EDF5Ea031C8B297A5A1Fa20379b6A0a', - data: '0x0797560800000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002aaaa000000000000000000000000000000000000000000000000000000000000', + data: + '0x0797560800000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002aaaa000000000000000000000000000000000000000000000000000000000000', topics: [ '0xcc401323a0bd24a2e6e1564e168c52332731fff1a2937d998ee25462588ba0fa', '0x6330b989705733cc5c1f7285b8a5b892e08be86ed6fbe9d254713a4277bc5bd2', @@ -167,7 +170,7 @@ describe('api/erc20/escrow-info-retriever', () => { beforeAll(() => { infoRetriever = new EscrowERC20InfoRetriever( paymentReferenceMock, - '0x8230e703B1c4467A4543422b2cC3284133B9AB5e', + '0xd2777001fD7D89331D8E87eC439f78079179322b', 0, '', '', @@ -178,13 +181,12 @@ describe('api/erc20/escrow-info-retriever', () => { const escrowChainData = await infoRetriever.getEscrowRequestMapping(); // Not yet ERC777 token on goerli // expect(escrowChainData.tokenAddress).toEqual('0x745861AeD1EEe363b4AaA5F1994Be40b1e05Ff90'); - expect(escrowChainData.payee).toEqual('0xB9B7e0cb2EDF5Ea031C8B297A5A1Fa20379b6A0a'); - expect(escrowChainData.payer).toEqual('0x0c051a1f4E209b00c8E7C00AD0ce79B3630a7401'); - expect(escrowChainData.amount.toString()).toEqual('123000000000000000000'); - expect(escrowChainData.unlockDate.toString()).toEqual('1670505020'); + expect(escrowChainData.payer).toEqual('0xffb1d8efecaa177deef1cd1ab202e5e9f6a84db4'); + expect(escrowChainData.amount.toString()).toEqual('20000000000000000'); + expect(escrowChainData.unlockDate.toString()).toEqual('0'); expect(escrowChainData.emergencyClaimDate.toString()).toEqual('0'); expect(escrowChainData.emergencyState).toEqual(false); - expect(escrowChainData.isFrozen).toEqual(true); + expect(escrowChainData.isFrozen).toEqual(false); }); }); }); From 874d00be4b5908896223b8c166ffeb0ffe525d22 Mon Sep 17 00:00:00 2001 From: Darko Kolev Date: Sun, 31 Jul 2022 08:50:38 +0200 Subject: [PATCH 41/85] fixed formatting --- .../test/erc20/escrow-info-retriever.test.ts | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/packages/payment-detection/test/erc20/escrow-info-retriever.test.ts b/packages/payment-detection/test/erc20/escrow-info-retriever.test.ts index c7e3690810..443b3fa88e 100644 --- a/packages/payment-detection/test/erc20/escrow-info-retriever.test.ts +++ b/packages/payment-detection/test/erc20/escrow-info-retriever.test.ts @@ -16,8 +16,7 @@ describe('api/erc20/escrow-info-retriever', () => { blockHash: '0x5be4f7b06ebbe0df573da7bc70768247abdc4e03e70264e946226d7154e42742', transactionIndex: 0, address: '0xB9B7e0cb2EDF5Ea031C8B297A5A1Fa20379b6A0a', - data: - '0x3a322d4500000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002aaaa000000000000000000000000000000000000000000000000000000000000', + data: '0x3a322d4500000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002aaaa000000000000000000000000000000000000000000000000000000000000', topics: [ '0x37b4fae7fd90ce3674204f79d686d40c4069a66c402976717d4f30817c0c0939', '0x6330b989705733cc5c1f7285b8a5b892e08be86ed6fbe9d254713a4277bc5bd2', @@ -31,8 +30,7 @@ describe('api/erc20/escrow-info-retriever', () => { blockHash: '0x5be4f7b06ebbe0df573da7bc70768247abdc4e03e70264e946226d7154e42742', transactionIndex: 0, address: '0xB9B7e0cb2EDF5Ea031C8B297A5A1Fa20379b6A0a', - data: - '0x82865e9d00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002aaaa000000000000000000000000000000000000000000000000000000000000', + data: '0x82865e9d00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002aaaa000000000000000000000000000000000000000000000000000000000000', topics: [ '0x5e14b9b7c3d9675ce5ecb24ee8181d371561709a08aa9c412acb36627386dba8', '0x6330b989705733cc5c1f7285b8a5b892e08be86ed6fbe9d254713a4277bc5bd2', @@ -46,8 +44,7 @@ describe('api/erc20/escrow-info-retriever', () => { blockHash: '0x5be4f7b06ebbe0df573da7bc70768247abdc4e03e70264e946226d7154e42742', transactionIndex: 0, address: '0xB9B7e0cb2EDF5Ea031C8B297A5A1Fa20379b6A0a', - data: - '0x0797560800000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002aaaa000000000000000000000000000000000000000000000000000000000000', + data: '0x0797560800000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002aaaa000000000000000000000000000000000000000000000000000000000000', topics: [ '0xcc401323a0bd24a2e6e1564e168c52332731fff1a2937d998ee25462588ba0fa', '0x6330b989705733cc5c1f7285b8a5b892e08be86ed6fbe9d254713a4277bc5bd2', From dca533abb4dd740edffc2b080acf35b7895606c0 Mon Sep 17 00:00:00 2001 From: Darko Kolev Date: Sun, 31 Jul 2022 09:37:40 +0200 Subject: [PATCH 42/85] fixed casing --- .../payment-detection/test/erc20/escrow-info-retriever.test.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/payment-detection/test/erc20/escrow-info-retriever.test.ts b/packages/payment-detection/test/erc20/escrow-info-retriever.test.ts index 443b3fa88e..e5e9a87c73 100644 --- a/packages/payment-detection/test/erc20/escrow-info-retriever.test.ts +++ b/packages/payment-detection/test/erc20/escrow-info-retriever.test.ts @@ -177,8 +177,7 @@ describe('api/erc20/escrow-info-retriever', () => { it('should get escrow chain data', async () => { const escrowChainData = await infoRetriever.getEscrowRequestMapping(); // Not yet ERC777 token on goerli - // expect(escrowChainData.tokenAddress).toEqual('0x745861AeD1EEe363b4AaA5F1994Be40b1e05Ff90'); - expect(escrowChainData.payer).toEqual('0xffb1d8efecaa177deef1cd1ab202e5e9f6a84db4'); + expect(escrowChainData.payer).toEqual('0xffb1D8EfeCAA177DeEf1cD1AB202E5E9f6a84db4'); expect(escrowChainData.amount.toString()).toEqual('20000000000000000'); expect(escrowChainData.unlockDate.toString()).toEqual('0'); expect(escrowChainData.emergencyClaimDate.toString()).toEqual('0'); From edf224a404c5b4fe18586d75633555fa51989108 Mon Sep 17 00:00:00 2001 From: Darko Kolev Date: Sun, 31 Jul 2022 10:22:20 +0200 Subject: [PATCH 43/85] fixed amount --- .../payment-detection/test/erc20/escrow-info-retriever.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/payment-detection/test/erc20/escrow-info-retriever.test.ts b/packages/payment-detection/test/erc20/escrow-info-retriever.test.ts index e5e9a87c73..cc6aeb2ad4 100644 --- a/packages/payment-detection/test/erc20/escrow-info-retriever.test.ts +++ b/packages/payment-detection/test/erc20/escrow-info-retriever.test.ts @@ -178,7 +178,7 @@ describe('api/erc20/escrow-info-retriever', () => { const escrowChainData = await infoRetriever.getEscrowRequestMapping(); // Not yet ERC777 token on goerli expect(escrowChainData.payer).toEqual('0xffb1D8EfeCAA177DeEf1cD1AB202E5E9f6a84db4'); - expect(escrowChainData.amount.toString()).toEqual('20000000000000000'); + expect(escrowChainData.amount.toString()).toEqual('1'); expect(escrowChainData.unlockDate.toString()).toEqual('0'); expect(escrowChainData.emergencyClaimDate.toString()).toEqual('0'); expect(escrowChainData.emergencyState).toEqual(false); From 1553b7d0b05cb0eb22e62918ff57d66546772e4b Mon Sep 17 00:00:00 2001 From: Darko Kolev Date: Thu, 7 Jul 2022 17:51:55 +0300 Subject: [PATCH 44/85] fix: escrow audit fix 2 (#878) --- .../src/contracts/ERC20EscrowToPay.sol | 10 +++++-- .../test/contracts/ERC20EscrowToPay.test.ts | 30 ++++++++++++++----- 2 files changed, 30 insertions(+), 10 deletions(-) diff --git a/packages/smart-contracts/src/contracts/ERC20EscrowToPay.sol b/packages/smart-contracts/src/contracts/ERC20EscrowToPay.sol index a961db772c..cda2702188 100644 --- a/packages/smart-contracts/src/contracts/ERC20EscrowToPay.sol +++ b/packages/smart-contracts/src/contracts/ERC20EscrowToPay.sol @@ -151,13 +151,19 @@ contract ERC20EscrowToPay is Ownable { revert('not payable receive'); } + /** + * @notice Sets duration of emergency period, with minimum value of 30 days. + */ function setEmergencyClaimPeriod(uint256 _emergencyClaimPeriod) external onlyOwner { - require(_emergencyClaimPeriod >= 30, 'emergency period too short'); + require(_emergencyClaimPeriod >= 30 days, 'emergency period too short'); emergencyClaimPeriod = _emergencyClaimPeriod; } + /** + * @notice Sets duration of freeze period, with minimum value of 30 days. + */ function setFrozenPeriod(uint256 _frozenPeriod) external onlyOwner { - require(_frozenPeriod >= 30, 'frozen period too short'); + require(_frozenPeriod >= 30 days, 'frozen period too short'); frozenPeriod = _frozenPeriod; } diff --git a/packages/smart-contracts/test/contracts/ERC20EscrowToPay.test.ts b/packages/smart-contracts/test/contracts/ERC20EscrowToPay.test.ts index 0f3ac5148f..4cca90f138 100644 --- a/packages/smart-contracts/test/contracts/ERC20EscrowToPay.test.ts +++ b/packages/smart-contracts/test/contracts/ERC20EscrowToPay.test.ts @@ -259,19 +259,33 @@ describe('Contract: ERC20EscrowToPay', () => { }); }); describe('Admin should be able to change emergency and freeze periods', () => { - it('Should be able to change emergency period', async () => { + it('Minimum emergency period is 30 days', async () => { const twoDaysInSeconds = 3600 * 24 * 2; - await erc20EscrowToPay.connect(admin).setEmergencyClaimPeriod(twoDaysInSeconds); + expect( + erc20EscrowToPay.connect(admin).setEmergencyClaimPeriod(twoDaysInSeconds), + ).to.be.revertedWith('emergency period too short'); + }); + + it('Minimum frozen period is 30 days', async () => { + const twentyNineDaysInSeconds = 3600 * 24 * 29; + expect( + erc20EscrowToPay.connect(admin).setFrozenPeriod(twentyNineDaysInSeconds), + ).to.be.revertedWith('frozen period too short'); + }); + + it('Should be able to adjust emergency period', async () => { + const thirtyOneDaysInSeconds = 3600 * 24 * 31; + await erc20EscrowToPay.connect(admin).setEmergencyClaimPeriod(thirtyOneDaysInSeconds); const contractEmergencyPeriod = await erc20EscrowToPay.connect(payee).emergencyClaimPeriod(); - expect(contractEmergencyPeriod).to.be.equal(twoDaysInSeconds); + expect(contractEmergencyPeriod).to.be.equal(thirtyOneDaysInSeconds); }); - it('Should be able to adjust freeze period, only admin', async () => { - const twoDaysInSeconds = 3600 * 24 * 2; - await erc20EscrowToPay.connect(admin).setFrozenPeriod(twoDaysInSeconds); + it('Should be able to adjust freeze period', async () => { + const thirtyOneDaysInSeconds = 3600 * 24 * 31; + await erc20EscrowToPay.connect(admin).setFrozenPeriod(thirtyOneDaysInSeconds); const contractFreezePeriod = await erc20EscrowToPay.connect(payee).frozenPeriod(); - expect(contractFreezePeriod).to.be.equal(twoDaysInSeconds); + expect(contractFreezePeriod).to.be.equal(thirtyOneDaysInSeconds); }); - it('Contract creator should not be able to change periods', async () => { + it('Contract creator who is not the owner, should not be able to change periods', async () => { expect(erc20EscrowToPay.connect(owner).setEmergencyClaimPeriod(100)).to.be.revertedWith( 'Ownable: caller is not the owner', ); From e2f11d85fa64bd6468f49e601e8a9d0d98d9955c Mon Sep 17 00:00:00 2001 From: yomarion Date: Fri, 8 Jul 2022 12:18:04 +0200 Subject: [PATCH 45/85] deploy: xdeployed and verified payments on goerli --- packages/smart-contracts/README.md | 52 +++++++++++-------- packages/smart-contracts/hardhat.config.ts | 6 +++ .../scripts-create2/compute-one-address.ts | 13 +++-- .../scripts-create2/deploy-one.ts | 5 +- .../smart-contracts/scripts-create2/utils.ts | 1 + .../scripts-create2/verify-one.ts | 1 + .../artifacts/Erc20SwapConversion/index.ts | 4 ++ 7 files changed, 55 insertions(+), 27 deletions(-) diff --git a/packages/smart-contracts/README.md b/packages/smart-contracts/README.md index bf07ad54b1..8c63a44330 100644 --- a/packages/smart-contracts/README.md +++ b/packages/smart-contracts/README.md @@ -102,28 +102,6 @@ And in another terminal, deploy the smart contracts locally with: yarn run deploy ``` -### Live deployment (Payment only) - -The goal of this script is to let all our payment contracts be deployed with the same sequence on every chain. - -The script also verify deployed contracts. - -**Be sure that artifacts are up-to-date with most recent deployments** - -Environment variables needed: `ETHERSCAN_API_KEY`, `ADMIN_WALLET_ADDRESS`, `DEPLOYMENT_PRIVATE_KEY` - -```bash -# First check what will be done -yarn hardhat deploy-live-payments --network matic --dry-run - -# Run -yarn hardhat deploy-live-payments --network matic - -# To test locally -yarn hardhat deploy-live-payments --network private --force -yarn hardhat deploy-live-payments --network private --force --dry-run -``` - ### Deployment through request deployer The request deployer enables multichain deployment of several smart contracts at predefined address. It is based on https://github.com/pcaversaccio/xdeployer @@ -159,6 +137,14 @@ Environment variables needed: `ADMIN_PRIVATE_KEY` You will need the request deployer to be deployed. Then run: +To deploy all contracts to one network, use: + +```bash +NETWORK= yarn hardhat deploy-contracts-through-deployer +``` + +If you want to deploy all contracts on all networks: + ```bash yarn hardhat deploy-contracts-through-deployer ``` @@ -181,6 +167,28 @@ yarn hardhat verify-contract-from-deployer --network The associated `EXPLORER_API_KEY` is mandatory. +### Live deployment (Payment only - deprecated method) + +The goal of this script is to let all our payment contracts be deployed with the same sequence on every chain. + +The script also verify deployed contracts. + +**Be sure that artifacts are up-to-date with most recent deployments** + +Environment variables needed: `ETHERSCAN_API_KEY`, `ADMIN_WALLET_ADDRESS`, `DEPLOYMENT_PRIVATE_KEY` + +```bash +# First check what will be done +yarn hardhat deploy-live-payments --network matic --dry-run + +# Run +yarn hardhat deploy-live-payments --network matic + +# To test locally +yarn hardhat deploy-live-payments --network private --force +yarn hardhat deploy-live-payments --network private --force --dry-run +``` + ### Tests After a local deployment: diff --git a/packages/smart-contracts/hardhat.config.ts b/packages/smart-contracts/hardhat.config.ts index c9369f911f..514bb2b494 100644 --- a/packages/smart-contracts/hardhat.config.ts +++ b/packages/smart-contracts/hardhat.config.ts @@ -69,6 +69,11 @@ export default { chainId: 4, accounts, }, + goerli: { + url: process.env.WEB3_PROVIDER_URL || 'https://goerli.infura.io/v3/YOUR_API_KEY', + chainId: 5, + accounts, + }, matic: { url: url('matic'), chainId: 137, @@ -124,6 +129,7 @@ export default { apiKey: { mainnet: process.env.ETHERSCAN_API_KEY, rinkeby: process.env.ETHERSCAN_API_KEY, + goerli: process.env.ETHERSCAN_API_KEY, // binance smart chain bsc: process.env.BSCSCAN_API_KEY, bscTestnet: process.env.BSCSCAN_API_KEY, diff --git a/packages/smart-contracts/scripts-create2/compute-one-address.ts b/packages/smart-contracts/scripts-create2/compute-one-address.ts index 17ebcc5c84..00afbd9289 100644 --- a/packages/smart-contracts/scripts-create2/compute-one-address.ts +++ b/packages/smart-contracts/scripts-create2/compute-one-address.ts @@ -52,11 +52,18 @@ export const computeCreate2DeploymentAddressesFromList = async ( switch (contract) { case 'EthereumProxy': case 'EthereumFeeProxy': + case 'ERC20FeeProxy': case 'Erc20ConversionProxy': + case 'ERC20EscrowToPay': + case 'BatchPayments': case 'ERC20SwapToConversion': { - const constructorArgs = getConstructorArgs(contract); - address = await computeCreate2DeploymentAddress({ contract, constructorArgs }, hre); - console.log(`${contract.padEnd(36, ' ')}${address}`); + try { + const constructorArgs = getConstructorArgs(contract, hre.network.name); + address = await computeCreate2DeploymentAddress({ contract, constructorArgs }, hre); + console.log(`${contract.padEnd(36, ' ')}${address}`); + } catch (e) { + console.warn(`ERROR computing address of ${contract}: ${e}`); + } break; } // Other cases to add when necessary diff --git a/packages/smart-contracts/scripts-create2/deploy-one.ts b/packages/smart-contracts/scripts-create2/deploy-one.ts index 3cf7c0c73a..535319e7e1 100644 --- a/packages/smart-contracts/scripts-create2/deploy-one.ts +++ b/packages/smart-contracts/scripts-create2/deploy-one.ts @@ -18,7 +18,7 @@ export const deployOneWithCreate2 = async ( const deploymentResult = await xdeploy(deploymentParams, hre); for (let i = 0; i < hre.config.xdeploy.networks.length; i++) { if (deploymentResult[i].deployed) { - console.log(`${deploymentParams.contract} succesffuly deployed:`); + console.log(`${deploymentParams.contract} successfully deployed:`); console.log(` On network: ${hre.config.xdeploy.networks[i]}`); console.log(` At address: ${deploymentResult[i].address}`); console.log(` At block: ${deploymentResult[i].receipt.blockNumber}`); @@ -53,6 +53,7 @@ export const deployWithCreate2FromList = async ( switch (contract) { case 'EthereumProxy': case 'EthereumFeeProxy': + case 'ERC20FeeProxy': case 'Erc20ConversionProxy': { const constructorArgs = getConstructorArgs(contract); await deployOneWithCreate2({ contract, constructorArgs }, hre); @@ -79,7 +80,7 @@ export const deployWithCreate2FromList = async ( } // Other cases to add when necessary default: - throw new Error(`The contrat ${contract} is not to be deployed using the CREATE2 scheme`); + throw new Error(`The contract ${contract} is not to be deployed using the CREATE2 scheme`); } } }; diff --git a/packages/smart-contracts/scripts-create2/utils.ts b/packages/smart-contracts/scripts-create2/utils.ts index 5f0fe3d9d8..04ef3377cb 100644 --- a/packages/smart-contracts/scripts-create2/utils.ts +++ b/packages/smart-contracts/scripts-create2/utils.ts @@ -9,6 +9,7 @@ import * as artifacts from '../src/lib'; export const create2ContractDeploymentList = [ 'EthereumProxy', 'EthereumFeeProxy', + 'ERC20FeeProxy', 'Erc20ConversionProxy', 'ERC20SwapToConversion', 'ERC20EscrowToPay', diff --git a/packages/smart-contracts/scripts-create2/verify-one.ts b/packages/smart-contracts/scripts-create2/verify-one.ts index 2b5875240c..b23570caba 100644 --- a/packages/smart-contracts/scripts-create2/verify-one.ts +++ b/packages/smart-contracts/scripts-create2/verify-one.ts @@ -27,6 +27,7 @@ export async function VerifyCreate2FromList(hre: HardhatRuntimeEnvironmentExtend switch (contract) { case 'EthereumProxy': case 'EthereumFeeProxy': + case 'ERC20FeeProxy': case 'ERC20SwapToConversion': case 'Erc20ConversionProxy': { const constructorArgs = getConstructorArgs(contract); diff --git a/packages/smart-contracts/src/lib/artifacts/Erc20SwapConversion/index.ts b/packages/smart-contracts/src/lib/artifacts/Erc20SwapConversion/index.ts index 5f221c55a8..8eae29f28c 100644 --- a/packages/smart-contracts/src/lib/artifacts/Erc20SwapConversion/index.ts +++ b/packages/smart-contracts/src/lib/artifacts/Erc20SwapConversion/index.ts @@ -63,6 +63,10 @@ export const erc20SwapConversionArtifact = new ContractArtifact Date: Fri, 8 Jul 2022 16:06:20 +0200 Subject: [PATCH 46/85] deploy: goerli contracts --- .../smart-contracts/src/lib/artifacts/BatchPayments/index.ts | 4 ++++ .../src/lib/artifacts/ChainlinkConversionPath/index.ts | 4 ++++ .../src/lib/artifacts/ERC20EscrowToPay/index.ts | 4 ++++ .../smart-contracts/src/lib/artifacts/ERC20FeeProxy/index.ts | 4 ++++ .../smart-contracts/src/lib/artifacts/ERC20SwapToPay/index.ts | 4 ++++ .../src/lib/artifacts/Erc20ConversionProxy/index.ts | 4 ++++ .../src/lib/artifacts/Erc20SwapConversion/index.ts | 4 ++++ .../src/lib/artifacts/EthConversionProxy/index.ts | 4 ++++ .../src/lib/artifacts/EthereumFeeProxy/index.ts | 4 ++++ .../smart-contracts/src/lib/artifacts/EthereumProxy/index.ts | 4 ++++ .../src/lib/artifacts/RequestDeployer/index.ts | 4 ++++ .../src/lib/artifacts/RequestHashStorage/index.ts | 4 ++++ .../src/lib/artifacts/RequestHashSubmitter/index.ts | 4 ++++ 13 files changed, 52 insertions(+) diff --git a/packages/smart-contracts/src/lib/artifacts/BatchPayments/index.ts b/packages/smart-contracts/src/lib/artifacts/BatchPayments/index.ts index e0de6d9db8..b62fc9924a 100644 --- a/packages/smart-contracts/src/lib/artifacts/BatchPayments/index.ts +++ b/packages/smart-contracts/src/lib/artifacts/BatchPayments/index.ts @@ -17,6 +17,10 @@ export const batchPaymentsArtifact = new ContractArtifact( address: '0x0DD57FFe83a53bCbd657e234B16A3e74fEDb8fBA', creationBlockNumber: 10857190, }, + goerli: { + address: '0x0DD57FFe83a53bCbd657e234B16A3e74fEDb8fBA', + creationBlockNumber: 7091488, + }, mainnet: { address: '0x0DD57FFe83a53bCbd657e234B16A3e74fEDb8fBA', creationBlockNumber: 14884721, diff --git a/packages/smart-contracts/src/lib/artifacts/ChainlinkConversionPath/index.ts b/packages/smart-contracts/src/lib/artifacts/ChainlinkConversionPath/index.ts index 7ebde79521..ee0761fde6 100644 --- a/packages/smart-contracts/src/lib/artifacts/ChainlinkConversionPath/index.ts +++ b/packages/smart-contracts/src/lib/artifacts/ChainlinkConversionPath/index.ts @@ -22,6 +22,10 @@ export const chainlinkConversionPath = new ContractArtifact( address: '0xEbe28A2B7336670Ba752bfEad4a121D2c4FF2464', creationBlockNumber: 10461945, }, + goerli: { + address: '0xEbe28A2B7336670Ba752bfEad4a121D2c4FF2464', + creationBlockNumber: 10461945, + }, matic: { address: '0xc7f471F5A8f8b33F131049b1e9A43941CbE31792', creationBlockNumber: 29821569, diff --git a/packages/smart-contracts/src/lib/artifacts/ERC20FeeProxy/index.ts b/packages/smart-contracts/src/lib/artifacts/ERC20FeeProxy/index.ts index f3c6024a5b..dd64ee33e5 100644 --- a/packages/smart-contracts/src/lib/artifacts/ERC20FeeProxy/index.ts +++ b/packages/smart-contracts/src/lib/artifacts/ERC20FeeProxy/index.ts @@ -21,6 +21,10 @@ export const erc20FeeProxyArtifact = new ContractArtifact( address: '0xda46309973bFfDdD5a10cE12c44d2EE266f45A44', creationBlockNumber: 7118080, }, + goerli: { + address: '0x399F5EE127ce7432E4921a61b8CF52b0af52cbfE', + creationBlockNumber: 7091472, + }, matic: { address: '0x2171a0dc12a9E5b1659feF2BB20E54c84Fa7dB0C', creationBlockNumber: 14163521, diff --git a/packages/smart-contracts/src/lib/artifacts/ERC20SwapToPay/index.ts b/packages/smart-contracts/src/lib/artifacts/ERC20SwapToPay/index.ts index 4a03696db1..ad9a3ff5eb 100644 --- a/packages/smart-contracts/src/lib/artifacts/ERC20SwapToPay/index.ts +++ b/packages/smart-contracts/src/lib/artifacts/ERC20SwapToPay/index.ts @@ -21,6 +21,10 @@ export const erc20SwapToPayArtifact = new ContractArtifact( address: '0xb674e3d228e631594D8fd4BF947E1811288bf836', creationBlockNumber: 7363204, }, + goerli: { + address: '0x0Ef49176A87Adcc88bD5125126C6a6c23a28303C', + creationBlockNumber: 7109102, + }, }, }, '0.3.0': { diff --git a/packages/smart-contracts/src/lib/artifacts/Erc20ConversionProxy/index.ts b/packages/smart-contracts/src/lib/artifacts/Erc20ConversionProxy/index.ts index 830cbf6eca..dc1e7ce920 100644 --- a/packages/smart-contracts/src/lib/artifacts/Erc20ConversionProxy/index.ts +++ b/packages/smart-contracts/src/lib/artifacts/Erc20ConversionProxy/index.ts @@ -22,6 +22,10 @@ export const erc20ConversionProxy = new ContractArtifact( address: '0x78334ed20da456e89cd7e5a90de429d705f5bc88', creationBlockNumber: 8014584, }, + goerli: { + address: '0x493d6cBeE0142c73eE5461fA92CaC94e3e75df62', + creationBlockNumber: 7091387, + }, matic: { address: '0xf0f49873C50765239F6f9534Ba13c4fe16eD5f2E', creationBlockNumber: 17427747, diff --git a/packages/smart-contracts/src/lib/artifacts/Erc20SwapConversion/index.ts b/packages/smart-contracts/src/lib/artifacts/Erc20SwapConversion/index.ts index 8eae29f28c..1852293575 100644 --- a/packages/smart-contracts/src/lib/artifacts/Erc20SwapConversion/index.ts +++ b/packages/smart-contracts/src/lib/artifacts/Erc20SwapConversion/index.ts @@ -18,6 +18,10 @@ export const erc20SwapConversionArtifact = new ContractArtifact( address: '0xCa3353a15fCb5C83a1Ff64BFf055781aC5c4d2F4', creationBlockNumber: 9447194, }, + goerli: { + address: '0xED250D9219EB93098Bb67aEbc992963172B9c8DA', + creationBlockNumber: 7108896, + }, fantom: { address: '0xCa3353a15fCb5C83a1Ff64BFf055781aC5c4d2F4', creationBlockNumber: 20066436, diff --git a/packages/smart-contracts/src/lib/artifacts/EthereumFeeProxy/index.ts b/packages/smart-contracts/src/lib/artifacts/EthereumFeeProxy/index.ts index 40f2adb12f..06dd436767 100644 --- a/packages/smart-contracts/src/lib/artifacts/EthereumFeeProxy/index.ts +++ b/packages/smart-contracts/src/lib/artifacts/EthereumFeeProxy/index.ts @@ -17,6 +17,10 @@ export const ethereumFeeProxyArtifact = new ContractArtifact( address: '0xC6E23a20C0a1933ACC8E30247B5D1e2215796C1F', creationBlockNumber: 9447193, }, + goerli: { + address: '0xe11BF2fDA23bF0A98365e1A4c04A87C9339e8687', + creationBlockNumber: 7091386, + }, fantom: { address: '0xC6E23a20C0a1933ACC8E30247B5D1e2215796C1F', creationBlockNumber: 20066431, diff --git a/packages/smart-contracts/src/lib/artifacts/EthereumProxy/index.ts b/packages/smart-contracts/src/lib/artifacts/EthereumProxy/index.ts index 85e0e9a302..527cedbb78 100644 --- a/packages/smart-contracts/src/lib/artifacts/EthereumProxy/index.ts +++ b/packages/smart-contracts/src/lib/artifacts/EthereumProxy/index.ts @@ -21,6 +21,10 @@ export const ethereumProxyArtifact = new ContractArtifact( address: '0x9c6c7817e3679c4b3f9ef9486001eae5aaed25ff', creationBlockNumber: 5955681, }, + goerli: { + address: '0x171Ee0881407d4c0C11eA1a2FB7D5b4cdED71e6e', + creationBlockNumber: 7069045, + }, xdai: { address: '0x27c60BE17e853c47A9F1d280B05365f483c2dFAF', creationBlockNumber: 18326895, diff --git a/packages/smart-contracts/src/lib/artifacts/RequestDeployer/index.ts b/packages/smart-contracts/src/lib/artifacts/RequestDeployer/index.ts index f43aa72293..1a8522cbf4 100644 --- a/packages/smart-contracts/src/lib/artifacts/RequestDeployer/index.ts +++ b/packages/smart-contracts/src/lib/artifacts/RequestDeployer/index.ts @@ -21,6 +21,10 @@ export const requestDeployer = new ContractArtifact( address: '0xE99Ab70a5FAE59551544FA326fA048f7B95A24B2', creationBlockNumber: 10307305, }, + goerli: { + address: '0xE99Ab70a5FAE59551544FA326fA048f7B95A24B2', + creationBlockNumber: 7068867, + }, 'arbitrum-rinkeby': { address: '0xE99Ab70a5FAE59551544FA326fA048f7B95A24B2', creationBlockNumber: 10382055, diff --git a/packages/smart-contracts/src/lib/artifacts/RequestHashStorage/index.ts b/packages/smart-contracts/src/lib/artifacts/RequestHashStorage/index.ts index e3e0981d6b..d9b4ae963c 100644 --- a/packages/smart-contracts/src/lib/artifacts/RequestHashStorage/index.ts +++ b/packages/smart-contracts/src/lib/artifacts/RequestHashStorage/index.ts @@ -21,6 +21,10 @@ export const requestHashStorageArtifact = new ContractArtifact Date: Fri, 8 Jul 2022 16:25:52 +0200 Subject: [PATCH 47/85] Update index.ts --- .../src/lib/artifacts/Erc20SwapConversion/index.ts | 4 ---- 1 file changed, 4 deletions(-) diff --git a/packages/smart-contracts/src/lib/artifacts/Erc20SwapConversion/index.ts b/packages/smart-contracts/src/lib/artifacts/Erc20SwapConversion/index.ts index 1852293575..8eae29f28c 100644 --- a/packages/smart-contracts/src/lib/artifacts/Erc20SwapConversion/index.ts +++ b/packages/smart-contracts/src/lib/artifacts/Erc20SwapConversion/index.ts @@ -18,10 +18,6 @@ export const erc20SwapConversionArtifact = new ContractArtifact Date: Fri, 8 Jul 2022 17:26:11 +0200 Subject: [PATCH 48/85] wip: ETHConversionProxy --- packages/currency/src/native.ts | 6 ++++ packages/smart-contracts/README.md | 36 +++++++++---------- .../scripts-create2/compute-one-address.ts | 1 + .../scripts-create2/constructor-args.ts | 35 +++++++++--------- .../scripts-create2/deploy-one.ts | 1 + .../smart-contracts/scripts-create2/utils.ts | 1 + .../scripts-create2/verify-one.ts | 1 + 7 files changed, 45 insertions(+), 36 deletions(-) diff --git a/packages/currency/src/native.ts b/packages/currency/src/native.ts index ec6bf066e2..dc1fa018d2 100644 --- a/packages/currency/src/native.ts +++ b/packages/currency/src/native.ts @@ -15,6 +15,12 @@ export const nativeCurrencies: Record ``` -#### Compute the contract addresses +### Compute the contract addresses Run: @@ -130,7 +128,7 @@ yarn hardhat compute-contract-addresses It will compute the addresses of the contracts to be deployed via the request deployer. -#### Deploy the contracts +### Deploy the contracts Depending on the xdeployer config, this script will deploy the smart contracts on several chain simultaneously Environment variables needed: `ADMIN_PRIVATE_KEY` @@ -157,17 +155,23 @@ This command will output details about each contract deployment on each chain: - If already deployed: the network, and the contract address - If an error occured: the said error -#### Verify the contracts +### Verify the contracts -For each network the contract were deployed to run: +Verify and publish the contract code automatically to blockchain explorers, right after smart contracts compilation. You should first set the `ETHERSCAN_API_KEY` environment variable. ```bash yarn hardhat verify-contract-from-deployer --network ``` -The associated `EXPLORER_API_KEY` is mandatory. +#### Verify the contracts manually With Hardhat (legacy) + +A more generic way to verify any contract by setting constructor argments manually: + +```bash +yarn hardhat verify --network NETWORK_NAME DEPLOYED_CONTRACT_ADDRESS "Constructor argument 1" +``` -### Live deployment (Payment only - deprecated method) +### Deprecated payment deployment scripts (legacy) The goal of this script is to let all our payment contracts be deployed with the same sequence on every chain. @@ -189,7 +193,7 @@ yarn hardhat deploy-live-payments --network private --force yarn hardhat deploy-live-payments --network private --force --dry-run ``` -### Tests +## Tests After a local deployment: @@ -203,14 +207,6 @@ Networks and providers are configured in [hardhat.config.ts](hardhat.config.ts). Have a look at the [Hardhat documentation](https://hardhat.org/config/). -## Contract verification with Hardhat - -Verify and publish the contract code automatically to blockchain explorers, right after smart contracts compilation. You should first set the `ETHERSCAN_API_KEY` environment variable. - -```bash -yarn hardhat verify --network NETWORK_NAME DEPLOYED_CONTRACT_ADDRESS "Constructor argument 1" -``` - ## Contributing Pull requests are welcome. For major changes, please open an issue first to discuss what you would like to change. diff --git a/packages/smart-contracts/scripts-create2/compute-one-address.ts b/packages/smart-contracts/scripts-create2/compute-one-address.ts index 00afbd9289..7e8c4809a7 100644 --- a/packages/smart-contracts/scripts-create2/compute-one-address.ts +++ b/packages/smart-contracts/scripts-create2/compute-one-address.ts @@ -52,6 +52,7 @@ export const computeCreate2DeploymentAddressesFromList = async ( switch (contract) { case 'EthereumProxy': case 'EthereumFeeProxy': + case 'ETHConversionProxy': case 'ERC20FeeProxy': case 'Erc20ConversionProxy': case 'ERC20EscrowToPay': diff --git a/packages/smart-contracts/scripts-create2/constructor-args.ts b/packages/smart-contracts/scripts-create2/constructor-args.ts index 1d462ff125..db9d4952e6 100644 --- a/packages/smart-contracts/scripts-create2/constructor-args.ts +++ b/packages/smart-contracts/scripts-create2/constructor-args.ts @@ -1,27 +1,33 @@ import * as artifacts from '../src/lib'; +const getAdminWalletAddress = (contract: string): string => { + if (!process.env.ADMIN_WALLET_ADDRESS) { + throw new Error(`ADMIN_WALLET_ADDRESS missing to get constructor args for: ${contract}`); + } + return process.env.ADMIN_WALLET_ADDRESS; +}; + export const getConstructorArgs = (contract: string, network?: string): string[] => { switch (contract) { case 'Erc20ConversionProxy': { - if (!process.env.ADMIN_WALLET_ADDRESS) { - throw new Error(`ADMIN_WALLET_ADDRESS missing to get constructor args for: ${contract}`); - } return [ '0x0000000000000000000000000000000000000000', '0x0000000000000000000000000000000000000000', - process.env.ADMIN_WALLET_ADDRESS, + getAdminWalletAddress(contract), + ]; + } + case 'ETHConversionProxy': { + return [ + '0x0000000000000000000000000000000000000000', + '0x0000000000000000000000000000000000000000', + '0x39e19aa5b69466dfdc313c7cda37cb2a599015cd', ]; + // TODO setupETHConversionProxy } case 'ERC20SwapToConversion': { - if (!process.env.ADMIN_WALLET_ADDRESS) { - throw new Error(`ADMIN_WALLET_ADDRESS missing to get constructor args for: ${contract}`); - } - return [process.env.ADMIN_WALLET_ADDRESS]; + return [getAdminWalletAddress(contract)]; } case 'ERC20EscrowToPay': { - if (!process.env.ADMIN_WALLET_ADDRESS) { - throw new Error(`ADMIN_WALLET_ADDRESS missing to get constructor args for: ${contract}`); - } if (!network) { throw new Error( 'Escrow contract requires network parameter to get correct address of erc20FeeProxy', @@ -29,12 +35,9 @@ export const getConstructorArgs = (contract: string, network?: string): string[] } const erc20FeeProxy = artifacts.erc20FeeProxyArtifact; const erc20FeeProxyAddress = erc20FeeProxy.getAddress(network); - return [erc20FeeProxyAddress, process.env.ADMIN_WALLET_ADDRESS]; + return [erc20FeeProxyAddress, getAdminWalletAddress(contract)]; } case 'BatchPayments': { - if (!process.env.ADMIN_WALLET_ADDRESS) { - throw new Error(`ADMIN_WALLET_ADDRESS missing to get constructor args for: ${contract}`); - } if (!network) { throw new Error( 'Batch contract requires network parameter to get correct address of erc20FeeProxy and ethereumFeeProxy', @@ -43,7 +46,7 @@ export const getConstructorArgs = (contract: string, network?: string): string[] return [ '0x0000000000000000000000000000000000000000', '0x0000000000000000000000000000000000000000', - process.env.ADMIN_WALLET_ADDRESS, + getAdminWalletAddress(contract), ]; } default: diff --git a/packages/smart-contracts/scripts-create2/deploy-one.ts b/packages/smart-contracts/scripts-create2/deploy-one.ts index 535319e7e1..ec15644fac 100644 --- a/packages/smart-contracts/scripts-create2/deploy-one.ts +++ b/packages/smart-contracts/scripts-create2/deploy-one.ts @@ -53,6 +53,7 @@ export const deployWithCreate2FromList = async ( switch (contract) { case 'EthereumProxy': case 'EthereumFeeProxy': + case 'ETHConversionProxy': case 'ERC20FeeProxy': case 'Erc20ConversionProxy': { const constructorArgs = getConstructorArgs(contract); diff --git a/packages/smart-contracts/scripts-create2/utils.ts b/packages/smart-contracts/scripts-create2/utils.ts index 04ef3377cb..421bba148c 100644 --- a/packages/smart-contracts/scripts-create2/utils.ts +++ b/packages/smart-contracts/scripts-create2/utils.ts @@ -9,6 +9,7 @@ import * as artifacts from '../src/lib'; export const create2ContractDeploymentList = [ 'EthereumProxy', 'EthereumFeeProxy', + 'ETHConversionProxy', 'ERC20FeeProxy', 'Erc20ConversionProxy', 'ERC20SwapToConversion', diff --git a/packages/smart-contracts/scripts-create2/verify-one.ts b/packages/smart-contracts/scripts-create2/verify-one.ts index b23570caba..cc8648e862 100644 --- a/packages/smart-contracts/scripts-create2/verify-one.ts +++ b/packages/smart-contracts/scripts-create2/verify-one.ts @@ -27,6 +27,7 @@ export async function VerifyCreate2FromList(hre: HardhatRuntimeEnvironmentExtend switch (contract) { case 'EthereumProxy': case 'EthereumFeeProxy': + case 'ETHConversionProxy': case 'ERC20FeeProxy': case 'ERC20SwapToConversion': case 'Erc20ConversionProxy': { From 61b510c6ffbab96e14fc1edde676d73bf776a959 Mon Sep 17 00:00:00 2001 From: Romain TREFAULT Date: Mon, 11 Jul 2022 10:38:00 +0200 Subject: [PATCH 49/85] refactor: squash unsigned commits -S refactor: add goerli tests refactor: add goerli tests refactor: add goerli tests feat: add goerli support in currency -S feat: add goerli payment-detection tests refactor: setups.ts refactor: goerli tests refactor: goerli contract address in tests refactor: goerli tests refactor: rename ETHConversionProxy to EthConversionProxy --- packages/currency/src/aggregators/goerli.json | 8 ++ .../currency/src/erc20/networks/goerli.ts | 17 +++ .../src/erc20/address-based.ts | 2 +- .../any/any-to-erc20-proxy-contract.test.ts | 48 ++++++- .../test/erc20/address-based.test.ts | 2 +- .../test/erc20/escrow-info-retriever.test.ts | 26 ++++ .../test/erc20/fee-proxy-contract.test.ts | 4 +- .../test/erc20/proxy-contract.test.ts | 4 +- .../erc20/thegraph-info-retriever.test.ts | 87 +++++++++++- .../payment-detection/test/erc777/mocks.ts | 2 +- .../test/erc777/superfluid-retriever.test.ts | 127 ++++++++++++++++-- .../test/eth/info-retriever.test.ts | 1 + .../test/eth/input-data.test.ts | 84 +++++++++++- .../payment-detection/test/provider.test.ts | 25 +++- .../scripts-create2/constructor-args.ts | 4 +- .../contract-setup/setupEthConversionProxy.ts | 47 +++++++ .../scripts-create2/contract-setup/setups.ts | 35 +++++ .../smart-contracts/scripts-create2/deploy.ts | 87 ++++++++++++ .../smart-contracts/scripts-create2/verify.ts | 64 +++++++++ .../lib/artifacts/ERC20EscrowToPay/index.ts | 4 +- 20 files changed, 643 insertions(+), 35 deletions(-) create mode 100644 packages/currency/src/aggregators/goerli.json create mode 100644 packages/currency/src/erc20/networks/goerli.ts create mode 100644 packages/smart-contracts/scripts-create2/contract-setup/setupEthConversionProxy.ts create mode 100644 packages/smart-contracts/scripts-create2/contract-setup/setups.ts create mode 100644 packages/smart-contracts/scripts-create2/deploy.ts create mode 100644 packages/smart-contracts/scripts-create2/verify.ts diff --git a/packages/currency/src/aggregators/goerli.json b/packages/currency/src/aggregators/goerli.json new file mode 100644 index 0000000000..93d71cbd2c --- /dev/null +++ b/packages/currency/src/aggregators/goerli.json @@ -0,0 +1,8 @@ +{ + "0xba62bcfcaafc6622853cca2be6ac7d845bc0f2dc": { + "0x775eb53d00dd0acd3ec1696472105d579b9b386b": 1 + }, + "0x775eb53d00dd0acd3ec1696472105d579b9b386b": { + "0xba62bcfcaafc6622853cca2be6ac7d845bc0f2dc": 1 + } +} diff --git a/packages/currency/src/erc20/networks/goerli.ts b/packages/currency/src/erc20/networks/goerli.ts new file mode 100644 index 0000000000..d890fe3c30 --- /dev/null +++ b/packages/currency/src/erc20/networks/goerli.ts @@ -0,0 +1,17 @@ +import { TokenMap } from './types'; + +// List of the supported goerli ERC20 tokens +export const supportedGoerliERC20: TokenMap = { + // Request Test token, used for testing on goerli. + '0x7af963cF6D228E564e2A0aA0DdBF06210B38615D': { + decimals: 18, + name: 'Goerli Test Token', + symbol: 'TST', + }, + // Faucet Token on goerli network. Easy to use on tests. + '0xBA62BCfcAaFc6622853cca2BE6Ac7d845BC0f2Dc': { + decimals: 18, + name: 'Faucet Token', + symbol: 'FAU-goerli', + }, +}; diff --git a/packages/payment-detection/src/erc20/address-based.ts b/packages/payment-detection/src/erc20/address-based.ts index 5bd11e632e..4664b3164f 100644 --- a/packages/payment-detection/src/erc20/address-based.ts +++ b/packages/payment-detection/src/erc20/address-based.ts @@ -8,7 +8,7 @@ import { BalanceError } from '../balance-error'; import Erc20InfoRetriever from './address-based-info-retriever'; import { PaymentDetectorBase } from '../payment-detector-base'; -const supportedNetworks = ['mainnet', 'rinkeby', 'private']; +const supportedNetworks = ['mainnet', 'rinkeby', 'goerli', 'private']; /** * Handle payment networks with ERC20 based address extension diff --git a/packages/payment-detection/test/any/any-to-erc20-proxy-contract.test.ts b/packages/payment-detection/test/any/any-to-erc20-proxy-contract.test.ts index 1be024d556..2acfa670b2 100644 --- a/packages/payment-detection/test/any/any-to-erc20-proxy-contract.test.ts +++ b/packages/payment-detection/test/any/any-to-erc20-proxy-contract.test.ts @@ -31,7 +31,7 @@ const mockAdvancedLogic: AdvancedLogicTypes.IAdvancedLogic = { }, extensions: { anyToErc20Proxy: { - supportedNetworks: ['mainnet', 'rinkeby', 'private'], + supportedNetworks: ['mainnet', 'rinkeby', 'goerli', 'private'], createAddPaymentAddressAction, createAddRefundAddressAction, createCreationAction, @@ -56,7 +56,7 @@ describe('api/any/conversion-fee-proxy-contract', () => { jest.clearAllMocks(); }); - it('can createExtensionsDataForCreation', async () => { + it('can createExtensionsDataForCreation (Rinkeby)', async () => { await anyToErc20Proxy.createExtensionsDataForCreation({ paymentAddress: 'ethereum address', salt: 'ea3bc7caf64110ca', @@ -77,7 +77,28 @@ describe('api/any/conversion-fee-proxy-contract', () => { }); }); - it('can createExtensionsDataForCreation with fee amount and address', async () => { + it('can createExtensionsDataForCreation (Goerli)', async () => { + await anyToErc20Proxy.createExtensionsDataForCreation({ + paymentAddress: 'ethereum address', + salt: 'ea3bc7caf64110ca', + acceptedTokens: ['ethereum address2'], + network: 'goerli', + maxRateTimespan: 1000, + }); + + expect(createCreationAction).toHaveBeenCalledWith({ + feeAddress: undefined, + feeAmount: undefined, + paymentAddress: 'ethereum address', + refundAddress: undefined, + salt: 'ea3bc7caf64110ca', + acceptedTokens: ['ethereum address2'], + network: 'goerli', + maxRateTimespan: 1000, + }); + }); + + it('can createExtensionsDataForCreation with fee amount and address (Rinkeby)', async () => { await anyToErc20Proxy.createExtensionsDataForCreation({ feeAddress: 'fee address', feeAmount: '2000', @@ -98,6 +119,27 @@ describe('api/any/conversion-fee-proxy-contract', () => { }); }); + it('can createExtensionsDataForCreation with fee amount and address (Goerli)', async () => { + await anyToErc20Proxy.createExtensionsDataForCreation({ + feeAddress: 'fee address', + feeAmount: '2000', + paymentAddress: 'ethereum address', + salt: 'ea3bc7caf64110ca', + acceptedTokens: ['ethereum address2'], + network: 'goerli', + }); + + expect(createCreationAction).toHaveBeenCalledWith({ + feeAddress: 'fee address', + feeAmount: '2000', + paymentAddress: 'ethereum address', + refundAddress: undefined, + salt: 'ea3bc7caf64110ca', + acceptedTokens: ['ethereum address2'], + network: 'goerli', + }); + }); + it('can createExtensionsDataForCreation without salt', async () => { await anyToErc20Proxy.createExtensionsDataForCreation({ paymentAddress: 'ethereum address', diff --git a/packages/payment-detection/test/erc20/address-based.test.ts b/packages/payment-detection/test/erc20/address-based.test.ts index f75629d334..93fa533021 100644 --- a/packages/payment-detection/test/erc20/address-based.test.ts +++ b/packages/payment-detection/test/erc20/address-based.test.ts @@ -126,7 +126,7 @@ describe('api/erc20/address-based', () => { error: { code: PaymentTypes.BALANCE_ERROR_CODE.NETWORK_NOT_SUPPORTED, message: - 'Payment network wrong not supported by ERC20 payment detection. Supported networks: mainnet, rinkeby, private', + 'Payment network wrong not supported by ERC20 payment detection. Supported networks: mainnet, rinkeby, goerli, private', }, events: [], }); diff --git a/packages/payment-detection/test/erc20/escrow-info-retriever.test.ts b/packages/payment-detection/test/erc20/escrow-info-retriever.test.ts index 53a6246639..03431e5089 100644 --- a/packages/payment-detection/test/erc20/escrow-info-retriever.test.ts +++ b/packages/payment-detection/test/erc20/escrow-info-retriever.test.ts @@ -161,4 +161,30 @@ describe('api/erc20/escrow-info-retriever', () => { expect(escrowChainData.isFrozen).toEqual(true); }); }); + + describe('test on goerli', () => { + let infoRetriever: EscrowERC20InfoRetriever; + beforeAll(() => { + infoRetriever = new EscrowERC20InfoRetriever( + paymentReferenceMock, + '0x8230e703B1c4467A4543422b2cC3284133B9AB5e', + 0, + '', + '', + 'goerli', + ); + }); + it('should get escrow chain data', async () => { + const escrowChainData = await infoRetriever.getEscrowRequestMapping(); + // Not yet ERC777 token on goerli + // expect(escrowChainData.tokenAddress).toEqual('0x745861AeD1EEe363b4AaA5F1994Be40b1e05Ff90'); + expect(escrowChainData.payee).toEqual('0xB9B7e0cb2EDF5Ea031C8B297A5A1Fa20379b6A0a'); + expect(escrowChainData.payer).toEqual('0x0c051a1f4E209b00c8E7C00AD0ce79B3630a7401'); + expect(escrowChainData.amount.toString()).toEqual('123000000000000000000'); + expect(escrowChainData.unlockDate.toString()).toEqual('1670505020'); + expect(escrowChainData.emergencyClaimDate.toString()).toEqual('0'); + expect(escrowChainData.emergencyState).toEqual(false); + expect(escrowChainData.isFrozen).toEqual(true); + }); + }); }); diff --git a/packages/payment-detection/test/erc20/fee-proxy-contract.test.ts b/packages/payment-detection/test/erc20/fee-proxy-contract.test.ts index f7504c9b8d..c0d924c21d 100644 --- a/packages/payment-detection/test/erc20/fee-proxy-contract.test.ts +++ b/packages/payment-detection/test/erc20/fee-proxy-contract.test.ts @@ -23,7 +23,7 @@ const mockAdvancedLogic: AdvancedLogicTypes.IAdvancedLogic = { }, extensions: { feeProxyContractErc20: { - supportedNetworks: ['mainnet', 'private', 'rinkeby'], + supportedNetworks: ['mainnet', 'private', 'rinkeby', 'goerli'], createAddPaymentAddressAction, createAddRefundAddressAction, createCreationAction, @@ -283,7 +283,7 @@ describe('api/erc20/fee-proxy-contract', () => { ).toBe('7'); }); - it('should have gasFee & gasUsed in the payment eventl', async () => { + it('should have gasFee & gasUsed in the payment event', async () => { const mockRequest: RequestLogicTypes.IRequest = { creator: { type: IdentityTypes.TYPE.ETHEREUM_ADDRESS, value: '0x2' }, currency: { diff --git a/packages/payment-detection/test/erc20/proxy-contract.test.ts b/packages/payment-detection/test/erc20/proxy-contract.test.ts index 5d89bb7977..f814c0ae58 100644 --- a/packages/payment-detection/test/erc20/proxy-contract.test.ts +++ b/packages/payment-detection/test/erc20/proxy-contract.test.ts @@ -25,7 +25,7 @@ const mockAdvancedLogic: AdvancedLogicTypes.IAdvancedLogic = { }, extensions: { proxyContractErc20: { - supportedNetworks: ['mainnet', 'rinkeby'], + supportedNetworks: ['mainnet', 'rinkeby', 'goerli'], createAddPaymentAddressAction, createAddRefundAddressAction, createCreationAction, @@ -160,7 +160,7 @@ describe('api/erc20/proxy-contract', () => { error: { code: PaymentTypes.BALANCE_ERROR_CODE.NETWORK_NOT_SUPPORTED, message: - 'Payment network WRONG not supported by pn-erc20-proxy-contract payment detection. Supported networks: mainnet, rinkeby', + 'Payment network WRONG not supported by pn-erc20-proxy-contract payment detection. Supported networks: mainnet, rinkeby, goerli', }, events: [], }); diff --git a/packages/payment-detection/test/erc20/thegraph-info-retriever.test.ts b/packages/payment-detection/test/erc20/thegraph-info-retriever.test.ts index 7c13df6b72..c641ed0feb 100644 --- a/packages/payment-detection/test/erc20/thegraph-info-retriever.test.ts +++ b/packages/payment-detection/test/erc20/thegraph-info-retriever.test.ts @@ -51,7 +51,7 @@ describe('api/erc20/thegraph-info-retriever', () => { expect(transferEvents[0].parameters?.feeAmount).toEqual(paymentData.feeAmount); }); - it('should get payment event from ethFeeConversionProxy via subgraph', async () => { + it('should get payment event from ethFeeConversionProxy via subgraph (Rinkeby)', async () => { const paymentData = { reference: '0x6c93723bc5f82e6fbb2ea994bf0fb572fa19f7a2a3146065e21752b95668efe5', txHash: '0x2f7b4752aa259166c038cd9073056c5979760cf0eea55d093fca2095c229313b', @@ -89,4 +89,89 @@ describe('api/erc20/thegraph-info-retriever', () => { expect(transferEvents[0].parameters?.block).toEqual(paymentData.block); }); }); + + describe('on goerli', () => { + const GOERLI_ETH_FEE_PROXY_CONTRACT = '0xe11BF2fDA23bF0A98365e1A4c04A87C9339e8687'; + const GOERLI_ETH_CONVERSION_PROXY_CONTRACT = '0xED250D9219EB93098Bb67aEbc992963172B9c8DA'; + + it('should get payment event from ethFeeProxy via subgraph', async () => { + const paymentData = { + reference: '0x6c93723bc5f82e6fbb2ea994bf0fb572fa19f7a2a3146065e21752b95668efe5', + txHash: '0x3e2d6cc2534b1d340ba2954f34e6cc819d6da64ff76863ea89c6d34b15d13c97', + from: '0x186e7fe6c34ea0eca7f9c2fd29651fc0443e3f29', + to: '0x5000ee9fb9c96a2a09d8efb695ac21d6c429ff11', + network: 'goerli', + salt: '0ee84db293a752c6', + amount: '30000000000000', + requestId: '0188791633ff0ec72a7dbdefb886d2db6cccfa98287320839c2f173c7a4e3ce7e1', + block: 9606098, + feeAddress: '0x5000EE9FB9c96A2A09D8efB695aC21D6C429fF11', + feeAmount: '0', + }; + const paymentReference = PaymentReferenceCalculator.calculate( + paymentData.requestId, + paymentData.salt, + paymentData.to, + ); + const onChainReference = utils.keccak256(`0x${paymentReference}`); + expect(onChainReference).toEqual(paymentData.reference); + + const graphRetriever = new TheGraphInfoRetriever( + paymentReference, + GOERLI_ETH_FEE_PROXY_CONTRACT, + null, + paymentData.to, + PaymentTypes.EVENTS_NAMES.PAYMENT, + paymentData.network, + ); + const allNetworkEvents = await graphRetriever.getTransferEvents(); + const transferEvents = allNetworkEvents.paymentEvents; + // expect(transferEvents).toHaveLength(1); + expect(transferEvents[0].amount).toEqual('30000000000000'); + expect(transferEvents[0].name).toEqual('payment'); + expect(transferEvents[0].parameters?.to).toEqual(paymentData.to); + expect(transferEvents[0].parameters?.txHash).toEqual(paymentData.txHash); + expect(transferEvents[0].parameters?.block).toEqual(paymentData.block); + expect(transferEvents[0].parameters?.feeAddress).toEqual(paymentData.feeAddress); + expect(transferEvents[0].parameters?.feeAmount).toEqual(paymentData.feeAmount); + }); + + it('should get payment event from ethFeeConversionProxy via subgraph', async () => { + const paymentData = { + reference: '0x6c93723bc5f82e6fbb2ea994bf0fb572fa19f7a2a3146065e21752b95668efe5', + txHash: '0x2f7b4752aa259166c038cd9073056c5979760cf0eea55d093fca2095c229313b', + from: '0x186e7fe6c34ea0eca7f9c2fd29651fc0443e3f29', + to: '0x5000ee9fb9c96a2a09d8efb695ac21d6c429ff11', + network: 'goerli', + salt: '0ee84db293a752c6', + amount: '7000', + block: 9610470, + requestId: '0188791633ff0ec72a7dbdefb886d2db6cccfa98287320839c2f173c7a4e3ce7e1', + }; + + const shortReference = PaymentReferenceCalculator.calculate( + paymentData.requestId, + paymentData.salt, + paymentData.to, + ); + const onChainReference = utils.keccak256(`0x${shortReference}`); + expect(onChainReference).toEqual(paymentData.reference); + + const graphRetriever = new TheGraphInfoRetriever( + shortReference, + GOERLI_ETH_CONVERSION_PROXY_CONTRACT, + null, + paymentData.to, + PaymentTypes.EVENTS_NAMES.PAYMENT, + paymentData.network, + ); + const allNetworkEvents = await graphRetriever.getTransferEvents(); + const transferEvents = allNetworkEvents.paymentEvents; + // expect(transferEvents).toHaveLength(1); + expect(transferEvents[0].amount).toEqual(paymentData.amount); + expect(transferEvents[0].parameters?.to).toEqual(paymentData.to); + expect(transferEvents[0].parameters?.txHash).toEqual(paymentData.txHash); + expect(transferEvents[0].parameters?.block).toEqual(paymentData.block); + }); + }); }); diff --git a/packages/payment-detection/test/erc777/mocks.ts b/packages/payment-detection/test/erc777/mocks.ts index 69565f307f..8cfdc6eb5c 100644 --- a/packages/payment-detection/test/erc777/mocks.ts +++ b/packages/payment-detection/test/erc777/mocks.ts @@ -76,7 +76,7 @@ const mockFlows = [ }, { transactionHash: '0xe472ca1b52751b058fbdaeaffebd98c0cc43b45aa31794b3eb06834ede19f7be', - blockNumber: '9945543', + blockNumber: 9945543, timestamp: '1641495767', sender: '0x9c040e2d6fd83a8b35069aa7154b69674961e0f7', flowRate: '0', diff --git a/packages/payment-detection/test/erc777/superfluid-retriever.test.ts b/packages/payment-detection/test/erc777/superfluid-retriever.test.ts index 9ea56eb5e9..6d9e74f63e 100644 --- a/packages/payment-detection/test/erc777/superfluid-retriever.test.ts +++ b/packages/payment-detection/test/erc777/superfluid-retriever.test.ts @@ -10,7 +10,7 @@ const graphql = mocked(GraphQLClient.prototype); describe('api/erc777/superfluid-info-retriever', () => { describe('on untagged requests', () => { - it('should get payment events from SuperFluid via subgraph with 1 request', async () => { + it('should get payment events from SuperFluid via subgraph with 1 request (Rinkeby)', async () => { const paymentData = { reference: '0xbeefaccc470c7dbd54de69', txHash: '0xe472ca1b52751b058fbdaeaffebd98c0cc43b45aa31794b3eb06834ede19f7be', @@ -50,10 +50,51 @@ describe('api/erc777/superfluid-info-retriever', () => { expect(transferEvents[0].parameters?.txHash).toEqual(paymentData.txHash); expect(transferEvents[0].parameters?.block).toEqual(paymentData.block); }); + + it('should get payment events from SuperFluid via subgraph with 1 request (Goerli)', async () => { + const paymentData = { + reference: '0xbeefaccc470c7dbd54de69', + txHash: '0xe472ca1b52751b058fbdaeaffebd98c0cc43b45aa31794b3eb06834ede19f7be', + from: '0x9c040e2d6fd83a8b35069aa7154b69674961e0f7', + to: '0x52e5bcfa46393894afcfe6cd98a6761fa692c594', + network: 'goerli', + salt: '0ee84db293a752c6', + amount: '92592592592592000', + requestId: '0188791633ff0ec72a7dbdefb886d2db6cccfa98287320839c2f173c7a4e3ce7e1', + block: 9945543, + token: '0x2bf02814ea0b2b155ed47b7cede18caa752940e6', //fDAIx + }; + graphql.request.mockResolvedValue(mockSuperfluidSubgraph[0]); + + const paymentReference = PaymentReferenceCalculator.calculate( + paymentData.requestId, + paymentData.salt, + paymentData.to, + ); + const subgraphReference = `0xbeefac${paymentReference}`; + expect(subgraphReference).toEqual(paymentData.reference); + + const graphRetriever = new SuperFluidInfoRetriever( + paymentReference, + paymentData.token, + paymentData.to, + PaymentTypes.EVENTS_NAMES.PAYMENT, + paymentData.network, + ); + const transferEvents = await graphRetriever.getTransferEvents(); + expect(transferEvents).toHaveLength(5); + expect(transferEvents[0].amount).toEqual(paymentData.amount); + expect(transferEvents[0].name).toEqual('payment'); + expect(transferEvents[0].parameters?.to).toEqual(paymentData.to); + expect(transferEvents[1].amount).toEqual('34722222222222000'); + expect(transferEvents[2].amount).toEqual('40509259259259000'); + expect(transferEvents[0].parameters?.txHash).toEqual(paymentData.txHash); + expect(transferEvents[0].parameters?.block).toEqual(paymentData.block); + }); }); describe('on 2 nested requests', () => { - it('should get payment event from SuperFluid via subgraph with 2 requests', async () => { + it('should get payment event from SuperFluid via subgraph with 2 requests (Rinkeby)', async () => { const paymentData = { reference: '0xbeefac9474ad7670909da5', from: '0x9c040e2d6fd83a8b35069aa7154b69674961e0f7', @@ -64,8 +105,6 @@ describe('api/erc777/superfluid-info-retriever', () => { // = (1642693617 - 1642692777 = 840 sec) x (385802469135800 - 3858024691358 = 381944444444442 Wei DAIx / sec) requestId: '0288792633ff0ec72a7dbdefb886d2db6cccfa98287320839c2f273c7a4e3ce7e2', token: '0x745861aed1eee363b4aaa5f1994be40b1e05ff90', //fDAIx - block: 10024811, - txHash: '0x0fefa02d90be46eb51a82f02b7a787084c35a895bd833a7c9f0560e315bb4061', }; graphql.request.mockResolvedValue(mockSuperfluidSubgraph[1]); @@ -88,13 +127,46 @@ describe('api/erc777/superfluid-info-retriever', () => { expect(transferEvents[0].amount).toEqual(paymentData.amount); expect(transferEvents[0].name).toEqual('payment'); expect(transferEvents[0].parameters?.to).toEqual(paymentData.to); - expect(transferEvents[0].parameters?.txHash).toEqual(paymentData.txHash); - expect(transferEvents[0].parameters?.block).toEqual(paymentData.block); + }); + + it('should get payment event from SuperFluid via subgraph with 2 requests (Goerli)', async () => { + const paymentData = { + reference: '0xbeefac9474ad7670909da5', + from: '0x9c040e2d6fd83a8b35069aa7154b69674961e0f7', + to: '0x52e5bcfa46393894afcfe6cd98a6761fa692c594', + network: 'goerli', + salt: '0ee84db293a752c6', + amount: '320833333333331260', + // = (1642693617 - 1642692777 = 840 sec) x (385802469135800 - 3858024691358 = 381944444444442 Wei DAIx / sec) + requestId: '0288792633ff0ec72a7dbdefb886d2db6cccfa98287320839c2f273c7a4e3ce7e2', + token: '0x2bf02814ea0b2b155ed47b7cede18caa752940e6', //fDAIx + }; + graphql.request.mockResolvedValue(mockSuperfluidSubgraph[1]); + + const paymentReference = PaymentReferenceCalculator.calculate( + paymentData.requestId, + paymentData.salt, + paymentData.to, + ); + const subgraphReference = `0xbeefac${paymentReference}`; + expect(subgraphReference).toEqual(paymentData.reference); + const graphRetriever = new SuperFluidInfoRetriever( + paymentReference, + paymentData.token, + paymentData.to, + PaymentTypes.EVENTS_NAMES.PAYMENT, + paymentData.network, + ); + const transferEvents = await graphRetriever.getTransferEvents(); + expect(transferEvents).toHaveLength(1); + expect(transferEvents[0].amount).toEqual(paymentData.amount); + expect(transferEvents[0].name).toEqual('payment'); + expect(transferEvents[0].parameters?.to).toEqual(paymentData.to); }); }); describe('on ongoing request', () => { - it('should get payment event from SuperFluid via subgraph with ongoing request', async () => { + it('should get payment event from SuperFluid via subgraph with ongoing request (Rinkeby)', async () => { const paymentData = { reference: '0xbeefac0e87b43bf1e99c82', from: '0x165a26628ac843e97f657e648b004226fbb7f7c5', @@ -105,8 +177,6 @@ describe('api/erc777/superfluid-info-retriever', () => { requestId: '0688792633ff0ec72a7dbdefb886d2db6cccfa98287320839c2f273c7a4e3ce7e2', token: '0x0f1d7c55a2b133e000ea10eec03c774e0d6796e8', //fUSDCx timestamp: 1643041225, - block: 10047970, - txHash: '0xdb44f35aa1490d2ddc8bbe7b82e0e3a370f3bf171a55da7a8a5886996e9c468d', }; graphql.request.mockResolvedValue(mockSuperfluidSubgraph[2]); @@ -131,8 +201,43 @@ describe('api/erc777/superfluid-info-retriever', () => { expect(transferEvents[0].amount).toEqual(timestamp.toString()); expect(transferEvents[0].name).toEqual('payment'); expect(transferEvents[0].parameters?.to).toEqual(paymentData.to); - expect(transferEvents[0].parameters?.txHash).toEqual(paymentData.txHash); - expect(transferEvents[0].parameters?.block).toEqual(paymentData.block); + }); + + it('should get payment event from SuperFluid via subgraph with ongoing request (Goerli)', async () => { + const paymentData = { + reference: '0xbeefac0e87b43bf1e99c82', + from: '0x165a26628ac843e97f657e648b004226fbb7f7c5', + to: '0xe7e6431f08db273d915b49888f0c67ef61802e05', + network: 'goerli', + salt: '0ee84db293a752c6', + amount: '1', + requestId: '0688792633ff0ec72a7dbdefb886d2db6cccfa98287320839c2f273c7a4e3ce7e2', + token: '0x2bf02814ea0b2b155ed47b7cede18caa752940e6', //fDaix + timestamp: 1643041225, + }; + graphql.request.mockResolvedValue(mockSuperfluidSubgraph[2]); + + const paymentReference = PaymentReferenceCalculator.calculate( + paymentData.requestId, + paymentData.salt, + paymentData.to, + ); + const subgraphReference = `0xbeefac${paymentReference}`; + expect(subgraphReference).toEqual(paymentData.reference); + const graphRetriever = new SuperFluidInfoRetriever( + paymentReference, + paymentData.token, + paymentData.to, + PaymentTypes.EVENTS_NAMES.PAYMENT, + paymentData.network, + ); + jest.spyOn(Date, 'now').mockImplementation(() => 1643126596704); + const transferEvents = await graphRetriever.getTransferEvents(); + const timestamp = Math.floor(Date.now() / 1000) - paymentData.timestamp; + expect(transferEvents).toHaveLength(1); + expect(transferEvents[0].amount).toEqual(timestamp.toString()); + expect(transferEvents[0].name).toEqual('payment'); + expect(transferEvents[0].parameters?.to).toEqual(paymentData.to); }); }); }); diff --git a/packages/payment-detection/test/eth/info-retriever.test.ts b/packages/payment-detection/test/eth/info-retriever.test.ts index 0a314c0c79..ab7c3e2451 100644 --- a/packages/payment-detection/test/eth/info-retriever.test.ts +++ b/packages/payment-detection/test/eth/info-retriever.test.ts @@ -51,6 +51,7 @@ describe('api/eth/info-retriever', () => { [ 'mainnet', 'rinkeby', + 'goerli', // 'xdai', // 'sokol', 'fuse', diff --git a/packages/payment-detection/test/eth/input-data.test.ts b/packages/payment-detection/test/eth/input-data.test.ts index 3be6bfd6db..b7d7489698 100644 --- a/packages/payment-detection/test/eth/input-data.test.ts +++ b/packages/payment-detection/test/eth/input-data.test.ts @@ -23,7 +23,7 @@ const mockAdvancedLogic: AdvancedLogicTypes.IAdvancedLogic = { createAddPaymentAddressAction, createAddRefundAddressAction, createCreationAction, - supportedNetworks: ['mainnet', 'rinkeby'], + supportedNetworks: ['mainnet', 'rinkeby', 'goerli'], // inherited from declarative createAddPaymentInstructionAction, createAddRefundInstructionAction, @@ -160,7 +160,7 @@ describe('api/eth/input-data', () => { error: { code: PaymentTypes.BALANCE_ERROR_CODE.NETWORK_NOT_SUPPORTED, message: - /Payment network wrong not supported by ETH payment detection\. Supported networks: mainnet, rinkeby, private.*/, + /Payment network wrong not supported by ETH payment detection\. Supported networks: mainnet, rinkeby, goerli, private.*/, }, events: [], }); @@ -245,4 +245,84 @@ describe('api/eth/input-data', () => { expect(balance.events[0].amount).toBe('80000000000000000'); expect(typeof balance.events[0].timestamp).toBe('number'); }); + + it('can get balance from goerli subgraph', async () => { + const goerliRequest = { + currency: { + network: 'goerli', + type: RequestLogicTypes.CURRENCY.ETH, + value: 'ETH-goerli', + }, + expectedAmount: '80000000000000000', + payee: { + type: 'ethereumAddress', + value: '0x1D274D164937465B7A7259347AD3f1aaEEEaC8e1', + }, + payer: { + type: 'ethereumAddress', + value: '0x5e7D193321A4CCB091038d01755a10d143cb2Dc8', + }, + timestamp: 1620207049, + extensionsData: [ + { + action: 'create', + id: 'pn-eth-input-data', + parameters: { + paymentAddress: '0x8400b234e7B113686bD584af9b1041E5a233E754', + salt: '2334c5f6691a9131', + }, + version: '0.2.0', + }, + ], + extensions: { + 'pn-eth-input-data': { + events: [ + { + name: 'create', + parameters: { + paymentAddress: '0x8400b234e7B113686bD584af9b1041E5a233E754', + salt: '2334c5f6691a9131', + }, + timestamp: 1620207051, + }, + ], + id: 'pn-eth-input-data', + type: 'payment-network', + values: { + paymentAddress: '0x8400b234e7B113686bD584af9b1041E5a233E754', + salt: '2334c5f6691a9131', + }, + version: '0.2.0', + }, + }, + requestId: '0110e7eaba7a3ff2e2239081497308db70e4c66362100d747903ffa5c83d290d5d', + version: '2.0.3', + events: [ + { + actionSigner: { + type: 'ethereumAddress', + value: '0x1D274D164937465B7A7259347AD3f1aaEEEaC8e1', + }, + name: 'create', + parameters: { + expectedAmount: '80000000000000000', + extensionsDataLength: 2, + isSignedRequest: false, + }, + timestamp: 1620207051, + }, + ], + state: 'created', + creator: { + type: 'ethereumAddress', + value: '0x1D274D164937465B7A7259347AD3f1aaEEEaC8e1', + }, + }; + const balance = await ethInputData.getBalance(goerliRequest as RequestLogicTypes.IRequest); + expect(balance.balance).toBe('80000000000000000'); + expect(balance.events).toHaveLength(1); + expect(balance.events[0].name).toBe(PaymentTypes.EVENTS_NAMES.PAYMENT); + expect(balance.events[0].amount).toBe('80000000000000000'); + expect(typeof balance.events[0].timestamp).toBe('number'); + }); }); diff --git a/packages/payment-detection/test/provider.test.ts b/packages/payment-detection/test/provider.test.ts index 1a9fdaf5ff..1ffabb0b9d 100644 --- a/packages/payment-detection/test/provider.test.ts +++ b/packages/payment-detection/test/provider.test.ts @@ -14,13 +14,20 @@ describe('getDefaultProvider', () => { await expect(provider.getNetwork()).resolves.toMatchObject({ chainId: 1 }); }); - it('Can take a standard network', async () => { + it('Can take a standard network (Rinkeby)', async () => { const provider = getDefaultProvider('rinkeby'); expect(provider).toBeInstanceOf(providers.InfuraProvider); await expect(provider.getNetwork()).resolves.toMatchObject({ chainId: 4 }); }); + it('Can take a standard network (Goerli)', async () => { + const provider = getDefaultProvider('goerli'); + + expect(provider).toBeInstanceOf(providers.InfuraProvider); + await expect(provider.getNetwork()).resolves.toMatchObject({ chainId: 5 }); + }); + it('Can take a private network', async () => { const provider = getDefaultProvider('private') as providers.JsonRpcProvider; @@ -71,12 +78,16 @@ describe('getDefaultProvider', () => { ); }); - it('Can override the api key for a standard provider', async () => { - initPaymentDetectionApiKeys({ - infura: 'foo-bar', - }); + expect((getDefaultProvider('goerli') as providers.JsonRpcProvider).connection.url).toMatch( + /https:\/\/goerli\.infura.*/, + ); +}); - const provider = getDefaultProvider() as providers.InfuraProvider; - expect(provider.connection.url).toEqual('https://mainnet.infura.io/v3/foo-bar'); +it('Can override the api key for a standard provider', async () => { + initPaymentDetectionApiKeys({ + infura: 'foo-bar', }); + + const provider = getDefaultProvider() as providers.InfuraProvider; + expect(provider.connection.url).toEqual('https://mainnet.infura.io/v3/foo-bar'); }); diff --git a/packages/smart-contracts/scripts-create2/constructor-args.ts b/packages/smart-contracts/scripts-create2/constructor-args.ts index db9d4952e6..178501ac3a 100644 --- a/packages/smart-contracts/scripts-create2/constructor-args.ts +++ b/packages/smart-contracts/scripts-create2/constructor-args.ts @@ -16,13 +16,13 @@ export const getConstructorArgs = (contract: string, network?: string): string[] getAdminWalletAddress(contract), ]; } - case 'ETHConversionProxy': { + case 'EthConversionProxy': { return [ '0x0000000000000000000000000000000000000000', '0x0000000000000000000000000000000000000000', '0x39e19aa5b69466dfdc313c7cda37cb2a599015cd', ]; - // TODO setupETHConversionProxy + // TODO setupEthConversionProxy } case 'ERC20SwapToConversion': { return [getAdminWalletAddress(contract)]; diff --git a/packages/smart-contracts/scripts-create2/contract-setup/setupEthConversionProxy.ts b/packages/smart-contracts/scripts-create2/contract-setup/setupEthConversionProxy.ts new file mode 100644 index 0000000000..28d1c974d9 --- /dev/null +++ b/packages/smart-contracts/scripts-create2/contract-setup/setupEthConversionProxy.ts @@ -0,0 +1,47 @@ +import { batchPaymentsArtifact } from '../../src/lib'; +import { HardhatRuntimeEnvironmentExtended } from '../types'; +import utils from '@requestnetwork/utils'; +import { updateChainlinkConversionPath, updatePaymentErc20FeeProxy } from './adminTasks'; + +/** + * Updates the values of the batch fees of the BatchPayments contract, if needed + * @param contractAddress address of the BatchPayments Proxy + * @param hre Hardhat runtime environment + */ +export const setupEthConversionProxy = async ( + contractAddress: string, + hre: HardhatRuntimeEnvironmentExtended, +): Promise => { + // Setup contract parameters + const EthConversionProxyContract = new hre.ethers.Contract( + contractAddress, + batchPaymentsArtifact.getContractAbi(), + ); + await Promise.all( + hre.config.xdeploy.networks.map(async (network) => { + let provider; + if (network === 'celo') { + provider = utils.getCeloProvider(); + } else { + provider = utils.getDefaultProvider(network); + } + const wallet = new hre.ethers.Wallet(hre.config.xdeploy.signer, provider); + const signer = wallet.connect(provider); + const EthConversionProxyConnected = await EthConversionProxyContract.connect(signer); + const adminNonce = await signer.getTransactionCount(); + const gasPrice = await provider.getGasPrice(); + + // start from the adminNonce, increase gasPrice if needed + await Promise.all([ + updatePaymentErc20FeeProxy(EthConversionProxyConnected, network, adminNonce, gasPrice), + updateChainlinkConversionPath( + EthConversionProxyConnected, + network, + adminNonce + 1, + gasPrice, + ), + ]); + }), + ); + console.log('Setup for EthConversionProxy successful'); +}; diff --git a/packages/smart-contracts/scripts-create2/contract-setup/setups.ts b/packages/smart-contracts/scripts-create2/contract-setup/setups.ts new file mode 100644 index 0000000000..f650553bf0 --- /dev/null +++ b/packages/smart-contracts/scripts-create2/contract-setup/setups.ts @@ -0,0 +1,35 @@ +import { HardhatRuntimeEnvironmentExtended } from '../types'; +import { setupEthConversionProxy } from './setupEthConversionProxy'; +import { setupBatchPayments } from './setupBatchPayments'; +import { setupERC20SwapToConversion } from './setupERC20SwapToConversion'; + +/** + * Updates the values of either BatchPayments, EthConversionProxy, or ERC20SwapToConversion contract, if needed + * @param contractAddress address of the proxy + * @param hre Hardhat runtime environment + * @param contractName name of the contract + */ +export const setupContract = async ( + contractAddress: string, + hre: HardhatRuntimeEnvironmentExtended, + contractName: string, +): Promise => { + switch (contractName) { + case 'EthConversionProxy': { + await setupEthConversionProxy(contractAddress, hre); + break; + } + case 'ERC20SwapToConversion': { + await setupERC20SwapToConversion(contractAddress, hre); + break; + } + case 'BatchPayments': { + await setupBatchPayments(contractAddress, hre); + break; + } + default: { + console.log('Contract name not found'); + break; + } + } +}; diff --git a/packages/smart-contracts/scripts-create2/deploy.ts b/packages/smart-contracts/scripts-create2/deploy.ts new file mode 100644 index 0000000000..ec15644fac --- /dev/null +++ b/packages/smart-contracts/scripts-create2/deploy.ts @@ -0,0 +1,87 @@ +import { create2ContractDeploymentList, isContractDeployed } from './utils'; +import { IDeploymentParams } from './types'; +import { HardhatRuntimeEnvironmentExtended } from './types'; +import { xdeploy } from './xdeployer'; +import { getConstructorArgs } from './constructor-args'; +import { setupERC20SwapToConversion } from './contract-setup'; +import { setupBatchPayments } from './contract-setup/setupBatchPayments'; + +// Deploys, set up the contracts and returns the address +export const deployOneWithCreate2 = async ( + deploymentParams: IDeploymentParams, + hre: HardhatRuntimeEnvironmentExtended, +): Promise => { + if (!hre.config.xdeploy.networks || hre.config.xdeploy.networks.length === 0) { + throw new Error('Invalid networks'); + } + // Deploy the contract on several network through xdeployer + const deploymentResult = await xdeploy(deploymentParams, hre); + for (let i = 0; i < hre.config.xdeploy.networks.length; i++) { + if (deploymentResult[i].deployed) { + console.log(`${deploymentParams.contract} successfully deployed:`); + console.log(` On network: ${hre.config.xdeploy.networks[i]}`); + console.log(` At address: ${deploymentResult[i].address}`); + console.log(` At block: ${deploymentResult[i].receipt.blockNumber}`); + } else { + if ( + isContractDeployed( + deploymentParams.contract, + hre.config.xdeploy.networks[i], + deploymentResult[i].address, + ) + ) { + console.log(`${deploymentParams.contract} already deployed:`); + console.log(` On network: ${hre.config.xdeploy.networks[i]}`); + console.log(` At address: ${deploymentResult[i].address}`); + } else { + console.log(`${deploymentParams.contract} has not been deployed:`); + console.log(` On network: ${hre.config.xdeploy.networks[i]}`); + console.log(` Error: ${deploymentResult[i].error}`); + console.log( + ` Hint: Check admin wallet balance and that your artifacts are up to date`, + ); + } + } + } + return deploymentResult[0].address; +}; + +export const deployWithCreate2FromList = async ( + hre: HardhatRuntimeEnvironmentExtended, +): Promise => { + for (const contract of create2ContractDeploymentList) { + switch (contract) { + case 'EthereumProxy': + case 'EthereumFeeProxy': + case 'ETHConversionProxy': + case 'ERC20FeeProxy': + case 'Erc20ConversionProxy': { + const constructorArgs = getConstructorArgs(contract); + await deployOneWithCreate2({ contract, constructorArgs }, hre); + break; + } + case 'ERC20SwapToConversion': { + const constructorArgs = getConstructorArgs(contract); + const address = await deployOneWithCreate2({ contract, constructorArgs }, hre); + await setupERC20SwapToConversion(address, hre); + break; + } + case 'ERC20EscrowToPay': { + const network = hre.config.xdeploy.networks[0]; + const constructorArgs = getConstructorArgs(contract, network); + await deployOneWithCreate2({ contract, constructorArgs }, hre); + break; + } + case 'BatchPayments': { + const network = hre.config.xdeploy.networks[0]; + const constructorArgs = getConstructorArgs(contract, network); + const address = await deployOneWithCreate2({ contract, constructorArgs }, hre); + await setupBatchPayments(address, hre); + break; + } + // Other cases to add when necessary + default: + throw new Error(`The contract ${contract} is not to be deployed using the CREATE2 scheme`); + } + } +}; diff --git a/packages/smart-contracts/scripts-create2/verify.ts b/packages/smart-contracts/scripts-create2/verify.ts new file mode 100644 index 0000000000..cc8648e862 --- /dev/null +++ b/packages/smart-contracts/scripts-create2/verify.ts @@ -0,0 +1,64 @@ +import { computeCreate2DeploymentAddress } from './compute-one-address'; +import { getConstructorArgs } from './constructor-args'; +import { HardhatRuntimeEnvironmentExtended } from './types'; +import { IDeploymentParams } from './types'; +import { create2ContractDeploymentList } from './utils'; + +export const verifyOne = async ( + contractAddress: string, + deploymentParams: IDeploymentParams, + hre: HardhatRuntimeEnvironmentExtended, +): Promise => { + try { + await hre.run('verify:verify', { + address: contractAddress, + constructorArguments: deploymentParams.constructorArgs, + }); + } catch (err) { + console.log(err); + } +}; + +export async function VerifyCreate2FromList(hre: HardhatRuntimeEnvironmentExtended): Promise { + try { + let address: string; + await Promise.all( + create2ContractDeploymentList.map(async (contract) => { + switch (contract) { + case 'EthereumProxy': + case 'EthereumFeeProxy': + case 'ETHConversionProxy': + case 'ERC20FeeProxy': + case 'ERC20SwapToConversion': + case 'Erc20ConversionProxy': { + const constructorArgs = getConstructorArgs(contract); + address = await computeCreate2DeploymentAddress({ contract, constructorArgs }, hre); + await verifyOne(address, { contract, constructorArgs }, hre); + break; + } + case 'ERC20EscrowToPay': { + const network = hre.config.xdeploy.networks[0]; + const constructorArgs = getConstructorArgs(contract, network); + address = await computeCreate2DeploymentAddress({ contract, constructorArgs }, hre); + await verifyOne(address, { contract, constructorArgs }, hre); + break; + } + case 'BatchPayments': { + const network = hre.config.xdeploy.networks[0]; + const constructorArgs = getConstructorArgs(contract, network); + address = await computeCreate2DeploymentAddress({ contract, constructorArgs }, hre); + await verifyOne(address, { contract, constructorArgs }, hre); + break; + } + // Other cases to add when necessary + default: + throw new Error( + `The contrat ${contract} is not to be deployed using the CREATE2 scheme`, + ); + } + }), + ); + } catch (e) { + console.error(e); + } +} diff --git a/packages/smart-contracts/src/lib/artifacts/ERC20EscrowToPay/index.ts b/packages/smart-contracts/src/lib/artifacts/ERC20EscrowToPay/index.ts index c53b7cdb19..d968383f92 100644 --- a/packages/smart-contracts/src/lib/artifacts/ERC20EscrowToPay/index.ts +++ b/packages/smart-contracts/src/lib/artifacts/ERC20EscrowToPay/index.ts @@ -22,8 +22,8 @@ export const erc20EscrowToPayArtifact = new ContractArtifact( creationBlockNumber: 10461945, }, goerli: { - address: '0xEbe28A2B7336670Ba752bfEad4a121D2c4FF2464', - creationBlockNumber: 10461945, + address: '0xB6f943d324a70B2883aE890089433345feCe8Be4', + creationBlockNumber: 7091488, }, matic: { address: '0xc7f471F5A8f8b33F131049b1e9A43941CbE31792', From 23ef8eceabeaa5dfcae672b3f659d68b54f1e1e3 Mon Sep 17 00:00:00 2001 From: Romain TREFAULT Date: Fri, 15 Jul 2022 12:05:14 +0200 Subject: [PATCH 50/85] feat: add goerli --- packages/payment-processor/src/payment/utils.ts | 2 +- packages/payment-processor/test/payment/utils.test.ts | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/packages/payment-processor/src/payment/utils.ts b/packages/payment-processor/src/payment/utils.ts index 355665d174..a0dc0b72df 100644 --- a/packages/payment-processor/src/payment/utils.ts +++ b/packages/payment-processor/src/payment/utils.ts @@ -30,7 +30,7 @@ export function getProvider(): providers.Web3Provider { /** * Utility to get a network provider, depending on the request's currency network. - * Will throw an error if the network isn't mainnet or rinkeby + * Will throw an error if the network isn't mainnet, rinkeby, or goerli * * @param request */ diff --git a/packages/payment-processor/test/payment/utils.test.ts b/packages/payment-processor/test/payment/utils.test.ts index 7f06a01d1e..16edf997d5 100644 --- a/packages/payment-processor/test/payment/utils.test.ts +++ b/packages/payment-processor/test/payment/utils.test.ts @@ -108,6 +108,15 @@ describe('getNetworkProvider', () => { expect(getNetworkProvider(request)).toBeInstanceOf(providers.Provider); }); + it('returns a provider for goerli', () => { + const request: any = { + currencyInfo: { + network: 'goerli', + }, + }; + expect(getNetworkProvider(request)).toBeInstanceOf(providers.Provider); + }); + it('fails for other network', () => { const request: any = { currencyInfo: { From a0af723e02f198a233d2aa4c6b3412b84c3bde7e Mon Sep 17 00:00:00 2001 From: olivier7delf <55892112+olivier7delf@users.noreply.github.com> Date: Mon, 11 Jul 2022 10:58:06 +0200 Subject: [PATCH 51/85] fix(smart-contracts): update batch fees (#873) update batch fees from 1% to .3% --- .../scripts-create2/contract-setup/adminTasks.ts | 6 ++++-- .../scripts-create2/contract-setup/setupBatchPayments.ts | 6 +++--- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/packages/smart-contracts/scripts-create2/contract-setup/adminTasks.ts b/packages/smart-contracts/scripts-create2/contract-setup/adminTasks.ts index b33fe6fcb8..a2c8d6ffca 100644 --- a/packages/smart-contracts/scripts-create2/contract-setup/adminTasks.ts +++ b/packages/smart-contracts/scripts-create2/contract-setup/adminTasks.ts @@ -5,8 +5,8 @@ import { BigNumber } from 'ethers'; // Fees: 0.5% export const REQUEST_SWAP_FEES = 5; -// Batch Fees: 1% -export const BATCH_FEE = 10; +// Batch Fees: .3% +export const BATCH_FEE = 3; export const updateChainlinkConversionPath = async ( contract: any, @@ -57,6 +57,8 @@ export const updateBatchPaymentFees = async ( ): Promise => { const currentFees = await contract.batchFee(); if (currentFees !== BATCH_FEE) { + // Log is useful to have a direct view on was is being updated + console.log(`currentFees: ${currentFees.toString()}, new fees: ${BATCH_FEE}`); await contract.setBatchFee(BATCH_FEE, { nonce: nonce, gasPrice: gasPrice }); } }; diff --git a/packages/smart-contracts/scripts-create2/contract-setup/setupBatchPayments.ts b/packages/smart-contracts/scripts-create2/contract-setup/setupBatchPayments.ts index db3b703bcc..78fa718e08 100644 --- a/packages/smart-contracts/scripts-create2/contract-setup/setupBatchPayments.ts +++ b/packages/smart-contracts/scripts-create2/contract-setup/setupBatchPayments.ts @@ -37,9 +37,9 @@ export const setupBatchPayments = async ( // start from the adminNonce, increase gasPrice if needed await Promise.all([ - updateBatchPaymentFees(batchPaymentConnected, adminNonce, gasPrice), - updatePaymentErc20FeeProxy(batchPaymentConnected, network, adminNonce + 1, gasPrice), - updatePaymentEthFeeProxy(batchPaymentConnected, network, adminNonce + 2, gasPrice), + updateBatchPaymentFees(batchPaymentConnected, adminNonce, gasPrice.mul(2)), + updatePaymentErc20FeeProxy(batchPaymentConnected, network, adminNonce + 1, gasPrice.mul(2)), + updatePaymentEthFeeProxy(batchPaymentConnected, network, adminNonce + 2, gasPrice.mul(2)), ]); }), ); From bfe2e9e4cb9604b953cef9e04f3cb4c26c3d1b6b Mon Sep 17 00:00:00 2001 From: Bertrand Juglas Date: Tue, 12 Jul 2022 19:04:45 +0200 Subject: [PATCH 52/85] feat: Add cancel stream function (#884) --- .../src/payment/erc777-stream.ts | 99 ++++++++++++++----- .../test/payment/erc777-stream.test.ts | 58 +++++++++-- 2 files changed, 126 insertions(+), 31 deletions(-) diff --git a/packages/payment-processor/src/payment/erc777-stream.ts b/packages/payment-processor/src/payment/erc777-stream.ts index 01a627db93..ef25531180 100644 --- a/packages/payment-processor/src/payment/erc777-stream.ts +++ b/packages/payment-processor/src/payment/erc777-stream.ts @@ -10,12 +10,16 @@ import { } from './utils'; import { Framework } from '@superfluid-finance/sdk-core'; -export const resolverAddress = '0x913bbCFea2f347a24cfCA441d483E7CBAc8De3Db'; +export const RESOLVER_ADDRESS = '0x913bbCFea2f347a24cfCA441d483E7CBAc8De3Db'; +// Superfluid payments of requests use the generic field `userData` to index payments. +// Since it's a multi-purpose field, payments will use a fix-prefix heading the payment reference, +// in order to speed up the indexing and payment detection. +export const USERDATA_PREFIX = '0xbeefac'; /** * Processes a transaction to pay an ERC777 stream Request. * @param request - * @param signerOrProvider the Web3 provider, or signer. Defaults to window.ethereum. + * @param signer the Web3 signer. Defaults to window.ethereum. * @param overrides optionally, override default transaction values, like gas. */ export async function payErc777StreamRequest( @@ -28,35 +32,84 @@ export async function payErc777StreamRequest( throw new Error('Not a supported ERC777 payment network request'); } validateRequest(request, PaymentTypes.PAYMENT_NETWORK_ID.ERC777_STREAM); - const networkName = - request.currencyInfo.network === 'private' ? 'custom' : request.currencyInfo.network; - const sf = await Framework.create({ - networkName, - provider: signer.provider ?? getProvider(), - dataMode: request.currencyInfo.network === 'private' ? 'WEB3_ONLY' : undefined, - resolverAddress: request.currencyInfo.network === 'private' ? resolverAddress : undefined, - protocolReleaseVersion: request.currencyInfo.network === 'private' ? 'test' : undefined, - }); - const superSigner = sf.createSigner({ - signer: signer, - provider: signer.provider, - }); - const superToken = await sf.loadSuperToken(request.currencyInfo.value); + const sf = await getSuperFluidFramework(request, signer); // FIXME: according to specs PR https://github.com/RequestNetwork/requestNetwork/pull/688 // in file packages/advanced-logic/specs/payment-network-erc777-stream-0.1.0.md + // Below are the SF actions to add in the BatchCall: // - use expectedStartDate to compute offset between start of invoicing and start of streaming // - start fee streaming + const streamPayOp = await getStartStreamOp(sf, request, overrides); + const batchCall = sf.batchCall([streamPayOp]); + return batchCall.exec(signer); +} + +/** + * Processes a transaction to complete an ERC777 stream paying a Request. + * @param request + * @param signer the Web3 signer. Defaults to window.ethereum. + * @param overrides optionally, override default transaction values, like gas. + */ +export async function completeErc777StreamRequest( + request: ClientTypes.IRequestData, + signer: Signer, + overrides?: Overrides, +): Promise { + const id = getPaymentNetworkExtension(request)?.id; + if (id !== ExtensionTypes.ID.PAYMENT_NETWORK_ERC777_STREAM) { + throw new Error('Not a supported ERC777 payment network request'); + } + validateRequest(request, PaymentTypes.PAYMENT_NETWORK_ID.ERC777_STREAM); + const sf = await getSuperFluidFramework(request, signer); + // FIXME: according to specs PR https://github.com/RequestNetwork/requestNetwork/pull/688 + // in file packages/advanced-logic/specs/payment-network-erc777-stream-0.1.0.md + // Below are the SF actions to add in the BatchCall : + // - use expectedEndDate to compute offset between stop of invoicing and stop of streaming + // - stop fee streaming + const streamPayOp = await getStopStreamOp(sf, signer, request, overrides); + const batchCall = sf.batchCall([streamPayOp]); + return batchCall.exec(signer); +} + +async function getSuperFluidFramework(request: ClientTypes.IRequestData, signer: Signer) { + const isNetworkPrivate = request.currencyInfo.network === 'private'; + const networkName = isNetworkPrivate ? 'custom' : request.currencyInfo.network; + return await Framework.create({ + networkName, + provider: signer.provider ?? getProvider(), + dataMode: isNetworkPrivate ? 'WEB3_ONLY' : undefined, + resolverAddress: isNetworkPrivate ? RESOLVER_ADDRESS : undefined, + protocolReleaseVersion: isNetworkPrivate ? 'test' : undefined, + }); +} +async function getStartStreamOp( + sf: Framework, + request: ClientTypes.IRequestData, + overrides?: Overrides, +) { + const superToken = await sf.loadSuperToken(request.currencyInfo.value); const { paymentReference, paymentAddress, expectedFlowRate } = getRequestPaymentValues(request); - // Superfluid payments of requests use the generic field `userData` to index payments. - // Since it's a multi-purpose field, payments will use a fix-prefix heading the payment reference, - // in order to speed up the indexing and payment detection. - const streamPayOp = sf.cfaV1.createFlow({ + return sf.cfaV1.createFlow({ flowRate: expectedFlowRate ?? '0', receiver: paymentAddress, superToken: superToken.address, - userData: `0xbeefac${paymentReference}`, + userData: `${USERDATA_PREFIX}${paymentReference}`, + overrides: overrides, + }); +} + +async function getStopStreamOp( + sf: Framework, + signer: Signer, + request: ClientTypes.IRequestData, + overrides?: Overrides, +) { + const superToken = await sf.loadSuperToken(request.currencyInfo.value); + const { paymentReference, paymentAddress } = getRequestPaymentValues(request); + return sf.cfaV1.deleteFlow({ + superToken: superToken.address, + sender: await signer.getAddress(), + receiver: paymentAddress, + userData: `${USERDATA_PREFIX}${paymentReference}`, overrides: overrides, }); - const batchCall = sf.batchCall([streamPayOp]); - return batchCall.exec(superSigner); } diff --git a/packages/payment-processor/test/payment/erc777-stream.test.ts b/packages/payment-processor/test/payment/erc777-stream.test.ts index 605e3f03d8..644e71225f 100644 --- a/packages/payment-processor/test/payment/erc777-stream.test.ts +++ b/packages/payment-processor/test/payment/erc777-stream.test.ts @@ -10,7 +10,11 @@ import { } from '@requestnetwork/types'; import Utils from '@requestnetwork/utils'; -import { payErc777StreamRequest, resolverAddress } from '../../src/payment/erc777-stream'; +import { + completeErc777StreamRequest, + payErc777StreamRequest, + RESOLVER_ADDRESS, +} from '../../src/payment/erc777-stream'; import { getRequestPaymentValues } from '../../src/payment/utils'; const daiABI = require('../abis/fDAIABI'); @@ -120,8 +124,8 @@ describe('erc777-stream', () => { }); }); - describe('payErc777StreamRequest', () => { - it('should pay an ERC777 request with fees', async () => { + describe('Streams management', () => { + it('payErc777StreamRequest should pay an ERC777 request', async () => { let tx; let confirmedTx; // initialize the superfluid framework...put custom and web3 only bc we are using ganache locally @@ -129,7 +133,7 @@ describe('erc777-stream', () => { networkName: 'custom', provider, dataMode: 'WEB3_ONLY', - resolverAddress: resolverAddress, + resolverAddress: RESOLVER_ADDRESS, protocolReleaseVersion: 'test', }); @@ -183,18 +187,56 @@ describe('erc777-stream', () => { expect(confirmedTx.status).toBe(1); expect(tx.hash).not.toBeUndefined(); - const wFlowRate = await sf.cfaV1.getNetFlow({ + const walletFlowRate = await sf.cfaV1.getNetFlow({ + superToken: daix.address, + account: wallet.address, + providerOrSigner: provider, + }); + expect(walletFlowRate).toBe(`-${expectedFlowRate}`); + const paymentFlowRate = await sf.cfaV1.getNetFlow({ + superToken: daix.address, + account: paymentAddress, + providerOrSigner: provider, + }); + expect(paymentFlowRate).toBe(expectedFlowRate); + }); + + it('completeErc777StreamRequest should complete an ERC777 request', async () => { + let tx; + let confirmedTx; + // initialize the superfluid framework...put custom and web3 only bc we are using ganache locally + const sf = await Framework.create({ + networkName: 'custom', + provider, + dataMode: 'WEB3_ONLY', + resolverAddress: RESOLVER_ADDRESS, + protocolReleaseVersion: 'test', + }); + + // use the framework to get the SuperToken + const daix = await sf.loadSuperToken('fDAIx'); + + // wait 2 seconds of streaming to avoid failing + await new Promise((r) => setTimeout(r, 2000)); + + // Stopping fDAIX stream request + tx = await completeErc777StreamRequest(validRequest, wallet); + confirmedTx = await tx.wait(1); + expect(confirmedTx.status).toBe(1); + expect(tx.hash).not.toBeUndefined(); + + const walletFlowRate = await sf.cfaV1.getNetFlow({ superToken: daix.address, account: wallet.address, providerOrSigner: provider, }); - expect(wFlowRate).toBe(`-${expectedFlowRate}`); - const pFlowRate = await sf.cfaV1.getNetFlow({ + expect(walletFlowRate).toBe('0'); + const paymentFlowRate = await sf.cfaV1.getNetFlow({ superToken: daix.address, account: paymentAddress, providerOrSigner: provider, }); - expect(pFlowRate).toBe(expectedFlowRate); + expect(paymentFlowRate).toBe('0'); }); }); }); From 7a8194c478d0e1db7617b9f58fad0e3f0dbba3af Mon Sep 17 00:00:00 2001 From: Darko Kolev Date: Fri, 15 Jul 2022 11:33:39 +0200 Subject: [PATCH 53/85] fixed ethFeeProxy subgraph goerli test --- .../test/erc20/thegraph-info-retriever.test.ts | 13 +++++++------ .../src/lib/artifacts/EthConversionProxy/index.ts | 4 ++++ .../src/lib/artifacts/EthereumProxy/index.ts | 4 ++++ 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/packages/payment-detection/test/erc20/thegraph-info-retriever.test.ts b/packages/payment-detection/test/erc20/thegraph-info-retriever.test.ts index c641ed0feb..a9af030300 100644 --- a/packages/payment-detection/test/erc20/thegraph-info-retriever.test.ts +++ b/packages/payment-detection/test/erc20/thegraph-info-retriever.test.ts @@ -97,14 +97,14 @@ describe('api/erc20/thegraph-info-retriever', () => { it('should get payment event from ethFeeProxy via subgraph', async () => { const paymentData = { reference: '0x6c93723bc5f82e6fbb2ea994bf0fb572fa19f7a2a3146065e21752b95668efe5', - txHash: '0x3e2d6cc2534b1d340ba2954f34e6cc819d6da64ff76863ea89c6d34b15d13c97', - from: '0x186e7fe6c34ea0eca7f9c2fd29651fc0443e3f29', + txHash: '0x29a55b7f978a902275746f6eb930abf608dc77c0592fce9cf6c326128fcf7493', + from: '0xBc9643B7Bd7c8621F4a68280433796484b9E525d', to: '0x5000ee9fb9c96a2a09d8efb695ac21d6c429ff11', network: 'goerli', salt: '0ee84db293a752c6', - amount: '30000000000000', + amount: '600000000000000', requestId: '0188791633ff0ec72a7dbdefb886d2db6cccfa98287320839c2f173c7a4e3ce7e1', - block: 9606098, + block: 7230236, feeAddress: '0x5000EE9FB9c96A2A09D8efB695aC21D6C429fF11', feeAmount: '0', }; @@ -127,7 +127,7 @@ describe('api/erc20/thegraph-info-retriever', () => { const allNetworkEvents = await graphRetriever.getTransferEvents(); const transferEvents = allNetworkEvents.paymentEvents; // expect(transferEvents).toHaveLength(1); - expect(transferEvents[0].amount).toEqual('30000000000000'); + expect(transferEvents[0].amount).toEqual('600000000000000'); expect(transferEvents[0].name).toEqual('payment'); expect(transferEvents[0].parameters?.to).toEqual(paymentData.to); expect(transferEvents[0].parameters?.txHash).toEqual(paymentData.txHash); @@ -136,7 +136,8 @@ describe('api/erc20/thegraph-info-retriever', () => { expect(transferEvents[0].parameters?.feeAmount).toEqual(paymentData.feeAmount); }); - it('should get payment event from ethFeeConversionProxy via subgraph', async () => { + // doesn't work because chainlink doesn't have oracles on goerli + it.skip('should get payment event from ethFeeConversionProxy via subgraph', async () => { const paymentData = { reference: '0x6c93723bc5f82e6fbb2ea994bf0fb572fa19f7a2a3146065e21752b95668efe5', txHash: '0x2f7b4752aa259166c038cd9073056c5979760cf0eea55d093fca2095c229313b', diff --git a/packages/smart-contracts/src/lib/artifacts/EthConversionProxy/index.ts b/packages/smart-contracts/src/lib/artifacts/EthConversionProxy/index.ts index 01ced6caa8..c9720fa6d9 100644 --- a/packages/smart-contracts/src/lib/artifacts/EthConversionProxy/index.ts +++ b/packages/smart-contracts/src/lib/artifacts/EthConversionProxy/index.ts @@ -55,6 +55,10 @@ export const ethConversionArtifact = new ContractArtifact( address: '0x7Ebf48a26253810629C191b56C3212Fd0D211c26', creationBlockNumber: 10023415, }, + goerli: { + address: '0xED250D9219EB93098Bb67aEbc992963172B9c8DA', + creationBlockNumber: 7108896, + }, fantom: { address: '0x7Ebf48a26253810629C191b56C3212Fd0D211c26', creationBlockNumber: 28552915, diff --git a/packages/smart-contracts/src/lib/artifacts/EthereumProxy/index.ts b/packages/smart-contracts/src/lib/artifacts/EthereumProxy/index.ts index 527cedbb78..2602944bd0 100644 --- a/packages/smart-contracts/src/lib/artifacts/EthereumProxy/index.ts +++ b/packages/smart-contracts/src/lib/artifacts/EthereumProxy/index.ts @@ -136,6 +136,10 @@ export const ethereumProxyArtifact = new ContractArtifact( address: '0x322F0037d272E980984F89E94Aae43BD0FC065E6', creationBlockNumber: 10307566, }, + goerli: { + address: '0x171Ee0881407d4c0C11eA1a2FB7D5b4cdED71e6e', + creationBlockNumber: 7069045, + }, fantom: { address: '0x322F0037d272E980984F89E94Aae43BD0FC065E6', creationBlockNumber: 33496209, From bf0d578412bb8b37d29d227f1ed1fd39d639f9ae Mon Sep 17 00:00:00 2001 From: Romain TREFAULT Date: Fri, 15 Jul 2022 14:00:10 +0200 Subject: [PATCH 54/85] refactor: move goerli to the newest versions --- .../src/lib/artifacts/ChainlinkConversionPath/index.ts | 8 ++++---- .../src/lib/artifacts/ERC20EscrowToPay/index.ts | 4 ++-- .../src/lib/artifacts/ERC20SwapToPay/index.ts | 8 ++++---- .../src/lib/artifacts/EthConversionProxy/index.ts | 4 ---- .../src/lib/artifacts/EthereumFeeProxy/index.ts | 8 ++++---- .../src/lib/artifacts/EthereumProxy/index.ts | 4 ---- 6 files changed, 14 insertions(+), 22 deletions(-) diff --git a/packages/smart-contracts/src/lib/artifacts/ChainlinkConversionPath/index.ts b/packages/smart-contracts/src/lib/artifacts/ChainlinkConversionPath/index.ts index ee0761fde6..caaf56a337 100644 --- a/packages/smart-contracts/src/lib/artifacts/ChainlinkConversionPath/index.ts +++ b/packages/smart-contracts/src/lib/artifacts/ChainlinkConversionPath/index.ts @@ -22,10 +22,6 @@ export const chainlinkConversionPath = new ContractArtifact( creationBlockNumber: 10461945, }, goerli: { - address: '0xB6f943d324a70B2883aE890089433345feCe8Be4', - creationBlockNumber: 7091488, + address: '0xd2777001fD7D89331D8E87eC439f78079179322b', + creationBlockNumber: 7230322, }, matic: { address: '0xc7f471F5A8f8b33F131049b1e9A43941CbE31792', diff --git a/packages/smart-contracts/src/lib/artifacts/ERC20SwapToPay/index.ts b/packages/smart-contracts/src/lib/artifacts/ERC20SwapToPay/index.ts index ad9a3ff5eb..9e5f975c06 100644 --- a/packages/smart-contracts/src/lib/artifacts/ERC20SwapToPay/index.ts +++ b/packages/smart-contracts/src/lib/artifacts/ERC20SwapToPay/index.ts @@ -21,10 +21,6 @@ export const erc20SwapToPayArtifact = new ContractArtifact( address: '0xb674e3d228e631594D8fd4BF947E1811288bf836', creationBlockNumber: 7363204, }, - goerli: { - address: '0x0Ef49176A87Adcc88bD5125126C6a6c23a28303C', - creationBlockNumber: 7109102, - }, }, }, '0.3.0': { @@ -42,6 +38,10 @@ export const erc20SwapToPayArtifact = new ContractArtifact( address: '0x1B5077Ca852d39CDDeDaF45FAF1235841854420b', creationBlockNumber: 7408086, }, + goerli: { + address: '0x0Ef49176A87Adcc88bD5125126C6a6c23a28303C', + creationBlockNumber: 7109102, + }, bsc: { address: '0x75740D9b5cA3BCCb356CA7f0D0dB71aBE427a835', creationBlockNumber: 16165020, diff --git a/packages/smart-contracts/src/lib/artifacts/EthConversionProxy/index.ts b/packages/smart-contracts/src/lib/artifacts/EthConversionProxy/index.ts index c9720fa6d9..16c2dc5e21 100644 --- a/packages/smart-contracts/src/lib/artifacts/EthConversionProxy/index.ts +++ b/packages/smart-contracts/src/lib/artifacts/EthConversionProxy/index.ts @@ -18,10 +18,6 @@ export const ethConversionArtifact = new ContractArtifact( address: '0xCa3353a15fCb5C83a1Ff64BFf055781aC5c4d2F4', creationBlockNumber: 9447194, }, - goerli: { - address: '0xED250D9219EB93098Bb67aEbc992963172B9c8DA', - creationBlockNumber: 7108896, - }, fantom: { address: '0xCa3353a15fCb5C83a1Ff64BFf055781aC5c4d2F4', creationBlockNumber: 20066436, diff --git a/packages/smart-contracts/src/lib/artifacts/EthereumFeeProxy/index.ts b/packages/smart-contracts/src/lib/artifacts/EthereumFeeProxy/index.ts index 06dd436767..8b0d26e0b0 100644 --- a/packages/smart-contracts/src/lib/artifacts/EthereumFeeProxy/index.ts +++ b/packages/smart-contracts/src/lib/artifacts/EthereumFeeProxy/index.ts @@ -17,10 +17,6 @@ export const ethereumFeeProxyArtifact = new ContractArtifact( address: '0xC6E23a20C0a1933ACC8E30247B5D1e2215796C1F', creationBlockNumber: 9447193, }, - goerli: { - address: '0xe11BF2fDA23bF0A98365e1A4c04A87C9339e8687', - creationBlockNumber: 7091386, - }, fantom: { address: '0xC6E23a20C0a1933ACC8E30247B5D1e2215796C1F', creationBlockNumber: 20066431, @@ -66,6 +62,10 @@ export const ethereumFeeProxyArtifact = new ContractArtifact( address: '0xfCFBcfc4f5A421089e3Df45455F7f4985FE2D6a8', creationBlockNumber: 10307582, }, + goerli: { + address: '0xe11BF2fDA23bF0A98365e1A4c04A87C9339e8687', + creationBlockNumber: 7091386, + }, fantom: { address: '0xfCFBcfc4f5A421089e3Df45455F7f4985FE2D6a8', creationBlockNumber: 33495801, diff --git a/packages/smart-contracts/src/lib/artifacts/EthereumProxy/index.ts b/packages/smart-contracts/src/lib/artifacts/EthereumProxy/index.ts index 2602944bd0..b318578e54 100644 --- a/packages/smart-contracts/src/lib/artifacts/EthereumProxy/index.ts +++ b/packages/smart-contracts/src/lib/artifacts/EthereumProxy/index.ts @@ -21,10 +21,6 @@ export const ethereumProxyArtifact = new ContractArtifact( address: '0x9c6c7817e3679c4b3f9ef9486001eae5aaed25ff', creationBlockNumber: 5955681, }, - goerli: { - address: '0x171Ee0881407d4c0C11eA1a2FB7D5b4cdED71e6e', - creationBlockNumber: 7069045, - }, xdai: { address: '0x27c60BE17e853c47A9F1d280B05365f483c2dFAF', creationBlockNumber: 18326895, From 1608de0de191266dfae30bd570b3d94a96b12ac6 Mon Sep 17 00:00:00 2001 From: Romain TREFAULT Date: Fri, 15 Jul 2022 14:00:30 +0200 Subject: [PATCH 55/85] refactor: move goerli to the newest versions --- .../src/lib/artifacts/ERC20FeeProxy/index.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/smart-contracts/src/lib/artifacts/ERC20FeeProxy/index.ts b/packages/smart-contracts/src/lib/artifacts/ERC20FeeProxy/index.ts index dd64ee33e5..a921c2f194 100644 --- a/packages/smart-contracts/src/lib/artifacts/ERC20FeeProxy/index.ts +++ b/packages/smart-contracts/src/lib/artifacts/ERC20FeeProxy/index.ts @@ -21,10 +21,6 @@ export const erc20FeeProxyArtifact = new ContractArtifact( address: '0xda46309973bFfDdD5a10cE12c44d2EE266f45A44', creationBlockNumber: 7118080, }, - goerli: { - address: '0x399F5EE127ce7432E4921a61b8CF52b0af52cbfE', - creationBlockNumber: 7091472, - }, matic: { address: '0x2171a0dc12a9E5b1659feF2BB20E54c84Fa7dB0C', creationBlockNumber: 14163521, @@ -67,6 +63,10 @@ export const erc20FeeProxyArtifact = new ContractArtifact( address: '0xda46309973bFfDdD5a10cE12c44d2EE266f45A44', creationBlockNumber: 7118080, }, + goerli: { + address: '0x399F5EE127ce7432E4921a61b8CF52b0af52cbfE', + creationBlockNumber: 7091472, + }, matic: { address: '0x0DfbEe143b42B41eFC5A6F87bFD1fFC78c2f0aC9', creationBlockNumber: 17427742, From 08717cc63b1ae3915c98c8885e283d8709958d8e Mon Sep 17 00:00:00 2001 From: Darko Kolev Date: Mon, 18 Jul 2022 13:44:28 +0200 Subject: [PATCH 56/85] new escrow deployed on mainnet, rinkeby, goerli, matic and fuse --- .../src/lib/artifacts/ERC20EscrowToPay/index.ts | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/smart-contracts/src/lib/artifacts/ERC20EscrowToPay/index.ts b/packages/smart-contracts/src/lib/artifacts/ERC20EscrowToPay/index.ts index 9f2ed78967..12d294bef8 100644 --- a/packages/smart-contracts/src/lib/artifacts/ERC20EscrowToPay/index.ts +++ b/packages/smart-contracts/src/lib/artifacts/ERC20EscrowToPay/index.ts @@ -14,24 +14,24 @@ export const erc20EscrowToPayArtifact = new ContractArtifact( creationBlockNumber: 0, }, mainnet: { - address: '0xa015c141C02996EcE6410646DA3D07d70091c577', - creationBlockNumber: 14884007, + address: '0x7DfD5955a1Ed6Bf74ccF8e24FF53E0a9A7e9F477', + creationBlockNumber: 15146972, }, rinkeby: { - address: '0xEbe28A2B7336670Ba752bfEad4a121D2c4FF2464', - creationBlockNumber: 10461945, + address: '0x2b487A3251aCC34ae95E4f5aA7fdcD2C7447B42e', + creationBlockNumber: 11028247, }, goerli: { address: '0xd2777001fD7D89331D8E87eC439f78079179322b', creationBlockNumber: 7230322, }, matic: { - address: '0xc7f471F5A8f8b33F131049b1e9A43941CbE31792', - creationBlockNumber: 29821569, + address: '0x937Db37ffb67083242fbC6AdD472146bF10E01ec', + creationBlockNumber: 30751595, }, fuse: { - address: '0xa015c141C02996EcE6410646DA3D07d70091c577', - creationBlockNumber: 17328459, + address: '0x4BA012eae4d64da79Bd6bcdBa366803fCe701A4C', + creationBlockNumber: 18086337, }, celo: { address: '0xa015c141C02996EcE6410646DA3D07d70091c577', From e693ba13eb10fde6ab4edcb244e7db434bb7cd1f Mon Sep 17 00:00:00 2001 From: Darko Kolev Date: Thu, 28 Jul 2022 10:05:11 +0200 Subject: [PATCH 57/85] refactor: contract setup compression fix (#888) --- packages/smart-contracts/hardhat.config.ts | 4 +- .../contract-setup/setupETHConversionProxy.ts | 47 ++++++++++ .../scripts-create2/deploy-one.ts | 87 ------------------- .../deploy-request-deployer.ts | 2 +- .../scripts-create2/verify-one.ts | 64 -------------- .../ChainlinkConversionPath/index.ts | 4 + .../lib/artifacts/ERC20EscrowToPay/index.ts | 4 + .../src/lib/artifacts/ERC20FeeProxy/index.ts | 4 + .../src/lib/artifacts/ERC20SwapToPay/index.ts | 4 + .../lib/artifacts/EthConversionProxy/index.ts | 4 + .../lib/artifacts/EthereumFeeProxy/index.ts | 4 + .../src/lib/artifacts/EthereumProxy/index.ts | 4 + 12 files changed, 78 insertions(+), 154 deletions(-) create mode 100644 packages/smart-contracts/scripts-create2/contract-setup/setupETHConversionProxy.ts delete mode 100644 packages/smart-contracts/scripts-create2/deploy-one.ts delete mode 100644 packages/smart-contracts/scripts-create2/verify-one.ts diff --git a/packages/smart-contracts/hardhat.config.ts b/packages/smart-contracts/hardhat.config.ts index 514bb2b494..f12fdc0d4b 100644 --- a/packages/smart-contracts/hardhat.config.ts +++ b/packages/smart-contracts/hardhat.config.ts @@ -11,8 +11,8 @@ import { checkCreate2Deployer } from './scripts-create2/check-deployer'; import { deployDeployer } from './scripts-create2/deploy-request-deployer'; import { HardhatRuntimeEnvironmentExtended } from './scripts-create2/types'; import { computeCreate2DeploymentAddressesFromList } from './scripts-create2/compute-one-address'; -import { VerifyCreate2FromList } from './scripts-create2/verify-one'; -import { deployWithCreate2FromList } from './scripts-create2/deploy-one'; +import { VerifyCreate2FromList } from './scripts-create2/verify'; +import { deployWithCreate2FromList } from './scripts-create2/deploy'; import utils from '@requestnetwork/utils'; config(); diff --git a/packages/smart-contracts/scripts-create2/contract-setup/setupETHConversionProxy.ts b/packages/smart-contracts/scripts-create2/contract-setup/setupETHConversionProxy.ts new file mode 100644 index 0000000000..28d1c974d9 --- /dev/null +++ b/packages/smart-contracts/scripts-create2/contract-setup/setupETHConversionProxy.ts @@ -0,0 +1,47 @@ +import { batchPaymentsArtifact } from '../../src/lib'; +import { HardhatRuntimeEnvironmentExtended } from '../types'; +import utils from '@requestnetwork/utils'; +import { updateChainlinkConversionPath, updatePaymentErc20FeeProxy } from './adminTasks'; + +/** + * Updates the values of the batch fees of the BatchPayments contract, if needed + * @param contractAddress address of the BatchPayments Proxy + * @param hre Hardhat runtime environment + */ +export const setupEthConversionProxy = async ( + contractAddress: string, + hre: HardhatRuntimeEnvironmentExtended, +): Promise => { + // Setup contract parameters + const EthConversionProxyContract = new hre.ethers.Contract( + contractAddress, + batchPaymentsArtifact.getContractAbi(), + ); + await Promise.all( + hre.config.xdeploy.networks.map(async (network) => { + let provider; + if (network === 'celo') { + provider = utils.getCeloProvider(); + } else { + provider = utils.getDefaultProvider(network); + } + const wallet = new hre.ethers.Wallet(hre.config.xdeploy.signer, provider); + const signer = wallet.connect(provider); + const EthConversionProxyConnected = await EthConversionProxyContract.connect(signer); + const adminNonce = await signer.getTransactionCount(); + const gasPrice = await provider.getGasPrice(); + + // start from the adminNonce, increase gasPrice if needed + await Promise.all([ + updatePaymentErc20FeeProxy(EthConversionProxyConnected, network, adminNonce, gasPrice), + updateChainlinkConversionPath( + EthConversionProxyConnected, + network, + adminNonce + 1, + gasPrice, + ), + ]); + }), + ); + console.log('Setup for EthConversionProxy successful'); +}; diff --git a/packages/smart-contracts/scripts-create2/deploy-one.ts b/packages/smart-contracts/scripts-create2/deploy-one.ts deleted file mode 100644 index ec15644fac..0000000000 --- a/packages/smart-contracts/scripts-create2/deploy-one.ts +++ /dev/null @@ -1,87 +0,0 @@ -import { create2ContractDeploymentList, isContractDeployed } from './utils'; -import { IDeploymentParams } from './types'; -import { HardhatRuntimeEnvironmentExtended } from './types'; -import { xdeploy } from './xdeployer'; -import { getConstructorArgs } from './constructor-args'; -import { setupERC20SwapToConversion } from './contract-setup'; -import { setupBatchPayments } from './contract-setup/setupBatchPayments'; - -// Deploys, set up the contracts and returns the address -export const deployOneWithCreate2 = async ( - deploymentParams: IDeploymentParams, - hre: HardhatRuntimeEnvironmentExtended, -): Promise => { - if (!hre.config.xdeploy.networks || hre.config.xdeploy.networks.length === 0) { - throw new Error('Invalid networks'); - } - // Deploy the contract on several network through xdeployer - const deploymentResult = await xdeploy(deploymentParams, hre); - for (let i = 0; i < hre.config.xdeploy.networks.length; i++) { - if (deploymentResult[i].deployed) { - console.log(`${deploymentParams.contract} successfully deployed:`); - console.log(` On network: ${hre.config.xdeploy.networks[i]}`); - console.log(` At address: ${deploymentResult[i].address}`); - console.log(` At block: ${deploymentResult[i].receipt.blockNumber}`); - } else { - if ( - isContractDeployed( - deploymentParams.contract, - hre.config.xdeploy.networks[i], - deploymentResult[i].address, - ) - ) { - console.log(`${deploymentParams.contract} already deployed:`); - console.log(` On network: ${hre.config.xdeploy.networks[i]}`); - console.log(` At address: ${deploymentResult[i].address}`); - } else { - console.log(`${deploymentParams.contract} has not been deployed:`); - console.log(` On network: ${hre.config.xdeploy.networks[i]}`); - console.log(` Error: ${deploymentResult[i].error}`); - console.log( - ` Hint: Check admin wallet balance and that your artifacts are up to date`, - ); - } - } - } - return deploymentResult[0].address; -}; - -export const deployWithCreate2FromList = async ( - hre: HardhatRuntimeEnvironmentExtended, -): Promise => { - for (const contract of create2ContractDeploymentList) { - switch (contract) { - case 'EthereumProxy': - case 'EthereumFeeProxy': - case 'ETHConversionProxy': - case 'ERC20FeeProxy': - case 'Erc20ConversionProxy': { - const constructorArgs = getConstructorArgs(contract); - await deployOneWithCreate2({ contract, constructorArgs }, hre); - break; - } - case 'ERC20SwapToConversion': { - const constructorArgs = getConstructorArgs(contract); - const address = await deployOneWithCreate2({ contract, constructorArgs }, hre); - await setupERC20SwapToConversion(address, hre); - break; - } - case 'ERC20EscrowToPay': { - const network = hre.config.xdeploy.networks[0]; - const constructorArgs = getConstructorArgs(contract, network); - await deployOneWithCreate2({ contract, constructorArgs }, hre); - break; - } - case 'BatchPayments': { - const network = hre.config.xdeploy.networks[0]; - const constructorArgs = getConstructorArgs(contract, network); - const address = await deployOneWithCreate2({ contract, constructorArgs }, hre); - await setupBatchPayments(address, hre); - break; - } - // Other cases to add when necessary - default: - throw new Error(`The contract ${contract} is not to be deployed using the CREATE2 scheme`); - } - } -}; diff --git a/packages/smart-contracts/scripts-create2/deploy-request-deployer.ts b/packages/smart-contracts/scripts-create2/deploy-request-deployer.ts index 1138f15686..34fbdcc373 100644 --- a/packages/smart-contracts/scripts-create2/deploy-request-deployer.ts +++ b/packages/smart-contracts/scripts-create2/deploy-request-deployer.ts @@ -1,6 +1,6 @@ import { HardhatRuntimeEnvironment } from 'hardhat/types'; import { HardhatRuntimeEnvironmentExtended } from './types'; -import { verifyOne } from './verify-one'; +import { verifyOne } from './verify'; // Deploys, set up the contracts export async function deployDeployer(hre: HardhatRuntimeEnvironment): Promise { diff --git a/packages/smart-contracts/scripts-create2/verify-one.ts b/packages/smart-contracts/scripts-create2/verify-one.ts deleted file mode 100644 index cc8648e862..0000000000 --- a/packages/smart-contracts/scripts-create2/verify-one.ts +++ /dev/null @@ -1,64 +0,0 @@ -import { computeCreate2DeploymentAddress } from './compute-one-address'; -import { getConstructorArgs } from './constructor-args'; -import { HardhatRuntimeEnvironmentExtended } from './types'; -import { IDeploymentParams } from './types'; -import { create2ContractDeploymentList } from './utils'; - -export const verifyOne = async ( - contractAddress: string, - deploymentParams: IDeploymentParams, - hre: HardhatRuntimeEnvironmentExtended, -): Promise => { - try { - await hre.run('verify:verify', { - address: contractAddress, - constructorArguments: deploymentParams.constructorArgs, - }); - } catch (err) { - console.log(err); - } -}; - -export async function VerifyCreate2FromList(hre: HardhatRuntimeEnvironmentExtended): Promise { - try { - let address: string; - await Promise.all( - create2ContractDeploymentList.map(async (contract) => { - switch (contract) { - case 'EthereumProxy': - case 'EthereumFeeProxy': - case 'ETHConversionProxy': - case 'ERC20FeeProxy': - case 'ERC20SwapToConversion': - case 'Erc20ConversionProxy': { - const constructorArgs = getConstructorArgs(contract); - address = await computeCreate2DeploymentAddress({ contract, constructorArgs }, hre); - await verifyOne(address, { contract, constructorArgs }, hre); - break; - } - case 'ERC20EscrowToPay': { - const network = hre.config.xdeploy.networks[0]; - const constructorArgs = getConstructorArgs(contract, network); - address = await computeCreate2DeploymentAddress({ contract, constructorArgs }, hre); - await verifyOne(address, { contract, constructorArgs }, hre); - break; - } - case 'BatchPayments': { - const network = hre.config.xdeploy.networks[0]; - const constructorArgs = getConstructorArgs(contract, network); - address = await computeCreate2DeploymentAddress({ contract, constructorArgs }, hre); - await verifyOne(address, { contract, constructorArgs }, hre); - break; - } - // Other cases to add when necessary - default: - throw new Error( - `The contrat ${contract} is not to be deployed using the CREATE2 scheme`, - ); - } - }), - ); - } catch (e) { - console.error(e); - } -} diff --git a/packages/smart-contracts/src/lib/artifacts/ChainlinkConversionPath/index.ts b/packages/smart-contracts/src/lib/artifacts/ChainlinkConversionPath/index.ts index caaf56a337..817dd671ee 100644 --- a/packages/smart-contracts/src/lib/artifacts/ChainlinkConversionPath/index.ts +++ b/packages/smart-contracts/src/lib/artifacts/ChainlinkConversionPath/index.ts @@ -22,6 +22,10 @@ export const chainlinkConversionPath = new ContractArtifact( address: '0xd2777001fD7D89331D8E87eC439f78079179322b', creationBlockNumber: 7230322, }, + goerli: { + address: '0xEbe28A2B7336670Ba752bfEad4a121D2c4FF2464', + creationBlockNumber: 10461945, + }, matic: { address: '0x937Db37ffb67083242fbC6AdD472146bF10E01ec', creationBlockNumber: 30751595, diff --git a/packages/smart-contracts/src/lib/artifacts/ERC20FeeProxy/index.ts b/packages/smart-contracts/src/lib/artifacts/ERC20FeeProxy/index.ts index a921c2f194..dbe9943407 100644 --- a/packages/smart-contracts/src/lib/artifacts/ERC20FeeProxy/index.ts +++ b/packages/smart-contracts/src/lib/artifacts/ERC20FeeProxy/index.ts @@ -21,6 +21,10 @@ export const erc20FeeProxyArtifact = new ContractArtifact( address: '0xda46309973bFfDdD5a10cE12c44d2EE266f45A44', creationBlockNumber: 7118080, }, + goerli: { + address: '0x399F5EE127ce7432E4921a61b8CF52b0af52cbfE', + creationBlockNumber: 7091472, + }, matic: { address: '0x2171a0dc12a9E5b1659feF2BB20E54c84Fa7dB0C', creationBlockNumber: 14163521, diff --git a/packages/smart-contracts/src/lib/artifacts/ERC20SwapToPay/index.ts b/packages/smart-contracts/src/lib/artifacts/ERC20SwapToPay/index.ts index 9e5f975c06..51c346834f 100644 --- a/packages/smart-contracts/src/lib/artifacts/ERC20SwapToPay/index.ts +++ b/packages/smart-contracts/src/lib/artifacts/ERC20SwapToPay/index.ts @@ -21,6 +21,10 @@ export const erc20SwapToPayArtifact = new ContractArtifact( address: '0xb674e3d228e631594D8fd4BF947E1811288bf836', creationBlockNumber: 7363204, }, + goerli: { + address: '0x0Ef49176A87Adcc88bD5125126C6a6c23a28303C', + creationBlockNumber: 7109102, + }, }, }, '0.3.0': { diff --git a/packages/smart-contracts/src/lib/artifacts/EthConversionProxy/index.ts b/packages/smart-contracts/src/lib/artifacts/EthConversionProxy/index.ts index 16c2dc5e21..c9720fa6d9 100644 --- a/packages/smart-contracts/src/lib/artifacts/EthConversionProxy/index.ts +++ b/packages/smart-contracts/src/lib/artifacts/EthConversionProxy/index.ts @@ -18,6 +18,10 @@ export const ethConversionArtifact = new ContractArtifact( address: '0xCa3353a15fCb5C83a1Ff64BFf055781aC5c4d2F4', creationBlockNumber: 9447194, }, + goerli: { + address: '0xED250D9219EB93098Bb67aEbc992963172B9c8DA', + creationBlockNumber: 7108896, + }, fantom: { address: '0xCa3353a15fCb5C83a1Ff64BFf055781aC5c4d2F4', creationBlockNumber: 20066436, diff --git a/packages/smart-contracts/src/lib/artifacts/EthereumFeeProxy/index.ts b/packages/smart-contracts/src/lib/artifacts/EthereumFeeProxy/index.ts index 8b0d26e0b0..48bfbf6b22 100644 --- a/packages/smart-contracts/src/lib/artifacts/EthereumFeeProxy/index.ts +++ b/packages/smart-contracts/src/lib/artifacts/EthereumFeeProxy/index.ts @@ -17,6 +17,10 @@ export const ethereumFeeProxyArtifact = new ContractArtifact( address: '0xC6E23a20C0a1933ACC8E30247B5D1e2215796C1F', creationBlockNumber: 9447193, }, + goerli: { + address: '0xe11BF2fDA23bF0A98365e1A4c04A87C9339e8687', + creationBlockNumber: 7091386, + }, fantom: { address: '0xC6E23a20C0a1933ACC8E30247B5D1e2215796C1F', creationBlockNumber: 20066431, diff --git a/packages/smart-contracts/src/lib/artifacts/EthereumProxy/index.ts b/packages/smart-contracts/src/lib/artifacts/EthereumProxy/index.ts index b318578e54..2602944bd0 100644 --- a/packages/smart-contracts/src/lib/artifacts/EthereumProxy/index.ts +++ b/packages/smart-contracts/src/lib/artifacts/EthereumProxy/index.ts @@ -21,6 +21,10 @@ export const ethereumProxyArtifact = new ContractArtifact( address: '0x9c6c7817e3679c4b3f9ef9486001eae5aaed25ff', creationBlockNumber: 5955681, }, + goerli: { + address: '0x171Ee0881407d4c0C11eA1a2FB7D5b4cdED71e6e', + creationBlockNumber: 7069045, + }, xdai: { address: '0x27c60BE17e853c47A9F1d280B05365f483c2dFAF', creationBlockNumber: 18326895, From dc731e35ccf630bc8128d7ffd4c5264adc2be18d Mon Sep 17 00:00:00 2001 From: Romain <45540622+rom1trt@users.noreply.github.com> Date: Thu, 28 Jul 2022 10:42:51 +0200 Subject: [PATCH 58/85] feat: goerli storage (#890) feat: squash commits goerli storage --- packages/ethereum-storage/src/ethereum-utils.ts | 1 + packages/ethereum-storage/test/ethereum-utils.test.ts | 6 ++++++ packages/types/src/storage-types.ts | 1 + 3 files changed, 8 insertions(+) diff --git a/packages/ethereum-storage/src/ethereum-utils.ts b/packages/ethereum-storage/src/ethereum-utils.ts index 9b879685d2..75351078fa 100644 --- a/packages/ethereum-storage/src/ethereum-utils.ts +++ b/packages/ethereum-storage/src/ethereum-utils.ts @@ -8,6 +8,7 @@ const networks = { [StorageTypes.EthereumNetwork.MAINNET]: 'mainnet', [StorageTypes.EthereumNetwork.KOVAN]: 'kovan', [StorageTypes.EthereumNetwork.RINKEBY]: 'rinkeby', + [StorageTypes.EthereumNetwork.GOERLI]: 'goerli', [StorageTypes.EthereumNetwork.SOKOL]: 'sokol', [StorageTypes.EthereumNetwork.XDAI]: 'xdai', }; diff --git a/packages/ethereum-storage/test/ethereum-utils.test.ts b/packages/ethereum-storage/test/ethereum-utils.test.ts index 17fc6d353c..a423b9ddad 100644 --- a/packages/ethereum-storage/test/ethereum-utils.test.ts +++ b/packages/ethereum-storage/test/ethereum-utils.test.ts @@ -21,6 +21,9 @@ describe('Ethereum Utils', () => { expect(EthereumUtils.getEthereumNetworkNameFromId(StorageTypes.EthereumNetwork.RINKEBY)).toBe( 'rinkeby', ); + expect(EthereumUtils.getEthereumNetworkNameFromId(StorageTypes.EthereumNetwork.GOERLI)).toBe( + 'goerli', + ); expect(EthereumUtils.getEthereumNetworkNameFromId(StorageTypes.EthereumNetwork.SOKOL)).toBe( 'sokol', ); @@ -48,6 +51,9 @@ describe('Ethereum Utils', () => { expect(EthereumUtils.getEthereumIdFromNetworkName('rinkeby')).toBe( StorageTypes.EthereumNetwork.RINKEBY, ); + expect(EthereumUtils.getEthereumIdFromNetworkName('goerli')).toBe( + StorageTypes.EthereumNetwork.GOERLI, + ); expect(EthereumUtils.getEthereumIdFromNetworkName('sokol')).toBe( StorageTypes.EthereumNetwork.SOKOL, ); diff --git a/packages/types/src/storage-types.ts b/packages/types/src/storage-types.ts index c6e51c33b4..4ab5c6702d 100644 --- a/packages/types/src/storage-types.ts +++ b/packages/types/src/storage-types.ts @@ -136,6 +136,7 @@ export enum EthereumNetwork { PRIVATE = 0, MAINNET = 1, RINKEBY = 4, + GOERLI = 5, KOVAN = 42, SOKOL = 77, XDAI = 100, From 61f72a5a358ee5b8be658388993bac4bee28ddc5 Mon Sep 17 00:00:00 2001 From: Romain TREFAULT Date: Thu, 28 Jul 2022 13:19:32 +0200 Subject: [PATCH 59/85] fix: modify smart contract address --- .../src/lib/artifacts/ERC20EscrowToPay/index.ts | 4 ---- 1 file changed, 4 deletions(-) diff --git a/packages/smart-contracts/src/lib/artifacts/ERC20EscrowToPay/index.ts b/packages/smart-contracts/src/lib/artifacts/ERC20EscrowToPay/index.ts index a0bca9cff3..12d294bef8 100644 --- a/packages/smart-contracts/src/lib/artifacts/ERC20EscrowToPay/index.ts +++ b/packages/smart-contracts/src/lib/artifacts/ERC20EscrowToPay/index.ts @@ -25,10 +25,6 @@ export const erc20EscrowToPayArtifact = new ContractArtifact( address: '0xd2777001fD7D89331D8E87eC439f78079179322b', creationBlockNumber: 7230322, }, - goerli: { - address: '0xEbe28A2B7336670Ba752bfEad4a121D2c4FF2464', - creationBlockNumber: 10461945, - }, matic: { address: '0x937Db37ffb67083242fbC6AdD472146bF10E01ec', creationBlockNumber: 30751595, From b5eb9fb4ab8a6e1b609c209f4ef174ff233af1f6 Mon Sep 17 00:00:00 2001 From: Romain TREFAULT Date: Thu, 28 Jul 2022 13:59:49 +0200 Subject: [PATCH 60/85] fix: ETHConversionProxy to EthConversionProxy --- .../scripts-create2/compute-one-address.ts | 2 +- packages/smart-contracts/scripts-create2/deploy.ts | 2 +- packages/smart-contracts/scripts-create2/utils.ts | 2 +- packages/smart-contracts/scripts-create2/verify.ts | 2 +- .../smart-contracts/scripts/conversion-proxy.ts | 2 +- .../smart-contracts/scripts/deploy-payments.ts | 14 +++++++------- .../scripts/test-deploy_chainlink_contract.ts | 4 ++-- 7 files changed, 14 insertions(+), 14 deletions(-) diff --git a/packages/smart-contracts/scripts-create2/compute-one-address.ts b/packages/smart-contracts/scripts-create2/compute-one-address.ts index 7e8c4809a7..f2803616ed 100644 --- a/packages/smart-contracts/scripts-create2/compute-one-address.ts +++ b/packages/smart-contracts/scripts-create2/compute-one-address.ts @@ -52,7 +52,7 @@ export const computeCreate2DeploymentAddressesFromList = async ( switch (contract) { case 'EthereumProxy': case 'EthereumFeeProxy': - case 'ETHConversionProxy': + case 'EthConversionProxy': case 'ERC20FeeProxy': case 'Erc20ConversionProxy': case 'ERC20EscrowToPay': diff --git a/packages/smart-contracts/scripts-create2/deploy.ts b/packages/smart-contracts/scripts-create2/deploy.ts index ec15644fac..23dbfc931b 100644 --- a/packages/smart-contracts/scripts-create2/deploy.ts +++ b/packages/smart-contracts/scripts-create2/deploy.ts @@ -53,7 +53,7 @@ export const deployWithCreate2FromList = async ( switch (contract) { case 'EthereumProxy': case 'EthereumFeeProxy': - case 'ETHConversionProxy': + case 'EthConversionProxy': case 'ERC20FeeProxy': case 'Erc20ConversionProxy': { const constructorArgs = getConstructorArgs(contract); diff --git a/packages/smart-contracts/scripts-create2/utils.ts b/packages/smart-contracts/scripts-create2/utils.ts index 421bba148c..ad58a5f04c 100644 --- a/packages/smart-contracts/scripts-create2/utils.ts +++ b/packages/smart-contracts/scripts-create2/utils.ts @@ -9,7 +9,7 @@ import * as artifacts from '../src/lib'; export const create2ContractDeploymentList = [ 'EthereumProxy', 'EthereumFeeProxy', - 'ETHConversionProxy', + 'EthConversionProxy', 'ERC20FeeProxy', 'Erc20ConversionProxy', 'ERC20SwapToConversion', diff --git a/packages/smart-contracts/scripts-create2/verify.ts b/packages/smart-contracts/scripts-create2/verify.ts index cc8648e862..0d629f52ab 100644 --- a/packages/smart-contracts/scripts-create2/verify.ts +++ b/packages/smart-contracts/scripts-create2/verify.ts @@ -27,7 +27,7 @@ export async function VerifyCreate2FromList(hre: HardhatRuntimeEnvironmentExtend switch (contract) { case 'EthereumProxy': case 'EthereumFeeProxy': - case 'ETHConversionProxy': + case 'EthConversionProxy': case 'ERC20FeeProxy': case 'ERC20SwapToConversion': case 'Erc20ConversionProxy': { diff --git a/packages/smart-contracts/scripts/conversion-proxy.ts b/packages/smart-contracts/scripts/conversion-proxy.ts index b0d96e8017..57fa687a24 100644 --- a/packages/smart-contracts/scripts/conversion-proxy.ts +++ b/packages/smart-contracts/scripts/conversion-proxy.ts @@ -45,7 +45,7 @@ export async function deployERC20ConversionProxy( }); } -export async function deployETHConversionProxy( +export async function deployEthConversionProxy( args: { chainlinkConversionPathAddress?: string; ethFeeProxyAddress?: string; diff --git a/packages/smart-contracts/scripts/deploy-payments.ts b/packages/smart-contracts/scripts/deploy-payments.ts index 14167c7c78..e9a868fdae 100644 --- a/packages/smart-contracts/scripts/deploy-payments.ts +++ b/packages/smart-contracts/scripts/deploy-payments.ts @@ -5,7 +5,7 @@ import { erc20FeeProxyArtifact, erc20SwapToPayArtifact, } from '../src/lib'; -import { deployERC20ConversionProxy, deployETHConversionProxy } from './conversion-proxy'; +import { deployERC20ConversionProxy, deployEthConversionProxy } from './conversion-proxy'; import { DeploymentResult, deployOne } from './deploy-one'; import { uniswapV2RouterAddresses, jumpToNonce } from './utils'; import { Contract } from 'ethers'; @@ -154,7 +154,7 @@ export async function deployAllPaymentContracts( /* * Batch 4 * - ChainlinkConversionPath (+ addWhitelistAdmin()) - * - ETHConversionProxy + * - EthConversionProxy */ const runDeploymentBatch_4 = async (ethFeeProxyAddress: string) => { const NONCE_BATCH_4 = 10; @@ -170,7 +170,7 @@ export async function deployAllPaymentContracts( }); // Deploy ETH Conversion - const ethConversionResult = await deployETHConversionProxy( + const ethConversionResult = await deployEthConversionProxy( { ...args, chainlinkConversionPathAddress, @@ -265,12 +265,12 @@ export async function deployAllPaymentContracts( const ethConversionAdminNonce = NONCE_BATCH_5 + 3; await jumpToNonce(args, hre, ethConversionAdminNonce); - // 5.d ETHConversion.transferOwnership + // 5.d EthConversion.transferOwnership if (await nonceReady(ethConversionAdminNonce)) { if (ethConversionResultInstance) { if (!process.env.ADMIN_WALLET_ADDRESS) { throw new Error( - 'ADMIN_WALLET_ADDRESS missing, cannot addWhitelistAdmin on ETHConversion.', + 'ADMIN_WALLET_ADDRESS missing, cannot addWhitelistAdmin on EthConversion.', ); } if (args.simulate === false) { @@ -280,13 +280,13 @@ export async function deployAllPaymentContracts( await tx.wait(1); } else { console.log( - `[i] Simulating addWhitelistAdmin to ETHConversion at ${ethConversionResultInstance.address}`, + `[i] Simulating addWhitelistAdmin to EthConversion at ${ethConversionResultInstance.address}`, ); } } else { if (!ethConversionResultInstance) { console.warn( - `Warning: the ETHConversion contract instance is not ready for ETHConversion update, consider retrying.`, + `Warning: the EthConversion contract instance is not ready for EthConversion update, consider retrying.`, ); switchToSimulation(); } diff --git a/packages/smart-contracts/scripts/test-deploy_chainlink_contract.ts b/packages/smart-contracts/scripts/test-deploy_chainlink_contract.ts index 88fa62a254..099be843a4 100644 --- a/packages/smart-contracts/scripts/test-deploy_chainlink_contract.ts +++ b/packages/smart-contracts/scripts/test-deploy_chainlink_contract.ts @@ -1,7 +1,7 @@ import '@nomiclabs/hardhat-ethers'; import { CurrencyManager } from '@requestnetwork/currency'; import { HardhatRuntimeEnvironment } from 'hardhat/types'; -import { deployERC20ConversionProxy, deployETHConversionProxy } from './conversion-proxy'; +import { deployERC20ConversionProxy, deployEthConversionProxy } from './conversion-proxy'; import { deploySwapConversion } from './erc20-swap-to-conversion'; import { deployOne } from './deploy-one'; @@ -93,7 +93,7 @@ export default async function deploy( // EthConversion const ethConversionProxyAddress = ( - await deployETHConversionProxy( + await deployEthConversionProxy( { ...args, chainlinkConversionPathAddress: conversionPathInstance.address, From 1dcc857c053201f726440242976502a03ad17784 Mon Sep 17 00:00:00 2001 From: Romain TREFAULT Date: Thu, 28 Jul 2022 14:35:09 +0200 Subject: [PATCH 61/85] fix: add MIT License --- .../src/contracts/interfaces/IERC20ConversionProxy.sol | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/smart-contracts/src/contracts/interfaces/IERC20ConversionProxy.sol b/packages/smart-contracts/src/contracts/interfaces/IERC20ConversionProxy.sol index 946d170691..3a7b8b8f6a 100644 --- a/packages/smart-contracts/src/contracts/interfaces/IERC20ConversionProxy.sol +++ b/packages/smart-contracts/src/contracts/interfaces/IERC20ConversionProxy.sol @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; interface IERC20ConversionProxy { From a684a32c28a4cbc0b3ef53d463d011ee17637009 Mon Sep 17 00:00:00 2001 From: Romain <45540622+rom1trt@users.noreply.github.com> Date: Thu, 28 Jul 2022 15:41:16 +0200 Subject: [PATCH 62/85] doc : modify command to create request (#880) * refactor: command to create request * fix: escrow audit fix 2 (#878) * fix(smart-contracts): update batch fees (#873) update batch fees from 1% to .3% * feat: add cancel stream function (#884) * refactor: contract setup compression fix (#888) * fix: escrow audit fix 2 (#878) * fix(smart-contracts): update batch fees (#873) update batch fees from 1% to .3% * feat: add cancel stream function (#884) * refactor: contract setup compression fix (#888) * feat: goerli storage (#890) feat: squash commits goerli storage * fix: delete ETHConversionProxy Co-authored-by: Darko Kolev Co-authored-by: olivier7delf <55892112+olivier7delf@users.noreply.github.com> Co-authored-by: Bertrand Juglas --- packages/toolbox/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/toolbox/README.md b/packages/toolbox/README.md index f861290229..072f779b07 100644 --- a/packages/toolbox/README.md +++ b/packages/toolbox/README.md @@ -27,8 +27,8 @@ CreateRequest.createTestRequest(12); #### In the CLI ```bash -yarn run:create -yarn run:create 12 +yarn request-toolbox request create +yarn request-toolbox request create 12 ``` ### Conversion paths From ce2eeecdff6469931c9fd55a264e0c079a32243a Mon Sep 17 00:00:00 2001 From: Romain TREFAULT Date: Fri, 8 Jul 2022 16:06:20 +0200 Subject: [PATCH 63/85] deploy: goerli contracts --- .../src/lib/artifacts/ERC20EscrowToPay/index.ts | 4 ++++ .../src/lib/artifacts/Erc20SwapConversion/index.ts | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/packages/smart-contracts/src/lib/artifacts/ERC20EscrowToPay/index.ts b/packages/smart-contracts/src/lib/artifacts/ERC20EscrowToPay/index.ts index 12d294bef8..a0bca9cff3 100644 --- a/packages/smart-contracts/src/lib/artifacts/ERC20EscrowToPay/index.ts +++ b/packages/smart-contracts/src/lib/artifacts/ERC20EscrowToPay/index.ts @@ -25,6 +25,10 @@ export const erc20EscrowToPayArtifact = new ContractArtifact( address: '0xd2777001fD7D89331D8E87eC439f78079179322b', creationBlockNumber: 7230322, }, + goerli: { + address: '0xEbe28A2B7336670Ba752bfEad4a121D2c4FF2464', + creationBlockNumber: 10461945, + }, matic: { address: '0x937Db37ffb67083242fbC6AdD472146bF10E01ec', creationBlockNumber: 30751595, diff --git a/packages/smart-contracts/src/lib/artifacts/Erc20SwapConversion/index.ts b/packages/smart-contracts/src/lib/artifacts/Erc20SwapConversion/index.ts index 8eae29f28c..1852293575 100644 --- a/packages/smart-contracts/src/lib/artifacts/Erc20SwapConversion/index.ts +++ b/packages/smart-contracts/src/lib/artifacts/Erc20SwapConversion/index.ts @@ -18,6 +18,10 @@ export const erc20SwapConversionArtifact = new ContractArtifact Date: Mon, 11 Jul 2022 10:38:00 +0200 Subject: [PATCH 64/85] refactor: add goerli address contract --- .../src/lib/artifacts/ERC20EscrowToPay/index.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/smart-contracts/src/lib/artifacts/ERC20EscrowToPay/index.ts b/packages/smart-contracts/src/lib/artifacts/ERC20EscrowToPay/index.ts index a0bca9cff3..0157f8d2a9 100644 --- a/packages/smart-contracts/src/lib/artifacts/ERC20EscrowToPay/index.ts +++ b/packages/smart-contracts/src/lib/artifacts/ERC20EscrowToPay/index.ts @@ -26,8 +26,8 @@ export const erc20EscrowToPayArtifact = new ContractArtifact( creationBlockNumber: 7230322, }, goerli: { - address: '0xEbe28A2B7336670Ba752bfEad4a121D2c4FF2464', - creationBlockNumber: 10461945, + address: '0xB6f943d324a70B2883aE890089433345feCe8Be4', + creationBlockNumber: 7091488, }, matic: { address: '0x937Db37ffb67083242fbC6AdD472146bF10E01ec', From 5c2255d4831b93f0e398cddfbc108cc35b49348f Mon Sep 17 00:00:00 2001 From: Romain TREFAULT Date: Tue, 12 Jul 2022 10:27:37 +0200 Subject: [PATCH 65/85] -S refactor: add goerli tests --- .../test/erc20/escrow-info-retriever.test.ts | 3 +-- .../erc20/thegraph-info-retriever.test.ts | 21 +++++++++---------- .../test/eth/input-data.test.ts | 2 +- 3 files changed, 12 insertions(+), 14 deletions(-) diff --git a/packages/payment-detection/test/erc20/escrow-info-retriever.test.ts b/packages/payment-detection/test/erc20/escrow-info-retriever.test.ts index 03431e5089..81a6a65a02 100644 --- a/packages/payment-detection/test/erc20/escrow-info-retriever.test.ts +++ b/packages/payment-detection/test/erc20/escrow-info-retriever.test.ts @@ -176,8 +176,7 @@ describe('api/erc20/escrow-info-retriever', () => { }); it('should get escrow chain data', async () => { const escrowChainData = await infoRetriever.getEscrowRequestMapping(); - // Not yet ERC777 token on goerli - // expect(escrowChainData.tokenAddress).toEqual('0x745861AeD1EEe363b4AaA5F1994Be40b1e05Ff90'); + expect(escrowChainData.tokenAddress).toEqual('0x745861AeD1EEe363b4AaA5F1994Be40b1e05Ff90'); expect(escrowChainData.payee).toEqual('0xB9B7e0cb2EDF5Ea031C8B297A5A1Fa20379b6A0a'); expect(escrowChainData.payer).toEqual('0x0c051a1f4E209b00c8E7C00AD0ce79B3630a7401'); expect(escrowChainData.amount.toString()).toEqual('123000000000000000000'); diff --git a/packages/payment-detection/test/erc20/thegraph-info-retriever.test.ts b/packages/payment-detection/test/erc20/thegraph-info-retriever.test.ts index a9af030300..21ecb7cb05 100644 --- a/packages/payment-detection/test/erc20/thegraph-info-retriever.test.ts +++ b/packages/payment-detection/test/erc20/thegraph-info-retriever.test.ts @@ -91,20 +91,20 @@ describe('api/erc20/thegraph-info-retriever', () => { }); describe('on goerli', () => { - const GOERLI_ETH_FEE_PROXY_CONTRACT = '0xe11BF2fDA23bF0A98365e1A4c04A87C9339e8687'; - const GOERLI_ETH_CONVERSION_PROXY_CONTRACT = '0xED250D9219EB93098Bb67aEbc992963172B9c8DA'; + const GOERLI_ETH_FEE_PROXY_CONTRACT = '0xc6e23a20c0a1933acc8e30247b5d1e2215796c1f'; + const GOERLI_ETH_CONVERSION_PROXY_CONTRACT = '0xca3353a15fcb5c83a1ff64bff055781ac5c4d2f4'; it('should get payment event from ethFeeProxy via subgraph', async () => { const paymentData = { reference: '0x6c93723bc5f82e6fbb2ea994bf0fb572fa19f7a2a3146065e21752b95668efe5', - txHash: '0x29a55b7f978a902275746f6eb930abf608dc77c0592fce9cf6c326128fcf7493', - from: '0xBc9643B7Bd7c8621F4a68280433796484b9E525d', + txHash: '0x3e2d6cc2534b1d340ba2954f34e6cc819d6da64ff76863ea89c6d34b15d13c97', + from: '0x186e7fe6c34ea0eca7f9c2fd29651fc0443e3f29', to: '0x5000ee9fb9c96a2a09d8efb695ac21d6c429ff11', network: 'goerli', salt: '0ee84db293a752c6', - amount: '600000000000000', + amount: '30000000000000', requestId: '0188791633ff0ec72a7dbdefb886d2db6cccfa98287320839c2f173c7a4e3ce7e1', - block: 7230236, + block: 9606098, feeAddress: '0x5000EE9FB9c96A2A09D8efB695aC21D6C429fF11', feeAmount: '0', }; @@ -126,8 +126,8 @@ describe('api/erc20/thegraph-info-retriever', () => { ); const allNetworkEvents = await graphRetriever.getTransferEvents(); const transferEvents = allNetworkEvents.paymentEvents; - // expect(transferEvents).toHaveLength(1); - expect(transferEvents[0].amount).toEqual('600000000000000'); + expect(transferEvents).toHaveLength(1); + expect(transferEvents[0].amount).toEqual('30000000000000'); expect(transferEvents[0].name).toEqual('payment'); expect(transferEvents[0].parameters?.to).toEqual(paymentData.to); expect(transferEvents[0].parameters?.txHash).toEqual(paymentData.txHash); @@ -136,8 +136,7 @@ describe('api/erc20/thegraph-info-retriever', () => { expect(transferEvents[0].parameters?.feeAmount).toEqual(paymentData.feeAmount); }); - // doesn't work because chainlink doesn't have oracles on goerli - it.skip('should get payment event from ethFeeConversionProxy via subgraph', async () => { + it('should get payment event from ethFeeConversionProxy via subgraph', async () => { const paymentData = { reference: '0x6c93723bc5f82e6fbb2ea994bf0fb572fa19f7a2a3146065e21752b95668efe5', txHash: '0x2f7b4752aa259166c038cd9073056c5979760cf0eea55d093fca2095c229313b', @@ -168,7 +167,7 @@ describe('api/erc20/thegraph-info-retriever', () => { ); const allNetworkEvents = await graphRetriever.getTransferEvents(); const transferEvents = allNetworkEvents.paymentEvents; - // expect(transferEvents).toHaveLength(1); + expect(transferEvents).toHaveLength(1); expect(transferEvents[0].amount).toEqual(paymentData.amount); expect(transferEvents[0].parameters?.to).toEqual(paymentData.to); expect(transferEvents[0].parameters?.txHash).toEqual(paymentData.txHash); diff --git a/packages/payment-detection/test/eth/input-data.test.ts b/packages/payment-detection/test/eth/input-data.test.ts index b7d7489698..f9823a09bc 100644 --- a/packages/payment-detection/test/eth/input-data.test.ts +++ b/packages/payment-detection/test/eth/input-data.test.ts @@ -251,7 +251,7 @@ describe('api/eth/input-data', () => { currency: { network: 'goerli', type: RequestLogicTypes.CURRENCY.ETH, - value: 'ETH-goerli', + value: 'ETH', }, expectedAmount: '80000000000000000', payee: { From 6b77926382ff71346fa4d9f6a466f7797a2deab4 Mon Sep 17 00:00:00 2001 From: Romain TREFAULT Date: Mon, 11 Jul 2022 16:50:59 +0200 Subject: [PATCH 66/85] -S feat: add goerli payment-detection tests --- .../test/erc777/superfluid-retriever.test.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/payment-detection/test/erc777/superfluid-retriever.test.ts b/packages/payment-detection/test/erc777/superfluid-retriever.test.ts index 6d9e74f63e..474fe5f709 100644 --- a/packages/payment-detection/test/erc777/superfluid-retriever.test.ts +++ b/packages/payment-detection/test/erc777/superfluid-retriever.test.ts @@ -20,7 +20,7 @@ describe('api/erc777/superfluid-info-retriever', () => { salt: '0ee84db293a752c6', amount: '92592592592592000', requestId: '0188791633ff0ec72a7dbdefb886d2db6cccfa98287320839c2f173c7a4e3ce7e1', - block: 9945543, + block: '9945543', token: '0x745861aed1eee363b4aaa5f1994be40b1e05ff90', //fDAIx }; graphql.request.mockResolvedValue(mockSuperfluidSubgraph[0]); @@ -61,7 +61,7 @@ describe('api/erc777/superfluid-info-retriever', () => { salt: '0ee84db293a752c6', amount: '92592592592592000', requestId: '0188791633ff0ec72a7dbdefb886d2db6cccfa98287320839c2f173c7a4e3ce7e1', - block: 9945543, + block: '9945543', token: '0x2bf02814ea0b2b155ed47b7cede18caa752940e6', //fDAIx }; graphql.request.mockResolvedValue(mockSuperfluidSubgraph[0]); From 7bd57e563d9900a006244d33621f1156b3aa291e Mon Sep 17 00:00:00 2001 From: Romain TREFAULT Date: Tue, 12 Jul 2022 16:23:45 +0200 Subject: [PATCH 67/85] refactor: goerli tests --- .../test/erc20/escrow-info-retriever.test.ts | 3 ++- .../test/erc20/thegraph-info-retriever.test.ts | 6 +++--- .../test/erc777/superfluid-retriever.test.ts | 4 ++-- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/packages/payment-detection/test/erc20/escrow-info-retriever.test.ts b/packages/payment-detection/test/erc20/escrow-info-retriever.test.ts index 81a6a65a02..03431e5089 100644 --- a/packages/payment-detection/test/erc20/escrow-info-retriever.test.ts +++ b/packages/payment-detection/test/erc20/escrow-info-retriever.test.ts @@ -176,7 +176,8 @@ describe('api/erc20/escrow-info-retriever', () => { }); it('should get escrow chain data', async () => { const escrowChainData = await infoRetriever.getEscrowRequestMapping(); - expect(escrowChainData.tokenAddress).toEqual('0x745861AeD1EEe363b4AaA5F1994Be40b1e05Ff90'); + // Not yet ERC777 token on goerli + // expect(escrowChainData.tokenAddress).toEqual('0x745861AeD1EEe363b4AaA5F1994Be40b1e05Ff90'); expect(escrowChainData.payee).toEqual('0xB9B7e0cb2EDF5Ea031C8B297A5A1Fa20379b6A0a'); expect(escrowChainData.payer).toEqual('0x0c051a1f4E209b00c8E7C00AD0ce79B3630a7401'); expect(escrowChainData.amount.toString()).toEqual('123000000000000000000'); diff --git a/packages/payment-detection/test/erc20/thegraph-info-retriever.test.ts b/packages/payment-detection/test/erc20/thegraph-info-retriever.test.ts index 21ecb7cb05..12674a2fd3 100644 --- a/packages/payment-detection/test/erc20/thegraph-info-retriever.test.ts +++ b/packages/payment-detection/test/erc20/thegraph-info-retriever.test.ts @@ -94,7 +94,7 @@ describe('api/erc20/thegraph-info-retriever', () => { const GOERLI_ETH_FEE_PROXY_CONTRACT = '0xc6e23a20c0a1933acc8e30247b5d1e2215796c1f'; const GOERLI_ETH_CONVERSION_PROXY_CONTRACT = '0xca3353a15fcb5c83a1ff64bff055781ac5c4d2f4'; - it('should get payment event from ethFeeProxy via subgraph', async () => { + it('should get payment event from ethFeeProxy via subgraph (Goerli)', async () => { const paymentData = { reference: '0x6c93723bc5f82e6fbb2ea994bf0fb572fa19f7a2a3146065e21752b95668efe5', txHash: '0x3e2d6cc2534b1d340ba2954f34e6cc819d6da64ff76863ea89c6d34b15d13c97', @@ -126,7 +126,7 @@ describe('api/erc20/thegraph-info-retriever', () => { ); const allNetworkEvents = await graphRetriever.getTransferEvents(); const transferEvents = allNetworkEvents.paymentEvents; - expect(transferEvents).toHaveLength(1); + // expect(transferEvents).toHaveLength(1); expect(transferEvents[0].amount).toEqual('30000000000000'); expect(transferEvents[0].name).toEqual('payment'); expect(transferEvents[0].parameters?.to).toEqual(paymentData.to); @@ -167,7 +167,7 @@ describe('api/erc20/thegraph-info-retriever', () => { ); const allNetworkEvents = await graphRetriever.getTransferEvents(); const transferEvents = allNetworkEvents.paymentEvents; - expect(transferEvents).toHaveLength(1); + // expect(transferEvents).toHaveLength(1); expect(transferEvents[0].amount).toEqual(paymentData.amount); expect(transferEvents[0].parameters?.to).toEqual(paymentData.to); expect(transferEvents[0].parameters?.txHash).toEqual(paymentData.txHash); diff --git a/packages/payment-detection/test/erc777/superfluid-retriever.test.ts b/packages/payment-detection/test/erc777/superfluid-retriever.test.ts index 474fe5f709..6d9e74f63e 100644 --- a/packages/payment-detection/test/erc777/superfluid-retriever.test.ts +++ b/packages/payment-detection/test/erc777/superfluid-retriever.test.ts @@ -20,7 +20,7 @@ describe('api/erc777/superfluid-info-retriever', () => { salt: '0ee84db293a752c6', amount: '92592592592592000', requestId: '0188791633ff0ec72a7dbdefb886d2db6cccfa98287320839c2f173c7a4e3ce7e1', - block: '9945543', + block: 9945543, token: '0x745861aed1eee363b4aaa5f1994be40b1e05ff90', //fDAIx }; graphql.request.mockResolvedValue(mockSuperfluidSubgraph[0]); @@ -61,7 +61,7 @@ describe('api/erc777/superfluid-info-retriever', () => { salt: '0ee84db293a752c6', amount: '92592592592592000', requestId: '0188791633ff0ec72a7dbdefb886d2db6cccfa98287320839c2f173c7a4e3ce7e1', - block: '9945543', + block: 9945543, token: '0x2bf02814ea0b2b155ed47b7cede18caa752940e6', //fDAIx }; graphql.request.mockResolvedValue(mockSuperfluidSubgraph[0]); From e3e067b2cde7174739007b9d188c3ec14e97d23b Mon Sep 17 00:00:00 2001 From: Romain TREFAULT Date: Tue, 12 Jul 2022 16:40:57 +0200 Subject: [PATCH 68/85] refactor: goerli contract address in tests --- .../test/erc20/thegraph-info-retriever.test.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/payment-detection/test/erc20/thegraph-info-retriever.test.ts b/packages/payment-detection/test/erc20/thegraph-info-retriever.test.ts index 12674a2fd3..c641ed0feb 100644 --- a/packages/payment-detection/test/erc20/thegraph-info-retriever.test.ts +++ b/packages/payment-detection/test/erc20/thegraph-info-retriever.test.ts @@ -91,10 +91,10 @@ describe('api/erc20/thegraph-info-retriever', () => { }); describe('on goerli', () => { - const GOERLI_ETH_FEE_PROXY_CONTRACT = '0xc6e23a20c0a1933acc8e30247b5d1e2215796c1f'; - const GOERLI_ETH_CONVERSION_PROXY_CONTRACT = '0xca3353a15fcb5c83a1ff64bff055781ac5c4d2f4'; + const GOERLI_ETH_FEE_PROXY_CONTRACT = '0xe11BF2fDA23bF0A98365e1A4c04A87C9339e8687'; + const GOERLI_ETH_CONVERSION_PROXY_CONTRACT = '0xED250D9219EB93098Bb67aEbc992963172B9c8DA'; - it('should get payment event from ethFeeProxy via subgraph (Goerli)', async () => { + it('should get payment event from ethFeeProxy via subgraph', async () => { const paymentData = { reference: '0x6c93723bc5f82e6fbb2ea994bf0fb572fa19f7a2a3146065e21752b95668efe5', txHash: '0x3e2d6cc2534b1d340ba2954f34e6cc819d6da64ff76863ea89c6d34b15d13c97', From 9ef2a45dcd7b7ea18d930e9f124002bf4c5309f2 Mon Sep 17 00:00:00 2001 From: Romain TREFAULT Date: Tue, 12 Jul 2022 16:43:24 +0200 Subject: [PATCH 69/85] refactor: goerli tests --- packages/payment-detection/test/eth/input-data.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/payment-detection/test/eth/input-data.test.ts b/packages/payment-detection/test/eth/input-data.test.ts index f9823a09bc..b7d7489698 100644 --- a/packages/payment-detection/test/eth/input-data.test.ts +++ b/packages/payment-detection/test/eth/input-data.test.ts @@ -251,7 +251,7 @@ describe('api/eth/input-data', () => { currency: { network: 'goerli', type: RequestLogicTypes.CURRENCY.ETH, - value: 'ETH', + value: 'ETH-goerli', }, expectedAmount: '80000000000000000', payee: { From 5323513baeaa7c890fdfa949f159b46105370f5f Mon Sep 17 00:00:00 2001 From: Darko Kolev Date: Fri, 15 Jul 2022 11:33:39 +0200 Subject: [PATCH 70/85] fixed ethFeeProxy subgraph goerli test --- .../test/erc20/thegraph-info-retriever.test.ts | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/packages/payment-detection/test/erc20/thegraph-info-retriever.test.ts b/packages/payment-detection/test/erc20/thegraph-info-retriever.test.ts index c641ed0feb..a9af030300 100644 --- a/packages/payment-detection/test/erc20/thegraph-info-retriever.test.ts +++ b/packages/payment-detection/test/erc20/thegraph-info-retriever.test.ts @@ -97,14 +97,14 @@ describe('api/erc20/thegraph-info-retriever', () => { it('should get payment event from ethFeeProxy via subgraph', async () => { const paymentData = { reference: '0x6c93723bc5f82e6fbb2ea994bf0fb572fa19f7a2a3146065e21752b95668efe5', - txHash: '0x3e2d6cc2534b1d340ba2954f34e6cc819d6da64ff76863ea89c6d34b15d13c97', - from: '0x186e7fe6c34ea0eca7f9c2fd29651fc0443e3f29', + txHash: '0x29a55b7f978a902275746f6eb930abf608dc77c0592fce9cf6c326128fcf7493', + from: '0xBc9643B7Bd7c8621F4a68280433796484b9E525d', to: '0x5000ee9fb9c96a2a09d8efb695ac21d6c429ff11', network: 'goerli', salt: '0ee84db293a752c6', - amount: '30000000000000', + amount: '600000000000000', requestId: '0188791633ff0ec72a7dbdefb886d2db6cccfa98287320839c2f173c7a4e3ce7e1', - block: 9606098, + block: 7230236, feeAddress: '0x5000EE9FB9c96A2A09D8efB695aC21D6C429fF11', feeAmount: '0', }; @@ -127,7 +127,7 @@ describe('api/erc20/thegraph-info-retriever', () => { const allNetworkEvents = await graphRetriever.getTransferEvents(); const transferEvents = allNetworkEvents.paymentEvents; // expect(transferEvents).toHaveLength(1); - expect(transferEvents[0].amount).toEqual('30000000000000'); + expect(transferEvents[0].amount).toEqual('600000000000000'); expect(transferEvents[0].name).toEqual('payment'); expect(transferEvents[0].parameters?.to).toEqual(paymentData.to); expect(transferEvents[0].parameters?.txHash).toEqual(paymentData.txHash); @@ -136,7 +136,8 @@ describe('api/erc20/thegraph-info-retriever', () => { expect(transferEvents[0].parameters?.feeAmount).toEqual(paymentData.feeAmount); }); - it('should get payment event from ethFeeConversionProxy via subgraph', async () => { + // doesn't work because chainlink doesn't have oracles on goerli + it.skip('should get payment event from ethFeeConversionProxy via subgraph', async () => { const paymentData = { reference: '0x6c93723bc5f82e6fbb2ea994bf0fb572fa19f7a2a3146065e21752b95668efe5', txHash: '0x2f7b4752aa259166c038cd9073056c5979760cf0eea55d093fca2095c229313b', From 07a34bb322e70437ba104562fe0e8c337e9e3665 Mon Sep 17 00:00:00 2001 From: Romain TREFAULT Date: Fri, 15 Jul 2022 14:00:10 +0200 Subject: [PATCH 71/85] refactor: move goerli to the newest versions --- .../src/lib/artifacts/ChainlinkConversionPath/index.ts | 4 ---- .../src/lib/artifacts/ERC20EscrowToPay/index.ts | 4 ++-- .../smart-contracts/src/lib/artifacts/ERC20SwapToPay/index.ts | 4 ---- .../src/lib/artifacts/EthConversionProxy/index.ts | 4 ---- .../src/lib/artifacts/EthereumFeeProxy/index.ts | 4 ---- .../smart-contracts/src/lib/artifacts/EthereumProxy/index.ts | 4 ---- 6 files changed, 2 insertions(+), 22 deletions(-) diff --git a/packages/smart-contracts/src/lib/artifacts/ChainlinkConversionPath/index.ts b/packages/smart-contracts/src/lib/artifacts/ChainlinkConversionPath/index.ts index 817dd671ee..caaf56a337 100644 --- a/packages/smart-contracts/src/lib/artifacts/ChainlinkConversionPath/index.ts +++ b/packages/smart-contracts/src/lib/artifacts/ChainlinkConversionPath/index.ts @@ -22,10 +22,6 @@ export const chainlinkConversionPath = new ContractArtifact( creationBlockNumber: 7230322, }, goerli: { - address: '0xB6f943d324a70B2883aE890089433345feCe8Be4', - creationBlockNumber: 7091488, + address: '0xd2777001fD7D89331D8E87eC439f78079179322b', + creationBlockNumber: 7230322, }, matic: { address: '0x937Db37ffb67083242fbC6AdD472146bF10E01ec', diff --git a/packages/smart-contracts/src/lib/artifacts/ERC20SwapToPay/index.ts b/packages/smart-contracts/src/lib/artifacts/ERC20SwapToPay/index.ts index 51c346834f..9e5f975c06 100644 --- a/packages/smart-contracts/src/lib/artifacts/ERC20SwapToPay/index.ts +++ b/packages/smart-contracts/src/lib/artifacts/ERC20SwapToPay/index.ts @@ -21,10 +21,6 @@ export const erc20SwapToPayArtifact = new ContractArtifact( address: '0xb674e3d228e631594D8fd4BF947E1811288bf836', creationBlockNumber: 7363204, }, - goerli: { - address: '0x0Ef49176A87Adcc88bD5125126C6a6c23a28303C', - creationBlockNumber: 7109102, - }, }, }, '0.3.0': { diff --git a/packages/smart-contracts/src/lib/artifacts/EthConversionProxy/index.ts b/packages/smart-contracts/src/lib/artifacts/EthConversionProxy/index.ts index c9720fa6d9..16c2dc5e21 100644 --- a/packages/smart-contracts/src/lib/artifacts/EthConversionProxy/index.ts +++ b/packages/smart-contracts/src/lib/artifacts/EthConversionProxy/index.ts @@ -18,10 +18,6 @@ export const ethConversionArtifact = new ContractArtifact( address: '0xCa3353a15fCb5C83a1Ff64BFf055781aC5c4d2F4', creationBlockNumber: 9447194, }, - goerli: { - address: '0xED250D9219EB93098Bb67aEbc992963172B9c8DA', - creationBlockNumber: 7108896, - }, fantom: { address: '0xCa3353a15fCb5C83a1Ff64BFf055781aC5c4d2F4', creationBlockNumber: 20066436, diff --git a/packages/smart-contracts/src/lib/artifacts/EthereumFeeProxy/index.ts b/packages/smart-contracts/src/lib/artifacts/EthereumFeeProxy/index.ts index 48bfbf6b22..8b0d26e0b0 100644 --- a/packages/smart-contracts/src/lib/artifacts/EthereumFeeProxy/index.ts +++ b/packages/smart-contracts/src/lib/artifacts/EthereumFeeProxy/index.ts @@ -17,10 +17,6 @@ export const ethereumFeeProxyArtifact = new ContractArtifact( address: '0xC6E23a20C0a1933ACC8E30247B5D1e2215796C1F', creationBlockNumber: 9447193, }, - goerli: { - address: '0xe11BF2fDA23bF0A98365e1A4c04A87C9339e8687', - creationBlockNumber: 7091386, - }, fantom: { address: '0xC6E23a20C0a1933ACC8E30247B5D1e2215796C1F', creationBlockNumber: 20066431, diff --git a/packages/smart-contracts/src/lib/artifacts/EthereumProxy/index.ts b/packages/smart-contracts/src/lib/artifacts/EthereumProxy/index.ts index 2602944bd0..b318578e54 100644 --- a/packages/smart-contracts/src/lib/artifacts/EthereumProxy/index.ts +++ b/packages/smart-contracts/src/lib/artifacts/EthereumProxy/index.ts @@ -21,10 +21,6 @@ export const ethereumProxyArtifact = new ContractArtifact( address: '0x9c6c7817e3679c4b3f9ef9486001eae5aaed25ff', creationBlockNumber: 5955681, }, - goerli: { - address: '0x171Ee0881407d4c0C11eA1a2FB7D5b4cdED71e6e', - creationBlockNumber: 7069045, - }, xdai: { address: '0x27c60BE17e853c47A9F1d280B05365f483c2dFAF', creationBlockNumber: 18326895, From 17605d44024886ff605bb1a7e3f0c28bdf3f8e10 Mon Sep 17 00:00:00 2001 From: Romain TREFAULT Date: Fri, 15 Jul 2022 14:00:30 +0200 Subject: [PATCH 72/85] refactor: move goerli to the newest versions --- .../smart-contracts/src/lib/artifacts/ERC20FeeProxy/index.ts | 4 ---- 1 file changed, 4 deletions(-) diff --git a/packages/smart-contracts/src/lib/artifacts/ERC20FeeProxy/index.ts b/packages/smart-contracts/src/lib/artifacts/ERC20FeeProxy/index.ts index dbe9943407..a921c2f194 100644 --- a/packages/smart-contracts/src/lib/artifacts/ERC20FeeProxy/index.ts +++ b/packages/smart-contracts/src/lib/artifacts/ERC20FeeProxy/index.ts @@ -21,10 +21,6 @@ export const erc20FeeProxyArtifact = new ContractArtifact( address: '0xda46309973bFfDdD5a10cE12c44d2EE266f45A44', creationBlockNumber: 7118080, }, - goerli: { - address: '0x399F5EE127ce7432E4921a61b8CF52b0af52cbfE', - creationBlockNumber: 7091472, - }, matic: { address: '0x2171a0dc12a9E5b1659feF2BB20E54c84Fa7dB0C', creationBlockNumber: 14163521, From eb21df83c571fd4766f6284876235c111190884f Mon Sep 17 00:00:00 2001 From: Darko Kolev Date: Mon, 18 Jul 2022 13:44:28 +0200 Subject: [PATCH 73/85] new escrow deployed on mainnet, rinkeby, goerli, matic and fuse --- .../src/lib/artifacts/ERC20EscrowToPay/index.ts | 4 ---- 1 file changed, 4 deletions(-) diff --git a/packages/smart-contracts/src/lib/artifacts/ERC20EscrowToPay/index.ts b/packages/smart-contracts/src/lib/artifacts/ERC20EscrowToPay/index.ts index bd314b959f..12d294bef8 100644 --- a/packages/smart-contracts/src/lib/artifacts/ERC20EscrowToPay/index.ts +++ b/packages/smart-contracts/src/lib/artifacts/ERC20EscrowToPay/index.ts @@ -25,10 +25,6 @@ export const erc20EscrowToPayArtifact = new ContractArtifact( address: '0xd2777001fD7D89331D8E87eC439f78079179322b', creationBlockNumber: 7230322, }, - goerli: { - address: '0xd2777001fD7D89331D8E87eC439f78079179322b', - creationBlockNumber: 7230322, - }, matic: { address: '0x937Db37ffb67083242fbC6AdD472146bF10E01ec', creationBlockNumber: 30751595, From c70c173249769a7077d43361eb65ceb8f3f086e5 Mon Sep 17 00:00:00 2001 From: Darko Kolev Date: Thu, 28 Jul 2022 10:05:11 +0200 Subject: [PATCH 74/85] refactor: contract setup compression fix (#888) --- .../deploy.ts~007d33cc... refactor: setups.ts | 87 +++++++++++++++++++ .../verify.ts~007d33cc... refactor: setups.ts | 64 ++++++++++++++ .../ChainlinkConversionPath/index.ts | 4 + .../src/lib/artifacts/ERC20FeeProxy/index.ts | 4 + .../src/lib/artifacts/ERC20SwapToPay/index.ts | 4 + .../lib/artifacts/EthConversionProxy/index.ts | 4 + .../lib/artifacts/EthereumFeeProxy/index.ts | 4 + .../src/lib/artifacts/EthereumProxy/index.ts | 4 + 8 files changed, 175 insertions(+) create mode 100644 packages/smart-contracts/scripts-create2/deploy.ts~007d33cc... refactor: setups.ts create mode 100644 packages/smart-contracts/scripts-create2/verify.ts~007d33cc... refactor: setups.ts diff --git a/packages/smart-contracts/scripts-create2/deploy.ts~007d33cc... refactor: setups.ts b/packages/smart-contracts/scripts-create2/deploy.ts~007d33cc... refactor: setups.ts new file mode 100644 index 0000000000..ec15644fac --- /dev/null +++ b/packages/smart-contracts/scripts-create2/deploy.ts~007d33cc... refactor: setups.ts @@ -0,0 +1,87 @@ +import { create2ContractDeploymentList, isContractDeployed } from './utils'; +import { IDeploymentParams } from './types'; +import { HardhatRuntimeEnvironmentExtended } from './types'; +import { xdeploy } from './xdeployer'; +import { getConstructorArgs } from './constructor-args'; +import { setupERC20SwapToConversion } from './contract-setup'; +import { setupBatchPayments } from './contract-setup/setupBatchPayments'; + +// Deploys, set up the contracts and returns the address +export const deployOneWithCreate2 = async ( + deploymentParams: IDeploymentParams, + hre: HardhatRuntimeEnvironmentExtended, +): Promise => { + if (!hre.config.xdeploy.networks || hre.config.xdeploy.networks.length === 0) { + throw new Error('Invalid networks'); + } + // Deploy the contract on several network through xdeployer + const deploymentResult = await xdeploy(deploymentParams, hre); + for (let i = 0; i < hre.config.xdeploy.networks.length; i++) { + if (deploymentResult[i].deployed) { + console.log(`${deploymentParams.contract} successfully deployed:`); + console.log(` On network: ${hre.config.xdeploy.networks[i]}`); + console.log(` At address: ${deploymentResult[i].address}`); + console.log(` At block: ${deploymentResult[i].receipt.blockNumber}`); + } else { + if ( + isContractDeployed( + deploymentParams.contract, + hre.config.xdeploy.networks[i], + deploymentResult[i].address, + ) + ) { + console.log(`${deploymentParams.contract} already deployed:`); + console.log(` On network: ${hre.config.xdeploy.networks[i]}`); + console.log(` At address: ${deploymentResult[i].address}`); + } else { + console.log(`${deploymentParams.contract} has not been deployed:`); + console.log(` On network: ${hre.config.xdeploy.networks[i]}`); + console.log(` Error: ${deploymentResult[i].error}`); + console.log( + ` Hint: Check admin wallet balance and that your artifacts are up to date`, + ); + } + } + } + return deploymentResult[0].address; +}; + +export const deployWithCreate2FromList = async ( + hre: HardhatRuntimeEnvironmentExtended, +): Promise => { + for (const contract of create2ContractDeploymentList) { + switch (contract) { + case 'EthereumProxy': + case 'EthereumFeeProxy': + case 'ETHConversionProxy': + case 'ERC20FeeProxy': + case 'Erc20ConversionProxy': { + const constructorArgs = getConstructorArgs(contract); + await deployOneWithCreate2({ contract, constructorArgs }, hre); + break; + } + case 'ERC20SwapToConversion': { + const constructorArgs = getConstructorArgs(contract); + const address = await deployOneWithCreate2({ contract, constructorArgs }, hre); + await setupERC20SwapToConversion(address, hre); + break; + } + case 'ERC20EscrowToPay': { + const network = hre.config.xdeploy.networks[0]; + const constructorArgs = getConstructorArgs(contract, network); + await deployOneWithCreate2({ contract, constructorArgs }, hre); + break; + } + case 'BatchPayments': { + const network = hre.config.xdeploy.networks[0]; + const constructorArgs = getConstructorArgs(contract, network); + const address = await deployOneWithCreate2({ contract, constructorArgs }, hre); + await setupBatchPayments(address, hre); + break; + } + // Other cases to add when necessary + default: + throw new Error(`The contract ${contract} is not to be deployed using the CREATE2 scheme`); + } + } +}; diff --git a/packages/smart-contracts/scripts-create2/verify.ts~007d33cc... refactor: setups.ts b/packages/smart-contracts/scripts-create2/verify.ts~007d33cc... refactor: setups.ts new file mode 100644 index 0000000000..cc8648e862 --- /dev/null +++ b/packages/smart-contracts/scripts-create2/verify.ts~007d33cc... refactor: setups.ts @@ -0,0 +1,64 @@ +import { computeCreate2DeploymentAddress } from './compute-one-address'; +import { getConstructorArgs } from './constructor-args'; +import { HardhatRuntimeEnvironmentExtended } from './types'; +import { IDeploymentParams } from './types'; +import { create2ContractDeploymentList } from './utils'; + +export const verifyOne = async ( + contractAddress: string, + deploymentParams: IDeploymentParams, + hre: HardhatRuntimeEnvironmentExtended, +): Promise => { + try { + await hre.run('verify:verify', { + address: contractAddress, + constructorArguments: deploymentParams.constructorArgs, + }); + } catch (err) { + console.log(err); + } +}; + +export async function VerifyCreate2FromList(hre: HardhatRuntimeEnvironmentExtended): Promise { + try { + let address: string; + await Promise.all( + create2ContractDeploymentList.map(async (contract) => { + switch (contract) { + case 'EthereumProxy': + case 'EthereumFeeProxy': + case 'ETHConversionProxy': + case 'ERC20FeeProxy': + case 'ERC20SwapToConversion': + case 'Erc20ConversionProxy': { + const constructorArgs = getConstructorArgs(contract); + address = await computeCreate2DeploymentAddress({ contract, constructorArgs }, hre); + await verifyOne(address, { contract, constructorArgs }, hre); + break; + } + case 'ERC20EscrowToPay': { + const network = hre.config.xdeploy.networks[0]; + const constructorArgs = getConstructorArgs(contract, network); + address = await computeCreate2DeploymentAddress({ contract, constructorArgs }, hre); + await verifyOne(address, { contract, constructorArgs }, hre); + break; + } + case 'BatchPayments': { + const network = hre.config.xdeploy.networks[0]; + const constructorArgs = getConstructorArgs(contract, network); + address = await computeCreate2DeploymentAddress({ contract, constructorArgs }, hre); + await verifyOne(address, { contract, constructorArgs }, hre); + break; + } + // Other cases to add when necessary + default: + throw new Error( + `The contrat ${contract} is not to be deployed using the CREATE2 scheme`, + ); + } + }), + ); + } catch (e) { + console.error(e); + } +} diff --git a/packages/smart-contracts/src/lib/artifacts/ChainlinkConversionPath/index.ts b/packages/smart-contracts/src/lib/artifacts/ChainlinkConversionPath/index.ts index caaf56a337..817dd671ee 100644 --- a/packages/smart-contracts/src/lib/artifacts/ChainlinkConversionPath/index.ts +++ b/packages/smart-contracts/src/lib/artifacts/ChainlinkConversionPath/index.ts @@ -22,6 +22,10 @@ export const chainlinkConversionPath = new ContractArtifact( address: '0xda46309973bFfDdD5a10cE12c44d2EE266f45A44', creationBlockNumber: 7118080, }, + goerli: { + address: '0x399F5EE127ce7432E4921a61b8CF52b0af52cbfE', + creationBlockNumber: 7091472, + }, matic: { address: '0x2171a0dc12a9E5b1659feF2BB20E54c84Fa7dB0C', creationBlockNumber: 14163521, diff --git a/packages/smart-contracts/src/lib/artifacts/ERC20SwapToPay/index.ts b/packages/smart-contracts/src/lib/artifacts/ERC20SwapToPay/index.ts index 9e5f975c06..51c346834f 100644 --- a/packages/smart-contracts/src/lib/artifacts/ERC20SwapToPay/index.ts +++ b/packages/smart-contracts/src/lib/artifacts/ERC20SwapToPay/index.ts @@ -21,6 +21,10 @@ export const erc20SwapToPayArtifact = new ContractArtifact( address: '0xb674e3d228e631594D8fd4BF947E1811288bf836', creationBlockNumber: 7363204, }, + goerli: { + address: '0x0Ef49176A87Adcc88bD5125126C6a6c23a28303C', + creationBlockNumber: 7109102, + }, }, }, '0.3.0': { diff --git a/packages/smart-contracts/src/lib/artifacts/EthConversionProxy/index.ts b/packages/smart-contracts/src/lib/artifacts/EthConversionProxy/index.ts index 16c2dc5e21..c9720fa6d9 100644 --- a/packages/smart-contracts/src/lib/artifacts/EthConversionProxy/index.ts +++ b/packages/smart-contracts/src/lib/artifacts/EthConversionProxy/index.ts @@ -18,6 +18,10 @@ export const ethConversionArtifact = new ContractArtifact( address: '0xCa3353a15fCb5C83a1Ff64BFf055781aC5c4d2F4', creationBlockNumber: 9447194, }, + goerli: { + address: '0xED250D9219EB93098Bb67aEbc992963172B9c8DA', + creationBlockNumber: 7108896, + }, fantom: { address: '0xCa3353a15fCb5C83a1Ff64BFf055781aC5c4d2F4', creationBlockNumber: 20066436, diff --git a/packages/smart-contracts/src/lib/artifacts/EthereumFeeProxy/index.ts b/packages/smart-contracts/src/lib/artifacts/EthereumFeeProxy/index.ts index 8b0d26e0b0..48bfbf6b22 100644 --- a/packages/smart-contracts/src/lib/artifacts/EthereumFeeProxy/index.ts +++ b/packages/smart-contracts/src/lib/artifacts/EthereumFeeProxy/index.ts @@ -17,6 +17,10 @@ export const ethereumFeeProxyArtifact = new ContractArtifact( address: '0xC6E23a20C0a1933ACC8E30247B5D1e2215796C1F', creationBlockNumber: 9447193, }, + goerli: { + address: '0xe11BF2fDA23bF0A98365e1A4c04A87C9339e8687', + creationBlockNumber: 7091386, + }, fantom: { address: '0xC6E23a20C0a1933ACC8E30247B5D1e2215796C1F', creationBlockNumber: 20066431, diff --git a/packages/smart-contracts/src/lib/artifacts/EthereumProxy/index.ts b/packages/smart-contracts/src/lib/artifacts/EthereumProxy/index.ts index b318578e54..2602944bd0 100644 --- a/packages/smart-contracts/src/lib/artifacts/EthereumProxy/index.ts +++ b/packages/smart-contracts/src/lib/artifacts/EthereumProxy/index.ts @@ -21,6 +21,10 @@ export const ethereumProxyArtifact = new ContractArtifact( address: '0x9c6c7817e3679c4b3f9ef9486001eae5aaed25ff', creationBlockNumber: 5955681, }, + goerli: { + address: '0x171Ee0881407d4c0C11eA1a2FB7D5b4cdED71e6e', + creationBlockNumber: 7069045, + }, xdai: { address: '0x27c60BE17e853c47A9F1d280B05365f483c2dFAF', creationBlockNumber: 18326895, From 46d427d8d786aa85994056cae0d39cea4872b15e Mon Sep 17 00:00:00 2001 From: Romain <45540622+rom1trt@users.noreply.github.com> Date: Fri, 29 Jul 2022 10:47:50 +0200 Subject: [PATCH 75/85] fix: ETHConversionProxy to EthConversionProxy --- .../contract-setup/setupETHConversionProxy.ts | 47 ------------------- 1 file changed, 47 deletions(-) delete mode 100644 packages/smart-contracts/scripts-create2/contract-setup/setupETHConversionProxy.ts diff --git a/packages/smart-contracts/scripts-create2/contract-setup/setupETHConversionProxy.ts b/packages/smart-contracts/scripts-create2/contract-setup/setupETHConversionProxy.ts deleted file mode 100644 index 28d1c974d9..0000000000 --- a/packages/smart-contracts/scripts-create2/contract-setup/setupETHConversionProxy.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { batchPaymentsArtifact } from '../../src/lib'; -import { HardhatRuntimeEnvironmentExtended } from '../types'; -import utils from '@requestnetwork/utils'; -import { updateChainlinkConversionPath, updatePaymentErc20FeeProxy } from './adminTasks'; - -/** - * Updates the values of the batch fees of the BatchPayments contract, if needed - * @param contractAddress address of the BatchPayments Proxy - * @param hre Hardhat runtime environment - */ -export const setupEthConversionProxy = async ( - contractAddress: string, - hre: HardhatRuntimeEnvironmentExtended, -): Promise => { - // Setup contract parameters - const EthConversionProxyContract = new hre.ethers.Contract( - contractAddress, - batchPaymentsArtifact.getContractAbi(), - ); - await Promise.all( - hre.config.xdeploy.networks.map(async (network) => { - let provider; - if (network === 'celo') { - provider = utils.getCeloProvider(); - } else { - provider = utils.getDefaultProvider(network); - } - const wallet = new hre.ethers.Wallet(hre.config.xdeploy.signer, provider); - const signer = wallet.connect(provider); - const EthConversionProxyConnected = await EthConversionProxyContract.connect(signer); - const adminNonce = await signer.getTransactionCount(); - const gasPrice = await provider.getGasPrice(); - - // start from the adminNonce, increase gasPrice if needed - await Promise.all([ - updatePaymentErc20FeeProxy(EthConversionProxyConnected, network, adminNonce, gasPrice), - updateChainlinkConversionPath( - EthConversionProxyConnected, - network, - adminNonce + 1, - gasPrice, - ), - ]); - }), - ); - console.log('Setup for EthConversionProxy successful'); -}; From 2e6992016207a83036a7526673b3324e1dd407f0 Mon Sep 17 00:00:00 2001 From: Romain TREFAULT Date: Fri, 29 Jul 2022 10:49:06 +0200 Subject: [PATCH 76/85] ETHConversionProxy to EthConversionProxy --- .../{setupEthConversionProxy.ts => EthConversionProxy.ts} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename packages/smart-contracts/scripts-create2/contract-setup/{setupEthConversionProxy.ts => EthConversionProxy.ts} (100%) diff --git a/packages/smart-contracts/scripts-create2/contract-setup/setupEthConversionProxy.ts b/packages/smart-contracts/scripts-create2/contract-setup/EthConversionProxy.ts similarity index 100% rename from packages/smart-contracts/scripts-create2/contract-setup/setupEthConversionProxy.ts rename to packages/smart-contracts/scripts-create2/contract-setup/EthConversionProxy.ts From cf5fdea900e80494a5a599a6524e954b1c34950e Mon Sep 17 00:00:00 2001 From: Romain TREFAULT Date: Fri, 29 Jul 2022 12:25:47 +0200 Subject: [PATCH 77/85] fix: EthConversionProxy to setupEth... --- .../{EthConversionProxy.ts => setupEthConversionProxy.ts} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename packages/smart-contracts/scripts-create2/contract-setup/{EthConversionProxy.ts => setupEthConversionProxy.ts} (100%) diff --git a/packages/smart-contracts/scripts-create2/contract-setup/EthConversionProxy.ts b/packages/smart-contracts/scripts-create2/contract-setup/setupEthConversionProxy.ts similarity index 100% rename from packages/smart-contracts/scripts-create2/contract-setup/EthConversionProxy.ts rename to packages/smart-contracts/scripts-create2/contract-setup/setupEthConversionProxy.ts From d64f685f481c21f6b7220b63adb01911b5948555 Mon Sep 17 00:00:00 2001 From: Romain <45540622+rom1trt@users.noreply.github.com> Date: Fri, 29 Jul 2022 10:54:18 +0200 Subject: [PATCH 78/85] refactor: keep 0.2.0 goerli version --- .../src/lib/artifacts/Erc20SwapConversion/index.ts | 4 ---- 1 file changed, 4 deletions(-) diff --git a/packages/smart-contracts/src/lib/artifacts/Erc20SwapConversion/index.ts b/packages/smart-contracts/src/lib/artifacts/Erc20SwapConversion/index.ts index 1852293575..8eae29f28c 100644 --- a/packages/smart-contracts/src/lib/artifacts/Erc20SwapConversion/index.ts +++ b/packages/smart-contracts/src/lib/artifacts/Erc20SwapConversion/index.ts @@ -18,10 +18,6 @@ export const erc20SwapConversionArtifact = new ContractArtifact Date: Thu, 28 Jul 2022 10:05:11 +0200 Subject: [PATCH 79/85] refactor: contract setup compression fix (#888) --- .../contract-setup/setupEthConversionProxy.ts | 47 ------------------- 1 file changed, 47 deletions(-) delete mode 100644 packages/smart-contracts/scripts-create2/contract-setup/setupEthConversionProxy.ts diff --git a/packages/smart-contracts/scripts-create2/contract-setup/setupEthConversionProxy.ts b/packages/smart-contracts/scripts-create2/contract-setup/setupEthConversionProxy.ts deleted file mode 100644 index 28d1c974d9..0000000000 --- a/packages/smart-contracts/scripts-create2/contract-setup/setupEthConversionProxy.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { batchPaymentsArtifact } from '../../src/lib'; -import { HardhatRuntimeEnvironmentExtended } from '../types'; -import utils from '@requestnetwork/utils'; -import { updateChainlinkConversionPath, updatePaymentErc20FeeProxy } from './adminTasks'; - -/** - * Updates the values of the batch fees of the BatchPayments contract, if needed - * @param contractAddress address of the BatchPayments Proxy - * @param hre Hardhat runtime environment - */ -export const setupEthConversionProxy = async ( - contractAddress: string, - hre: HardhatRuntimeEnvironmentExtended, -): Promise => { - // Setup contract parameters - const EthConversionProxyContract = new hre.ethers.Contract( - contractAddress, - batchPaymentsArtifact.getContractAbi(), - ); - await Promise.all( - hre.config.xdeploy.networks.map(async (network) => { - let provider; - if (network === 'celo') { - provider = utils.getCeloProvider(); - } else { - provider = utils.getDefaultProvider(network); - } - const wallet = new hre.ethers.Wallet(hre.config.xdeploy.signer, provider); - const signer = wallet.connect(provider); - const EthConversionProxyConnected = await EthConversionProxyContract.connect(signer); - const adminNonce = await signer.getTransactionCount(); - const gasPrice = await provider.getGasPrice(); - - // start from the adminNonce, increase gasPrice if needed - await Promise.all([ - updatePaymentErc20FeeProxy(EthConversionProxyConnected, network, adminNonce, gasPrice), - updateChainlinkConversionPath( - EthConversionProxyConnected, - network, - adminNonce + 1, - gasPrice, - ), - ]); - }), - ); - console.log('Setup for EthConversionProxy successful'); -}; From 60e430a3ace7f1e5740f6636917684b263f6f4f1 Mon Sep 17 00:00:00 2001 From: Romain TREFAULT Date: Fri, 29 Jul 2022 13:24:00 +0200 Subject: [PATCH 80/85] fix: EthConversionProxy to ETHConversion... --- .../scripts-create2/compute-one-address.ts | 2 +- .../scripts-create2/constructor-args.ts | 3 +- .../contract-setup/setupETHConversionProxy.ts | 47 +++++++++++++++++++ .../scripts-create2/contract-setup/setups.ts | 8 ++-- .../smart-contracts/scripts-create2/deploy.ts | 2 +- .../smart-contracts/scripts-create2/utils.ts | 4 +- .../smart-contracts/scripts-create2/verify.ts | 2 +- 7 files changed, 57 insertions(+), 11 deletions(-) create mode 100644 packages/smart-contracts/scripts-create2/contract-setup/setupETHConversionProxy.ts diff --git a/packages/smart-contracts/scripts-create2/compute-one-address.ts b/packages/smart-contracts/scripts-create2/compute-one-address.ts index f2803616ed..7e8c4809a7 100644 --- a/packages/smart-contracts/scripts-create2/compute-one-address.ts +++ b/packages/smart-contracts/scripts-create2/compute-one-address.ts @@ -52,7 +52,7 @@ export const computeCreate2DeploymentAddressesFromList = async ( switch (contract) { case 'EthereumProxy': case 'EthereumFeeProxy': - case 'EthConversionProxy': + case 'ETHConversionProxy': case 'ERC20FeeProxy': case 'Erc20ConversionProxy': case 'ERC20EscrowToPay': diff --git a/packages/smart-contracts/scripts-create2/constructor-args.ts b/packages/smart-contracts/scripts-create2/constructor-args.ts index 178501ac3a..58217038c8 100644 --- a/packages/smart-contracts/scripts-create2/constructor-args.ts +++ b/packages/smart-contracts/scripts-create2/constructor-args.ts @@ -16,13 +16,12 @@ export const getConstructorArgs = (contract: string, network?: string): string[] getAdminWalletAddress(contract), ]; } - case 'EthConversionProxy': { + case 'ETHConversionProxy': { return [ '0x0000000000000000000000000000000000000000', '0x0000000000000000000000000000000000000000', '0x39e19aa5b69466dfdc313c7cda37cb2a599015cd', ]; - // TODO setupEthConversionProxy } case 'ERC20SwapToConversion': { return [getAdminWalletAddress(contract)]; diff --git a/packages/smart-contracts/scripts-create2/contract-setup/setupETHConversionProxy.ts b/packages/smart-contracts/scripts-create2/contract-setup/setupETHConversionProxy.ts new file mode 100644 index 0000000000..b0c0cbfee8 --- /dev/null +++ b/packages/smart-contracts/scripts-create2/contract-setup/setupETHConversionProxy.ts @@ -0,0 +1,47 @@ +import { batchPaymentsArtifact } from '../../src/lib'; +import { HardhatRuntimeEnvironmentExtended } from '../types'; +import utils from '@requestnetwork/utils'; +import { updateChainlinkConversionPath, updatePaymentErc20FeeProxy } from './adminTasks'; + +/** + * Updates the values of the batch fees of the BatchPayments contract, if needed + * @param contractAddress address of the BatchPayments Proxy + * @param hre Hardhat runtime environment + */ +export const setupETHConversionProxy = async ( + contractAddress: string, + hre: HardhatRuntimeEnvironmentExtended, +): Promise => { + // Setup contract parameters + const EthConversionProxyContract = new hre.ethers.Contract( + contractAddress, + batchPaymentsArtifact.getContractAbi(), + ); + await Promise.all( + hre.config.xdeploy.networks.map(async (network) => { + let provider; + if (network === 'celo') { + provider = utils.getCeloProvider(); + } else { + provider = utils.getDefaultProvider(network); + } + const wallet = new hre.ethers.Wallet(hre.config.xdeploy.signer, provider); + const signer = wallet.connect(provider); + const EthConversionProxyConnected = await EthConversionProxyContract.connect(signer); + const adminNonce = await signer.getTransactionCount(); + const gasPrice = await provider.getGasPrice(); + + // start from the adminNonce, increase gasPrice if needed + await Promise.all([ + updatePaymentErc20FeeProxy(EthConversionProxyConnected, network, adminNonce, gasPrice), + updateChainlinkConversionPath( + EthConversionProxyConnected, + network, + adminNonce + 1, + gasPrice, + ), + ]); + }), + ); + console.log('Setup for EthConversionProxy successful'); +}; diff --git a/packages/smart-contracts/scripts-create2/contract-setup/setups.ts b/packages/smart-contracts/scripts-create2/contract-setup/setups.ts index f650553bf0..cda45affa2 100644 --- a/packages/smart-contracts/scripts-create2/contract-setup/setups.ts +++ b/packages/smart-contracts/scripts-create2/contract-setup/setups.ts @@ -1,10 +1,10 @@ import { HardhatRuntimeEnvironmentExtended } from '../types'; -import { setupEthConversionProxy } from './setupEthConversionProxy'; +import { setupETHConversionProxy } from './setupETHConversionProxy'; import { setupBatchPayments } from './setupBatchPayments'; import { setupERC20SwapToConversion } from './setupERC20SwapToConversion'; /** - * Updates the values of either BatchPayments, EthConversionProxy, or ERC20SwapToConversion contract, if needed + * Updates the values of either BatchPayments, ETHConversionProxy, or ERC20SwapToConversion contract, if needed * @param contractAddress address of the proxy * @param hre Hardhat runtime environment * @param contractName name of the contract @@ -15,8 +15,8 @@ export const setupContract = async ( contractName: string, ): Promise => { switch (contractName) { - case 'EthConversionProxy': { - await setupEthConversionProxy(contractAddress, hre); + case 'ETHConversionProxy': { + await setupETHConversionProxy(contractAddress, hre); break; } case 'ERC20SwapToConversion': { diff --git a/packages/smart-contracts/scripts-create2/deploy.ts b/packages/smart-contracts/scripts-create2/deploy.ts index 23dbfc931b..ec15644fac 100644 --- a/packages/smart-contracts/scripts-create2/deploy.ts +++ b/packages/smart-contracts/scripts-create2/deploy.ts @@ -53,7 +53,7 @@ export const deployWithCreate2FromList = async ( switch (contract) { case 'EthereumProxy': case 'EthereumFeeProxy': - case 'EthConversionProxy': + case 'ETHConversionProxy': case 'ERC20FeeProxy': case 'Erc20ConversionProxy': { const constructorArgs = getConstructorArgs(contract); diff --git a/packages/smart-contracts/scripts-create2/utils.ts b/packages/smart-contracts/scripts-create2/utils.ts index ad58a5f04c..d5be7e5c33 100644 --- a/packages/smart-contracts/scripts-create2/utils.ts +++ b/packages/smart-contracts/scripts-create2/utils.ts @@ -9,7 +9,7 @@ import * as artifacts from '../src/lib'; export const create2ContractDeploymentList = [ 'EthereumProxy', 'EthereumFeeProxy', - 'EthConversionProxy', + 'ETHConversionProxy', 'ERC20FeeProxy', 'Erc20ConversionProxy', 'ERC20SwapToConversion', @@ -39,7 +39,7 @@ export const getArtifact = (contract: string): artifacts.ContractArtifact Date: Sat, 30 Jul 2022 17:33:34 +0200 Subject: [PATCH 81/85] commented goerli in eth-input detector --- packages/payment-detection/test/eth/info-retriever.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/payment-detection/test/eth/info-retriever.test.ts b/packages/payment-detection/test/eth/info-retriever.test.ts index ab7c3e2451..8a50bfddba 100644 --- a/packages/payment-detection/test/eth/info-retriever.test.ts +++ b/packages/payment-detection/test/eth/info-retriever.test.ts @@ -51,7 +51,7 @@ describe('api/eth/info-retriever', () => { [ 'mainnet', 'rinkeby', - 'goerli', + // 'goerli', // 'xdai', // 'sokol', 'fuse', From cf34428d4d244c27dd5b2290176badd432f361b4 Mon Sep 17 00:00:00 2001 From: Darko Kolev Date: Sat, 30 Jul 2022 19:40:04 +0200 Subject: [PATCH 82/85] fixing eth-input-data goerli test --- .../test/eth/input-data.test.ts | 25 +++++++++---------- .../src/lib/artifacts/EthereumProxy/index.ts | 4 --- 2 files changed, 12 insertions(+), 17 deletions(-) diff --git a/packages/payment-detection/test/eth/input-data.test.ts b/packages/payment-detection/test/eth/input-data.test.ts index b7d7489698..a76ed3b946 100644 --- a/packages/payment-detection/test/eth/input-data.test.ts +++ b/packages/payment-detection/test/eth/input-data.test.ts @@ -159,8 +159,7 @@ describe('api/eth/input-data', () => { balance: null, error: { code: PaymentTypes.BALANCE_ERROR_CODE.NETWORK_NOT_SUPPORTED, - message: - /Payment network wrong not supported by ETH payment detection\. Supported networks: mainnet, rinkeby, goerli, private.*/, + message: /Payment network wrong not supported by ETH payment detection\. Supported networks: mainnet, rinkeby, goerli, private.*/, }, events: [], }); @@ -253,7 +252,7 @@ describe('api/eth/input-data', () => { type: RequestLogicTypes.CURRENCY.ETH, value: 'ETH-goerli', }, - expectedAmount: '80000000000000000', + expectedAmount: '7000000000000', payee: { type: 'ethereumAddress', value: '0x1D274D164937465B7A7259347AD3f1aaEEEaC8e1', @@ -262,16 +261,16 @@ describe('api/eth/input-data', () => { type: 'ethereumAddress', value: '0x5e7D193321A4CCB091038d01755a10d143cb2Dc8', }, - timestamp: 1620207049, + timestamp: 1659195985, extensionsData: [ { action: 'create', id: 'pn-eth-input-data', parameters: { - paymentAddress: '0x8400b234e7B113686bD584af9b1041E5a233E754', + paymentAddress: '0xBc9643B7Bd7c8621F4a68280433796484b9E525d', salt: '2334c5f6691a9131', }, - version: '0.2.0', + version: '0.3.0', }, ], extensions: { @@ -280,19 +279,19 @@ describe('api/eth/input-data', () => { { name: 'create', parameters: { - paymentAddress: '0x8400b234e7B113686bD584af9b1041E5a233E754', + paymentAddress: '0xBc9643B7Bd7c8621F4a68280433796484b9E525d', salt: '2334c5f6691a9131', }, - timestamp: 1620207051, + timestamp: 1659195985, }, ], id: 'pn-eth-input-data', type: 'payment-network', values: { - paymentAddress: '0x8400b234e7B113686bD584af9b1041E5a233E754', + paymentAddress: '0xBc9643B7Bd7c8621F4a68280433796484b9E525d', salt: '2334c5f6691a9131', }, - version: '0.2.0', + version: '0.3.0', }, }, requestId: '0110e7eaba7a3ff2e2239081497308db70e4c66362100d747903ffa5c83d290d5d', @@ -305,7 +304,7 @@ describe('api/eth/input-data', () => { }, name: 'create', parameters: { - expectedAmount: '80000000000000000', + expectedAmount: '7000000000000', extensionsDataLength: 2, isSignedRequest: false, }, @@ -319,10 +318,10 @@ describe('api/eth/input-data', () => { }, }; const balance = await ethInputData.getBalance(goerliRequest as RequestLogicTypes.IRequest); - expect(balance.balance).toBe('80000000000000000'); + expect(balance.balance).toBe('7000000000000'); expect(balance.events).toHaveLength(1); expect(balance.events[0].name).toBe(PaymentTypes.EVENTS_NAMES.PAYMENT); - expect(balance.events[0].amount).toBe('80000000000000000'); + expect(balance.events[0].amount).toBe('7000000000000'); expect(typeof balance.events[0].timestamp).toBe('number'); }); }); diff --git a/packages/smart-contracts/src/lib/artifacts/EthereumProxy/index.ts b/packages/smart-contracts/src/lib/artifacts/EthereumProxy/index.ts index 2602944bd0..b318578e54 100644 --- a/packages/smart-contracts/src/lib/artifacts/EthereumProxy/index.ts +++ b/packages/smart-contracts/src/lib/artifacts/EthereumProxy/index.ts @@ -21,10 +21,6 @@ export const ethereumProxyArtifact = new ContractArtifact( address: '0x9c6c7817e3679c4b3f9ef9486001eae5aaed25ff', creationBlockNumber: 5955681, }, - goerli: { - address: '0x171Ee0881407d4c0C11eA1a2FB7D5b4cdED71e6e', - creationBlockNumber: 7069045, - }, xdai: { address: '0x27c60BE17e853c47A9F1d280B05365f483c2dFAF', creationBlockNumber: 18326895, From 5be827add19547779a0d6a84cdb5dd4d3c92c236 Mon Sep 17 00:00:00 2001 From: Darko Kolev Date: Sat, 30 Jul 2022 19:52:07 +0200 Subject: [PATCH 83/85] fixed formatting --- packages/payment-detection/test/eth/input-data.test.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/payment-detection/test/eth/input-data.test.ts b/packages/payment-detection/test/eth/input-data.test.ts index a76ed3b946..ce68981d51 100644 --- a/packages/payment-detection/test/eth/input-data.test.ts +++ b/packages/payment-detection/test/eth/input-data.test.ts @@ -159,7 +159,8 @@ describe('api/eth/input-data', () => { balance: null, error: { code: PaymentTypes.BALANCE_ERROR_CODE.NETWORK_NOT_SUPPORTED, - message: /Payment network wrong not supported by ETH payment detection\. Supported networks: mainnet, rinkeby, goerli, private.*/, + message: + /Payment network wrong not supported by ETH payment detection\. Supported networks: mainnet, rinkeby, goerli, private.*/, }, events: [], }); From 80e413fda085cff68f80396ea81ca891daa05bd5 Mon Sep 17 00:00:00 2001 From: Darko Kolev Date: Sat, 30 Jul 2022 22:14:31 +0200 Subject: [PATCH 84/85] removed goerli input data test --- .../test/eth/input-data.test.ts | 80 ------------------- 1 file changed, 80 deletions(-) diff --git a/packages/payment-detection/test/eth/input-data.test.ts b/packages/payment-detection/test/eth/input-data.test.ts index ce68981d51..054c189c16 100644 --- a/packages/payment-detection/test/eth/input-data.test.ts +++ b/packages/payment-detection/test/eth/input-data.test.ts @@ -245,84 +245,4 @@ describe('api/eth/input-data', () => { expect(balance.events[0].amount).toBe('80000000000000000'); expect(typeof balance.events[0].timestamp).toBe('number'); }); - - it('can get balance from goerli subgraph', async () => { - const goerliRequest = { - currency: { - network: 'goerli', - type: RequestLogicTypes.CURRENCY.ETH, - value: 'ETH-goerli', - }, - expectedAmount: '7000000000000', - payee: { - type: 'ethereumAddress', - value: '0x1D274D164937465B7A7259347AD3f1aaEEEaC8e1', - }, - payer: { - type: 'ethereumAddress', - value: '0x5e7D193321A4CCB091038d01755a10d143cb2Dc8', - }, - timestamp: 1659195985, - extensionsData: [ - { - action: 'create', - id: 'pn-eth-input-data', - parameters: { - paymentAddress: '0xBc9643B7Bd7c8621F4a68280433796484b9E525d', - salt: '2334c5f6691a9131', - }, - version: '0.3.0', - }, - ], - extensions: { - 'pn-eth-input-data': { - events: [ - { - name: 'create', - parameters: { - paymentAddress: '0xBc9643B7Bd7c8621F4a68280433796484b9E525d', - salt: '2334c5f6691a9131', - }, - timestamp: 1659195985, - }, - ], - id: 'pn-eth-input-data', - type: 'payment-network', - values: { - paymentAddress: '0xBc9643B7Bd7c8621F4a68280433796484b9E525d', - salt: '2334c5f6691a9131', - }, - version: '0.3.0', - }, - }, - requestId: '0110e7eaba7a3ff2e2239081497308db70e4c66362100d747903ffa5c83d290d5d', - version: '2.0.3', - events: [ - { - actionSigner: { - type: 'ethereumAddress', - value: '0x1D274D164937465B7A7259347AD3f1aaEEEaC8e1', - }, - name: 'create', - parameters: { - expectedAmount: '7000000000000', - extensionsDataLength: 2, - isSignedRequest: false, - }, - timestamp: 1620207051, - }, - ], - state: 'created', - creator: { - type: 'ethereumAddress', - value: '0x1D274D164937465B7A7259347AD3f1aaEEEaC8e1', - }, - }; - const balance = await ethInputData.getBalance(goerliRequest as RequestLogicTypes.IRequest); - expect(balance.balance).toBe('7000000000000'); - expect(balance.events).toHaveLength(1); - expect(balance.events[0].name).toBe(PaymentTypes.EVENTS_NAMES.PAYMENT); - expect(balance.events[0].amount).toBe('7000000000000'); - expect(typeof balance.events[0].timestamp).toBe('number'); - }); }); From 8ac0f6f2a8bbfa48b7e3b05bfd9a047aaefa1b31 Mon Sep 17 00:00:00 2001 From: Darko Kolev Date: Sat, 30 Jul 2022 22:17:28 +0200 Subject: [PATCH 85/85] updated escrow test config --- .../test/erc20/escrow-info-retriever.test.ts | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/packages/payment-detection/test/erc20/escrow-info-retriever.test.ts b/packages/payment-detection/test/erc20/escrow-info-retriever.test.ts index 03431e5089..c7e3690810 100644 --- a/packages/payment-detection/test/erc20/escrow-info-retriever.test.ts +++ b/packages/payment-detection/test/erc20/escrow-info-retriever.test.ts @@ -16,7 +16,8 @@ describe('api/erc20/escrow-info-retriever', () => { blockHash: '0x5be4f7b06ebbe0df573da7bc70768247abdc4e03e70264e946226d7154e42742', transactionIndex: 0, address: '0xB9B7e0cb2EDF5Ea031C8B297A5A1Fa20379b6A0a', - data: '0x3a322d4500000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002aaaa000000000000000000000000000000000000000000000000000000000000', + data: + '0x3a322d4500000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002aaaa000000000000000000000000000000000000000000000000000000000000', topics: [ '0x37b4fae7fd90ce3674204f79d686d40c4069a66c402976717d4f30817c0c0939', '0x6330b989705733cc5c1f7285b8a5b892e08be86ed6fbe9d254713a4277bc5bd2', @@ -30,7 +31,8 @@ describe('api/erc20/escrow-info-retriever', () => { blockHash: '0x5be4f7b06ebbe0df573da7bc70768247abdc4e03e70264e946226d7154e42742', transactionIndex: 0, address: '0xB9B7e0cb2EDF5Ea031C8B297A5A1Fa20379b6A0a', - data: '0x82865e9d00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002aaaa000000000000000000000000000000000000000000000000000000000000', + data: + '0x82865e9d00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002aaaa000000000000000000000000000000000000000000000000000000000000', topics: [ '0x5e14b9b7c3d9675ce5ecb24ee8181d371561709a08aa9c412acb36627386dba8', '0x6330b989705733cc5c1f7285b8a5b892e08be86ed6fbe9d254713a4277bc5bd2', @@ -44,7 +46,8 @@ describe('api/erc20/escrow-info-retriever', () => { blockHash: '0x5be4f7b06ebbe0df573da7bc70768247abdc4e03e70264e946226d7154e42742', transactionIndex: 0, address: '0xB9B7e0cb2EDF5Ea031C8B297A5A1Fa20379b6A0a', - data: '0x0797560800000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002aaaa000000000000000000000000000000000000000000000000000000000000', + data: + '0x0797560800000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002aaaa000000000000000000000000000000000000000000000000000000000000', topics: [ '0xcc401323a0bd24a2e6e1564e168c52332731fff1a2937d998ee25462588ba0fa', '0x6330b989705733cc5c1f7285b8a5b892e08be86ed6fbe9d254713a4277bc5bd2', @@ -167,7 +170,7 @@ describe('api/erc20/escrow-info-retriever', () => { beforeAll(() => { infoRetriever = new EscrowERC20InfoRetriever( paymentReferenceMock, - '0x8230e703B1c4467A4543422b2cC3284133B9AB5e', + '0xd2777001fD7D89331D8E87eC439f78079179322b', 0, '', '', @@ -178,13 +181,12 @@ describe('api/erc20/escrow-info-retriever', () => { const escrowChainData = await infoRetriever.getEscrowRequestMapping(); // Not yet ERC777 token on goerli // expect(escrowChainData.tokenAddress).toEqual('0x745861AeD1EEe363b4AaA5F1994Be40b1e05Ff90'); - expect(escrowChainData.payee).toEqual('0xB9B7e0cb2EDF5Ea031C8B297A5A1Fa20379b6A0a'); - expect(escrowChainData.payer).toEqual('0x0c051a1f4E209b00c8E7C00AD0ce79B3630a7401'); - expect(escrowChainData.amount.toString()).toEqual('123000000000000000000'); - expect(escrowChainData.unlockDate.toString()).toEqual('1670505020'); + expect(escrowChainData.payer).toEqual('0xffb1d8efecaa177deef1cd1ab202e5e9f6a84db4'); + expect(escrowChainData.amount.toString()).toEqual('20000000000000000'); + expect(escrowChainData.unlockDate.toString()).toEqual('0'); expect(escrowChainData.emergencyClaimDate.toString()).toEqual('0'); expect(escrowChainData.emergencyState).toEqual(false); - expect(escrowChainData.isFrozen).toEqual(true); + expect(escrowChainData.isFrozen).toEqual(false); }); }); });