From 23288ced361910e0d82adb02d8c625c69a74468d Mon Sep 17 00:00:00 2001 From: Kevin Kei Tuncer Date: Wed, 30 Mar 2022 19:50:28 +0200 Subject: [PATCH 01/24] Add full test environment for Solidity contract --- .gitignore | 2 + contracts/teleporteth/.gitattributes | 1 + contracts/teleporteth/README.md | 23 + .../teleporteth/contracts/Migrations.sol | 19 + .../migrations/1_initial_migration.js | 5 + .../migrations/2_deploy_contracts.js | 5 + contracts/teleporteth/package-lock.json | 1017 +++++++++++++++++ contracts/teleporteth/package.json | 9 + .../teleporteth/test/TeleportToken.test.js | 275 +++++ .../teleporteth/test/TeleportToken.test.sol | 20 + contracts/teleporteth/test/exceptions.js | 27 + contracts/teleporteth/test/teleporteos.abi | 397 +++++++ contracts/teleporteth/truffle-config.js | 116 ++ contracts/teleporteth/yarn.lock | 439 +++++++ 14 files changed, 2355 insertions(+) create mode 100644 contracts/teleporteth/.gitattributes create mode 100644 contracts/teleporteth/README.md create mode 100644 contracts/teleporteth/contracts/Migrations.sol create mode 100644 contracts/teleporteth/migrations/1_initial_migration.js create mode 100644 contracts/teleporteth/migrations/2_deploy_contracts.js create mode 100644 contracts/teleporteth/package-lock.json create mode 100644 contracts/teleporteth/package.json create mode 100644 contracts/teleporteth/test/TeleportToken.test.js create mode 100644 contracts/teleporteth/test/TeleportToken.test.sol create mode 100644 contracts/teleporteth/test/exceptions.js create mode 100644 contracts/teleporteth/test/teleporteos.abi create mode 100644 contracts/teleporteth/truffle-config.js create mode 100644 contracts/teleporteth/yarn.lock diff --git a/.gitignore b/.gitignore index d3eb3ca..70a75e9 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,8 @@ oracle/node_modules config.js contracts/teleporteos/node_modules +contracts/teleporteth/node_modules teleporteos.ts eosio.token.ts contracts/teleporteos/artifacts +build \ No newline at end of file diff --git a/contracts/teleporteth/.gitattributes b/contracts/teleporteth/.gitattributes new file mode 100644 index 0000000..52031de --- /dev/null +++ b/contracts/teleporteth/.gitattributes @@ -0,0 +1 @@ +*.sol linguist-language=Solidity diff --git a/contracts/teleporteth/README.md b/contracts/teleporteth/README.md new file mode 100644 index 0000000..af0dd3a --- /dev/null +++ b/contracts/teleporteth/README.md @@ -0,0 +1,23 @@ +# ETH Contract for Alien Teleport + +## Testing the eth contract + +### Installation +1. Install all dependencies +``` +yarn install +``` + +### Configutration +Use truffle-config.js file to change your test net settings. + +### Run eth contract tests +1. Start two consoles +2. Use one to run an eth test chain +``` +ganache-cli +``` +3. Use the other to start the tests +``` +truffle test +``` \ No newline at end of file diff --git a/contracts/teleporteth/contracts/Migrations.sol b/contracts/teleporteth/contracts/Migrations.sol new file mode 100644 index 0000000..f9a0101 --- /dev/null +++ b/contracts/teleporteth/contracts/Migrations.sol @@ -0,0 +1,19 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.4.25 <0.9.0; + +contract Migrations { + address public owner; + uint public last_completed_migration; + + modifier restricted() { + if (msg.sender == owner) _; + } + + constructor() public { + owner = msg.sender; + } + + function setCompleted(uint completed) public restricted { + last_completed_migration = completed; + } +} diff --git a/contracts/teleporteth/migrations/1_initial_migration.js b/contracts/teleporteth/migrations/1_initial_migration.js new file mode 100644 index 0000000..ee2135d --- /dev/null +++ b/contracts/teleporteth/migrations/1_initial_migration.js @@ -0,0 +1,5 @@ +const Migrations = artifacts.require("Migrations"); + +module.exports = function(deployer) { + deployer.deploy(Migrations); +}; diff --git a/contracts/teleporteth/migrations/2_deploy_contracts.js b/contracts/teleporteth/migrations/2_deploy_contracts.js new file mode 100644 index 0000000..b7eed27 --- /dev/null +++ b/contracts/teleporteth/migrations/2_deploy_contracts.js @@ -0,0 +1,5 @@ +const MetaCoin = artifacts.require("TeleportToken"); + +module.exports = function(deployer) { + deployer.deploy(MetaCoin); +}; diff --git a/contracts/teleporteth/package-lock.json b/contracts/teleporteth/package-lock.json new file mode 100644 index 0000000..155e049 --- /dev/null +++ b/contracts/teleporteth/package-lock.json @@ -0,0 +1,1017 @@ +{ + "name": "teleporteth", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "dependencies": { + "eosjs": "^22.1.0", + "eosjs-ecc": "^4.0.7", + "ethereumjs-util": "^7.0.4", + "text-encoding": "^0.7.0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.6.0.tgz", + "integrity": "sha512-89eSBLJsxNxOERC0Op4vd+0Bqm6wRMqMbFtV3i0/fbaWw/mJ8Q3eBvgX0G4SyrOOLCtbu98HspF8o09MRT+KzQ==", + "dependencies": { + "regenerator-runtime": "^0.13.2" + } + }, + "node_modules/@types/bn.js": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.0.tgz", + "integrity": "sha512-QSSVYj7pYFN49kW77o2s9xTCwZ8F2xLbjLLSEVh8D2F4JUhZtPAGOFLTD+ffqksBx/u4cE/KImFjyhqCjn/LIA==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/node": { + "version": "17.0.23", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.23.tgz", + "integrity": "sha512-UxDxWn7dl97rKVeVS61vErvw086aCYhDLyvRQZ5Rk65rZKepaFdm53GeqXaKBuOhED4e9uWq34IC3TdSdJJ2Gw==" + }, + "node_modules/@types/pbkdf2": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/pbkdf2/-/pbkdf2-3.1.0.tgz", + "integrity": "sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/secp256k1": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.3.tgz", + "integrity": "sha512-Da66lEIFeIz9ltsdMZcpQvmrmmoqrfju8pm1BH8WbYjZSwUgCwXLb9C+9XYogwBITnbsSaMdVPb2ekf7TV+03w==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/base-x": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz", + "integrity": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/bigi": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/bigi/-/bigi-1.4.2.tgz", + "integrity": "sha1-nGZalfiLiwj8Bc/XMfVhhZ1yWCU=" + }, + "node_modules/blakejs": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.2.1.tgz", + "integrity": "sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==" + }, + "node_modules/bn.js": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", + "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==" + }, + "node_modules/brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" + }, + "node_modules/browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dependencies": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/bs58": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", + "integrity": "sha1-vhYedsNU9veIrkBx9j806MTwpCo=", + "dependencies": { + "base-x": "^3.0.2" + } + }, + "node_modules/bs58check": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz", + "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==", + "dependencies": { + "bs58": "^4.0.0", + "create-hash": "^1.1.0", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" + }, + "node_modules/bytebuffer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/bytebuffer/-/bytebuffer-5.0.1.tgz", + "integrity": "sha1-WC7qSxqHO20CCkjVjfhfC7ps/d0=", + "dependencies": { + "long": "~3" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dependencies": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "node_modules/create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dependencies": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "node_modules/ecurve": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/ecurve/-/ecurve-1.0.5.tgz", + "integrity": "sha1-0Ujo/lCmdPmDu1uuCdoOoj4QU14=", + "dependencies": { + "bigi": "^1.1.0" + } + }, + "node_modules/elliptic": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "dependencies": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/elliptic/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "node_modules/eosjs": { + "version": "22.1.0", + "resolved": "https://registry.npmjs.org/eosjs/-/eosjs-22.1.0.tgz", + "integrity": "sha512-Ka8KO7akC3RxNdSg/3dkGWuUWUQESTzSUzQljBdVP16UG548vmQoBqSGnZdnjlZyfcab8VOu2iEt+JjyfYc5+A==", + "dependencies": { + "bn.js": "5.2.0", + "elliptic": "6.5.4", + "hash.js": "1.1.7", + "pako": "2.0.3" + } + }, + "node_modules/eosjs-ecc": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eosjs-ecc/-/eosjs-ecc-4.0.7.tgz", + "integrity": "sha512-uuqhqnrDy9XTpKfkhiZqRDUTCCI9oWBalVK5IosL7kpYwA9I3lm68INYFLyWsHpF2xwHqPql8MrMYJ3zfOn5Qg==", + "dependencies": { + "@babel/runtime": "7.6.0", + "bigi": "1.4.2", + "browserify-aes": "1.0.6", + "bs58": "4.0.1", + "bytebuffer": "5.0.1", + "create-hash": "1.1.3", + "create-hmac": "1.1.6", + "ecurve": "1.0.5", + "randombytes": "2.0.5" + } + }, + "node_modules/eosjs-ecc/node_modules/browserify-aes": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.0.6.tgz", + "integrity": "sha1-Xncl297x/Vkw1OurSFZ85FHEigo=", + "dependencies": { + "buffer-xor": "^1.0.2", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.0", + "inherits": "^2.0.1" + } + }, + "node_modules/eosjs-ecc/node_modules/create-hash": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz", + "integrity": "sha1-YGBCrIuSYnUPSDyt2rD1gZFy2P0=", + "dependencies": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "sha.js": "^2.4.0" + } + }, + "node_modules/eosjs-ecc/node_modules/create-hmac": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.6.tgz", + "integrity": "sha1-rLniIaThe9sHbpBlfEK5PjcmzwY=", + "dependencies": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "node_modules/eosjs-ecc/node_modules/randombytes": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.5.tgz", + "integrity": "sha512-8T7Zn1AhMsQ/HI1SjcCfT/t4ii3eAqco3yOcSzS4mozsOz69lHLsoMXmF9nZgnFanYscnSlUSgs8uZyKzpE6kg==", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/ethereum-cryptography": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", + "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "dependencies": { + "@types/pbkdf2": "^3.0.0", + "@types/secp256k1": "^4.0.1", + "blakejs": "^1.1.0", + "browserify-aes": "^1.2.0", + "bs58check": "^2.1.2", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "hash.js": "^1.1.7", + "keccak": "^3.0.0", + "pbkdf2": "^3.0.17", + "randombytes": "^2.1.0", + "safe-buffer": "^5.1.2", + "scrypt-js": "^3.0.0", + "secp256k1": "^4.0.1", + "setimmediate": "^1.0.5" + } + }, + "node_modules/ethereumjs-util": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.4.tgz", + "integrity": "sha512-p6KmuPCX4mZIqsQzXfmSx9Y0l2hqf+VkAiwSisW3UKUFdk8ZkAt+AYaor83z2nSi6CU2zSsXMlD80hAbNEGM0A==", + "dependencies": { + "@types/bn.js": "^5.1.0", + "bn.js": "^5.1.2", + "create-hash": "^1.1.2", + "ethereum-cryptography": "^0.1.3", + "rlp": "^2.2.4" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dependencies": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/hash-base": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "dependencies": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "node_modules/hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dependencies": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/keccak": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.2.tgz", + "integrity": "sha512-PyKKjkH53wDMLGrvmRGSNWgmSxZOUqbnXwKL9tmgbFYA1iAYqW21kfR7mZXV0MlESiefxQQE9X9fTa3X+2MPDQ==", + "hasInstallScript": true, + "dependencies": { + "node-addon-api": "^2.0.0", + "node-gyp-build": "^4.2.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/long": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/long/-/long-3.2.0.tgz", + "integrity": "sha1-2CG3E4yhy1gcFymQ7xTbIAtcR0s=", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + }, + "node_modules/minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" + }, + "node_modules/node-addon-api": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", + "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==" + }, + "node_modules/node-gyp-build": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.3.0.tgz", + "integrity": "sha512-iWjXZvmboq0ja1pUGULQBexmxq8CV4xBhX7VDOTbL7ZR4FOowwY/VOtRxBN/yKxmdGoIp4j5ysNT4u3S2pDQ3Q==", + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, + "node_modules/pako": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pako/-/pako-2.0.3.tgz", + "integrity": "sha512-WjR1hOeg+kki3ZIOjaf4b5WVcay1jaliKSYiEaB1XzwhMQZJxRdQRv0V31EKBYlxb4T7SK3hjfc/jxyU64BoSw==" + }, + "node_modules/pbkdf2": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", + "dependencies": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.13.9", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", + "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" + }, + "node_modules/ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "node_modules/rlp": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/rlp/-/rlp-2.2.7.tgz", + "integrity": "sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==", + "dependencies": { + "bn.js": "^5.2.0" + }, + "bin": { + "rlp": "bin/rlp" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/scrypt-js": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", + "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==" + }, + "node_modules/secp256k1": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.3.tgz", + "integrity": "sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA==", + "hasInstallScript": true, + "dependencies": { + "elliptic": "^6.5.4", + "node-addon-api": "^2.0.0", + "node-gyp-build": "^4.2.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" + }, + "node_modules/sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + }, + "bin": { + "sha.js": "bin.js" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/text-encoding": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/text-encoding/-/text-encoding-0.7.0.tgz", + "integrity": "sha512-oJQ3f1hrOnbRLOcwKz0Liq2IcrvDeZRHXhd9RgLrsT+DjWY/nty1Hi7v3dtkaEYbPYe0mUoOfzRrMwfXXwgPUA==", + "deprecated": "no longer maintained" + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + } + }, + "dependencies": { + "@babel/runtime": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.6.0.tgz", + "integrity": "sha512-89eSBLJsxNxOERC0Op4vd+0Bqm6wRMqMbFtV3i0/fbaWw/mJ8Q3eBvgX0G4SyrOOLCtbu98HspF8o09MRT+KzQ==", + "requires": { + "regenerator-runtime": "^0.13.2" + } + }, + "@types/bn.js": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.0.tgz", + "integrity": "sha512-QSSVYj7pYFN49kW77o2s9xTCwZ8F2xLbjLLSEVh8D2F4JUhZtPAGOFLTD+ffqksBx/u4cE/KImFjyhqCjn/LIA==", + "requires": { + "@types/node": "*" + } + }, + "@types/node": { + "version": "17.0.23", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.23.tgz", + "integrity": "sha512-UxDxWn7dl97rKVeVS61vErvw086aCYhDLyvRQZ5Rk65rZKepaFdm53GeqXaKBuOhED4e9uWq34IC3TdSdJJ2Gw==" + }, + "@types/pbkdf2": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/pbkdf2/-/pbkdf2-3.1.0.tgz", + "integrity": "sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ==", + "requires": { + "@types/node": "*" + } + }, + "@types/secp256k1": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.3.tgz", + "integrity": "sha512-Da66lEIFeIz9ltsdMZcpQvmrmmoqrfju8pm1BH8WbYjZSwUgCwXLb9C+9XYogwBITnbsSaMdVPb2ekf7TV+03w==", + "requires": { + "@types/node": "*" + } + }, + "base-x": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz", + "integrity": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "bigi": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/bigi/-/bigi-1.4.2.tgz", + "integrity": "sha1-nGZalfiLiwj8Bc/XMfVhhZ1yWCU=" + }, + "blakejs": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.2.1.tgz", + "integrity": "sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==" + }, + "bn.js": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", + "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==" + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" + }, + "browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "requires": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "bs58": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", + "integrity": "sha1-vhYedsNU9veIrkBx9j806MTwpCo=", + "requires": { + "base-x": "^3.0.2" + } + }, + "bs58check": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz", + "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==", + "requires": { + "bs58": "^4.0.0", + "create-hash": "^1.1.0", + "safe-buffer": "^5.1.2" + } + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" + }, + "bytebuffer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/bytebuffer/-/bytebuffer-5.0.1.tgz", + "integrity": "sha1-WC7qSxqHO20CCkjVjfhfC7ps/d0=", + "requires": { + "long": "~3" + } + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "requires": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "ecurve": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/ecurve/-/ecurve-1.0.5.tgz", + "integrity": "sha1-0Ujo/lCmdPmDu1uuCdoOoj4QU14=", + "requires": { + "bigi": "^1.1.0" + } + }, + "elliptic": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "requires": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + } + } + }, + "eosjs": { + "version": "22.1.0", + "resolved": "https://registry.npmjs.org/eosjs/-/eosjs-22.1.0.tgz", + "integrity": "sha512-Ka8KO7akC3RxNdSg/3dkGWuUWUQESTzSUzQljBdVP16UG548vmQoBqSGnZdnjlZyfcab8VOu2iEt+JjyfYc5+A==", + "requires": { + "bn.js": "5.2.0", + "elliptic": "6.5.4", + "hash.js": "1.1.7", + "pako": "2.0.3" + } + }, + "eosjs-ecc": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eosjs-ecc/-/eosjs-ecc-4.0.7.tgz", + "integrity": "sha512-uuqhqnrDy9XTpKfkhiZqRDUTCCI9oWBalVK5IosL7kpYwA9I3lm68INYFLyWsHpF2xwHqPql8MrMYJ3zfOn5Qg==", + "requires": { + "@babel/runtime": "7.6.0", + "bigi": "1.4.2", + "browserify-aes": "1.0.6", + "bs58": "4.0.1", + "bytebuffer": "5.0.1", + "create-hash": "1.1.3", + "create-hmac": "1.1.6", + "ecurve": "1.0.5", + "randombytes": "2.0.5" + }, + "dependencies": { + "browserify-aes": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.0.6.tgz", + "integrity": "sha1-Xncl297x/Vkw1OurSFZ85FHEigo=", + "requires": { + "buffer-xor": "^1.0.2", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.0", + "inherits": "^2.0.1" + } + }, + "create-hash": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz", + "integrity": "sha1-YGBCrIuSYnUPSDyt2rD1gZFy2P0=", + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "sha.js": "^2.4.0" + } + }, + "create-hmac": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.6.tgz", + "integrity": "sha1-rLniIaThe9sHbpBlfEK5PjcmzwY=", + "requires": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "randombytes": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.5.tgz", + "integrity": "sha512-8T7Zn1AhMsQ/HI1SjcCfT/t4ii3eAqco3yOcSzS4mozsOz69lHLsoMXmF9nZgnFanYscnSlUSgs8uZyKzpE6kg==", + "requires": { + "safe-buffer": "^5.1.0" + } + } + } + }, + "ethereum-cryptography": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", + "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "requires": { + "@types/pbkdf2": "^3.0.0", + "@types/secp256k1": "^4.0.1", + "blakejs": "^1.1.0", + "browserify-aes": "^1.2.0", + "bs58check": "^2.1.2", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "hash.js": "^1.1.7", + "keccak": "^3.0.0", + "pbkdf2": "^3.0.17", + "randombytes": "^2.1.0", + "safe-buffer": "^5.1.2", + "scrypt-js": "^3.0.0", + "secp256k1": "^4.0.1", + "setimmediate": "^1.0.5" + } + }, + "ethereumjs-util": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.4.tgz", + "integrity": "sha512-p6KmuPCX4mZIqsQzXfmSx9Y0l2hqf+VkAiwSisW3UKUFdk8ZkAt+AYaor83z2nSi6CU2zSsXMlD80hAbNEGM0A==", + "requires": { + "@types/bn.js": "^5.1.0", + "bn.js": "^5.1.2", + "create-hash": "^1.1.2", + "ethereum-cryptography": "^0.1.3", + "rlp": "^2.2.4" + } + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "hash-base": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "requires": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + } + }, + "hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "keccak": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.2.tgz", + "integrity": "sha512-PyKKjkH53wDMLGrvmRGSNWgmSxZOUqbnXwKL9tmgbFYA1iAYqW21kfR7mZXV0MlESiefxQQE9X9fTa3X+2MPDQ==", + "requires": { + "node-addon-api": "^2.0.0", + "node-gyp-build": "^4.2.0", + "readable-stream": "^3.6.0" + } + }, + "long": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/long/-/long-3.2.0.tgz", + "integrity": "sha1-2CG3E4yhy1gcFymQ7xTbIAtcR0s=" + }, + "md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" + }, + "node-addon-api": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", + "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==" + }, + "node-gyp-build": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.3.0.tgz", + "integrity": "sha512-iWjXZvmboq0ja1pUGULQBexmxq8CV4xBhX7VDOTbL7ZR4FOowwY/VOtRxBN/yKxmdGoIp4j5ysNT4u3S2pDQ3Q==" + }, + "pako": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pako/-/pako-2.0.3.tgz", + "integrity": "sha512-WjR1hOeg+kki3ZIOjaf4b5WVcay1jaliKSYiEaB1XzwhMQZJxRdQRv0V31EKBYlxb4T7SK3hjfc/jxyU64BoSw==" + }, + "pbkdf2": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", + "requires": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "regenerator-runtime": { + "version": "0.13.9", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", + "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" + }, + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "rlp": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/rlp/-/rlp-2.2.7.tgz", + "integrity": "sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==", + "requires": { + "bn.js": "^5.2.0" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, + "scrypt-js": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", + "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==" + }, + "secp256k1": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.3.tgz", + "integrity": "sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA==", + "requires": { + "elliptic": "^6.5.4", + "node-addon-api": "^2.0.0", + "node-gyp-build": "^4.2.0" + } + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" + }, + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "requires": { + "safe-buffer": "~5.2.0" + } + }, + "text-encoding": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/text-encoding/-/text-encoding-0.7.0.tgz", + "integrity": "sha512-oJQ3f1hrOnbRLOcwKz0Liq2IcrvDeZRHXhd9RgLrsT+DjWY/nty1Hi7v3dtkaEYbPYe0mUoOfzRrMwfXXwgPUA==" + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + } + } +} diff --git a/contracts/teleporteth/package.json b/contracts/teleporteth/package.json new file mode 100644 index 0000000..fb038ee --- /dev/null +++ b/contracts/teleporteth/package.json @@ -0,0 +1,9 @@ +{ + "type": "commonjs", + "dependencies": { + "eosjs": "^22.1.0", + "eosjs-ecc": "^4.0.7", + "ethereumjs-util": "^7.0.4", + "text-encoding": "^0.7.0" + } +} diff --git a/contracts/teleporteth/test/TeleportToken.test.js b/contracts/teleporteth/test/TeleportToken.test.js new file mode 100644 index 0000000..4fa70b6 --- /dev/null +++ b/contracts/teleporteth/test/TeleportToken.test.js @@ -0,0 +1,275 @@ +// Note: There is no sufficient typescript support for truffle tests now + +const TeleportToken = artifacts.require("TeleportToken"); +const ethUtil = require('ethereumjs-util'); +const eosjs = require('eosjs'); +const ecc = require('eosjs-ecc'); +const { TextDecoder, TextEncoder } = require('text-encoding'); +const fs = require('fs'); + +const catchRevert = require("./exceptions.js").catchRevert; + +function generateAllKeys(ethPrivateKey){ + let ethPrivate = Buffer.from(ethPrivateKey, 'hex') + if(!ethUtil.isValidPrivate(ethPrivate)){ + throw("Invalid private key: " + ethPrivateKey) + } + let ethAddress = '0x' + ethUtil.privateToAddress(ethPrivate).toString('hex') + let ethPublic = ethUtil.privateToPublic(ethPrivate).toString('hex') + + // Create EOS keys + // let eosWIF = ecc.PrivateKey(Buffer.from(ethPrivate, 'hex')).toWif() + let eosioPrivate = ecc.PrivateKey(ethPrivate) + let eosioPublic = ecc.privateToPublic(eosioPrivate) + + return {ethPrivate, ethPublic, ethAddress, eosioPrivate, eosioPublic } +} + +function eosioGetContractByAbi(abi) { + const types = eosjs.Serialize.getTypesFromAbi(eosjs.Serialize.createInitialTypes(), abi); + const actions = new Map(); + for (const { name, type } of abi.actions) { + actions.set(name, eosjs.Serialize.getType(types, type)); + } + return { types, actions }; +} + +const TestSettings = { + Token: { + symbol: "TLM", + totalSupply: 100000000000000, + decimals: 4, + }, + threshold: 3, + chainId: 1, + oracles: [{ + eosio_name: 'klausklaus12', + keys: generateAllKeys('8940fbd7806ec09af7e1ceaf7ccac80e89eeeb1e85cee42f84c07b1d5a378100'), + }, { + eosio_name: 'anneliese', + keys: generateAllKeys('8940fbd7806ec09af7e1ceaf7ccac80e89eeeb1e85cee42f84c07b1d5a378101'), + }, { + eosio_name: 'peterpeter12', + keys: generateAllKeys('8940fbd7806ec09af7e1ceaf7ccac80e89eeeb1e85cee42f84c07b1d5a378102'), + }, { + eosio_name: 'helga', + keys: generateAllKeys('4040fbd7806ec09af7e1ceaf7ccac80e89eeeb1e85cee42f84c07b1d5a378110'), + },{ + eosio_name: 'hans', + keys: generateAllKeys('8940fbd7806ec09af7e1ceaf7ccac80e89eeeb1e85cee42f84c07b1d5a378103'), + }], + eosioAbi: JSON.parse(fs.readFileSync('./test/teleporteos.abi', null).toString()) +} + + +function signWithKey(privateKey, msg_hash_buf){ + const pk = Buffer.from(privateKey, "hex"); + const sig = ethUtil.ecsign(msg_hash_buf, pk); + return ethUtil.toRpcSig(sig.v, sig.r, sig.s); +} + +function toHexString(bytes){ + return bytes.reduce((str, byte) => str + byte.toString(16).padStart(2, '0'), '') +} +function fromHexString(hexString){ + return new Uint8Array(hexString.match(/.{1,2}/g).map(byte => parseInt(byte, 16))) +} + +contract('TeleportToken', (accounts) => { + + // List all oracles in console log + for (let i = 0; i < TestSettings.oracles.length; i++) { + const element = TestSettings.oracles[i]; + console.log(element.eosio_name, element.keys.ethAddress); + } + + it('Total supply', async () => { + const instance = await TeleportToken.deployed(); + const balance = await instance._totalSupply.call(); + assert.equal(balance.valueOf(), TestSettings.Token.totalSupply, `Total supply is not ${TestSettings.Token.totalSupply}`); + }) + + it('Register oracles', async () => { + const instance = await TeleportToken.deployed(); + + // Check test settings + assert.equal(TestSettings.oracles.length > 0, true, 'No oracles defined') + assert.equal(TestSettings.oracles.length > TestSettings.threshold, true, 'Need one more oracle for testing than threshold') + + // Check if someone else can register an oracle than owner + await catchRevert(instance.regOracle(TestSettings.oracles[0].keys.ethAddress, {from: accounts[3]}), 'Unauthorized oracle registration') + + // Register all oracles + for(let i = 0; i < TestSettings.oracles.length; i++){ + await instance.regOracle(TestSettings.oracles[i].keys.ethAddress, {from: accounts[0]}); + assert.equal(await instance.oracles(TestSettings.oracles[i].keys.ethAddress), true, 'Missing oracle' + i) + } + + // Remove one oracle + let noOracle = TestSettings.oracles[TestSettings.oracles.length - 1].keys.ethAddress; + await instance.unregOracle(noOracle, {from: accounts[0]}); + assert.equal(await instance.oracles(noOracle), false, 'Oracle is still registered') + + // Check further unauthorized registrations + await catchRevert(instance.regOracle(noOracle, {from: accounts[3]}), 'Unauthorized registration of former oracle') + await catchRevert(instance.regOracle(TestSettings.oracles[0].keys.ethAddress, {from: accounts[0]}), 'Double registration of the same oracle') + }) + + let tokenAmount1 = 500000; + const fullToken1 = Math.round(tokenAmount1/(10**TestSettings.Token.decimals)) + it('Receive token from eosio chain', async () => { + const instance = await TeleportToken.deployed(); + + // Check initial state of token amounts + assert.equal(await instance.balanceOf.call(accounts[0]).valueOf(), 0, 'Balance of account 0 is not 0'); + assert.equal(await instance.balanceOf.call(accounts[1]).valueOf(), 0, 'Balance of account 1 is not 0'); + + // Check abi file + assert.equal(TestSettings.eosioAbi.actions.length > 0, true, "No actions in abi file") + + // Create example log data by abi definition + const eosioFromAcc = "wololo" + const logAsset = `${fullToken1}.${'0'.repeat(TestSettings.Token.decimals)} ${TestSettings.Token.symbol}`; + const logData = { + id: 0, // uint64 + timestamp: Math.round(new Date().getTime() / 1000), // uint32 + from: eosioFromAcc, // uint64 + quantity: logAsset, // uint64 + chain_id: TestSettings.chainId, // uint8 + eth_address: accounts[1].substring(2) + '000000000000000000000000' // address + } + const logDataHexByAbi = '0x' + eosjs.Serialize.serializeActionData(eosioGetContractByAbi(TestSettings.eosioAbi), 'useless', 'logteleport', logData, new TextEncoder(), new TextDecoder()); + + // Create example log data manually // logteleport(uint64_t id, uint32_t timestamp, name from, asset quantity, uint8_t chain_id, checksum256 eth_address) + const sb = new eosjs.Serialize.SerialBuffer({ + textEncoder: new TextEncoder, + textDecoder: new TextDecoder + }); + sb.pushNumberAsUint64(0); + sb.pushUint32(Math.round(new Date().getTime() / 1000)); + sb.pushName(eosioFromAcc); + sb.pushAsset(logAsset); + sb.push(TestSettings.chainId); + sb.pushArray(fromHexString(accounts[1].substring(2) + '000000000000000000000000')); + const logDataHex = '0x' + toHexString(sb.array.slice(0, 69)) + + // Check if serialization by abi file and manually has the same results // Note: Second way is tested to use it in other js implementations + assert.equal(logDataHex.toLowerCase(), logDataHexByAbi.toLowerCase(), 'Generated example of a logteleport action hex does not match the definition in the abi file') + + // Check wrong signatures + let falseSignatures = []; + for(let i = 0; i < TestSettings.threshold; i++) { + const sig = signWithKey(TestSettings.oracles[i].keys.ethPrivate, ethUtil.keccak(Buffer(['1', '2', '3', '4']))) + falseSignatures.push(sig); + } + await catchRevert(instance.claim.call(logDataHex, falseSignatures, {from: accounts[1]}), 'Claim with false signatures') + + // Sign the example log data + const logDataBuffer = Buffer.from(logDataHex.substring(2), 'hex') + const logDataKeccak = ethUtil.keccak(logDataBuffer) + let signatures = []; + for(let i = 0; i < TestSettings.threshold; i++) { + const sig = signWithKey(TestSettings.oracles[i].keys.ethPrivate, logDataKeccak) + signatures.push(sig); + } + + // Pay out the teleported tokens + await instance.claim(logDataHex, signatures, {from: accounts[2]}); // Claim by a different account is allowed + assert.equal((await instance.balanceOf.call(accounts[2])).valueOf(), 0, 'Wrong account got funds') + const receiveBalance = await instance.balanceOf.call(accounts[1]) + assert.equal((await instance.balanceOf.call(accounts[1])).valueOf(), fullToken1 * (10 ** TestSettings.Token.decimals), 'Account 1 does not got the right amount of funds') + }); + + it('Send token within the chain', async () => { + const instance = await TeleportToken.deployed(); + + // Check transfer tokens to yourself + await instance.transfer(accounts[1], tokenAmount1, {from: accounts[1]}) + assert.equal((await instance.balanceOf.call(accounts[1])).valueOf(), tokenAmount1, 'Token amount changed by sending to yourself') + + // Check further unallowed transfer actions + await catchRevert(instance.transfer(accounts[2], tokenAmount1 + 3, {from: accounts[1]}), 'It is possible to send more tokens than available for an account') + assert.equal((await instance.balanceOf.call(accounts[2])).valueOf(), 0, 'It is possible to get more tokens from a sender than his balance is') + await catchRevert(instance.transfer(accounts[1], tokenAmount1, {from: accounts[3]}), 'It is possible to send tokens without a balance') + + // Transfer tokens to another account + const balance1 = fullToken1 * (10 ** TestSettings.Token.decimals) + const sendAmount = balance1 / 5 + await instance.transfer(accounts[2], sendAmount, {from: accounts[1]}) + tokenAmount1 = balance1 - sendAmount + assert.equal((await instance.balanceOf.call(accounts[2])).valueOf(), sendAmount, 'Wrong account got funds') + assert.equal((await instance.balanceOf.call(accounts[1])).valueOf(), tokenAmount1, 'Token amount of sender account is not reduced') + }) + + it('Send token by authorized account within the chain', async () => { + const instance = await TeleportToken.deployed(); + const approveAmount = tokenAmount1 / 5 + + // Approve some tokens from account 1 for account 3 + await instance.approve(accounts[3], approveAmount, {from: accounts[1]}) + assert.equal((await instance.balanceOf.call(accounts[3])).valueOf(), 0, 'Account should get rights not funds') + assert.equal((await instance.balanceOf.call(accounts[1])).valueOf(), tokenAmount1, 'Account lost funds') + + // Send tokens to account 4 + const sendAmount = approveAmount / 2 + await instance.transferFrom(accounts[1], accounts[4], sendAmount, {from: accounts[3]}) + tokenAmount1 -= sendAmount + assert.equal((await instance.balanceOf.call(accounts[3])).valueOf(), 0, 'Account should not get funds by sending them to someone else') + assert.equal((await instance.balanceOf.call(accounts[1])).valueOf(), tokenAmount1, 'Owner has wrong balance amount') + assert.equal((await instance.balanceOf.call(accounts[4])).valueOf(), sendAmount, 'Receiver got not the right amount of funds') + + // Check unauthorized transferFrom actions + await catchRevert(instance.transferFrom(accounts[1], accounts[5], 1, {from: accounts[2]}), 'It is possible to send tokens without the rights') + await catchRevert(instance.transferFrom(accounts[1], accounts[5], sendAmount + 3, {from: accounts[3]}), 'It is possible to send more tokens than approved') + + // Remove approve amount + await instance.approve(accounts[3], 0, {from: accounts[1]}) + assert.equal((await instance.balanceOf.call(accounts[3])).valueOf(), 0, 'Account should not get funds by removing the approve') + assert.equal((await instance.balanceOf.call(accounts[1])).valueOf(), tokenAmount1, 'Owner has wrong balance amount after removing approve') + await catchRevert(instance.transferFrom(accounts[1], accounts[5], 1, {from: accounts[3]}), 'Can not remove the right to transfer tokens') + }) + + it('Teleport to eosio chain', async () => { + const instance = await TeleportToken.deployed(); + + // Teleport tokens + const sendAmount = tokenAmount1 / 2 + tokenAmount1 -= sendAmount + const receiveChainId = TestSettings.chainId + 1 + await instance.teleport('fraugertrud', sendAmount, receiveChainId, {from: accounts[1]}); + assert.equal((await instance.balanceOf.call(accounts[1])).valueOf(), tokenAmount1, 'Balance of account got not reduced') + + await catchRevert(instance.teleport('fraugertrud', sendAmount, receiveChainId, {from: accounts[6]}), 'Can teleport without any balance') + }) + + it('Transfer ownership', async () => { + const instance = await TeleportToken.deployed(); + + // Check current ownership + let owner = await instance.owner(); + let newOwner = await instance.newOwner(); + assert.equal(owner, accounts[0], 'Old owner is not account 0') + assert.equal(owner, accounts[0], 'NewOwner is at the beginning not account 0') + + // Check unauthorized transfer of ownership + await catchRevert(instance.transferOwnership.call(accounts[5], {from: accounts[3]}), "Unauthorized transferOwnership") + + // Transfer ownership + await instance.transferOwnership(accounts[5], {from:accounts[0]}); + owner = await instance.owner(); + newOwner = await instance.newOwner(); + assert.equal(owner, accounts[0], 'TransferOwnership but owner should still be account 0') + assert.equal(newOwner, accounts[5], 'TransferOwnership but new owner is not account 5') + + // Check unaothorized acceptation of ownership + await catchRevert(instance.acceptOwnership.call({from: accounts[3]}), "Unauthorized acceptOwnership") + await catchRevert(instance.acceptOwnership.call({from: accounts[0]}), "Unauthorized acceptOwnership by old owner") + + // Accept ownership + await instance.acceptOwnership.call({from: accounts[5]}) + owner = await instance.owner(); + newOwner = await instance.newOwner(); + assert.equal(owner, accounts[0], 'AcceptOwnership the new owner is not account 5') + assert.equal(newOwner, accounts[5], 'AcceptOwnership the newOwner variable must be account 5, too') + }) +}); diff --git a/contracts/teleporteth/test/TeleportToken.test.sol b/contracts/teleporteth/test/TeleportToken.test.sol new file mode 100644 index 0000000..6316be6 --- /dev/null +++ b/contracts/teleporteth/test/TeleportToken.test.sol @@ -0,0 +1,20 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.4.25 <0.9.0; + +import "truffle/Assert.sol"; +import "truffle/DeployedAddresses.sol"; +import "../contracts/TeleportToken.sol"; + +contract TestTeleportToken { + + function testInitialBalanceUsingDeployedContract() public { + TeleportToken tel = TeleportToken(DeployedAddresses.TeleportToken()); + + // tel.transfer(, tokens); + + uint expected = 10000000000 * 10**uint(4); + + Assert.equal(tel.balanceOf(address(0)), expected, "Owner should have 10000000000 Token initially"); + } + +} diff --git a/contracts/teleporteth/test/exceptions.js b/contracts/teleporteth/test/exceptions.js new file mode 100644 index 0000000..136b1ba --- /dev/null +++ b/contracts/teleporteth/test/exceptions.js @@ -0,0 +1,27 @@ +const PREFIX = "Returned error: VM Exception while processing transaction: "; + +async function tryCatch(promise, message, alertMsg = null) { + try { + await promise; + throw null; + } + catch (error) { + if(alertMsg){ + assert(error, alertMsg); + assert(error.message.startsWith(PREFIX + message), alertMsg); + } else { + assert(error, "Expected an error but did not get one"); + assert(error.message.startsWith(PREFIX + message), "Expected an error starting with '" + PREFIX + message + "' but got '" + error.message + "' instead"); + } + } +}; + +module.exports = { + catchRevert : async function(promise, alertMsg) {await tryCatch(promise, "revert", alertMsg);}, + catchOutOfGas : async function(promise, alertMsg) {await tryCatch(promise, "out of gas", alertMsg);}, + catchInvalidJump : async function(promise, alertMsg) {await tryCatch(promise, "invalid JUMP", alertMsg);}, + catchInvalidOpcode : async function(promise, alertMsg) {await tryCatch(promise, "invalid opcode", alertMsg);}, + catchStackOverflow : async function(promise, alertMsg) {await tryCatch(promise, "stack overflow", alertMsg);}, + catchStackUnderflow : async function(promise, alertMsg) {await tryCatch(promise, "stack underflow", alertMsg);}, + catchStaticStateChange : async function(promise, alertMsg) {await tryCatch(promise, "static state change", alertMsg);}, +}; \ No newline at end of file diff --git a/contracts/teleporteth/test/teleporteos.abi b/contracts/teleporteth/test/teleporteos.abi new file mode 100644 index 0000000..a430a13 --- /dev/null +++ b/contracts/teleporteth/test/teleporteos.abi @@ -0,0 +1,397 @@ +{ + "____comment": "This file was generated with eosio-abigen. DO NOT EDIT ", + "version": "eosio::abi/1.1", + "types": [], + "structs": [ + { + "name": "cancel", + "base": "", + "fields": [ + { + "name": "id", + "type": "uint64" + } + ] + }, + { + "name": "cancel_item", + "base": "", + "fields": [ + { + "name": "teleport_id", + "type": "uint64" + } + ] + }, + { + "name": "claimed", + "base": "", + "fields": [ + { + "name": "oracle_name", + "type": "name" + }, + { + "name": "id", + "type": "uint64" + }, + { + "name": "to_eth", + "type": "checksum256" + }, + { + "name": "quantity", + "type": "asset" + } + ] + }, + { + "name": "delreceipts", + "base": "", + "fields": [] + }, + { + "name": "delteles", + "base": "", + "fields": [] + }, + { + "name": "deposit_item", + "base": "", + "fields": [ + { + "name": "account", + "type": "name" + }, + { + "name": "quantity", + "type": "asset" + } + ] + }, + { + "name": "logteleport", + "base": "", + "fields": [ + { + "name": "id", + "type": "uint64" + }, + { + "name": "timestamp", + "type": "uint32" + }, + { + "name": "from", + "type": "name" + }, + { + "name": "quantity", + "type": "asset" + }, + { + "name": "chain_id", + "type": "uint8" + }, + { + "name": "eth_address", + "type": "checksum256" + } + ] + }, + { + "name": "oracle_item", + "base": "", + "fields": [ + { + "name": "account", + "type": "name" + } + ] + }, + { + "name": "receipt_item", + "base": "", + "fields": [ + { + "name": "id", + "type": "uint64" + }, + { + "name": "date", + "type": "time_point_sec" + }, + { + "name": "ref", + "type": "checksum256" + }, + { + "name": "to", + "type": "name" + }, + { + "name": "chain_id", + "type": "uint8" + }, + { + "name": "confirmations", + "type": "uint8" + }, + { + "name": "quantity", + "type": "asset" + }, + { + "name": "approvers", + "type": "name[]" + }, + { + "name": "completed", + "type": "bool" + } + ] + }, + { + "name": "received", + "base": "", + "fields": [ + { + "name": "oracle_name", + "type": "name" + }, + { + "name": "to", + "type": "name" + }, + { + "name": "ref", + "type": "checksum256" + }, + { + "name": "quantity", + "type": "asset" + }, + { + "name": "chain_id", + "type": "uint8" + }, + { + "name": "confirmed", + "type": "bool" + } + ] + }, + { + "name": "regoracle", + "base": "", + "fields": [ + { + "name": "oracle_name", + "type": "name" + } + ] + }, + { + "name": "sign", + "base": "", + "fields": [ + { + "name": "oracle_name", + "type": "name" + }, + { + "name": "id", + "type": "uint64" + }, + { + "name": "signature", + "type": "string" + } + ] + }, + { + "name": "teleport", + "base": "", + "fields": [ + { + "name": "from", + "type": "name" + }, + { + "name": "quantity", + "type": "asset" + }, + { + "name": "chain_id", + "type": "uint8" + }, + { + "name": "eth_address", + "type": "checksum256" + } + ] + }, + { + "name": "teleport_item", + "base": "", + "fields": [ + { + "name": "id", + "type": "uint64" + }, + { + "name": "time", + "type": "uint32" + }, + { + "name": "account", + "type": "name" + }, + { + "name": "quantity", + "type": "asset" + }, + { + "name": "chain_id", + "type": "int8" + }, + { + "name": "eth_address", + "type": "checksum256" + }, + { + "name": "oracles", + "type": "name[]" + }, + { + "name": "signatures", + "type": "string[]" + }, + { + "name": "claimed", + "type": "bool" + } + ] + }, + { + "name": "unregoracle", + "base": "", + "fields": [ + { + "name": "oracle_name", + "type": "name" + } + ] + }, + { + "name": "withdraw", + "base": "", + "fields": [ + { + "name": "from", + "type": "name" + }, + { + "name": "quantity", + "type": "asset" + } + ] + } + ], + "actions": [ + { + "name": "cancel", + "type": "cancel", + "ricardian_contract": "" + }, + { + "name": "claimed", + "type": "claimed", + "ricardian_contract": "" + }, + { + "name": "delreceipts", + "type": "delreceipts", + "ricardian_contract": "" + }, + { + "name": "delteles", + "type": "delteles", + "ricardian_contract": "" + }, + { + "name": "logteleport", + "type": "logteleport", + "ricardian_contract": "" + }, + { + "name": "received", + "type": "received", + "ricardian_contract": "" + }, + { + "name": "regoracle", + "type": "regoracle", + "ricardian_contract": "" + }, + { + "name": "sign", + "type": "sign", + "ricardian_contract": "" + }, + { + "name": "teleport", + "type": "teleport", + "ricardian_contract": "" + }, + { + "name": "unregoracle", + "type": "unregoracle", + "ricardian_contract": "" + }, + { + "name": "withdraw", + "type": "withdraw", + "ricardian_contract": "" + } + ], + "tables": [ + { + "name": "cancels", + "type": "cancel_item", + "index_type": "i64", + "key_names": [], + "key_types": [] + }, + { + "name": "deposits", + "type": "deposit_item", + "index_type": "i64", + "key_names": [], + "key_types": [] + }, + { + "name": "oracles", + "type": "oracle_item", + "index_type": "i64", + "key_names": [], + "key_types": [] + }, + { + "name": "receipts", + "type": "receipt_item", + "index_type": "i64", + "key_names": [], + "key_types": [] + }, + { + "name": "teleports", + "type": "teleport_item", + "index_type": "i64", + "key_names": [], + "key_types": [] + } + ], + "ricardian_clauses": [], + "variants": [] +} \ No newline at end of file diff --git a/contracts/teleporteth/truffle-config.js b/contracts/teleporteth/truffle-config.js new file mode 100644 index 0000000..ba05e9f --- /dev/null +++ b/contracts/teleporteth/truffle-config.js @@ -0,0 +1,116 @@ +/** + * Use this file to configure your truffle project. It's seeded with some + * common settings for different networks and features like migrations, + * compilation and testing. Uncomment the ones you need or modify + * them to suit your project as necessary. + * + * More information about configuration can be found at: + * + * https://trufflesuite.com/docs/truffle/reference/configuration + * + * To deploy via Infura you'll need a wallet provider (like @truffle/hdwallet-provider) + * to sign your transactions before they're sent to a remote public node. Infura accounts + * are available for free at: infura.io/register. + * + * You'll also need a mnemonic - the twelve word phrase the wallet uses to generate + * public/private key pairs. If you're publishing your code to GitHub make sure you load this + * phrase from a file you've .gitignored so it doesn't accidentally become public. + * + */ + +// const HDWalletProvider = require('@truffle/hdwallet-provider'); +// +// const fs = require('fs'); +// const mnemonic = fs.readFileSync(".secret").toString().trim(); + +module.exports = { + /** + * Networks define how you connect to your ethereum client and let you set the + * defaults web3 uses to send transactions. If you don't specify one truffle + * will spin up a development blockchain for you on port 9545 when you + * run `develop` or `test`. You can ask a truffle command to use a specific + * network from the command line, e.g + * + * $ truffle test --network + */ + + networks: { + // Useful for testing. The `development` name is special - truffle uses it by default + // if it's defined here and no other network is specified at the command line. + // You should run a client (like ganache-cli, geth or parity) in a separate terminal + // tab if you use this network and you must also set the `host`, `port` and `network_id` + // options below to some value. + // + development: { + host: "127.0.0.1", // Localhost (default: none) + port: 8545, // Standard Ethereum port (default: none) + network_id: "*", // Any network (default: none) + }, + // Another network with more advanced options... + // advanced: { + // port: 8777, // Custom port + // network_id: 1342, // Custom network + // gas: 8500000, // Gas sent with each transaction (default: ~6700000) + // gasPrice: 20000000000, // 20 gwei (in wei) (default: 100 gwei) + // from:
, // Account to send txs from (default: accounts[0]) + // websocket: true // Enable EventEmitter interface for web3 (default: false) + // }, + // Useful for deploying to a public network. + // NB: It's important to wrap the provider as a function. + // ropsten: { + // provider: () => new HDWalletProvider(mnemonic, `https://ropsten.infura.io/v3/YOUR-PROJECT-ID`), + // network_id: 3, // Ropsten's id + // gas: 5500000, // Ropsten has a lower block limit than mainnet + // confirmations: 2, // # of confs to wait between deployments. (default: 0) + // timeoutBlocks: 200, // # of blocks before a deployment times out (minimum/default: 50) + // skipDryRun: true // Skip dry run before migrations? (default: false for public nets ) + // }, + // Useful for private networks + // private: { + // provider: () => new HDWalletProvider(mnemonic, `https://network.io`), + // network_id: 2111, // This network is yours, in the cloud. + // production: true // Treats this network as if it was a public net. (default: false) + // } + }, + + // Set default mocha options here, use special reporters etc. + mocha: { + // timeout: 100000 + }, + + // Configure your compilers + compilers: { + solc: { + version: "0.6.12", // Fetch exact version from solc-bin (default: truffle's version) + // docker: true, // Use "0.5.1" you've installed locally with docker (default: false) + // settings: { // See the solidity docs for advice about optimization and evmVersion + // optimizer: { + // enabled: false, + // runs: 200 + // }, + // evmVersion: "byzantium" + // } + } + }, + + // Truffle DB is currently disabled by default; to enable it, change enabled: + // false to enabled: true. The default storage location can also be + // overridden by specifying the adapter settings, as shown in the commented code below. + // + // NOTE: It is not possible to migrate your contracts to truffle DB and you should + // make a backup of your artifacts to a safe location before enabling this feature. + // + // After you backed up your artifacts you can utilize db by running migrate as follows: + // $ truffle migrate --reset --compile-all + // + // db: { + // enabled: false, + // host: "127.0.0.1", + // adapter: { + // name: "sqlite", + // settings: { + // directory: ".db" + // } + // } + // } +}; diff --git a/contracts/teleporteth/yarn.lock b/contracts/teleporteth/yarn.lock new file mode 100644 index 0000000..8f49539 --- /dev/null +++ b/contracts/teleporteth/yarn.lock @@ -0,0 +1,439 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@babel/runtime@7.6.0": + version "7.6.0" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.6.0.tgz#4fc1d642a9fd0299754e8b5de62c631cf5568205" + integrity sha512-89eSBLJsxNxOERC0Op4vd+0Bqm6wRMqMbFtV3i0/fbaWw/mJ8Q3eBvgX0G4SyrOOLCtbu98HspF8o09MRT+KzQ== + dependencies: + regenerator-runtime "^0.13.2" + +"@types/bn.js@^5.1.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-5.1.0.tgz#32c5d271503a12653c62cf4d2b45e6eab8cebc68" + integrity sha512-QSSVYj7pYFN49kW77o2s9xTCwZ8F2xLbjLLSEVh8D2F4JUhZtPAGOFLTD+ffqksBx/u4cE/KImFjyhqCjn/LIA== + dependencies: + "@types/node" "*" + +"@types/node@*": + version "17.0.23" + resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.23.tgz#3b41a6e643589ac6442bdbd7a4a3ded62f33f7da" + integrity sha512-UxDxWn7dl97rKVeVS61vErvw086aCYhDLyvRQZ5Rk65rZKepaFdm53GeqXaKBuOhED4e9uWq34IC3TdSdJJ2Gw== + +"@types/pbkdf2@^3.0.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@types/pbkdf2/-/pbkdf2-3.1.0.tgz#039a0e9b67da0cdc4ee5dab865caa6b267bb66b1" + integrity sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ== + dependencies: + "@types/node" "*" + +"@types/secp256k1@^4.0.1": + version "4.0.3" + resolved "https://registry.yarnpkg.com/@types/secp256k1/-/secp256k1-4.0.3.tgz#1b8e55d8e00f08ee7220b4d59a6abe89c37a901c" + integrity sha512-Da66lEIFeIz9ltsdMZcpQvmrmmoqrfju8pm1BH8WbYjZSwUgCwXLb9C+9XYogwBITnbsSaMdVPb2ekf7TV+03w== + dependencies: + "@types/node" "*" + +base-x@^3.0.2: + version "3.0.9" + resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.9.tgz#6349aaabb58526332de9f60995e548a53fe21320" + integrity sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ== + dependencies: + safe-buffer "^5.0.1" + +bigi@1.4.2, bigi@^1.1.0: + version "1.4.2" + resolved "https://registry.yarnpkg.com/bigi/-/bigi-1.4.2.tgz#9c665a95f88b8b08fc05cfd731f561859d725825" + integrity sha1-nGZalfiLiwj8Bc/XMfVhhZ1yWCU= + +blakejs@^1.1.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/blakejs/-/blakejs-1.2.1.tgz#5057e4206eadb4a97f7c0b6e197a505042fc3814" + integrity sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ== + +bn.js@5.2.0, bn.js@^5.1.2, bn.js@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.0.tgz#358860674396c6997771a9d051fcc1b57d4ae002" + integrity sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw== + +bn.js@^4.11.9: + version "4.12.0" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" + integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== + +brorand@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= + +browserify-aes@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.0.6.tgz#5e7725dbdef1fd5930d4ebab48567ce451c48a0a" + integrity sha1-Xncl297x/Vkw1OurSFZ85FHEigo= + dependencies: + buffer-xor "^1.0.2" + cipher-base "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.0" + inherits "^2.0.1" + +browserify-aes@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" + integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== + dependencies: + buffer-xor "^1.0.3" + cipher-base "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.3" + inherits "^2.0.1" + safe-buffer "^5.0.1" + +bs58@4.0.1, bs58@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a" + integrity sha1-vhYedsNU9veIrkBx9j806MTwpCo= + dependencies: + base-x "^3.0.2" + +bs58check@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/bs58check/-/bs58check-2.1.2.tgz#53b018291228d82a5aa08e7d796fdafda54aebfc" + integrity sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA== + dependencies: + bs58 "^4.0.0" + create-hash "^1.1.0" + safe-buffer "^5.1.2" + +buffer-xor@^1.0.2, buffer-xor@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" + integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= + +bytebuffer@5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/bytebuffer/-/bytebuffer-5.0.1.tgz#582eea4b1a873b6d020a48d58df85f0bba6cfddd" + integrity sha1-WC7qSxqHO20CCkjVjfhfC7ps/d0= + dependencies: + long "~3" + +cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" + integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +create-hash@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.1.3.tgz#606042ac8b9262750f483caddab0f5819172d8fd" + integrity sha1-YGBCrIuSYnUPSDyt2rD1gZFy2P0= + dependencies: + cipher-base "^1.0.1" + inherits "^2.0.1" + ripemd160 "^2.0.0" + sha.js "^2.4.0" + +create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" + integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== + dependencies: + cipher-base "^1.0.1" + inherits "^2.0.1" + md5.js "^1.3.4" + ripemd160 "^2.0.1" + sha.js "^2.4.0" + +create-hmac@1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.6.tgz#acb9e221a4e17bdb076e90657c42b93e3726cf06" + integrity sha1-rLniIaThe9sHbpBlfEK5PjcmzwY= + dependencies: + cipher-base "^1.0.3" + create-hash "^1.1.0" + inherits "^2.0.1" + ripemd160 "^2.0.0" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +create-hmac@^1.1.4, create-hmac@^1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" + integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== + dependencies: + cipher-base "^1.0.3" + create-hash "^1.1.0" + inherits "^2.0.1" + ripemd160 "^2.0.0" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +ecurve@1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/ecurve/-/ecurve-1.0.5.tgz#d148e8fe50a674f983bb5bae09da0ea23e10535e" + integrity sha1-0Ujo/lCmdPmDu1uuCdoOoj4QU14= + dependencies: + bigi "^1.1.0" + +elliptic@6.5.4, elliptic@^6.5.4: + version "6.5.4" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" + integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== + dependencies: + bn.js "^4.11.9" + brorand "^1.1.0" + hash.js "^1.0.0" + hmac-drbg "^1.0.1" + inherits "^2.0.4" + minimalistic-assert "^1.0.1" + minimalistic-crypto-utils "^1.0.1" + +eosjs-ecc@^4.0.7: + version "4.0.7" + resolved "https://registry.yarnpkg.com/eosjs-ecc/-/eosjs-ecc-4.0.7.tgz#f5246da3b84839fcc237204768ef6e5ea56cc814" + integrity sha512-uuqhqnrDy9XTpKfkhiZqRDUTCCI9oWBalVK5IosL7kpYwA9I3lm68INYFLyWsHpF2xwHqPql8MrMYJ3zfOn5Qg== + dependencies: + "@babel/runtime" "7.6.0" + bigi "1.4.2" + browserify-aes "1.0.6" + bs58 "4.0.1" + bytebuffer "5.0.1" + create-hash "1.1.3" + create-hmac "1.1.6" + ecurve "1.0.5" + randombytes "2.0.5" + +eosjs@^22.1.0: + version "22.1.0" + resolved "https://registry.yarnpkg.com/eosjs/-/eosjs-22.1.0.tgz#7ac40e2f1f959fab70539c30ac8ae46c9038aa3c" + integrity sha512-Ka8KO7akC3RxNdSg/3dkGWuUWUQESTzSUzQljBdVP16UG548vmQoBqSGnZdnjlZyfcab8VOu2iEt+JjyfYc5+A== + dependencies: + bn.js "5.2.0" + elliptic "6.5.4" + hash.js "1.1.7" + pako "2.0.3" + +ethereum-cryptography@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz#8d6143cfc3d74bf79bbd8edecdf29e4ae20dd191" + integrity sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ== + dependencies: + "@types/pbkdf2" "^3.0.0" + "@types/secp256k1" "^4.0.1" + blakejs "^1.1.0" + browserify-aes "^1.2.0" + bs58check "^2.1.2" + create-hash "^1.2.0" + create-hmac "^1.1.7" + hash.js "^1.1.7" + keccak "^3.0.0" + pbkdf2 "^3.0.17" + randombytes "^2.1.0" + safe-buffer "^5.1.2" + scrypt-js "^3.0.0" + secp256k1 "^4.0.1" + setimmediate "^1.0.5" + +ethereumjs-util@^7.0.4: + version "7.1.4" + resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-7.1.4.tgz#a6885bcdd92045b06f596c7626c3e89ab3312458" + integrity sha512-p6KmuPCX4mZIqsQzXfmSx9Y0l2hqf+VkAiwSisW3UKUFdk8ZkAt+AYaor83z2nSi6CU2zSsXMlD80hAbNEGM0A== + dependencies: + "@types/bn.js" "^5.1.0" + bn.js "^5.1.2" + create-hash "^1.1.2" + ethereum-cryptography "^0.1.3" + rlp "^2.2.4" + +evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" + integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== + dependencies: + md5.js "^1.3.4" + safe-buffer "^5.1.1" + +hash-base@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33" + integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA== + dependencies: + inherits "^2.0.4" + readable-stream "^3.6.0" + safe-buffer "^5.2.0" + +hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3, hash.js@^1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" + integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.1" + +hmac-drbg@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= + dependencies: + hash.js "^1.0.3" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.1" + +inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +keccak@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/keccak/-/keccak-3.0.2.tgz#4c2c6e8c54e04f2670ee49fa734eb9da152206e0" + integrity sha512-PyKKjkH53wDMLGrvmRGSNWgmSxZOUqbnXwKL9tmgbFYA1iAYqW21kfR7mZXV0MlESiefxQQE9X9fTa3X+2MPDQ== + dependencies: + node-addon-api "^2.0.0" + node-gyp-build "^4.2.0" + readable-stream "^3.6.0" + +long@~3: + version "3.2.0" + resolved "https://registry.yarnpkg.com/long/-/long-3.2.0.tgz#d821b7138ca1cb581c172990ef14db200b5c474b" + integrity sha1-2CG3E4yhy1gcFymQ7xTbIAtcR0s= + +md5.js@^1.3.4: + version "1.3.5" + resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" + integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +minimalistic-crypto-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= + +node-addon-api@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-2.0.2.tgz#432cfa82962ce494b132e9d72a15b29f71ff5d32" + integrity sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA== + +node-gyp-build@^4.2.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.3.0.tgz#9f256b03e5826150be39c764bf51e993946d71a3" + integrity sha512-iWjXZvmboq0ja1pUGULQBexmxq8CV4xBhX7VDOTbL7ZR4FOowwY/VOtRxBN/yKxmdGoIp4j5ysNT4u3S2pDQ3Q== + +pako@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/pako/-/pako-2.0.3.tgz#cdf475e31b678565251406de9e759196a0ea7a43" + integrity sha512-WjR1hOeg+kki3ZIOjaf4b5WVcay1jaliKSYiEaB1XzwhMQZJxRdQRv0V31EKBYlxb4T7SK3hjfc/jxyU64BoSw== + +pbkdf2@^3.0.17: + version "3.1.2" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075" + integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA== + dependencies: + create-hash "^1.1.2" + create-hmac "^1.1.4" + ripemd160 "^2.0.1" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +randombytes@2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.0.5.tgz#dc009a246b8d09a177b4b7a0ae77bc570f4b1b79" + integrity sha512-8T7Zn1AhMsQ/HI1SjcCfT/t4ii3eAqco3yOcSzS4mozsOz69lHLsoMXmF9nZgnFanYscnSlUSgs8uZyKzpE6kg== + dependencies: + safe-buffer "^5.1.0" + +randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +readable-stream@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" + integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +regenerator-runtime@^0.13.2: + version "0.13.9" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" + integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== + +ripemd160@^2.0.0, ripemd160@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" + integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + +rlp@^2.2.4: + version "2.2.7" + resolved "https://registry.yarnpkg.com/rlp/-/rlp-2.2.7.tgz#33f31c4afac81124ac4b283e2bd4d9720b30beaf" + integrity sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ== + dependencies: + bn.js "^5.2.0" + +safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +scrypt-js@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-3.0.1.tgz#d314a57c2aef69d1ad98a138a21fe9eafa9ee312" + integrity sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA== + +secp256k1@^4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-4.0.3.tgz#c4559ecd1b8d3c1827ed2d1b94190d69ce267303" + integrity sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA== + dependencies: + elliptic "^6.5.4" + node-addon-api "^2.0.0" + node-gyp-build "^4.2.0" + +setimmediate@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= + +sha.js@^2.4.0, sha.js@^2.4.8: + version "2.4.11" + resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" + integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +text-encoding@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/text-encoding/-/text-encoding-0.7.0.tgz#f895e836e45990624086601798ea98e8f36ee643" + integrity sha512-oJQ3f1hrOnbRLOcwKz0Liq2IcrvDeZRHXhd9RgLrsT+DjWY/nty1Hi7v3dtkaEYbPYe0mUoOfzRrMwfXXwgPUA== + +util-deprecate@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= From b34de4bd1d687bee9d670b73a4304ee16866c3f5 Mon Sep 17 00:00:00 2001 From: Kevin Kei Tuncer Date: Thu, 31 Mar 2022 13:32:34 +0200 Subject: [PATCH 02/24] Full rewrite of oracle-eos - In Typescript - Use only standard chain API - Fail-safe by automatically switching to other endpoints - Secure against hijacked endpoints by match the data with predefined amount of other endpoints - Distribution of workload across all endpoints --- .gitignore | 6 +- oracle/CommonTypes.js | 2 + oracle/CommonTypes.ts | 29 + oracle/README.md | 25 + oracle/config-example.js | 24 +- oracle/eosEndpointSwitcher.js | 177 +++ oracle/eosEndpointSwitcher.ts | 104 ++ oracle/oracle-eos.js | 633 +++++--- oracle/oracle-eos.ts | 341 +++++ oracle/oracle-eth.js | 762 ++++++---- oracle/oracle-eth.ts | 544 ++++--- oracle/package.json | 14 +- oracle/tsconfig.json | 13 + oracle/yarn.lock | 2702 +++++++++++++++------------------ 14 files changed, 3204 insertions(+), 2172 deletions(-) create mode 100644 oracle/CommonTypes.js create mode 100644 oracle/CommonTypes.ts create mode 100644 oracle/README.md create mode 100644 oracle/eosEndpointSwitcher.js create mode 100644 oracle/eosEndpointSwitcher.ts create mode 100644 oracle/oracle-eos.ts create mode 100644 oracle/tsconfig.json diff --git a/.gitignore b/.gitignore index 70a75e9..af5636d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,8 +1,6 @@ -oracle/node_modules config.js -contracts/teleporteos/node_modules -contracts/teleporteth/node_modules teleporteos.ts eosio.token.ts contracts/teleporteos/artifacts -build \ No newline at end of file +build +node_modules \ No newline at end of file diff --git a/oracle/CommonTypes.js b/oracle/CommonTypes.js new file mode 100644 index 0000000..c8ad2e5 --- /dev/null +++ b/oracle/CommonTypes.js @@ -0,0 +1,2 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/oracle/CommonTypes.ts b/oracle/CommonTypes.ts new file mode 100644 index 0000000..ed53e05 --- /dev/null +++ b/oracle/CommonTypes.ts @@ -0,0 +1,29 @@ +export type ConfigType = { + precision: number; + symbol: string; + // network: string; + confirmations: number; + eos: { + network: string; + // wsEndpoint: string; + chainId: string; + // endpoint: string; + endpoints: Array, + teleportContract: string; + oracleAccount: string; + privateKey: string; + // genesisBlock: number; + oraclePermission?: string; + epVerifications: number; + }; + eth: { + network: string; + // wsEndpoint: string; + chainId: string; + endpoint: string; + teleportContract: string; + oracleAccount: string; + privateKey: string; + genesisBlock: number; + }; + }; \ No newline at end of file diff --git a/oracle/README.md b/oracle/README.md new file mode 100644 index 0000000..cf71751 --- /dev/null +++ b/oracle/README.md @@ -0,0 +1,25 @@ +# Oracles between EOSIO and ETH chains + + +## Installation +1. Install all dependencies +``` +yarn install +``` +## Configutration +Edit config.js file + +## Compile and start eos oracle +``` +yarn eos +``` +Start by a spezific teleport id + +``` +yarn eos id {number} +``` +## Compile and start eth oracle + +``` +yarn eth +``` \ No newline at end of file diff --git a/oracle/config-example.js b/oracle/config-example.js index 6734475..fe66c96 100644 --- a/oracle/config-example.js +++ b/oracle/config-example.js @@ -1,20 +1,24 @@ module.exports = { precision: 4, symbol: 'TLM', - network: 'BSC', + confirmations: 2, eos: { - wsEndpoint: 'ws://178.63.44.179:8082', - chainId: "f16b1833c747c43682f4386fca9cbb327929334a762755ebec17f6f23c9b8a12", - endpoint: 'https://testnet.waxsweden.org', - teleportContract: 'other.worlds', - oracleAccount: '', - privateKey: '5C234dc...' + network: 'EOS', + chainId: "cf057bbfb72640471fd910bcb67639c22df9f92470936cddc1ade0e2f2e7dc4f", + endpoints: [ + 'https://jungle.eosphere.io:443', 'http://jungle2.cryptolions.io:80', 'http://jungle2.cryptolions.io:8888', + ], + epVerifications: 2, + teleportContract: 'eosiotestacc', + oracleAccount: 'anneliese', + privateKey: '5K29JmEvWEnfdD5DV1bm9Ro4qMrTKhBGmTXuaaqmrZSMEntqqZQ' + }, eth: { - wsEndpoint: 'wss://kovan.infura.io/ws/v3/9ae811d1c04243f2869a05848207b985', - endpoint: 'https://ropsten.infura.io/v3/9ae811d1c04243f2869a05848207b985', + network: 'BSC', + endpoint: 'http://localhost:8545/', teleportContract: '0x0789a30aa30d6a7a7536a7ed26956bbdb0fc80bd', oracleAccount: '0x111111111111111111111111111111111111111', - privateKey: 'ABC434DCF...' + privateKey: '2a6bdd74caefd68f16f7ee06ad37c922502c9b081f2fa26a69a1c57cd0c118a2' } } diff --git a/oracle/eosEndpointSwitcher.js b/oracle/eosEndpointSwitcher.js new file mode 100644 index 0000000..7fe15dc --- /dev/null +++ b/oracle/eosEndpointSwitcher.js @@ -0,0 +1,177 @@ +"use strict"; +var __assign = (this && this.__assign) || function () { + __assign = Object.assign || function(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); +}; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __generator = (this && this.__generator) || function (thisArg, body) { + var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; + return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; + function verb(n) { return function (v) { return step([n, v]); }; } + function step(op) { + if (f) throw new TypeError("Generator is already executing."); + while (_) try { + if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; + if (y = 0, t) op = [op[0] & 2, t.value]; + switch (op[0]) { + case 0: case 1: t = op; break; + case 4: _.label++; return { value: op[1], done: false }; + case 5: _.label++; y = op[1]; op = [0]; continue; + case 7: op = _.ops.pop(); _.trys.pop(); continue; + default: + if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } + if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } + if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } + if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } + if (t[2]) _.ops.pop(); + _.trys.pop(); continue; + } + op = body.call(thisArg, _); + } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } + if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; + } +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.EosApi = void 0; +var eosjs_1 = require("eosjs"); +var cross_fetch_1 = __importDefault(require("cross-fetch")); +var EosApi = /** @class */ (function () { + function EosApi(chainId, endpointList, signatureProvider, timeout) { + if (timeout === void 0) { timeout = 10000; } + this.chainId = chainId; + this.signatureProvider = signatureProvider; + this.timeout = timeout; + this.api = null; + this.epId = -1; + this.rpc = null; + this.endpointList = []; + this.endpoint = this.endpointList[0]; + this.lastInfo = null; + this.gotRightInfo = []; + if (endpointList.length <= 0) { + throw ('No list of entpoints defined'); + } + this.gotRightInfo = Array(endpointList.length).fill(false); + this.endpointList = endpointList.map(function (ep) { + var lastIndex = ep.length - 1; + return ep.at(lastIndex) == '/' ? ep.substring(0, lastIndex) : ep; + }); + } + /** + * Set the next endpoint for RPC and API + */ + EosApi.prototype.nextEndpoint = function () { + return __awaiter(this, void 0, void 0, function () { + var i; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + i = 0; + _a.label = 1; + case 1: + if (!(i < this.endpointList.length)) return [3 /*break*/, 5]; + this.epId++; + if (this.epId >= this.endpointList.length) { + this.epId = 0; + } + this.endpoint = this.endpointList[this.epId]; + this.getAPI(); + if (!!this.gotRightInfo[this.epId]) return [3 /*break*/, 3]; + return [4 /*yield*/, this.checkInfo()]; + case 2: + if (_a.sent()) { + this.gotRightInfo[this.epId] = true; + // console.log('Use new endpoint', this.endpoint); + return [2 /*return*/]; + } + return [3 /*break*/, 4]; + case 3: + // console.log('Use next endpoint', this.endpoint); + return [2 /*return*/]; + case 4: + i++; + return [3 /*break*/, 1]; + case 5: throw ('No usable endpoints.'); + } + }); + }); + }; + EosApi.prototype.getEndpoint = function () { + return this.endpoint; + }; + EosApi.prototype.checkInfo = function () { + return __awaiter(this, void 0, void 0, function () { + var _a, _b; + return __generator(this, function (_c) { + switch (_c.label) { + case 0: + _c.trys.push([0, 2, , 3]); + _a = this; + return [4 /*yield*/, this.getRPC().get_info()]; + case 1: + _a.lastInfo = _c.sent(); + if (this.lastInfo.chain_id != this.chainId) { + console.log('Delete endpoint because it uses another eosio chain', this.endpoint); + this.endpointList.splice(this.epId, 1); + this.gotRightInfo.splice(this.epId, 1); + this.epId--; + return [2 /*return*/, false]; + } + return [3 /*break*/, 3]; + case 2: + _b = _c.sent(); + console.log('Can not connect to endpoint', this.endpoint); + return [2 /*return*/, false]; + case 3: return [2 /*return*/, true]; + } + }); + }); + }; + EosApi.prototype.getRPC = function () { + var _this = this; + if (this.rpc && this.rpc.endpoint == this.getEndpoint()) { + return this.rpc; + } + else { + this.rpc = new eosjs_1.JsonRpc(this.getEndpoint(), { fetch: function (ep, options) { + return (0, cross_fetch_1.default)(ep, __assign(__assign({}, options), { timeout: _this.timeout })); + } }); + return this.rpc; + } + }; + EosApi.prototype.getAPI = function () { + if (this.api) { + return this.api; + } + else { + this.api = new eosjs_1.Api({ rpc: this.getRPC(), signatureProvider: this.signatureProvider, textDecoder: new TextDecoder(), textEncoder: new TextEncoder() }); + return this.api; + } + }; + EosApi.prototype.get_lastInfo = function () { + return this.lastInfo; + }; + EosApi.prototype.get_EndpointAmount = function () { + return this.endpointList.length; + }; + return EosApi; +}()); +exports.EosApi = EosApi; diff --git a/oracle/eosEndpointSwitcher.ts b/oracle/eosEndpointSwitcher.ts new file mode 100644 index 0000000..45c77a7 --- /dev/null +++ b/oracle/eosEndpointSwitcher.ts @@ -0,0 +1,104 @@ +import { Api, JsonRpc } from "eosjs"; +import { SignatureProvider } from "eosjs/dist/eosjs-api-interfaces"; +import { GetInfoResult } from 'eosjs/dist/eosjs-rpc-interfaces'; +import fetch from "cross-fetch"; + +export class EosApi{ + + constructor(private chainId: string, endpointList: Array, private signatureProvider: SignatureProvider, private timeout = 10000){ + if(endpointList.length <= 0){ + throw('No list of entpoints defined') + } + this.gotRightInfo = Array(endpointList.length).fill(false) + this.endpointList = endpointList.map(ep => { + const lastIndex = ep.length - 1 + return ep.at(lastIndex) == '/' ? ep.substring(0, lastIndex) : ep + }) + } + + private api: Api | null = null + private epId = -1 + private rpc : JsonRpc | null = null + private endpointList: Array = [] + private endpoint: string = this.endpointList[0] + private lastInfo: GetInfoResult | null = null + private gotRightInfo: Array = [] + + /** + * Set the next endpoint for RPC and API + */ + async nextEndpoint(){ + for(let i = 0; i < this.endpointList.length; i++){ + this.epId++; + if(this.epId >= this.endpointList.length){ + this.epId = 0 + } + this.endpoint = this.endpointList[this.epId] + + this.getAPI() + if(!this.gotRightInfo[this.epId]){ + if(await this.checkInfo()){ + this.gotRightInfo[this.epId] = true + // console.log('Use new endpoint', this.endpoint); + return + } + } else { + // console.log('Use next endpoint', this.endpoint); + return + } + } + throw('No usable endpoints.') + } + + getEndpoint(){ + return this.endpoint + } + + private async checkInfo() { + try{ + this.lastInfo = await this.getRPC().get_info(); + if(this.lastInfo.chain_id != this.chainId){ + console.log('Delete endpoint because it uses another eosio chain', this.endpoint) + this.endpointList.splice(this.epId, 1) + this.gotRightInfo.splice(this.epId, 1) + this.epId-- + return false + } + } catch { + console.log('Can not connect to endpoint', this.endpoint) + return false + } + return true + } + + getRPC(){ + if(this.rpc && this.rpc.endpoint == this.getEndpoint()) { + return this.rpc + } else { + this.rpc = new JsonRpc(this.getEndpoint(), {fetch: (ep: string, options) =>{ + return fetch(ep, { + ...options, + timeout: this.timeout + }) + }}); + return this.rpc + } + } + + getAPI(){ + if(this.api) { + return this.api + } else { + this.api = new Api({ rpc: this.getRPC(), signatureProvider: this.signatureProvider, textDecoder: new TextDecoder(), textEncoder: new TextEncoder() }); + return this.api + } + } + + get_lastInfo(){ + return this.lastInfo; + } + + get_EndpointAmount(){ + return this.endpointList.length + } +} \ No newline at end of file diff --git a/oracle/oracle-eos.js b/oracle/oracle-eos.js index c06d505..5ec0eb3 100755 --- a/oracle/oracle-eos.js +++ b/oracle/oracle-eos.js @@ -1,208 +1,451 @@ -#!/usr/bin/env node - -/* -This oracle listens to the EOSIO chain for teleport actions using a state history node - -After receiving a teleport action, it will sign the data and then send it to the EOS chain where the client can pick -it up and then send it to the ethereum chain in a claim action - */ - -const config_file = process.env['CONFIG'] || './config'; -process.title = `oracle-eos ${config_file}`; - -const StateReceiver = require('@eosdacio/eosio-statereceiver'); -const {Api, JsonRpc, Serialize} = require('eosjs'); -const { JsSignatureProvider } = require('eosjs/dist/eosjs-jssig'); -const fetch = require('node-fetch'); -const { TextDecoder, TextEncoder } = require('text-encoding'); -const { fork } = require('child_process'); - -const Web3 = require('web3'); -const ethUtil = require('ethereumjs-util'); - -const config = require(config_file); - -const web3 = new Web3(new Web3.providers.HttpProvider(config.eth.endpoint)); -const signatureProvider = new JsSignatureProvider([config.eos.privateKey]); -const rpc = new JsonRpc(config.eos.endpoint, {fetch}); -const eos_api = new Api({ rpc, signatureProvider, textDecoder: new TextDecoder(), textEncoder: new TextEncoder() }); - -let tx_dispatcher = null; - -// const ethAbi = require(`./eth_abi`); - -class TraceHandler { - constructor({config}) { - this.config = config; - this.queue = []; - this.processingQueue = false; - setInterval(this.processQueue.bind(this), 1000); +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __generator = (this && this.__generator) || function (thisArg, body) { + var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; + return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; + function verb(n) { return function (v) { return step([n, v]); }; } + function step(op) { + if (f) throw new TypeError("Generator is already executing."); + while (_) try { + if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; + if (y = 0, t) op = [op[0] & 2, t.value]; + switch (op[0]) { + case 0: case 1: t = op; break; + case 4: _.label++; return { value: op[1], done: false }; + case 5: _.label++; y = op[1]; op = [0]; continue; + case 7: op = _.ops.pop(); _.trys.pop(); continue; + default: + if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } + if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } + if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } + if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } + if (t[2]) _.ops.pop(); + _.trys.pop(); continue; + } + op = body.call(thisArg, _); + } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } + if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; } - - async processQueue() { - if (!this.queue.length || this.processingQueue){ - return; - } - if (!tx_dispatcher){ - console.log(`No dispatcher yet`); - } - - this.processingQueue = true; - console.log(this.queue.length + ' items in the queue') - const item = this.queue.pop(); - console.log(`Process item ${JSON.stringify(item)}`); - - const data = item.data; - const data_serialized = item.data_serialized; - let retries = item.retries; - - if (retries > 20){ - console.error(`Exceeded retries`); - return; - } - - try { - const teleport_res = await rpc.get_table_rows({ - code: config.eos.teleportContract, - scope: config.eos.teleportContract, - table: 'teleports', - lower_bound: data.id, - upper_bound: data.id, - limit: 1 - }); - // console.log(teleport_res); - if (!teleport_res.rows.length){ - throw new Error(`Could not find teleport with id ${data.id}`); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +var eosjs_1 = require("eosjs"); +var eosjs_jssig_1 = require("eosjs/dist/eosjs-jssig"); +var text_encoding_1 = require("text-encoding"); +var ethereumjs_util_1 = require("ethereumjs-util"); +var eosEndpointSwitcher_1 = require("./eosEndpointSwitcher"); +// Load config and set title +var config_file = process.env['CONFIG'] || './config'; +var config = require(config_file); +process.title = "oracle-eos ".concat(config_file); +// Configure eosjs specific propperties +var signatureProvider = new eosjs_jssig_1.JsSignatureProvider([config.eos.privateKey]); +var eos_api = new eosEndpointSwitcher_1.EosApi(config.eos.chainId, config.eos.endpoints, signatureProvider); +/** + * Convert an Uint8Array to an hex in string format + * @param bytes Uint8Array + * @returns Hex in string format + */ +function toHexString(bytes) { + return bytes.reduce(function (str, byte) { return str + byte.toString(16).padStart(2, '0'); }, ''); +} +/** + * Convert a hex in string format to an Uint8Array + * @param hexString Hex in string format + * @returns Uint8Array + */ +function fromHexString(hexString) { + var str = hexString.match(/.{1,2}/g); + return str == null ? new Uint8Array() : new Uint8Array(str.map(function (byte) { return parseInt(byte, 16); })); +} +/** + * Use this function with await to let the thread sleep for the defined amount of time + * @param ms Milliseconds + */ +var sleep = function (ms) { return __awaiter(void 0, void 0, void 0, function () { + return __generator(this, function (_a) { + return [2 /*return*/, new Promise(function (resolve) { + setTimeout(resolve, ms); + })]; + }); +}); }; +/** + * Send sign a teleport. Repeats itself until a defined amount of tries are reached + * @param id Teleport id + * @param signature Signature of this oracle + * @param tries Already passed tries + */ +function sendSignAction(id, signature, tries) { + if (tries === void 0) { tries = 0; } + return __awaiter(this, void 0, void 0, function () { + var result, e_1, retry; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + _a.trys.push([0, 2, , 7]); + console.log("Teleport id ".concat(id, ", try to send signature ").concat(tries, ".")); + return [4 /*yield*/, eos_api.getAPI().transact({ + actions: [{ + account: config.eos.teleportContract, + name: 'sign', + authorization: [{ + actor: config.eos.oracleAccount, + permission: config.eos.oraclePermission || 'active', + }], + data: { + oracle_name: config.eos.oracleAccount, + id: id, + signature: signature + }, + }] + }, { + blocksBehind: 3, + expireSeconds: 30, + })]; + case 1: + result = _a.sent(); + return [3 /*break*/, 7]; + case 2: + e_1 = _a.sent(); + console.error("\nCaught exception: ".concat(e_1, " \n")); + retry = true; + if (e_1 instanceof eosjs_1.RpcError) { + if ('code' in e_1.json) { + switch (e_1.json.code) { + case 401: // Unauthorized + retry = false; + break; + } + } + } + tries++; + if (!(tries < config.eos.endpoints.length && retry)) return [3 /*break*/, 5]; + return [4 /*yield*/, eos_api.nextEndpoint()]; + case 3: + _a.sent(); + return [4 /*yield*/, sendSignAction(id, signature, tries)]; + case 4: + _a.sent(); + return [3 /*break*/, 6]; + case 5: + console.error("Teleport id ".concat(id, ", skip sign action. \u274C")); + _a.label = 6; + case 6: return [2 /*return*/]; + case 7: + console.log("Teleport id ".concat(id, ", successful send sign action. \u2714\uFE0F")); + return [2 /*return*/]; + } + }); + }); +} +/** + * Get table rows + * @param lower_bound Start teleport id + * @param limit Amount of requested rows + * @param json True for entries in json format and false for raw (string) format + * @returns Teleport table rows result + */ +function getTableRows(lower_bound, limit, json) { + if (json === void 0) { json = true; } + return __awaiter(this, void 0, void 0, function () { + var retries, teleport_res, gotTeleport, e_2; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + retries = 0; + teleport_res = null; + gotTeleport = false; + _a.label = 1; + case 1: + if (retries >= 10) { + throw new Error("Got no result by endpoint ".concat(eos_api.getEndpoint(), ".")); + } + _a.label = 2; + case 2: + _a.trys.push([2, 4, , 6]); + retries++; + return [4 /*yield*/, eos_api.getRPC().get_table_rows({ + json: json, + code: config.eos.teleportContract, + scope: config.eos.teleportContract, + table: 'teleports', + lower_bound: lower_bound, + // upper_bound: 100, + limit: limit + })]; + case 3: + teleport_res = _a.sent(); + return [3 /*break*/, 6]; + case 4: + e_2 = _a.sent(); + console.log(e_2); + return [4 /*yield*/, eos_api.nextEndpoint()]; + case 5: + _a.sent(); + return [3 /*break*/, 6]; + case 6: + if (teleport_res == null || 'rows' in teleport_res == false) { + console.log("Got no teleports. Try ".concat(retries, ".")); + } + else { + gotTeleport = true; + } + _a.label = 7; + case 7: + if (!gotTeleport) return [3 /*break*/, 1]; + _a.label = 8; + case 8: return [2 /*return*/, teleport_res]; } - const chain_data = teleport_res.rows[0]; - - - // sign the transaction and send to the eos chain - const data_buf = Buffer.from(data_serialized); - const msg_hash = ethUtil.keccak(data_buf); - console.log(msg_hash.toString('hex')); - // console.log(this.config.eth.privateKey); - const pk = Buffer.from(this.config.eth.privateKey, "hex"); - const sig = ethUtil.ecsign(msg_hash, pk); - // console.log(pk, sig); - - const signature = ethUtil.toRpcSig(sig.v, sig.r, sig.s); - console.log(`Created signature ${signature}`); - - const actions = [{ - account: config.eos.teleportContract, - name: 'sign', - authorization: [{ - actor: config.eos.oracleAccount, - permission: config.eos.oraclePermission || 'active' - }], - data: { - oracle_name: config.eos.oracleAccount, - id: data.id, - signature + }); + }); +} +/** + * Serialize the table entry of a teleport + * @param teleport Parameters of a teleport table entry + * @param logSize Trim the serialized data to this size + * @returns Serialized data as Uint8Array + */ +function serializeLogData(teleport, logSize) { + // Serialize the values + var sb = new eosjs_1.Serialize.SerialBuffer({ + textEncoder: new text_encoding_1.TextEncoder, + textDecoder: new text_encoding_1.TextDecoder + }); + sb.pushNumberAsUint64(teleport.id); + sb.pushUint32(teleport.time); + sb.pushName(teleport.account); + sb.pushAsset(teleport.quantity); + sb.push(teleport.chain_id); + sb.pushArray(fromHexString(teleport.eth_address)); + return sb.array.slice(0, logSize); +} +/** + * Get signature for teleport data + * @param logData Serialized teleport table entry + * @returns Signature + */ +function signTeleport(logData) { + return __awaiter(this, void 0, void 0, function () { + var logDataKeccak, ethPriKey, sig; + return __generator(this, function (_a) { + logDataKeccak = (0, ethereumjs_util_1.keccak)(Buffer.from(logData)); + ethPriKey = Buffer.from(config.eth.privateKey, "hex"); + sig = (0, ethereumjs_util_1.ecsign)(logDataKeccak, ethPriKey); + (0, ethereumjs_util_1.toRpcSig)(sig.v, sig.r, sig.s); + return [2 /*return*/, (0, ethereumjs_util_1.toRpcSig)(sig.v, sig.r, sig.s)]; + }); + }); +} +/** + * Get the parameters which are defined via console + * @returns Parameters + */ +function getConsoleParams() { + var id = 0; + if (typeof process.argv[2] !== 'undefined') { + // Get id by console parameter + switch (process.argv[2]) { + case 'id': + if (typeof process.argv[3] == 'undefined') { + console.error("Missing id number."); + process.exit(1); } - }]; - - console.log('Sending signature'); - - tx_dispatcher.send(JSON.stringify(actions)); - } - catch (e){ - console.error(`Error pushing confirmation ${e.message}`); - setTimeout(() => { - item.retries++; - this.queue.push(item); - // this.sendSignature(data, data_serialized, ++retries); - }, 1000 * retries + 1); + id = parseInt(process.argv[3]); + if (isNaN(id)) { + console.error("Start id must be a number."); + process.exit(1); + } + break; + default: + console.error("Undefined console parameter."); + process.exit(1); } - - this.processingQueue = false; - } - - async sendSignature(data, data_serialized, retries=0) { - console.log(data, data_serialized, Buffer.from(data_serialized).toString('hex')); - this.queue.push({data, data_serialized, retries}); - - // verify signature - /*var sigDecoded = ethUtil.fromRpcSig(signature) - var recoveredPub = ethUtil.ecrecover(msg_hash, sigDecoded.v, sigDecoded.r, sigDecoded.s) - var recoveredAddress = ethUtil.pubToAddress(recoveredPub).toString("hex") - console.log(sigDecoded, recoveredPub.toString('hex'), recoveredAddress);*/ } - - async processTrace(block_num, traces, block_timestamp) { - // console.log(block_num); - - for (const trace of traces) { - switch (trace[0]) { - case 'transaction_trace_v0': - const trx = trace[1]; - // console.log(trx) - for (let action of trx.action_traces) { - //console.log(action) - switch (action[0]) { - case 'action_trace_v0': - if (action[1].act.account === this.config.eos.teleportContract && action[1].act.name === 'logteleport'){ - const action_deser = await eos_api.deserializeActions([action[1].act]); - console.log(`Sending ${action_deser[0].data.quantity} to ${action_deser[0].data.eth_address}`, action_deser[0].data); - this.sendSignature(action_deser[0].data, action[1].act.data); - } - break; + return { id: id }; +} +/** + * Get an amount of teleport entries as json, severall times from different endpoints for verification and the lowest amount of entries provided over all used endpoints + * @param request.lowerId Get endpoints beginning by this teleport id number + * @param request.amount Amount of requested teleports + * @returns teleport array in json format, array of teleport arrays in row format and minimum amount of provided entries + */ +function getNextTeleports(request) { + return __awaiter(this, void 0, void 0, function () { + var chain_data, lowest_amount, verify_data, initialEndpoint, i, vData; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, getTableRows(request.lowerId, request.amount, true)]; + case 1: + chain_data = _a.sent(); + lowest_amount = chain_data.rows.length; + verify_data = []; + initialEndpoint = eos_api.getEndpoint(); + i = 1; + _a.label = 2; + case 2: + if (!(i < config.eos.epVerifications)) return [3 /*break*/, 6]; + return [4 /*yield*/, eos_api.nextEndpoint()]; + case 3: + _a.sent(); + return [4 /*yield*/, getTableRows(request.lowerId, request.amount, false)]; + case 4: + vData = (_a.sent()).rows; + verify_data.push(vData); + if (initialEndpoint == eos_api.getEndpoint()) { + console.error('No available endpoints for verification. ⛔'); + process.exit(1); + } + // Handle only to the lowest amount of entries + if (lowest_amount > vData.length) { + lowest_amount = vData.length; + } + _a.label = 5; + case 5: + i++; + return [3 /*break*/, 2]; + case 6: return [2 /*return*/, { chain_data: chain_data, verify_data: verify_data, lowest_amount: lowest_amount }]; + } + }); + }); +} +/** + * Sign all teleports + * @param signProcessData.lowerId Id of teleport to start from. Will be updated by the handled amount of teleports. + * @param signProcessData.amount Amount of requested teleports + */ +function signAllTeleportsUntilNow(signProcessData) { + return __awaiter(this, void 0, void 0, function () { + var _a, chain_data, verify_data, lowest_amount, rowIndex, item, logData, logDataHex, isVerifyed, i, signature; + return __generator(this, function (_b) { + switch (_b.label) { + case 0: return [4 /*yield*/, getNextTeleports(signProcessData)]; + case 1: + _a = _b.sent(), chain_data = _a.chain_data, verify_data = _a.verify_data, lowest_amount = _a.lowest_amount; + rowIndex = 0; + _b.label = 2; + case 2: + if (!(rowIndex < lowest_amount)) return [3 /*break*/, 7]; + item = chain_data.rows[rowIndex]; + // Check if already claimed anf if the required amount of signes is already reached + if (item.claimed) { + console.log("Teleport id ".concat(item.id, ", is already claimed. \u2714\uFE0F")); + return [3 /*break*/, 6]; + } + // Check if the required amount of signes is already reached + if (item.oracles.length >= config.confirmations) { + console.log("Teleport id ".concat(item.id, ", has already sufficient confirmations. \u2714\uFE0F")); + return [3 /*break*/, 6]; + } + // Check if this oracle account has already signed + if (item.oracles.find(function (oracle) { return oracle == config.eos.oracleAccount; }) != undefined) { + console.log("Teleport id ".concat(item.id, ", has already signed. \u2714\uFE0F")); + return [3 /*break*/, 6]; + } + logData = serializeLogData(item, 69); + logDataHex = toHexString(logData); + isVerifyed = true; + for (i = 0; i < config.eos.epVerifications - 1; i++) { + if (logDataHex != verify_data[i][rowIndex].slice(0, logData.length * 2)) { + console.error("Verification failed by ".concat(eos_api.getEndpoint(), ". \u26A0\uFE0F")); + isVerifyed = false; } + // console.log(`Teleport id ${item.id}, verified ${i + 1} times`); } + if (!!isVerifyed) return [3 /*break*/, 3]; + console.error("Teleport id ".concat(item.id, ", skip this one. \u274C")); + return [3 /*break*/, 6]; + case 3: return [4 /*yield*/, signTeleport(logData) + // Send signature to eosio chain + ]; + case 4: + signature = _b.sent(); + // Send signature to eosio chain + return [4 /*yield*/, sendSignAction(item.id, signature)]; + case 5: + // Send signature to eosio chain + _b.sent(); + _b.label = 6; + case 6: + rowIndex++; + return [3 /*break*/, 2]; + case 7: + // Set last handled teleport id and get next teleports + signProcessData.lowerId += lowest_amount; + if (!(chain_data.more == true)) return [3 /*break*/, 9]; + return [4 /*yield*/, signAllTeleportsUntilNow(signProcessData)]; + case 8: + _b.sent(); + _b.label = 9; + case 9: return [2 /*return*/]; } - } - } + }); + }); } - - -const start = async (config, start_block) => { - const trace_handler = new TraceHandler({config}); - - sr = new StateReceiver({ - startBlock: start_block, - endBlock: 0xffffffff, - mode: 0, - config, - irreversibleOnly: true +/** + * Wait 5 seconds + */ +function WaitAnimation() { + return __awaiter(this, void 0, void 0, function () { + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + process.stdout.write('All available teleports signed\x1b[?25l'); + return [4 /*yield*/, sleep(1000)]; + case 1: + _a.sent(); + process.stdout.write(' 💤'); + return [4 /*yield*/, sleep(1000)]; + case 2: + _a.sent(); + process.stdout.write(' 💤'); + return [4 /*yield*/, sleep(1000)]; + case 3: + _a.sent(); + process.stdout.write(' 💤'); + return [4 /*yield*/, sleep(1000)]; + case 4: + _a.sent(); + process.stdout.write(' ↩️'); + return [4 /*yield*/, sleep(1000)]; + case 5: + _a.sent(); + process.stdout.write("\r\x1b[K"); + return [2 /*return*/]; + } + }); }); - - sr.registerTraceHandler(trace_handler); - sr.start(); } - -const run = async (config) => { - console.log(`Starting EOS watcher for ETH oracle ${config.eth.oracleAccount}`); - - let start_block; - if (typeof process.argv[2] !== 'undefined'){ - start_block = parseInt(process.argv[2]); - if (isNaN(start_block)){ - console.error(`Start block must be a number`); - process.exit(1); - } - } - else { - const info = await rpc.get_info(); - start_block = info.head_block_num; - } - - console.log(`Starting tx dispatcher`); - tx_dispatcher = fork('./txdispatch', [JSON.stringify(config)]); - tx_dispatcher.on('message', (msg) => { - const json = JSON.parse(msg); - if (json.type === 'success'){ - console.log(`Pushed confirmation with txid ${json.txid}`); - } - else if (json.type === 'error'){ - console.error(`Error pushing signature ${json.message}`); - setTimeout(() => { - tx_dispatcher.send(JSON.stringify(json.actions)); - }, 1000); +/** + * Run the process of signing eosio chain teleports to eth chain + */ +var run = function () { return __awaiter(void 0, void 0, void 0, function () { + var params, signProcessData; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Starting EOS watcher for ETH oracle ".concat(config.eth.oracleAccount)); + params = getConsoleParams(); + signProcessData = { lowerId: params.id, amount: 100 }; + _a.label = 1; + case 1: + if (!true) return [3 /*break*/, 4]; + eos_api.nextEndpoint(); + return [4 /*yield*/, signAllTeleportsUntilNow(signProcessData)]; + case 2: + _a.sent(); + return [4 /*yield*/, WaitAnimation()]; + case 3: + _a.sent(); + return [3 /*break*/, 1]; + case 4: return [2 /*return*/]; } }); - - start(config, start_block); -} - -run(config); +}); }; +run(); diff --git a/oracle/oracle-eos.ts b/oracle/oracle-eos.ts new file mode 100644 index 0000000..1b34ef1 --- /dev/null +++ b/oracle/oracle-eos.ts @@ -0,0 +1,341 @@ +import { RpcError, Serialize } from "eosjs"; +import { GetTableRowsResult } from 'eosjs/dist/eosjs-rpc-interfaces'; +import { JsSignatureProvider } from "eosjs/dist/eosjs-jssig"; +import { TextDecoder, TextEncoder } from "text-encoding"; +import { ecsign, keccak, toRpcSig } from "ethereumjs-util"; +import { EosApi } from './eosEndpointSwitcher' +import { ConfigType } from './CommonTypes'; + +interface TeleportTableEntry{ + id: number, + time: number, + account: string, + quantity: string, + chain_id: number, + eth_address: string, + oracles: Array, + signatures: Array, + claimed: boolean +} + +// Load config and set title +const config_file = process.env['CONFIG'] || './config'; +const config : ConfigType = require(config_file); +process.title = `oracle-eos ${config_file}`; + +// Configure eosjs specific propperties +const signatureProvider = new JsSignatureProvider([config.eos.privateKey]); +const eos_api = new EosApi(config.eos.chainId, config.eos.endpoints, signatureProvider) + +/** + * Convert an Uint8Array to an hex in string format + * @param bytes Uint8Array + * @returns Hex in string format + */ +function toHexString(bytes: Uint8Array){ + return bytes.reduce((str, byte) => str + byte.toString(16).padStart(2, '0'), '') +} + +/** + * Convert a hex in string format to an Uint8Array + * @param hexString Hex in string format + * @returns Uint8Array + */ +function fromHexString(hexString: string){ + let str = hexString.match(/.{1,2}/g) + return str == null? new Uint8Array() : new Uint8Array(str.map(byte => parseInt(byte, 16))) +} + +/** + * Use this function with await to let the thread sleep for the defined amount of time + * @param ms Milliseconds + */ +const sleep = async (ms: number) => { + return new Promise((resolve) => { + setTimeout(resolve, ms); + }); +}; + +/** + * Send sign a teleport. Repeats itself until a defined amount of tries are reached + * @param id Teleport id + * @param signature Signature of this oracle + * @param tries Already passed tries + */ +async function sendSignAction(id: number, signature: string, tries = 0){ + try{ + console.log(`Teleport id ${id}, try to send signature ${tries}.`) + const result = await eos_api.getAPI().transact({ + actions: [{ + account: config.eos.teleportContract, + name: 'sign', + authorization: [{ + actor: config.eos.oracleAccount, + permission: config.eos.oraclePermission || 'active', + }], + data: { + oracle_name: config.eos.oracleAccount, + id, + signature + }, + }] + }, { + blocksBehind: 3, + expireSeconds: 30, + }); + } catch (e) { + console.error(`\nCaught exception: ${e} \n`); + let retry = true + if (e instanceof RpcError){ + if('code' in e.json){ + switch(e.json.code){ + case 401: // Unauthorized + retry = false + break + } + } + } + tries++ + if(tries < config.eos.endpoints.length && retry){ + await eos_api.nextEndpoint() + await sendSignAction(id, signature, tries) + } else { + console.error(`Teleport id ${id}, skip sign action. ❌`) + } + return + } + console.log(`Teleport id ${id}, successful send sign action. ✔️`) +} + +/** + * Get table rows + * @param lower_bound Start teleport id + * @param limit Amount of requested rows + * @param json True for entries in json format and false for raw (string) format + * @returns Teleport table rows result + */ +async function getTableRows(lower_bound: number, limit: number, json = true){ + let retries = 0 + let teleport_res : GetTableRowsResult | null = null + let gotTeleport = false + do{ + if(retries >= 10){ + throw new Error(`Got no result by endpoint ${eos_api.getEndpoint()}.`) + } + try{ + retries++ + teleport_res = await eos_api.getRPC().get_table_rows({ + json, + code: config.eos.teleportContract, + scope: config.eos.teleportContract, + table: 'teleports', + lower_bound, + // upper_bound: 100, + limit + }); + } catch(e){ + console.log(e) + await eos_api.nextEndpoint() + } + if(teleport_res == null || 'rows' in teleport_res == false){ + console.log(`Got no teleports. Try ${retries}.`) + } else { + gotTeleport = true + } + } while(!gotTeleport) + + return teleport_res as GetTableRowsResult; +} + +/** + * Serialize the table entry of a teleport + * @param teleport Parameters of a teleport table entry + * @param logSize Trim the serialized data to this size + * @returns Serialized data as Uint8Array + */ +function serializeLogData(teleport: {id: number, time: number, account: string, quantity: string, chain_id: number, eth_address: string}, logSize: number){ + // Serialize the values + const sb = new Serialize.SerialBuffer({ + textEncoder: new TextEncoder, + textDecoder: new TextDecoder + }); + sb.pushNumberAsUint64(teleport.id) + sb.pushUint32(teleport.time) + sb.pushName(teleport.account) + sb.pushAsset(teleport.quantity) + sb.push(teleport.chain_id) + sb.pushArray(fromHexString(teleport.eth_address)) + return sb.array.slice(0, logSize) +} + +/** + * Get signature for teleport data + * @param logData Serialized teleport table entry + * @returns Signature + */ +async function signTeleport(logData: Uint8Array){ + // Sha3 of the serilized values. Note: The same result is one parameter for the claim function on the eth chain + const logDataKeccak = keccak(Buffer.from(logData)) + + // console.log('logData', Buffer.from(logData).toString('hex')); + // console.log('logDataKeccak', logDataKeccak.toString('hex')); + + // Sign the sha3 hash + const ethPriKey = Buffer.from(config.eth.privateKey, "hex") + const sig = ecsign(logDataKeccak, ethPriKey) + toRpcSig(sig.v, sig.r, sig.s) + return toRpcSig(sig.v, sig.r, sig.s) +} + +/** + * Get the parameters which are defined via console + * @returns Parameters + */ +function getConsoleParams(){ + let id = 0; + if (typeof process.argv[2] !== 'undefined'){ + // Get id by console parameter + switch(process.argv[2]){ + case 'id': + if(typeof process.argv[3] == 'undefined'){ + console.error(`Missing id number.`); + process.exit(1); + } + id = parseInt(process.argv[3]) + if (isNaN(id)){ + console.error(`Start id must be a number.`); + process.exit(1); + } + break; + default: + console.error(`Undefined console parameter.`); + process.exit(1); + } + } + return { id } +} + +/** + * Get an amount of teleport entries as json, severall times from different endpoints for verification and the lowest amount of entries provided over all used endpoints + * @param request.lowerId Get endpoints beginning by this teleport id number + * @param request.amount Amount of requested teleports + * @returns teleport array in json format, array of teleport arrays in row format and minimum amount of provided entries + */ +async function getNextTeleports(request: {lowerId: number, amount: number}){ + // Get the next teleports in json format + const chain_data = await getTableRows(request.lowerId, request.amount, true) as GetTableRowsResult + let lowest_amount = chain_data.rows.length + + // Get the the teleports in raw format from other endpoints for verification + let verify_data : Array> = [] + const initialEndpoint = eos_api.getEndpoint() + for(let i = 1; i < config.eos.epVerifications; i++){ + await eos_api.nextEndpoint() + const vData = (await getTableRows(request.lowerId, request.amount, false) as GetTableRowsResult).rows as Array + verify_data.push(vData) + if(initialEndpoint == eos_api.getEndpoint()){ + console.error('No available endpoints for verification. ⛔') + process.exit(1) + } + // Handle only to the lowest amount of entries + if(lowest_amount > vData.length){ + lowest_amount = vData.length + } + } + return {chain_data, verify_data, lowest_amount} +} + +/** + * Sign all teleports + * @param signProcessData.lowerId Id of teleport to start from. Will be updated by the handled amount of teleports. + * @param signProcessData.amount Amount of requested teleports + */ +async function signAllTeleportsUntilNow(signProcessData: {lowerId: number, amount: number}){ + // Get next teleports + let {chain_data, verify_data, lowest_amount} = await getNextTeleports(signProcessData) + + for(let rowIndex = 0; rowIndex < lowest_amount; rowIndex++){ + const item = chain_data.rows[rowIndex] as TeleportTableEntry + // Check if already claimed anf if the required amount of signes is already reached + if(item.claimed){ + console.log(`Teleport id ${item.id}, is already claimed. ✔️`) + continue + } + // Check if the required amount of signes is already reached + if(item.oracles.length >= config.confirmations){ + console.log(`Teleport id ${item.id}, has already sufficient confirmations. ✔️`) + continue + } + // Check if this oracle account has already signed + if(item.oracles.find(oracle => oracle == config.eos.oracleAccount) != undefined){ + console.log(`Teleport id ${item.id}, has already signed. ✔️`) + continue + } + + // Serialize the teleport table entry + const logData = serializeLogData(item, 69) + const logDataHex = toHexString(logData) + + // Verify serialization + let isVerifyed = true + for(let i = 0; i < config.eos.epVerifications - 1; i++){ + if(logDataHex != verify_data[i][rowIndex].slice(0, logData.length * 2)){ + console.error(`Verification failed by ${eos_api.getEndpoint()}. ⚠️`) + isVerifyed = false + } + // console.log(`Teleport id ${item.id}, verified ${i + 1} times`); + } + + if(!isVerifyed){ + console.error(`Teleport id ${item.id}, skip this one. ❌`) + } else { + // Sign the serialized teleport + const signature = await signTeleport(logData) + + // Send signature to eosio chain + await sendSignAction(item.id, signature) + } + } + + // Set last handled teleport id and get next teleports + signProcessData.lowerId += lowest_amount + if(chain_data.more == true){ + await signAllTeleportsUntilNow(signProcessData) + } +} + +/** + * Wait 5 seconds + */ +async function WaitAnimation(){ + process.stdout.write('All available teleports signed\x1b[?25l') + await sleep(1000) + process.stdout.write(' 💤') + await sleep(1000) + process.stdout.write(' 💤') + await sleep(1000) + process.stdout.write(' 💤') + await sleep(1000) + process.stdout.write(' ↩️') + await sleep(1000) + process.stdout.write("\r\x1b[K") +} + +/** + * Run the process of signing eosio chain teleports to eth chain + */ +const run = async () => { + console.log(`Starting EOS watcher for ETH oracle ${config.eth.oracleAccount}`); + + // Get start id from console if defined + let params = getConsoleParams() + + const signProcessData = {lowerId: params.id, amount: 100} + while(true){ + eos_api.nextEndpoint() + await signAllTeleportsUntilNow(signProcessData) + await WaitAnimation() + } +} + +run(); \ No newline at end of file diff --git a/oracle/oracle-eth.js b/oracle/oracle-eth.js index f392a0d..09c7256 100755 --- a/oracle/oracle-eth.js +++ b/oracle/oracle-eth.js @@ -1,292 +1,514 @@ #!/usr/bin/env node - +"use strict"; /* This oracle listens to the ethereum blockchain for `Teleport` events. When an event is received, it will call the `received` action on the EOS chain */ - -process.title = `oracle-eth ${process.env['CONFIG']}`; - -const { Api, JsonRpc } = require('eosjs'); -const { TextDecoder, TextEncoder } = require('text-encoding'); -const { JsSignatureProvider } = require('eosjs/dist/eosjs-jssig'); -const fetch = require('node-fetch'); -const fs = require('fs'); -const ethers = require('ethers'); - -const config = require(process.env['CONFIG'] || './config'); - -const provider = new ethers.providers.StaticJsonRpcProvider(config.eth.endpoint); - -const signatureProvider = new JsSignatureProvider([config.eos.privateKey]); -const rpc = new JsonRpc(config.eos.endpoint, { fetch }); -const eos_api = new Api({ rpc, signatureProvider, textDecoder: new TextDecoder(), textEncoder: new TextEncoder() }); - -const network = config.network || 'ETH' -const blocks_file = `.oracle_${config.network}_block-${config.eth.oracleAccount}`; -const DEFAULT_BLOCKS_TO_WAIT = 5; -const claimed_topic = '0xf20fc6923b8057dd0c3b606483fcaa038229bb36ebc35a0040e3eaa39cf97b17'; -const teleport_topic = '0x622824274e0937ee319b036740cd0887131781bc2032b47eac3e88a1be17f5d5'; - -const sleep = async (ms) => { - return new Promise(resolve => { - setTimeout(resolve, ms); - }) -} - -const await_confirmation = async (txid) => { - return new Promise(async resolve => { - let resolved = false; - while (!resolved) { - provider.getTransactionReceipt(txid).then(receipt => { - if (receipt && receipt.confirmations > DEFAULT_BLOCKS_TO_WAIT) { - console.log(`TX ${txid} has ${receipt.confirmations} confirmations`); - resolve(receipt); - resolved = true; - } - }); - await sleep(10000); - } +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); }); -} - -const load_block = async () => { - let block_number = 'latest'; - if (fs.existsSync(blocks_file)) { - const file_contents = await fs.readFileSync(blocks_file); - if (file_contents) { - block_number = parseInt(file_contents); - if (isNaN(block_number)) { - block_number = 'latest'; - } - else { - // for fresh start go back 50 blocks - block_number -= 50; +}; +var __generator = (this && this.__generator) || function (thisArg, body) { + var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; + return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; + function verb(n) { return function (v) { return step([n, v]); }; } + function step(op) { + if (f) throw new TypeError("Generator is already executing."); + while (_) try { + if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; + if (y = 0, t) op = [op[0] & 2, t.value]; + switch (op[0]) { + case 0: case 1: t = op; break; + case 4: _.label++; return { value: op[1], done: false }; + case 5: _.label++; y = op[1]; op = [0]; continue; + case 7: op = _.ops.pop(); _.trys.pop(); continue; + default: + if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } + if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } + if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } + if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } + if (t[2]) _.ops.pop(); + _.trys.pop(); continue; } - } + op = body.call(thisArg, _); + } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } + if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; } - - return block_number; -} -const save_block = async (block_num) => { - await fs.writeFileSync(blocks_file, block_num.toString()); -} - -const process_claimed = async (from_block, to_block) => { - return new Promise(async (resolve, reject) => { - try { - const query = { - fromBlock: from_block, - toBlock: to_block, - address: config.eth.teleportContract, - topics: [claimed_topic] - }; - // console.log(query); - const res = await provider.getLogs(query); - // console.log(res); - if (res.length) { - for (let r = 0; r < res.length; r++) { - const data = await ethers.utils.defaultAbiCoder.decode(['uint64', 'address', 'uint'], res[r].data); - - // console.log(res[r], data, data[1].toString()); - const id = data[0].toNumber(); - const to_eth = data[1].replace('0x', '') + '000000000000000000000000'; - const quantity = (data[2].toNumber() / Math.pow(10, config.precision)).toFixed(config.precision) + ' ' + config.symbol; - const actions = []; - actions.push({ +}; +var __asyncValues = (this && this.__asyncValues) || function (o) { + if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined."); + var m = o[Symbol.asyncIterator], i; + return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i); + function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; } + function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); } +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.extractEthTeleportData = exports.extractEthClaimedData = void 0; +process.title = "oracle-eth ".concat(process.env['CONFIG']); +var fs_1 = __importDefault(require("fs")); +var ethers_1 = require("ethers"); +var eosio_helpers_1 = require("eosio-helpers"); +var yargs_1 = __importDefault(require("yargs")); +var config = require(process.env['CONFIG'] || './config'); +var provider = new ethers_1.ethers.providers.StaticJsonRpcProvider(config.eth.endpoint); +var network = config.eth.network; +var blocks_file_name = ".oracle_".concat(network, "_block-").concat(config.eth.oracleAccount); +var DEFAULT_BLOCKS_TO_WAIT = 5; +var claimed_topic = '0xf20fc6923b8057dd0c3b606483fcaa038229bb36ebc35a0040e3eaa39cf97b17'; +var teleport_topic = '0x622824274e0937ee319b036740cd0887131781bc2032b47eac3e88a1be17f5d5'; +var precision = 4; +var await_confirmation = function (txid) { return __awaiter(void 0, void 0, void 0, function () { + return __generator(this, function (_a) { + return [2 /*return*/, new Promise(function (resolve) { return __awaiter(void 0, void 0, void 0, function () { + var resolved; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + resolved = false; + _a.label = 1; + case 1: + if (!!resolved) return [3 /*break*/, 3]; + provider.getTransactionReceipt(txid).then(function (receipt) { + if (receipt && receipt.confirmations > DEFAULT_BLOCKS_TO_WAIT) { + console.log("TX ".concat(txid, " has ").concat(receipt.confirmations, " confirmations")); + resolve(receipt); + resolved = true; + } + }); + return [4 /*yield*/, (0, eosio_helpers_1.Sleep)(10000)]; + case 2: + _a.sent(); + return [3 /*break*/, 1]; + case 3: return [2 /*return*/]; + } + }); + }); })]; + }); +}); }; +/** + * Loads a block number from a saved file if one exists or throws an error. + * @returns a saved block number from a file + */ +var load_block_number_from_file = function (blocks_file) { + if (blocks_file === void 0) { blocks_file = blocks_file_name; } + return __awaiter(void 0, void 0, void 0, function () { + var file_contents, block_number; + return __generator(this, function (_a) { + // let block_number: string | number = 'latest'; + if (!fs_1.default.existsSync(blocks_file)) + throw new Error('block file does not exist.'); + file_contents = fs_1.default.readFileSync(blocks_file).toString(); + if (!file_contents) + throw new Error('No blocks file'); + block_number = parseInt(file_contents); + if (isNaN(block_number)) + throw new Error('No block number in file.'); + return [2 /*return*/, block_number]; + }); + }); +}; +var save_block_to_file = function (block_num, blocks_file) { + if (blocks_file === void 0) { blocks_file = blocks_file_name; } + return __awaiter(void 0, void 0, void 0, function () { + return __generator(this, function (_a) { + fs_1.default.writeFileSync(blocks_file, block_num.toString()); + return [2 /*return*/]; + }); + }); +}; +var extractEthClaimedData = function (data) { + var id = data[0].toNumber(); + var to_eth = data[1].replace('0x', '') + '000000000000000000000000'; + var quantity = (data[2].toNumber() / Math.pow(10, precision)).toFixed(precision) + ' ' + config.symbol; + return { oracle_name: config.eos.oracleAccount, id: id, to_eth: to_eth, quantity: quantity, }; +}; +exports.extractEthClaimedData = extractEthClaimedData; +var extractEthTeleportData = function (data, transactionHash) { + var tokens = data[1].toNumber(); + if (tokens <= 0) { + throw new Error('Tokens are less than or equal to 0'); + } + var to = data[0]; + var chain_id = data[2].toNumber(); + var amount = (tokens / Math.pow(10, config.precision)).toFixed(config.precision); + var quantity = "".concat(amount, " ").concat(config.symbol); + var txid = transactionHash.replace(/^0x/, ''); + return { chain_id: chain_id, confirmed: true, quantity: quantity, to: to, oracle_name: config.eos.oracleAccount, ref: txid }; +}; +exports.extractEthTeleportData = extractEthTeleportData; +var process_claimed = function (from_block, to_block, submit_to_blockchain) { return __awaiter(void 0, void 0, void 0, function () { + var query, res, res_1, res_1_1, _a, transactionHash, data, decodedData, eosioData, actions, eos_res, e_1, e_2_1; + var e_2, _b; + return __generator(this, function (_c) { + switch (_c.label) { + case 0: + query = { + fromBlock: from_block, + toBlock: to_block, + address: config.eth.teleportContract, + topics: [claimed_topic], + }; + return [4 /*yield*/, provider.getLogs(query)]; + case 1: + res = _c.sent(); + _c.label = 2; + case 2: + _c.trys.push([2, 11, 12, 17]); + res_1 = __asyncValues(res); + _c.label = 3; + case 3: return [4 /*yield*/, res_1.next()]; + case 4: + if (!(res_1_1 = _c.sent(), !res_1_1.done)) return [3 /*break*/, 10]; + _a = res_1_1.value, transactionHash = _a.transactionHash, data = _a.data; + decodedData = ethers_1.ethers.utils.defaultAbiCoder.decode(['uint64', 'address', 'uint'], data); + eosioData = (0, exports.extractEthClaimedData)(decodedData); + // wait for confirmation of each transaction before continuing + return [4 /*yield*/, await_confirmation(transactionHash)]; + case 5: + // wait for confirmation of each transaction before continuing + _c.sent(); + actions = [ + { account: config.eos.teleportContract, name: 'claimed', - authorization: [{ - actor: config.eos.oracleAccount, - permission: config.eos.oraclePermission || 'active' - }], - data: { - oracle_name: config.eos.oracleAccount, - id, - to_eth, - quantity - } - }); - // console.log(actions, res[r].transactionHash); - - await_confirmation(res[r].transactionHash).then(async () => { - try { - const eos_res = await eos_api.transact({ actions }, { - blocksBehind: 3, - expireSeconds: 180, - }); - console.log(`Sent notification of claim with txid ${eos_res.transaction_id}, for ID ${id}, account 0x${to_eth.substr(0, 40)}, quantity ${quantity}`); - // resolve(); - } - catch (e) { - if (e.message.indexOf('Already marked as claimed') > -1) { - console.log(`ID ${id} is already claimed, account 0x${to_eth.substr(0, 40)}, quantity ${quantity}`); - } - else { - console.error(`Error sending confirm ${e.message}`); - // reject(e); - } - } - }); - - await sleep(500); + authorization: [ + { + actor: config.eos.oracleAccount, + permission: config.eos.oraclePermission || 'active', + }, + ], + data: eosioData, + }, + ]; + _c.label = 6; + case 6: + _c.trys.push([6, 8, , 9]); + return [4 /*yield*/, (0, eosio_helpers_1.SingleRun)({ + actions: actions, + eos_endpoint: config.eos.endpoints[0], + submit_to_blockchain: submit_to_blockchain, + private_keys: [{ pk: config.eos.privateKey }], + })]; + case 7: + eos_res = _c.sent(); + console.log("Sent notification of claim with txid ".concat(eos_res.transaction_id, ", for ID ").concat(eosioData.id, ", account 0x").concat(eosioData.to_eth.substring(0, 40), ", quantity ").concat(eosioData.quantity)); + return [3 /*break*/, 9]; + case 8: + e_1 = _c.sent(); + if (e_1.message.indexOf('Already marked as claimed') > -1) { + console.log("ID ".concat(eosioData.id, " is already claimed, account 0x").concat(eosioData.to_eth.substring(0, 40), ", quantity ").concat(eosioData.quantity)); } - } - - resolve(); - } - catch (e) { - reject(e); + else { + console.error("Error sending confirm ".concat(e_1.message)); + } + return [3 /*break*/, 9]; + case 9: return [3 /*break*/, 3]; + case 10: return [3 /*break*/, 17]; + case 11: + e_2_1 = _c.sent(); + e_2 = { error: e_2_1 }; + return [3 /*break*/, 17]; + case 12: + _c.trys.push([12, , 15, 16]); + if (!(res_1_1 && !res_1_1.done && (_b = res_1.return))) return [3 /*break*/, 14]; + return [4 /*yield*/, _b.call(res_1)]; + case 13: + _c.sent(); + _c.label = 14; + case 14: return [3 /*break*/, 16]; + case 15: + if (e_2) throw e_2.error; + return [7 /*endfinally*/]; + case 16: return [7 /*endfinally*/]; + case 17: return [2 /*return*/]; } }); -} - -const process_teleported = async (from_block, to_block) => { - return new Promise(async (resolve, reject) => { - try { - const query = { - fromBlock: from_block, - toBlock: to_block, - address: config.eth.teleportContract, - topics: [teleport_topic] - }; - // console.log(query); - const res = await provider.getLogs(query); - // console.log(res); - if (res.length) { - for (let r = 0; r < res.length; r++) { - const data = ethers.utils.defaultAbiCoder.decode(['string', 'uint', 'uint'], res[r].data); - - // console.log(res[r], data, data[1].toString()) - - const tokens = data[1].toNumber(); - if (tokens <= 0) { - // console.error(data); - console.error('Tokens are less than or equal to 0'); - continue; - } - const to = data[0]; - const chain_id = data[2].toNumber(); - const amount = (tokens / Math.pow(10, config.precision)).toFixed(config.precision); - const quantity = `${amount} ${config.symbol}` - const txid = res[r].transactionHash.replace(/^0x/, ''); - - const actions = []; - actions.push({ +}); }; +var process_teleported = function (from_block, to_block, submit_to_blockchain) { return __awaiter(void 0, void 0, void 0, function () { + var query, res, res_2, res_2_1, _a, transactionHash, data, decodedData, eosioData, actions, eos_res, e_3, e_4_1; + var e_4, _b; + return __generator(this, function (_c) { + switch (_c.label) { + case 0: + query = { + fromBlock: from_block, + toBlock: to_block, + address: config.eth.teleportContract, + topics: [teleport_topic], + }; + return [4 /*yield*/, provider.getLogs(query)]; + case 1: + res = _c.sent(); + _c.label = 2; + case 2: + _c.trys.push([2, 13, 14, 19]); + res_2 = __asyncValues(res); + _c.label = 3; + case 3: return [4 /*yield*/, res_2.next()]; + case 4: + if (!(res_2_1 = _c.sent(), !res_2_1.done)) return [3 /*break*/, 12]; + _a = res_2_1.value, transactionHash = _a.transactionHash, data = _a.data; + decodedData = ethers_1.ethers.utils.defaultAbiCoder.decode(['string', 'uint', 'uint'], data); + eosioData = (0, exports.extractEthTeleportData)(decodedData, transactionHash); + return [4 /*yield*/, await_confirmation(transactionHash)]; + case 5: + _c.sent(); + actions = [ + { account: config.eos.teleportContract, name: 'received', - authorization: [{ - actor: config.eos.oracleAccount, - permission: config.eos.oraclePermission || 'active' - }], - data: { - oracle_name: config.eos.oracleAccount, - to, - ref: txid, - quantity, - chain_id, - confirmed: true - } - }); - // console.log(actions); - - await_confirmation(res[r].transactionHash).then(async () => { - try { - const eos_res = await eos_api.transact({ actions }, { - blocksBehind: 3, - expireSeconds: 180, - }); - console.log(`Sent notification of teleport with txid ${eos_res.transaction_id}`); - // resolve(); - } - catch (e) { - if (e.message.indexOf('Oracle has already approved') > -1) { - console.log('Oracle has already approved'); - } - else { - console.error(`Error sending teleport ${e.message}`); - // reject(e); - } - } - }); - - await sleep(500); + authorization: [ + { + actor: config.eos.oracleAccount, + permission: config.eos.oraclePermission || 'active', + }, + ], + data: eosioData, + }, + ]; + _c.label = 6; + case 6: + _c.trys.push([6, 8, , 9]); + return [4 /*yield*/, (0, eosio_helpers_1.SingleRun)({ + actions: actions, + eos_endpoint: config.eos.endpoints[0], + submit_to_blockchain: submit_to_blockchain, + private_keys: [{ pk: config.eos.privateKey }], + })]; + case 7: + eos_res = _c.sent(); + console.log("Sent notification of teleport with txid ".concat(eos_res.transaction_id)); + return [3 /*break*/, 9]; + case 8: + e_3 = _c.sent(); + if (e_3.message.indexOf('Oracle has already approved') > -1) { + console.log('Oracle has already approved'); } - } - - resolve(); - } - catch (e) { - reject(e); - } - }) -} - -const run = async (from_block = 'latest') => { - while (true) { - try { - const block = await provider.getBlock('latest'); - const latest_block = block.number; - - if (from_block === 'latest') { - // load last seen block from file - from_block = await load_block(); - if (from_block !== 'latest') { - console.log(`Starting from save block of ${from_block}`) + else { + console.error("Error sending teleport ".concat(e_3.message)); } - } - if (from_block === 'latest') { - // could not get block from file and it wasn't specified (go back 100 blocks) + return [3 /*break*/, 9]; + case 9: + { + //if (res.length) { + // for (let r = 0; r < res.length; r++) { + // const data = ethers.utils.defaultAbiCoder.decode( + // ['string', 'uint', 'uint'], + // res[r].data + // ); + // console.log(res[r], data, data[1].toString()) + // const tokens = data[1].toNumber(); + // if (tokens <= 0) { + // // console.error(data); + // console.error('Tokens are less than or equal to 0'); + // continue; + // } + // const to = data[0]; + // const chain_id = data[2].toNumber(); + // const amount = (tokens / Math.pow(10, config.precision)).toFixed( + // config.precision + // ); + // const quantity = `${amount} ${config.symbol}`; + // const txid = res[r].transactionHash.replace(/^0x/, ''); + // const actions: EosioAction[] = []; + // actions.push({ + // account: config.eos.teleportContract, + // name: 'received', + // authorization: [ + // { + // actor: config.eos.oracleAccount, + // permission: config.eos.oraclePermission || 'active', + // }, + // ], + // data: { + // oracle_name: config.eos.oracleAccount, + // to, + // ref: txid, + // quantity, + // chain_id, + // confirmed: true, + // }, + // }); + // // console.log(actions); + // await_confirmation(res[r].transactionHash).then(async () => { + // try { + // const eos_res = await eos_api.transact( + // { actions }, + // { + // blocksBehind: 3, + // expireSeconds: 180, + // } + // ); + // console.log( + // `Sent notification of teleport with txid ${eos_res.transaction_id}` + // ); + // // resolve(); + // } catch (e) { + // if (e.message.indexOf('Oracle has already approved') > -1) { + // console.log('Oracle has already approved'); + // } else { + // console.error(`Error sending teleport ${e.message}`); + // // reject(e); + // } + // } + // }); + } + return [4 /*yield*/, (0, eosio_helpers_1.Sleep)(500)]; + case 10: + _c.sent(); + _c.label = 11; + case 11: return [3 /*break*/, 3]; + case 12: return [3 /*break*/, 19]; + case 13: + e_4_1 = _c.sent(); + e_4 = { error: e_4_1 }; + return [3 /*break*/, 19]; + case 14: + _c.trys.push([14, , 17, 18]); + if (!(res_2_1 && !res_2_1.done && (_b = res_2.return))) return [3 /*break*/, 16]; + return [4 /*yield*/, _b.call(res_2)]; + case 15: + _c.sent(); + _c.label = 16; + case 16: return [3 /*break*/, 18]; + case 17: + if (e_4) throw e_4.error; + return [7 /*endfinally*/]; + case 18: return [7 /*endfinally*/]; + case 19: return [2 /*return*/]; + } + }); +}); }; +var run = function (start_ref, submit_to_blockchain) { return __awaiter(void 0, void 0, void 0, function () { + var from_block, block, latest_block, err_1, to_block, e_5; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + if (!true) return [3 /*break*/, 19]; + _a.label = 1; + case 1: + _a.trys.push([1, 17, , 18]); + return [4 /*yield*/, provider.getBlock('latest')]; + case 2: + block = _a.sent(); + latest_block = block.number; + if (!!from_block) return [3 /*break*/, 8]; + if (!(start_ref === 'latest')) return [3 /*break*/, 7]; + _a.label = 3; + case 3: + _a.trys.push([3, 5, , 6]); + return [4 /*yield*/, load_block_number_from_file()]; + case 4: + from_block = _a.sent(); + // for fresh start go back 50 blocks + from_block -= 50; + console.log("Starting from saved block with additional previous 50 blocks for safety: ".concat(from_block, ". ")); + return [3 /*break*/, 6]; + case 5: + err_1 = _a.sent(); + console.log(err_1); + // could not get block from file and it wasn't specified (go back 100 blocks from latest) from_block = latest_block - 100; - // console.log(block, from_block) - } - let to_block = Math.min(from_block + 100, latest_block) - - if (from_block >= latest_block) { - console.log(`Up to date at block ${to_block}`); - await sleep(10000); - } - console.log(`Getting events from block ${from_block} to ${to_block}`) - - await process_claimed(from_block, to_block); - await process_teleported(from_block, to_block); - - from_block = to_block; - - // save last block received - await save_block(to_block); - - if (latest_block - from_block <= 1000) { + return [3 /*break*/, 6]; + case 6: return [3 /*break*/, 8]; + case 7: + if (typeof start_ref === 'number') { + from_block = start_ref; + } + else { + from_block = config.eth.genesisBlock; + } + _a.label = 8; + case 8: + if (from_block < 0) { + from_block = 0; + } + to_block = Math.min(from_block + 100, latest_block); + if (!(start_ref >= latest_block)) return [3 /*break*/, 10]; + console.log("Up to date at block ".concat(to_block)); + return [4 /*yield*/, (0, eosio_helpers_1.Sleep)(10000)]; + case 9: + _a.sent(); + _a.label = 10; + case 10: + console.log("Getting events from block ".concat(from_block, " to ").concat(to_block)); + return [4 /*yield*/, process_claimed(from_block, to_block, submit_to_blockchain)]; + case 11: + _a.sent(); + return [4 /*yield*/, process_teleported(from_block, to_block, submit_to_blockchain)]; + case 12: + _a.sent(); + from_block = to_block; + // save last block received + return [4 /*yield*/, save_block_to_file(to_block)]; + case 13: + // save last block received + _a.sent(); + if (!(latest_block - from_block <= 1000)) return [3 /*break*/, 15]; console.log('Waiting...'); - await sleep(30000); - } - else { - console.log(`Not waiting... ${latest_block} - ${from_block}`); - } + return [4 /*yield*/, (0, eosio_helpers_1.Sleep)(30000)]; + case 14: + _a.sent(); + return [3 /*break*/, 16]; + case 15: + console.log("Not waiting... ".concat(latest_block, " - ").concat(from_block)); + _a.label = 16; + case 16: return [3 /*break*/, 18]; + case 17: + e_5 = _a.sent(); + console.error(e_5.message); + return [3 /*break*/, 18]; + case 18: return [3 /*break*/, 0]; + case 19: return [2 /*return*/]; } - catch (e) { - console.error(e.message); + }); +}); }; +(function () { return __awaiter(void 0, void 0, void 0, function () { + var startRef, _a, start_block, submit_to_blockchain, start_block_env; + return __generator(this, function (_b) { + switch (_b.label) { + case 0: + startRef = 'latest'; + return [4 /*yield*/, (0, yargs_1.default)(process.argv) + .option('start_block', { + alias: 's', + desc: 'start block to start scanning from', + number: true, + demandOption: false, + }) + .option('submit_to_blockchain', { + alias: 'b', + boolean: true, + description: 'boolean to determine if it should submit actions to Wax blockchain', + default: false, + demandOption: false, + }).argv]; + case 1: + _a = _b.sent(), start_block = _a.start_block, submit_to_blockchain = _a.submit_to_blockchain; + if (start_block) { + startRef = start_block; + } + else if (process.env['START_BLOCK']) { + start_block_env = parseInt(process.env['START_BLOCK']); + if (isNaN(start_block_env)) { + console.error("You must supply start block as an integer in env"); + process.exit(1); + } + startRef = start_block_env; + } + run(startRef, submit_to_blockchain); + return [2 /*return*/]; } - } -} - -let start_block = 'latest'; -if (process.argv[2]) { - const lb = parseInt(process.argv[2]); - if (isNaN(lb)) { - console.error(`You must supply start block as an integer on command line`); - process.exit(1); - } - start_block = lb; -} -else if (process.env['START_BLOCK']) { - const lb = parseInt(process.env['START_BLOCK']); - if (isNaN(lb)) { - console.error(`You must supply start block as an integer in env`); - process.exit(1); - } - start_block = lb; -} - -run(start_block); + }); +}); })().catch(function (e) { + console.error('error: ', e); +}); diff --git a/oracle/oracle-eth.ts b/oracle/oracle-eth.ts index ec26f72..31e9e0e 100755 --- a/oracle/oracle-eth.ts +++ b/oracle/oracle-eth.ts @@ -8,44 +8,26 @@ When an event is received, it will call the `received` action on the EOS chain process.title = `oracle-eth ${process.env['CONFIG']}`; -const { Api, JsonRpc } = require('eosjs'); -const { TextDecoder, TextEncoder } = require('text-encoding'); -const { JsSignatureProvider } = require('eosjs/dist/eosjs-jssig'); -const fetch = require('node-fetch'); -const fs = require('fs'); -const ethers = require('ethers'); +import fs from 'fs'; +import { ethers } from 'ethers'; +import { SingleRun, Sleep } from 'eosio-helpers'; +import yargs from 'yargs'; +import { ConfigType } from './CommonTypes'; -const config = require(process.env['CONFIG'] || './config'); +const config: ConfigType = require(process.env['CONFIG'] || './config'); const provider = new ethers.providers.StaticJsonRpcProvider( config.eth.endpoint ); -const signatureProvider = new JsSignatureProvider([config.eos.privateKey]); -const rpc = new JsonRpc(config.eos.endpoint, { fetch }); -const eos_api = new Api({ - rpc, - signatureProvider, - textDecoder: new TextDecoder(), - textEncoder: new TextEncoder(), -}); - -const network = config.network || 'ETH'; -const blocks_file = `.oracle_${config.network}_block-${config.eth.oracleAccount}`; +const network = config.eth.network; +const blocks_file_name = `.oracle_${network}_block-${config.eth.oracleAccount}`; const DEFAULT_BLOCKS_TO_WAIT = 5; -const claimed_topic = - '0xf20fc6923b8057dd0c3b606483fcaa038229bb36ebc35a0040e3eaa39cf97b17'; -const teleport_topic = - '0x622824274e0937ee319b036740cd0887131781bc2032b47eac3e88a1be17f5d5'; +const claimed_topic = '0xf20fc6923b8057dd0c3b606483fcaa038229bb36ebc35a0040e3eaa39cf97b17'; +const teleport_topic = '0x622824274e0937ee319b036740cd0887131781bc2032b47eac3e88a1be17f5d5'; const precision = 4; -const sleep = async (ms) => { - return new Promise((resolve) => { - setTimeout(resolve, ms); - }); -}; - -const await_confirmation = async (txid) => { +const await_confirmation = async (txid: string) => { return new Promise(async (resolve) => { let resolved = false; while (!resolved) { @@ -56,272 +38,338 @@ const await_confirmation = async (txid) => { resolved = true; } }); - await sleep(10000); + await Sleep(10000); } }); }; -const load_block = async () => { - let block_number = 'latest'; - if (fs.existsSync(blocks_file)) { - const file_contents = await fs.readFileSync(blocks_file); - if (file_contents) { - block_number = parseInt(file_contents); - if (isNaN(block_number)) { - block_number = 'latest'; - } else { - // for fresh start go back 50 blocks - block_number -= 50; - } - } - } +/** + * Loads a block number from a saved file if one exists or throws an error. + * @returns a saved block number from a file + */ +const load_block_number_from_file = async (blocks_file: string = blocks_file_name) => { + // let block_number: string | number = 'latest'; + if (!fs.existsSync(blocks_file)) + throw new Error('block file does not exist.'); + + const file_contents = fs.readFileSync(blocks_file).toString(); + if (!file_contents) throw new Error('No blocks file'); + + const block_number = parseInt(file_contents); + if (isNaN(block_number)) throw new Error('No block number in file.'); return block_number; }; -const save_block = async (block_num) => { - await fs.writeFileSync(blocks_file, block_num.toString()); + +const save_block_to_file = async (block_num: number, blocks_file: string = blocks_file_name) => { + fs.writeFileSync(blocks_file, block_num.toString()); }; -const process_claimed = async (from_block, to_block) => { - return new Promise(async (resolve, reject) => { +type eosio_claim_data = { + oracle_name: string; + id: string; + to_eth: string; + quantity: string; +}; + +type eosio_teleport_data = { + oracle_name: string; + to: string; + ref: string; + quantity: string; + chain_id: string; + confirmed: boolean; +}; + +export const extractEthClaimedData = (data: ethers.utils.Result): eosio_claim_data => { + const id = data[0].toNumber(); + const to_eth = data[1].replace('0x', '') + '000000000000000000000000'; + const quantity = (data[2].toNumber() / Math.pow(10, precision)).toFixed(precision) + ' ' + config.symbol; + return { oracle_name: config.eos.oracleAccount, id, to_eth, quantity, }; +}; + +export const extractEthTeleportData = (data: ethers.utils.Result, transactionHash: string): eosio_teleport_data => { + const tokens = data[1].toNumber(); + if (tokens <= 0) { + throw new Error('Tokens are less than or equal to 0'); + } + const to = data[0]; + const chain_id = data[2].toNumber(); + const amount = (tokens / Math.pow(10, config.precision)).toFixed( + config.precision + ); + const quantity = `${amount} ${config.symbol}`; + const txid = transactionHash.replace(/^0x/, ''); + + return { chain_id, confirmed: true, quantity, to, oracle_name: config.eos.oracleAccount, ref: txid }; +}; + +const process_claimed = async (from_block: number, to_block: number, submit_to_blockchain: boolean) => { + const query = { + fromBlock: from_block, + toBlock: to_block, + address: config.eth.teleportContract, + topics: [claimed_topic], + }; + const res = await provider.getLogs(query); + + // console.log(res); + + for await (const { transactionHash, data } of res) { + const decodedData = ethers.utils.defaultAbiCoder.decode( + ['uint64', 'address', 'uint'], + data + ); + + const eosioData = extractEthClaimedData(decodedData); + + // wait for confirmation of each transaction before continuing + await await_confirmation(transactionHash); + const actions = [ + { + account: config.eos.teleportContract, + name: 'claimed', + authorization: [ + { + actor: config.eos.oracleAccount, + permission: config.eos.oraclePermission || 'active', + }, + ], + data: eosioData, + }, + ]; + try { - const query = { - fromBlock: from_block, - toBlock: to_block, - address: config.eth.teleportContract, - topics: [claimed_topic], - }; - // console.log(query); - const res = await provider.getLogs(query); - // console.log(res); - if (res.length) { - for (let r = 0; r < res.length; r++) { - const data = await ethers.utils.defaultAbiCoder.decode( - ['uint64', 'address', 'uint'], - res[r].data - ); - - // console.log(res[r], data, data[1].toString()); - const id = data[0].toNumber(); - const to_eth = data[1].replace('0x', '') + '000000000000000000000000'; - const quantity = - (data[2].toNumber() / Math.pow(10, precision)).toFixed(precision) + - ' ' + - config.symbol; - const actions = []; - actions.push({ - account: config.eos.teleportContract, - name: 'claimed', - authorization: [ - { - actor: config.eos.oracleAccount, - permission: config.eos.oraclePermission || 'active', - }, - ], - data: { - oracle_name: config.eos.oracleAccount, - id, - to_eth, - quantity, - }, - }); - // console.log(actions, res[r].transactionHash); - - await_confirmation(res[r].transactionHash).then(async () => { - try { - const eos_res = await eos_api.transact( - { actions }, - { - blocksBehind: 3, - expireSeconds: 180, - } - ); - console.log( - `Sent notification of claim with txid ${ - eos_res.transaction_id - }, for ID ${id}, account 0x${to_eth.substr( - 0, - 40 - )}, quantity ${quantity}` - ); - // resolve(); - } catch (e) { - if (e.message.indexOf('Already marked as claimed') > -1) { - console.log( - `ID ${id} is already claimed, account 0x${to_eth.substr( - 0, - 40 - )}, quantity ${quantity}` - ); - } else { - console.error(`Error sending confirm ${e.message}`); - // reject(e); - } - } - }); - - await sleep(500); - } - } + const eos_res = await SingleRun({ + actions, + eos_endpoint: config.eos.endpoints[0], + submit_to_blockchain, + private_keys: [{ pk: config.eos.privateKey }], + }); + + console.log(`Sent notification of claim with txid ${eos_res.transaction_id}, for ID ${eosioData.id + }, account 0x${eosioData.to_eth.substring(0, 40)}, quantity ${eosioData.quantity}`); + + } catch (e: any) { + if (e.message.indexOf('Already marked as claimed') > -1) { - resolve(); - } catch (e) { - reject(e); + console.log(`ID ${eosioData.id} is already claimed, account 0x${eosioData.to_eth.substring(0, 40) + }, quantity ${eosioData.quantity}`); + + } else { + console.error(`Error sending confirm ${e.message}`); + } } - }); + } }; -const process_teleported = async (from_block, to_block) => { - return new Promise(async (resolve, reject) => { +const process_teleported = async (from_block: number, to_block: number, submit_to_blockchain: boolean) => { + const query = { + fromBlock: from_block, + toBlock: to_block, + address: config.eth.teleportContract, + topics: [teleport_topic], + }; + + const res = await provider.getLogs(query); + + for await (const { transactionHash, data } of res) { + const decodedData = ethers.utils.defaultAbiCoder.decode( + ['string', 'uint', 'uint'], + data + ); + + const eosioData = extractEthTeleportData(decodedData, transactionHash); + + await await_confirmation(transactionHash); + const actions = [ + { + account: config.eos.teleportContract, + name: 'received', + authorization: [ + { + actor: config.eos.oracleAccount, + permission: config.eos.oraclePermission || 'active', + }, + ], + data: eosioData, + }, + ]; + try { - const query = { - fromBlock: from_block, - toBlock: to_block, - address: config.eth.teleportContract, - topics: [teleport_topic], - }; - // console.log(query); - const res = await provider.getLogs(query); - // console.log(res); - if (res.length) { - for (let r = 0; r < res.length; r++) { - const data = ethers.utils.defaultAbiCoder.decode( - ['string', 'uint', 'uint'], - res[r].data - ); - - // console.log(res[r], data, data[1].toString()) - - const tokens = data[1].toNumber(); - if (tokens <= 0) { - // console.error(data); - console.error('Tokens are less than or equal to 0'); - continue; - } - const to = data[0]; - const chain_id = data[2].toNumber(); - const amount = (tokens / Math.pow(10, config.precision)).toFixed( - config.precision - ); - const quantity = `${amount} ${config.symbol}`; - const txid = res[r].transactionHash.replace(/^0x/, ''); - - const actions = []; - actions.push({ - account: config.eos.teleportContract, - name: 'received', - authorization: [ - { - actor: config.eos.oracleAccount, - permission: config.eos.oraclePermission || 'active', - }, - ], - data: { - oracle_name: config.eos.oracleAccount, - to, - ref: txid, - quantity, - chain_id, - confirmed: true, - }, - }); - // console.log(actions); - - await_confirmation(res[r].transactionHash).then(async () => { - try { - const eos_res = await eos_api.transact( - { actions }, - { - blocksBehind: 3, - expireSeconds: 180, - } - ); - console.log( - `Sent notification of teleport with txid ${eos_res.transaction_id}` - ); - // resolve(); - } catch (e) { - if (e.message.indexOf('Oracle has already approved') > -1) { - console.log('Oracle has already approved'); - } else { - console.error(`Error sending teleport ${e.message}`); - // reject(e); - } - } - }); - - await sleep(500); - } - } + const eos_res = await SingleRun({ + actions, + eos_endpoint: config.eos.endpoints[0], + submit_to_blockchain, + private_keys: [{ pk: config.eos.privateKey }], + }); - resolve(); - } catch (e) { - reject(e); + console.log(`Sent notification of teleport with txid ${eos_res.transaction_id}`); + } catch (e: any) { + if (e.message.indexOf('Oracle has already approved') > -1) { + console.log('Oracle has already approved'); + } else { + console.error(`Error sending teleport ${e.message}`); + } } - }); + { + //if (res.length) { + // for (let r = 0; r < res.length; r++) { + // const data = ethers.utils.defaultAbiCoder.decode( + // ['string', 'uint', 'uint'], + // res[r].data + // ); + // console.log(res[r], data, data[1].toString()) + // const tokens = data[1].toNumber(); + // if (tokens <= 0) { + // // console.error(data); + // console.error('Tokens are less than or equal to 0'); + // continue; + // } + // const to = data[0]; + // const chain_id = data[2].toNumber(); + // const amount = (tokens / Math.pow(10, config.precision)).toFixed( + // config.precision + // ); + // const quantity = `${amount} ${config.symbol}`; + // const txid = res[r].transactionHash.replace(/^0x/, ''); + // const actions: EosioAction[] = []; + // actions.push({ + // account: config.eos.teleportContract, + // name: 'received', + // authorization: [ + // { + // actor: config.eos.oracleAccount, + // permission: config.eos.oraclePermission || 'active', + // }, + // ], + // data: { + // oracle_name: config.eos.oracleAccount, + // to, + // ref: txid, + // quantity, + // chain_id, + // confirmed: true, + // }, + // }); + // // console.log(actions); + // await_confirmation(res[r].transactionHash).then(async () => { + // try { + // const eos_res = await eos_api.transact( + // { actions }, + // { + // blocksBehind: 3, + // expireSeconds: 180, + // } + // ); + // console.log( + // `Sent notification of teleport with txid ${eos_res.transaction_id}` + // ); + // // resolve(); + // } catch (e) { + // if (e.message.indexOf('Oracle has already approved') > -1) { + // console.log('Oracle has already approved'); + // } else { + // console.error(`Error sending teleport ${e.message}`); + // // reject(e); + // } + // } + // }); + } + + await Sleep(500); + } }; -const run = async (from_block = 'latest') => { +const run = async (start_ref: 'latest' | number, submit_to_blockchain: boolean) => { + let from_block: number | undefined; while (true) { try { const block = await provider.getBlock('latest'); const latest_block = block.number; - if (from_block === 'latest') { - // load last seen block from file - from_block = await load_block(); - if (from_block !== 'latest') { - console.log(`Starting from save block of ${from_block}`); + if (!from_block) { + if (start_ref === 'latest') { + try { + from_block = await load_block_number_from_file(); + + // for fresh start go back 50 blocks + from_block -= 50; + console.log(`Starting from saved block with additional previous 50 blocks for safety: ${from_block}. `); + } catch (err) { + console.log(err); + // could not get block from file and it wasn't specified (go back 100 blocks from latest) + from_block = latest_block - 100; + } + } else if (typeof start_ref === 'number') { + from_block = start_ref; + } else { + from_block = config.eth.genesisBlock; } } - if (from_block === 'latest') { - // could not get block from file and it wasn't specified (go back 100 blocks) - from_block = latest_block - 100; - // console.log(block, from_block) + if(from_block < 0){ + from_block = 0 } + let to_block = Math.min(from_block + 100, latest_block); - if (from_block >= latest_block) { + if (start_ref >= latest_block) { console.log(`Up to date at block ${to_block}`); - await sleep(10000); + await Sleep(10000); } console.log(`Getting events from block ${from_block} to ${to_block}`); - await process_claimed(from_block, to_block); - await process_teleported(from_block, to_block); + await process_claimed(from_block, to_block, submit_to_blockchain); + await process_teleported(from_block, to_block, submit_to_blockchain); from_block = to_block; // save last block received - await save_block(to_block); + await save_block_to_file(to_block); if (latest_block - from_block <= 1000) { console.log('Waiting...'); - await sleep(30000); + await Sleep(30000); } else { console.log(`Not waiting... ${latest_block} - ${from_block}`); } - } catch (e) { + } catch (e: any) { console.error(e.message); } } }; -let start_block = 'latest'; -if (process.argv[2]) { - const lb = parseInt(process.argv[2]); - if (isNaN(lb)) { - console.error(`You must supply start block as an integer on command line`); - process.exit(1); - } - start_block = lb; -} else if (process.env['START_BLOCK']) { - const lb = parseInt(process.env['START_BLOCK']); - if (isNaN(lb)) { - console.error(`You must supply start block as an integer in env`); - process.exit(1); +(async () => { + let startRef: 'latest' | number = 'latest'; + + let { start_block, submit_to_blockchain } = await yargs(process.argv) + .option('start_block', { + alias: 's', + desc: 'start block to start scanning from', + number: true, + demandOption: false, + }) + .option('submit_to_blockchain', { + alias: 'b', + boolean: true, + description: + 'boolean to determine if it should submit actions to Wax blockchain', + default: false, + demandOption: false, + }).argv; + + if (start_block) { + startRef = start_block; + } else if (process.env['START_BLOCK']) { + const start_block_env = parseInt(process.env['START_BLOCK']); + if (isNaN(start_block_env)) { + console.error(`You must supply start block as an integer in env`); + process.exit(1); + } + startRef = start_block_env; } - start_block = lb; -} -run(start_block); + run(startRef, submit_to_blockchain); +})().catch((e) => { + console.error('error: ', e); +}); \ No newline at end of file diff --git a/oracle/package.json b/oracle/package.json index 06d607c..919e81a 100644 --- a/oracle/package.json +++ b/oracle/package.json @@ -1,9 +1,10 @@ { "name": "alienteleport-oracle", - "version": "1.0.0", + "version": "1.1.0", "description": "", - "main": "index.js", "scripts": { + "eth": "tsc && node dist/oracle-eth.js", + "eos": "tsc && node dist/oracle-eos.js", "test": "echo \"Error: no test specified\" && exit 1" }, "author": "", @@ -11,15 +12,18 @@ "dependencies": { "@eosdacio/eosio-statereceiver": "^1.0.2", "abi-decoder": "^2.4.0", - "eosjs": "^22.0.0", + "child-process": "^1.0.2", + "cross-fetch": "^3.1.5", "eosio-helpers": "^0.1.4", + "eosjs": "^22.0.0", "ethereumjs-util": "^7.0.4", "ethers": "^5.3.1", - "node-fetch": "2.0", + "node-fetch": "^3.2.3", "text-encoding": "^0.7.0", "web3": "^1.2.11" }, "devDependencies": { - "@types/text-encoding": "0.0.36" + "@types/text-encoding": "0.0.36", + "@types/ethereumjs-util": "^6.1.0" } } diff --git a/oracle/tsconfig.json b/oracle/tsconfig.json new file mode 100644 index 0000000..117bc10 --- /dev/null +++ b/oracle/tsconfig.json @@ -0,0 +1,13 @@ + +{ + "compilerOptions": { + "target": "es5", + "module": "commonjs", + "strict": true, + "noImplicitAny": true, + "lib": ["es6", "es2015", "dom"], + "esModuleInterop": true, + // "sourceMap": true, + }, + "exclude": ["node_modules"] +} diff --git a/oracle/yarn.lock b/oracle/yarn.lock index 53925e0..d93c5ab 100644 --- a/oracle/yarn.lock +++ b/oracle/yarn.lock @@ -2,49 +2,31 @@ # yarn lockfile v1 -"@babel/runtime@7.6.0": - version "7.6.0" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.6.0.tgz#4fc1d642a9fd0299754e8b5de62c631cf5568205" - integrity sha512-89eSBLJsxNxOERC0Op4vd+0Bqm6wRMqMbFtV3i0/fbaWw/mJ8Q3eBvgX0G4SyrOOLCtbu98HspF8o09MRT+KzQ== - dependencies: - regenerator-runtime "^0.13.2" - -"@cspotcode/source-map-consumer@0.8.0": - version "0.8.0" - resolved "https://registry.yarnpkg.com/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz#33bf4b7b39c178821606f669bbc447a6a629786b" - integrity sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg== - -"@cspotcode/source-map-support@0.7.0": - version "0.7.0" - resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.7.0.tgz#4789840aa859e46d2f3173727ab707c66bf344f5" - integrity sha512-X4xqRHqN8ACt2aHVe51OxeA2HjbcL4MqFqXkrmQszJ1NOUuUu5u6Vqx/0lZSVNku7velL5FC/s5uEAj1lsBMhA== - dependencies: - "@cspotcode/source-map-consumer" "0.8.0" - "@eosdacio/eosio-statereceiver@^1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@eosdacio/eosio-statereceiver/-/eosio-statereceiver-1.0.2.tgz#42d0cbb89bee6e1d659f5483b9c7b50b12ea8d40" - integrity sha512-0Fdrwdtp3tXEkFQ3aLKfAg0SB5u9lCOlfe4v6EcX8kUYzIVv6uvNb62NBn9Ph3O4WLtFJ5AVig0EUEguDhyfdQ== + version "1.1.1" + resolved "https://registry.yarnpkg.com/@eosdacio/eosio-statereceiver/-/eosio-statereceiver-1.1.1.tgz#656abf8e3f8dbad70eb622515ceca7d0a706102c" + integrity sha512-dfpScXUdJjQ5yHSDdtlHwNQiK7nS8jLAQ+Ofto+bvLyY8a0rfE0tHF2m5kkwNB0uktvPa0FnkSDzIyF8K4yNxw== dependencies: - eosjs "^20.0.0" + eosjs "^21.0.3" text-encoding "^0.7.0" ws "^6.1.3" zlib "^1.0.5" -"@ethersproject/abi@5.0.0-beta.153": - version "5.0.0-beta.153" - resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.0.0-beta.153.tgz#43a37172b33794e4562999f6e2d555b7599a8eee" - integrity sha512-aXweZ1Z7vMNzJdLpR1CZUAIgnwjrZeUSvN9syCwlBaEBUFJmFY+HHnfuTI5vIhVs/mRkfJVrbEyl51JZQqyjAg== - dependencies: - "@ethersproject/address" ">=5.0.0-beta.128" - "@ethersproject/bignumber" ">=5.0.0-beta.130" - "@ethersproject/bytes" ">=5.0.0-beta.129" - "@ethersproject/constants" ">=5.0.0-beta.128" - "@ethersproject/hash" ">=5.0.0-beta.128" - "@ethersproject/keccak256" ">=5.0.0-beta.127" - "@ethersproject/logger" ">=5.0.0-beta.129" - "@ethersproject/properties" ">=5.0.0-beta.131" - "@ethersproject/strings" ">=5.0.0-beta.130" +"@ethereumjs/common@^2.5.0", "@ethereumjs/common@^2.6.3": + version "2.6.3" + resolved "https://registry.yarnpkg.com/@ethereumjs/common/-/common-2.6.3.tgz#39ddece7300b336276bad6c02f6a9f1a082caa05" + integrity sha512-mQwPucDL7FDYIg9XQ8DL31CnIYZwGhU5hyOO5E+BMmT71G0+RHvIT5rIkLBirJEKxV6+Rcf9aEIY0kXInxUWpQ== + dependencies: + crc-32 "^1.2.0" + ethereumjs-util "^7.1.4" + +"@ethereumjs/tx@^3.3.2": + version "3.5.1" + resolved "https://registry.yarnpkg.com/@ethereumjs/tx/-/tx-3.5.1.tgz#8d941b83a602b4a89949c879615f7ea9a90e6671" + integrity sha512-xzDrTiu4sqZXUcaBxJ4n4W5FrppwxLxZB4ZDGVLtxSQR4lVuOnFR6RcUHdg1mpUhAPVrmnzLJpxaeXnPxIyhWA== + dependencies: + "@ethereumjs/common" "^2.6.3" + ethereumjs-util "^7.1.4" "@ethersproject/abi@5.0.7": version "5.0.7" @@ -61,610 +43,345 @@ "@ethersproject/properties" "^5.0.3" "@ethersproject/strings" "^5.0.4" -"@ethersproject/abi@5.3.1", "@ethersproject/abi@^5.3.0": - version "5.3.1" - resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.3.1.tgz#69a1a496729d3a83521675a57cbe21f3cc27241c" - integrity sha512-F98FWTJG7nWWAQ4DcV6R0cSlrj67MWK3ylahuFbzkumem5cLWg1p7fZ3vIdRoS1c7TEf55Lvyx0w7ICR47IImw== - dependencies: - "@ethersproject/address" "^5.3.0" - "@ethersproject/bignumber" "^5.3.0" - "@ethersproject/bytes" "^5.3.0" - "@ethersproject/constants" "^5.3.0" - "@ethersproject/hash" "^5.3.0" - "@ethersproject/keccak256" "^5.3.0" - "@ethersproject/logger" "^5.3.0" - "@ethersproject/properties" "^5.3.0" - "@ethersproject/strings" "^5.3.0" - -"@ethersproject/abstract-provider@5.3.0", "@ethersproject/abstract-provider@^5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.3.0.tgz#f4c0ae4a4cef9f204d7781de805fd44b72756c81" - integrity sha512-1+MLhGP1GwxBDBNwMWVmhCsvKwh4gK7oIfOrmlmePNeskg1NhIrYssraJBieaFNHUYfKEd/1DjiVZMw8Qu5Cxw== - dependencies: - "@ethersproject/bignumber" "^5.3.0" - "@ethersproject/bytes" "^5.3.0" - "@ethersproject/logger" "^5.3.0" - "@ethersproject/networks" "^5.3.0" - "@ethersproject/properties" "^5.3.0" - "@ethersproject/transactions" "^5.3.0" - "@ethersproject/web" "^5.3.0" - -"@ethersproject/abstract-provider@^5.0.8": - version "5.0.10" - resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.0.10.tgz#a533aed39a5f27312745c8c4c40fa25fc884831c" - integrity sha512-OSReY5iz94iIaPlRvLiJP8YVIvQLx4aUvMMnHWSaA/vTU8QHZmgNlt4OBdYV1+aFY8Xl+VRYiWBHq72ZDKXXCQ== - dependencies: - "@ethersproject/bignumber" "^5.0.13" - "@ethersproject/bytes" "^5.0.9" - "@ethersproject/logger" "^5.0.8" - "@ethersproject/networks" "^5.0.7" - "@ethersproject/properties" "^5.0.7" - "@ethersproject/transactions" "^5.0.9" - "@ethersproject/web" "^5.0.12" - -"@ethersproject/abstract-signer@5.3.0", "@ethersproject/abstract-signer@^5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.3.0.tgz#05172b653e15b535ed5854ef5f6a72f4b441052d" - integrity sha512-w8IFwOYqiPrtvosPuArZ3+QPR2nmdVTRrVY8uJYL3NNfMmQfTy3V3l2wbzX47UUlNbPJY+gKvzJAyvK1onZxJg== - dependencies: - "@ethersproject/abstract-provider" "^5.3.0" - "@ethersproject/bignumber" "^5.3.0" - "@ethersproject/bytes" "^5.3.0" - "@ethersproject/logger" "^5.3.0" - "@ethersproject/properties" "^5.3.0" - -"@ethersproject/abstract-signer@^5.0.10": - version "5.0.14" - resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.0.14.tgz#30ef912b0f86599d90fdffc65c110452e7b55cf1" - integrity sha512-JztBwVO7o5OHLh2vyjordlS4/1EjRyaECtc8vPdXTF1i4dXN+J0coeRoPN6ZFbBvi/YbaB6br2fvqhst1VQD/g== - dependencies: - "@ethersproject/abstract-provider" "^5.0.8" - "@ethersproject/bignumber" "^5.0.13" - "@ethersproject/bytes" "^5.0.9" - "@ethersproject/logger" "^5.0.8" - "@ethersproject/properties" "^5.0.7" - -"@ethersproject/address@5.3.0", "@ethersproject/address@^5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.3.0.tgz#e53b69eacebf332e8175de814c5e6507d6932518" - integrity sha512-29TgjzEBK+gUEUAOfWCG7s9IxLNLCqvr+oDSk6L9TXD0VLvZJKhJV479tKQqheVA81OeGxfpdxYtUVH8hqlCvA== - dependencies: - "@ethersproject/bignumber" "^5.3.0" - "@ethersproject/bytes" "^5.3.0" - "@ethersproject/keccak256" "^5.3.0" - "@ethersproject/logger" "^5.3.0" - "@ethersproject/rlp" "^5.3.0" - -"@ethersproject/address@>=5.0.0-beta.128", "@ethersproject/address@^5.0.3": - version "5.0.3" - resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.0.3.tgz#86489f836d1656135fa6cae56d9fd1ab5b2c95af" - integrity sha512-LMmLxL1wTNtvwgm/eegcaxtG/W7vHXKzHGUkK9KZEI9W+SfHrpT7cGX+hBcatcUXPANjS3TmOaQ+mq5JU5sGTw== - dependencies: - "@ethersproject/bignumber" "^5.0.6" - "@ethersproject/bytes" "^5.0.4" - "@ethersproject/keccak256" "^5.0.3" - "@ethersproject/logger" "^5.0.5" - "@ethersproject/rlp" "^5.0.3" - bn.js "^4.4.0" - -"@ethersproject/address@^5.0.4", "@ethersproject/address@^5.0.9": - version "5.0.11" - resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.0.11.tgz#12022e8c590c33939beb5ab18b401ecf585eac59" - integrity sha512-Et4GBdD8/tsBGjCEOKee9upN29qjL5kbRcmJifb4Penmiuh9GARXL2/xpXvEp5EW+EIW/rfCHFJrkYBgoQFQBw== +"@ethersproject/abi@5.6.0", "@ethersproject/abi@^5.6.0": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.6.0.tgz#ea07cbc1eec2374d32485679c12408005895e9f3" + integrity sha512-AhVByTwdXCc2YQ20v300w6KVHle9g2OFc28ZAFCPnJyEpkv1xKXjZcSTgWOlv1i+0dqlgF8RCF2Rn2KC1t+1Vg== + dependencies: + "@ethersproject/address" "^5.6.0" + "@ethersproject/bignumber" "^5.6.0" + "@ethersproject/bytes" "^5.6.0" + "@ethersproject/constants" "^5.6.0" + "@ethersproject/hash" "^5.6.0" + "@ethersproject/keccak256" "^5.6.0" + "@ethersproject/logger" "^5.6.0" + "@ethersproject/properties" "^5.6.0" + "@ethersproject/strings" "^5.6.0" + +"@ethersproject/abstract-provider@5.6.0", "@ethersproject/abstract-provider@^5.6.0": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.6.0.tgz#0c4ac7054650dbd9c476cf5907f588bbb6ef3061" + integrity sha512-oPMFlKLN+g+y7a79cLK3WiLcjWFnZQtXWgnLAbHZcN3s7L4v90UHpTOrLk+m3yr0gt+/h9STTM6zrr7PM8uoRw== + dependencies: + "@ethersproject/bignumber" "^5.6.0" + "@ethersproject/bytes" "^5.6.0" + "@ethersproject/logger" "^5.6.0" + "@ethersproject/networks" "^5.6.0" + "@ethersproject/properties" "^5.6.0" + "@ethersproject/transactions" "^5.6.0" + "@ethersproject/web" "^5.6.0" + +"@ethersproject/abstract-signer@5.6.0", "@ethersproject/abstract-signer@^5.6.0": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.6.0.tgz#9cd7ae9211c2b123a3b29bf47aab17d4d016e3e7" + integrity sha512-WOqnG0NJKtI8n0wWZPReHtaLkDByPL67tn4nBaDAhmVq8sjHTPbCdz4DRhVu/cfTOvfy9w3iq5QZ7BX7zw56BQ== dependencies: - "@ethersproject/bignumber" "^5.0.13" - "@ethersproject/bytes" "^5.0.9" - "@ethersproject/keccak256" "^5.0.7" - "@ethersproject/logger" "^5.0.8" - "@ethersproject/rlp" "^5.0.7" + "@ethersproject/abstract-provider" "^5.6.0" + "@ethersproject/bignumber" "^5.6.0" + "@ethersproject/bytes" "^5.6.0" + "@ethersproject/logger" "^5.6.0" + "@ethersproject/properties" "^5.6.0" -"@ethersproject/base64@5.3.0", "@ethersproject/base64@^5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.3.0.tgz#b831fb35418b42ad24d943c557259062b8640824" - integrity sha512-JIqgtOmgKcbc2sjGWTXyXktqUhvFUDte8fPVsAaOrcPiJf6YotNF+nsrOYGC9pbHBEGSuSBp3QR0varkO8JHEw== +"@ethersproject/address@5.6.0", "@ethersproject/address@^5.0.4", "@ethersproject/address@^5.6.0": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.6.0.tgz#13c49836d73e7885fc148ad633afad729da25012" + integrity sha512-6nvhYXjbXsHPS+30sHZ+U4VMagFC/9zAk6Gd/h3S21YW4+yfb0WfRtaAIZ4kfM4rrVwqiy284LP0GtL5HXGLxQ== dependencies: - "@ethersproject/bytes" "^5.3.0" + "@ethersproject/bignumber" "^5.6.0" + "@ethersproject/bytes" "^5.6.0" + "@ethersproject/keccak256" "^5.6.0" + "@ethersproject/logger" "^5.6.0" + "@ethersproject/rlp" "^5.6.0" -"@ethersproject/base64@^5.0.7": - version "5.0.9" - resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.0.9.tgz#bb1f35d3dba92082a574d5e2418f9202a0a1a7e6" - integrity sha512-37RBz5LEZ9SlTNGiWCYFttnIN9J7qVs9Xo2EbqGqDH5LfW9EIji66S+YDMpXVo1zWDax1FkEldAoatxHK2gfgA== +"@ethersproject/base64@5.6.0", "@ethersproject/base64@^5.6.0": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.6.0.tgz#a12c4da2a6fb86d88563216b0282308fc15907c9" + integrity sha512-2Neq8wxJ9xHxCF9TUgmKeSh9BXJ6OAxWfeGWvbauPh8FuHEjamgHilllx8KkSd5ErxyHIX7Xv3Fkcud2kY9ezw== dependencies: - "@ethersproject/bytes" "^5.0.9" + "@ethersproject/bytes" "^5.6.0" -"@ethersproject/basex@5.3.0", "@ethersproject/basex@^5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.3.0.tgz#02dea3ab8559ae625c6d548bc11773432255c916" - integrity sha512-8J4nS6t/SOnoCgr3DF5WCSRLC5YwTKYpZWJqeyYQLX+86TwPhtzvHXacODzcDII9tWKhVg6g0Bka8JCBWXsCiQ== +"@ethersproject/basex@5.6.0", "@ethersproject/basex@^5.6.0": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.6.0.tgz#9ea7209bf0a1c3ddc2a90f180c3a7f0d7d2e8a69" + integrity sha512-qN4T+hQd/Md32MoJpc69rOwLYRUXwjTlhHDIeUkUmiN/JyWkkLLMoG0TqvSQKNqZOMgN5stbUYN6ILC+eD7MEQ== dependencies: - "@ethersproject/bytes" "^5.3.0" - "@ethersproject/properties" "^5.3.0" + "@ethersproject/bytes" "^5.6.0" + "@ethersproject/properties" "^5.6.0" -"@ethersproject/bignumber@5.3.0", "@ethersproject/bignumber@^5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.3.0.tgz#74ab2ec9c3bda4e344920565720a6ee9c794e9db" - integrity sha512-5xguJ+Q1/zRMgHgDCaqAexx/8DwDVLRemw2i6uR8KyGjwGdXI8f32QZZ1cKGucBN6ekJvpUpHy6XAuQnTv0mPA== +"@ethersproject/bignumber@5.6.0", "@ethersproject/bignumber@^5.0.7", "@ethersproject/bignumber@^5.6.0": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.6.0.tgz#116c81b075c57fa765a8f3822648cf718a8a0e26" + integrity sha512-VziMaXIUHQlHJmkv1dlcd6GY2PmT0khtAqaMctCIDogxkrarMzA9L94KN1NeXqqOfFD6r0sJT3vCTOFSmZ07DA== dependencies: - "@ethersproject/bytes" "^5.3.0" - "@ethersproject/logger" "^5.3.0" + "@ethersproject/bytes" "^5.6.0" + "@ethersproject/logger" "^5.6.0" bn.js "^4.11.9" -"@ethersproject/bignumber@>=5.0.0-beta.130", "@ethersproject/bignumber@^5.0.6": - version "5.0.6" - resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.0.6.tgz#1b5494a640c64096538e622b6ba8a5b8439ebde4" - integrity sha512-fLilYOSH3DJXBrimx7PwrJdY/zAI5MGp229Mvhtcur76Lgt4qNWu9HTiwMGHP01Tkm3YP5gweF83GrQrA2tYUA== +"@ethersproject/bytes@5.6.1", "@ethersproject/bytes@^5.0.4", "@ethersproject/bytes@^5.6.0": + version "5.6.1" + resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.6.1.tgz#24f916e411f82a8a60412344bf4a813b917eefe7" + integrity sha512-NwQt7cKn5+ZE4uDn+X5RAXLp46E1chXoaMmrxAyA0rblpxz8t58lVkrHXoRIn0lz1joQElQ8410GqhTqMOwc6g== dependencies: - "@ethersproject/bytes" "^5.0.4" - "@ethersproject/logger" "^5.0.5" - bn.js "^4.4.0" - -"@ethersproject/bignumber@^5.0.13", "@ethersproject/bignumber@^5.0.7": - version "5.0.15" - resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.0.15.tgz#b089b3f1e0381338d764ac1c10512f0c93b184ed" - integrity sha512-MTADqnyacvdRwtKh7o9ujwNDSM1SDJjYDMYAzjIgjoi9rh6TY4suMbhCa3i2vh3SUXiXSICyTI8ui+NPdrZ9Lw== - dependencies: - "@ethersproject/bytes" "^5.0.9" - "@ethersproject/logger" "^5.0.8" - bn.js "^4.4.0" + "@ethersproject/logger" "^5.6.0" -"@ethersproject/bytes@5.3.0", "@ethersproject/bytes@^5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.3.0.tgz#473e0da7f831d535b2002be05e6f4ca3729a1bc9" - integrity sha512-rqLJjdVqCcn7glPer7Fxh87PRqlnRScVAoxcIP3PmOUNApMWJ6yRdOFfo2KvPAdO7Le3yEI1o0YW+Yvr7XCYvw== - dependencies: - "@ethersproject/logger" "^5.3.0" - -"@ethersproject/bytes@>=5.0.0-beta.129", "@ethersproject/bytes@^5.0.4": - version "5.0.4" - resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.0.4.tgz#328d9d929a3e970964ecf5d62e12568a187189f1" - integrity sha512-9R6A6l9JN8x1U4s1dJCR+9h3MZTT3xQofr/Xx8wbDvj6NnY4CbBB0o8ZgHXvR74yV90pY2EzCekpkMBJnRzkSw== - dependencies: - "@ethersproject/logger" "^5.0.5" - -"@ethersproject/bytes@^5.0.9": - version "5.0.11" - resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.0.11.tgz#21118e75b1d00db068984c15530e316021101276" - integrity sha512-D51plLYY5qF05AsoVQwIZVLqlBkaTPVHVP/1WmmBIWyHB0cRW0C9kh0kx5Exo51rB63Hk8PfHxc7SmpoaQFEyg== - dependencies: - "@ethersproject/logger" "^5.0.8" - -"@ethersproject/constants@5.3.0", "@ethersproject/constants@^5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.3.0.tgz#a5d6d86c0eec2c64c3024479609493b9afb3fc77" - integrity sha512-4y1feNOwEpgjAfiCFWOHznvv6qUF/H6uI0UKp8xdhftb+H+FbKflXg1pOgH5qs4Sr7EYBL+zPyPb+YD5g1aEyw== +"@ethersproject/constants@5.6.0", "@ethersproject/constants@^5.0.4", "@ethersproject/constants@^5.6.0": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.6.0.tgz#55e3eb0918584d3acc0688e9958b0cedef297088" + integrity sha512-SrdaJx2bK0WQl23nSpV/b1aq293Lh0sUaZT/yYKPDKn4tlAbkH96SPJwIhwSwTsoQQZxuh1jnqsKwyymoiBdWA== dependencies: - "@ethersproject/bignumber" "^5.3.0" + "@ethersproject/bignumber" "^5.6.0" -"@ethersproject/constants@>=5.0.0-beta.128", "@ethersproject/constants@^5.0.3": - version "5.0.3" - resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.0.3.tgz#7ccb8e2e9f14fbcc2d52d0e1402a83a5613a2f65" - integrity sha512-iN7KBrA0zNFybDyrkcAPOcyU3CHXYFMd+KM2Jr07Kjg+DVB5wPpEXsOdd/K1KWFsFtGfNdPZ7QP8siLtCePXrQ== - dependencies: - "@ethersproject/bignumber" "^5.0.6" - -"@ethersproject/constants@^5.0.4", "@ethersproject/constants@^5.0.8": - version "5.0.10" - resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.0.10.tgz#eb0c604fbc44c53ba9641eed31a1d0c9e1ebcadc" - integrity sha512-OSo8jxkHLDXieCy8bgOFR7lMfgPxEzKvSDdP+WAWHCDM8+orwch0B6wzkTmiQFgryAtIctrBt5glAdJikZ3hGw== - dependencies: - "@ethersproject/bignumber" "^5.0.13" - -"@ethersproject/contracts@5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.3.0.tgz#ad699a3abaae30bfb6422cf31813a663b2d4099c" - integrity sha512-eDyQ8ltykvyQqnGZxb/c1e0OnEtzqXhNNC4BX8nhYBCaoBrYYuK/1fLmyEvc5+XUMoxNhwpYkoSSwvPLci7/Zg== - dependencies: - "@ethersproject/abi" "^5.3.0" - "@ethersproject/abstract-provider" "^5.3.0" - "@ethersproject/abstract-signer" "^5.3.0" - "@ethersproject/address" "^5.3.0" - "@ethersproject/bignumber" "^5.3.0" - "@ethersproject/bytes" "^5.3.0" - "@ethersproject/constants" "^5.3.0" - "@ethersproject/logger" "^5.3.0" - "@ethersproject/properties" "^5.3.0" - "@ethersproject/transactions" "^5.3.0" - -"@ethersproject/hash@5.3.0", "@ethersproject/hash@^5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.3.0.tgz#f65e3bf3db3282df4da676db6cfa049535dd3643" - integrity sha512-gAFZSjUPQ32CIfoKSMtMEQ+IO0kQxqhwz9fCIFt2DtAq2u4pWt8mL9Z5P0r6KkLcQU8LE9FmuPPyd+JvBzmr1w== - dependencies: - "@ethersproject/abstract-signer" "^5.3.0" - "@ethersproject/address" "^5.3.0" - "@ethersproject/bignumber" "^5.3.0" - "@ethersproject/bytes" "^5.3.0" - "@ethersproject/keccak256" "^5.3.0" - "@ethersproject/logger" "^5.3.0" - "@ethersproject/properties" "^5.3.0" - "@ethersproject/strings" "^5.3.0" - -"@ethersproject/hash@>=5.0.0-beta.128": - version "5.0.3" - resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.0.3.tgz#41f17fd7972838831620338dad932bfe3d684209" - integrity sha512-KSnJyL0G9lxbOK0UPrUcaYTc/RidrX8c+kn7xnEpTmSGxqlndw4BzvQcRgYt31bOIwuFtwlWvOo6AN2tJgdQtA== - dependencies: - "@ethersproject/bytes" "^5.0.4" - "@ethersproject/keccak256" "^5.0.3" - "@ethersproject/logger" "^5.0.5" - "@ethersproject/strings" "^5.0.3" - -"@ethersproject/hash@^5.0.4": - version "5.0.12" - resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.0.12.tgz#1074599f7509e2ca2bb7a3d4f4e39ab3a796da42" - integrity sha512-kn4QN+fhNFbUgX3XZTZUaQixi0oyfIEY+hfW+KtkHu+rq7dV76oAIvaLEEynu1/4npOL38E4X4YI42gGZk+C0Q== - dependencies: - "@ethersproject/abstract-signer" "^5.0.10" - "@ethersproject/address" "^5.0.9" - "@ethersproject/bignumber" "^5.0.13" - "@ethersproject/bytes" "^5.0.9" - "@ethersproject/keccak256" "^5.0.7" - "@ethersproject/logger" "^5.0.8" - "@ethersproject/properties" "^5.0.7" - "@ethersproject/strings" "^5.0.8" - -"@ethersproject/hdnode@5.3.0", "@ethersproject/hdnode@^5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.3.0.tgz#26fed65ffd5c25463fddff13f5fb4e5617553c94" - integrity sha512-zLmmtLNoDMGoYRdjOab01Zqkvp+TmZyCGDAMQF1Bs3yZyBs/kzTNi1qJjR1jVUcPP5CWGtjFwY8iNG8oNV9J8g== - dependencies: - "@ethersproject/abstract-signer" "^5.3.0" - "@ethersproject/basex" "^5.3.0" - "@ethersproject/bignumber" "^5.3.0" - "@ethersproject/bytes" "^5.3.0" - "@ethersproject/logger" "^5.3.0" - "@ethersproject/pbkdf2" "^5.3.0" - "@ethersproject/properties" "^5.3.0" - "@ethersproject/sha2" "^5.3.0" - "@ethersproject/signing-key" "^5.3.0" - "@ethersproject/strings" "^5.3.0" - "@ethersproject/transactions" "^5.3.0" - "@ethersproject/wordlists" "^5.3.0" - -"@ethersproject/json-wallets@5.3.0", "@ethersproject/json-wallets@^5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@ethersproject/json-wallets/-/json-wallets-5.3.0.tgz#7b1a5ff500c12aa8597ae82c8939837b0449376e" - integrity sha512-/xwbqaIb5grUIGNmeEaz8GdcpmDr++X8WT4Jqcclnxow8PXCUHFeDxjf3O+nSuoqOYG/Ds0+BI5xuQKbva6Xkw== - dependencies: - "@ethersproject/abstract-signer" "^5.3.0" - "@ethersproject/address" "^5.3.0" - "@ethersproject/bytes" "^5.3.0" - "@ethersproject/hdnode" "^5.3.0" - "@ethersproject/keccak256" "^5.3.0" - "@ethersproject/logger" "^5.3.0" - "@ethersproject/pbkdf2" "^5.3.0" - "@ethersproject/properties" "^5.3.0" - "@ethersproject/random" "^5.3.0" - "@ethersproject/strings" "^5.3.0" - "@ethersproject/transactions" "^5.3.0" +"@ethersproject/contracts@5.6.0": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.6.0.tgz#60f2cfc7addd99a865c6c8cfbbcec76297386067" + integrity sha512-74Ge7iqTDom0NX+mux8KbRUeJgu1eHZ3iv6utv++sLJG80FVuU9HnHeKVPfjd9s3woFhaFoQGf3B3iH/FrQmgw== + dependencies: + "@ethersproject/abi" "^5.6.0" + "@ethersproject/abstract-provider" "^5.6.0" + "@ethersproject/abstract-signer" "^5.6.0" + "@ethersproject/address" "^5.6.0" + "@ethersproject/bignumber" "^5.6.0" + "@ethersproject/bytes" "^5.6.0" + "@ethersproject/constants" "^5.6.0" + "@ethersproject/logger" "^5.6.0" + "@ethersproject/properties" "^5.6.0" + "@ethersproject/transactions" "^5.6.0" + +"@ethersproject/hash@5.6.0", "@ethersproject/hash@^5.0.4", "@ethersproject/hash@^5.6.0": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.6.0.tgz#d24446a5263e02492f9808baa99b6e2b4c3429a2" + integrity sha512-fFd+k9gtczqlr0/BruWLAu7UAOas1uRRJvOR84uDf4lNZ+bTkGl366qvniUZHKtlqxBRU65MkOobkmvmpHU+jA== + dependencies: + "@ethersproject/abstract-signer" "^5.6.0" + "@ethersproject/address" "^5.6.0" + "@ethersproject/bignumber" "^5.6.0" + "@ethersproject/bytes" "^5.6.0" + "@ethersproject/keccak256" "^5.6.0" + "@ethersproject/logger" "^5.6.0" + "@ethersproject/properties" "^5.6.0" + "@ethersproject/strings" "^5.6.0" + +"@ethersproject/hdnode@5.6.0", "@ethersproject/hdnode@^5.6.0": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.6.0.tgz#9dcbe8d629bbbcf144f2cae476337fe92d320998" + integrity sha512-61g3Jp3nwDqJcL/p4nugSyLrpl/+ChXIOtCEM8UDmWeB3JCAt5FoLdOMXQc3WWkc0oM2C0aAn6GFqqMcS/mHTw== + dependencies: + "@ethersproject/abstract-signer" "^5.6.0" + "@ethersproject/basex" "^5.6.0" + "@ethersproject/bignumber" "^5.6.0" + "@ethersproject/bytes" "^5.6.0" + "@ethersproject/logger" "^5.6.0" + "@ethersproject/pbkdf2" "^5.6.0" + "@ethersproject/properties" "^5.6.0" + "@ethersproject/sha2" "^5.6.0" + "@ethersproject/signing-key" "^5.6.0" + "@ethersproject/strings" "^5.6.0" + "@ethersproject/transactions" "^5.6.0" + "@ethersproject/wordlists" "^5.6.0" + +"@ethersproject/json-wallets@5.6.0", "@ethersproject/json-wallets@^5.6.0": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@ethersproject/json-wallets/-/json-wallets-5.6.0.tgz#4c2fc27f17e36c583e7a252fb938bc46f98891e5" + integrity sha512-fmh86jViB9r0ibWXTQipxpAGMiuxoqUf78oqJDlCAJXgnJF024hOOX7qVgqsjtbeoxmcLwpPsXNU0WEe/16qPQ== + dependencies: + "@ethersproject/abstract-signer" "^5.6.0" + "@ethersproject/address" "^5.6.0" + "@ethersproject/bytes" "^5.6.0" + "@ethersproject/hdnode" "^5.6.0" + "@ethersproject/keccak256" "^5.6.0" + "@ethersproject/logger" "^5.6.0" + "@ethersproject/pbkdf2" "^5.6.0" + "@ethersproject/properties" "^5.6.0" + "@ethersproject/random" "^5.6.0" + "@ethersproject/strings" "^5.6.0" + "@ethersproject/transactions" "^5.6.0" aes-js "3.0.0" scrypt-js "3.0.1" -"@ethersproject/keccak256@5.3.0", "@ethersproject/keccak256@^5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.3.0.tgz#fb5cd36bdfd6fa02e2ea84964078a9fc6bd731be" - integrity sha512-Gv2YqgIUmRbYVNIibafT0qGaeGYLIA/EdWHJ7JcVxVSs2vyxafGxOJ5VpSBHWeOIsE6OOaCelYowhuuTicgdFQ== - dependencies: - "@ethersproject/bytes" "^5.3.0" - js-sha3 "0.5.7" - -"@ethersproject/keccak256@>=5.0.0-beta.127", "@ethersproject/keccak256@^5.0.3": - version "5.0.3" - resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.0.3.tgz#f094a8fca3bb913c044593c4f382be424292e588" - integrity sha512-VhW3mgZMBZlETV6AyOmjNeNG+Pg68igiKkPpat8/FZl0CKnfgQ+KZQZ/ee1vT+X0IUM8/djqnei6btmtbA27Ug== - dependencies: - "@ethersproject/bytes" "^5.0.4" - js-sha3 "0.5.7" - -"@ethersproject/keccak256@^5.0.7": - version "5.0.9" - resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.0.9.tgz#ca0d86e4af56c13b1ef25e533bde3e96d28f647d" - integrity sha512-zhdUTj6RGtCJSgU+bDrWF6cGbvW453LoIC1DSNWrTlXzC7WuH4a+EiPrgc7/kNoRxerKuA/cxYlI8GwNtVtDlw== - dependencies: - "@ethersproject/bytes" "^5.0.9" - js-sha3 "0.5.7" - -"@ethersproject/logger@5.3.0", "@ethersproject/logger@^5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.3.0.tgz#7a69fa1d4ca0d4b7138da1627eb152f763d84dd0" - integrity sha512-8bwJ2gxJGkZZnpQSq5uSiZSJjyVTWmlGft4oH8vxHdvO1Asy4TwVepAhPgxIQIMxXZFUNMych1YjIV4oQ4I7dA== - -"@ethersproject/logger@>=5.0.0-beta.129", "@ethersproject/logger@^5.0.5": - version "5.0.5" - resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.0.5.tgz#e3ba3d0bcf9f5be4da5f043b1e328eb98b80002f" - integrity sha512-gJj72WGzQhUtCk6kfvI8elTaPOQyMvrMghp/nbz0ivTo39fZ7IjypFh/ySDeUSdBNplAwhzWKKejQhdpyefg/w== - -"@ethersproject/logger@^5.0.8": - version "5.0.10" - resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.0.10.tgz#fd884688b3143253e0356ef92d5f22d109d2e026" - integrity sha512-0y2T2NqykDrbPM3Zw9RSbPkDOxwChAL8detXaom76CfYoGxsOnRP/zTX8OUAV+x9LdwzgbWvWmeXrc0M7SuDZw== - -"@ethersproject/networks@5.3.1", "@ethersproject/networks@^5.3.0": - version "5.3.1" - resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.3.1.tgz#78fe08324cee289ce239acf8c746121934b2ef61" - integrity sha512-6uQKHkYChlsfeiZhQ8IHIqGE/sQsf25o9ZxAYpMxi15dLPzz3IxOEF5KiSD32aHwsjXVBKBSlo+teAXLlYJybw== - dependencies: - "@ethersproject/logger" "^5.3.0" - -"@ethersproject/networks@^5.0.7": - version "5.0.9" - resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.0.9.tgz#ec5da11e4d4bfd69bec4eaebc9ace33eb9569279" - integrity sha512-L8+VCQwArBLGkxZb/5Ns/OH/OxP38AcaveXIxhUTq+VWpXYjrObG3E7RDQIKkUx1S1IcQl/UWTz5w4DK0UitJg== +"@ethersproject/keccak256@5.6.0", "@ethersproject/keccak256@^5.0.3", "@ethersproject/keccak256@^5.6.0": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.6.0.tgz#fea4bb47dbf8f131c2e1774a1cecbfeb9d606459" + integrity sha512-tk56BJ96mdj/ksi7HWZVWGjCq0WVl/QvfhFQNeL8fxhBlGoP+L80uDCiQcpJPd+2XxkivS3lwRm3E0CXTfol0w== dependencies: - "@ethersproject/logger" "^5.0.8" + "@ethersproject/bytes" "^5.6.0" + js-sha3 "0.8.0" -"@ethersproject/pbkdf2@5.3.0", "@ethersproject/pbkdf2@^5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.3.0.tgz#8adbb41489c3c9f319cc44bc7d3e6095fd468dc8" - integrity sha512-Q9ChVU6gBFiex0FSdtzo4b0SAKz3ZYcYVFLrEWHL0FnHvNk3J3WgAtRNtBQGQYn/T5wkoTdZttMbfBkFlaiWcA== - dependencies: - "@ethersproject/bytes" "^5.3.0" - "@ethersproject/sha2" "^5.3.0" +"@ethersproject/logger@5.6.0", "@ethersproject/logger@^5.0.5", "@ethersproject/logger@^5.6.0": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.6.0.tgz#d7db1bfcc22fd2e4ab574cba0bb6ad779a9a3e7a" + integrity sha512-BiBWllUROH9w+P21RzoxJKzqoqpkyM1pRnEKG69bulE9TSQD8SAIvTQqIMZmmCO8pUNkgLP1wndX1gKghSpBmg== -"@ethersproject/properties@5.3.0", "@ethersproject/properties@^5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.3.0.tgz#feef4c4babeb7c10a6b3449575016f4ad2c092b2" - integrity sha512-PaHxJyM5/bfusk6vr3yP//JMnm4UEojpzuWGTmtL5X4uNhNnFNvlYilZLyDr4I9cTkIbipCMsAuIcXWsmdRnEw== +"@ethersproject/networks@5.6.1", "@ethersproject/networks@^5.6.0": + version "5.6.1" + resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.6.1.tgz#7a21ed1f83e86121737b16841961ec99ccf5c9c7" + integrity sha512-b2rrupf3kCTcc3jr9xOWBuHylSFtbpJf79Ga7QR98ienU2UqGimPGEsYMgbI29KHJfA5Us89XwGVmxrlxmSrMg== dependencies: - "@ethersproject/logger" "^5.3.0" + "@ethersproject/logger" "^5.6.0" -"@ethersproject/properties@>=5.0.0-beta.131", "@ethersproject/properties@^5.0.3": - version "5.0.3" - resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.0.3.tgz#991aef39a5f87d4645cee76cec4df868bfb08be6" - integrity sha512-wLCSrbywkQgTO6tIF9ZdKsH9AIxPEqAJF/z5xcPkz1DK4mMAZgAXRNw1MrKYhyb+7CqNHbj3vxenNKFavGY/IA== +"@ethersproject/pbkdf2@5.6.0", "@ethersproject/pbkdf2@^5.6.0": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.6.0.tgz#04fcc2d7c6bff88393f5b4237d906a192426685a" + integrity sha512-Wu1AxTgJo3T3H6MIu/eejLFok9TYoSdgwRr5oGY1LTLfmGesDoSx05pemsbrPT2gG4cQME+baTSCp5sEo2erZQ== dependencies: - "@ethersproject/logger" "^5.0.5" + "@ethersproject/bytes" "^5.6.0" + "@ethersproject/sha2" "^5.6.0" -"@ethersproject/properties@^5.0.7": - version "5.0.9" - resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.0.9.tgz#d7aae634680760136ea522e25c3ef043ec15b5c2" - integrity sha512-ZCjzbHYTw+rF1Pn8FDCEmx3gQttwIHcm/6Xee8g/M3Ga3SfW4tccNMbs5zqnBH0E4RoOPaeNgyg1O68TaF0tlg== - dependencies: - "@ethersproject/logger" "^5.0.8" - -"@ethersproject/providers@5.3.1": - version "5.3.1" - resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.3.1.tgz#a12c6370e8cbc0968c9744641b8ef90b0dd5ec2b" - integrity sha512-HC63vENTrur6/JKEhcQbA8PRDj1FAesdpX98IW+xAAo3EAkf70ou5fMIA3KCGzJDLNTeYA4C2Bonz849tVLekg== - dependencies: - "@ethersproject/abstract-provider" "^5.3.0" - "@ethersproject/abstract-signer" "^5.3.0" - "@ethersproject/address" "^5.3.0" - "@ethersproject/basex" "^5.3.0" - "@ethersproject/bignumber" "^5.3.0" - "@ethersproject/bytes" "^5.3.0" - "@ethersproject/constants" "^5.3.0" - "@ethersproject/hash" "^5.3.0" - "@ethersproject/logger" "^5.3.0" - "@ethersproject/networks" "^5.3.0" - "@ethersproject/properties" "^5.3.0" - "@ethersproject/random" "^5.3.0" - "@ethersproject/rlp" "^5.3.0" - "@ethersproject/sha2" "^5.3.0" - "@ethersproject/strings" "^5.3.0" - "@ethersproject/transactions" "^5.3.0" - "@ethersproject/web" "^5.3.0" +"@ethersproject/properties@5.6.0", "@ethersproject/properties@^5.0.3", "@ethersproject/properties@^5.6.0": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.6.0.tgz#38904651713bc6bdd5bdd1b0a4287ecda920fa04" + integrity sha512-szoOkHskajKePTJSZ46uHUWWkbv7TzP2ypdEK6jGMqJaEt2sb0jCgfBo0gH0m2HBpRixMuJ6TBRaQCF7a9DoCg== + dependencies: + "@ethersproject/logger" "^5.6.0" + +"@ethersproject/providers@5.6.2": + version "5.6.2" + resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.6.2.tgz#b9807b1c8c6f59fa2ee4b3cf6519724d07a9f422" + integrity sha512-6/EaFW/hNWz+224FXwl8+HdMRzVHt8DpPmu5MZaIQqx/K/ELnC9eY236SMV7mleCM3NnEArFwcAAxH5kUUgaRg== + dependencies: + "@ethersproject/abstract-provider" "^5.6.0" + "@ethersproject/abstract-signer" "^5.6.0" + "@ethersproject/address" "^5.6.0" + "@ethersproject/basex" "^5.6.0" + "@ethersproject/bignumber" "^5.6.0" + "@ethersproject/bytes" "^5.6.0" + "@ethersproject/constants" "^5.6.0" + "@ethersproject/hash" "^5.6.0" + "@ethersproject/logger" "^5.6.0" + "@ethersproject/networks" "^5.6.0" + "@ethersproject/properties" "^5.6.0" + "@ethersproject/random" "^5.6.0" + "@ethersproject/rlp" "^5.6.0" + "@ethersproject/sha2" "^5.6.0" + "@ethersproject/strings" "^5.6.0" + "@ethersproject/transactions" "^5.6.0" + "@ethersproject/web" "^5.6.0" bech32 "1.1.4" ws "7.4.6" -"@ethersproject/random@5.3.0", "@ethersproject/random@^5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.3.0.tgz#7c46bf36e50cb0d0550bc8c666af8e1d4496dc1a" - integrity sha512-A5SL/4inutSwt3Fh2OD0x2gz+x6GHmuUnIPkR7zAiTidMD2N8F6tZdMF1hlQKWVCcVMWhEQg8mWijhEzm6BBYw== - dependencies: - "@ethersproject/bytes" "^5.3.0" - "@ethersproject/logger" "^5.3.0" - -"@ethersproject/rlp@5.3.0", "@ethersproject/rlp@^5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.3.0.tgz#7cb93a7b5dfa69163894153c9d4b0d936f333188" - integrity sha512-oI0joYpsRanl9guDubaW+1NbcpK0vJ3F/6Wpcanzcnqq+oaW9O5E98liwkEDPcb16BUTLIJ+ZF8GPIHYxJ/5Pw== - dependencies: - "@ethersproject/bytes" "^5.3.0" - "@ethersproject/logger" "^5.3.0" - -"@ethersproject/rlp@^5.0.3": - version "5.0.3" - resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.0.3.tgz#841a5edfdf725f92155fe74424f5510c9043c13a" - integrity sha512-Hz4yyA/ilGafASAqtTlLWkA/YqwhQmhbDAq2LSIp1AJNx+wtbKWFAKSckpeZ+WG/xZmT+fw5OFKK7a5IZ4DR5g== +"@ethersproject/random@5.6.0", "@ethersproject/random@^5.6.0": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.6.0.tgz#1505d1ab6a250e0ee92f436850fa3314b2cb5ae6" + integrity sha512-si0PLcLjq+NG/XHSZz90asNf+YfKEqJGVdxoEkSukzbnBgC8rydbgbUgBbBGLeHN4kAJwUFEKsu3sCXT93YMsw== dependencies: - "@ethersproject/bytes" "^5.0.4" - "@ethersproject/logger" "^5.0.5" + "@ethersproject/bytes" "^5.6.0" + "@ethersproject/logger" "^5.6.0" -"@ethersproject/rlp@^5.0.7": - version "5.0.9" - resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.0.9.tgz#da205bf8a34d3c3409eb73ddd237130a4b376aff" - integrity sha512-ns1U7ZMVeruUW6JXc4om+1w3w4ynHN/0fpwmeNTsAjwGKoF8SAUgue6ylKpHKWSti2idx7jDxbn8hNNFHk67CA== +"@ethersproject/rlp@5.6.0", "@ethersproject/rlp@^5.6.0": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.6.0.tgz#55a7be01c6f5e64d6e6e7edb6061aa120962a717" + integrity sha512-dz9WR1xpcTL+9DtOT/aDO+YyxSSdO8YIS0jyZwHHSlAmnxA6cKU3TrTd4Xc/bHayctxTgGLYNuVVoiXE4tTq1g== dependencies: - "@ethersproject/bytes" "^5.0.9" - "@ethersproject/logger" "^5.0.8" + "@ethersproject/bytes" "^5.6.0" + "@ethersproject/logger" "^5.6.0" -"@ethersproject/sha2@5.3.0", "@ethersproject/sha2@^5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.3.0.tgz#209f9a1649f7d2452dcd5e5b94af43b7f3f42366" - integrity sha512-r5ftlwKcocYEuFz2JbeKOT5SAsCV4m1RJDsTOEfQ5L67ZC7NFDK5i7maPdn1bx4nPhylF9VAwxSrQ1esmwzylg== +"@ethersproject/sha2@5.6.0", "@ethersproject/sha2@^5.6.0": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.6.0.tgz#364c4c11cc753bda36f31f001628706ebadb64d9" + integrity sha512-1tNWCPFLu1n3JM9t4/kytz35DkuF9MxqkGGEHNauEbaARdm2fafnOyw1s0tIQDPKF/7bkP1u3dbrmjpn5CelyA== dependencies: - "@ethersproject/bytes" "^5.3.0" - "@ethersproject/logger" "^5.3.0" + "@ethersproject/bytes" "^5.6.0" + "@ethersproject/logger" "^5.6.0" hash.js "1.1.7" -"@ethersproject/signing-key@5.3.0", "@ethersproject/signing-key@^5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.3.0.tgz#a96c88f8173e1abedfa35de32d3e5db7c48e5259" - integrity sha512-+DX/GwHAd0ok1bgedV1cKO0zfK7P/9aEyNoaYiRsGHpCecN7mhLqcdoUiUzE7Uz86LBsxm5ssK0qA1kBB47fbQ== +"@ethersproject/signing-key@5.6.0", "@ethersproject/signing-key@^5.6.0": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.6.0.tgz#4f02e3fb09e22b71e2e1d6dc4bcb5dafa69ce042" + integrity sha512-S+njkhowmLeUu/r7ir8n78OUKx63kBdMCPssePS89So1TH4hZqnWFsThEd/GiXYp9qMxVrydf7KdM9MTGPFukA== dependencies: - "@ethersproject/bytes" "^5.3.0" - "@ethersproject/logger" "^5.3.0" - "@ethersproject/properties" "^5.3.0" + "@ethersproject/bytes" "^5.6.0" + "@ethersproject/logger" "^5.6.0" + "@ethersproject/properties" "^5.6.0" bn.js "^4.11.9" elliptic "6.5.4" hash.js "1.1.7" -"@ethersproject/signing-key@^5.0.4": - version "5.0.4" - resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.0.4.tgz#a5334ce8a52d4e9736dc8fb6ecc384704ecf8783" - integrity sha512-I6pJoga1IvhtjYK5yXzCjs4ZpxrVbt9ZRAlpEw0SW9UuV020YfJH5EIVEGR2evdRceS3nAQIggqbsXSkP8Y1Dg== - dependencies: - "@ethersproject/bytes" "^5.0.4" - "@ethersproject/logger" "^5.0.5" - "@ethersproject/properties" "^5.0.3" - elliptic "6.5.3" - -"@ethersproject/signing-key@^5.0.8": - version "5.0.11" - resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.0.11.tgz#19fc5c4597e18ad0a5efc6417ba5b74069fdd2af" - integrity sha512-Jfcru/BGwdkXhLxT+8WCZtFy7LL0TPFZw05FAb5asxB/MyVsEfNdNxGDtjVE9zXfmRSPe/EusXYY4K7wcygOyQ== +"@ethersproject/solidity@5.6.0": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.6.0.tgz#64657362a596bf7f5630bdc921c07dd78df06dc3" + integrity sha512-YwF52vTNd50kjDzqKaoNNbC/r9kMDPq3YzDWmsjFTRBcIF1y4JCQJ8gB30wsTfHbaxgxelI5BfxQSxD/PbJOww== dependencies: - "@ethersproject/bytes" "^5.0.9" - "@ethersproject/logger" "^5.0.8" - "@ethersproject/properties" "^5.0.7" - elliptic "6.5.4" + "@ethersproject/bignumber" "^5.6.0" + "@ethersproject/bytes" "^5.6.0" + "@ethersproject/keccak256" "^5.6.0" + "@ethersproject/logger" "^5.6.0" + "@ethersproject/sha2" "^5.6.0" + "@ethersproject/strings" "^5.6.0" -"@ethersproject/solidity@5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.3.0.tgz#2a0b00b4aaaef99a080ddea13acab1fa35cd4a93" - integrity sha512-uLRBaNUiISHbut94XKewJgQh6UmydWTBp71I7I21pkjVXfZO2dJ5EOo3jCnumJc01M4LOm79dlNNmF3oGIvweQ== +"@ethersproject/strings@5.6.0", "@ethersproject/strings@^5.0.4", "@ethersproject/strings@^5.6.0": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.6.0.tgz#9891b26709153d996bf1303d39a7f4bc047878fd" + integrity sha512-uv10vTtLTZqrJuqBZR862ZQjTIa724wGPWQqZrofaPI/kUsf53TBG0I0D+hQ1qyNtllbNzaW+PDPHHUI6/65Mg== dependencies: - "@ethersproject/bignumber" "^5.3.0" - "@ethersproject/bytes" "^5.3.0" - "@ethersproject/keccak256" "^5.3.0" - "@ethersproject/sha2" "^5.3.0" - "@ethersproject/strings" "^5.3.0" + "@ethersproject/bytes" "^5.6.0" + "@ethersproject/constants" "^5.6.0" + "@ethersproject/logger" "^5.6.0" -"@ethersproject/strings@5.3.0", "@ethersproject/strings@^5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.3.0.tgz#a6b640aab56a18e0909f657da798eef890968ff0" - integrity sha512-j/AzIGZ503cvhuF2ldRSjB0BrKzpsBMtCieDtn4TYMMZMQ9zScJn9wLzTQl/bRNvJbBE6TOspK0r8/Ngae/f2Q== +"@ethersproject/transactions@5.6.0", "@ethersproject/transactions@^5.0.0-beta.135", "@ethersproject/transactions@^5.6.0": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.6.0.tgz#4b594d73a868ef6e1529a2f8f94a785e6791ae4e" + integrity sha512-4HX+VOhNjXHZyGzER6E/LVI2i6lf9ejYeWD6l4g50AdmimyuStKc39kvKf1bXWQMg7QNVh+uC7dYwtaZ02IXeg== + dependencies: + "@ethersproject/address" "^5.6.0" + "@ethersproject/bignumber" "^5.6.0" + "@ethersproject/bytes" "^5.6.0" + "@ethersproject/constants" "^5.6.0" + "@ethersproject/keccak256" "^5.6.0" + "@ethersproject/logger" "^5.6.0" + "@ethersproject/properties" "^5.6.0" + "@ethersproject/rlp" "^5.6.0" + "@ethersproject/signing-key" "^5.6.0" + +"@ethersproject/units@5.6.0": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@ethersproject/units/-/units-5.6.0.tgz#e5cbb1906988f5740254a21b9ded6bd51e826d9c" + integrity sha512-tig9x0Qmh8qbo1w8/6tmtyrm/QQRviBh389EQ+d8fP4wDsBrJBf08oZfoiz1/uenKK9M78yAP4PoR7SsVoTjsw== dependencies: - "@ethersproject/bytes" "^5.3.0" - "@ethersproject/constants" "^5.3.0" - "@ethersproject/logger" "^5.3.0" + "@ethersproject/bignumber" "^5.6.0" + "@ethersproject/constants" "^5.6.0" + "@ethersproject/logger" "^5.6.0" -"@ethersproject/strings@>=5.0.0-beta.130", "@ethersproject/strings@^5.0.3": - version "5.0.3" - resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.0.3.tgz#756cc4b93203a091966d40824b0b28048e2d5d9b" - integrity sha512-8kEx3+Z6cMn581yh093qnaSa8H7XzmLn6g8YFDHUpzXM7+bvXvnL2ciHrJ+EbvaMQZpej6nNtl0nm7XF4PmQHA== +"@ethersproject/wallet@5.6.0": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.6.0.tgz#33d11a806d783864208f348709a5a3badac8e22a" + integrity sha512-qMlSdOSTyp0MBeE+r7SUhr1jjDlC1zAXB8VD84hCnpijPQiSNbxr6GdiLXxpUs8UKzkDiNYYC5DRI3MZr+n+tg== + dependencies: + "@ethersproject/abstract-provider" "^5.6.0" + "@ethersproject/abstract-signer" "^5.6.0" + "@ethersproject/address" "^5.6.0" + "@ethersproject/bignumber" "^5.6.0" + "@ethersproject/bytes" "^5.6.0" + "@ethersproject/hash" "^5.6.0" + "@ethersproject/hdnode" "^5.6.0" + "@ethersproject/json-wallets" "^5.6.0" + "@ethersproject/keccak256" "^5.6.0" + "@ethersproject/logger" "^5.6.0" + "@ethersproject/properties" "^5.6.0" + "@ethersproject/random" "^5.6.0" + "@ethersproject/signing-key" "^5.6.0" + "@ethersproject/transactions" "^5.6.0" + "@ethersproject/wordlists" "^5.6.0" + +"@ethersproject/web@5.6.0", "@ethersproject/web@^5.6.0": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.6.0.tgz#4bf8b3cbc17055027e1a5dd3c357e37474eaaeb8" + integrity sha512-G/XHj0hV1FxI2teHRfCGvfBUHFmU+YOSbCxlAMqJklxSa7QMiHFQfAxvwY2PFqgvdkxEKwRNr/eCjfAPEm2Ctg== dependencies: - "@ethersproject/bytes" "^5.0.4" - "@ethersproject/constants" "^5.0.3" - "@ethersproject/logger" "^5.0.5" + "@ethersproject/base64" "^5.6.0" + "@ethersproject/bytes" "^5.6.0" + "@ethersproject/logger" "^5.6.0" + "@ethersproject/properties" "^5.6.0" + "@ethersproject/strings" "^5.6.0" -"@ethersproject/strings@^5.0.4", "@ethersproject/strings@^5.0.8": - version "5.0.10" - resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.0.10.tgz#ddce1e9724f4ac4f3f67e0cac0b48748e964bfdb" - integrity sha512-KAeoS1tZ9/5ECXiIZA6S6hywbD0so2VmuW+Wfyo5EDXeyZ6Na1nxTPhTnW7voQmjbeYJffCrOc0qLFJeylyg7w== - dependencies: - "@ethersproject/bytes" "^5.0.9" - "@ethersproject/constants" "^5.0.8" - "@ethersproject/logger" "^5.0.8" - -"@ethersproject/transactions@5.3.0", "@ethersproject/transactions@^5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.3.0.tgz#49b86f2bafa4d0bdf8e596578fc795ee47c50458" - integrity sha512-cdfK8VVyW2oEBCXhURG0WQ6AICL/r6Gmjh0e4Bvbv6MCn/GBd8FeBH3rtl7ho+AW50csMKeGv3m3K1HSHB2jMQ== - dependencies: - "@ethersproject/address" "^5.3.0" - "@ethersproject/bignumber" "^5.3.0" - "@ethersproject/bytes" "^5.3.0" - "@ethersproject/constants" "^5.3.0" - "@ethersproject/keccak256" "^5.3.0" - "@ethersproject/logger" "^5.3.0" - "@ethersproject/properties" "^5.3.0" - "@ethersproject/rlp" "^5.3.0" - "@ethersproject/signing-key" "^5.3.0" - -"@ethersproject/transactions@^5.0.0-beta.135": - version "5.0.3" - resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.0.3.tgz#7cd82fa6d63043fb5cd561a8ed72df046a968430" - integrity sha512-cqsAAFUQV6iWqfgLL7KCPNfd3pXJPDdYtE6QuBEAIpc7cgbJ7TIDCF/dN+1otfERHJIbjGSNrhh4axKRnSFswg== +"@ethersproject/wordlists@5.6.0", "@ethersproject/wordlists@^5.6.0": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.6.0.tgz#79e62c5276e091d8575f6930ba01a29218ded032" + integrity sha512-q0bxNBfIX3fUuAo9OmjlEYxP40IB8ABgb7HjEZCL5IKubzV3j30CWi2rqQbjTS2HfoyQbfINoKcTVWP4ejwR7Q== dependencies: - "@ethersproject/address" "^5.0.3" - "@ethersproject/bignumber" "^5.0.6" - "@ethersproject/bytes" "^5.0.4" - "@ethersproject/constants" "^5.0.3" - "@ethersproject/keccak256" "^5.0.3" - "@ethersproject/logger" "^5.0.5" - "@ethersproject/properties" "^5.0.3" - "@ethersproject/rlp" "^5.0.3" - "@ethersproject/signing-key" "^5.0.4" - -"@ethersproject/transactions@^5.0.9": - version "5.0.11" - resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.0.11.tgz#b31df5292f47937136a45885d6ee6112477c13df" - integrity sha512-ftsRvR9+gQp7L63F6+XmstvsZ4w8GtWvQB08e/zB+oB86Fnhq8+i/tkgpJplSHC8I/qgiCisva+M3u2GVhDFPA== - dependencies: - "@ethersproject/address" "^5.0.9" - "@ethersproject/bignumber" "^5.0.13" - "@ethersproject/bytes" "^5.0.9" - "@ethersproject/constants" "^5.0.8" - "@ethersproject/keccak256" "^5.0.7" - "@ethersproject/logger" "^5.0.8" - "@ethersproject/properties" "^5.0.7" - "@ethersproject/rlp" "^5.0.7" - "@ethersproject/signing-key" "^5.0.8" - -"@ethersproject/units@5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@ethersproject/units/-/units-5.3.0.tgz#c4d1493532ad3d4ddf6e2bc4f8c94a2db933a8f5" - integrity sha512-BkfccZGwfJ6Ob+AelpIrgAzuNhrN2VLp3AILnkqTOv+yBdsc83V4AYf25XC/u0rHnWl6f4POaietPwlMqP2vUg== - dependencies: - "@ethersproject/bignumber" "^5.3.0" - "@ethersproject/constants" "^5.3.0" - "@ethersproject/logger" "^5.3.0" - -"@ethersproject/wallet@5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.3.0.tgz#91946b470bd279e39ade58866f21f92749d062af" - integrity sha512-boYBLydG6671p9QoG6EinNnNzbm7DNOjVT20eV8J6HQEq4aUaGiA2CytF2vK+2rOEWbzhZqoNDt6AlkE1LlsTg== - dependencies: - "@ethersproject/abstract-provider" "^5.3.0" - "@ethersproject/abstract-signer" "^5.3.0" - "@ethersproject/address" "^5.3.0" - "@ethersproject/bignumber" "^5.3.0" - "@ethersproject/bytes" "^5.3.0" - "@ethersproject/hash" "^5.3.0" - "@ethersproject/hdnode" "^5.3.0" - "@ethersproject/json-wallets" "^5.3.0" - "@ethersproject/keccak256" "^5.3.0" - "@ethersproject/logger" "^5.3.0" - "@ethersproject/properties" "^5.3.0" - "@ethersproject/random" "^5.3.0" - "@ethersproject/signing-key" "^5.3.0" - "@ethersproject/transactions" "^5.3.0" - "@ethersproject/wordlists" "^5.3.0" - -"@ethersproject/web@5.3.0", "@ethersproject/web@^5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.3.0.tgz#7959c403f6476c61515008d8f92da51c553a8ee1" - integrity sha512-Ni6/DHnY6k/TD41LEkv0RQDx4jqWz5e/RZvrSecsxGYycF+MFy2z++T/yGc2peRunLOTIFwEksgEGGlbwfYmhQ== - dependencies: - "@ethersproject/base64" "^5.3.0" - "@ethersproject/bytes" "^5.3.0" - "@ethersproject/logger" "^5.3.0" - "@ethersproject/properties" "^5.3.0" - "@ethersproject/strings" "^5.3.0" - -"@ethersproject/web@^5.0.12": - version "5.0.14" - resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.0.14.tgz#6e7bebdd9fb967cb25ee60f44d9218dc0803bac4" - integrity sha512-QpTgplslwZ0Sp9oKNLoRuS6TKxnkwfaEk3gr7zd7XLF8XBsYejsrQO/03fNfnMx/TAT/RR6WEw/mbOwpRSeVRA== - dependencies: - "@ethersproject/base64" "^5.0.7" - "@ethersproject/bytes" "^5.0.9" - "@ethersproject/logger" "^5.0.8" - "@ethersproject/properties" "^5.0.7" - "@ethersproject/strings" "^5.0.8" - -"@ethersproject/wordlists@5.3.0", "@ethersproject/wordlists@^5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.3.0.tgz#45a0205f5178c1de33d316cb2ab7ed5eac3c06c5" - integrity sha512-JcwumCZcsUxgWpiFU/BRy6b4KlTRdOmYvOKZcAw/3sdF93/pZyPW5Od2hFkHS8oWp4xS06YQ+qHqQhdcxdHafQ== - dependencies: - "@ethersproject/bytes" "^5.3.0" - "@ethersproject/hash" "^5.3.0" - "@ethersproject/logger" "^5.3.0" - "@ethersproject/properties" "^5.3.0" - "@ethersproject/strings" "^5.3.0" + "@ethersproject/bytes" "^5.6.0" + "@ethersproject/hash" "^5.6.0" + "@ethersproject/logger" "^5.6.0" + "@ethersproject/properties" "^5.6.0" + "@ethersproject/strings" "^5.6.0" "@sindresorhus/is@^0.14.0": version "0.14.0" @@ -678,33 +395,20 @@ dependencies: defer-to-connect "^1.0.1" -"@tsconfig/node10@^1.0.7": - version "1.0.8" - resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.8.tgz#c1e4e80d6f964fbecb3359c43bd48b40f7cadad9" - integrity sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg== - -"@tsconfig/node12@^1.0.7": - version "1.0.9" - resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.9.tgz#62c1f6dee2ebd9aead80dc3afa56810e58e1a04c" - integrity sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw== - -"@tsconfig/node14@^1.0.0": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.1.tgz#95f2d167ffb9b8d2068b0b235302fafd4df711f2" - integrity sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg== - -"@tsconfig/node16@^1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.2.tgz#423c77877d0569db20e1fc80885ac4118314010e" - integrity sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA== - -"@types/bn.js@^4.11.3", "@types/bn.js@^4.11.5": +"@types/bn.js@^4.11.5": version "4.11.6" resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-4.11.6.tgz#c306c70d9358aaea33cd4eda092a742b9505967c" integrity sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg== dependencies: "@types/node" "*" +"@types/bn.js@^5.1.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-5.1.0.tgz#32c5d271503a12653c62cf4d2b45e6eab8cebc68" + integrity sha512-QSSVYj7pYFN49kW77o2s9xTCwZ8F2xLbjLLSEVh8D2F4JUhZtPAGOFLTD+ffqksBx/u4cE/KImFjyhqCjn/LIA== + dependencies: + "@types/node" "*" + "@types/csv-parse@^1.2.2": version "1.2.2" resolved "https://registry.yarnpkg.com/@types/csv-parse/-/csv-parse-1.2.2.tgz#713486235759d615dc8e6a6a979170ada76701d5" @@ -712,23 +416,30 @@ dependencies: csv-parse "*" +"@types/ethereumjs-util@^6.1.0": + version "6.1.0" + resolved "https://registry.yarnpkg.com/@types/ethereumjs-util/-/ethereumjs-util-6.1.0.tgz#9dabd7302ec9728a7d99be15f4143977c33cd5ac" + integrity sha512-5N0RJldhKCKwDksdnuNHbEJuwO5pjEdtwdHj/kZLxaS84s5R1NLgYfAuDF/VZ4whYABJJvv+o0O8TXLm+F/Byw== + dependencies: + ethereumjs-util "*" + "@types/node-fetch@^2.5.10": - version "2.5.12" - resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.5.12.tgz#8a6f779b1d4e60b7a57fb6fd48d84fb545b9cc66" - integrity sha512-MKgC4dlq4kKNa/mYrwpKfzQMB5X3ee5U6fSprkKpToBqBmX4nFZL9cW5jl6sWn+xpRJ7ypWh2yyqqr8UUCstSw== + version "2.6.1" + resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.6.1.tgz#8f127c50481db65886800ef496f20bbf15518975" + integrity sha512-oMqjURCaxoSIsHSr1E47QHzbmzNR5rK8McHuNb11BOM9cHcIK3Avy0s/b2JlXHoQGTYS3NsvWzV1M0iK7l0wbA== dependencies: "@types/node" "*" form-data "^3.0.0" "@types/node@*": - version "14.6.1" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.6.1.tgz#fdf6f6c6c73d3d8eee9c98a9a0485bc524b048d7" - integrity sha512-HnYlg/BRF8uC1FyKRFZwRaCPTPYKa+6I8QiUZFLredaGOou481cgFS4wKRFyKvQtX8xudqkSdBczJHIYSQYKrQ== + version "17.0.23" + resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.23.tgz#3b41a6e643589ac6442bdbd7a4a3ded62f33f7da" + integrity sha512-UxDxWn7dl97rKVeVS61vErvw086aCYhDLyvRQZ5Rk65rZKepaFdm53GeqXaKBuOhED4e9uWq34IC3TdSdJJ2Gw== "@types/node@^12.12.6": - version "12.12.54" - resolved "https://registry.yarnpkg.com/@types/node/-/node-12.12.54.tgz#a4b58d8df3a4677b6c08bfbc94b7ad7a7a5f82d1" - integrity sha512-ge4xZ3vSBornVYlDnk7yZ0gK6ChHf/CHB7Gl1I0Jhah8DDnEQqBzgohYG4FX4p81TNirSETOiSyn+y1r9/IR6w== + version "12.20.47" + resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.47.tgz#ca9237d51f2a2557419688511dab1c8daf475188" + integrity sha512-BzcaRsnFuznzOItW1WpQrDHM7plAa7GIDMZ6b5pnMbkqEtM/6WCOhvZar39oeMQP79gwvFUWjjptE7/KGcNqFg== "@types/node@^15.12.5": version "15.14.9" @@ -743,21 +454,26 @@ "@types/node" "*" "@types/secp256k1@^4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@types/secp256k1/-/secp256k1-4.0.1.tgz#fb3aa61a1848ad97d7425ff9dcba784549fca5a4" - integrity sha512-+ZjSA8ELlOp8SlKi0YLB2tz9d5iPNEmOBd+8Rz21wTMdaXQIa9b6TEnD6l5qKOCypE7FSyPyck12qZJxSDNoog== + version "4.0.3" + resolved "https://registry.yarnpkg.com/@types/secp256k1/-/secp256k1-4.0.3.tgz#1b8e55d8e00f08ee7220b4d59a6abe89c37a901c" + integrity sha512-Da66lEIFeIz9ltsdMZcpQvmrmmoqrfju8pm1BH8WbYjZSwUgCwXLb9C+9XYogwBITnbsSaMdVPb2ekf7TV+03w== dependencies: "@types/node" "*" +"@types/text-encoding@0.0.36": + version "0.0.36" + resolved "https://registry.yarnpkg.com/@types/text-encoding/-/text-encoding-0.0.36.tgz#c1343e35188cb8f8d5f9ada4ff5b72829b29ea19" + integrity sha512-LfATA7bH+MtAPlOshYgQ1M3n2r0TSB6Ns5ESvKYlVugkKErQg5oFbR2qO7XrKtNsrtzedDvTeqQfyTjdPJH7jw== + "@types/yargs-parser@*": - version "20.2.1" - resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-20.2.1.tgz#3b9ce2489919d9e4fea439b76916abc34b2df129" - integrity sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw== + version "21.0.0" + resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.0.tgz#0c60e537fa790f5f9472ed2776c2b71ec117351b" + integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA== "@types/yargs@^17.0.2": - version "17.0.5" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.5.tgz#1e7e59a88420872875842352b73618f5e77e835f" - integrity sha512-4HNq144yhaVjJs+ON6A07NEoi9Hh0Rhl/jI9Nt/l/YRjt+T6St/QK3meFARWZ8IgkzoD1LC0PdTdJenlQQi2WQ== + version "17.0.10" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.10.tgz#591522fce85d8739bca7b8bb90d048e4478d186a" + integrity sha512-gmEaFwpj/7f/ROdtIlci1R1VYU1J4j95m8T+Tj3iBgiBFKg1foE/PSl93bBd5T9LDXNPo8UlNN6W0qwD8O5OaA== dependencies: "@types/yargs-parser" "*" @@ -769,23 +485,13 @@ abi-decoder@^2.4.0: web3-eth-abi "^1.2.1" web3-utils "^1.2.1" -accepts@~1.3.7: - version "1.3.7" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" - integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== +accepts@~1.3.8: + version "1.3.8" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" + integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== dependencies: - mime-types "~2.1.24" - negotiator "0.6.2" - -acorn-walk@^8.1.1: - version "8.2.0" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" - integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== - -acorn@^8.4.1: - version "8.5.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.5.0.tgz#4512ccb99b3698c752591e9bb4472e38ad43cee2" - integrity sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q== + mime-types "~2.1.34" + negotiator "0.6.3" aes-js@3.0.0: version "3.0.0" @@ -793,9 +499,9 @@ aes-js@3.0.0: integrity sha1-4h3xCtbCBTKVvLuNq0Cwnb6ofk0= ajv@^6.12.3: - version "6.12.4" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.4.tgz#0614facc4522127fa713445c6bfd3ebd376e2234" - integrity sha512-eienB2c9qVQs2KWexhkrdMLVDoIQCz5KSeLxwg9Lzk4DOfBtIK9PQwwufcsn1jjGuf9WZmqPMbGxOzfcuphJCQ== + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== dependencies: fast-deep-equal "^3.1.1" fast-json-stable-stringify "^2.0.0" @@ -814,11 +520,6 @@ ansi-styles@^4.0.0: dependencies: color-convert "^2.0.1" -arg@^4.1.0: - version "4.1.3" - resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" - integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== - array-flatten@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" @@ -835,9 +536,9 @@ asn1.js@^5.2.0: safer-buffer "^2.1.0" asn1@~0.2.3: - version "0.2.4" - resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" - integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== + version "0.2.6" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.6.tgz#0d3a7bb6e64e02a90c0303b31f292868ea09a08d" + integrity sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ== dependencies: safer-buffer "~2.1.0" @@ -856,35 +557,32 @@ asynckit@^0.4.0: resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= +available-typed-arrays@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" + integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== + aws-sign2@~0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= aws4@^1.8.0: - version "1.10.1" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.10.1.tgz#e1e82e4f3e999e2cfd61b161280d16a111f86428" - integrity sha512-zg7Hz2k5lI8kb7U32998pRRFin7zJlkfezGJjUc2heaD4Pw2wObakCDVzkKztTm/Ln7eiVvYsjqak0Ed4LkMDA== - -babel-runtime@6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" - integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4= - dependencies: - core-js "^2.4.0" - regenerator-runtime "^0.11.0" + version "1.11.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59" + integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== base-x@^3.0.2, base-x@^3.0.8: - version "3.0.8" - resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.8.tgz#1e1106c2537f0162e8b52474a557ebb09000018d" - integrity sha512-Rl/1AWP4J/zRrk54hhlxH4drNxPJXYUaKffODVI53/dAsV4t9fBxyxYKAVPU1XBHxYwOWP9h9H0hM2MVw4YfJA== + version "3.0.9" + resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.9.tgz#6349aaabb58526332de9f60995e548a53fe21320" + integrity sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ== dependencies: safe-buffer "^5.0.1" -base64-js@^1.0.2: - version "1.3.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1" - integrity sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g== +base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== bcrypt-pbkdf@^1.0.0: version "1.0.2" @@ -898,20 +596,15 @@ bech32@1.1.4: resolved "https://registry.yarnpkg.com/bech32/-/bech32-1.1.4.tgz#e38c9f37bf179b8eb16ae3a772b40c356d4832e9" integrity sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ== -bigi@1.4.2, bigi@^1.1.0: - version "1.4.2" - resolved "https://registry.yarnpkg.com/bigi/-/bigi-1.4.2.tgz#9c665a95f88b8b08fc05cfd731f561859d725825" - integrity sha1-nGZalfiLiwj8Bc/XMfVhhZ1yWCU= - bignumber.js@^9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.0.0.tgz#805880f84a329b5eac6e7cb6f8274b6d82bdf075" - integrity sha512-t/OYhhJ2SD+YGBQcjY8GzzDHEk9f3nerxjtfa6tlMXfe7frs/WozhvCNoGvpM0P3bNf3Gq5ZRMlGr5f3r4/N8A== + version "9.0.2" + resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.0.2.tgz#71c6c6bed38de64e24a65ebe16cfcf23ae693673" + integrity sha512-GAcQvbpsM0pUb0zw1EI0KhQEZ+lRwR5fYaAp3vPOYuP7aDvGy6cVN6XHLauvF8SOga2y0dcLcjt3iQDTSEliyw== blakejs@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/blakejs/-/blakejs-1.1.0.tgz#69df92ef953aa88ca51a32df6ab1c54a155fc7a5" - integrity sha1-ad+S75U6qIylGjLfarHFShVfx6U= + version "1.2.1" + resolved "https://registry.yarnpkg.com/blakejs/-/blakejs-1.2.1.tgz#5057e4206eadb4a97f7c0b6e197a505042fc3814" + integrity sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ== bluebird@^3.5.0: version "3.7.2" @@ -923,53 +616,37 @@ bn.js@4.11.6: resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.6.tgz#53344adb14617a13f6e8dd2ce28905d1c0ba3215" integrity sha1-UzRK2xRhehP26N0s4okF0cC6MhU= -bn.js@5.2.0: +bn.js@5.2.0, bn.js@^5.0.0, bn.js@^5.1.1, bn.js@^5.1.2, bn.js@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.0.tgz#358860674396c6997771a9d051fcc1b57d4ae002" integrity sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw== -bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.0, bn.js@^4.11.1, bn.js@^4.11.6, bn.js@^4.11.9, bn.js@^4.4.0: - version "4.11.9" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.9.tgz#26d556829458f9d1e81fc48952493d0ba3507828" - integrity sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw== - -bn.js@^5.1.1, bn.js@^5.1.2: - version "5.1.3" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.1.3.tgz#beca005408f642ebebea80b042b4d18d2ac0ee6b" - integrity sha512-GkTiFpjFtUzU9CbMeJ5iazkCzGL3jrhzerzZIuqLABjbwRaFt33I9tUdSNryIptM+RxDet6OKm2WnLXzW51KsQ== +bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.6, bn.js@^4.11.9: + version "4.12.0" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" + integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== -body-parser@1.19.0, body-parser@^1.16.0: - version "1.19.0" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" - integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw== +body-parser@1.19.2, body-parser@^1.16.0: + version "1.19.2" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.2.tgz#4714ccd9c157d44797b8b5607d72c0b89952f26e" + integrity sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw== dependencies: - bytes "3.1.0" + bytes "3.1.2" content-type "~1.0.4" debug "2.6.9" depd "~1.1.2" - http-errors "1.7.2" + http-errors "1.8.1" iconv-lite "0.4.24" on-finished "~2.3.0" - qs "6.7.0" - raw-body "2.4.0" - type-is "~1.6.17" + qs "6.9.7" + raw-body "2.4.3" + type-is "~1.6.18" brorand@^1.0.1, brorand@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= -browserify-aes@1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.0.6.tgz#5e7725dbdef1fd5930d4ebab48567ce451c48a0a" - integrity sha1-Xncl297x/Vkw1OurSFZ85FHEigo= - dependencies: - buffer-xor "^1.0.2" - cipher-base "^1.0.0" - create-hash "^1.1.0" - evp_bytestokey "^1.0.0" - inherits "^2.0.1" - browserify-aes@^1.0.0, browserify-aes@^1.0.4, browserify-aes@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" @@ -1002,11 +679,11 @@ browserify-des@^1.0.0: safe-buffer "^5.1.2" browserify-rsa@^4.0.0, browserify-rsa@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524" - integrity sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ= + version "4.1.0" + resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.1.0.tgz#b2fd06b5b75ae297f7ce2dc651f918f5be158c8d" + integrity sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog== dependencies: - bn.js "^4.1.0" + bn.js "^5.0.0" randombytes "^2.0.1" browserify-sign@^4.0.0: @@ -1024,7 +701,7 @@ browserify-sign@^4.0.0: readable-stream "^3.6.0" safe-buffer "^5.2.0" -bs58@4.0.1, bs58@^4.0.0: +bs58@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a" integrity sha1-vhYedsNU9veIrkBx9j806MTwpCo= @@ -1045,37 +722,30 @@ buffer-to-arraybuffer@^0.0.5: resolved "https://registry.yarnpkg.com/buffer-to-arraybuffer/-/buffer-to-arraybuffer-0.0.5.tgz#6064a40fa76eb43c723aba9ef8f6e1216d10511a" integrity sha1-YGSkD6dutDxyOrqe+PbhIW0QURo= -buffer-xor@^1.0.2, buffer-xor@^1.0.3: +buffer-xor@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= buffer@^5.0.5, buffer@^5.5.0, buffer@^5.6.0: - version "5.6.0" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.6.0.tgz#a31749dc7d81d84db08abf937b6b8c4033f62786" - integrity sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw== + version "5.7.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== dependencies: - base64-js "^1.0.2" - ieee754 "^1.1.4" + base64-js "^1.3.1" + ieee754 "^1.1.13" bufferutil@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.1.tgz#3a177e8e5819a1243fe16b63a199951a7ad8d4a7" - integrity sha512-xowrxvpxojqkagPcWRQVXZl0YXhRhAtBEIq3VoER1NH5Mw1n1o0ojdspp+GS2J//2gCVyrzQDApQ4unGF+QOoA== + version "4.0.6" + resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.6.tgz#ebd6c67c7922a0e902f053e5d8be5ec850e48433" + integrity sha512-jduaYOYtnio4aIAyc6UbvPCVcgq7nYpVnucyxr6eCYg/Woad9Hf/oxxBRDnGGjPfjUm6j5O/uBWhIu4iLebFaw== dependencies: - node-gyp-build "~3.7.0" + node-gyp-build "^4.3.0" -bytebuffer@5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/bytebuffer/-/bytebuffer-5.0.1.tgz#582eea4b1a873b6d020a48d58df85f0bba6cfddd" - integrity sha1-WC7qSxqHO20CCkjVjfhfC7ps/d0= - dependencies: - long "~3" - -bytes@3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" - integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== +bytes@3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" + integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== cacheable-request@^6.0.0: version "6.1.0" @@ -1090,12 +760,25 @@ cacheable-request@^6.0.0: normalize-url "^4.1.0" responselike "^1.0.2" +call-bind@^1.0.0, call-bind@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + caseless@~0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= -chownr@^1.1.1: +child-process@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/child-process/-/child-process-1.0.2.tgz#98974dc7ed1ee4c6229f8e305fa7313a6885a7f2" + integrity sha1-mJdNx+0e5MYin44wX6cxOmiFp/I= + +chownr@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== @@ -1159,12 +842,12 @@ combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: dependencies: delayed-stream "~1.0.0" -content-disposition@0.5.3: - version "0.5.3" - resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" - integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g== +content-disposition@0.5.4: + version "0.5.4" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" + integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== dependencies: - safe-buffer "5.1.2" + safe-buffer "5.2.1" content-hash@^2.5.2: version "2.5.2" @@ -1185,20 +868,15 @@ cookie-signature@1.0.6: resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= -cookie@0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba" - integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== +cookie@0.4.2: + version "0.4.2" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432" + integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== cookiejar@^2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/cookiejar/-/cookiejar-2.1.2.tgz#dd8a235530752f988f9a0844f3fc589e3111125c" - integrity sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA== - -core-js@^2.4.0: - version "2.6.11" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.11.tgz#38831469f9922bded8ee21c9dc46985e0399308c" - integrity sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg== + version "2.1.3" + resolved "https://registry.yarnpkg.com/cookiejar/-/cookiejar-2.1.3.tgz#fc7a6216e408e74414b90230050842dacda75acc" + integrity sha512-JxbCBUdrfr6AQjOXrxoTvAMJO4HBTUIlBzslcJPAz+/KT8yk53fXun51u+RenNYvad/+Vc2DIz5o9UxlCDymFQ== core-util-is@1.0.2: version "1.0.2" @@ -1213,6 +891,14 @@ cors@^2.8.1: object-assign "^4" vary "^1" +crc-32@^1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/crc-32/-/crc-32-1.2.1.tgz#436d2bcaad27bcb6bd073a2587139d3024a16460" + integrity sha512-Dn/xm/1vFFgs3nfrpEVScHoIslO9NZRITWGz/1E/St6u4xw99vfZzVkW0OSnzx2h9egej9xwMCEut6sqwokM/w== + dependencies: + exit-on-epipe "~1.0.1" + printj "~1.3.1" + create-ecdh@^4.0.0: version "4.0.4" resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e" @@ -1221,16 +907,6 @@ create-ecdh@^4.0.0: bn.js "^4.1.0" elliptic "^6.5.3" -create-hash@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.1.3.tgz#606042ac8b9262750f483caddab0f5819172d8fd" - integrity sha1-YGBCrIuSYnUPSDyt2rD1gZFy2P0= - dependencies: - cipher-base "^1.0.1" - inherits "^2.0.1" - ripemd160 "^2.0.0" - sha.js "^2.4.0" - create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" @@ -1242,18 +918,6 @@ create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: ripemd160 "^2.0.1" sha.js "^2.4.0" -create-hmac@1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.6.tgz#acb9e221a4e17bdb076e90657c42b93e3726cf06" - integrity sha1-rLniIaThe9sHbpBlfEK5PjcmzwY= - dependencies: - cipher-base "^1.0.3" - create-hash "^1.1.0" - inherits "^2.0.1" - ripemd160 "^2.0.0" - safe-buffer "^5.0.1" - sha.js "^2.4.8" - create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: version "1.1.7" resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" @@ -1266,10 +930,12 @@ create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: safe-buffer "^5.0.1" sha.js "^2.4.8" -create-require@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" - integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== +cross-fetch@^3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.5.tgz#e1389f44d9e7ba767907f7af8454787952ab534f" + integrity sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw== + dependencies: + node-fetch "2.6.7" crypto-browserify@3.12.0: version "3.12.0" @@ -1288,7 +954,12 @@ crypto-browserify@3.12.0: randombytes "^2.0.0" randomfill "^1.0.3" -csv-parse@*, csv-parse@^4.16.0: +csv-parse@*: + version "5.0.4" + resolved "https://registry.yarnpkg.com/csv-parse/-/csv-parse-5.0.4.tgz#97e5e654413bcf95f2714ce09bcb2be6de0eb8e3" + integrity sha512-5AIdl8l6n3iYQYxan5djB5eKDa+vBnhfWZtRpJTcrETWfVLYN0WSj3L9RwvgYt+psoO77juUr8TG8qpfGZifVQ== + +csv-parse@^4.16.0: version "4.16.3" resolved "https://registry.yarnpkg.com/csv-parse/-/csv-parse-4.16.3.tgz#7ca624d517212ebc520a36873c3478fa66efbaf7" integrity sha512-cO1I/zmz4w2dcKHVvpCr7JVRu8/FymG5OEpmvsZYlccYolPBLoVGKUHgNoc4ZGkFeFlWGEDmMyBM+TTqRdW/wg== @@ -1308,6 +979,11 @@ dashdash@^1.12.0: dependencies: assert-plus "^1.0.0" +data-uri-to-buffer@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-4.0.0.tgz#b5db46aea50f6176428ac05b73be39a57701a64b" + integrity sha512-Vr3mLBA8qWmcuschSLAOogKgQ/Jwxulv3RNE4FXnYWRGujzrRWQI4m12fQqRkwX06C0KanhLr4hK+GydchZsaA== + debug@2.6.9, debug@^2.2.0: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" @@ -1332,6 +1008,13 @@ defer-to-connect@^1.0.1: resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591" integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ== +define-properties@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" + integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== + dependencies: + object-keys "^1.0.12" + delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" @@ -1355,11 +1038,6 @@ destroy@~1.0.4: resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= -diff@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" - integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== - diffie-hellman@^5.0.0: version "5.0.3" resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" @@ -1387,32 +1065,12 @@ ecc-jsbn@~0.1.1: jsbn "~0.1.0" safer-buffer "^2.1.0" -ecurve@1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/ecurve/-/ecurve-1.0.5.tgz#d148e8fe50a674f983bb5bae09da0ea23e10535e" - integrity sha1-0Ujo/lCmdPmDu1uuCdoOoj4QU14= - dependencies: - bigi "^1.1.0" - ee-first@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= -elliptic@6.5.3, elliptic@^6.4.0, elliptic@^6.5.2, elliptic@^6.5.3: - version "6.5.3" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.3.tgz#cb59eb2efdaf73a0bd78ccd7015a62ad6e0f93d6" - integrity sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw== - dependencies: - bn.js "^4.4.0" - brorand "^1.0.1" - hash.js "^1.0.0" - hmac-drbg "^1.0.0" - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - minimalistic-crypto-utils "^1.0.0" - -elliptic@6.5.4: +elliptic@6.5.4, elliptic@^6.4.0, elliptic@^6.5.3, elliptic@^6.5.4: version "6.5.4" resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== @@ -1443,9 +1101,9 @@ end-of-stream@^1.1.0: once "^1.4.0" eosio-helpers@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/eosio-helpers/-/eosio-helpers-0.1.4.tgz#79bf6ba5fef4094702e4c64c9ac6ecf2b4108057" - integrity sha512-aqeD8uJKKSFXHcDKQy6JEMpS1YRW/9cUgRkdYGN7luw+E2nwmucicX506hosMXFQTtlr1TJLoNb4UMD115kjkA== + version "0.1.16" + resolved "https://registry.yarnpkg.com/eosio-helpers/-/eosio-helpers-0.1.16.tgz#f892d8a6501e1f31d9010559d99e8c1a25382379" + integrity sha512-F68cYLBnStvE8sAjvPsC4oV174WStZzYG7HC6uauB2hQQZ5okDYQXWUKOhbr7iewijt07Y7HEb+tAgIhpiNX8g== dependencies: "@types/csv-parse" "^1.2.2" "@types/node" "^15.12.5" @@ -1455,33 +1113,18 @@ eosio-helpers@^0.1.4: int64-buffer "^1.0.0" node-fetch "^2.6.1" text-encoding "^0.7.0" - ts-node "^10.0.0" typescript "^4.3.4" yargs "^17.1.1" -eosjs-ecc@4.0.7: - version "4.0.7" - resolved "https://registry.yarnpkg.com/eosjs-ecc/-/eosjs-ecc-4.0.7.tgz#f5246da3b84839fcc237204768ef6e5ea56cc814" - integrity sha512-uuqhqnrDy9XTpKfkhiZqRDUTCCI9oWBalVK5IosL7kpYwA9I3lm68INYFLyWsHpF2xwHqPql8MrMYJ3zfOn5Qg== - dependencies: - "@babel/runtime" "7.6.0" - bigi "1.4.2" - browserify-aes "1.0.6" - bs58 "4.0.1" - bytebuffer "5.0.1" - create-hash "1.1.3" - create-hmac "1.1.6" - ecurve "1.0.5" - randombytes "2.0.5" - -eosjs@^20.0.0: - version "20.0.3" - resolved "https://registry.yarnpkg.com/eosjs/-/eosjs-20.0.3.tgz#f3ac1fa119b76dd07bf2825ad27342f6502a533b" - integrity sha512-h0WSxsDo7AHz5IzpbQDrzyT/CYmbBDtFiiolTdtGd2FdKXEa6LDER4WbNp4qxCY7kD65KeG3knkGmOOFGbPJxw== - dependencies: - babel-runtime "6.26.0" - eosjs-ecc "4.0.7" - text-encoding "0.7.0" +eosjs@^21.0.3: + version "21.0.4" + resolved "https://registry.yarnpkg.com/eosjs/-/eosjs-21.0.4.tgz#67794a9fbc3c7659de19a7926c2c13cce4515571" + integrity sha512-XbuIoidplA1hHIejy7VQ+hmBfC6T28kYFaQMsn6G1DMTg1CFwUzxwzUvZg/dGNPuf7hgPxOpaQvAUsdidTgGhQ== + dependencies: + bn.js "5.2.0" + elliptic "6.5.4" + hash.js "1.1.7" + pako "2.0.3" eosjs@^22.0.0: version "22.1.0" @@ -1493,16 +1136,51 @@ eosjs@^22.0.0: hash.js "1.1.7" pako "2.0.3" +es-abstract@^1.18.5: + version "1.19.2" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.19.2.tgz#8f7b696d8f15b167ae3640b4060670f3d054143f" + integrity sha512-gfSBJoZdlL2xRiOCy0g8gLMryhoe1TlimjzU99L/31Z8QEGIhVQI+EWwt5lT+AuU9SnorVupXFqqOGqGfsyO6w== + dependencies: + call-bind "^1.0.2" + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + get-intrinsic "^1.1.1" + get-symbol-description "^1.0.0" + has "^1.0.3" + has-symbols "^1.0.3" + internal-slot "^1.0.3" + is-callable "^1.2.4" + is-negative-zero "^2.0.2" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.1" + is-string "^1.0.7" + is-weakref "^1.0.2" + object-inspect "^1.12.0" + object-keys "^1.1.1" + object.assign "^4.1.2" + string.prototype.trimend "^1.0.4" + string.prototype.trimstart "^1.0.4" + unbox-primitive "^1.0.1" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + es5-ext@^0.10.35, es5-ext@^0.10.50: - version "0.10.53" - resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.53.tgz#93c5a3acfdbef275220ad72644ad02ee18368de1" - integrity sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q== + version "0.10.59" + resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.59.tgz#71038939730eb6f4f165f1421308fb60be363bc6" + integrity sha512-cOgyhW0tIJyQY1Kfw6Kr0viu9ZlUctVchRMZ7R0HiH3dxTSp5zJDLecwxUqPUrGKMsgBI1wd1FL+d9Jxfi4cLw== dependencies: - es6-iterator "~2.0.3" - es6-symbol "~3.1.3" - next-tick "~1.0.0" + es6-iterator "^2.0.3" + es6-symbol "^3.1.3" + next-tick "^1.1.0" -es6-iterator@~2.0.3: +es6-iterator@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" integrity sha1-p96IkUGgWpSwhUQDstCg+/qY87c= @@ -1511,7 +1189,7 @@ es6-iterator@~2.0.3: es5-ext "^0.10.35" es6-symbol "^3.1.1" -es6-symbol@^3.1.1, es6-symbol@~3.1.3: +es6-symbol@^3.1.1, es6-symbol@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18" integrity sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA== @@ -1564,9 +1242,9 @@ eth-lib@^0.1.26: xhr-request-promise "^0.1.2" ethereum-bloom-filters@^1.0.6: - version "1.0.7" - resolved "https://registry.yarnpkg.com/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.7.tgz#b7b80735e385dbb7f944ce6b4533e24511306060" - integrity sha512-cDcJJSJ9GMAcURiAWO3DxIEhTL/uWqlQnvgKpuYQzYPrt/izuGU+1ntQmHt0IRq6ADoSYHFnB+aCEFIldjhkMQ== + version "1.0.10" + resolved "https://registry.yarnpkg.com/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.10.tgz#3ca07f4aed698e75bd134584850260246a5fed8a" + integrity sha512-rxJ5OFN3RwjQxDcFP2Z5+Q9ho4eIdEmSc2ht0fCu8Se9nbXjZ7/031uXoUYJ87KHCOdVeiUuwSnoS7hmYAGVHA== dependencies: js-sha3 "^0.8.0" @@ -1591,79 +1269,52 @@ ethereum-cryptography@^0.1.3: secp256k1 "^4.0.1" setimmediate "^1.0.5" -ethereumjs-common@^1.3.2, ethereumjs-common@^1.5.0: - version "1.5.2" - resolved "https://registry.yarnpkg.com/ethereumjs-common/-/ethereumjs-common-1.5.2.tgz#2065dbe9214e850f2e955a80e650cb6999066979" - integrity sha512-hTfZjwGX52GS2jcVO6E2sx4YuFnf0Fhp5ylo4pEPhEffNln7vS59Hr5sLnp3/QCazFLluuBZ+FZ6J5HTp0EqCA== - -ethereumjs-tx@^2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ethereumjs-tx/-/ethereumjs-tx-2.1.2.tgz#5dfe7688bf177b45c9a23f86cf9104d47ea35fed" - integrity sha512-zZEK1onCeiORb0wyCXUvg94Ve5It/K6GD1K+26KfFKodiBiS6d9lfCXlUKGBBdQ+bv7Day+JK0tj1K+BeNFRAw== - dependencies: - ethereumjs-common "^1.5.0" - ethereumjs-util "^6.0.0" - -ethereumjs-util@^6.0.0: - version "6.2.1" - resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz#fcb4e4dd5ceacb9d2305426ab1a5cd93e3163b69" - integrity sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw== +ethereumjs-util@*, ethereumjs-util@^7.0.10, ethereumjs-util@^7.0.4, ethereumjs-util@^7.1.0, ethereumjs-util@^7.1.4: + version "7.1.4" + resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-7.1.4.tgz#a6885bcdd92045b06f596c7626c3e89ab3312458" + integrity sha512-p6KmuPCX4mZIqsQzXfmSx9Y0l2hqf+VkAiwSisW3UKUFdk8ZkAt+AYaor83z2nSi6CU2zSsXMlD80hAbNEGM0A== dependencies: - "@types/bn.js" "^4.11.3" - bn.js "^4.11.0" - create-hash "^1.1.2" - elliptic "^6.5.2" - ethereum-cryptography "^0.1.3" - ethjs-util "0.1.6" - rlp "^2.2.3" - -ethereumjs-util@^7.0.4: - version "7.0.4" - resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-7.0.4.tgz#f4b2022a91416bf421b35b0d5b81c21e8abd8b7f" - integrity sha512-isldtbCn9fdnhBPxedMNbFkNWVZ8ZdQvKRDSrdflame/AycAPKMer+vEpndpBxYIB3qxN6bd3Gh1YCQW9LDkCQ== - dependencies: - "@types/bn.js" "^4.11.3" + "@types/bn.js" "^5.1.0" bn.js "^5.1.2" create-hash "^1.1.2" ethereum-cryptography "^0.1.3" - ethjs-util "0.1.6" rlp "^2.2.4" ethers@^5.3.1: - version "5.3.1" - resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.3.1.tgz#1f018f0aeb651576cd84fd987a45f0b99646d761" - integrity sha512-xCKmC0gsZ9gks89ZfK3B1y6LlPdvX5fxDtu9SytnpdDJR1M7pmJI+4H0AxQPMgUYr7GtQdmECLR0gWdJQ+lZYw== - dependencies: - "@ethersproject/abi" "5.3.1" - "@ethersproject/abstract-provider" "5.3.0" - "@ethersproject/abstract-signer" "5.3.0" - "@ethersproject/address" "5.3.0" - "@ethersproject/base64" "5.3.0" - "@ethersproject/basex" "5.3.0" - "@ethersproject/bignumber" "5.3.0" - "@ethersproject/bytes" "5.3.0" - "@ethersproject/constants" "5.3.0" - "@ethersproject/contracts" "5.3.0" - "@ethersproject/hash" "5.3.0" - "@ethersproject/hdnode" "5.3.0" - "@ethersproject/json-wallets" "5.3.0" - "@ethersproject/keccak256" "5.3.0" - "@ethersproject/logger" "5.3.0" - "@ethersproject/networks" "5.3.1" - "@ethersproject/pbkdf2" "5.3.0" - "@ethersproject/properties" "5.3.0" - "@ethersproject/providers" "5.3.1" - "@ethersproject/random" "5.3.0" - "@ethersproject/rlp" "5.3.0" - "@ethersproject/sha2" "5.3.0" - "@ethersproject/signing-key" "5.3.0" - "@ethersproject/solidity" "5.3.0" - "@ethersproject/strings" "5.3.0" - "@ethersproject/transactions" "5.3.0" - "@ethersproject/units" "5.3.0" - "@ethersproject/wallet" "5.3.0" - "@ethersproject/web" "5.3.0" - "@ethersproject/wordlists" "5.3.0" + version "5.6.2" + resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.6.2.tgz#e75bac7f038c5e0fdde667dba62fc223924143a2" + integrity sha512-EzGCbns24/Yluu7+ToWnMca3SXJ1Jk1BvWB7CCmVNxyOeM4LLvw2OLuIHhlkhQk1dtOcj9UMsdkxUh8RiG1dxQ== + dependencies: + "@ethersproject/abi" "5.6.0" + "@ethersproject/abstract-provider" "5.6.0" + "@ethersproject/abstract-signer" "5.6.0" + "@ethersproject/address" "5.6.0" + "@ethersproject/base64" "5.6.0" + "@ethersproject/basex" "5.6.0" + "@ethersproject/bignumber" "5.6.0" + "@ethersproject/bytes" "5.6.1" + "@ethersproject/constants" "5.6.0" + "@ethersproject/contracts" "5.6.0" + "@ethersproject/hash" "5.6.0" + "@ethersproject/hdnode" "5.6.0" + "@ethersproject/json-wallets" "5.6.0" + "@ethersproject/keccak256" "5.6.0" + "@ethersproject/logger" "5.6.0" + "@ethersproject/networks" "5.6.1" + "@ethersproject/pbkdf2" "5.6.0" + "@ethersproject/properties" "5.6.0" + "@ethersproject/providers" "5.6.2" + "@ethersproject/random" "5.6.0" + "@ethersproject/rlp" "5.6.0" + "@ethersproject/sha2" "5.6.0" + "@ethersproject/signing-key" "5.6.0" + "@ethersproject/solidity" "5.6.0" + "@ethersproject/strings" "5.6.0" + "@ethersproject/transactions" "5.6.0" + "@ethersproject/units" "5.6.0" + "@ethersproject/wallet" "5.6.0" + "@ethersproject/web" "5.6.0" + "@ethersproject/wordlists" "5.6.0" ethjs-unit@0.1.6: version "0.1.6" @@ -1673,14 +1324,6 @@ ethjs-unit@0.1.6: bn.js "4.11.6" number-to-bn "1.7.0" -ethjs-util@0.1.6: - version "0.1.6" - resolved "https://registry.yarnpkg.com/ethjs-util/-/ethjs-util-0.1.6.tgz#f308b62f185f9fe6237132fb2a9818866a5cd536" - integrity sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w== - dependencies: - is-hex-prefixed "1.0.0" - strip-hex-prefix "1.0.0" - eventemitter3@4.0.4: version "4.0.4" resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.4.tgz#b5463ace635a083d018bdc7c917b4c5f10a85384" @@ -1694,17 +1337,22 @@ evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: md5.js "^1.3.4" safe-buffer "^5.1.1" +exit-on-epipe@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz#0bdd92e87d5285d267daa8171d0eb06159689692" + integrity sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw== + express@^4.14.0: - version "4.17.1" - resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" - integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g== + version "4.17.3" + resolved "https://registry.yarnpkg.com/express/-/express-4.17.3.tgz#f6c7302194a4fb54271b73a1fe7a06478c8f85a1" + integrity sha512-yuSQpz5I+Ch7gFrPCk4/c+dIBKlQUxtgwqzph132bsT6qhuzss6I8cLJQz7B3rFblzd6wtcI0ZbGltH/C4LjUg== dependencies: - accepts "~1.3.7" + accepts "~1.3.8" array-flatten "1.1.1" - body-parser "1.19.0" - content-disposition "0.5.3" + body-parser "1.19.2" + content-disposition "0.5.4" content-type "~1.0.4" - cookie "0.4.0" + cookie "0.4.2" cookie-signature "1.0.6" debug "2.6.9" depd "~1.1.2" @@ -1718,24 +1366,24 @@ express@^4.14.0: on-finished "~2.3.0" parseurl "~1.3.3" path-to-regexp "0.1.7" - proxy-addr "~2.0.5" - qs "6.7.0" + proxy-addr "~2.0.7" + qs "6.9.7" range-parser "~1.2.1" - safe-buffer "5.1.2" - send "0.17.1" - serve-static "1.14.1" - setprototypeof "1.1.1" + safe-buffer "5.2.1" + send "0.17.2" + serve-static "1.14.2" + setprototypeof "1.2.0" statuses "~1.5.0" type-is "~1.6.18" utils-merge "1.0.1" vary "~1.1.2" ext@^1.1.2: - version "1.4.0" - resolved "https://registry.yarnpkg.com/ext/-/ext-1.4.0.tgz#89ae7a07158f79d35517882904324077e4379244" - integrity sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A== + version "1.6.0" + resolved "https://registry.yarnpkg.com/ext/-/ext-1.6.0.tgz#3871d50641e874cc172e2b53f919842d19db4c52" + integrity sha512-sdBImtzkq2HpkdRLtlLWDa6w4DX22ijZLKx8BMPUuKe1c5lbN6xwQDQCxSfxBQnHZ13ls/FH0MQZx/q/gr6FQg== dependencies: - type "^2.0.0" + type "^2.5.0" extend@~3.0.2: version "3.0.2" @@ -1748,9 +1396,9 @@ extsprintf@1.3.0: integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= extsprintf@^1.2.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" - integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= + version "1.4.1" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.1.tgz#8d172c064867f235c0c84a596806d279bf4bcc07" + integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA== fast-deep-equal@^3.1.1: version "3.1.3" @@ -1762,6 +1410,14 @@ fast-json-stable-stringify@^2.0.0: resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== +fetch-blob@^3.1.2, fetch-blob@^3.1.4: + version "3.1.5" + resolved "https://registry.yarnpkg.com/fetch-blob/-/fetch-blob-3.1.5.tgz#0077bf5f3fcdbd9d75a0b5362f77dbb743489863" + integrity sha512-N64ZpKqoLejlrwkIAnb9iLSA3Vx/kjgzpcDhygcqJ2KKjky8nCgUQ+dzXtbrLaWZGZNmNfQTsiQ0weZ1svglHg== + dependencies: + node-domexception "^1.0.0" + web-streams-polyfill "^3.0.3" + finalhandler@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" @@ -1775,6 +1431,11 @@ finalhandler@~1.1.2: statuses "~1.5.0" unpipe "~1.0.0" +foreach@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" + integrity sha1-C+4AUBiusmDQo6865ljdATbsG5k= + forever-agent@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" @@ -1798,10 +1459,17 @@ form-data@~2.3.2: combined-stream "^1.0.6" mime-types "^2.1.12" -forwarded@~0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" - integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ= +formdata-polyfill@^4.0.10: + version "4.0.10" + resolved "https://registry.yarnpkg.com/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz#24807c31c9d402e002ab3d8c720144ceb8848423" + integrity sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g== + dependencies: + fetch-blob "^3.1.2" + +forwarded@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" + integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== fresh@0.5.2: version "0.5.2" @@ -1817,18 +1485,32 @@ fs-extra@^4.0.2: jsonfile "^4.0.0" universalify "^0.1.0" -fs-minipass@^1.2.5: +fs-minipass@^1.2.7: version "1.2.7" resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7" integrity sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA== dependencies: minipass "^2.6.0" +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + get-caller-file@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== +get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" + integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + get-stream@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" @@ -1848,6 +1530,14 @@ get-stream@^5.1.0: dependencies: pump "^3.0.0" +get-symbol-description@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" + integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + getpass@^0.1.1: version "0.1.7" resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" @@ -1855,13 +1545,13 @@ getpass@^0.1.1: dependencies: assert-plus "^1.0.0" -global@~4.3.0: - version "4.3.2" - resolved "https://registry.yarnpkg.com/global/-/global-4.3.2.tgz#e76989268a6c74c38908b1305b10fc0e394e9d0f" - integrity sha1-52mJJopsdMOJCLEwWxD8DjlOnQ8= +global@~4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/global/-/global-4.4.0.tgz#3e7b105179006a323ed71aafca3e9c57a5cc6406" + integrity sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w== dependencies: min-document "^2.19.0" - process "~0.5.1" + process "^0.11.10" got@9.6.0: version "9.6.0" @@ -1901,9 +1591,9 @@ got@^7.1.0: url-to-options "^1.0.1" graceful-fs@^4.1.2, graceful-fs@^4.1.6: - version "4.2.4" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" - integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== + version "4.2.9" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.9.tgz#041b05df45755e587a24942279b9d113146e1c96" + integrity sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ== har-schema@^2.0.0: version "2.0.0" @@ -1918,11 +1608,21 @@ har-validator@~5.1.3: ajv "^6.12.3" har-schema "^2.0.0" +has-bigints@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113" + integrity sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA== + has-symbol-support-x@^1.4.1: version "1.4.2" resolved "https://registry.yarnpkg.com/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz#1409f98bc00247da45da67cee0a36f282ff26455" integrity sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw== +has-symbols@^1.0.1, has-symbols@^1.0.2, has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + has-to-string-tag-x@^1.2.0: version "1.4.1" resolved "https://registry.yarnpkg.com/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz#a045ab383d7b4b2012a00148ab0aa5f290044d4d" @@ -1930,6 +1630,20 @@ has-to-string-tag-x@^1.2.0: dependencies: has-symbol-support-x "^1.4.1" +has-tostringtag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" + integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== + dependencies: + has-symbols "^1.0.2" + +has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + hash-base@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33" @@ -1947,7 +1661,7 @@ hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3, hash.js@^1.1.7: inherits "^2.0.3" minimalistic-assert "^1.0.1" -hmac-drbg@^1.0.0, hmac-drbg@^1.0.1: +hmac-drbg@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= @@ -1961,27 +1675,16 @@ http-cache-semantics@^4.0.0: resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390" integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ== -http-errors@1.7.2: - version "1.7.2" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f" - integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg== - dependencies: - depd "~1.1.2" - inherits "2.0.3" - setprototypeof "1.1.1" - statuses ">= 1.5.0 < 2" - toidentifier "1.0.0" - -http-errors@~1.7.2: - version "1.7.3" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" - integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== +http-errors@1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.8.1.tgz#7c3f28577cbc8a207388455dbd62295ed07bd68c" + integrity sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g== dependencies: depd "~1.1.2" inherits "2.0.4" - setprototypeof "1.1.1" + setprototypeof "1.2.0" statuses ">= 1.5.0 < 2" - toidentifier "1.0.0" + toidentifier "1.0.1" http-https@^1.0.0: version "1.0.0" @@ -2011,15 +1714,10 @@ idna-uts46-hx@^2.3.1: dependencies: punycode "2.1.0" -ieee754@^1.1.4: - version "1.1.13" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" - integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg== - -inherits@2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" - integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= +ieee754@^1.1.13: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4: version "2.0.4" @@ -2031,11 +1729,55 @@ int64-buffer@^1.0.0: resolved "https://registry.yarnpkg.com/int64-buffer/-/int64-buffer-1.0.1.tgz#c78d841b444cadf036cd04f8683696c740f15dca" integrity sha512-+3azY4pXrjAupJHU1V9uGERWlhoqNswJNji6aD/02xac7oxol508AsMC5lxKhEqyZeDFy3enq5OGWXF4u75hiw== +internal-slot@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c" + integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA== + dependencies: + get-intrinsic "^1.1.0" + has "^1.0.3" + side-channel "^1.0.4" + ipaddr.js@1.9.1: version "1.9.1" resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== +is-arguments@^1.0.4: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" + integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-bigint@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" + integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== + dependencies: + has-bigints "^1.0.1" + +is-boolean-object@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" + integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-callable@^1.1.4, is-callable@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945" + integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w== + +is-date-object@^1.0.1: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" + integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== + dependencies: + has-tostringtag "^1.0.0" + is-fullwidth-code-point@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" @@ -2046,36 +1788,100 @@ is-function@^1.0.1: resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.2.tgz#4f097f30abf6efadac9833b17ca5dc03f8144e08" integrity sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ== +is-generator-function@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" + integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== + dependencies: + has-tostringtag "^1.0.0" + is-hex-prefixed@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz#7d8d37e6ad77e5d127148913c573e082d777f554" integrity sha1-fY035q135dEnFIkTxXPggtd39VQ= +is-negative-zero@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" + integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== + +is-number-object@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.6.tgz#6a7aaf838c7f0686a50b4553f7e54a96494e89f0" + integrity sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g== + dependencies: + has-tostringtag "^1.0.0" + is-object@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.1.tgz#8952688c5ec2ffd6b03ecc85e769e02903083470" - integrity sha1-iVJojF7C/9awPsyF52ngKQMINHA= + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.2.tgz#a56552e1c665c9e950b4a025461da87e72f86fcf" + integrity sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA== is-plain-obj@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= +is-regex@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" + integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + is-retry-allowed@^1.0.0: version "1.2.0" resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz#d778488bd0a4666a3be8a1482b9f2baafedea8b4" integrity sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg== +is-shared-array-buffer@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz#97b0c85fbdacb59c9c446fe653b82cf2b5b7cfe6" + integrity sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA== + is-stream@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= +is-string@^1.0.5, is-string@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" + integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== + dependencies: + has-tostringtag "^1.0.0" + +is-symbol@^1.0.2, is-symbol@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" + integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== + dependencies: + has-symbols "^1.0.2" + +is-typed-array@^1.1.3, is-typed-array@^1.1.7: + version "1.1.8" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.8.tgz#cbaa6585dc7db43318bc5b89523ea384a6f65e79" + integrity sha512-HqH41TNZq2fgtGT8WHVFVJhBVGuY3AnP3Q36K8JKXUxSxRgk/d+7NjmwG2vo2mYmXK8UYZKu0qH8bVP5gEisjA== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + es-abstract "^1.18.5" + foreach "^2.0.5" + has-tostringtag "^1.0.0" + is-typedarray@^1.0.0, is-typedarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= +is-weakref@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" + integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== + dependencies: + call-bind "^1.0.2" + isstream@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" @@ -2089,16 +1895,16 @@ isurl@^1.0.0-alpha5: has-to-string-tag-x "^1.2.0" is-object "^1.0.1" -js-sha3@0.5.7, js-sha3@^0.5.7: - version "0.5.7" - resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.5.7.tgz#0d4ffd8002d5333aabaf4a23eed2f6374c9f28e7" - integrity sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc= - -js-sha3@^0.8.0: +js-sha3@0.8.0, js-sha3@^0.8.0: version "0.8.0" resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== +js-sha3@^0.5.7: + version "0.5.7" + resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.5.7.tgz#0d4ffd8002d5333aabaf4a23eed2f6374c9f28e7" + integrity sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc= + jsbn@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" @@ -2114,10 +1920,10 @@ json-schema-traverse@^0.4.1: resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== -json-schema@0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" - integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= +json-schema@0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.4.0.tgz#f7de4cf6efab838ebaeb3236474cbba5a1930ab5" + integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA== json-stringify-safe@~5.0.1: version "5.0.1" @@ -2132,22 +1938,23 @@ jsonfile@^4.0.0: graceful-fs "^4.1.6" jsprim@^1.2.2: - version "1.4.1" - resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" - integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= + version "1.4.2" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.2.tgz#712c65533a15c878ba59e9ed5f0e26d5b77c5feb" + integrity sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw== dependencies: assert-plus "1.0.0" extsprintf "1.3.0" - json-schema "0.2.3" + json-schema "0.4.0" verror "1.10.0" keccak@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/keccak/-/keccak-3.0.1.tgz#ae30a0e94dbe43414f741375cff6d64c8bea0bff" - integrity sha512-epq90L9jlFWCW7+pQa6JOnKn2Xgl2mtI664seYR6MHskvI9agt7AnDqmAlp9TqU4/caMYbA08Hi5DMZAl5zdkA== + version "3.0.2" + resolved "https://registry.yarnpkg.com/keccak/-/keccak-3.0.2.tgz#4c2c6e8c54e04f2670ee49fa734eb9da152206e0" + integrity sha512-PyKKjkH53wDMLGrvmRGSNWgmSxZOUqbnXwKL9tmgbFYA1iAYqW21kfR7mZXV0MlESiefxQQE9X9fTa3X+2MPDQ== dependencies: node-addon-api "^2.0.0" node-gyp-build "^4.2.0" + readable-stream "^3.6.0" keyv@^3.0.0: version "3.1.0" @@ -2156,11 +1963,6 @@ keyv@^3.0.0: dependencies: json-buffer "3.0.0" -long@~3: - version "3.2.0" - resolved "https://registry.yarnpkg.com/long/-/long-3.2.0.tgz#d821b7138ca1cb581c172990ef14db200b5c474b" - integrity sha1-2CG3E4yhy1gcFymQ7xTbIAtcR0s= - lowercase-keys@^1.0.0, lowercase-keys@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" @@ -2171,11 +1973,6 @@ lowercase-keys@^2.0.0: resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== -make-error@^1.1.1: - version "1.3.6" - resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" - integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== - md5.js@^1.3.4: version "1.3.5" resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" @@ -2208,17 +2005,17 @@ miller-rabin@^4.0.0: bn.js "^4.0.0" brorand "^1.0.1" -mime-db@1.44.0: - version "1.44.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.44.0.tgz#fa11c5eb0aca1334b4233cb4d52f10c5a6272f92" - integrity sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg== +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== -mime-types@^2.1.12, mime-types@^2.1.16, mime-types@~2.1.19, mime-types@~2.1.24: - version "2.1.27" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.27.tgz#47949f98e279ea53119f5722e0f34e529bec009f" - integrity sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w== +mime-types@^2.1.12, mime-types@^2.1.16, mime-types@~2.1.19, mime-types@~2.1.24, mime-types@~2.1.34: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== dependencies: - mime-db "1.44.0" + mime-db "1.52.0" mime@1.6.0: version "1.6.0" @@ -2242,17 +2039,17 @@ minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== -minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: +minimalistic-crypto-utils@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= -minimist@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" - integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== +minimist@^1.2.6: + version "1.2.6" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44" + integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== -minipass@^2.6.0, minipass@^2.8.6, minipass@^2.9.0: +minipass@^2.6.0, minipass@^2.9.0: version "2.9.0" resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6" integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg== @@ -2260,7 +2057,7 @@ minipass@^2.6.0, minipass@^2.8.6, minipass@^2.9.0: safe-buffer "^5.1.2" yallist "^3.0.0" -minizlib@^1.2.1: +minizlib@^1.3.3: version "1.3.3" resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d" integrity sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q== @@ -2279,27 +2076,27 @@ mkdirp@*: resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== -mkdirp@^0.5.0: - version "0.5.5" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" - integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== +mkdirp@^0.5.5: + version "0.5.6" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" + integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== dependencies: - minimist "^1.2.5" + minimist "^1.2.6" mock-fs@^4.1.0: - version "4.13.0" - resolved "https://registry.yarnpkg.com/mock-fs/-/mock-fs-4.13.0.tgz#31c02263673ec3789f90eb7b6963676aa407a598" - integrity sha512-DD0vOdofJdoaRNtnWcrXe6RQbpHkPPmtqGq14uRX0F8ZKJ5nv89CVTYl/BZdppDxBDaV0hl75htg3abpEWlPZA== + version "4.14.0" + resolved "https://registry.yarnpkg.com/mock-fs/-/mock-fs-4.14.0.tgz#ce5124d2c601421255985e6e94da80a7357b1b18" + integrity sha512-qYvlv/exQ4+svI3UOvPUpLDF0OMX5euvUH0Ny4N5QyRyhNdgAgUrVH3iUINSzEPLvx0kbo/Bp28GJKIqvE7URw== ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= -ms@2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" - integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== +ms@2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== multibase@^0.7.0: version "0.7.0" @@ -2346,47 +2143,51 @@ nano-json-stream-parser@^0.1.2: resolved "https://registry.yarnpkg.com/nano-json-stream-parser/-/nano-json-stream-parser-0.1.2.tgz#0cc8f6d0e2b622b479c40d499c46d64b755c6f5f" integrity sha1-DMj20OK2IrR5xA1JnEbWS3Vcb18= -negotiator@0.6.2: - version "0.6.2" - resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" - integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== +negotiator@0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" + integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== -next-tick@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c" - integrity sha1-yobR/ogoFpsBICCOPchCS524NCw= +next-tick@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.1.0.tgz#1836ee30ad56d67ef281b22bd199f709449b35eb" + integrity sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ== node-addon-api@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-2.0.2.tgz#432cfa82962ce494b132e9d72a15b29f71ff5d32" integrity sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA== -node-fetch@2.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.0.0.tgz#982bba43ecd4f2922a29cc186a6bbb0bb73fcba6" - integrity sha1-mCu6Q+zU8pIqKcwYamu7C7c/y6Y= +node-domexception@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/node-domexception/-/node-domexception-1.0.0.tgz#6888db46a1f71c0b76b3f7555016b63fe64766e5" + integrity sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ== -node-fetch@^2.6.1: - version "2.6.6" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.6.tgz#1751a7c01834e8e1697758732e9efb6eeadfaf89" - integrity sha512-Z8/6vRlTUChSdIgMa51jxQ4lrw/Jy5SOW10ObaA47/RElsAN2c5Pn8bTgFGWn/ibwzXTE8qwr1Yzx28vsecXEA== +node-fetch@2.6.7, node-fetch@^2.6.1: + version "2.6.7" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" + integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== dependencies: whatwg-url "^5.0.0" -node-gyp-build@^4.2.0: - version "4.2.3" - resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.2.3.tgz#ce6277f853835f718829efb47db20f3e4d9c4739" - integrity sha512-MN6ZpzmfNCRM+3t57PTJHgHyw/h4OWnZ6mR8P5j/uZtqQr46RRuDE/P+g3n0YR/AiYXeWixZZzaip77gdICfRg== +node-fetch@^3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-3.2.3.tgz#a03c9cc2044d21d1a021566bd52f080f333719a6" + integrity sha512-AXP18u4pidSZ1xYXRDPY/8jdv3RAozIt/WLNR/MBGZAz+xjtlr90RvCnsvHQRiXyWliZF/CpytExp32UU67/SA== + dependencies: + data-uri-to-buffer "^4.0.0" + fetch-blob "^3.1.4" + formdata-polyfill "^4.0.10" -node-gyp-build@~3.7.0: - version "3.7.0" - resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-3.7.0.tgz#daa77a4f547b9aed3e2aac779eaf151afd60ec8d" - integrity sha512-L/Eg02Epx6Si2NXmedx+Okg+4UHqmaf3TNcxd50SF9NQGcJaON3AtU++kax69XV7YWz4tUspqZSAsVofhFKG2w== +node-gyp-build@^4.2.0, node-gyp-build@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.3.0.tgz#9f256b03e5826150be39c764bf51e993946d71a3" + integrity sha512-iWjXZvmboq0ja1pUGULQBexmxq8CV4xBhX7VDOTbL7ZR4FOowwY/VOtRxBN/yKxmdGoIp4j5ysNT4u3S2pDQ3Q== normalize-url@^4.1.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.0.tgz#453354087e6ca96957bd8f5baf753f5982142129" - integrity sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ== + version "4.5.1" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.1.tgz#0dd90cf1288ee1d1313b87081c9a5932ee48518a" + integrity sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA== number-to-bn@1.7.0: version "1.7.0" @@ -2406,10 +2207,30 @@ object-assign@^4, object-assign@^4.1.0, object-assign@^4.1.1: resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= -oboe@2.1.4: - version "2.1.4" - resolved "https://registry.yarnpkg.com/oboe/-/oboe-2.1.4.tgz#20c88cdb0c15371bb04119257d4fdd34b0aa49f6" - integrity sha1-IMiM2wwVNxuwQRklfU/dNLCqSfY= +object-inspect@^1.12.0, object-inspect@^1.9.0: + version "1.12.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.0.tgz#6e2c120e868fd1fd18cb4f18c31741d0d6e776f0" + integrity sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g== + +object-keys@^1.0.12, object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object.assign@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" + integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + has-symbols "^1.0.1" + object-keys "^1.1.1" + +oboe@2.1.5: + version "2.1.5" + resolved "https://registry.yarnpkg.com/oboe/-/oboe-2.1.5.tgz#5554284c543a2266d7a38f17e073821fbde393cd" + integrity sha1-VVQoTFQ6ImbXo48X4HOCH73jk80= dependencies: http-https "^1.0.0" @@ -2466,9 +2287,9 @@ parse-asn1@^5.0.0, parse-asn1@^5.1.5: safe-buffer "^5.1.1" parse-headers@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/parse-headers/-/parse-headers-2.0.3.tgz#5e8e7512383d140ba02f0c7aa9f49b4399c92515" - integrity sha512-QhhZ+DCCit2Coi2vmAKbq5RGTRcQUOE2+REgv8vdyu7MnYx2eZztegqtTx99TZ86GTIwqiy3+4nQTWZ2tgmdCA== + version "2.0.5" + resolved "https://registry.yarnpkg.com/parse-headers/-/parse-headers-2.0.5.tgz#069793f9356a54008571eb7f9761153e6c770da9" + integrity sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA== parseurl@~1.3.3: version "1.3.3" @@ -2481,9 +2302,9 @@ path-to-regexp@0.1.7: integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= pbkdf2@^3.0.17, pbkdf2@^3.0.3: - version "3.1.1" - resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.1.tgz#cb8724b0fada984596856d1a6ebafd3584654b94" - integrity sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg== + version "3.1.2" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075" + integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA== dependencies: create-hash "^1.1.2" create-hmac "^1.1.4" @@ -2506,17 +2327,22 @@ prepend-http@^2.0.0: resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc= -process@~0.5.1: - version "0.5.2" - resolved "https://registry.yarnpkg.com/process/-/process-0.5.2.tgz#1638d8a8e34c2f440a91db95ab9aeb677fc185cf" - integrity sha1-FjjYqONML0QKkduVq5rrZ3/Bhc8= +printj@~1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/printj/-/printj-1.3.1.tgz#9af6b1d55647a1587ac44f4c1654a4b95b8e12cb" + integrity sha512-GA3TdL8szPK4AQ2YnOe/b+Y1jUFwmmGMMK/qbY7VcE3Z7FU8JstbKiKRzO6CIiAKPhTO8m01NoQ0V5f3jc4OGg== -proxy-addr@~2.0.5: - version "2.0.6" - resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.6.tgz#fdc2336505447d3f2f2c638ed272caf614bbb2bf" - integrity sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw== +process@^0.11.10: + version "0.11.10" + resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= + +proxy-addr@~2.0.7: + version "2.0.7" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" + integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== dependencies: - forwarded "~0.1.2" + forwarded "0.2.0" ipaddr.js "1.9.1" psl@^1.1.28: @@ -2554,15 +2380,15 @@ punycode@^2.1.0, punycode@^2.1.1: resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== -qs@6.7.0: - version "6.7.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" - integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== +qs@6.9.7: + version "6.9.7" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.7.tgz#4610846871485e1e048f44ae3b94033f0e675afe" + integrity sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw== qs@~6.5.2: - version "6.5.2" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" - integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== + version "6.5.3" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.3.tgz#3aeeffc91967ef6e35c0e488ef46fb296ab76aad" + integrity sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA== query-string@^5.0.1: version "5.1.1" @@ -2573,13 +2399,6 @@ query-string@^5.0.1: object-assign "^4.1.0" strict-uri-encode "^1.0.0" -randombytes@2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.0.5.tgz#dc009a246b8d09a177b4b7a0ae77bc570f4b1b79" - integrity sha512-8T7Zn1AhMsQ/HI1SjcCfT/t4ii3eAqco3yOcSzS4mozsOz69lHLsoMXmF9nZgnFanYscnSlUSgs8uZyKzpE6kg== - dependencies: - safe-buffer "^5.1.0" - randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" @@ -2600,13 +2419,13 @@ range-parser@~1.2.1: resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== -raw-body@2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332" - integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q== +raw-body@2.4.3: + version "2.4.3" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.3.tgz#8f80305d11c2a0a545c2d9d89d7a0286fcead43c" + integrity sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g== dependencies: - bytes "3.1.0" - http-errors "1.7.2" + bytes "3.1.2" + http-errors "1.8.1" iconv-lite "0.4.24" unpipe "1.0.0" @@ -2619,16 +2438,6 @@ readable-stream@^3.6.0: string_decoder "^1.1.1" util-deprecate "^1.0.1" -regenerator-runtime@^0.11.0: - version "0.11.1" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" - integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== - -regenerator-runtime@^0.13.2: - version "0.13.7" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz#cac2dacc8a1ea675feaabaeb8ae833898ae46f55" - integrity sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew== - request@^2.79.0: version "2.88.2" resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" @@ -2675,23 +2484,23 @@ ripemd160@^2.0.0, ripemd160@^2.0.1: hash-base "^3.0.0" inherits "^2.0.1" -rlp@^2.2.3, rlp@^2.2.4: - version "2.2.6" - resolved "https://registry.yarnpkg.com/rlp/-/rlp-2.2.6.tgz#c80ba6266ac7a483ef1e69e8e2f056656de2fb2c" - integrity sha512-HAfAmL6SDYNWPUOJNrM500x4Thn4PZsEy5pijPh40U9WfNk0z15hUYzO9xVIMAdIHdFtD8CBDHd75Td1g36Mjg== +rlp@^2.2.4: + version "2.2.7" + resolved "https://registry.yarnpkg.com/rlp/-/rlp-2.2.7.tgz#33f31c4afac81124ac4b283e2bd4d9720b30beaf" + integrity sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ== dependencies: - bn.js "^4.11.1" + bn.js "^5.2.0" -safe-buffer@5.1.2, safe-buffer@~5.1.0: - version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - -safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: +safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@^5.2.1, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== +safe-buffer@~5.1.0: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + "safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" @@ -2703,18 +2512,18 @@ scrypt-js@3.0.1, scrypt-js@^3.0.0, scrypt-js@^3.0.1: integrity sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA== secp256k1@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-4.0.2.tgz#15dd57d0f0b9fdb54ac1fa1694f40e5e9a54f4a1" - integrity sha512-UDar4sKvWAksIlfX3xIaQReADn+WFnHvbVujpcbr+9Sf/69odMwy2MUsz5CKLQgX9nsIyrjuxL2imVyoNHa3fg== + version "4.0.3" + resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-4.0.3.tgz#c4559ecd1b8d3c1827ed2d1b94190d69ce267303" + integrity sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA== dependencies: - elliptic "^6.5.2" + elliptic "^6.5.4" node-addon-api "^2.0.0" node-gyp-build "^4.2.0" -send@0.17.1: - version "0.17.1" - resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" - integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg== +send@0.17.2: + version "0.17.2" + resolved "https://registry.yarnpkg.com/send/-/send-0.17.2.tgz#926622f76601c41808012c8bf1688fe3906f7820" + integrity sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww== dependencies: debug "2.6.9" depd "~1.1.2" @@ -2723,22 +2532,22 @@ send@0.17.1: escape-html "~1.0.3" etag "~1.8.1" fresh "0.5.2" - http-errors "~1.7.2" + http-errors "1.8.1" mime "1.6.0" - ms "2.1.1" + ms "2.1.3" on-finished "~2.3.0" range-parser "~1.2.1" statuses "~1.5.0" -serve-static@1.14.1: - version "1.14.1" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9" - integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg== +serve-static@1.14.2: + version "1.14.2" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.2.tgz#722d6294b1d62626d41b43a013ece4598d292bfa" + integrity sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ== dependencies: encodeurl "~1.0.2" escape-html "~1.0.3" parseurl "~1.3.3" - send "0.17.1" + send "0.17.2" servify@^0.1.12: version "0.1.12" @@ -2756,10 +2565,10 @@ setimmediate@^1.0.5: resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= -setprototypeof@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" - integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== +setprototypeof@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" + integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== sha.js@^2.4.0, sha.js@^2.4.8: version "2.4.11" @@ -2769,24 +2578,33 @@ sha.js@^2.4.0, sha.js@^2.4.8: inherits "^2.0.1" safe-buffer "^5.0.1" +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + simple-concat@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f" integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q== simple-get@^2.7.0: - version "2.8.1" - resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-2.8.1.tgz#0e22e91d4575d87620620bc91308d57a77f44b5d" - integrity sha512-lSSHRSw3mQNUGPAYRqo7xy9dhKmxFXIjLjp4KHpf99GEH2VH7C3AM+Qfx6du6jhfUi6Vm7XnbEVEf7Wb6N8jRw== + version "2.8.2" + resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-2.8.2.tgz#5708fb0919d440657326cd5fe7d2599d07705019" + integrity sha512-Ijd/rV5o+mSBBs4F/x9oDPtTx9Zb6X9brmnXvMW4J7IR15ngi9q5xxqWBKU744jTZiaXtxaPL7uHG6vtN8kUkw== dependencies: decompress-response "^3.3.0" once "^1.3.1" simple-concat "^1.0.0" sshpk@^1.7.0: - version "1.16.1" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" - integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg== + version "1.17.0" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.17.0.tgz#578082d92d4fe612b13007496e543fa0fbcbe4c5" + integrity sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ== dependencies: asn1 "~0.2.3" assert-plus "^1.0.0" @@ -2808,7 +2626,7 @@ strict-uri-encode@^1.0.0: resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" integrity sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM= -string-width@^4.1.0, string-width@^4.2.0: +string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -2817,6 +2635,22 @@ string-width@^4.1.0, string-width@^4.2.0: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" +string.prototype.trimend@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz#e75ae90c2942c63504686c18b287b4a0b1a45f80" + integrity sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + +string.prototype.trimstart@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz#b36399af4ab2999b4c9c648bd7a3fb2bb26feeed" + integrity sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + string_decoder@^1.1.1: version "1.3.0" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" @@ -2856,19 +2690,19 @@ swarm-js@^0.1.40: xhr-request "^1.0.1" tar@^4.0.2: - version "4.4.13" - resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.13.tgz#43b364bc52888d555298637b10d60790254ab525" - integrity sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA== - dependencies: - chownr "^1.1.1" - fs-minipass "^1.2.5" - minipass "^2.8.6" - minizlib "^1.2.1" - mkdirp "^0.5.0" - safe-buffer "^5.1.2" - yallist "^3.0.3" + version "4.4.19" + resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.19.tgz#2e4d7263df26f2b914dee10c825ab132123742f3" + integrity sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA== + dependencies: + chownr "^1.1.4" + fs-minipass "^1.2.7" + minipass "^2.9.0" + minizlib "^1.3.3" + mkdirp "^0.5.5" + safe-buffer "^5.2.1" + yallist "^3.1.1" -text-encoding@0.7.0, text-encoding@^0.7.0: +text-encoding@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/text-encoding/-/text-encoding-0.7.0.tgz#f895e836e45990624086601798ea98e8f36ee643" integrity sha512-oJQ3f1hrOnbRLOcwKz0Liq2IcrvDeZRHXhd9RgLrsT+DjWY/nty1Hi7v3dtkaEYbPYe0mUoOfzRrMwfXXwgPUA== @@ -2883,10 +2717,10 @@ to-readable-stream@^1.0.0: resolved "https://registry.yarnpkg.com/to-readable-stream/-/to-readable-stream-1.0.0.tgz#ce0aa0c2f3df6adf852efb404a783e77c0475771" integrity sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q== -toidentifier@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" - integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== +toidentifier@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" + integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== tough-cookie@~2.5.0: version "2.5.0" @@ -2901,24 +2735,6 @@ tr46@~0.0.3: resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= -ts-node@^10.0.0: - version "10.4.0" - resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.4.0.tgz#680f88945885f4e6cf450e7f0d6223dd404895f7" - integrity sha512-g0FlPvvCXSIO1JDF6S232P5jPYqBkRL9qly81ZgAOSU7rwI0stphCgd2kLiCrU9DjQCrJMWEqcNSjQL02s6d8A== - dependencies: - "@cspotcode/source-map-support" "0.7.0" - "@tsconfig/node10" "^1.0.7" - "@tsconfig/node12" "^1.0.7" - "@tsconfig/node14" "^1.0.0" - "@tsconfig/node16" "^1.0.2" - acorn "^8.4.1" - acorn-walk "^8.1.1" - arg "^4.1.0" - create-require "^1.1.0" - diff "^4.0.1" - make-error "^1.1.1" - yn "3.1.1" - tunnel-agent@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" @@ -2931,7 +2747,7 @@ tweetnacl@^0.14.3, tweetnacl@~0.14.0: resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= -type-is@~1.6.17, type-is@~1.6.18: +type-is@~1.6.18: version "1.6.18" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== @@ -2944,10 +2760,10 @@ type@^1.0.1: resolved "https://registry.yarnpkg.com/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0" integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg== -type@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/type/-/type-2.1.0.tgz#9bdc22c648cf8cf86dd23d32336a41cfb6475e3f" - integrity sha512-G9absDWvhAWCV2gmF1zKud3OyC61nZDwWvBL2DApaVFogI07CprggiQAOOjvp2NRjYWFzPyu7vwtDrQFq8jeSA== +type@^2.5.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/type/-/type-2.6.0.tgz#3ca6099af5981d36ca86b78442973694278a219f" + integrity sha512-eiDBDOmkih5pMbo9OqsqPRGMljLodLcwd5XD5JbtNB0o89xZAwynY9EdCDsJU7LtcVCClu9DvM7/0Ep1hYX3EQ== typedarray-to-buffer@^3.1.5: version "3.1.5" @@ -2957,19 +2773,24 @@ typedarray-to-buffer@^3.1.5: is-typedarray "^1.0.0" typescript@^4.3.4: - version "4.4.4" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.4.4.tgz#2cd01a1a1f160704d3101fd5a58ff0f9fcb8030c" - integrity sha512-DqGhF5IKoBl8WNf8C1gu8q0xZSInh9j1kJJMqT3a94w1JzVaBU4EXOSMrz9yDqMT0xt3selp83fuFMQ0uzv6qA== + version "4.6.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.6.3.tgz#eefeafa6afdd31d725584c67a0eaba80f6fc6c6c" + integrity sha512-yNIatDa5iaofVozS/uQJEl3JRWLKKGJKh6Yaiv0GLGSuhpFJe7P3SbHZ8/yjAHRQwKRoA6YZqlfjXWmVzoVSMw== ultron@~1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.1.1.tgz#9fe1536a10a664a65266a1e3ccf85fd36302bc9c" integrity sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og== -underscore@1.9.1: - version "1.9.1" - resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.9.1.tgz#06dce34a0e68a7babc29b365b8e74b8925203961" - integrity sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg== +unbox-primitive@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471" + integrity sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw== + dependencies: + function-bind "^1.1.1" + has-bigints "^1.0.1" + has-symbols "^1.0.2" + which-boxed-primitive "^1.0.2" universalify@^0.1.0: version "0.1.2" @@ -2982,9 +2803,9 @@ unpipe@1.0.0, unpipe@~1.0.0: integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= uri-js@^4.2.2: - version "4.2.2" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" - integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== dependencies: punycode "^2.1.0" @@ -3013,11 +2834,11 @@ url-to-options@^1.0.1: integrity sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k= utf-8-validate@^5.0.2: - version "5.0.2" - resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-5.0.2.tgz#63cfbccd85dc1f2b66cf7a1d0eebc08ed056bfb3" - integrity sha512-SwV++i2gTD5qh2XqaPzBnNX88N6HdyhQrNNRykvcS0QKvItV9u3vPEJr+X5Hhfb1JC0r0e1alL0iB09rY8+nmw== + version "5.0.9" + resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-5.0.9.tgz#ba16a822fbeedff1a58918f2a6a6b36387493ea3" + integrity sha512-Yek7dAy0v3Kl0orwMlvi7TPtiCNrdfHNd7Gcc/pLq4BLXqfAmd0J7OWMizUQnTTJsyjKn02mU7anqwfmUP4J8Q== dependencies: - node-gyp-build "~3.7.0" + node-gyp-build "^4.3.0" utf8@3.0.0: version "3.0.0" @@ -3029,6 +2850,18 @@ util-deprecate@^1.0.1: resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= +util@^0.12.0: + version "0.12.4" + resolved "https://registry.yarnpkg.com/util/-/util-0.12.4.tgz#66121a31420df8f01ca0c464be15dfa1d1850253" + integrity sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw== + dependencies: + inherits "^2.0.3" + is-arguments "^1.0.4" + is-generator-function "^1.0.7" + is-typed-array "^1.1.3" + safe-buffer "^5.1.2" + which-typed-array "^1.1.2" + utils-merge@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" @@ -3045,9 +2878,9 @@ uuid@^3.3.2: integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== varint@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/varint/-/varint-5.0.0.tgz#d826b89f7490732fabc0c0ed693ed475dcb29ebf" - integrity sha1-2Ca4n3SQcy+rwMDtaT7Uddyynr8= + version "5.0.2" + resolved "https://registry.yarnpkg.com/varint/-/varint-5.0.2.tgz#5b47f8a947eb668b848e034dcfa87d0ff8a7f7a4" + integrity sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow== vary@^1, vary@~1.1.2: version "1.1.2" @@ -3063,277 +2896,248 @@ verror@1.10.0: core-util-is "1.0.2" extsprintf "^1.2.0" -web3-bzz@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-bzz/-/web3-bzz-1.2.11.tgz#41bc19a77444bd5365744596d778b811880f707f" - integrity sha512-XGpWUEElGypBjeFyUhTkiPXFbDVD6Nr/S5jznE3t8cWUA0FxRf1n3n/NuIZeb0H9RkN2Ctd/jNma/k8XGa3YKg== +web-streams-polyfill@^3.0.3: + version "3.2.0" + resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-3.2.0.tgz#a6b74026b38e4885869fb5c589e90b95ccfc7965" + integrity sha512-EqPmREeOzttaLRm5HS7io98goBgZ7IVz79aDvqjD0kYXLtFZTc0T/U6wHTPKyIjb+MdN7DFIIX6hgdBEpWmfPA== + +web3-bzz@1.7.1: + version "1.7.1" + resolved "https://registry.yarnpkg.com/web3-bzz/-/web3-bzz-1.7.1.tgz#ea1e7d27050eca089bc5d71b7f7688d20b68a25d" + integrity sha512-sVeUSINx4a4pfdnT+3ahdRdpDPvZDf4ZT/eBF5XtqGWq1mhGTl8XaQAk15zafKVm6Onq28vN8abgB/l+TrG8kA== dependencies: "@types/node" "^12.12.6" got "9.6.0" swarm-js "^0.1.40" - underscore "1.9.1" -web3-core-helpers@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.2.11.tgz#84c681ed0b942c0203f3b324a245a127e8c67a99" - integrity sha512-PEPoAoZd5ME7UfbnCZBdzIerpe74GEvlwT4AjOmHeCVZoIFk7EqvOZDejJHt+feJA6kMVTdd0xzRNN295UhC1A== +web3-core-helpers@1.7.1: + version "1.7.1" + resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.7.1.tgz#6dc34eff6ad31149db6c7cc2babbf574a09970cd" + integrity sha512-xn7Sx+s4CyukOJdlW8bBBDnUCWndr+OCJAlUe/dN2wXiyaGRiCWRhuQZrFjbxLeBt1fYFH7uWyYHhYU6muOHgw== dependencies: - underscore "1.9.1" - web3-eth-iban "1.2.11" - web3-utils "1.2.11" + web3-eth-iban "1.7.1" + web3-utils "1.7.1" -web3-core-method@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.2.11.tgz#f880137d1507a0124912bf052534f168b8d8fbb6" - integrity sha512-ff0q76Cde94HAxLDZ6DbdmKniYCQVtvuaYh+rtOUMB6kssa5FX0q3vPmixi7NPooFnbKmmZCM6NvXg4IreTPIw== +web3-core-method@1.7.1: + version "1.7.1" + resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.7.1.tgz#912c87d0f107d3f823932cf8a716852e3250e557" + integrity sha512-383wu5FMcEphBFl5jCjk502JnEg3ugHj7MQrsX7DY76pg5N5/dEzxeEMIJFCN6kr5Iq32NINOG3VuJIyjxpsEg== dependencies: "@ethersproject/transactions" "^5.0.0-beta.135" - underscore "1.9.1" - web3-core-helpers "1.2.11" - web3-core-promievent "1.2.11" - web3-core-subscriptions "1.2.11" - web3-utils "1.2.11" + web3-core-helpers "1.7.1" + web3-core-promievent "1.7.1" + web3-core-subscriptions "1.7.1" + web3-utils "1.7.1" -web3-core-promievent@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-core-promievent/-/web3-core-promievent-1.2.11.tgz#51fe97ca0ddec2f99bf8c3306a7a8e4b094ea3cf" - integrity sha512-il4McoDa/Ox9Agh4kyfQ8Ak/9ABYpnF8poBLL33R/EnxLsJOGQG2nZhkJa3I067hocrPSjEdlPt/0bHXsln4qA== +web3-core-promievent@1.7.1: + version "1.7.1" + resolved "https://registry.yarnpkg.com/web3-core-promievent/-/web3-core-promievent-1.7.1.tgz#7f78ec100a696954d0c882dac619fec28b2efc96" + integrity sha512-Vd+CVnpPejrnevIdxhCkzMEywqgVbhHk/AmXXceYpmwA6sX41c5a65TqXv1i3FWRJAz/dW7oKz9NAzRIBAO/kA== dependencies: eventemitter3 "4.0.4" -web3-core-requestmanager@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.2.11.tgz#fe6eb603fbaee18530293a91f8cf26d8ae28c45a" - integrity sha512-oFhBtLfOiIbmfl6T6gYjjj9igOvtyxJ+fjS+byRxiwFJyJ5BQOz4/9/17gWR1Cq74paTlI7vDGxYfuvfE/mKvA== +web3-core-requestmanager@1.7.1: + version "1.7.1" + resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.7.1.tgz#5cd7507276ca449538fe11cb4f363de8507502e5" + integrity sha512-/EHVTiMShpZKiq0Jka0Vgguxi3vxq1DAHKxg42miqHdUsz4/cDWay2wGALDR2x3ofDB9kqp7pb66HsvQImQeag== dependencies: - underscore "1.9.1" - web3-core-helpers "1.2.11" - web3-providers-http "1.2.11" - web3-providers-ipc "1.2.11" - web3-providers-ws "1.2.11" + util "^0.12.0" + web3-core-helpers "1.7.1" + web3-providers-http "1.7.1" + web3-providers-ipc "1.7.1" + web3-providers-ws "1.7.1" -web3-core-subscriptions@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.2.11.tgz#beca908fbfcb050c16f45f3f0f4c205e8505accd" - integrity sha512-qEF/OVqkCvQ7MPs1JylIZCZkin0aKK9lDxpAtQ1F8niEDGFqn7DT8E/vzbIa0GsOjL2fZjDhWJsaW+BSoAW1gg== +web3-core-subscriptions@1.7.1: + version "1.7.1" + resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.7.1.tgz#f7c834ee3544f4a5641a989304f61fde6a523e0b" + integrity sha512-NZBsvSe4J+Wt16xCf4KEtBbxA9TOwSVr8KWfUQ0tC2KMdDYdzNswl0Q9P58xaVuNlJ3/BH+uDFZJJ5E61BSA1Q== dependencies: eventemitter3 "4.0.4" - underscore "1.9.1" - web3-core-helpers "1.2.11" + web3-core-helpers "1.7.1" -web3-core@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.2.11.tgz#1043cacc1becb80638453cc5b2a14be9050288a7" - integrity sha512-CN7MEYOY5ryo5iVleIWRE3a3cZqVaLlIbIzDPsvQRUfzYnvzZQRZBm9Mq+ttDi2STOOzc1MKylspz/o3yq/LjQ== +web3-core@1.7.1: + version "1.7.1" + resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.7.1.tgz#ef9b7f03909387b9ab783f34cdc5ebcb50248368" + integrity sha512-HOyDPj+4cNyeNPwgSeUkhtS0F+Pxc2obcm4oRYPW5ku6jnTO34pjaij0us+zoY3QEusR8FfAKVK1kFPZnS7Dzw== dependencies: "@types/bn.js" "^4.11.5" "@types/node" "^12.12.6" bignumber.js "^9.0.0" - web3-core-helpers "1.2.11" - web3-core-method "1.2.11" - web3-core-requestmanager "1.2.11" - web3-utils "1.2.11" + web3-core-helpers "1.7.1" + web3-core-method "1.7.1" + web3-core-requestmanager "1.7.1" + web3-utils "1.7.1" -web3-eth-abi@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.2.11.tgz#a887494e5d447c2926d557a3834edd66e17af9b0" - integrity sha512-PkRYc0+MjuLSgg03QVWqWlQivJqRwKItKtEpRUaxUAeLE7i/uU39gmzm2keHGcQXo3POXAbOnMqkDvOep89Crg== - dependencies: - "@ethersproject/abi" "5.0.0-beta.153" - underscore "1.9.1" - web3-utils "1.2.11" - -web3-eth-abi@^1.2.1: - version "1.3.4" - resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.3.4.tgz#10f5d8b6080dbb6cbaa1bcef7e0c70573da6566f" - integrity sha512-PVSLXJ2dzdXsC+R24llIIEOS6S1KhG5qwNznJjJvXZFe3sqgdSe47eNvwUamZtCBjcrdR/HQr+L/FTxqJSf80Q== +web3-eth-abi@1.7.1, web3-eth-abi@^1.2.1: + version "1.7.1" + resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.7.1.tgz#6632003220a4defee4de8215dc703e43147382ea" + integrity sha512-8BVBOoFX1oheXk+t+uERBibDaVZ5dxdcefpbFTWcBs7cdm0tP8CD1ZTCLi5Xo+1bolVHNH2dMSf/nEAssq5pUA== dependencies: "@ethersproject/abi" "5.0.7" - underscore "1.9.1" - web3-utils "1.3.4" + web3-utils "1.7.1" -web3-eth-accounts@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-eth-accounts/-/web3-eth-accounts-1.2.11.tgz#a9e3044da442d31903a7ce035a86d8fa33f90520" - integrity sha512-6FwPqEpCfKIh3nSSGeo3uBm2iFSnFJDfwL3oS9pyegRBXNsGRVpgiW63yhNzL0796StsvjHWwQnQHsZNxWAkGw== +web3-eth-accounts@1.7.1: + version "1.7.1" + resolved "https://registry.yarnpkg.com/web3-eth-accounts/-/web3-eth-accounts-1.7.1.tgz#f938060d08f4b641bebe743809b0018fd4e4ba51" + integrity sha512-3xGQ2bkTQc7LFoqGWxp5cQDrKndlX05s7m0rAFVoyZZODMqrdSGjMPMqmWqHzJRUswNEMc+oelqSnGBubqhguQ== dependencies: + "@ethereumjs/common" "^2.5.0" + "@ethereumjs/tx" "^3.3.2" crypto-browserify "3.12.0" eth-lib "0.2.8" - ethereumjs-common "^1.3.2" - ethereumjs-tx "^2.1.1" + ethereumjs-util "^7.0.10" scrypt-js "^3.0.1" - underscore "1.9.1" uuid "3.3.2" - web3-core "1.2.11" - web3-core-helpers "1.2.11" - web3-core-method "1.2.11" - web3-utils "1.2.11" + web3-core "1.7.1" + web3-core-helpers "1.7.1" + web3-core-method "1.7.1" + web3-utils "1.7.1" -web3-eth-contract@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-eth-contract/-/web3-eth-contract-1.2.11.tgz#917065902bc27ce89da9a1da26e62ef663663b90" - integrity sha512-MzYuI/Rq2o6gn7vCGcnQgco63isPNK5lMAan2E51AJLknjSLnOxwNY3gM8BcKoy4Z+v5Dv00a03Xuk78JowFow== +web3-eth-contract@1.7.1: + version "1.7.1" + resolved "https://registry.yarnpkg.com/web3-eth-contract/-/web3-eth-contract-1.7.1.tgz#3f5147e5f1441ae388c985ba95023d02503378ae" + integrity sha512-HpnbkPYkVK3lOyos2SaUjCleKfbF0SP3yjw7l551rAAi5sIz/vwlEzdPWd0IHL7ouxXbO0tDn7jzWBRcD3sTbA== dependencies: "@types/bn.js" "^4.11.5" - underscore "1.9.1" - web3-core "1.2.11" - web3-core-helpers "1.2.11" - web3-core-method "1.2.11" - web3-core-promievent "1.2.11" - web3-core-subscriptions "1.2.11" - web3-eth-abi "1.2.11" - web3-utils "1.2.11" - -web3-eth-ens@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-eth-ens/-/web3-eth-ens-1.2.11.tgz#26d4d7f16d6cbcfff918e39832b939edc3162532" - integrity sha512-dbW7dXP6HqT1EAPvnniZVnmw6TmQEKF6/1KgAxbo8iBBYrVTMDGFQUUnZ+C4VETGrwwaqtX4L9d/FrQhZ6SUiA== + web3-core "1.7.1" + web3-core-helpers "1.7.1" + web3-core-method "1.7.1" + web3-core-promievent "1.7.1" + web3-core-subscriptions "1.7.1" + web3-eth-abi "1.7.1" + web3-utils "1.7.1" + +web3-eth-ens@1.7.1: + version "1.7.1" + resolved "https://registry.yarnpkg.com/web3-eth-ens/-/web3-eth-ens-1.7.1.tgz#18ddb22e14e50108f9515c9d17f14560d69ff397" + integrity sha512-DVCF76i9wM93DrPQwLrYiCw/UzxFuofBsuxTVugrnbm0SzucajLLNftp3ITK0c4/lV3x9oo5ER/wD6RRMHQnvw== dependencies: content-hash "^2.5.2" eth-ens-namehash "2.0.8" - underscore "1.9.1" - web3-core "1.2.11" - web3-core-helpers "1.2.11" - web3-core-promievent "1.2.11" - web3-eth-abi "1.2.11" - web3-eth-contract "1.2.11" - web3-utils "1.2.11" - -web3-eth-iban@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.2.11.tgz#f5f73298305bc7392e2f188bf38a7362b42144ef" - integrity sha512-ozuVlZ5jwFC2hJY4+fH9pIcuH1xP0HEFhtWsR69u9uDIANHLPQQtWYmdj7xQ3p2YT4bQLq/axKhZi7EZVetmxQ== + web3-core "1.7.1" + web3-core-helpers "1.7.1" + web3-core-promievent "1.7.1" + web3-eth-abi "1.7.1" + web3-eth-contract "1.7.1" + web3-utils "1.7.1" + +web3-eth-iban@1.7.1: + version "1.7.1" + resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.7.1.tgz#2148dff256392491df36b175e393b03c6874cd31" + integrity sha512-XG4I3QXuKB/udRwZdNEhdYdGKjkhfb/uH477oFVMLBqNimU/Cw8yXUI5qwFKvBHM+hMQWfzPDuSDEDKC2uuiMg== dependencies: bn.js "^4.11.9" - web3-utils "1.2.11" + web3-utils "1.7.1" -web3-eth-personal@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-eth-personal/-/web3-eth-personal-1.2.11.tgz#a38b3942a1d87a62070ce0622a941553c3d5aa70" - integrity sha512-42IzUtKq9iHZ8K9VN0vAI50iSU9tOA1V7XU2BhF/tb7We2iKBVdkley2fg26TxlOcKNEHm7o6HRtiiFsVK4Ifw== +web3-eth-personal@1.7.1: + version "1.7.1" + resolved "https://registry.yarnpkg.com/web3-eth-personal/-/web3-eth-personal-1.7.1.tgz#38635f94223f951422105e5fcb7f7ba767a3ee9f" + integrity sha512-02H6nFBNfNmFjMGZL6xcDi0r7tUhxrUP91FTFdoLyR94eIJDadPp4rpXfG7MVES873i1PReh4ep5pSCHbc3+Pg== dependencies: "@types/node" "^12.12.6" - web3-core "1.2.11" - web3-core-helpers "1.2.11" - web3-core-method "1.2.11" - web3-net "1.2.11" - web3-utils "1.2.11" - -web3-eth@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-eth/-/web3-eth-1.2.11.tgz#4c81fcb6285b8caf544058fba3ae802968fdc793" - integrity sha512-REvxW1wJ58AgHPcXPJOL49d1K/dPmuw4LjPLBPStOVkQjzDTVmJEIsiLwn2YeuNDd4pfakBwT8L3bz1G1/wVsQ== - dependencies: - underscore "1.9.1" - web3-core "1.2.11" - web3-core-helpers "1.2.11" - web3-core-method "1.2.11" - web3-core-subscriptions "1.2.11" - web3-eth-abi "1.2.11" - web3-eth-accounts "1.2.11" - web3-eth-contract "1.2.11" - web3-eth-ens "1.2.11" - web3-eth-iban "1.2.11" - web3-eth-personal "1.2.11" - web3-net "1.2.11" - web3-utils "1.2.11" - -web3-net@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-net/-/web3-net-1.2.11.tgz#eda68ef25e5cdb64c96c39085cdb74669aabbe1b" - integrity sha512-sjrSDj0pTfZouR5BSTItCuZ5K/oZPVdVciPQ6981PPPIwJJkCMeVjD7I4zO3qDPCnBjBSbWvVnLdwqUBPtHxyg== - dependencies: - web3-core "1.2.11" - web3-core-method "1.2.11" - web3-utils "1.2.11" - -web3-providers-http@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-providers-http/-/web3-providers-http-1.2.11.tgz#1cd03442c61670572d40e4dcdf1faff8bd91e7c6" - integrity sha512-psh4hYGb1+ijWywfwpB2cvvOIMISlR44F/rJtYkRmQ5jMvG4FOCPlQJPiHQZo+2cc3HbktvvSJzIhkWQJdmvrA== - dependencies: - web3-core-helpers "1.2.11" + web3-core "1.7.1" + web3-core-helpers "1.7.1" + web3-core-method "1.7.1" + web3-net "1.7.1" + web3-utils "1.7.1" + +web3-eth@1.7.1: + version "1.7.1" + resolved "https://registry.yarnpkg.com/web3-eth/-/web3-eth-1.7.1.tgz#721599865f675b43877f5a18babfb7ae087449f7" + integrity sha512-Uz3gO4CjTJ+hMyJZAd2eiv2Ur1uurpN7sTMATWKXYR/SgG+SZgncnk/9d8t23hyu4lyi2GiVL1AqVqptpRElxg== + dependencies: + web3-core "1.7.1" + web3-core-helpers "1.7.1" + web3-core-method "1.7.1" + web3-core-subscriptions "1.7.1" + web3-eth-abi "1.7.1" + web3-eth-accounts "1.7.1" + web3-eth-contract "1.7.1" + web3-eth-ens "1.7.1" + web3-eth-iban "1.7.1" + web3-eth-personal "1.7.1" + web3-net "1.7.1" + web3-utils "1.7.1" + +web3-net@1.7.1: + version "1.7.1" + resolved "https://registry.yarnpkg.com/web3-net/-/web3-net-1.7.1.tgz#c75ff7ccabb949cf15e9098505516eb1ed8e37de" + integrity sha512-8yPNp2gvjInWnU7DCoj4pIPNhxzUjrxKlODsyyXF8j0q3Z2VZuQp+c63gL++r2Prg4fS8t141/HcJw4aMu5sVA== + dependencies: + web3-core "1.7.1" + web3-core-method "1.7.1" + web3-utils "1.7.1" + +web3-providers-http@1.7.1: + version "1.7.1" + resolved "https://registry.yarnpkg.com/web3-providers-http/-/web3-providers-http-1.7.1.tgz#3e00e013f013766aade28da29247daa1a937e759" + integrity sha512-dmiO6G4dgAa3yv+2VD5TduKNckgfR97VI9YKXVleWdcpBoKXe2jofhdvtafd42fpIoaKiYsErxQNcOC5gI/7Vg== + dependencies: + web3-core-helpers "1.7.1" xhr2-cookies "1.1.0" -web3-providers-ipc@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.2.11.tgz#d16d6c9be1be6e0b4f4536c4acc16b0f4f27ef21" - integrity sha512-yhc7Y/k8hBV/KlELxynWjJDzmgDEDjIjBzXK+e0rHBsYEhdCNdIH5Psa456c+l0qTEU2YzycF8VAjYpWfPnBpQ== +web3-providers-ipc@1.7.1: + version "1.7.1" + resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.7.1.tgz#cde879a2ba57b1deac2e1030de90d185b793dd50" + integrity sha512-uNgLIFynwnd5M9ZC0lBvRQU5iLtU75hgaPpc7ZYYR+kjSk2jr2BkEAQhFVJ8dlqisrVmmqoAPXOEU0flYZZgNQ== dependencies: - oboe "2.1.4" - underscore "1.9.1" - web3-core-helpers "1.2.11" + oboe "2.1.5" + web3-core-helpers "1.7.1" -web3-providers-ws@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.2.11.tgz#a1dfd6d9778d840561d9ec13dd453046451a96bb" - integrity sha512-ZxnjIY1Er8Ty+cE4migzr43zA/+72AF1myzsLaU5eVgdsfV7Jqx7Dix1hbevNZDKFlSoEyq/3j/jYalh3So1Zg== +web3-providers-ws@1.7.1: + version "1.7.1" + resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.7.1.tgz#b6b3919ce155eff29b21bc3f205a098299a8c1b2" + integrity sha512-Uj0n5hdrh0ESkMnTQBsEUS2u6Unqdc7Pe4Zl+iZFb7Yn9cIGsPJBl7/YOP4137EtD5ueXAv+MKwzcelpVhFiFg== dependencies: eventemitter3 "4.0.4" - underscore "1.9.1" - web3-core-helpers "1.2.11" - websocket "^1.0.31" + web3-core-helpers "1.7.1" + websocket "^1.0.32" -web3-shh@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-shh/-/web3-shh-1.2.11.tgz#f5d086f9621c9a47e98d438010385b5f059fd88f" - integrity sha512-B3OrO3oG1L+bv3E1sTwCx66injW1A8hhwpknDUbV+sw3fehFazA06z9SGXUefuFI1kVs4q2vRi0n4oCcI4dZDg== +web3-shh@1.7.1: + version "1.7.1" + resolved "https://registry.yarnpkg.com/web3-shh/-/web3-shh-1.7.1.tgz#c6a0fc67321dd585085e3e3be8f2c1c8d61636ef" + integrity sha512-NO+jpEjo8kYX6c7GiaAm57Sx93PLYkWYUCWlZmUOW7URdUcux8VVluvTWklGPvdM9H1WfDrol91DjuSW+ykyqg== dependencies: - web3-core "1.2.11" - web3-core-method "1.2.11" - web3-core-subscriptions "1.2.11" - web3-net "1.2.11" + web3-core "1.7.1" + web3-core-method "1.7.1" + web3-core-subscriptions "1.7.1" + web3-net "1.7.1" -web3-utils@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.2.11.tgz#af1942aead3fb166ae851a985bed8ef2c2d95a82" - integrity sha512-3Tq09izhD+ThqHEaWYX4VOT7dNPdZiO+c/1QMA0s5X2lDFKK/xHJb7cyTRRVzN2LvlHbR7baS1tmQhSua51TcQ== +web3-utils@1.7.1, web3-utils@^1.2.1: + version "1.7.1" + resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.7.1.tgz#77d8bacaf426c66027d8aa4864d77f0ed211aacd" + integrity sha512-fef0EsqMGJUgiHPdX+KN9okVWshbIumyJPmR+btnD1HgvoXijKEkuKBv0OmUqjbeqmLKP2/N9EiXKJel5+E1Dw== dependencies: bn.js "^4.11.9" - eth-lib "0.2.8" ethereum-bloom-filters "^1.0.6" + ethereumjs-util "^7.1.0" ethjs-unit "0.1.6" number-to-bn "1.7.0" randombytes "^2.1.0" - underscore "1.9.1" - utf8 "3.0.0" - -web3-utils@1.3.4, web3-utils@^1.2.1: - version "1.3.4" - resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.3.4.tgz#9b1aa30d7549f860b573e7bb7e690999e7192198" - integrity sha512-/vC2v0MaZNpWooJfpRw63u0Y3ag2gNjAWiLtMSL6QQLmCqCy4SQIndMt/vRyx0uMoeGt1YTwSXEcHjUzOhLg0A== - dependencies: - bn.js "^4.11.9" - eth-lib "0.2.8" - ethereum-bloom-filters "^1.0.6" - ethjs-unit "0.1.6" - number-to-bn "1.7.0" - randombytes "^2.1.0" - underscore "1.9.1" utf8 "3.0.0" web3@^1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3/-/web3-1.2.11.tgz#50f458b2e8b11aa37302071c170ed61cff332975" - integrity sha512-mjQ8HeU41G6hgOYm1pmeH0mRAeNKJGnJEUzDMoerkpw7QUQT4exVREgF1MYPvL/z6vAshOXei25LE/t/Bxl8yQ== - dependencies: - web3-bzz "1.2.11" - web3-core "1.2.11" - web3-eth "1.2.11" - web3-eth-personal "1.2.11" - web3-net "1.2.11" - web3-shh "1.2.11" - web3-utils "1.2.11" + version "1.7.1" + resolved "https://registry.yarnpkg.com/web3/-/web3-1.7.1.tgz#4d01371a2c0c07dba089f8009dabd2b11821c5e8" + integrity sha512-RKVdyZ5FuVEykj62C1o2tc0teJciSOh61jpVB9yb344dBHO3ZV4XPPP24s/PPqIMXmVFN00g2GD9M/v1SoHO/A== + dependencies: + web3-bzz "1.7.1" + web3-core "1.7.1" + web3-eth "1.7.1" + web3-eth-personal "1.7.1" + web3-net "1.7.1" + web3-shh "1.7.1" + web3-utils "1.7.1" webidl-conversions@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" integrity sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE= -websocket@^1.0.31: - version "1.0.32" - resolved "https://registry.yarnpkg.com/websocket/-/websocket-1.0.32.tgz#1f16ddab3a21a2d929dec1687ab21cfdc6d3dbb1" - integrity sha512-i4yhcllSP4wrpoPMU2N0TQ/q0O94LRG/eUQjEAamRltjQ1oT1PFFKOG4i877OlJgCG8rw6LrrowJp+TYCEWF7Q== +websocket@^1.0.32: + version "1.0.34" + resolved "https://registry.yarnpkg.com/websocket/-/websocket-1.0.34.tgz#2bdc2602c08bf2c82253b730655c0ef7dcab3111" + integrity sha512-PRDso2sGwF6kM75QykIesBijKSVceR6jL2G8NGYyq2XrItNC2P5/qL5XeR056GhA+Ly7JMFvJb9I312mJfmqnQ== dependencies: bufferutil "^4.0.1" debug "^2.2.0" @@ -3350,6 +3154,29 @@ whatwg-url@^5.0.0: tr46 "~0.0.3" webidl-conversions "^3.0.0" +which-boxed-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" + integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== + dependencies: + is-bigint "^1.0.1" + is-boolean-object "^1.1.0" + is-number-object "^1.0.4" + is-string "^1.0.5" + is-symbol "^1.0.3" + +which-typed-array@^1.1.2: + version "1.1.7" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.7.tgz#2761799b9a22d4b8660b3c1b40abaa7739691793" + integrity sha512-vjxaB4nfDqwKI0ws7wZpxIlde1XrLX5uB0ZjpfshgmapJMD7jJWhZI+yToJTqaFByF0eNBcYxbjmCzoRP7CfEw== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + es-abstract "^1.18.5" + foreach "^2.0.5" + has-tostringtag "^1.0.0" + is-typed-array "^1.1.7" + wrap-ansi@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" @@ -3379,9 +3206,9 @@ ws@^3.0.0: ultron "~1.1.0" ws@^6.1.3: - version "6.2.1" - resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.1.tgz#442fdf0a47ed64f59b6a5d8ff130f4748ed524fb" - integrity sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA== + version "6.2.2" + resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.2.tgz#dd5cdbd57a9979916097652d78f1cc5faea0c32e" + integrity sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw== dependencies: async-limiter "~1.0.0" @@ -3413,11 +3240,11 @@ xhr2-cookies@1.1.0: cookiejar "^2.1.1" xhr@^2.0.4, xhr@^2.3.3: - version "2.5.0" - resolved "https://registry.yarnpkg.com/xhr/-/xhr-2.5.0.tgz#bed8d1676d5ca36108667692b74b316c496e49dd" - integrity sha512-4nlO/14t3BNUZRXIXfXe+3N6w3s1KoxcJUUURctd64BLRe67E4gRwp4PjywtDY72fXpZ1y6Ch0VZQRY/gMPzzQ== + version "2.6.0" + resolved "https://registry.yarnpkg.com/xhr/-/xhr-2.6.0.tgz#b69d4395e792b4173d6b7df077f0fc5e4e2b249d" + integrity sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA== dependencies: - global "~4.3.0" + global "~4.4.0" is-function "^1.0.1" parse-headers "^2.0.0" xtend "^4.0.0" @@ -3437,33 +3264,28 @@ yaeti@^0.0.6: resolved "https://registry.yarnpkg.com/yaeti/-/yaeti-0.0.6.tgz#f26f484d72684cf42bedfb76970aa1608fbf9577" integrity sha1-8m9ITXJoTPQr7ft2lwqhYI+/lXc= -yallist@^3.0.0, yallist@^3.0.3: +yallist@^3.0.0, yallist@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== -yargs-parser@^20.2.2: - version "20.2.9" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" - integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== +yargs-parser@^21.0.0: + version "21.0.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.0.1.tgz#0267f286c877a4f0f728fceb6f8a3e4cb95c6e35" + integrity sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg== yargs@^17.1.1: - version "17.2.1" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.2.1.tgz#e2c95b9796a0e1f7f3bf4427863b42e0418191ea" - integrity sha512-XfR8du6ua4K6uLGm5S6fA+FIJom/MdJcFNVY8geLlp2v8GYbOXD4EB1tPNZsRn4vBzKGMgb5DRZMeWuFc2GO8Q== + version "17.4.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.4.0.tgz#9fc9efc96bd3aa2c1240446af28499f0e7593d00" + integrity sha512-WJudfrk81yWFSOkZYpAZx4Nt7V4xp7S/uJkX0CnxovMCt1wCE8LNftPpNuF9X/u9gN5nsD7ycYtRcDf2pL3UiA== dependencies: cliui "^7.0.2" escalade "^3.1.1" get-caller-file "^2.0.5" require-directory "^2.1.1" - string-width "^4.2.0" + string-width "^4.2.3" y18n "^5.0.5" - yargs-parser "^20.2.2" - -yn@3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" - integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== + yargs-parser "^21.0.0" zlib@^1.0.5: version "1.0.5" From 40e21737a5486ade17d718cc55b0ca8c4c4809f5 Mon Sep 17 00:00:00 2001 From: Kevin Kei Tuncer Date: Fri, 1 Apr 2022 01:15:38 +0200 Subject: [PATCH 03/24] oracle-eos.ts - Advanced console parameter passing - Unite oracle functions in one class --- oracle/CommonTypes.ts | 66 +++-- oracle/oracle-eos.ts | 621 ++++++++++++++++++++++-------------------- oracle/package.json | 7 +- oracle/yarn.lock | 2 +- 4 files changed, 377 insertions(+), 319 deletions(-) diff --git a/oracle/CommonTypes.ts b/oracle/CommonTypes.ts index ed53e05..4b984a5 100644 --- a/oracle/CommonTypes.ts +++ b/oracle/CommonTypes.ts @@ -1,29 +1,41 @@ -export type ConfigType = { - precision: number; - symbol: string; - // network: string; - confirmations: number; +export interface ConfigType { + precision: number + symbol: string + // network: string + confirmations: number eos: { - network: string; - // wsEndpoint: string; - chainId: string; - // endpoint: string; - endpoints: Array, - teleportContract: string; - oracleAccount: string; - privateKey: string; - // genesisBlock: number; - oraclePermission?: string; - epVerifications: number; - }; + network: string, + // wsEndpoint: string, + chainId: string, + endpoint: string, + endpoints: Array, + teleportContract: string, + oracleAccount: string, + privateKey: string, + // genesisBlock: number, + oraclePermission?: string, + epVerifications: number + } eth: { - network: string; - // wsEndpoint: string; - chainId: string; - endpoint: string; - teleportContract: string; - oracleAccount: string; - privateKey: string; - genesisBlock: number; - }; - }; \ No newline at end of file + network: string, + // wsEndpoint: string, + chainId: string, + endpoint: string, + teleportContract: string, + oracleAccount: string, + privateKey: string, + genesisBlock: number + } +} + +export interface TeleportTableEntry{ + id: number, + time: number, + account: string, + quantity: string, + chain_id: number, + eth_address: string, + oracles: Array, + signatures: Array, + claimed: boolean +} \ No newline at end of file diff --git a/oracle/oracle-eos.ts b/oracle/oracle-eos.ts index 1b34ef1..ead3a71 100644 --- a/oracle/oracle-eos.ts +++ b/oracle/oracle-eos.ts @@ -1,31 +1,11 @@ -import { RpcError, Serialize } from "eosjs"; -import { GetTableRowsResult } from 'eosjs/dist/eosjs-rpc-interfaces'; -import { JsSignatureProvider } from "eosjs/dist/eosjs-jssig"; -import { TextDecoder, TextEncoder } from "text-encoding"; -import { ecsign, keccak, toRpcSig } from "ethereumjs-util"; +import { RpcError, Serialize } from "eosjs" +import { GetTableRowsResult } from 'eosjs/dist/eosjs-rpc-interfaces' +import { JsSignatureProvider } from "eosjs/dist/eosjs-jssig" +import { TextDecoder, TextEncoder } from "text-encoding" +import { ecsign, keccak, toRpcSig } from "ethereumjs-util" import { EosApi } from './eosEndpointSwitcher' -import { ConfigType } from './CommonTypes'; - -interface TeleportTableEntry{ - id: number, - time: number, - account: string, - quantity: string, - chain_id: number, - eth_address: string, - oracles: Array, - signatures: Array, - claimed: boolean -} - -// Load config and set title -const config_file = process.env['CONFIG'] || './config'; -const config : ConfigType = require(config_file); -process.title = `oracle-eos ${config_file}`; - -// Configure eosjs specific propperties -const signatureProvider = new JsSignatureProvider([config.eos.privateKey]); -const eos_api = new EosApi(config.eos.chainId, config.eos.endpoints, signatureProvider) +import { ConfigType, TeleportTableEntry } from './CommonTypes' +import yargs from 'yargs' /** * Convert an Uint8Array to an hex in string format @@ -56,286 +36,351 @@ const sleep = async (ms: number) => { }); }; -/** - * Send sign a teleport. Repeats itself until a defined amount of tries are reached - * @param id Teleport id - * @param signature Signature of this oracle - * @param tries Already passed tries - */ -async function sendSignAction(id: number, signature: string, tries = 0){ - try{ - console.log(`Teleport id ${id}, try to send signature ${tries}.`) - const result = await eos_api.getAPI().transact({ - actions: [{ - account: config.eos.teleportContract, - name: 'sign', - authorization: [{ - actor: config.eos.oracleAccount, - permission: config.eos.oraclePermission || 'active', - }], - data: { - oracle_name: config.eos.oracleAccount, - id, - signature - }, - }] - }, { - blocksBehind: 3, - expireSeconds: 30, - }); - } catch (e) { - console.error(`\nCaught exception: ${e} \n`); - let retry = true - if (e instanceof RpcError){ - if('code' in e.json){ - switch(e.json.code){ - case 401: // Unauthorized +// /** +// * Check if two Uint8Arrays are equal +// * @param a Frist array +// * @param b Seconf array +// * @returns True or false +// */ +// function arraysEqual(a: Uint8Array, b: Uint8Array) { +// if (a === b) return true; +// if (a == null || b == null) return false; +// if (a.length !== b.length) return false; + +// for (var i = 0; i < a.length; ++i) { +// if (a[i] !== b[i]) return false; +// } +// return true; +// } + +class EosOracle{ + private eos_api: EosApi + public running = false + constructor(private config: ConfigType, private signatureProvider: JsSignatureProvider){ + this.eos_api = new EosApi(config.eos.chainId, config.eos.endpoints, signatureProvider) + } + + /** + * Send sign a teleport. Repeats itself until a defined amount of tries are reached + * @param id Teleport id + * @param signature Signature of this oracle + * @param tries Already passed tries + */ + async sendSignAction(id: number, signature: string, tries = 0){ + try{ + console.log(`Teleport id ${id}, try to send signature ${tries}.`) + const result = await this.eos_api.getAPI().transact({ + actions: [{ + account: this.config.eos.teleportContract, + name: 'sign', + authorization: [{ + actor: this.config.eos.oracleAccount, + permission: this.config.eos.oraclePermission || 'active', + }], + data: { + oracle_name: this.config.eos.oracleAccount, + id, + signature + }, + }] + }, { + blocksBehind: 3, + expireSeconds: 30, + }); + } catch (e) { + console.error(`\nCaught exception: ${e} \n`); + let retry = true + if (e instanceof RpcError){ + if('code' in e.json){ + switch(e.json.code){ + case 401: // Unauthorized retry = false break + } } } + tries++ + if(tries < this.config.eos.endpoints.length && retry){ + await this.eos_api.nextEndpoint() + await this.sendSignAction(id, signature, tries) + } else { + console.error(`Teleport id ${id}, skip sign action. ❌`) + } + return } - tries++ - if(tries < config.eos.endpoints.length && retry){ - await eos_api.nextEndpoint() - await sendSignAction(id, signature, tries) - } else { - console.error(`Teleport id ${id}, skip sign action. ❌`) - } - return + console.log(`Teleport id ${id}, successful send sign action. ✔️`) } - console.log(`Teleport id ${id}, successful send sign action. ✔️`) -} - -/** - * Get table rows - * @param lower_bound Start teleport id - * @param limit Amount of requested rows - * @param json True for entries in json format and false for raw (string) format - * @returns Teleport table rows result - */ -async function getTableRows(lower_bound: number, limit: number, json = true){ - let retries = 0 - let teleport_res : GetTableRowsResult | null = null - let gotTeleport = false - do{ - if(retries >= 10){ - throw new Error(`Got no result by endpoint ${eos_api.getEndpoint()}.`) - } - try{ - retries++ - teleport_res = await eos_api.getRPC().get_table_rows({ - json, - code: config.eos.teleportContract, - scope: config.eos.teleportContract, - table: 'teleports', - lower_bound, - // upper_bound: 100, - limit - }); - } catch(e){ - console.log(e) - await eos_api.nextEndpoint() - } - if(teleport_res == null || 'rows' in teleport_res == false){ - console.log(`Got no teleports. Try ${retries}.`) - } else { - gotTeleport = true - } - } while(!gotTeleport) - - return teleport_res as GetTableRowsResult; -} - -/** - * Serialize the table entry of a teleport - * @param teleport Parameters of a teleport table entry - * @param logSize Trim the serialized data to this size - * @returns Serialized data as Uint8Array - */ -function serializeLogData(teleport: {id: number, time: number, account: string, quantity: string, chain_id: number, eth_address: string}, logSize: number){ - // Serialize the values - const sb = new Serialize.SerialBuffer({ - textEncoder: new TextEncoder, - textDecoder: new TextDecoder - }); - sb.pushNumberAsUint64(teleport.id) - sb.pushUint32(teleport.time) - sb.pushName(teleport.account) - sb.pushAsset(teleport.quantity) - sb.push(teleport.chain_id) - sb.pushArray(fromHexString(teleport.eth_address)) - return sb.array.slice(0, logSize) -} - -/** - * Get signature for teleport data - * @param logData Serialized teleport table entry - * @returns Signature - */ -async function signTeleport(logData: Uint8Array){ - // Sha3 of the serilized values. Note: The same result is one parameter for the claim function on the eth chain - const logDataKeccak = keccak(Buffer.from(logData)) - - // console.log('logData', Buffer.from(logData).toString('hex')); - // console.log('logDataKeccak', logDataKeccak.toString('hex')); - // Sign the sha3 hash - const ethPriKey = Buffer.from(config.eth.privateKey, "hex") - const sig = ecsign(logDataKeccak, ethPriKey) - toRpcSig(sig.v, sig.r, sig.s) - return toRpcSig(sig.v, sig.r, sig.s) -} - -/** - * Get the parameters which are defined via console - * @returns Parameters - */ -function getConsoleParams(){ - let id = 0; - if (typeof process.argv[2] !== 'undefined'){ - // Get id by console parameter - switch(process.argv[2]){ - case 'id': - if(typeof process.argv[3] == 'undefined'){ - console.error(`Missing id number.`); - process.exit(1); + /** + * Get table rows + * @param lower_bound Start teleport id + * @param limit Amount of requested rows + * @param json True for entries in json format and false for raw (string) format + * @returns Teleport table rows result + */ + async getTableRows(lower_bound: number, limit: number, json = true){ + let retries = 0 + let teleport_res : GetTableRowsResult | null = null + let gotTeleport = false + do{ + if(retries >= 10){ + throw new Error(`Got no result by endpoint ${this.eos_api.getEndpoint()}.`) } - id = parseInt(process.argv[3]) - if (isNaN(id)){ - console.error(`Start id must be a number.`); - process.exit(1); + try{ + retries++ + teleport_res = await this.eos_api.getRPC().get_table_rows({ + json, + code: this.config.eos.teleportContract, + scope: this.config.eos.teleportContract, + table: 'teleports', + lower_bound, + limit + }); + } catch(e){ + console.log(e) + await this.eos_api.nextEndpoint() } - break; - default: - console.error(`Undefined console parameter.`); - process.exit(1); - } + if(teleport_res == null || 'rows' in teleport_res == false){ + console.log(`Got no teleports. Try ${retries}.`) + } else { + gotTeleport = true + } + } while(!gotTeleport) + + return teleport_res as GetTableRowsResult; } - return { id } -} - -/** - * Get an amount of teleport entries as json, severall times from different endpoints for verification and the lowest amount of entries provided over all used endpoints - * @param request.lowerId Get endpoints beginning by this teleport id number - * @param request.amount Amount of requested teleports - * @returns teleport array in json format, array of teleport arrays in row format and minimum amount of provided entries - */ -async function getNextTeleports(request: {lowerId: number, amount: number}){ - // Get the next teleports in json format - const chain_data = await getTableRows(request.lowerId, request.amount, true) as GetTableRowsResult - let lowest_amount = chain_data.rows.length - - // Get the the teleports in raw format from other endpoints for verification - let verify_data : Array> = [] - const initialEndpoint = eos_api.getEndpoint() - for(let i = 1; i < config.eos.epVerifications; i++){ - await eos_api.nextEndpoint() - const vData = (await getTableRows(request.lowerId, request.amount, false) as GetTableRowsResult).rows as Array - verify_data.push(vData) - if(initialEndpoint == eos_api.getEndpoint()){ - console.error('No available endpoints for verification. ⛔') - process.exit(1) - } - // Handle only to the lowest amount of entries - if(lowest_amount > vData.length){ - lowest_amount = vData.length - } - } - return {chain_data, verify_data, lowest_amount} -} - -/** - * Sign all teleports - * @param signProcessData.lowerId Id of teleport to start from. Will be updated by the handled amount of teleports. - * @param signProcessData.amount Amount of requested teleports - */ -async function signAllTeleportsUntilNow(signProcessData: {lowerId: number, amount: number}){ - // Get next teleports - let {chain_data, verify_data, lowest_amount} = await getNextTeleports(signProcessData) - for(let rowIndex = 0; rowIndex < lowest_amount; rowIndex++){ - const item = chain_data.rows[rowIndex] as TeleportTableEntry - // Check if already claimed anf if the required amount of signes is already reached - if(item.claimed){ - console.log(`Teleport id ${item.id}, is already claimed. ✔️`) - continue - } - // Check if the required amount of signes is already reached - if(item.oracles.length >= config.confirmations){ - console.log(`Teleport id ${item.id}, has already sufficient confirmations. ✔️`) - continue - } - // Check if this oracle account has already signed - if(item.oracles.find(oracle => oracle == config.eos.oracleAccount) != undefined){ - console.log(`Teleport id ${item.id}, has already signed. ✔️`) - continue - } - - // Serialize the teleport table entry - const logData = serializeLogData(item, 69) - const logDataHex = toHexString(logData) - - // Verify serialization - let isVerifyed = true - for(let i = 0; i < config.eos.epVerifications - 1; i++){ - if(logDataHex != verify_data[i][rowIndex].slice(0, logData.length * 2)){ - console.error(`Verification failed by ${eos_api.getEndpoint()}. ⚠️`) - isVerifyed = false + // async function validateEntryByOtherEndpoints(id: number, logdata: Uint8Array, dataSize: number){ + // if(config.eos.epVerifications > eos_api.get_EndpointAmount()){ + // console.error('Not enough endpoints to verify data'); + // process.exit(1) + // } + // const lastEndpoint = eos_api.getEndpoint() + // await eos_api.nextEndpoint() + // for(let i = 1; i < config.eos.epVerifications; i++){ + // const entries = (await getTableEntries(id, 1, false)).rows as Array + // if(lastEndpoint == eos_api.getEndpoint()){ + // throw('No available endpoints for verification') + // } + // const veriData = fromHexString(entries[0]).slice(0, dataSize) + // if(!arraysEqual(logdata, veriData)){ + // throw('Verification failed by' + eos_api.getEndpoint()) + // } + // console.log(`Teleport id ${id} verified ${i + 1} times`); + // } + // } + + /** + * Serialize the table entry of a teleport + * @param teleport Parameters of a teleport table entry + * @param logSize Trim the serialized data to this size + * @returns Serialized data as Uint8Array + */ + static serializeLogData(teleport: {id: number, time: number, account: string, quantity: string, chain_id: number, eth_address: string}, logSize: number){ + // Serialize the values + const sb = new Serialize.SerialBuffer({ + textEncoder: new TextEncoder, + textDecoder: new TextDecoder + }); + sb.pushNumberAsUint64(teleport.id) + sb.pushUint32(teleport.time) + sb.pushName(teleport.account) + sb.pushAsset(teleport.quantity) + sb.push(teleport.chain_id) + sb.pushArray(fromHexString(teleport.eth_address)) + return sb.array.slice(0, logSize) + } + + /** + * Get signature for teleport data + * @param logData Serialized teleport table entry + * @returns Signature + */ + static async signTeleport(logData: Uint8Array, privateKey: string){ + // Sha3 of the serilized values. Note: The same result is one parameter for the claim function on the eth chain + const logDataKeccak = keccak(Buffer.from(logData)) + + // console.log('logData', Buffer.from(logData).toString('hex')); + // console.log('logDataKeccak', logDataKeccak.toString('hex')); + + // Sign the sha3 hash + const ethPriKey = Buffer.from(privateKey, "hex") + const sig = ecsign(logDataKeccak, ethPriKey) + toRpcSig(sig.v, sig.r, sig.s) + return toRpcSig(sig.v, sig.r, sig.s) + } + + /** + * Get an amount of teleport entries as json, severall times from different endpoints for verification and the lowest amount of entries provided over all used endpoints + * @param request.lowerId Get endpoints beginning by this teleport id number + * @param request.amount Amount of requested teleports + * @returns teleport array in json format, array of teleport arrays in row format and minimum amount of provided entries + */ + async getNextTeleports(request: {lowerId: number, amount: number}){ + // Get the next teleports in json format + const chain_data = await this.getTableRows(request.lowerId, request.amount, true) as GetTableRowsResult + let lowest_amount = chain_data.rows.length + + // Get the the teleports in raw format from other endpoints for verification + let verify_data : Array> = [] + const initialEndpoint = this.eos_api.getEndpoint() + for(let i = 1; i < this.config.eos.epVerifications; i++){ + await this.eos_api.nextEndpoint() + const vData = (await this.getTableRows(request.lowerId, request.amount, false) as GetTableRowsResult).rows as Array + verify_data.push(vData) + if(initialEndpoint == this.eos_api.getEndpoint()){ + console.error('No available endpoints for verification. ⛔') + process.exit(1) + } + // Handle only to the lowest amount of entries + if(lowest_amount > vData.length){ + lowest_amount = vData.length } - // console.log(`Teleport id ${item.id}, verified ${i + 1} times`); } - - if(!isVerifyed){ - console.error(`Teleport id ${item.id}, skip this one. ❌`) - } else { - // Sign the serialized teleport - const signature = await signTeleport(logData) + return {chain_data, verify_data, lowest_amount} + } + + /** + * Sign all teleports + * @param signProcessData.lowerId Id of teleport to start from. Will be updated by the handled amount of teleports. + * @param signProcessData.amount Amount of requested teleports + */ + async signAllTeleportsUntilNow(signProcessData: {lowerId: number, amount: number}){ + // Get next teleports + let {chain_data, verify_data, lowest_amount} = await this.getNextTeleports(signProcessData) + + for(let rowIndex = 0; rowIndex < lowest_amount; rowIndex++){ + const item = chain_data.rows[rowIndex] as TeleportTableEntry + // Check if already claimed anf if the required amount of signes is already reached + if(item.claimed){ + console.log(`Teleport id ${item.id}, is already claimed. ✔️`) + continue + } + // Check if the required amount of signes is already reached + if(item.oracles.length >= this.config.confirmations){ + console.log(`Teleport id ${item.id}, has already sufficient confirmations. ✔️`) + continue + } + // Check if this oracle account has already signed + if(item.oracles.find(oracle => oracle == this.config.eos.oracleAccount) != undefined){ + console.log(`Teleport id ${item.id}, has already signed. ✔️`) + continue + } - // Send signature to eosio chain - await sendSignAction(item.id, signature) + // Serialize the teleport table entry + const logData = EosOracle.serializeLogData(item, 69) + const logDataHex = toHexString(logData) + + // Verify serialization + let isVerifyed = true + for(let i = 0; i < this.config.eos.epVerifications - 1; i++){ + if(logDataHex != verify_data[i][rowIndex].slice(0, logData.length * 2)){ + console.error(`Verification failed by ${this.eos_api.getEndpoint()}. ⚠️`) + isVerifyed = false + } + // console.log(`Teleport id ${item.id}, verified ${i + 1} times`); + } + + if(!isVerifyed){ + console.error(`Teleport id ${item.id}, skip this one. ❌`) + } else { + // Sign the serialized teleport + const signature = await EosOracle.signTeleport(logData, this.config.eth.privateKey) + + // Send signature to eosio chain + await this.sendSignAction(item.id, signature) + } + } + + // Set last handled teleport id and get next teleports + signProcessData.lowerId += lowest_amount + if(chain_data.more == true && this.running){ + await this.signAllTeleportsUntilNow(signProcessData) } } - - // Set last handled teleport id and get next teleports - signProcessData.lowerId += lowest_amount - if(chain_data.more == true){ - await signAllTeleportsUntilNow(signProcessData) + + /** + * Wait 5 seconds + */ + static async WaitAnimation(){ + process.stdout.write('All available teleports signed\x1b[?25l') + await sleep(1000) + process.stdout.write(' 💤') + await sleep(1000) + process.stdout.write(' 💤') + await sleep(1000) + process.stdout.write(' 💤') + await sleep(1000) + process.stdout.write(' ↩️') + await sleep(1000) + process.stdout.write("\r\x1b[K") } -} -/** - * Wait 5 seconds - */ -async function WaitAnimation(){ - process.stdout.write('All available teleports signed\x1b[?25l') - await sleep(1000) - process.stdout.write(' 💤') - await sleep(1000) - process.stdout.write(' 💤') - await sleep(1000) - process.stdout.write(' 💤') - await sleep(1000) - process.stdout.write(' ↩️') - await sleep(1000) - process.stdout.write("\r\x1b[K") + /** + * Run the process of signing eosio chain teleports to eth chain + * @param id Teleport id to start from + * @param requestAmount Amount of requested teleports per request + */ + async run(id = 0, requestAmount = 100){ + console.log(`Starting EOS watcher for ETH oracle ${this.config.eth.oracleAccount}`); + + // Create an object to change the current id on each run + this.running = true + try{ + const signProcessData = {lowerId: id, amount: requestAmount} + while(this.running){ + await this.eos_api.nextEndpoint() + await this.signAllTeleportsUntilNow(signProcessData) + await EosOracle.WaitAnimation() + } + } catch (e){ + console.error('⚡️ ' + e); + } + console.log('Thread closed 💀') + } } -/** - * Run the process of signing eosio chain teleports to eth chain - */ -const run = async () => { - console.log(`Starting EOS watcher for ETH oracle ${config.eth.oracleAccount}`); - - // Get start id from console if defined - let params = getConsoleParams() +// Handle params from console +const argv = yargs + .version().alias('version', 'v') + .option('id', { + alias: 'n', + description: 'Teleport id to start from', + type: 'number' + }) + .option('amount', { + alias: 'a', + description: 'Amount of handled teleports per requests', + type: 'number' + }) + // .option('block', { + // alias: 'b', + // description: 'Block number to start with', + // type: 'number' + // }) + .option('signs', { + alias: 's', + description: 'Amout of signatures until this oracle will signs too', + type: 'number' + }) + .option('config', { + alias: 'c', + description: 'Path of config file', + type: 'string' + }) + .help().alias('help', 'h').argv as { + id: number, + amount: number, + signs: number, + config: string + }; - const signProcessData = {lowerId: params.id, amount: 100} - while(true){ - eos_api.nextEndpoint() - await signAllTeleportsUntilNow(signProcessData) - await WaitAnimation() - } -} +// Load config and set title +const config_path = argv.config || process.env['CONFIG'] || './config' +process.title = `oracle-eos ${config_path}` +const configFile : ConfigType = require(config_path) -run(); \ No newline at end of file +// Configure eosjs specific propperties +const signatureProvider = new JsSignatureProvider([configFile.eos.privateKey]); +let eosOracle = new EosOracle(configFile, signatureProvider) +eosOracle.run(argv.id, argv.amount); \ No newline at end of file diff --git a/oracle/package.json b/oracle/package.json index 919e81a..12e3563 100644 --- a/oracle/package.json +++ b/oracle/package.json @@ -20,10 +20,11 @@ "ethers": "^5.3.1", "node-fetch": "^3.2.3", "text-encoding": "^0.7.0", - "web3": "^1.2.11" + "web3": "^1.2.11", + "yargs": "^17.4.0" }, "devDependencies": { - "@types/text-encoding": "0.0.36", - "@types/ethereumjs-util": "^6.1.0" + "@types/ethereumjs-util": "^6.1.0", + "@types/text-encoding": "0.0.36" } } diff --git a/oracle/yarn.lock b/oracle/yarn.lock index d93c5ab..9f734ca 100644 --- a/oracle/yarn.lock +++ b/oracle/yarn.lock @@ -3274,7 +3274,7 @@ yargs-parser@^21.0.0: resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.0.1.tgz#0267f286c877a4f0f728fceb6f8a3e4cb95c6e35" integrity sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg== -yargs@^17.1.1: +yargs@^17.1.1, yargs@^17.4.0: version "17.4.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.4.0.tgz#9fc9efc96bd3aa2c1240446af28499f0e7593d00" integrity sha512-WJudfrk81yWFSOkZYpAZx4Nt7V4xp7S/uJkX0CnxovMCt1wCE8LNftPpNuF9X/u9gN5nsD7ycYtRcDf2pL3UiA== From 4a5c50aa0808b74580f3879a2ab9b574114c018f Mon Sep 17 00:00:00 2001 From: Kevin Kei Tuncer Date: Sat, 2 Apr 2022 00:49:24 +0200 Subject: [PATCH 04/24] oracle-eos.ts - Sign only irreversible teleports -> Prevent unnecessary requests by estimating the time when the next teleport should be irreversible --- oracle/oracle-eos.js | 925 ++++++++++++++++++++++++++----------------- oracle/oracle-eos.ts | 181 +++++++-- oracle/oracle-eth.js | 2 +- oracle/oracle-eth.ts | 4 +- oracle/package.json | 5 +- oracle/yarn.lock | 21 +- 6 files changed, 726 insertions(+), 412 deletions(-) diff --git a/oracle/oracle-eos.js b/oracle/oracle-eos.js index 5ec0eb3..47ef59a 100755 --- a/oracle/oracle-eos.js +++ b/oracle/oracle-eos.js @@ -35,19 +35,16 @@ var __generator = (this && this.__generator) || function (thisArg, body) { if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; } }; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; Object.defineProperty(exports, "__esModule", { value: true }); var eosjs_1 = require("eosjs"); var eosjs_jssig_1 = require("eosjs/dist/eosjs-jssig"); var text_encoding_1 = require("text-encoding"); var ethereumjs_util_1 = require("ethereumjs-util"); var eosEndpointSwitcher_1 = require("./eosEndpointSwitcher"); -// Load config and set title -var config_file = process.env['CONFIG'] || './config'; -var config = require(config_file); -process.title = "oracle-eos ".concat(config_file); -// Configure eosjs specific propperties -var signatureProvider = new eosjs_jssig_1.JsSignatureProvider([config.eos.privateKey]); -var eos_api = new eosEndpointSwitcher_1.EosApi(config.eos.chainId, config.eos.endpoints, signatureProvider); +var yargs_1 = __importDefault(require("yargs")); /** * Convert an Uint8Array to an hex in string format * @param bytes Uint8Array @@ -76,376 +73,570 @@ var sleep = function (ms) { return __awaiter(void 0, void 0, void 0, function () })]; }); }); }; -/** - * Send sign a teleport. Repeats itself until a defined amount of tries are reached - * @param id Teleport id - * @param signature Signature of this oracle - * @param tries Already passed tries - */ -function sendSignAction(id, signature, tries) { - if (tries === void 0) { tries = 0; } - return __awaiter(this, void 0, void 0, function () { - var result, e_1, retry; - return __generator(this, function (_a) { - switch (_a.label) { - case 0: - _a.trys.push([0, 2, , 7]); - console.log("Teleport id ".concat(id, ", try to send signature ").concat(tries, ".")); - return [4 /*yield*/, eos_api.getAPI().transact({ - actions: [{ - account: config.eos.teleportContract, - name: 'sign', - authorization: [{ - actor: config.eos.oracleAccount, - permission: config.eos.oraclePermission || 'active', - }], - data: { - oracle_name: config.eos.oracleAccount, - id: id, - signature: signature - }, - }] - }, { - blocksBehind: 3, - expireSeconds: 30, - })]; - case 1: - result = _a.sent(); - return [3 /*break*/, 7]; - case 2: - e_1 = _a.sent(); - console.error("\nCaught exception: ".concat(e_1, " \n")); - retry = true; - if (e_1 instanceof eosjs_1.RpcError) { - if ('code' in e_1.json) { - switch (e_1.json.code) { - case 401: // Unauthorized - retry = false; - break; +// /** +// * Check if two Uint8Arrays are equal +// * @param a Frist array +// * @param b Seconf array +// * @returns True or false +// */ +// function arraysEqual(a: Uint8Array, b: Uint8Array) { +// if (a === b) return true; +// if (a == null || b == null) return false; +// if (a.length !== b.length) return false; +// for (var i = 0; i < a.length; ++i) { +// if (a[i] !== b[i]) return false; +// } +// return true; +// } +var EosOracle = /** @class */ (function () { + function EosOracle(config, signatureProvider) { + this.config = config; + this.signatureProvider = signatureProvider; + this.running = false; + this.irreversible_time = 0; + this.eos_api = new eosEndpointSwitcher_1.EosApi(config.eos.chainId, config.eos.endpoints, signatureProvider); + } + // static async tryHard(tries: number, action : (tryNumber?: number) => Promise, onCatch: (e?: any, tryNumber?: number) => boolean | undefined) { + // let tryI = 0 + // let fin : any = false + // do{ + // try{ + // fin = await action(tryI) + // if(fin || typeof fin == 'number'){ + // return fin + // } + // } catch (e){ + // fin = onCatch(e, tryI)? true : false + // } + // } while (!fin && tryI < tries) + // } + /** + * Send sign a teleport. Repeats itself until a defined amount of tries are reached + * @param id Teleport id + * @param signature Signature of this oracle + * @param tries Already passed tries + */ + EosOracle.prototype.sendSignAction = function (id, signature, tries) { + if (tries === void 0) { tries = 0; } + return __awaiter(this, void 0, void 0, function () { + var result, e_1, retry; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + _a.trys.push([0, 2, , 7]); + console.log("Teleport id ".concat(id, ", try to send signature ").concat(tries, ".")); + return [4 /*yield*/, this.eos_api.getAPI().transact({ + actions: [{ + account: this.config.eos.teleportContract, + name: 'sign', + authorization: [{ + actor: this.config.eos.oracleAccount, + permission: this.config.eos.oraclePermission || 'active', + }], + data: { + oracle_name: this.config.eos.oracleAccount, + id: id, + signature: signature + }, + }] + }, { + blocksBehind: 3, + expireSeconds: 30, + })]; + case 1: + result = _a.sent(); + return [3 /*break*/, 7]; + case 2: + e_1 = _a.sent(); + console.error("\nCaught exception: ".concat(e_1, " \n")); + retry = true; + if (e_1 instanceof eosjs_1.RpcError) { + if ('code' in e_1.json) { + switch (e_1.json.code) { + case 401: // Unauthorized + retry = false; + break; + } } } - } - tries++; - if (!(tries < config.eos.endpoints.length && retry)) return [3 /*break*/, 5]; - return [4 /*yield*/, eos_api.nextEndpoint()]; - case 3: - _a.sent(); - return [4 /*yield*/, sendSignAction(id, signature, tries)]; - case 4: - _a.sent(); - return [3 /*break*/, 6]; - case 5: - console.error("Teleport id ".concat(id, ", skip sign action. \u274C")); - _a.label = 6; - case 6: return [2 /*return*/]; - case 7: - console.log("Teleport id ".concat(id, ", successful send sign action. \u2714\uFE0F")); - return [2 /*return*/]; - } + tries++; + if (!(tries < this.config.eos.endpoints.length && retry)) return [3 /*break*/, 5]; + return [4 /*yield*/, this.eos_api.nextEndpoint()]; + case 3: + _a.sent(); + return [4 /*yield*/, this.sendSignAction(id, signature, tries)]; + case 4: + _a.sent(); + return [3 /*break*/, 6]; + case 5: + console.error("Teleport id ".concat(id, ", skip sign action. \u274C")); + _a.label = 6; + case 6: return [2 /*return*/]; + case 7: + console.log("Teleport id ".concat(id, ", successful send sign action. \u2714\uFE0F")); + return [2 /*return*/]; + } + }); }); - }); -} -/** - * Get table rows - * @param lower_bound Start teleport id - * @param limit Amount of requested rows - * @param json True for entries in json format and false for raw (string) format - * @returns Teleport table rows result - */ -function getTableRows(lower_bound, limit, json) { - if (json === void 0) { json = true; } - return __awaiter(this, void 0, void 0, function () { - var retries, teleport_res, gotTeleport, e_2; - return __generator(this, function (_a) { - switch (_a.label) { - case 0: - retries = 0; - teleport_res = null; - gotTeleport = false; - _a.label = 1; - case 1: - if (retries >= 10) { - throw new Error("Got no result by endpoint ".concat(eos_api.getEndpoint(), ".")); - } - _a.label = 2; - case 2: - _a.trys.push([2, 4, , 6]); - retries++; - return [4 /*yield*/, eos_api.getRPC().get_table_rows({ - json: json, - code: config.eos.teleportContract, - scope: config.eos.teleportContract, - table: 'teleports', - lower_bound: lower_bound, - // upper_bound: 100, - limit: limit - })]; - case 3: - teleport_res = _a.sent(); - return [3 /*break*/, 6]; - case 4: - e_2 = _a.sent(); - console.log(e_2); - return [4 /*yield*/, eos_api.nextEndpoint()]; - case 5: - _a.sent(); - return [3 /*break*/, 6]; - case 6: - if (teleport_res == null || 'rows' in teleport_res == false) { - console.log("Got no teleports. Try ".concat(retries, ".")); - } - else { - gotTeleport = true; - } - _a.label = 7; - case 7: - if (!gotTeleport) return [3 /*break*/, 1]; - _a.label = 8; - case 8: return [2 /*return*/, teleport_res]; - } + }; + /** + * Get table rows + * @param lower_bound Start teleport id + * @param limit Amount of requested rows + * @param json True for entries in json format and false for raw (string) format + * @returns Teleport table rows result + */ + EosOracle.prototype.getTableRows = function (lower_bound, limit, json) { + if (json === void 0) { json = true; } + return __awaiter(this, void 0, void 0, function () { + var retries, teleport_res, gotTeleport, e_2; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + retries = 0; + teleport_res = null; + gotTeleport = false; + _a.label = 1; + case 1: + if (retries >= 10) { + throw new Error("Got no result by endpoint ".concat(this.eos_api.getEndpoint(), ".")); + } + _a.label = 2; + case 2: + _a.trys.push([2, 4, , 6]); + retries++; + return [4 /*yield*/, this.eos_api.getRPC().get_table_rows({ + json: json, + code: this.config.eos.teleportContract, + scope: this.config.eos.teleportContract, + table: 'teleports', + lower_bound: lower_bound, + limit: limit + })]; + case 3: + teleport_res = _a.sent(); + return [3 /*break*/, 6]; + case 4: + e_2 = _a.sent(); + console.log(e_2); + return [4 /*yield*/, this.eos_api.nextEndpoint()]; + case 5: + _a.sent(); + return [3 /*break*/, 6]; + case 6: + if (teleport_res == null || 'rows' in teleport_res == false) { + console.log("Got no teleports. Try ".concat(retries, ".")); + } + else { + gotTeleport = true; + } + _a.label = 7; + case 7: + if (!gotTeleport) return [3 /*break*/, 1]; + _a.label = 8; + case 8: return [2 /*return*/, teleport_res]; + } + }); }); - }); -} -/** - * Serialize the table entry of a teleport - * @param teleport Parameters of a teleport table entry - * @param logSize Trim the serialized data to this size - * @returns Serialized data as Uint8Array - */ -function serializeLogData(teleport, logSize) { - // Serialize the values - var sb = new eosjs_1.Serialize.SerialBuffer({ - textEncoder: new text_encoding_1.TextEncoder, - textDecoder: new text_encoding_1.TextDecoder - }); - sb.pushNumberAsUint64(teleport.id); - sb.pushUint32(teleport.time); - sb.pushName(teleport.account); - sb.pushAsset(teleport.quantity); - sb.push(teleport.chain_id); - sb.pushArray(fromHexString(teleport.eth_address)); - return sb.array.slice(0, logSize); -} -/** - * Get signature for teleport data - * @param logData Serialized teleport table entry - * @returns Signature - */ -function signTeleport(logData) { - return __awaiter(this, void 0, void 0, function () { - var logDataKeccak, ethPriKey, sig; - return __generator(this, function (_a) { - logDataKeccak = (0, ethereumjs_util_1.keccak)(Buffer.from(logData)); - ethPriKey = Buffer.from(config.eth.privateKey, "hex"); - sig = (0, ethereumjs_util_1.ecsign)(logDataKeccak, ethPriKey); - (0, ethereumjs_util_1.toRpcSig)(sig.v, sig.r, sig.s); - return [2 /*return*/, (0, ethereumjs_util_1.toRpcSig)(sig.v, sig.r, sig.s)]; + }; + // async function validateEntryByOtherEndpoints(id: number, logdata: Uint8Array, dataSize: number){ + // if(config.eos.epVerifications > eos_api.get_EndpointAmount()){ + // console.error('Not enough endpoints to verify data'); + // process.exit(1) + // } + // const lastEndpoint = eos_api.getEndpoint() + // await eos_api.nextEndpoint() + // for(let i = 1; i < config.eos.epVerifications; i++){ + // const entries = (await getTableEntries(id, 1, false)).rows as Array + // if(lastEndpoint == eos_api.getEndpoint()){ + // throw('No available endpoints for verification') + // } + // const veriData = fromHexString(entries[0]).slice(0, dataSize) + // if(!arraysEqual(logdata, veriData)){ + // throw('Verification failed by' + eos_api.getEndpoint()) + // } + // console.log(`Teleport id ${id} verified ${i + 1} times`); + // } + // } + /** + * Serialize the table entry of a teleport + * @param teleport Parameters of a teleport table entry + * @param logSize Trim the serialized data to this size + * @returns Serialized data as Uint8Array + */ + EosOracle.serializeLogData = function (teleport, logSize) { + // Serialize the values + var sb = new eosjs_1.Serialize.SerialBuffer({ + textEncoder: new text_encoding_1.TextEncoder, + textDecoder: new text_encoding_1.TextDecoder }); - }); -} -/** - * Get the parameters which are defined via console - * @returns Parameters - */ -function getConsoleParams() { - var id = 0; - if (typeof process.argv[2] !== 'undefined') { - // Get id by console parameter - switch (process.argv[2]) { - case 'id': - if (typeof process.argv[3] == 'undefined') { - console.error("Missing id number."); - process.exit(1); - } - id = parseInt(process.argv[3]); - if (isNaN(id)) { - console.error("Start id must be a number."); - process.exit(1); + sb.pushNumberAsUint64(teleport.id); + sb.pushUint32(teleport.time); + sb.pushName(teleport.account); + sb.pushAsset(teleport.quantity); + sb.push(teleport.chain_id); + sb.pushArray(fromHexString(teleport.eth_address)); + return sb.array.slice(0, logSize); + }; + /** + * Get signature for teleport data + * @param logData Serialized teleport table entry + * @returns Signature + */ + EosOracle.signTeleport = function (logData, privateKey) { + return __awaiter(this, void 0, void 0, function () { + var logDataKeccak, ethPriKey, sig; + return __generator(this, function (_a) { + logDataKeccak = (0, ethereumjs_util_1.keccak)(Buffer.from(logData)); + ethPriKey = Buffer.from(privateKey, "hex"); + sig = (0, ethereumjs_util_1.ecsign)(logDataKeccak, ethPriKey); + (0, ethereumjs_util_1.toRpcSig)(sig.v, sig.r, sig.s); + return [2 /*return*/, (0, ethereumjs_util_1.toRpcSig)(sig.v, sig.r, sig.s)]; + }); + }); + }; + /** + * Get an amount of teleport entries as json, severall times from different endpoints for verification and the lowest amount of entries provided over all used endpoints + * @param request.lowerId Get endpoints beginning by this teleport id number + * @param request.amount Amount of requested teleports + * @returns teleport array in json format, array of teleport arrays in row format and minimum amount of provided entries + */ + EosOracle.prototype.getNextTeleports = function (request) { + return __awaiter(this, void 0, void 0, function () { + var chain_data, lowest_amount, verify_data, initialEndpoint, i, vData; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, this.getTableRows(request.lowerId, request.amount, true)]; + case 1: + chain_data = _a.sent(); + lowest_amount = chain_data.rows.length; + verify_data = []; + if (!(lowest_amount > 0)) return [3 /*break*/, 6]; + initialEndpoint = this.eos_api.getEndpoint(); + i = 1; + _a.label = 2; + case 2: + if (!(i < this.config.eos.epVerifications)) return [3 /*break*/, 6]; + return [4 /*yield*/, this.eos_api.nextEndpoint()]; + case 3: + _a.sent(); + return [4 /*yield*/, this.getTableRows(request.lowerId, request.amount, false)]; + case 4: + vData = (_a.sent()).rows; + verify_data.push(vData); + if (initialEndpoint == this.eos_api.getEndpoint()) { + console.error('No available endpoints for verification. ⛔'); + process.exit(1); + } + // Handle only to the lowest amount of entries + if (lowest_amount > vData.length) { + lowest_amount = vData.length; + } + _a.label = 5; + case 5: + i++; + return [3 /*break*/, 2]; + case 6: return [2 /*return*/, { chain_data: chain_data, verify_data: verify_data, lowest_amount: lowest_amount }]; } - break; - default: - console.error("Undefined console parameter."); - process.exit(1); - } - } - return { id: id }; -} -/** - * Get an amount of teleport entries as json, severall times from different endpoints for verification and the lowest amount of entries provided over all used endpoints - * @param request.lowerId Get endpoints beginning by this teleport id number - * @param request.amount Amount of requested teleports - * @returns teleport array in json format, array of teleport arrays in row format and minimum amount of provided entries - */ -function getNextTeleports(request) { - return __awaiter(this, void 0, void 0, function () { - var chain_data, lowest_amount, verify_data, initialEndpoint, i, vData; - return __generator(this, function (_a) { - switch (_a.label) { - case 0: return [4 /*yield*/, getTableRows(request.lowerId, request.amount, true)]; - case 1: - chain_data = _a.sent(); - lowest_amount = chain_data.rows.length; - verify_data = []; - initialEndpoint = eos_api.getEndpoint(); - i = 1; - _a.label = 2; - case 2: - if (!(i < config.eos.epVerifications)) return [3 /*break*/, 6]; - return [4 /*yield*/, eos_api.nextEndpoint()]; - case 3: - _a.sent(); - return [4 /*yield*/, getTableRows(request.lowerId, request.amount, false)]; - case 4: - vData = (_a.sent()).rows; - verify_data.push(vData); - if (initialEndpoint == eos_api.getEndpoint()) { - console.error('No available endpoints for verification. ⛔'); - process.exit(1); - } - // Handle only to the lowest amount of entries - if (lowest_amount > vData.length) { - lowest_amount = vData.length; - } - _a.label = 5; - case 5: - i++; - return [3 /*break*/, 2]; - case 6: return [2 /*return*/, { chain_data: chain_data, verify_data: verify_data, lowest_amount: lowest_amount }]; - } + }); }); - }); -} -/** - * Sign all teleports - * @param signProcessData.lowerId Id of teleport to start from. Will be updated by the handled amount of teleports. - * @param signProcessData.amount Amount of requested teleports - */ -function signAllTeleportsUntilNow(signProcessData) { - return __awaiter(this, void 0, void 0, function () { - var _a, chain_data, verify_data, lowest_amount, rowIndex, item, logData, logDataHex, isVerifyed, i, signature; - return __generator(this, function (_b) { - switch (_b.label) { - case 0: return [4 /*yield*/, getNextTeleports(signProcessData)]; - case 1: - _a = _b.sent(), chain_data = _a.chain_data, verify_data = _a.verify_data, lowest_amount = _a.lowest_amount; - rowIndex = 0; - _b.label = 2; - case 2: - if (!(rowIndex < lowest_amount)) return [3 /*break*/, 7]; - item = chain_data.rows[rowIndex]; - // Check if already claimed anf if the required amount of signes is already reached - if (item.claimed) { - console.log("Teleport id ".concat(item.id, ", is already claimed. \u2714\uFE0F")); + }; + /** + * Update the current block time and the last irreversible block time + */ + EosOracle.prototype.updateTimes = function () { + return __awaiter(this, void 0, void 0, function () { + var minIrrTime, lowestIrr, epStart, verifications, info, irr_time, irr_block, t, e_3; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + minIrrTime = this.irreversible_time; + lowestIrr = undefined; + epStart = this.eos_api.getEndpoint(); + verifications = 0; + _a.label = 1; + case 1: + _a.trys.push([1, 7, , 8]); + return [4 /*yield*/, this.eos_api.getRPC().get_info()]; + case 2: + info = _a.sent(); + irr_time = void 0; + if (!info.last_irreversible_block_time) return [3 /*break*/, 3]; + // Get last irreversible block time if available + irr_time = new Date(info.last_irreversible_block_time + 'Z').getTime(); return [3 /*break*/, 6]; - } - // Check if the required amount of signes is already reached - if (item.oracles.length >= config.confirmations) { - console.log("Teleport id ".concat(item.id, ", has already sufficient confirmations. \u2714\uFE0F")); + case 3: + if (!info.last_irreversible_block_num) return [3 /*break*/, 5]; + return [4 /*yield*/, this.eos_api.getRPC().get_block(info.last_irreversible_block_num)]; + case 4: + irr_block = _a.sent(); + irr_time = new Date(irr_block.timestamp + 'Z').getTime(); return [3 /*break*/, 6]; - } - // Check if this oracle account has already signed - if (item.oracles.find(function (oracle) { return oracle == config.eos.oracleAccount; }) != undefined) { - console.log("Teleport id ".concat(item.id, ", has already signed. \u2714\uFE0F")); + case 5: throw ('No time parameter given by ' + this.eos_api.getEndpoint()); + case 6: + if (typeof irr_time == 'number') { + t = Math.floor(irr_time / 1000); + if (t < minIrrTime) { + throw ("Irreversible time is lower than possible, occurred by using ".concat(this.eos_api.getEndpoint())); + } + else if (lowestIrr === undefined || t < lowestIrr) { + // New lowest possible irreversible time + lowestIrr = t; + } + } + else { + throw ("Time parameter is not a number, occurred by using ".concat(this.eos_api.getEndpoint())); + } + verifications++; + return [3 /*break*/, 8]; + case 7: + e_3 = _a.sent(); + console.log('⚡️ ' + e_3); + // Get next endpoint and check if all endpoints are already checked + this.eos_api.nextEndpoint(); + if (epStart == this.eos_api.getEndpoint()) { + throw ('Could not get last irreversible block time from any endpoint. ⛔'); + } + return [3 /*break*/, 8]; + case 8: + if (verifications < this.config.eos.epVerifications) return [3 /*break*/, 1]; + _a.label = 9; + case 9: + // Set new time values + if (lowestIrr) { + this.irreversible_time = lowestIrr; + } + return [2 /*return*/]; + } + }); + }); + }; + /** + * Sign all teleports + * @param signProcessData.lowerId Id of teleport to start from. Will be updated by the handled amount of teleports. + * @param signProcessData.amount Amount of requested teleports + */ + EosOracle.prototype.signAllTeleportsUntilNow = function (signProcessData) { + return __awaiter(this, void 0, void 0, function () { + var waitForIrr, lastHandledId, _a, chain_data, verify_data, lowest_amount, rowIndex, item, logData, logDataHex, isVerifyed, i, signature; + var _this = this; + return __generator(this, function (_b) { + switch (_b.label) { + case 0: + waitForIrr = 0; + lastHandledId = signProcessData.lowerId; + return [4 /*yield*/, this.getNextTeleports(signProcessData)]; + case 1: + _a = _b.sent(), chain_data = _a.chain_data, verify_data = _a.verify_data, lowest_amount = _a.lowest_amount; + rowIndex = 0; + _b.label = 2; + case 2: + if (!(rowIndex < lowest_amount)) return [3 /*break*/, 8]; + item = chain_data.rows[rowIndex]; + // Check if already claimed anf if the required amount of signes is already reached + if (item.claimed) { + console.log("Teleport id ".concat(item.id, ", is already claimed. \u2714\uFE0F")); + lastHandledId = item.id + 1; + return [3 /*break*/, 7]; + } + // Check if the required amount of signes is already reached + if (item.oracles.length >= this.config.confirmations) { + console.log("Teleport id ".concat(item.id, ", has already sufficient confirmations. \u2714\uFE0F")); + lastHandledId = item.id + 1; + return [3 /*break*/, 7]; + } + // Check if this oracle account has already signed + if (item.oracles.find(function (oracle) { return oracle == _this.config.eos.oracleAccount; }) != undefined) { + console.log("Teleport id ".concat(item.id, ", has already signed. \u2714\uFE0F")); + lastHandledId = item.id + 1; + return [3 /*break*/, 7]; + } + logData = EosOracle.serializeLogData(item, 69); + logDataHex = toHexString(logData); + isVerifyed = true; + for (i = 0; i < this.config.eos.epVerifications - 1; i++) { + if (logDataHex != verify_data[i][rowIndex].slice(0, logData.length * 2)) { + console.error("Verification failed by ".concat(this.eos_api.getEndpoint(), ". \u26A0\uFE0F")); + isVerifyed = false; + } + // console.log(`Teleport id ${item.id}, verified ${i + 1} times`); + } + // Check time + if (item.time > this.irreversible_time) { + waitForIrr = item.time - this.irreversible_time; + lastHandledId = item.id; + return [3 /*break*/, 8]; + } + if (!!isVerifyed) return [3 /*break*/, 3]; + console.error("Teleport id ".concat(item.id, ", skip this one. \u274C")); return [3 /*break*/, 6]; - } - logData = serializeLogData(item, 69); - logDataHex = toHexString(logData); - isVerifyed = true; - for (i = 0; i < config.eos.epVerifications - 1; i++) { - if (logDataHex != verify_data[i][rowIndex].slice(0, logData.length * 2)) { - console.error("Verification failed by ".concat(eos_api.getEndpoint(), ". \u26A0\uFE0F")); - isVerifyed = false; + case 3: return [4 /*yield*/, EosOracle.signTeleport(logData, this.config.eth.privateKey) + // Send signature to eosio chain + ]; + case 4: + signature = _b.sent(); + // Send signature to eosio chain + return [4 /*yield*/, this.sendSignAction(item.id, signature)]; + case 5: + // Send signature to eosio chain + _b.sent(); + _b.label = 6; + case 6: + lastHandledId = item.id + 1; + _b.label = 7; + case 7: + rowIndex++; + return [3 /*break*/, 2]; + case 8: + // Set next teleport id and get the next teleports + signProcessData.lowerId = lastHandledId; + if (!this.running) return [3 /*break*/, 14]; + if (!(waitForIrr > 0)) return [3 /*break*/, 11]; + // Wait maximal 180 seconds + if (waitForIrr > EosOracle.maxWait) { + waitForIrr = EosOracle.maxWait; } - // console.log(`Teleport id ${item.id}, verified ${i + 1} times`); - } - if (!!isVerifyed) return [3 /*break*/, 3]; - console.error("Teleport id ".concat(item.id, ", skip this one. \u274C")); - return [3 /*break*/, 6]; - case 3: return [4 /*yield*/, signTeleport(logData) - // Send signature to eosio chain - ]; - case 4: - signature = _b.sent(); - // Send signature to eosio chain - return [4 /*yield*/, sendSignAction(item.id, signature)]; - case 5: - // Send signature to eosio chain - _b.sent(); - _b.label = 6; - case 6: - rowIndex++; - return [3 /*break*/, 2]; - case 7: - // Set last handled teleport id and get next teleports - signProcessData.lowerId += lowest_amount; - if (!(chain_data.more == true)) return [3 /*break*/, 9]; - return [4 /*yield*/, signAllTeleportsUntilNow(signProcessData)]; - case 8: - _b.sent(); - _b.label = 9; - case 9: return [2 /*return*/]; - } + console.log("Wait ".concat(waitForIrr, " seconds until teleport id ").concat(signProcessData.lowerId, " is irreversible.")); + return [4 /*yield*/, EosOracle.WaitWithAnimation(waitForIrr)]; + case 9: + _b.sent(); + return [4 /*yield*/, this.signAllTeleportsUntilNow(signProcessData)]; + case 10: + _b.sent(); + return [3 /*break*/, 14]; + case 11: + if (!(chain_data.more == true)) return [3 /*break*/, 14]; + return [4 /*yield*/, this.updateTimes()]; + case 12: + _b.sent(); + return [4 /*yield*/, this.signAllTeleportsUntilNow(signProcessData)]; + case 13: + _b.sent(); + _b.label = 14; + case 14: return [2 /*return*/]; + } + }); }); - }); -} -/** - * Wait 5 seconds - */ -function WaitAnimation() { - return __awaiter(this, void 0, void 0, function () { - return __generator(this, function (_a) { - switch (_a.label) { - case 0: - process.stdout.write('All available teleports signed\x1b[?25l'); - return [4 /*yield*/, sleep(1000)]; - case 1: - _a.sent(); - process.stdout.write(' 💤'); - return [4 /*yield*/, sleep(1000)]; - case 2: - _a.sent(); - process.stdout.write(' 💤'); - return [4 /*yield*/, sleep(1000)]; - case 3: - _a.sent(); - process.stdout.write(' 💤'); - return [4 /*yield*/, sleep(1000)]; - case 4: - _a.sent(); - process.stdout.write(' ↩️'); - return [4 /*yield*/, sleep(1000)]; - case 5: - _a.sent(); - process.stdout.write("\r\x1b[K"); - return [2 /*return*/]; - } + }; + /** + * Wait for a defined amount of time and show remaining seconds + * @param s Seconds to wait + */ + EosOracle.WaitWithAnimation = function (s, info) { + if (info === void 0) { info = ""; } + return __awaiter(this, void 0, void 0, function () { + var i; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + process.stdout.write(info + "\n\x1b[?25l"); + i = 0; + _a.label = 1; + case 1: + if (!(i < s)) return [3 /*break*/, 4]; + process.stdout.write("\uD83D\uDCA4 ".concat(i, " s / ").concat(s, " s \uD83D\uDCA4")); + return [4 /*yield*/, sleep(1000)]; + case 2: + _a.sent(); + process.stdout.write("\r\x1b[K"); + _a.label = 3; + case 3: + i++; + return [3 /*break*/, 1]; + case 4: + process.stdout.moveCursor(0, -1); // up one line + process.stdout.clearLine(1); // from cursor to end + return [2 /*return*/]; + } + }); }); - }); -} -/** - * Run the process of signing eosio chain teleports to eth chain - */ -var run = function () { return __awaiter(void 0, void 0, void 0, function () { - var params, signProcessData; - return __generator(this, function (_a) { - switch (_a.label) { - case 0: - console.log("Starting EOS watcher for ETH oracle ".concat(config.eth.oracleAccount)); - params = getConsoleParams(); - signProcessData = { lowerId: params.id, amount: 100 }; - _a.label = 1; - case 1: - if (!true) return [3 /*break*/, 4]; - eos_api.nextEndpoint(); - return [4 /*yield*/, signAllTeleportsUntilNow(signProcessData)]; - case 2: - _a.sent(); - return [4 /*yield*/, WaitAnimation()]; - case 3: - _a.sent(); - return [3 /*break*/, 1]; - case 4: return [2 /*return*/]; - } - }); -}); }; -run(); + }; + /** + * Run the process of signing eosio chain teleports to eth chain + * @param id Teleport id to start from + * @param requestAmount Amount of requested teleports per request + */ + EosOracle.prototype.run = function (id, requestAmount) { + if (id === void 0) { id = 0; } + if (requestAmount === void 0) { requestAmount = 100; } + return __awaiter(this, void 0, void 0, function () { + var signProcessData, e_4; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.log("Starting EOS watcher for ETH oracle ".concat(this.config.eth.oracleAccount)); + // Create an object to change the current id on each run + this.running = true; + _a.label = 1; + case 1: + _a.trys.push([1, 8, , 9]); + signProcessData = { lowerId: id, amount: requestAmount }; + _a.label = 2; + case 2: + if (!this.running) return [3 /*break*/, 7]; + return [4 /*yield*/, this.eos_api.nextEndpoint()]; + case 3: + _a.sent(); + return [4 /*yield*/, this.updateTimes()]; + case 4: + _a.sent(); + return [4 /*yield*/, this.signAllTeleportsUntilNow(signProcessData)]; + case 5: + _a.sent(); + return [4 /*yield*/, EosOracle.WaitWithAnimation(EosOracle.maxWait, 'All available teleports signed')]; + case 6: + _a.sent(); + return [3 /*break*/, 2]; + case 7: return [3 /*break*/, 9]; + case 8: + e_4 = _a.sent(); + console.error('⚡️ ' + e_4); + return [3 /*break*/, 9]; + case 9: + console.log('Thread closed 💀'); + return [2 /*return*/]; + } + }); + }); + }; + // private current_block_time = 0 + EosOracle.maxWait = 180; + return EosOracle; +}()); +// Handle params from console +var argv = yargs_1.default + .version().alias('version', 'v') + .option('id', { + alias: 'n', + description: 'Teleport id to start from', + type: 'number' +}) + .option('amount', { + alias: 'a', + description: 'Amount of handled teleports per requests', + type: 'number' +}) + // .option('block', { + // alias: 'b', + // description: 'Block number to start with', + // type: 'number' + // }) + .option('signs', { + alias: 's', + description: 'Amout of signatures until this oracle will signs too', + type: 'number' +}) + .option('config', { + alias: 'c', + description: 'Path of config file', + type: 'string' +}) + .help().alias('help', 'h').argv; +// Load config and set title +var config_path = argv.config || process.env['CONFIG'] || './config'; +process.title = "oracle-eos ".concat(config_path); +var configFile = require(config_path); +// Configure eosjs specific propperties +var signatureProvider = new eosjs_jssig_1.JsSignatureProvider([configFile.eos.privateKey]); +var eosOracle = new EosOracle(configFile, signatureProvider); +eosOracle.run(argv.id, argv.amount); diff --git a/oracle/oracle-eos.ts b/oracle/oracle-eos.ts index ead3a71..00394f9 100644 --- a/oracle/oracle-eos.ts +++ b/oracle/oracle-eos.ts @@ -56,10 +56,29 @@ const sleep = async (ms: number) => { class EosOracle{ private eos_api: EosApi public running = false + private irreversible_time = 0 + // private current_block_time = 0 + static maxWait = 180 + constructor(private config: ConfigType, private signatureProvider: JsSignatureProvider){ this.eos_api = new EosApi(config.eos.chainId, config.eos.endpoints, signatureProvider) } + // static async tryHard(tries: number, action : (tryNumber?: number) => Promise, onCatch: (e?: any, tryNumber?: number) => boolean | undefined) { + // let tryI = 0 + // let fin : any = false + // do{ + // try{ + // fin = await action(tryI) + // if(fin || typeof fin == 'number'){ + // return fin + // } + // } catch (e){ + // fin = onCatch(e, tryI)? true : false + // } + // } while (!fin && tryI < tries) + // } + /** * Send sign a teleport. Repeats itself until a defined amount of tries are reached * @param id Teleport id @@ -221,49 +240,125 @@ class EosOracle{ const chain_data = await this.getTableRows(request.lowerId, request.amount, true) as GetTableRowsResult let lowest_amount = chain_data.rows.length - // Get the the teleports in raw format from other endpoints for verification + // Get the teleports in raw format from other endpoints for verification let verify_data : Array> = [] - const initialEndpoint = this.eos_api.getEndpoint() - for(let i = 1; i < this.config.eos.epVerifications; i++){ - await this.eos_api.nextEndpoint() - const vData = (await this.getTableRows(request.lowerId, request.amount, false) as GetTableRowsResult).rows as Array - verify_data.push(vData) - if(initialEndpoint == this.eos_api.getEndpoint()){ - console.error('No available endpoints for verification. ⛔') - process.exit(1) - } - // Handle only to the lowest amount of entries - if(lowest_amount > vData.length){ - lowest_amount = vData.length + if(lowest_amount > 0){ + const initialEndpoint = this.eos_api.getEndpoint() + for(let i = 1; i < this.config.eos.epVerifications; i++){ + await this.eos_api.nextEndpoint() + const vData = (await this.getTableRows(request.lowerId, request.amount, false) as GetTableRowsResult).rows as Array + verify_data.push(vData) + if(initialEndpoint == this.eos_api.getEndpoint()){ + console.error('No available endpoints for verification. ⛔') + process.exit(1) + } + // Handle only to the lowest amount of entries + if(lowest_amount > vData.length){ + lowest_amount = vData.length + } } } return {chain_data, verify_data, lowest_amount} } + /** + * Update the current block time and the last irreversible block time + */ + async updateTimes(){ + + let minIrrTime = this.irreversible_time + // let minCurrentTimeMs = this.current_block_time + let lowestIrr: number | undefined = undefined + let epStart = this.eos_api.getEndpoint() + let verifications = 0 + do{ + try{ + // Get current info + let info = await this.eos_api.getRPC().get_info() + let irr_time : number + + if(info.last_irreversible_block_time){ + // Get last irreversible block time if available + irr_time = new Date(info.last_irreversible_block_time + 'Z').getTime() + + // // Check current time + // let cur_time = new Date(info.head_block_time).getTime() + // if(cur_time <= minIrrTime){ + // throw(`Current time is lower than possible, occurred by using ${this.eos_api.getEndpoint()}`) + // } + // if(cur_time < minCurrentTimeMs){ + // minCurrentTimeMs = cur_time + // } + } else if (info.last_irreversible_block_num){ + // Get last irreversible block time from last irreversible block + let irr_block = await this.eos_api.getRPC().get_block(info.last_irreversible_block_num) + irr_time = new Date(irr_block.timestamp + 'Z').getTime() + } else { + throw('No time parameter given by ' + this.eos_api.getEndpoint()) + } + + if(typeof irr_time == 'number'){ + // Convert to full seconds + let t = Math.floor(irr_time / 1000) + if(t < minIrrTime){ + throw(`Irreversible time is lower than possible, occurred by using ${this.eos_api.getEndpoint()}`) + } else if(lowestIrr === undefined || t < lowestIrr) { + // New lowest possible irreversible time + lowestIrr = t + } + } else { + throw(`Time parameter is not a number, occurred by using ${this.eos_api.getEndpoint()}`) + } + verifications++ + } catch(e) { + console.log('⚡️ ' + e); + // Get next endpoint and check if all endpoints are already checked + this.eos_api.nextEndpoint() + if(epStart == this.eos_api.getEndpoint()){ + throw('Could not get last irreversible block time from any endpoint. ⛔') + } + } + } while(verifications < this.config.eos.epVerifications) + + // Set new time values + if(lowestIrr){ + this.irreversible_time = lowestIrr + } + // this.current_block_time = minCurrentTimeMs + } + /** * Sign all teleports * @param signProcessData.lowerId Id of teleport to start from. Will be updated by the handled amount of teleports. * @param signProcessData.amount Amount of requested teleports */ async signAllTeleportsUntilNow(signProcessData: {lowerId: number, amount: number}){ + + let waitForIrr = 0 + let lastHandledId = signProcessData.lowerId + // Get next teleports let {chain_data, verify_data, lowest_amount} = await this.getNextTeleports(signProcessData) - for(let rowIndex = 0; rowIndex < lowest_amount; rowIndex++){ + for(let rowIndex = 0; rowIndex < lowest_amount; rowIndex++) { const item = chain_data.rows[rowIndex] as TeleportTableEntry + // Check if already claimed anf if the required amount of signes is already reached if(item.claimed){ console.log(`Teleport id ${item.id}, is already claimed. ✔️`) + lastHandledId = item.id + 1 continue } // Check if the required amount of signes is already reached if(item.oracles.length >= this.config.confirmations){ console.log(`Teleport id ${item.id}, has already sufficient confirmations. ✔️`) + lastHandledId = item.id + 1 continue } // Check if this oracle account has already signed if(item.oracles.find(oracle => oracle == this.config.eos.oracleAccount) != undefined){ console.log(`Teleport id ${item.id}, has already signed. ✔️`) + lastHandledId = item.id + 1 continue } @@ -280,7 +375,14 @@ class EosOracle{ } // console.log(`Teleport id ${item.id}, verified ${i + 1} times`); } - + + // Check time + if(item.time > this.irreversible_time){ + waitForIrr = item.time - this.irreversible_time + lastHandledId = item.id + break; + } + if(!isVerifyed){ console.error(`Teleport id ${item.id}, skip this one. ❌`) } else { @@ -290,30 +392,42 @@ class EosOracle{ // Send signature to eosio chain await this.sendSignAction(item.id, signature) } + lastHandledId = item.id + 1 } - // Set last handled teleport id and get next teleports - signProcessData.lowerId += lowest_amount - if(chain_data.more == true && this.running){ - await this.signAllTeleportsUntilNow(signProcessData) + // Set next teleport id and get the next teleports + signProcessData.lowerId = lastHandledId + if(this.running){ + if(waitForIrr > 0){ + // Wait maximal 180 seconds + if(waitForIrr > EosOracle.maxWait) { + waitForIrr = EosOracle.maxWait + } + console.log(`Wait ${waitForIrr} seconds until teleport id ${signProcessData.lowerId} is irreversible.`) + await EosOracle.WaitWithAnimation(waitForIrr) + await this.signAllTeleportsUntilNow(signProcessData) + } + else if(chain_data.more == true){ + await this.updateTimes() + await this.signAllTeleportsUntilNow(signProcessData) + } } } /** - * Wait 5 seconds + * Wait for a defined amount of time and show remaining seconds + * @param s Seconds to wait */ - static async WaitAnimation(){ - process.stdout.write('All available teleports signed\x1b[?25l') - await sleep(1000) - process.stdout.write(' 💤') - await sleep(1000) - process.stdout.write(' 💤') - await sleep(1000) - process.stdout.write(' 💤') - await sleep(1000) - process.stdout.write(' ↩️') - await sleep(1000) - process.stdout.write("\r\x1b[K") + static async WaitWithAnimation(s: number, info: string = ""){ + process.stdout.write(info + "\n\x1b[?25l") + for(let i = 0; i < s; i++){ + process.stdout.write(`💤 ${i} s / ${s} s 💤`) + await sleep(1000) + process.stdout.write("\r\x1b[K") + } + + process.stdout.moveCursor(0, -1) // up one line + process.stdout.clearLine(1) // from cursor to end } /** @@ -330,8 +444,9 @@ class EosOracle{ const signProcessData = {lowerId: id, amount: requestAmount} while(this.running){ await this.eos_api.nextEndpoint() + await this.updateTimes() await this.signAllTeleportsUntilNow(signProcessData) - await EosOracle.WaitAnimation() + await EosOracle.WaitWithAnimation(EosOracle.maxWait, 'All available teleports signed') } } catch (e){ console.error('⚡️ ' + e); diff --git a/oracle/oracle-eth.js b/oracle/oracle-eth.js index 09c7256..a5fb837 100755 --- a/oracle/oracle-eth.js +++ b/oracle/oracle-eth.js @@ -58,7 +58,7 @@ var fs_1 = __importDefault(require("fs")); var ethers_1 = require("ethers"); var eosio_helpers_1 = require("eosio-helpers"); var yargs_1 = __importDefault(require("yargs")); -var config = require(process.env['CONFIG'] || './config'); +var config = require(process.env['CONFIG'] || '../config'); var provider = new ethers_1.ethers.providers.StaticJsonRpcProvider(config.eth.endpoint); var network = config.eth.network; var blocks_file_name = ".oracle_".concat(network, "_block-").concat(config.eth.oracleAccount); diff --git a/oracle/oracle-eth.ts b/oracle/oracle-eth.ts index 31e9e0e..d693447 100755 --- a/oracle/oracle-eth.ts +++ b/oracle/oracle-eth.ts @@ -14,7 +14,7 @@ import { SingleRun, Sleep } from 'eosio-helpers'; import yargs from 'yargs'; import { ConfigType } from './CommonTypes'; -const config: ConfigType = require(process.env['CONFIG'] || './config'); +const config: ConfigType = require(process.env['CONFIG'] || '../config'); const provider = new ethers.providers.StaticJsonRpcProvider( config.eth.endpoint @@ -310,7 +310,7 @@ const run = async (start_ref: 'latest' | number, submit_to_blockchain: boolean) if(from_block < 0){ from_block = 0 } - + let to_block = Math.min(from_block + 100, latest_block); if (start_ref >= latest_block) { diff --git a/oracle/package.json b/oracle/package.json index 12e3563..1d5920c 100644 --- a/oracle/package.json +++ b/oracle/package.json @@ -3,8 +3,8 @@ "version": "1.1.0", "description": "", "scripts": { - "eth": "tsc && node dist/oracle-eth.js", - "eos": "tsc && node dist/oracle-eos.js", + "eth": "tsc && node oracle-eth.js", + "eos": "tsc && node oracle-eos.js", "test": "echo \"Error: no test specified\" && exit 1" }, "author": "", @@ -24,6 +24,7 @@ "yargs": "^17.4.0" }, "devDependencies": { + "@types/elliptic": "^6.4.14", "@types/ethereumjs-util": "^6.1.0", "@types/text-encoding": "0.0.36" } diff --git a/oracle/yarn.lock b/oracle/yarn.lock index 9f734ca..9778181 100644 --- a/oracle/yarn.lock +++ b/oracle/yarn.lock @@ -395,6 +395,13 @@ dependencies: defer-to-connect "^1.0.1" +"@types/bn.js@*", "@types/bn.js@^5.1.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-5.1.0.tgz#32c5d271503a12653c62cf4d2b45e6eab8cebc68" + integrity sha512-QSSVYj7pYFN49kW77o2s9xTCwZ8F2xLbjLLSEVh8D2F4JUhZtPAGOFLTD+ffqksBx/u4cE/KImFjyhqCjn/LIA== + dependencies: + "@types/node" "*" + "@types/bn.js@^4.11.5": version "4.11.6" resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-4.11.6.tgz#c306c70d9358aaea33cd4eda092a742b9505967c" @@ -402,13 +409,6 @@ dependencies: "@types/node" "*" -"@types/bn.js@^5.1.0": - version "5.1.0" - resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-5.1.0.tgz#32c5d271503a12653c62cf4d2b45e6eab8cebc68" - integrity sha512-QSSVYj7pYFN49kW77o2s9xTCwZ8F2xLbjLLSEVh8D2F4JUhZtPAGOFLTD+ffqksBx/u4cE/KImFjyhqCjn/LIA== - dependencies: - "@types/node" "*" - "@types/csv-parse@^1.2.2": version "1.2.2" resolved "https://registry.yarnpkg.com/@types/csv-parse/-/csv-parse-1.2.2.tgz#713486235759d615dc8e6a6a979170ada76701d5" @@ -416,6 +416,13 @@ dependencies: csv-parse "*" +"@types/elliptic@^6.4.14": + version "6.4.14" + resolved "https://registry.yarnpkg.com/@types/elliptic/-/elliptic-6.4.14.tgz#7bbaad60567a588c1f08b10893453e6b9b4de48e" + integrity sha512-z4OBcDAU0GVwDTuwJzQCiL6188QvZMkvoERgcVjq0/mPM8jCfdwZ3x5zQEVoL9WCAru3aG5wl3Z5Ww5wBWn7ZQ== + dependencies: + "@types/bn.js" "*" + "@types/ethereumjs-util@^6.1.0": version "6.1.0" resolved "https://registry.yarnpkg.com/@types/ethereumjs-util/-/ethereumjs-util-6.1.0.tgz#9dabd7302ec9728a7d99be15f4143977c33cd5ac" From 1408b9762b00cdc0208fc8b90d29fa64a2027de7 Mon Sep 17 00:00:00 2001 From: Kevin Kei Tuncer Date: Sun, 10 Apr 2022 19:18:27 +0200 Subject: [PATCH 05/24] - Set everything in a class - Change definition of commands -> Use anouther config file - Remove the use of 'eosio-helpers' - Add README.me to set up the test environment for the eosio contract on windows --- contracts/teleporteos/README.md | 31 + .../teleporteth/test/TeleportToken.test.js | 8 +- oracle/CommonTypes.ts | 16 + oracle/eosEndpointSwitcher.js | 2 +- oracle/eosEndpointSwitcher.ts | 2 +- oracle/oracle-eos.js | 14 +- oracle/oracle-eos.ts | 21 +- oracle/oracle-eth.js | 929 +++++++++--------- oracle/oracle-eth.ts | 693 ++++++------- oracle/package.json | 2 +- oracle/yarn.lock | 2 +- 11 files changed, 898 insertions(+), 822 deletions(-) create mode 100644 contracts/teleporteos/README.md diff --git a/contracts/teleporteos/README.md b/contracts/teleporteos/README.md new file mode 100644 index 0000000..9e1ab53 --- /dev/null +++ b/contracts/teleporteos/README.md @@ -0,0 +1,31 @@ +# Install test suite on windows + +Install Debian from microsoft store, start it, create your user account and run the following commands +``` +sudo apt-get update +``` +``` +sudo apt-get upgrade +``` +For yarn installation via npm +``` +sudo apt-get install npm +``` +Install yarn globally +``` +sudo npm install --global yarn +``` +Navigate in the console to the folder teleporteos in which you can install the modules (run the following command again if it fails) +``` +yarn install +``` +Install and start Docker, open its menu by double clicking the icon in the task bar and go to settings ⚙️. + +Check "Use the WSL 2 based engine" + +Enable Debian in the settings at Resources / WSL INTEGRATION + +Run the tests with the following command in the debian console +``` +yarn test +``` \ No newline at end of file diff --git a/contracts/teleporteth/test/TeleportToken.test.js b/contracts/teleporteth/test/TeleportToken.test.js index 4fa70b6..d496ced 100644 --- a/contracts/teleporteth/test/TeleportToken.test.js +++ b/contracts/teleporteth/test/TeleportToken.test.js @@ -47,16 +47,16 @@ const TestSettings = { keys: generateAllKeys('8940fbd7806ec09af7e1ceaf7ccac80e89eeeb1e85cee42f84c07b1d5a378100'), }, { eosio_name: 'anneliese', - keys: generateAllKeys('8940fbd7806ec09af7e1ceaf7ccac80e89eeeb1e85cee42f84c07b1d5a378101'), + keys: generateAllKeys('fef658def915544a10ca323e6b4f33a6179043e1862a522c20837fb87869e668'), }, { eosio_name: 'peterpeter12', - keys: generateAllKeys('8940fbd7806ec09af7e1ceaf7ccac80e89eeeb1e85cee42f84c07b1d5a378102'), + keys: generateAllKeys('579d5ba8a4423300b0c820930fdcc277bc805a29b94d026f35dec4b2e333820e'), }, { eosio_name: 'helga', keys: generateAllKeys('4040fbd7806ec09af7e1ceaf7ccac80e89eeeb1e85cee42f84c07b1d5a378110'), },{ eosio_name: 'hans', - keys: generateAllKeys('8940fbd7806ec09af7e1ceaf7ccac80e89eeeb1e85cee42f84c07b1d5a378103'), + keys: generateAllKeys('7695855d7b7590c52a0af76ded6866724dea37f07e33e4545c9ea17a2740e529'), }], eosioAbi: JSON.parse(fs.readFileSync('./test/teleporteos.abi', null).toString()) } @@ -80,7 +80,7 @@ contract('TeleportToken', (accounts) => { // List all oracles in console log for (let i = 0; i < TestSettings.oracles.length; i++) { const element = TestSettings.oracles[i]; - console.log(element.eosio_name, element.keys.ethAddress); + console.log(element.eosio_name, `${element.keys.ethAddress} ${element.keys.eosioPrivate}`); } it('Total supply', async () => { diff --git a/oracle/CommonTypes.ts b/oracle/CommonTypes.ts index 4b984a5..7c5cb09 100644 --- a/oracle/CommonTypes.ts +++ b/oracle/CommonTypes.ts @@ -38,4 +38,20 @@ export interface TeleportTableEntry{ oracles: Array, signatures: Array, claimed: boolean +} + +export interface eosio_claim_data { + oracle_name: string; + id: string; + to_eth: string; + quantity: string; +} + +export interface eosio_teleport_data { + oracle_name: string; + to: string; + ref: string; + quantity: string; + chain_id: string; + confirmed: boolean; } \ No newline at end of file diff --git a/oracle/eosEndpointSwitcher.js b/oracle/eosEndpointSwitcher.js index 7fe15dc..3dedc0e 100644 --- a/oracle/eosEndpointSwitcher.js +++ b/oracle/eosEndpointSwitcher.js @@ -72,7 +72,7 @@ var EosApi = /** @class */ (function () { this.gotRightInfo = Array(endpointList.length).fill(false); this.endpointList = endpointList.map(function (ep) { var lastIndex = ep.length - 1; - return ep.at(lastIndex) == '/' ? ep.substring(0, lastIndex) : ep; + return ep[lastIndex] == '/' ? ep.substring(0, lastIndex) : ep; }); } /** diff --git a/oracle/eosEndpointSwitcher.ts b/oracle/eosEndpointSwitcher.ts index 45c77a7..936ea11 100644 --- a/oracle/eosEndpointSwitcher.ts +++ b/oracle/eosEndpointSwitcher.ts @@ -12,7 +12,7 @@ export class EosApi{ this.gotRightInfo = Array(endpointList.length).fill(false) this.endpointList = endpointList.map(ep => { const lastIndex = ep.length - 1 - return ep.at(lastIndex) == '/' ? ep.substring(0, lastIndex) : ep + return ep[lastIndex] == '/' ? ep.substring(0, lastIndex) : ep }) } diff --git a/oracle/oracle-eos.js b/oracle/oracle-eos.js index 47ef59a..262c4cf 100755 --- a/oracle/oracle-eos.js +++ b/oracle/oracle-eos.js @@ -94,7 +94,7 @@ var EosOracle = /** @class */ (function () { this.signatureProvider = signatureProvider; this.running = false; this.irreversible_time = 0; - this.eos_api = new eosEndpointSwitcher_1.EosApi(config.eos.chainId, config.eos.endpoints, signatureProvider); + this.eos_api = new eosEndpointSwitcher_1.EosApi(this.config.eos.chainId, this.config.eos.endpoints, this.signatureProvider); } // static async tryHard(tries: number, action : (tryNumber?: number) => Promise, onCatch: (e?: any, tryNumber?: number) => boolean | undefined) { // let tryI = 0 @@ -270,7 +270,7 @@ var EosOracle = /** @class */ (function () { textEncoder: new text_encoding_1.TextEncoder, textDecoder: new text_encoding_1.TextDecoder }); - sb.pushNumberAsUint64(teleport.id); + sb.pushNumberAsUint64(teleport.id); // TODO: use bigint sb.pushUint32(teleport.time); sb.pushName(teleport.account); sb.pushAsset(teleport.quantity); @@ -600,7 +600,7 @@ var EosOracle = /** @class */ (function () { }); }; // private current_block_time = 0 - EosOracle.maxWait = 180; + EosOracle.maxWait = 180; // The max amount of seconds to wait to check an entry again if it is irreversible now return EosOracle; }()); // Handle params from console @@ -616,14 +616,9 @@ var argv = yargs_1.default description: 'Amount of handled teleports per requests', type: 'number' }) - // .option('block', { - // alias: 'b', - // description: 'Block number to start with', - // type: 'number' - // }) .option('signs', { alias: 's', - description: 'Amout of signatures until this oracle will signs too', + description: 'Amount of signatures until this oracle will sign too', type: 'number' }) .option('config', { @@ -639,4 +634,5 @@ var configFile = require(config_path); // Configure eosjs specific propperties var signatureProvider = new eosjs_jssig_1.JsSignatureProvider([configFile.eos.privateKey]); var eosOracle = new EosOracle(configFile, signatureProvider); +// Run the process eosOracle.run(argv.id, argv.amount); diff --git a/oracle/oracle-eos.ts b/oracle/oracle-eos.ts index 00394f9..76f1b48 100644 --- a/oracle/oracle-eos.ts +++ b/oracle/oracle-eos.ts @@ -58,10 +58,10 @@ class EosOracle{ public running = false private irreversible_time = 0 // private current_block_time = 0 - static maxWait = 180 + static maxWait = 180 // The max amount of seconds to wait to check an entry again if it is irreversible now constructor(private config: ConfigType, private signatureProvider: JsSignatureProvider){ - this.eos_api = new EosApi(config.eos.chainId, config.eos.endpoints, signatureProvider) + this.eos_api = new EosApi(this.config.eos.chainId, this.config.eos.endpoints, this.signatureProvider) } // static async tryHard(tries: number, action : (tryNumber?: number) => Promise, onCatch: (e?: any, tryNumber?: number) => boolean | undefined) { @@ -201,7 +201,7 @@ class EosOracle{ textEncoder: new TextEncoder, textDecoder: new TextDecoder }); - sb.pushNumberAsUint64(teleport.id) + sb.pushNumberAsUint64(teleport.id) // TODO: use bigint sb.pushUint32(teleport.time) sb.pushName(teleport.account) sb.pushAsset(teleport.quantity) @@ -436,7 +436,7 @@ class EosOracle{ * @param requestAmount Amount of requested teleports per request */ async run(id = 0, requestAmount = 100){ - console.log(`Starting EOS watcher for ETH oracle ${this.config.eth.oracleAccount}`); + console.log(`Starting EOS watcher for ETH oracle ${this.config.eth.oracleAccount}`) // Create an object to change the current id on each run this.running = true @@ -468,14 +468,9 @@ const argv = yargs description: 'Amount of handled teleports per requests', type: 'number' }) - // .option('block', { - // alias: 'b', - // description: 'Block number to start with', - // type: 'number' - // }) .option('signs', { alias: 's', - description: 'Amout of signatures until this oracle will signs too', + description: 'Amount of signatures until this oracle will sign too', type: 'number' }) .option('config', { @@ -496,6 +491,8 @@ process.title = `oracle-eos ${config_path}` const configFile : ConfigType = require(config_path) // Configure eosjs specific propperties -const signatureProvider = new JsSignatureProvider([configFile.eos.privateKey]); -let eosOracle = new EosOracle(configFile, signatureProvider) +const signatureProvider = new JsSignatureProvider([configFile.eos.privateKey]) +const eosOracle = new EosOracle(configFile, signatureProvider) + +// Run the process eosOracle.run(argv.id, argv.amount); \ No newline at end of file diff --git a/oracle/oracle-eth.js b/oracle/oracle-eth.js index a5fb837..bcf22b9 100755 --- a/oracle/oracle-eth.js +++ b/oracle/oracle-eth.js @@ -52,463 +52,494 @@ var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); -exports.extractEthTeleportData = exports.extractEthClaimedData = void 0; -process.title = "oracle-eth ".concat(process.env['CONFIG']); var fs_1 = __importDefault(require("fs")); var ethers_1 = require("ethers"); -var eosio_helpers_1 = require("eosio-helpers"); var yargs_1 = __importDefault(require("yargs")); -var config = require(process.env['CONFIG'] || '../config'); -var provider = new ethers_1.ethers.providers.StaticJsonRpcProvider(config.eth.endpoint); -var network = config.eth.network; -var blocks_file_name = ".oracle_".concat(network, "_block-").concat(config.eth.oracleAccount); -var DEFAULT_BLOCKS_TO_WAIT = 5; -var claimed_topic = '0xf20fc6923b8057dd0c3b606483fcaa038229bb36ebc35a0040e3eaa39cf97b17'; -var teleport_topic = '0x622824274e0937ee319b036740cd0887131781bc2032b47eac3e88a1be17f5d5'; -var precision = 4; -var await_confirmation = function (txid) { return __awaiter(void 0, void 0, void 0, function () { - return __generator(this, function (_a) { - return [2 /*return*/, new Promise(function (resolve) { return __awaiter(void 0, void 0, void 0, function () { - var resolved; - return __generator(this, function (_a) { - switch (_a.label) { - case 0: - resolved = false; - _a.label = 1; - case 1: - if (!!resolved) return [3 /*break*/, 3]; - provider.getTransactionReceipt(txid).then(function (receipt) { - if (receipt && receipt.confirmations > DEFAULT_BLOCKS_TO_WAIT) { - console.log("TX ".concat(txid, " has ").concat(receipt.confirmations, " confirmations")); - resolve(receipt); - resolved = true; - } - }); - return [4 /*yield*/, (0, eosio_helpers_1.Sleep)(10000)]; - case 2: - _a.sent(); - return [3 /*break*/, 1]; - case 3: return [2 /*return*/]; - } - }); - }); })]; - }); -}); }; +var eosjs_jssig_1 = require("eosjs/dist/eosjs-jssig"); +var eosEndpointSwitcher_1 = require("./eosEndpointSwitcher"); /** - * Loads a block number from a saved file if one exists or throws an error. - * @returns a saved block number from a file + * Use this function with await to let the thread sleep for the defined amount of time + * @param ms Milliseconds */ -var load_block_number_from_file = function (blocks_file) { - if (blocks_file === void 0) { blocks_file = blocks_file_name; } - return __awaiter(void 0, void 0, void 0, function () { - var file_contents, block_number; - return __generator(this, function (_a) { - // let block_number: string | number = 'latest'; - if (!fs_1.default.existsSync(blocks_file)) - throw new Error('block file does not exist.'); - file_contents = fs_1.default.readFileSync(blocks_file).toString(); - if (!file_contents) - throw new Error('No blocks file'); - block_number = parseInt(file_contents); - if (isNaN(block_number)) - throw new Error('No block number in file.'); - return [2 /*return*/, block_number]; - }); - }); -}; -var save_block_to_file = function (block_num, blocks_file) { - if (blocks_file === void 0) { blocks_file = blocks_file_name; } - return __awaiter(void 0, void 0, void 0, function () { - return __generator(this, function (_a) { - fs_1.default.writeFileSync(blocks_file, block_num.toString()); - return [2 /*return*/]; - }); - }); -}; -var extractEthClaimedData = function (data) { - var id = data[0].toNumber(); - var to_eth = data[1].replace('0x', '') + '000000000000000000000000'; - var quantity = (data[2].toNumber() / Math.pow(10, precision)).toFixed(precision) + ' ' + config.symbol; - return { oracle_name: config.eos.oracleAccount, id: id, to_eth: to_eth, quantity: quantity, }; -}; -exports.extractEthClaimedData = extractEthClaimedData; -var extractEthTeleportData = function (data, transactionHash) { - var tokens = data[1].toNumber(); - if (tokens <= 0) { - throw new Error('Tokens are less than or equal to 0'); - } - var to = data[0]; - var chain_id = data[2].toNumber(); - var amount = (tokens / Math.pow(10, config.precision)).toFixed(config.precision); - var quantity = "".concat(amount, " ").concat(config.symbol); - var txid = transactionHash.replace(/^0x/, ''); - return { chain_id: chain_id, confirmed: true, quantity: quantity, to: to, oracle_name: config.eos.oracleAccount, ref: txid }; -}; -exports.extractEthTeleportData = extractEthTeleportData; -var process_claimed = function (from_block, to_block, submit_to_blockchain) { return __awaiter(void 0, void 0, void 0, function () { - var query, res, res_1, res_1_1, _a, transactionHash, data, decodedData, eosioData, actions, eos_res, e_1, e_2_1; - var e_2, _b; - return __generator(this, function (_c) { - switch (_c.label) { - case 0: - query = { - fromBlock: from_block, - toBlock: to_block, - address: config.eth.teleportContract, - topics: [claimed_topic], - }; - return [4 /*yield*/, provider.getLogs(query)]; - case 1: - res = _c.sent(); - _c.label = 2; - case 2: - _c.trys.push([2, 11, 12, 17]); - res_1 = __asyncValues(res); - _c.label = 3; - case 3: return [4 /*yield*/, res_1.next()]; - case 4: - if (!(res_1_1 = _c.sent(), !res_1_1.done)) return [3 /*break*/, 10]; - _a = res_1_1.value, transactionHash = _a.transactionHash, data = _a.data; - decodedData = ethers_1.ethers.utils.defaultAbiCoder.decode(['uint64', 'address', 'uint'], data); - eosioData = (0, exports.extractEthClaimedData)(decodedData); - // wait for confirmation of each transaction before continuing - return [4 /*yield*/, await_confirmation(transactionHash)]; - case 5: - // wait for confirmation of each transaction before continuing - _c.sent(); - actions = [ - { - account: config.eos.teleportContract, - name: 'claimed', - authorization: [ - { - actor: config.eos.oracleAccount, - permission: config.eos.oraclePermission || 'active', - }, - ], - data: eosioData, - }, - ]; - _c.label = 6; - case 6: - _c.trys.push([6, 8, , 9]); - return [4 /*yield*/, (0, eosio_helpers_1.SingleRun)({ - actions: actions, - eos_endpoint: config.eos.endpoints[0], - submit_to_blockchain: submit_to_blockchain, - private_keys: [{ pk: config.eos.privateKey }], - })]; - case 7: - eos_res = _c.sent(); - console.log("Sent notification of claim with txid ".concat(eos_res.transaction_id, ", for ID ").concat(eosioData.id, ", account 0x").concat(eosioData.to_eth.substring(0, 40), ", quantity ").concat(eosioData.quantity)); - return [3 /*break*/, 9]; - case 8: - e_1 = _c.sent(); - if (e_1.message.indexOf('Already marked as claimed') > -1) { - console.log("ID ".concat(eosioData.id, " is already claimed, account 0x").concat(eosioData.to_eth.substring(0, 40), ", quantity ").concat(eosioData.quantity)); - } - else { - console.error("Error sending confirm ".concat(e_1.message)); - } - return [3 /*break*/, 9]; - case 9: return [3 /*break*/, 3]; - case 10: return [3 /*break*/, 17]; - case 11: - e_2_1 = _c.sent(); - e_2 = { error: e_2_1 }; - return [3 /*break*/, 17]; - case 12: - _c.trys.push([12, , 15, 16]); - if (!(res_1_1 && !res_1_1.done && (_b = res_1.return))) return [3 /*break*/, 14]; - return [4 /*yield*/, _b.call(res_1)]; - case 13: - _c.sent(); - _c.label = 14; - case 14: return [3 /*break*/, 16]; - case 15: - if (e_2) throw e_2.error; - return [7 /*endfinally*/]; - case 16: return [7 /*endfinally*/]; - case 17: return [2 /*return*/]; - } +var sleep = function (ms) { return __awaiter(void 0, void 0, void 0, function () { + return __generator(this, function (_a) { + return [2 /*return*/, new Promise(function (resolve) { + setTimeout(resolve, ms); + })]; }); }); }; -var process_teleported = function (from_block, to_block, submit_to_blockchain) { return __awaiter(void 0, void 0, void 0, function () { - var query, res, res_2, res_2_1, _a, transactionHash, data, decodedData, eosioData, actions, eos_res, e_3, e_4_1; - var e_4, _b; - return __generator(this, function (_c) { - switch (_c.label) { - case 0: - query = { - fromBlock: from_block, - toBlock: to_block, - address: config.eth.teleportContract, - topics: [teleport_topic], - }; - return [4 /*yield*/, provider.getLogs(query)]; - case 1: - res = _c.sent(); - _c.label = 2; - case 2: - _c.trys.push([2, 13, 14, 19]); - res_2 = __asyncValues(res); - _c.label = 3; - case 3: return [4 /*yield*/, res_2.next()]; - case 4: - if (!(res_2_1 = _c.sent(), !res_2_1.done)) return [3 /*break*/, 12]; - _a = res_2_1.value, transactionHash = _a.transactionHash, data = _a.data; - decodedData = ethers_1.ethers.utils.defaultAbiCoder.decode(['string', 'uint', 'uint'], data); - eosioData = (0, exports.extractEthTeleportData)(decodedData, transactionHash); - return [4 /*yield*/, await_confirmation(transactionHash)]; - case 5: - _c.sent(); - actions = [ - { - account: config.eos.teleportContract, - name: 'received', - authorization: [ - { - actor: config.eos.oracleAccount, - permission: config.eos.oraclePermission || 'active', - }, - ], - data: eosioData, - }, - ]; - _c.label = 6; - case 6: - _c.trys.push([6, 8, , 9]); - return [4 /*yield*/, (0, eosio_helpers_1.SingleRun)({ - actions: actions, - eos_endpoint: config.eos.endpoints[0], - submit_to_blockchain: submit_to_blockchain, - private_keys: [{ pk: config.eos.privateKey }], - })]; - case 7: - eos_res = _c.sent(); - console.log("Sent notification of teleport with txid ".concat(eos_res.transaction_id)); - return [3 /*break*/, 9]; - case 8: - e_3 = _c.sent(); - if (e_3.message.indexOf('Oracle has already approved') > -1) { - console.log('Oracle has already approved'); - } - else { - console.error("Error sending teleport ".concat(e_3.message)); - } - return [3 /*break*/, 9]; - case 9: - { - //if (res.length) { - // for (let r = 0; r < res.length; r++) { - // const data = ethers.utils.defaultAbiCoder.decode( - // ['string', 'uint', 'uint'], - // res[r].data - // ); - // console.log(res[r], data, data[1].toString()) - // const tokens = data[1].toNumber(); - // if (tokens <= 0) { - // // console.error(data); - // console.error('Tokens are less than or equal to 0'); - // continue; - // } - // const to = data[0]; - // const chain_id = data[2].toNumber(); - // const amount = (tokens / Math.pow(10, config.precision)).toFixed( - // config.precision - // ); - // const quantity = `${amount} ${config.symbol}`; - // const txid = res[r].transactionHash.replace(/^0x/, ''); - // const actions: EosioAction[] = []; - // actions.push({ - // account: config.eos.teleportContract, - // name: 'received', - // authorization: [ - // { - // actor: config.eos.oracleAccount, - // permission: config.eos.oraclePermission || 'active', - // }, - // ], - // data: { - // oracle_name: config.eos.oracleAccount, - // to, - // ref: txid, - // quantity, - // chain_id, - // confirmed: true, - // }, - // }); - // // console.log(actions); - // await_confirmation(res[r].transactionHash).then(async () => { - // try { - // const eos_res = await eos_api.transact( - // { actions }, - // { - // blocksBehind: 3, - // expireSeconds: 180, - // } - // ); - // console.log( - // `Sent notification of teleport with txid ${eos_res.transaction_id}` - // ); - // // resolve(); - // } catch (e) { - // if (e.message.indexOf('Oracle has already approved') > -1) { - // console.log('Oracle has already approved'); - // } else { - // console.error(`Error sending teleport ${e.message}`); - // // reject(e); - // } - // } - // }); - } - return [4 /*yield*/, (0, eosio_helpers_1.Sleep)(500)]; - case 10: - _c.sent(); - _c.label = 11; - case 11: return [3 /*break*/, 3]; - case 12: return [3 /*break*/, 19]; - case 13: - e_4_1 = _c.sent(); - e_4 = { error: e_4_1 }; - return [3 /*break*/, 19]; - case 14: - _c.trys.push([14, , 17, 18]); - if (!(res_2_1 && !res_2_1.done && (_b = res_2.return))) return [3 /*break*/, 16]; - return [4 /*yield*/, _b.call(res_2)]; - case 15: - _c.sent(); - _c.label = 16; - case 16: return [3 /*break*/, 18]; - case 17: - if (e_4) throw e_4.error; - return [7 /*endfinally*/]; - case 18: return [7 /*endfinally*/]; - case 19: return [2 /*return*/]; +var EthOracle = /** @class */ (function () { + function EthOracle(config, ethProvider, signatureProvider) { + this.config = config; + this.ethProvider = ethProvider; + this.signatureProvider = signatureProvider; + this.running = false; + this.claimed_topic = '0xf20fc6923b8057dd0c3b606483fcaa038229bb36ebc35a0040e3eaa39cf97b17'; + this.teleport_topic = '0x622824274e0937ee319b036740cd0887131781bc2032b47eac3e88a1be17f5d5'; + this.DEFAULT_BLOCKS_TO_WAIT = 1; //- 5 + this.blocks_file_name = ".oracle_".concat(configFile.eth.network, "_block-").concat(configFile.eth.oracleAccount); + this.eos_api = new eosEndpointSwitcher_1.EosApi(this.config.eos.chainId, this.config.eos.endpoints, this.signatureProvider); + } + /** + * Get object of the data of an "claimed"-event on eth chain + * @param data "claimed"-event data + * @param config Contains information of precision and symbol of the token as well as the oracle name of this contract + * @returns + */ + EthOracle.extractEthClaimedData = function (data, config) { + console.log('data[0]', data[0]); + var id = data[0].toNumber(); // TODO: .toBigInt() + var to_eth = data[1].replace('0x', '') + '000000000000000000000000'; + var quantity = (data[2].toNumber() / Math.pow(10, config.precision)).toFixed(config.precision) + ' ' + config.symbol; + return { oracle_name: config.eos.oracleAccount, id: id, to_eth: to_eth, quantity: quantity, }; + }; + /** + * Get object of the data of an "teleport"-event on eth chain + * @param data "teleport"-event data + * @param config Contains information of precision and symbol of the token as well as the oracle name of this contract + * @returns + */ + EthOracle.extractEthTeleportData = function (data, transactionHash, config) { + var tokens = data[1].toNumber(); + if (tokens <= 0) { + throw new Error('Tokens are less than or equal to 0'); } - }); -}); }; -var run = function (start_ref, submit_to_blockchain) { return __awaiter(void 0, void 0, void 0, function () { - var from_block, block, latest_block, err_1, to_block, e_5; - return __generator(this, function (_a) { - switch (_a.label) { - case 0: - if (!true) return [3 /*break*/, 19]; - _a.label = 1; - case 1: - _a.trys.push([1, 17, , 18]); - return [4 /*yield*/, provider.getBlock('latest')]; - case 2: - block = _a.sent(); - latest_block = block.number; - if (!!from_block) return [3 /*break*/, 8]; - if (!(start_ref === 'latest')) return [3 /*break*/, 7]; - _a.label = 3; - case 3: - _a.trys.push([3, 5, , 6]); - return [4 /*yield*/, load_block_number_from_file()]; - case 4: - from_block = _a.sent(); - // for fresh start go back 50 blocks - from_block -= 50; - console.log("Starting from saved block with additional previous 50 blocks for safety: ".concat(from_block, ". ")); - return [3 /*break*/, 6]; - case 5: - err_1 = _a.sent(); - console.log(err_1); - // could not get block from file and it wasn't specified (go back 100 blocks from latest) - from_block = latest_block - 100; - return [3 /*break*/, 6]; - case 6: return [3 /*break*/, 8]; - case 7: - if (typeof start_ref === 'number') { - from_block = start_ref; - } - else { - from_block = config.eth.genesisBlock; - } - _a.label = 8; - case 8: - if (from_block < 0) { - from_block = 0; + var to = data[0]; + var chain_id = data[2].toNumber(); + var amount = (tokens / Math.pow(10, config.precision)).toFixed(config.precision); + var quantity = "".concat(amount, " ").concat(config.symbol); + var txid = transactionHash.replace(/^0x/, ''); + return { chain_id: chain_id, confirmed: true, quantity: quantity, to: to, oracle_name: config.eos.oracleAccount, ref: txid }; + }; + EthOracle.prototype.await_confirmation = function (txid) { + return __awaiter(this, void 0, void 0, function () { + var _this = this; + return __generator(this, function (_a) { + return [2 /*return*/, new Promise(function (resolve) { return __awaiter(_this, void 0, void 0, function () { + var resolved; + var _this = this; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + resolved = false; + _a.label = 1; + case 1: + if (!!resolved) return [3 /*break*/, 3]; + this.ethProvider.getTransactionReceipt(txid).then(function (receipt) { + console.log("Cofirmations ".concat(receipt.confirmations)); //- + if (receipt && receipt.confirmations > _this.DEFAULT_BLOCKS_TO_WAIT) { + console.log("TX ".concat(txid, " has ").concat(receipt.confirmations, " confirmations")); + resolve(receipt); + resolved = true; + } + }); + return [4 /*yield*/, sleep(10000)]; + case 2: + _a.sent(); + return [3 /*break*/, 1]; + case 3: return [2 /*return*/]; + } + }); + }); })]; + }); + }); + }; + EthOracle.save_block_to_file = function (block_num, blocks_file) { + return __awaiter(this, void 0, void 0, function () { + return __generator(this, function (_a) { + fs_1.default.writeFileSync(blocks_file, block_num.toString()); + return [2 /*return*/]; + }); + }); + }; + ; + /** + * Check for "claimed" events and store them on eosio chain + * @param from_block Block number to start looking for events + * @param to_block Block number to end looking for events + * @param trxBroadcast False if the transaction should not be broadcasted (not submitted to the block chain) + */ + EthOracle.prototype.process_claimed = function (from_block, to_block, trxBroadcast) { + var e_1, _a; + if (trxBroadcast === void 0) { trxBroadcast = true; } + return __awaiter(this, void 0, void 0, function () { + var query, res, res_1, res_1_1, _b, transactionHash, data, decodedData, eosioData, actions, eos_res, e_2, e_1_1; + return __generator(this, function (_c) { + switch (_c.label) { + case 0: + query = { + fromBlock: from_block, + toBlock: to_block, + address: this.config.eth.teleportContract, + topics: [this.claimed_topic], + }; + return [4 /*yield*/, this.ethProvider.getLogs(query)]; + case 1: + res = _c.sent(); + _c.label = 2; + case 2: + _c.trys.push([2, 11, 12, 17]); + res_1 = __asyncValues(res); + _c.label = 3; + case 3: return [4 /*yield*/, res_1.next()]; + case 4: + if (!(res_1_1 = _c.sent(), !res_1_1.done)) return [3 /*break*/, 10]; + _b = res_1_1.value, transactionHash = _b.transactionHash, data = _b.data; + decodedData = ethers_1.ethers.utils.defaultAbiCoder.decode(['uint64', 'address', 'uint'], data); + eosioData = EthOracle.extractEthClaimedData(decodedData, this.config); + console.log('claimed eosioData', eosioData); + // Wait for confirmation of each transaction before continuing + return [4 /*yield*/, this.await_confirmation(transactionHash)]; + case 5: + // Wait for confirmation of each transaction before continuing + _c.sent(); + actions = [{ + account: this.config.eos.teleportContract, + name: 'claimed', + authorization: [{ + actor: this.config.eos.oracleAccount, + permission: this.config.eos.oraclePermission || 'active', + }], + data: eosioData, + }]; + _c.label = 6; + case 6: + _c.trys.push([6, 8, , 9]); + console.log("Send claimed: ".concat(this.config.eos.endpoints[0], " submit: ").concat(trxBroadcast, " pk: ").concat(this.config.eos.privateKey), actions); //- + return [4 /*yield*/, this.eos_api.getAPI().transact({ + actions: actions + }, { + blocksBehind: 3, + expireSeconds: 30, + broadcast: trxBroadcast + })]; + case 7: + eos_res = _c.sent(); + console.log("Sent notification of claim with txid ".concat(eos_res.transaction_id, ", for ID ").concat(eosioData.id, ", account 0x").concat(eosioData.to_eth.substring(0, 40), ", quantity ").concat(eosioData.quantity)); + console.log('Claimed result', eos_res); //- + return [3 /*break*/, 9]; + case 8: + e_2 = _c.sent(); + // Check if the error appears because the transaction is already claimed + if (e_2.message.indexOf('Already marked as claimed') > -1) { + console.log("ID ".concat(eosioData.id, " is already claimed, account 0x").concat(eosioData.to_eth.substring(0, 40), ", quantity ").concat(eosioData.quantity, " \u2714\uFE0F")); + } + else { + console.error("Error sending confirm ".concat(e_2.message, " \u274C")); + } + return [3 /*break*/, 9]; + case 9: return [3 /*break*/, 3]; + case 10: return [3 /*break*/, 17]; + case 11: + e_1_1 = _c.sent(); + e_1 = { error: e_1_1 }; + return [3 /*break*/, 17]; + case 12: + _c.trys.push([12, , 15, 16]); + if (!(res_1_1 && !res_1_1.done && (_a = res_1.return))) return [3 /*break*/, 14]; + return [4 /*yield*/, _a.call(res_1)]; + case 13: + _c.sent(); + _c.label = 14; + case 14: return [3 /*break*/, 16]; + case 15: + if (e_1) throw e_1.error; + return [7 /*endfinally*/]; + case 16: return [7 /*endfinally*/]; + case 17: return [2 /*return*/]; } - to_block = Math.min(from_block + 100, latest_block); - if (!(start_ref >= latest_block)) return [3 /*break*/, 10]; - console.log("Up to date at block ".concat(to_block)); - return [4 /*yield*/, (0, eosio_helpers_1.Sleep)(10000)]; - case 9: - _a.sent(); - _a.label = 10; - case 10: - console.log("Getting events from block ".concat(from_block, " to ").concat(to_block)); - return [4 /*yield*/, process_claimed(from_block, to_block, submit_to_blockchain)]; - case 11: - _a.sent(); - return [4 /*yield*/, process_teleported(from_block, to_block, submit_to_blockchain)]; - case 12: - _a.sent(); - from_block = to_block; - // save last block received - return [4 /*yield*/, save_block_to_file(to_block)]; - case 13: - // save last block received - _a.sent(); - if (!(latest_block - from_block <= 1000)) return [3 /*break*/, 15]; - console.log('Waiting...'); - return [4 /*yield*/, (0, eosio_helpers_1.Sleep)(30000)]; - case 14: - _a.sent(); - return [3 /*break*/, 16]; - case 15: - console.log("Not waiting... ".concat(latest_block, " - ").concat(from_block)); - _a.label = 16; - case 16: return [3 /*break*/, 18]; - case 17: - e_5 = _a.sent(); - console.error(e_5.message); - return [3 /*break*/, 18]; - case 18: return [3 /*break*/, 0]; - case 19: return [2 /*return*/]; - } - }); -}); }; -(function () { return __awaiter(void 0, void 0, void 0, function () { - var startRef, _a, start_block, submit_to_blockchain, start_block_env; - return __generator(this, function (_b) { - switch (_b.label) { - case 0: - startRef = 'latest'; - return [4 /*yield*/, (0, yargs_1.default)(process.argv) - .option('start_block', { - alias: 's', - desc: 'start block to start scanning from', - number: true, - demandOption: false, - }) - .option('submit_to_blockchain', { - alias: 'b', - boolean: true, - description: 'boolean to determine if it should submit actions to Wax blockchain', - default: false, - demandOption: false, - }).argv]; - case 1: - _a = _b.sent(), start_block = _a.start_block, submit_to_blockchain = _a.submit_to_blockchain; - if (start_block) { - startRef = start_block; + }); + }); + }; + /** + * Check for "teleport" events and store them on eosio chain + * @param from_block Block number to start looking for events + * @param to_block Block number to end looking for events + * @param trxBroadcast False if the transaction should not be broadcasted (not submitted to the block chain) + */ + EthOracle.prototype.process_teleported = function (from_block, to_block, trxBroadcast) { + var e_3, _a; + if (trxBroadcast === void 0) { trxBroadcast = true; } + return __awaiter(this, void 0, void 0, function () { + var query, res, res_2, res_2_1, _b, transactionHash, data, decodedData, eosioData, actions, eos_res, e_4, e_3_1; + return __generator(this, function (_c) { + switch (_c.label) { + case 0: + query = { + fromBlock: from_block, + toBlock: to_block, + address: this.config.eth.teleportContract, + topics: [this.teleport_topic], + }; + return [4 /*yield*/, this.ethProvider.getLogs(query) + // Confirm each teleport event on eosio chain + ]; + case 1: + res = _c.sent(); + _c.label = 2; + case 2: + _c.trys.push([2, 13, 14, 19]); + res_2 = __asyncValues(res); + _c.label = 3; + case 3: return [4 /*yield*/, res_2.next()]; + case 4: + if (!(res_2_1 = _c.sent(), !res_2_1.done)) return [3 /*break*/, 12]; + _b = res_2_1.value, transactionHash = _b.transactionHash, data = _b.data; + decodedData = ethers_1.ethers.utils.defaultAbiCoder.decode(['string', 'uint', 'uint'], data); + eosioData = EthOracle.extractEthTeleportData(decodedData, transactionHash, this.config); + // Wait for confirmation of each transaction before continuing + return [4 /*yield*/, this.await_confirmation(transactionHash)]; + case 5: + // Wait for confirmation of each transaction before continuing + _c.sent(); + actions = [{ + account: this.config.eos.teleportContract, + name: 'received', + authorization: [{ + actor: this.config.eos.oracleAccount, + permission: this.config.eos.oraclePermission || 'active', + }], + data: eosioData, + }]; + _c.label = 6; + case 6: + _c.trys.push([6, 8, , 9]); + return [4 /*yield*/, this.eos_api.getAPI().transact({ + actions: actions + }, { + blocksBehind: 3, + expireSeconds: 30, + broadcast: trxBroadcast + })]; + case 7: + eos_res = _c.sent(); + console.log("Sent notification of teleport with txid ".concat(eos_res.transaction_id)); + return [3 /*break*/, 9]; + case 8: + e_4 = _c.sent(); + if (e_4.message.indexOf('Oracle has already approved') > -1) { + console.log('Oracle has already approved ✔️'); + } + else { + console.error("Error sending teleport ".concat(e_4.message, " \u274C")); + } + return [3 /*break*/, 9]; + case 9: return [4 /*yield*/, sleep(500)]; + case 10: + _c.sent(); + _c.label = 11; + case 11: return [3 /*break*/, 3]; + case 12: return [3 /*break*/, 19]; + case 13: + e_3_1 = _c.sent(); + e_3 = { error: e_3_1 }; + return [3 /*break*/, 19]; + case 14: + _c.trys.push([14, , 17, 18]); + if (!(res_2_1 && !res_2_1.done && (_a = res_2.return))) return [3 /*break*/, 16]; + return [4 /*yield*/, _a.call(res_2)]; + case 15: + _c.sent(); + _c.label = 16; + case 16: return [3 /*break*/, 18]; + case 17: + if (e_3) throw e_3.error; + return [7 /*endfinally*/]; + case 18: return [7 /*endfinally*/]; + case 19: return [2 /*return*/]; } - else if (process.env['START_BLOCK']) { - start_block_env = parseInt(process.env['START_BLOCK']); - if (isNaN(start_block_env)) { - console.error("You must supply start block as an integer in env"); - process.exit(1); - } - startRef = start_block_env; + }); + }); + }; + /** + * Loads a block number from a saved file if one exists or throws an error. + * @returns a saved block number from a file + */ + EthOracle.load_block_number_from_file = function (blocks_file) { + return __awaiter(this, void 0, void 0, function () { + var file_contents, block_number; + return __generator(this, function (_a) { + // let block_number: string | number = 'latest'; + if (!fs_1.default.existsSync(blocks_file)) + throw new Error('block file does not exist.'); + file_contents = fs_1.default.readFileSync(blocks_file).toString(); + if (!file_contents) + throw new Error('No blocks file'); + block_number = parseInt(file_contents); + if (isNaN(block_number)) + throw new Error('No block number in file.'); + return [2 /*return*/, block_number]; + }); + }); + }; + /** + * Run the process of checking the eth chain for teleports and claims and store the state on ethe eosio chain + * @param start_ref Block number to start from. String 'latest' to start from the latest block in block number file + * @param trxBroadcast False if transactions should not be broadcasted (not submitted to the block chain) + */ + EthOracle.prototype.run = function (start_ref, trxBroadcast) { + if (trxBroadcast === void 0) { trxBroadcast = true; } + return __awaiter(this, void 0, void 0, function () { + var from_block, block, latest_block, err_1, to_block, e_5, e_6; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + this.running = true; + _a.label = 1; + case 1: + _a.trys.push([1, 23, , 24]); + _a.label = 2; + case 2: + if (!this.running) return [3 /*break*/, 22]; + _a.label = 3; + case 3: + _a.trys.push([3, 19, , 21]); + return [4 /*yield*/, this.ethProvider.getBlock('latest')]; + case 4: + block = _a.sent(); + latest_block = block.number; + if (!!from_block) return [3 /*break*/, 10]; + if (!(start_ref === 'latest')) return [3 /*break*/, 9]; + _a.label = 5; + case 5: + _a.trys.push([5, 7, , 8]); + return [4 /*yield*/, EthOracle.load_block_number_from_file(this.blocks_file_name)]; + case 6: + from_block = _a.sent(); + from_block -= 50; // for fresh start go back 50 blocks + console.log("Starting from saved block with additional previous 50 blocks for safety: ".concat(from_block, ".")); + return [3 /*break*/, 8]; + case 7: + err_1 = _a.sent(); + console.log('Could not get block from file and it was not specified ❌'); + from_block = latest_block - 100; // go back 100 blocks from latest + return [3 /*break*/, 8]; + case 8: return [3 /*break*/, 10]; + case 9: + if (typeof start_ref === 'number') { + from_block = start_ref; + } + else { + from_block = this.config.eth.genesisBlock; + } + _a.label = 10; + case 10: + if (from_block < 0) { + from_block = 0; + } + to_block = Math.min(from_block + 100, latest_block); + if (!(start_ref >= latest_block)) return [3 /*break*/, 12]; + console.log("Up to date at block ".concat(to_block)); + return [4 /*yield*/, sleep(10000)]; + case 11: + _a.sent(); + _a.label = 12; + case 12: + console.log("Getting events from block ".concat(from_block, " to ").concat(to_block)); + return [4 /*yield*/, this.process_claimed(from_block, to_block, trxBroadcast)]; + case 13: + _a.sent(); + return [4 /*yield*/, this.process_teleported(from_block, to_block, trxBroadcast)]; + case 14: + _a.sent(); + from_block = to_block; + // Save last block received + return [4 /*yield*/, EthOracle.save_block_to_file(to_block, this.blocks_file_name)]; + case 15: + // Save last block received + _a.sent(); + if (!(latest_block - from_block <= 1000)) return [3 /*break*/, 17]; + console.log('Waiting...'); + return [4 /*yield*/, sleep(30000)]; + case 16: + _a.sent(); + return [3 /*break*/, 18]; + case 17: + console.log("Not waiting... ".concat(latest_block, " - ").concat(from_block)); + _a.label = 18; + case 18: return [3 /*break*/, 21]; + case 19: + e_5 = _a.sent(); + console.error('⚡️ ' + e_5.message); + console.error('Try again in 5 seconds'); + return [4 /*yield*/, sleep(5000)]; + case 20: + _a.sent(); + return [3 /*break*/, 21]; + case 21: return [3 /*break*/, 2]; + case 22: return [3 /*break*/, 24]; + case 23: + e_6 = _a.sent(); + console.error('⚡️ ' + e_6); + return [3 /*break*/, 24]; + case 24: + console.log('Thread closed 💀'); + return [2 /*return*/]; } - run(startRef, submit_to_blockchain); - return [2 /*return*/]; - } - }); -}); })().catch(function (e) { - console.error('error: ', e); -}); + }); + }); + }; + return EthOracle; +}()); +// Handle params from console +var argv = yargs_1.default + .version().alias('version', 'v') + // .option('id', { + // alias: 'n', + // description: 'Teleport id to start from', + // type: 'number' + // }) + // .option('amount', { + // alias: 'a', + // description: 'Amount of handled teleports per requests', + // type: 'number' + // }) + .option('block', { + alias: 'b', + description: 'Block number to start scanning from', + type: 'number' +}) + // .option('signs', { + // alias: 's', + // description: 'Amount of signatures until this oracle will sign too', + // type: 'number' + // }) + .option('config', { + alias: 'c', + description: 'Path of config file', + type: 'string' +}) + .option('broadcast', { + alias: 'o', + type: 'boolean', + description: 'boolean to determine if transactions should be submitted to blockchain', + default: true, +}) + .help().alias('help', 'h').argv; +// Load config and set title +var config_path = argv.config || process.env['CONFIG'] || './config'; +process.title = "oracle-eth ".concat(config_path); +var configFile = require(config_path); +// Check and set start parameters +var startRef = 'latest'; +if (argv.block) { + startRef = argv.block; +} +else if (process.env['START_BLOCK']) { + var start_block_env = parseInt(process.env['START_BLOCK']); + if (isNaN(start_block_env)) { + console.error("You must supply start block as an integer in env"); + process.exit(1); + } + startRef = start_block_env; +} +if (configFile.eos.epVerifications > configFile.eos.endpoints.length) { + console.error('Error: epVerifications cannot be greater than given amount of endpints'); + process.exit(1); +} +var eosSigProvider = new eosjs_jssig_1.JsSignatureProvider([configFile.eos.privateKey]); +var ethProvider = new ethers_1.ethers.providers.StaticJsonRpcProvider(configFile.eth.endpoint); +// Set up the oracle +var ethOracle = new EthOracle(configFile, ethProvider, eosSigProvider); +// Run the process +ethOracle.run(startRef, argv.broadcast); diff --git a/oracle/oracle-eth.ts b/oracle/oracle-eth.ts index d693447..16c328b 100755 --- a/oracle/oracle-eth.ts +++ b/oracle/oracle-eth.ts @@ -6,370 +6,375 @@ This oracle listens to the ethereum blockchain for `Teleport` events. When an event is received, it will call the `received` action on the EOS chain */ -process.title = `oracle-eth ${process.env['CONFIG']}`; +import fs from 'fs' +import { ethers } from 'ethers' +import yargs from 'yargs' +import { ConfigType, eosio_claim_data, eosio_teleport_data } from './CommonTypes' +import { JsSignatureProvider } from 'eosjs/dist/eosjs-jssig' +import { EosApi } from './eosEndpointSwitcher' +import { TransactResult } from 'eosjs/dist/eosjs-api-interfaces' -import fs from 'fs'; -import { ethers } from 'ethers'; -import { SingleRun, Sleep } from 'eosio-helpers'; -import yargs from 'yargs'; -import { ConfigType } from './CommonTypes'; - -const config: ConfigType = require(process.env['CONFIG'] || '../config'); - -const provider = new ethers.providers.StaticJsonRpcProvider( - config.eth.endpoint -); - -const network = config.eth.network; -const blocks_file_name = `.oracle_${network}_block-${config.eth.oracleAccount}`; -const DEFAULT_BLOCKS_TO_WAIT = 5; -const claimed_topic = '0xf20fc6923b8057dd0c3b606483fcaa038229bb36ebc35a0040e3eaa39cf97b17'; -const teleport_topic = '0x622824274e0937ee319b036740cd0887131781bc2032b47eac3e88a1be17f5d5'; -const precision = 4; - -const await_confirmation = async (txid: string) => { - return new Promise(async (resolve) => { - let resolved = false; - while (!resolved) { - provider.getTransactionReceipt(txid).then((receipt) => { - if (receipt && receipt.confirmations > DEFAULT_BLOCKS_TO_WAIT) { - console.log(`TX ${txid} has ${receipt.confirmations} confirmations`); - resolve(receipt); - resolved = true; - } - }); - await Sleep(10000); - } - }); -}; +type EthDataConfig = {precision: number, symbol: string, eos:{oracleAccount: string}} /** - * Loads a block number from a saved file if one exists or throws an error. - * @returns a saved block number from a file + * Use this function with await to let the thread sleep for the defined amount of time + * @param ms Milliseconds */ -const load_block_number_from_file = async (blocks_file: string = blocks_file_name) => { - // let block_number: string | number = 'latest'; - if (!fs.existsSync(blocks_file)) - throw new Error('block file does not exist.'); - - const file_contents = fs.readFileSync(blocks_file).toString(); - if (!file_contents) throw new Error('No blocks file'); - - const block_number = parseInt(file_contents); - if (isNaN(block_number)) throw new Error('No block number in file.'); - - return block_number; -}; - -const save_block_to_file = async (block_num: number, blocks_file: string = blocks_file_name) => { - fs.writeFileSync(blocks_file, block_num.toString()); + const sleep = async (ms: number) => { + return new Promise((resolve) => { + setTimeout(resolve, ms); + }); }; -type eosio_claim_data = { - oracle_name: string; - id: string; - to_eth: string; - quantity: string; -}; - -type eosio_teleport_data = { - oracle_name: string; - to: string; - ref: string; - quantity: string; - chain_id: string; - confirmed: boolean; -}; - -export const extractEthClaimedData = (data: ethers.utils.Result): eosio_claim_data => { - const id = data[0].toNumber(); - const to_eth = data[1].replace('0x', '') + '000000000000000000000000'; - const quantity = (data[2].toNumber() / Math.pow(10, precision)).toFixed(precision) + ' ' + config.symbol; - return { oracle_name: config.eos.oracleAccount, id, to_eth, quantity, }; -}; - -export const extractEthTeleportData = (data: ethers.utils.Result, transactionHash: string): eosio_teleport_data => { - const tokens = data[1].toNumber(); - if (tokens <= 0) { - throw new Error('Tokens are less than or equal to 0'); - } - const to = data[0]; - const chain_id = data[2].toNumber(); - const amount = (tokens / Math.pow(10, config.precision)).toFixed( - config.precision - ); - const quantity = `${amount} ${config.symbol}`; - const txid = transactionHash.replace(/^0x/, ''); - - return { chain_id, confirmed: true, quantity, to, oracle_name: config.eos.oracleAccount, ref: txid }; -}; - -const process_claimed = async (from_block: number, to_block: number, submit_to_blockchain: boolean) => { - const query = { - fromBlock: from_block, - toBlock: to_block, - address: config.eth.teleportContract, - topics: [claimed_topic], - }; - const res = await provider.getLogs(query); - - // console.log(res); - - for await (const { transactionHash, data } of res) { - const decodedData = ethers.utils.defaultAbiCoder.decode( - ['uint64', 'address', 'uint'], - data - ); - - const eosioData = extractEthClaimedData(decodedData); - - // wait for confirmation of each transaction before continuing - await await_confirmation(transactionHash); - const actions = [ - { - account: config.eos.teleportContract, - name: 'claimed', - authorization: [ - { - actor: config.eos.oracleAccount, - permission: config.eos.oraclePermission || 'active', - }, - ], - data: eosioData, - }, - ]; - - try { - const eos_res = await SingleRun({ - actions, - eos_endpoint: config.eos.endpoints[0], - submit_to_blockchain, - private_keys: [{ pk: config.eos.privateKey }], - }); - - console.log(`Sent notification of claim with txid ${eos_res.transaction_id}, for ID ${eosioData.id - }, account 0x${eosioData.to_eth.substring(0, 40)}, quantity ${eosioData.quantity}`); - - } catch (e: any) { - if (e.message.indexOf('Already marked as claimed') > -1) { - - console.log(`ID ${eosioData.id} is already claimed, account 0x${eosioData.to_eth.substring(0, 40) - }, quantity ${eosioData.quantity}`); - - } else { - console.error(`Error sending confirm ${e.message}`); - } +class EthOracle { + public running = false + private claimed_topic = '0xf20fc6923b8057dd0c3b606483fcaa038229bb36ebc35a0040e3eaa39cf97b17' + private teleport_topic = '0x622824274e0937ee319b036740cd0887131781bc2032b47eac3e88a1be17f5d5' + private DEFAULT_BLOCKS_TO_WAIT = 1 //- 5 + private blocks_file_name : string + private eos_api: EosApi + + constructor(private config: ConfigType, private ethProvider: ethers.providers.StaticJsonRpcProvider, private signatureProvider: JsSignatureProvider){ + this.blocks_file_name = `.oracle_${configFile.eth.network}_block-${configFile.eth.oracleAccount}` + this.eos_api = new EosApi(this.config.eos.chainId, this.config.eos.endpoints, this.signatureProvider) } - } -}; - -const process_teleported = async (from_block: number, to_block: number, submit_to_blockchain: boolean) => { - const query = { - fromBlock: from_block, - toBlock: to_block, - address: config.eth.teleportContract, - topics: [teleport_topic], - }; - - const res = await provider.getLogs(query); - - for await (const { transactionHash, data } of res) { - const decodedData = ethers.utils.defaultAbiCoder.decode( - ['string', 'uint', 'uint'], - data - ); - - const eosioData = extractEthTeleportData(decodedData, transactionHash); - - await await_confirmation(transactionHash); - const actions = [ - { - account: config.eos.teleportContract, - name: 'received', - authorization: [ - { - actor: config.eos.oracleAccount, - permission: config.eos.oraclePermission || 'active', - }, - ], - data: eosioData, - }, - ]; - - try { - const eos_res = await SingleRun({ - actions, - eos_endpoint: config.eos.endpoints[0], - submit_to_blockchain, - private_keys: [{ pk: config.eos.privateKey }], - }); - console.log(`Sent notification of teleport with txid ${eos_res.transaction_id}`); - } catch (e: any) { - if (e.message.indexOf('Oracle has already approved') > -1) { - console.log('Oracle has already approved'); - } else { - console.error(`Error sending teleport ${e.message}`); - } + /** + * Get object of the data of an "claimed"-event on eth chain + * @param data "claimed"-event data + * @param config Contains information of precision and symbol of the token as well as the oracle name of this contract + * @returns + */ + static extractEthClaimedData (data: ethers.utils.Result, config: EthDataConfig): eosio_claim_data { + console.log('data[0]',data[0]) + + const id = data[0].toNumber() // TODO: .toBigInt() + const to_eth = data[1].replace('0x', '') + '000000000000000000000000' + const quantity = (data[2].toNumber() / Math.pow(10, config.precision)).toFixed(config.precision) + ' ' + config.symbol + return { oracle_name: config.eos.oracleAccount, id, to_eth, quantity, } } - { - //if (res.length) { - // for (let r = 0; r < res.length; r++) { - // const data = ethers.utils.defaultAbiCoder.decode( - // ['string', 'uint', 'uint'], - // res[r].data - // ); - // console.log(res[r], data, data[1].toString()) - // const tokens = data[1].toNumber(); - // if (tokens <= 0) { - // // console.error(data); - // console.error('Tokens are less than or equal to 0'); - // continue; - // } - // const to = data[0]; - // const chain_id = data[2].toNumber(); - // const amount = (tokens / Math.pow(10, config.precision)).toFixed( - // config.precision - // ); - // const quantity = `${amount} ${config.symbol}`; - // const txid = res[r].transactionHash.replace(/^0x/, ''); - // const actions: EosioAction[] = []; - // actions.push({ - // account: config.eos.teleportContract, - // name: 'received', - // authorization: [ - // { - // actor: config.eos.oracleAccount, - // permission: config.eos.oraclePermission || 'active', - // }, - // ], - // data: { - // oracle_name: config.eos.oracleAccount, - // to, - // ref: txid, - // quantity, - // chain_id, - // confirmed: true, - // }, - // }); - // // console.log(actions); - // await_confirmation(res[r].transactionHash).then(async () => { - // try { - // const eos_res = await eos_api.transact( - // { actions }, - // { - // blocksBehind: 3, - // expireSeconds: 180, - // } - // ); - // console.log( - // `Sent notification of teleport with txid ${eos_res.transaction_id}` - // ); - // // resolve(); - // } catch (e) { - // if (e.message.indexOf('Oracle has already approved') > -1) { - // console.log('Oracle has already approved'); - // } else { - // console.error(`Error sending teleport ${e.message}`); - // // reject(e); - // } - // } - // }); + + /** + * Get object of the data of an "teleport"-event on eth chain + * @param data "teleport"-event data + * @param config Contains information of precision and symbol of the token as well as the oracle name of this contract + * @returns + */ + static extractEthTeleportData(data: ethers.utils.Result, transactionHash: string, config: EthDataConfig): eosio_teleport_data { + const tokens = data[1].toNumber(); + if (tokens <= 0) { + throw new Error('Tokens are less than or equal to 0') + } + const to = data[0] + const chain_id = data[2].toNumber(); + const amount = (tokens / Math.pow(10, config.precision)).toFixed( + config.precision + ) + const quantity = `${amount} ${config.symbol}`; + const txid = transactionHash.replace(/^0x/, ''); + + return { chain_id, confirmed: true, quantity, to, oracle_name: config.eos.oracleAccount, ref: txid }; } - await Sleep(500); - } -}; - -const run = async (start_ref: 'latest' | number, submit_to_blockchain: boolean) => { - let from_block: number | undefined; - while (true) { - try { - const block = await provider.getBlock('latest'); - const latest_block = block.number; - - if (!from_block) { - if (start_ref === 'latest') { - try { - from_block = await load_block_number_from_file(); + async await_confirmation(txid: string) { + return new Promise(async (resolve) => { + let resolved = false; + while (!resolved) { + this.ethProvider.getTransactionReceipt(txid).then((receipt) => { + console.log(`Cofirmations ${receipt.confirmations}`) //- + + if (receipt && receipt.confirmations > this.DEFAULT_BLOCKS_TO_WAIT) { + console.log(`TX ${txid} has ${receipt.confirmations} confirmations`) + resolve(receipt); + resolved = true; + } + }) + await sleep(10000); + } + }) + } - // for fresh start go back 50 blocks - from_block -= 50; - console.log(`Starting from saved block with additional previous 50 blocks for safety: ${from_block}. `); - } catch (err) { - console.log(err); - // could not get block from file and it wasn't specified (go back 100 blocks from latest) - from_block = latest_block - 100; - } - } else if (typeof start_ref === 'number') { - from_block = start_ref; - } else { - from_block = config.eth.genesisBlock; + static async save_block_to_file(block_num: number, blocks_file: string){ + fs.writeFileSync(blocks_file, block_num.toString()) + }; + + /** + * Check for "claimed" events and store them on eosio chain + * @param from_block Block number to start looking for events + * @param to_block Block number to end looking for events + * @param trxBroadcast False if the transaction should not be broadcasted (not submitted to the block chain) + */ + async process_claimed(from_block: number, to_block: number, trxBroadcast: boolean = true) { + // Check claimed events on eth chain + const query = { + fromBlock: from_block, + toBlock: to_block, + address: this.config.eth.teleportContract, + topics: [this.claimed_topic], } - } - if(from_block < 0){ - from_block = 0 - } - - let to_block = Math.min(from_block + 100, latest_block); + const res = await this.ethProvider.getLogs(query); + + // Mark each claimed event on eosio chain as claimed + for await (const { transactionHash, data } of res) { + // Extract data from eth claimed event + const decodedData = ethers.utils.defaultAbiCoder.decode(['uint64', 'address', 'uint'], data); + const eosioData = EthOracle.extractEthClaimedData(decodedData, this.config); + console.log('claimed eosioData', eosioData); + + // Wait for confirmation of each transaction before continuing + await this.await_confirmation(transactionHash); + + // Create action + const actions = [{ + account: this.config.eos.teleportContract, + name: 'claimed', + authorization: [{ + actor: this.config.eos.oracleAccount, + permission: this.config.eos.oraclePermission || 'active', + }], + data: eosioData, + }] + + // Send transaction on eosio chain + try { + console.log(`Send claimed: ${this.config.eos.endpoints[0]} submit: ${trxBroadcast} pk: ${this.config.eos.privateKey}`, actions); //- + + const eos_res = await this.eos_api.getAPI().transact({ + actions + }, { + blocksBehind: 3, + expireSeconds: 30, + broadcast: trxBroadcast + }) as TransactResult + + console.log(`Sent notification of claim with txid ${eos_res.transaction_id}, for ID ${eosioData.id + }, account 0x${eosioData.to_eth.substring(0, 40)}, quantity ${eosioData.quantity}`) + + console.log('Claimed result', eos_res); //- + + } catch (e: any) { + // Check if the error appears because the transaction is already claimed + if (e.message.indexOf('Already marked as claimed') > -1) { + console.log(`ID ${eosioData.id} is already claimed, account 0x${eosioData.to_eth.substring(0, 40)}, quantity ${eosioData.quantity} ✔️`) + } else { + console.error(`Error sending confirm ${e.message} ❌`) + } + } + } + } - if (start_ref >= latest_block) { - console.log(`Up to date at block ${to_block}`); - await Sleep(10000); - } - console.log(`Getting events from block ${from_block} to ${to_block}`); + /** + * Check for "teleport" events and store them on eosio chain + * @param from_block Block number to start looking for events + * @param to_block Block number to end looking for events + * @param trxBroadcast False if the transaction should not be broadcasted (not submitted to the block chain) + */ + async process_teleported(from_block: number, to_block: number, trxBroadcast: boolean = true){ + // Check teleport events on eth chain + const query = { + fromBlock: from_block, + toBlock: to_block, + address: this.config.eth.teleportContract, + topics: [this.teleport_topic], + } + const res = await this.ethProvider.getLogs(query) + + // Confirm each teleport event on eosio chain + for await (const { transactionHash, data } of res) { + // Extract data from teleport eth event + const decodedData = ethers.utils.defaultAbiCoder.decode(['string', 'uint', 'uint'], data) + const eosioData = EthOracle.extractEthTeleportData(decodedData, transactionHash, this.config) + + // Wait for confirmation of each transaction before continuing + await this.await_confirmation(transactionHash); + const actions = [{ + account: this.config.eos.teleportContract, + name: 'received', + authorization: [{ + actor: this.config.eos.oracleAccount, + permission: this.config.eos.oraclePermission || 'active', + }], + data: eosioData, + }] + + // Send transaction on eosio chain + try { + const eos_res = await this.eos_api.getAPI().transact({ + actions + }, { + blocksBehind: 3, + expireSeconds: 30, + broadcast: trxBroadcast + }) as TransactResult + + console.log(`Sent notification of teleport with txid ${eos_res.transaction_id}`); + } catch (e: any) { + if (e.message.indexOf('Oracle has already approved') > -1) { + console.log('Oracle has already approved ✔️') + } else { + console.error(`Error sending teleport ${e.message} ❌`) + } + } + await sleep(500); + } + } - await process_claimed(from_block, to_block, submit_to_blockchain); - await process_teleported(from_block, to_block, submit_to_blockchain); + /** + * Loads a block number from a saved file if one exists or throws an error. + * @returns a saved block number from a file + */ + static async load_block_number_from_file(blocks_file: string) { + // let block_number: string | number = 'latest'; + if (!fs.existsSync(blocks_file)) + throw new Error('block file does not exist.') - from_block = to_block; + const file_contents = fs.readFileSync(blocks_file).toString() + if (!file_contents) throw new Error('No blocks file') - // save last block received - await save_block_to_file(to_block); + const block_number = parseInt(file_contents) + if (isNaN(block_number)) throw new Error('No block number in file.') - if (latest_block - from_block <= 1000) { - console.log('Waiting...'); - await Sleep(30000); - } else { - console.log(`Not waiting... ${latest_block} - ${from_block}`); - } - } catch (e: any) { - console.error(e.message); + return block_number; } - } -}; - -(async () => { - let startRef: 'latest' | number = 'latest'; - let { start_block, submit_to_blockchain } = await yargs(process.argv) - .option('start_block', { - alias: 's', - desc: 'start block to start scanning from', - number: true, - demandOption: false, + /** + * Run the process of checking the eth chain for teleports and claims and store the state on ethe eosio chain + * @param start_ref Block number to start from. String 'latest' to start from the latest block in block number file + * @param trxBroadcast False if transactions should not be broadcasted (not submitted to the block chain) + */ + async run(start_ref: 'latest' | number, trxBroadcast: boolean = true){ + let from_block: number | undefined; + this.running = true + try{ + while (this.running) { + try { + const block = await this.ethProvider.getBlock('latest'); + const latest_block = block.number; + + if (!from_block) { + if (start_ref === 'latest') { + try { + from_block = await EthOracle.load_block_number_from_file(this.blocks_file_name); + from_block -= 50; // for fresh start go back 50 blocks + console.log(`Starting from saved block with additional previous 50 blocks for safety: ${from_block}.`); + } catch (err) { + console.log('Could not get block from file and it was not specified ❌'); + from_block = latest_block - 100 // go back 100 blocks from latest + } + } else if (typeof start_ref === 'number') { + from_block = start_ref; + } else { + from_block = this.config.eth.genesisBlock; + } + } + if(from_block < 0){ + from_block = 0 + } + + let to_block = Math.min(from_block + 100, latest_block) + + if (start_ref >= latest_block) { + console.log(`Up to date at block ${to_block}`) + await sleep(10000); + } + console.log(`Getting events from block ${from_block} to ${to_block}`) + + await this.process_claimed(from_block, to_block, trxBroadcast) + await this.process_teleported(from_block, to_block, trxBroadcast) + + from_block = to_block; + + // Save last block received + await EthOracle.save_block_to_file(to_block, this.blocks_file_name) + + if (latest_block - from_block <= 1000) { + console.log('Waiting...'); + await sleep(30000); + } else { + console.log(`Not waiting... ${latest_block} - ${from_block}`) + } + } catch (e: any) { + console.error('⚡️ ' + e.message) + + console.error('Try again in 5 seconds') + await sleep(5000) + } + } + } catch (e){ + console.error('⚡️ ' + e); + } + console.log('Thread closed 💀') + } +} + +// Handle params from console +const argv = yargs + .version().alias('version', 'v') + // .option('id', { + // alias: 'n', + // description: 'Teleport id to start from', + // type: 'number' + // }) + // .option('amount', { + // alias: 'a', + // description: 'Amount of handled teleports per requests', + // type: 'number' + // }) + .option('block', { + alias: 'b', + description: 'Block number to start scanning from', + type: 'number' }) - .option('submit_to_blockchain', { - alias: 'b', - boolean: true, - description: - 'boolean to determine if it should submit actions to Wax blockchain', - default: false, - demandOption: false, - }).argv; - - if (start_block) { - startRef = start_block; - } else if (process.env['START_BLOCK']) { - const start_block_env = parseInt(process.env['START_BLOCK']); - if (isNaN(start_block_env)) { - console.error(`You must supply start block as an integer in env`); - process.exit(1); + // .option('signs', { + // alias: 's', + // description: 'Amount of signatures until this oracle will sign too', + // type: 'number' + // }) + .option('config', { + alias: 'c', + description: 'Path of config file', + type: 'string' + }) + .option('broadcast', { + alias: 'o', + type: 'boolean', + description: 'boolean to determine if transactions should be submitted to blockchain', + default: true, + }) + .help().alias('help', 'h').argv as { + // id: number, + block: number, + // signs: number, + config: string, + broadcast: boolean, + }; + +// Load config and set title +const config_path = argv.config || process.env['CONFIG'] || './config' +process.title = `oracle-eth ${config_path}` +const configFile : ConfigType = require(config_path) + +// Check and set start parameters +let startRef: 'latest' | number = 'latest' +if(argv.block) { + startRef = argv.block; +} else if(process.env['START_BLOCK']) { + const start_block_env = parseInt(process.env['START_BLOCK']) + if(isNaN(start_block_env)) { + console.error(`You must supply start block as an integer in env`) + process.exit(1); } startRef = start_block_env; - } - - run(startRef, submit_to_blockchain); -})().catch((e) => { - console.error('error: ', e); -}); \ No newline at end of file +} +if(configFile.eos.epVerifications > configFile.eos.endpoints.length){ + console.error('Error: epVerifications cannot be greater than given amount of endpints') + process.exit(1) +} +const eosSigProvider = new JsSignatureProvider([configFile.eos.privateKey]) +const ethProvider = new ethers.providers.StaticJsonRpcProvider(configFile.eth.endpoint) + +// Set up the oracle +const ethOracle = new EthOracle(configFile, ethProvider, eosSigProvider) + +// Run the process +ethOracle.run(startRef, argv.broadcast) \ No newline at end of file diff --git a/oracle/package.json b/oracle/package.json index 1d5920c..cbcf2dc 100644 --- a/oracle/package.json +++ b/oracle/package.json @@ -17,7 +17,7 @@ "eosio-helpers": "^0.1.4", "eosjs": "^22.0.0", "ethereumjs-util": "^7.0.4", - "ethers": "^5.3.1", + "ethers": "^5.6.2", "node-fetch": "^3.2.3", "text-encoding": "^0.7.0", "web3": "^1.2.11", diff --git a/oracle/yarn.lock b/oracle/yarn.lock index 9778181..e4bcfe8 100644 --- a/oracle/yarn.lock +++ b/oracle/yarn.lock @@ -1287,7 +1287,7 @@ ethereumjs-util@*, ethereumjs-util@^7.0.10, ethereumjs-util@^7.0.4, ethereumjs-u ethereum-cryptography "^0.1.3" rlp "^2.2.4" -ethers@^5.3.1: +ethers@^5.6.2: version "5.6.2" resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.6.2.tgz#e75bac7f038c5e0fdde667dba62fc223924143a2" integrity sha512-EzGCbns24/Yluu7+ToWnMca3SXJ1Jk1BvWB7CCmVNxyOeM4LLvw2OLuIHhlkhQk1dtOcj9UMsdkxUh8RiG1dxQ== From 9087d8aeea7e347600c93ee2310d99e1d97ca07c Mon Sep 17 00:00:00 2001 From: Kevin Kei Tuncer Date: Tue, 12 Apr 2022 20:23:58 +0200 Subject: [PATCH 06/24] Skip removed events on blockchain Start from genesis block if no file is defined Check weeding of wrong endpoints Retry of failed event requests Verify events by other endpoints --- .../contracts/teleport/teleporteos.hpp | 8 +- oracle/CommonTypes.ts | 10 +- ...ndpointSwitcher.js => EndpointSwitcher.js} | 119 +++- oracle/EndpointSwitcher.ts | 197 +++++++ oracle/eosEndpointSwitcher.ts | 104 ---- oracle/oracle-eos.js | 20 +- oracle/oracle-eos.ts | 48 +- oracle/oracle-eth.js | 525 +++++++++++------- oracle/oracle-eth.ts | 385 ++++++++----- oracle/package.json | 9 +- oracle/yarn.lock | 403 ++++++-------- 11 files changed, 1124 insertions(+), 704 deletions(-) rename oracle/{eosEndpointSwitcher.js => EndpointSwitcher.js} (62%) create mode 100644 oracle/EndpointSwitcher.ts delete mode 100644 oracle/eosEndpointSwitcher.ts diff --git a/contracts/teleporteos/contracts/teleport/teleporteos.hpp b/contracts/teleporteos/contracts/teleport/teleporteos.hpp index 7848cd6..7078246 100644 --- a/contracts/teleporteos/contracts/teleport/teleporteos.hpp +++ b/contracts/teleporteos/contracts/teleport/teleporteos.hpp @@ -7,7 +7,7 @@ using namespace eosio; using namespace std; #define ORACLE_CONFIRMATIONS 3 -#define TOKEN_CONTRACT_STR "alien.worlds" +#define TOKEN_CONTRACT_STR "exampletoken" #define TOKEN_CONTRACT name(TOKEN_CONTRACT_STR) namespace alienworlds { @@ -76,10 +76,8 @@ class [[eosio::contract("teleporteos")]] teleporteos : public contract { }; typedef multi_index< "receipts"_n, receipt_item, - indexed_by<"byref"_n, const_mem_fun>, - indexed_by<"byto"_n, - const_mem_fun>> + indexed_by<"byref"_n, const_mem_fun>, + indexed_by<"byto"_n, const_mem_fun>> receipts_table; deposits_table _deposits; diff --git a/oracle/CommonTypes.ts b/oracle/CommonTypes.ts index 7c5cb09..982f136 100644 --- a/oracle/CommonTypes.ts +++ b/oracle/CommonTypes.ts @@ -7,7 +7,7 @@ export interface ConfigType { network: string, // wsEndpoint: string, chainId: string, - endpoint: string, + endpoint?: string, endpoints: Array, teleportContract: string, oracleAccount: string, @@ -19,12 +19,14 @@ export interface ConfigType { eth: { network: string, // wsEndpoint: string, - chainId: string, - endpoint: string, + chainId: number, + endpoint?: string, + endpoints: Array, teleportContract: string, oracleAccount: string, privateKey: string, - genesisBlock: number + genesisBlock: number, + epVerifications: number } } diff --git a/oracle/eosEndpointSwitcher.js b/oracle/EndpointSwitcher.js similarity index 62% rename from oracle/eosEndpointSwitcher.js rename to oracle/EndpointSwitcher.js index 3dedc0e..db63bc5 100644 --- a/oracle/eosEndpointSwitcher.js +++ b/oracle/EndpointSwitcher.js @@ -50,9 +50,10 @@ var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); -exports.EosApi = void 0; +exports.EthApi = exports.EosApi = void 0; var eosjs_1 = require("eosjs"); var cross_fetch_1 = __importDefault(require("cross-fetch")); +var ethers_1 = require("ethers"); var EosApi = /** @class */ (function () { function EosApi(chainId, endpointList, signatureProvider, timeout) { if (timeout === void 0) { timeout = 10000; } @@ -67,7 +68,7 @@ var EosApi = /** @class */ (function () { this.lastInfo = null; this.gotRightInfo = []; if (endpointList.length <= 0) { - throw ('No list of entpoints defined'); + throw ('No list of eosio entpoints defined'); } this.gotRightInfo = Array(endpointList.length).fill(false); this.endpointList = endpointList.map(function (ep) { @@ -102,6 +103,10 @@ var EosApi = /** @class */ (function () { // console.log('Use new endpoint', this.endpoint); return [2 /*return*/]; } + else { + i--; + return [3 /*break*/, 4]; + } return [3 /*break*/, 4]; case 3: // console.log('Use next endpoint', this.endpoint); @@ -175,3 +180,113 @@ var EosApi = /** @class */ (function () { return EosApi; }()); exports.EosApi = EosApi; +var EthApi = /** @class */ (function () { + function EthApi(chainId, endpointList, timeout) { + if (timeout === void 0) { timeout = 10000; } + this.chainId = chainId; + this.timeout = timeout; + this.epId = -1; + this.providers = []; + this.endpointList = []; + this.endpoint = this.endpointList[0]; + this.lastInfo = null; + this.gotRightInfo = []; + if (endpointList.length <= 0) { + throw ('No list of eth entpoints defined'); + } + this.gotRightInfo = Array(endpointList.length).fill(false); + this.endpointList = endpointList.map(function (ep) { + var lastIndex = ep.length - 1; + return ep[lastIndex] == '/' ? ep.substring(0, lastIndex) : ep; + }); + } + EthApi.prototype.getEndpoint = function () { + return this.endpoint; + }; + EthApi.prototype.getProvider = function () { + return this.providers[this.epId]; + }; + EthApi.prototype.checkInfo = function () { + return __awaiter(this, void 0, void 0, function () { + var _a, e_1; + return __generator(this, function (_b) { + switch (_b.label) { + case 0: + _b.trys.push([0, 2, , 3]); + _a = this; + return [4 /*yield*/, this.providers[this.epId].getNetwork()]; + case 1: + _a.lastInfo = _b.sent(); + if (this.lastInfo.chainId != this.chainId) { + console.log('Delete endpoint because it uses another eosio chain', this.endpoint); + this.endpointList.splice(this.epId, 1); + this.gotRightInfo.splice(this.epId, 1); + this.providers.splice(this.epId, 1); + this.epId--; + return [2 /*return*/, false]; + } + return [3 /*break*/, 3]; + case 2: + e_1 = _b.sent(); + console.log('Can not connect to endpoint'); + return [2 /*return*/, false]; + case 3: return [2 /*return*/, true]; + } + }); + }); + }; + /** + * Set the next endpoint for RPC and API + */ + EthApi.prototype.nextEndpoint = function () { + return __awaiter(this, void 0, void 0, function () { + var i; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + i = 0; + _a.label = 1; + case 1: + if (!(i < this.endpointList.length)) return [3 /*break*/, 5]; + // set next endpoint url + this.epId++; + if (this.epId >= this.endpointList.length) { + this.epId = 0; + } + this.endpoint = this.endpointList[this.epId]; + // Create new provider if it is undefined + if (!this.providers[this.epId]) { + this.providers[this.epId] = new ethers_1.ethers.providers.StaticJsonRpcProvider(this.endpoint); + } + if (!!this.gotRightInfo[this.epId]) return [3 /*break*/, 3]; + return [4 /*yield*/, this.checkInfo()]; + case 2: + if (_a.sent()) { + this.gotRightInfo[this.epId] = true; + return [2 /*return*/]; + } + else { + i--; + return [3 /*break*/, 4]; + } + return [3 /*break*/, 4]; + case 3: + console.log('Use next endpoint', this.endpoint); //- + return [2 /*return*/]; + case 4: + i++; + return [3 /*break*/, 1]; + case 5: throw ('No usable endpoints.'); + } + }); + }); + }; + EthApi.prototype.get_lastInfo = function () { + return this.lastInfo; + }; + EthApi.prototype.get_EndpointAmount = function () { + return this.endpointList.length; + }; + return EthApi; +}()); +exports.EthApi = EthApi; diff --git a/oracle/EndpointSwitcher.ts b/oracle/EndpointSwitcher.ts new file mode 100644 index 0000000..02a95b9 --- /dev/null +++ b/oracle/EndpointSwitcher.ts @@ -0,0 +1,197 @@ +import { Api, JsonRpc } from "eosjs"; +import { SignatureProvider } from "eosjs/dist/eosjs-api-interfaces"; +import { GetInfoResult } from 'eosjs/dist/eosjs-rpc-interfaces'; +import fetch from "cross-fetch"; +import { ethers } from "ethers"; + +export class EosApi { + + private api: Api | null = null + private epId = -1 + private rpc : JsonRpc | null = null + private endpointList: Array = [] + private endpoint: string = this.endpointList[0] + private lastInfo: GetInfoResult | null = null + private gotRightInfo: Array = [] + + constructor(private chainId: string, endpointList: Array, private signatureProvider: SignatureProvider, private timeout = 10000){ + if(endpointList.length <= 0){ + throw('No list of eosio entpoints defined') + } + this.gotRightInfo = Array(endpointList.length).fill(false) + this.endpointList = endpointList.map(ep => { + const lastIndex = ep.length - 1 + return ep[lastIndex] == '/' ? ep.substring(0, lastIndex) : ep + }) + } + + /** + * Set the next endpoint for RPC and API + */ + async nextEndpoint(){ + for(let i = 0; i < this.endpointList.length; i++){ + this.epId++; + if(this.epId >= this.endpointList.length){ + this.epId = 0 + } + this.endpoint = this.endpointList[this.epId] + + this.getAPI() + if(!this.gotRightInfo[this.epId]){ + if(await this.checkInfo()){ + this.gotRightInfo[this.epId] = true + // console.log('Use new endpoint', this.endpoint); + return + } else { + i-- + continue + } + } else { + // console.log('Use next endpoint', this.endpoint); + return + } + } + throw('No usable endpoints.') + } + + getEndpoint(){ + return this.endpoint + } + + private async checkInfo() { + try{ + this.lastInfo = await this.getRPC().get_info(); + if(this.lastInfo.chain_id != this.chainId){ + console.log('Delete endpoint because it uses another eosio chain', this.endpoint) + this.endpointList.splice(this.epId, 1) + this.gotRightInfo.splice(this.epId, 1) + this.epId-- + return false + } + } catch { + console.log('Can not connect to endpoint', this.endpoint) + return false + } + return true + } + + getRPC(){ + if(this.rpc && this.rpc.endpoint == this.getEndpoint()) { + return this.rpc + } else { + this.rpc = new JsonRpc(this.getEndpoint(), {fetch: (ep: string, options) =>{ + return fetch(ep, { + ...options, + timeout: this.timeout + }) + }}); + return this.rpc + } + } + + getAPI(){ + if(this.api) { + return this.api + } else { + this.api = new Api({ rpc: this.getRPC(), signatureProvider: this.signatureProvider, textDecoder: new TextDecoder(), textEncoder: new TextEncoder() }); + return this.api + } + } + + get_lastInfo(){ + return this.lastInfo; + } + + get_EndpointAmount(){ + return this.endpointList.length + } +} + +export class EthApi{ + private epId = -1 + private providers : Array = [] + private endpointList: Array = [] + private endpoint = this.endpointList[0] + private lastInfo: ethers.providers.Network | null = null + private gotRightInfo: Array = [] + + constructor(private chainId: number, endpointList: Array, private timeout = 10000){ + if(endpointList.length <= 0){ + throw('No list of eth entpoints defined') + } + this.gotRightInfo = Array(endpointList.length).fill(false) + this.endpointList = endpointList.map(ep => { + const lastIndex = ep.length - 1 + return ep[lastIndex] == '/' ? ep.substring(0, lastIndex) : ep + }) + } + + getEndpoint(){ + return this.endpoint + } + + getProvider(){ + return this.providers[this.epId] + } + + private async checkInfo() { + try{ + this.lastInfo = await this.providers[this.epId].getNetwork() + + if(this.lastInfo.chainId != this.chainId){ + console.log('Delete endpoint because it uses another eosio chain', this.endpoint) + this.endpointList.splice(this.epId, 1) + this.gotRightInfo.splice(this.epId, 1) + this.providers.splice(this.epId, 1) + this.epId-- + return false + } + } catch (e) { + console.log('Can not connect to endpoint') + return false + } + return true + } + + /** + * Set the next endpoint for RPC and API + */ + async nextEndpoint(){ + for(let i = 0; i < this.endpointList.length; i++){ + // set next endpoint url + this.epId++; + if(this.epId >= this.endpointList.length){ + this.epId = 0 + } + this.endpoint = this.endpointList[this.epId] + + // Create new provider if it is undefined + if(!this.providers[this.epId]){ + this.providers[this.epId] = new ethers.providers.StaticJsonRpcProvider(this.endpoint) + } + + // Check info of the rovider if it was never checked before + if(!this.gotRightInfo[this.epId]){ + if(await this.checkInfo()){ + this.gotRightInfo[this.epId] = true + return + } else { + i-- + continue + } + } else { + console.log('Use next endpoint', this.endpoint) //- + return + } + } + throw('No usable endpoints.') + } + + get_lastInfo(){ + return this.lastInfo; + } + + get_EndpointAmount(){ + return this.endpointList.length + } +} \ No newline at end of file diff --git a/oracle/eosEndpointSwitcher.ts b/oracle/eosEndpointSwitcher.ts deleted file mode 100644 index 936ea11..0000000 --- a/oracle/eosEndpointSwitcher.ts +++ /dev/null @@ -1,104 +0,0 @@ -import { Api, JsonRpc } from "eosjs"; -import { SignatureProvider } from "eosjs/dist/eosjs-api-interfaces"; -import { GetInfoResult } from 'eosjs/dist/eosjs-rpc-interfaces'; -import fetch from "cross-fetch"; - -export class EosApi{ - - constructor(private chainId: string, endpointList: Array, private signatureProvider: SignatureProvider, private timeout = 10000){ - if(endpointList.length <= 0){ - throw('No list of entpoints defined') - } - this.gotRightInfo = Array(endpointList.length).fill(false) - this.endpointList = endpointList.map(ep => { - const lastIndex = ep.length - 1 - return ep[lastIndex] == '/' ? ep.substring(0, lastIndex) : ep - }) - } - - private api: Api | null = null - private epId = -1 - private rpc : JsonRpc | null = null - private endpointList: Array = [] - private endpoint: string = this.endpointList[0] - private lastInfo: GetInfoResult | null = null - private gotRightInfo: Array = [] - - /** - * Set the next endpoint for RPC and API - */ - async nextEndpoint(){ - for(let i = 0; i < this.endpointList.length; i++){ - this.epId++; - if(this.epId >= this.endpointList.length){ - this.epId = 0 - } - this.endpoint = this.endpointList[this.epId] - - this.getAPI() - if(!this.gotRightInfo[this.epId]){ - if(await this.checkInfo()){ - this.gotRightInfo[this.epId] = true - // console.log('Use new endpoint', this.endpoint); - return - } - } else { - // console.log('Use next endpoint', this.endpoint); - return - } - } - throw('No usable endpoints.') - } - - getEndpoint(){ - return this.endpoint - } - - private async checkInfo() { - try{ - this.lastInfo = await this.getRPC().get_info(); - if(this.lastInfo.chain_id != this.chainId){ - console.log('Delete endpoint because it uses another eosio chain', this.endpoint) - this.endpointList.splice(this.epId, 1) - this.gotRightInfo.splice(this.epId, 1) - this.epId-- - return false - } - } catch { - console.log('Can not connect to endpoint', this.endpoint) - return false - } - return true - } - - getRPC(){ - if(this.rpc && this.rpc.endpoint == this.getEndpoint()) { - return this.rpc - } else { - this.rpc = new JsonRpc(this.getEndpoint(), {fetch: (ep: string, options) =>{ - return fetch(ep, { - ...options, - timeout: this.timeout - }) - }}); - return this.rpc - } - } - - getAPI(){ - if(this.api) { - return this.api - } else { - this.api = new Api({ rpc: this.getRPC(), signatureProvider: this.signatureProvider, textDecoder: new TextDecoder(), textEncoder: new TextEncoder() }); - return this.api - } - } - - get_lastInfo(){ - return this.lastInfo; - } - - get_EndpointAmount(){ - return this.endpointList.length - } -} \ No newline at end of file diff --git a/oracle/oracle-eos.js b/oracle/oracle-eos.js index 262c4cf..e537a93 100755 --- a/oracle/oracle-eos.js +++ b/oracle/oracle-eos.js @@ -43,7 +43,7 @@ var eosjs_1 = require("eosjs"); var eosjs_jssig_1 = require("eosjs/dist/eosjs-jssig"); var text_encoding_1 = require("text-encoding"); var ethereumjs_util_1 = require("ethereumjs-util"); -var eosEndpointSwitcher_1 = require("./eosEndpointSwitcher"); +var EndpointSwitcher_1 = require("./EndpointSwitcher"); var yargs_1 = __importDefault(require("yargs")); /** * Convert an Uint8Array to an hex in string format @@ -80,13 +80,13 @@ var sleep = function (ms) { return __awaiter(void 0, void 0, void 0, function () // * @returns True or false // */ // function arraysEqual(a: Uint8Array, b: Uint8Array) { -// if (a === b) return true; -// if (a == null || b == null) return false; -// if (a.length !== b.length) return false; +// if (a === b) return true +// if (a == null || b == null) return false +// if (a.length !== b.length) return false // for (var i = 0; i < a.length; ++i) { -// if (a[i] !== b[i]) return false; +// if (a[i] !== b[i]) return false // } -// return true; +// return true // } var EosOracle = /** @class */ (function () { function EosOracle(config, signatureProvider) { @@ -94,7 +94,7 @@ var EosOracle = /** @class */ (function () { this.signatureProvider = signatureProvider; this.running = false; this.irreversible_time = 0; - this.eos_api = new eosEndpointSwitcher_1.EosApi(this.config.eos.chainId, this.config.eos.endpoints, this.signatureProvider); + this.eos_api = new EndpointSwitcher_1.EosApi(this.config.eos.chainId, this.config.eos.endpoints, this.signatureProvider); } // static async tryHard(tries: number, action : (tryNumber?: number) => Promise, onCatch: (e?: any, tryNumber?: number) => boolean | undefined) { // let tryI = 0 @@ -241,7 +241,7 @@ var EosOracle = /** @class */ (function () { }; // async function validateEntryByOtherEndpoints(id: number, logdata: Uint8Array, dataSize: number){ // if(config.eos.epVerifications > eos_api.get_EndpointAmount()){ - // console.error('Not enough endpoints to verify data'); + // console.error('Not enough endpoints to verify data') // process.exit(1) // } // const lastEndpoint = eos_api.getEndpoint() @@ -255,7 +255,7 @@ var EosOracle = /** @class */ (function () { // if(!arraysEqual(logdata, veriData)){ // throw('Verification failed by' + eos_api.getEndpoint()) // } - // console.log(`Teleport id ${id} verified ${i + 1} times`); + // console.log(`Teleport id ${id} verified ${i + 1} times`) // } // } /** @@ -459,7 +459,7 @@ var EosOracle = /** @class */ (function () { console.error("Verification failed by ".concat(this.eos_api.getEndpoint(), ". \u26A0\uFE0F")); isVerifyed = false; } - // console.log(`Teleport id ${item.id}, verified ${i + 1} times`); + // console.log(`Teleport id ${item.id}, verified ${i + 1} times`) } // Check time if (item.time > this.irreversible_time) { diff --git a/oracle/oracle-eos.ts b/oracle/oracle-eos.ts index 76f1b48..af59f2b 100644 --- a/oracle/oracle-eos.ts +++ b/oracle/oracle-eos.ts @@ -3,7 +3,7 @@ import { GetTableRowsResult } from 'eosjs/dist/eosjs-rpc-interfaces' import { JsSignatureProvider } from "eosjs/dist/eosjs-jssig" import { TextDecoder, TextEncoder } from "text-encoding" import { ecsign, keccak, toRpcSig } from "ethereumjs-util" -import { EosApi } from './eosEndpointSwitcher' +import { EosApi } from './EndpointSwitcher' import { ConfigType, TeleportTableEntry } from './CommonTypes' import yargs from 'yargs' @@ -32,9 +32,9 @@ function fromHexString(hexString: string){ */ const sleep = async (ms: number) => { return new Promise((resolve) => { - setTimeout(resolve, ms); - }); -}; + setTimeout(resolve, ms) + }) +} // /** // * Check if two Uint8Arrays are equal @@ -43,14 +43,14 @@ const sleep = async (ms: number) => { // * @returns True or false // */ // function arraysEqual(a: Uint8Array, b: Uint8Array) { -// if (a === b) return true; -// if (a == null || b == null) return false; -// if (a.length !== b.length) return false; +// if (a === b) return true +// if (a == null || b == null) return false +// if (a.length !== b.length) return false // for (var i = 0; i < a.length; ++i) { -// if (a[i] !== b[i]) return false; +// if (a[i] !== b[i]) return false // } -// return true; +// return true // } class EosOracle{ @@ -105,9 +105,9 @@ class EosOracle{ }, { blocksBehind: 3, expireSeconds: 30, - }); + }) } catch (e) { - console.error(`\nCaught exception: ${e} \n`); + console.error(`\nCaught exception: ${e} \n`) let retry = true if (e instanceof RpcError){ if('code' in e.json){ @@ -154,7 +154,7 @@ class EosOracle{ table: 'teleports', lower_bound, limit - }); + }) } catch(e){ console.log(e) await this.eos_api.nextEndpoint() @@ -166,12 +166,12 @@ class EosOracle{ } } while(!gotTeleport) - return teleport_res as GetTableRowsResult; + return teleport_res as GetTableRowsResult } // async function validateEntryByOtherEndpoints(id: number, logdata: Uint8Array, dataSize: number){ // if(config.eos.epVerifications > eos_api.get_EndpointAmount()){ - // console.error('Not enough endpoints to verify data'); + // console.error('Not enough endpoints to verify data') // process.exit(1) // } // const lastEndpoint = eos_api.getEndpoint() @@ -185,7 +185,7 @@ class EosOracle{ // if(!arraysEqual(logdata, veriData)){ // throw('Verification failed by' + eos_api.getEndpoint()) // } - // console.log(`Teleport id ${id} verified ${i + 1} times`); + // console.log(`Teleport id ${id} verified ${i + 1} times`) // } // } @@ -200,7 +200,7 @@ class EosOracle{ const sb = new Serialize.SerialBuffer({ textEncoder: new TextEncoder, textDecoder: new TextDecoder - }); + }) sb.pushNumberAsUint64(teleport.id) // TODO: use bigint sb.pushUint32(teleport.time) sb.pushName(teleport.account) @@ -219,8 +219,8 @@ class EosOracle{ // Sha3 of the serilized values. Note: The same result is one parameter for the claim function on the eth chain const logDataKeccak = keccak(Buffer.from(logData)) - // console.log('logData', Buffer.from(logData).toString('hex')); - // console.log('logDataKeccak', logDataKeccak.toString('hex')); + // console.log('logData', Buffer.from(logData).toString('hex')) + // console.log('logDataKeccak', logDataKeccak.toString('hex')) // Sign the sha3 hash const ethPriKey = Buffer.from(privateKey, "hex") @@ -311,7 +311,7 @@ class EosOracle{ } verifications++ } catch(e) { - console.log('⚡️ ' + e); + console.log('⚡️ ' + e) // Get next endpoint and check if all endpoints are already checked this.eos_api.nextEndpoint() if(epStart == this.eos_api.getEndpoint()){ @@ -373,14 +373,14 @@ class EosOracle{ console.error(`Verification failed by ${this.eos_api.getEndpoint()}. ⚠️`) isVerifyed = false } - // console.log(`Teleport id ${item.id}, verified ${i + 1} times`); + // console.log(`Teleport id ${item.id}, verified ${i + 1} times`) } // Check time if(item.time > this.irreversible_time){ waitForIrr = item.time - this.irreversible_time lastHandledId = item.id - break; + break } if(!isVerifyed){ @@ -449,7 +449,7 @@ class EosOracle{ await EosOracle.WaitWithAnimation(EosOracle.maxWait, 'All available teleports signed') } } catch (e){ - console.error('⚡️ ' + e); + console.error('⚡️ ' + e) } console.log('Thread closed 💀') } @@ -483,7 +483,7 @@ const argv = yargs amount: number, signs: number, config: string - }; + } // Load config and set title const config_path = argv.config || process.env['CONFIG'] || './config' @@ -495,4 +495,4 @@ const signatureProvider = new JsSignatureProvider([configFile.eos.privateKey]) const eosOracle = new EosOracle(configFile, signatureProvider) // Run the process -eosOracle.run(argv.id, argv.amount); \ No newline at end of file +eosOracle.run(argv.id, argv.amount) \ No newline at end of file diff --git a/oracle/oracle-eth.js b/oracle/oracle-eth.js index bcf22b9..e48ae5e 100755 --- a/oracle/oracle-eth.js +++ b/oracle/oracle-eth.js @@ -56,7 +56,7 @@ var fs_1 = __importDefault(require("fs")); var ethers_1 = require("ethers"); var yargs_1 = __importDefault(require("yargs")); var eosjs_jssig_1 = require("eosjs/dist/eosjs-jssig"); -var eosEndpointSwitcher_1 = require("./eosEndpointSwitcher"); +var EndpointSwitcher_1 = require("./EndpointSwitcher"); /** * Use this function with await to let the thread sleep for the defined amount of time * @param ms Milliseconds @@ -69,16 +69,18 @@ var sleep = function (ms) { return __awaiter(void 0, void 0, void 0, function () }); }); }; var EthOracle = /** @class */ (function () { - function EthOracle(config, ethProvider, signatureProvider) { + function EthOracle(config, signatureProvider) { this.config = config; - this.ethProvider = ethProvider; this.signatureProvider = signatureProvider; this.running = false; this.claimed_topic = '0xf20fc6923b8057dd0c3b606483fcaa038229bb36ebc35a0040e3eaa39cf97b17'; this.teleport_topic = '0x622824274e0937ee319b036740cd0887131781bc2032b47eac3e88a1be17f5d5'; - this.DEFAULT_BLOCKS_TO_WAIT = 1; //- 5 + this.DEFAULT_BLOCKS_TO_WAIT = 5; + this.minTrySend = 3; this.blocks_file_name = ".oracle_".concat(configFile.eth.network, "_block-").concat(configFile.eth.oracleAccount); - this.eos_api = new eosEndpointSwitcher_1.EosApi(this.config.eos.chainId, this.config.eos.endpoints, this.signatureProvider); + this.eos_api = new EndpointSwitcher_1.EosApi(this.config.eos.chainId, this.config.eos.endpoints, this.signatureProvider); + this.eth_api = new EndpointSwitcher_1.EthApi(this.config.eth.chainId, this.config.eth.endpoints); + this.minTrySend = Math.max(this.minTrySend, config.eos.endpoints.length); } /** * Get object of the data of an "claimed"-event on eth chain @@ -87,7 +89,6 @@ var EthOracle = /** @class */ (function () { * @returns */ EthOracle.extractEthClaimedData = function (data, config) { - console.log('data[0]', data[0]); var id = data[0].toNumber(); // TODO: .toBigInt() var to_eth = data[1].replace('0x', '') + '000000000000000000000000'; var quantity = (data[2].toNumber() / Math.pow(10, config.precision)).toFixed(config.precision) + ' ' + config.symbol; @@ -111,36 +112,81 @@ var EthOracle = /** @class */ (function () { var txid = transactionHash.replace(/^0x/, ''); return { chain_id: chain_id, confirmed: true, quantity: quantity, to: to, oracle_name: config.eos.oracleAccount, ref: txid }; }; - EthOracle.prototype.await_confirmation = function (txid) { + /** + * Wait until an event got enough confirmations and validations by other endpoints + * @param entry.transactionHash Hash of the transaction which contains the event + * @param entry.data Event data in raw format + * @returns False if there are not enough endpoints which validate the event + */ + EthOracle.prototype.await_confirmation = function (entry) { return __awaiter(this, void 0, void 0, function () { - var _this = this; + var validators, firstEp, receipt, overConfs, ep, e_1; return __generator(this, function (_a) { - return [2 /*return*/, new Promise(function (resolve) { return __awaiter(_this, void 0, void 0, function () { - var resolved; - var _this = this; - return __generator(this, function (_a) { - switch (_a.label) { - case 0: - resolved = false; - _a.label = 1; - case 1: - if (!!resolved) return [3 /*break*/, 3]; - this.ethProvider.getTransactionReceipt(txid).then(function (receipt) { - console.log("Cofirmations ".concat(receipt.confirmations)); //- - if (receipt && receipt.confirmations > _this.DEFAULT_BLOCKS_TO_WAIT) { - console.log("TX ".concat(txid, " has ").concat(receipt.confirmations, " confirmations")); - resolve(receipt); - resolved = true; - } - }); - return [4 /*yield*/, sleep(10000)]; - case 2: - _a.sent(); - return [3 /*break*/, 1]; - case 3: return [2 /*return*/]; - } - }); - }); })]; + switch (_a.label) { + case 0: + validators = new Set(); + if (this.eth_api.get_EndpointAmount() < this.config.eth.epVerifications) { + throw Error('Not enough eth endpoints for validation ❌'); + } + firstEp = undefined; + _a.label = 1; + case 1: + if (!true) return [3 /*break*/, 14]; + _a.label = 2; + case 2: + _a.trys.push([2, 10, , 12]); + return [4 /*yield*/, this.eth_api.getProvider().getTransactionReceipt(entry.transactionHash)]; + case 3: + receipt = _a.sent(); + if (!receipt) return [3 /*break*/, 7]; + overConfs = receipt.confirmations - this.DEFAULT_BLOCKS_TO_WAIT; + if (!(overConfs > 0)) return [3 /*break*/, 6]; + ep = this.eth_api.getEndpoint(); + validators.add(ep); + if (receipt.logs.find(function (e) { return e.data == entry.data; }) == undefined) { + console.log("Event data of ".concat(entry.transactionHash, " was not found by ").concat(ep, " \u274C")); + return [2 /*return*/, false]; + } + console.log("Cofirmations ".concat(receipt.confirmations, " by ").concat(ep)); + if (validators.size >= this.config.eth.epVerifications) { + console.log("TX ".concat(entry.transactionHash, " has ").concat(receipt.confirmations, " confirmations")); + return [2 /*return*/, true]; + } + if (!(overConfs > 1)) return [3 /*break*/, 4]; + if (firstEp == undefined) { + firstEp = ep; + } + else if (firstEp == ep) { + console.error("Verification failed, only ".concat(validators.size, " eth endpoints verified the transaction ").concat(entry.transactionHash, " \u274C")); + return [2 /*return*/, false]; + } + return [3 /*break*/, 6]; + case 4: + // Sleep one second to check other endpoints if the confirmation amount is just reached + return [4 /*yield*/, sleep(1000)]; + case 5: + // Sleep one second to check other endpoints if the confirmation amount is just reached + _a.sent(); + _a.label = 6; + case 6: return [3 /*break*/, 9]; + case 7: return [4 /*yield*/, sleep(10000)]; + case 8: + _a.sent(); + _a.label = 9; + case 9: return [3 /*break*/, 12]; + case 10: + e_1 = _a.sent(); + console.error('Error on get transaction receipt', e_1); + return [4 /*yield*/, sleep(1000)]; + case 11: + _a.sent(); + return [3 /*break*/, 12]; + case 12: return [4 /*yield*/, this.eth_api.nextEndpoint()]; + case 13: + _a.sent(); + return [3 /*break*/, 1]; + case 14: return [2 /*return*/]; + } }); }); }; @@ -152,7 +198,6 @@ var EthOracle = /** @class */ (function () { }); }); }; - ; /** * Check for "claimed" events and store them on eosio chain * @param from_block Block number to start looking for events @@ -160,12 +205,12 @@ var EthOracle = /** @class */ (function () { * @param trxBroadcast False if the transaction should not be broadcasted (not submitted to the block chain) */ EthOracle.prototype.process_claimed = function (from_block, to_block, trxBroadcast) { - var e_1, _a; + var e_2, _a; if (trxBroadcast === void 0) { trxBroadcast = true; } return __awaiter(this, void 0, void 0, function () { - var query, res, res_1, res_1_1, _b, transactionHash, data, decodedData, eosioData, actions, eos_res, e_2, e_1_1; - return __generator(this, function (_c) { - switch (_c.label) { + var query, res, res_1, res_1_1, entry, decodedData, eosioData, actions, eos_res, e_2_1; + return __generator(this, function (_b) { + switch (_b.label) { case 0: query = { fromBlock: from_block, @@ -173,26 +218,34 @@ var EthOracle = /** @class */ (function () { address: this.config.eth.teleportContract, topics: [this.claimed_topic], }; - return [4 /*yield*/, this.ethProvider.getLogs(query)]; + return [4 /*yield*/, this.eth_api.getProvider().getLogs(query) + // Mark each claimed event on eosio chain as claimed + ]; case 1: - res = _c.sent(); - _c.label = 2; + res = _b.sent(); + _b.label = 2; case 2: - _c.trys.push([2, 11, 12, 17]); + _b.trys.push([2, 9, 10, 15]); res_1 = __asyncValues(res); - _c.label = 3; + _b.label = 3; case 3: return [4 /*yield*/, res_1.next()]; case 4: - if (!(res_1_1 = _c.sent(), !res_1_1.done)) return [3 /*break*/, 10]; - _b = res_1_1.value, transactionHash = _b.transactionHash, data = _b.data; - decodedData = ethers_1.ethers.utils.defaultAbiCoder.decode(['uint64', 'address', 'uint'], data); + if (!(res_1_1 = _b.sent(), !res_1_1.done)) return [3 /*break*/, 8]; + entry = res_1_1.value; + decodedData = ethers_1.ethers.utils.defaultAbiCoder.decode(['uint64', 'address', 'uint'], entry.data); eosioData = EthOracle.extractEthClaimedData(decodedData, this.config); - console.log('claimed eosioData', eosioData); - // Wait for confirmation of each transaction before continuing - return [4 /*yield*/, this.await_confirmation(transactionHash)]; + return [4 /*yield*/, this.await_confirmation(entry)]; case 5: // Wait for confirmation of each transaction before continuing - _c.sent(); + if (!(_b.sent())) { + console.log("Skip claimed event with ".concat(eosioData.to_eth, " as recipient and the id ").concat(eosioData.id)); + return [3 /*break*/, 7]; + } + // Continue this event if it was marked as removed + if (entry.removed) { + console.log("Claimed event with trx hash ".concat(entry.transactionHash, " got removed and will be skipped \u274C")); + return [3 /*break*/, 7]; + } actions = [{ account: this.config.eos.teleportContract, name: 'claimed', @@ -202,51 +255,88 @@ var EthOracle = /** @class */ (function () { }], data: eosioData, }]; - _c.label = 6; + return [4 /*yield*/, this.sendTransaction(actions, trxBroadcast)]; case 6: - _c.trys.push([6, 8, , 9]); - console.log("Send claimed: ".concat(this.config.eos.endpoints[0], " submit: ").concat(trxBroadcast, " pk: ").concat(this.config.eos.privateKey), actions); //- - return [4 /*yield*/, this.eos_api.getAPI().transact({ - actions: actions - }, { - blocksBehind: 3, - expireSeconds: 30, - broadcast: trxBroadcast - })]; - case 7: - eos_res = _c.sent(); - console.log("Sent notification of claim with txid ".concat(eos_res.transaction_id, ", for ID ").concat(eosioData.id, ", account 0x").concat(eosioData.to_eth.substring(0, 40), ", quantity ").concat(eosioData.quantity)); - console.log('Claimed result', eos_res); //- - return [3 /*break*/, 9]; - case 8: - e_2 = _c.sent(); - // Check if the error appears because the transaction is already claimed - if (e_2.message.indexOf('Already marked as claimed') > -1) { - console.log("ID ".concat(eosioData.id, " is already claimed, account 0x").concat(eosioData.to_eth.substring(0, 40), ", quantity ").concat(eosioData.quantity, " \u2714\uFE0F")); + eos_res = _b.sent(); + if (eos_res === false) { + console.log("Skip sending claimed of id ".concat(eosioData.id, " to the eosio chain \u274C")); + } + else if (eos_res === true) { + console.log("Id ".concat(eosioData.id, " is already claimed, account 0x").concat(eosioData.to_eth.substring(0, 40), ", quantity ").concat(eosioData.quantity, " \u2714\uFE0F")); } else { - console.error("Error sending confirm ".concat(e_2.message, " \u274C")); + console.log("Send claimed of id ".concat(eosioData.id, ", account 0x").concat(eosioData.to_eth.substring(0, 40), ", quantity ").concat(eosioData.quantity, ". EOSIO blocknumber ").concat(eos_res.processed.block_num, " and trx id ").concat(eos_res.transaction_id, " \u2714\uFE0F")); } - return [3 /*break*/, 9]; - case 9: return [3 /*break*/, 3]; - case 10: return [3 /*break*/, 17]; - case 11: - e_1_1 = _c.sent(); - e_1 = { error: e_1_1 }; - return [3 /*break*/, 17]; - case 12: - _c.trys.push([12, , 15, 16]); - if (!(res_1_1 && !res_1_1.done && (_a = res_1.return))) return [3 /*break*/, 14]; + _b.label = 7; + case 7: return [3 /*break*/, 3]; + case 8: return [3 /*break*/, 15]; + case 9: + e_2_1 = _b.sent(); + e_2 = { error: e_2_1 }; + return [3 /*break*/, 15]; + case 10: + _b.trys.push([10, , 13, 14]); + if (!(res_1_1 && !res_1_1.done && (_a = res_1.return))) return [3 /*break*/, 12]; return [4 /*yield*/, _a.call(res_1)]; + case 11: + _b.sent(); + _b.label = 12; + case 12: return [3 /*break*/, 14]; case 13: - _c.sent(); - _c.label = 14; - case 14: return [3 /*break*/, 16]; - case 15: - if (e_1) throw e_1.error; + if (e_2) throw e_2.error; return [7 /*endfinally*/]; - case 16: return [7 /*endfinally*/]; - case 17: return [2 /*return*/]; + case 14: return [7 /*endfinally*/]; + case 15: return [2 /*return*/]; + } + }); + }); + }; + /** + * Send transaction to EOSIO chain + * @param actions EOSIO transaction actions + * @param trxBroadcast Boolean to broadcast a transaction + * @returns False if it fails, true if a transaction was already marked as claimed or the object of the transaction result + */ + EthOracle.prototype.sendTransaction = function (actions, trxBroadcast) { + if (trxBroadcast === void 0) { trxBroadcast = true; } + return __awaiter(this, void 0, void 0, function () { + var tries, eos_res, e_3; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + tries = 0; + _a.label = 1; + case 1: + if (!(tries < this.minTrySend)) return [3 /*break*/, 10]; + _a.label = 2; + case 2: + _a.trys.push([2, 4, , 9]); + return [4 /*yield*/, this.eos_api.getAPI().transact({ actions: actions }, { + blocksBehind: 3, + expireSeconds: 30, + broadcast: trxBroadcast + })]; + case 3: + eos_res = _a.sent(); + return [2 /*return*/, eos_res]; + case 4: + e_3 = _a.sent(); + if (!(e_3.message.indexOf('Already marked as claimed') > -1 || e_3.message.indexOf('Oracle has already approved') > -1)) return [3 /*break*/, 5]; + return [2 /*return*/, true]; + case 5: + console.error("Error while sending to eosio chain with ".concat(this.eos_api, ": ").concat(e_3.message, " \u274C")); + return [4 /*yield*/, this.eos_api.nextEndpoint()]; + case 6: + _a.sent(); + return [4 /*yield*/, sleep(1000)]; + case 7: + _a.sent(); + _a.label = 8; + case 8: return [3 /*break*/, 9]; + case 9: + tries++; + return [3 /*break*/, 1]; + case 10: return [2 /*return*/, false]; } }); }); @@ -258,12 +348,12 @@ var EthOracle = /** @class */ (function () { * @param trxBroadcast False if the transaction should not be broadcasted (not submitted to the block chain) */ EthOracle.prototype.process_teleported = function (from_block, to_block, trxBroadcast) { - var e_3, _a; + var e_4, _a; if (trxBroadcast === void 0) { trxBroadcast = true; } return __awaiter(this, void 0, void 0, function () { - var query, res, res_2, res_2_1, _b, transactionHash, data, decodedData, eosioData, actions, eos_res, e_4, e_3_1; - return __generator(this, function (_c) { - switch (_c.label) { + var query, res, res_2, res_2_1, entry, decodedData, eosioData, actions, eos_res, e_4_1; + return __generator(this, function (_b) { + switch (_b.label) { case 0: query = { fromBlock: from_block, @@ -271,27 +361,34 @@ var EthOracle = /** @class */ (function () { address: this.config.eth.teleportContract, topics: [this.teleport_topic], }; - return [4 /*yield*/, this.ethProvider.getLogs(query) + return [4 /*yield*/, this.eth_api.getProvider().getLogs(query) // Confirm each teleport event on eosio chain ]; case 1: - res = _c.sent(); - _c.label = 2; + res = _b.sent(); + _b.label = 2; case 2: - _c.trys.push([2, 13, 14, 19]); + _b.trys.push([2, 9, 10, 15]); res_2 = __asyncValues(res); - _c.label = 3; + _b.label = 3; case 3: return [4 /*yield*/, res_2.next()]; case 4: - if (!(res_2_1 = _c.sent(), !res_2_1.done)) return [3 /*break*/, 12]; - _b = res_2_1.value, transactionHash = _b.transactionHash, data = _b.data; - decodedData = ethers_1.ethers.utils.defaultAbiCoder.decode(['string', 'uint', 'uint'], data); - eosioData = EthOracle.extractEthTeleportData(decodedData, transactionHash, this.config); - // Wait for confirmation of each transaction before continuing - return [4 /*yield*/, this.await_confirmation(transactionHash)]; + if (!(res_2_1 = _b.sent(), !res_2_1.done)) return [3 /*break*/, 8]; + entry = res_2_1.value; + decodedData = ethers_1.ethers.utils.defaultAbiCoder.decode(['string', 'uint', 'uint'], entry.data); + eosioData = EthOracle.extractEthTeleportData(decodedData, entry.transactionHash, this.config); + return [4 /*yield*/, this.await_confirmation(entry)]; case 5: // Wait for confirmation of each transaction before continuing - _c.sent(); + if (!(_b.sent())) { + console.log("Skip teleport event with ".concat(eosioData.to, " as recipient and ref of ").concat(eosioData.ref)); + return [3 /*break*/, 7]; + } + // Continue this event if it was marked as removed + if (entry.removed) { + console.log("Teleport with trx hash ".concat(entry.transactionHash, " got removed and will be skipped \u274C")); + return [3 /*break*/, 7]; + } actions = [{ account: this.config.eos.teleportContract, name: 'received', @@ -301,52 +398,38 @@ var EthOracle = /** @class */ (function () { }], data: eosioData, }]; - _c.label = 6; + return [4 /*yield*/, this.sendTransaction(actions, trxBroadcast)]; case 6: - _c.trys.push([6, 8, , 9]); - return [4 /*yield*/, this.eos_api.getAPI().transact({ - actions: actions - }, { - blocksBehind: 3, - expireSeconds: 30, - broadcast: trxBroadcast - })]; - case 7: - eos_res = _c.sent(); - console.log("Sent notification of teleport with txid ".concat(eos_res.transaction_id)); - return [3 /*break*/, 9]; - case 8: - e_4 = _c.sent(); - if (e_4.message.indexOf('Oracle has already approved') > -1) { - console.log('Oracle has already approved ✔️'); + eos_res = _b.sent(); + if (eos_res === false) { + console.log("Skip sending teleport to ".concat(eosioData.to, " with ref ").concat(eosioData.ref, " and quantity of ").concat(eosioData.quantity, " \u274C")); + } + else if (eos_res === true) { + console.log("Oracle has already approved teleport to ".concat(eosioData.to, " with ref ").concat(eosioData.ref, " and quantity of ").concat(eosioData.quantity, " \u2714\uFE0F")); } else { - console.error("Error sending teleport ".concat(e_4.message, " \u274C")); + console.log("Send teleport to ".concat(eosioData.to, " with ref ").concat(eosioData.ref, " and quantity of ").concat(eosioData.quantity, ". EOSIO blocknumber ").concat(eos_res.processed.block_num, " and trx id ").concat(eos_res.transaction_id, " \u2714\uFE0F")); } - return [3 /*break*/, 9]; - case 9: return [4 /*yield*/, sleep(500)]; + _b.label = 7; + case 7: return [3 /*break*/, 3]; + case 8: return [3 /*break*/, 15]; + case 9: + e_4_1 = _b.sent(); + e_4 = { error: e_4_1 }; + return [3 /*break*/, 15]; case 10: - _c.sent(); - _c.label = 11; - case 11: return [3 /*break*/, 3]; - case 12: return [3 /*break*/, 19]; - case 13: - e_3_1 = _c.sent(); - e_3 = { error: e_3_1 }; - return [3 /*break*/, 19]; - case 14: - _c.trys.push([14, , 17, 18]); - if (!(res_2_1 && !res_2_1.done && (_a = res_2.return))) return [3 /*break*/, 16]; + _b.trys.push([10, , 13, 14]); + if (!(res_2_1 && !res_2_1.done && (_a = res_2.return))) return [3 /*break*/, 12]; return [4 /*yield*/, _a.call(res_2)]; - case 15: - _c.sent(); - _c.label = 16; - case 16: return [3 /*break*/, 18]; - case 17: - if (e_3) throw e_3.error; + case 11: + _b.sent(); + _b.label = 12; + case 12: return [3 /*break*/, 14]; + case 13: + if (e_4) throw e_4.error; return [7 /*endfinally*/]; - case 18: return [7 /*endfinally*/]; - case 19: return [2 /*return*/]; + case 14: return [7 /*endfinally*/]; + case 15: return [2 /*return*/]; } }); }); @@ -359,7 +442,7 @@ var EthOracle = /** @class */ (function () { return __awaiter(this, void 0, void 0, function () { var file_contents, block_number; return __generator(this, function (_a) { - // let block_number: string | number = 'latest'; + // let block_number: string | number = 'latest' if (!fs_1.default.existsSync(blocks_file)) throw new Error('block file does not exist.'); file_contents = fs_1.default.readFileSync(blocks_file).toString(); @@ -372,6 +455,50 @@ var EthOracle = /** @class */ (function () { }); }); }; + /** + * Get latest block of eth blockchain + * @returns latest block number + */ + EthOracle.prototype.getLatestBlock = function () { + return __awaiter(this, void 0, void 0, function () { + var tries, block, e_5; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + tries = 0; + _a.label = 1; + case 1: + if (!true) return [3 /*break*/, 10]; + _a.label = 2; + case 2: + _a.trys.push([2, 4, , 9]); + return [4 /*yield*/, this.eth_api.getProvider().getBlock('latest')]; + case 3: + block = _a.sent(); + return [2 /*return*/, block.number]; + case 4: + e_5 = _a.sent(); + if (!(tries >= this.eth_api.get_EndpointAmount())) return [3 /*break*/, 5]; + console.log('Could not get latest block by any eth endpoint ❌'); + return [2 /*return*/, undefined]; + case 5: + console.error("Could not get latest block with ".concat(this.eth_api.getEndpoint(), " \u274C")); + return [4 /*yield*/, this.eth_api.nextEndpoint()]; + case 6: + _a.sent(); + console.log("Try ".concat(this.eth_api.getEndpoint(), " in a second...")); + tries++; + return [4 /*yield*/, sleep(1000)]; + case 7: + _a.sent(); + _a.label = 8; + case 8: return [3 /*break*/, 9]; + case 9: return [3 /*break*/, 1]; + case 10: return [2 /*return*/]; + } + }); + }); + }; /** * Run the process of checking the eth chain for teleports and claims and store the state on ethe eosio chain * @param start_ref Block number to start from. String 'latest' to start from the latest block in block number file @@ -380,24 +507,27 @@ var EthOracle = /** @class */ (function () { EthOracle.prototype.run = function (start_ref, trxBroadcast) { if (trxBroadcast === void 0) { trxBroadcast = true; } return __awaiter(this, void 0, void 0, function () { - var from_block, block, latest_block, err_1, to_block, e_5, e_6; + var from_block, latest_block, err_1, to_block, e_6; return __generator(this, function (_a) { switch (_a.label) { case 0: this.running = true; - _a.label = 1; + return [4 /*yield*/, this.eth_api.nextEndpoint()]; case 1: - _a.trys.push([1, 23, , 24]); + _a.sent(); _a.label = 2; case 2: - if (!this.running) return [3 /*break*/, 22]; + if (!this.running) return [3 /*break*/, 23]; _a.label = 3; case 3: _a.trys.push([3, 19, , 21]); - return [4 /*yield*/, this.ethProvider.getBlock('latest')]; + return [4 /*yield*/, this.getLatestBlock()]; case 4: - block = _a.sent(); - latest_block = block.number; + latest_block = _a.sent(); + if (typeof latest_block != 'number') { + console.error('Latest block number is not a number', latest_block); + return [2 /*return*/]; + } if (!!from_block) return [3 /*break*/, 10]; if (!(start_ref === 'latest')) return [3 /*break*/, 9]; _a.label = 5; @@ -412,7 +542,14 @@ var EthOracle = /** @class */ (function () { case 7: err_1 = _a.sent(); console.log('Could not get block from file and it was not specified ❌'); - from_block = latest_block - 100; // go back 100 blocks from latest + if (this.config.eth.genesisBlock) { + from_block = this.config.eth.genesisBlock; + console.log('Start by genesis block.'); + } + else { + from_block = latest_block - 100; // go back 100 blocks from latest + console.log('Start 100 blocks before the latest block.'); + } return [3 /*break*/, 8]; case 8: return [3 /*break*/, 10]; case 9: @@ -449,8 +586,7 @@ var EthOracle = /** @class */ (function () { // Save last block received _a.sent(); if (!(latest_block - from_block <= 1000)) return [3 /*break*/, 17]; - console.log('Waiting...'); - return [4 /*yield*/, sleep(30000)]; + return [4 /*yield*/, EthOracle.WaitWithAnimation(30, 'Wait for new blocks...')]; case 16: _a.sent(); return [3 /*break*/, 18]; @@ -459,21 +595,53 @@ var EthOracle = /** @class */ (function () { _a.label = 18; case 18: return [3 /*break*/, 21]; case 19: - e_5 = _a.sent(); - console.error('⚡️ ' + e_5.message); + e_6 = _a.sent(); + console.error('⚡️ ' + e_6.message); console.error('Try again in 5 seconds'); return [4 /*yield*/, sleep(5000)]; case 20: _a.sent(); return [3 /*break*/, 21]; - case 21: return [3 /*break*/, 2]; - case 22: return [3 /*break*/, 24]; - case 23: - e_6 = _a.sent(); - console.error('⚡️ ' + e_6); - return [3 /*break*/, 24]; - case 24: - console.log('Thread closed 💀'); + case 21: + // Select the next endpoint to distribute the requests + return [4 /*yield*/, this.eos_api.nextEndpoint()]; + case 22: + // Select the next endpoint to distribute the requests + _a.sent(); + return [3 /*break*/, 2]; + case 23: return [2 /*return*/]; + } + }); + }); + }; + /** + * Wait for a defined amount of time and show remaining seconds + * @param s Seconds to wait + */ + EthOracle.WaitWithAnimation = function (s, info) { + if (info === void 0) { info = ""; } + return __awaiter(this, void 0, void 0, function () { + var i; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + process.stdout.write(info + "\n\x1b[?25l"); + i = 0; + _a.label = 1; + case 1: + if (!(i < s)) return [3 /*break*/, 4]; + process.stdout.write("\uD83D\uDCA4 ".concat(i, " s / ").concat(s, " s \uD83D\uDCA4")); + return [4 /*yield*/, sleep(1000)]; + case 2: + _a.sent(); + process.stdout.write("\r\x1b[K"); + _a.label = 3; + case 3: + i++; + return [3 /*break*/, 1]; + case 4: + process.stdout.moveCursor(0, -1); // up one line + process.stdout.clearLine(1); // from cursor to end return [2 /*return*/]; } }); @@ -484,26 +652,10 @@ var EthOracle = /** @class */ (function () { // Handle params from console var argv = yargs_1.default .version().alias('version', 'v') - // .option('id', { - // alias: 'n', - // description: 'Teleport id to start from', - // type: 'number' - // }) - // .option('amount', { - // alias: 'a', - // description: 'Amount of handled teleports per requests', - // type: 'number' - // }) .option('block', { alias: 'b', description: 'Block number to start scanning from', - type: 'number' }) - // .option('signs', { - // alias: 's', - // description: 'Amount of signatures until this oracle will sign too', - // type: 'number' - // }) .option('config', { alias: 'c', description: 'Path of config file', @@ -522,24 +674,23 @@ process.title = "oracle-eth ".concat(config_path); var configFile = require(config_path); // Check and set start parameters var startRef = 'latest'; -if (argv.block) { +if (typeof argv.block == 'number' || argv.block == 'latest') { startRef = argv.block; } else if (process.env['START_BLOCK']) { var start_block_env = parseInt(process.env['START_BLOCK']); if (isNaN(start_block_env)) { - console.error("You must supply start block as an integer in env"); + console.error('You must supply start block as an integer in env'); process.exit(1); } startRef = start_block_env; } if (configFile.eos.epVerifications > configFile.eos.endpoints.length) { - console.error('Error: epVerifications cannot be greater than given amount of endpints'); + console.error('Error: epVerifications cannot be greater than given amount of endpoints'); process.exit(1); } -var eosSigProvider = new eosjs_jssig_1.JsSignatureProvider([configFile.eos.privateKey]); -var ethProvider = new ethers_1.ethers.providers.StaticJsonRpcProvider(configFile.eth.endpoint); // Set up the oracle -var ethOracle = new EthOracle(configFile, ethProvider, eosSigProvider); +var eosSigProvider = new eosjs_jssig_1.JsSignatureProvider([configFile.eos.privateKey]); +var ethOracle = new EthOracle(configFile, eosSigProvider); // Run the process ethOracle.run(startRef, argv.broadcast); diff --git a/oracle/oracle-eth.ts b/oracle/oracle-eth.ts index 16c328b..5d1092f 100755 --- a/oracle/oracle-eth.ts +++ b/oracle/oracle-eth.ts @@ -11,7 +11,7 @@ import { ethers } from 'ethers' import yargs from 'yargs' import { ConfigType, eosio_claim_data, eosio_teleport_data } from './CommonTypes' import { JsSignatureProvider } from 'eosjs/dist/eosjs-jssig' -import { EosApi } from './eosEndpointSwitcher' +import { EosApi, EthApi } from './EndpointSwitcher' import { TransactResult } from 'eosjs/dist/eosjs-api-interfaces' type EthDataConfig = {precision: number, symbol: string, eos:{oracleAccount: string}} @@ -22,21 +22,25 @@ type EthDataConfig = {precision: number, symbol: string, eos:{oracleAccount: str */ const sleep = async (ms: number) => { return new Promise((resolve) => { - setTimeout(resolve, ms); - }); -}; + setTimeout(resolve, ms) + }) +} class EthOracle { public running = false private claimed_topic = '0xf20fc6923b8057dd0c3b606483fcaa038229bb36ebc35a0040e3eaa39cf97b17' private teleport_topic = '0x622824274e0937ee319b036740cd0887131781bc2032b47eac3e88a1be17f5d5' - private DEFAULT_BLOCKS_TO_WAIT = 1 //- 5 + private DEFAULT_BLOCKS_TO_WAIT = 5 private blocks_file_name : string private eos_api: EosApi + private eth_api: EthApi + private minTrySend = 3 - constructor(private config: ConfigType, private ethProvider: ethers.providers.StaticJsonRpcProvider, private signatureProvider: JsSignatureProvider){ + constructor(private config: ConfigType, private signatureProvider: JsSignatureProvider){ this.blocks_file_name = `.oracle_${configFile.eth.network}_block-${configFile.eth.oracleAccount}` this.eos_api = new EosApi(this.config.eos.chainId, this.config.eos.endpoints, this.signatureProvider) + this.eth_api = new EthApi(this.config.eth.chainId, this.config.eth.endpoints) + this.minTrySend = Math.max(this.minTrySend, config.eos.endpoints.length) } /** @@ -46,8 +50,6 @@ class EthOracle { * @returns */ static extractEthClaimedData (data: ethers.utils.Result, config: EthDataConfig): eosio_claim_data { - console.log('data[0]',data[0]) - const id = data[0].toNumber() // TODO: .toBigInt() const to_eth = data[1].replace('0x', '') + '000000000000000000000000' const quantity = (data[2].toNumber() / Math.pow(10, config.precision)).toFixed(config.precision) + ' ' + config.symbol @@ -61,42 +63,84 @@ class EthOracle { * @returns */ static extractEthTeleportData(data: ethers.utils.Result, transactionHash: string, config: EthDataConfig): eosio_teleport_data { - const tokens = data[1].toNumber(); + const tokens = data[1].toNumber() if (tokens <= 0) { throw new Error('Tokens are less than or equal to 0') } const to = data[0] - const chain_id = data[2].toNumber(); + const chain_id = data[2].toNumber() const amount = (tokens / Math.pow(10, config.precision)).toFixed( config.precision ) - const quantity = `${amount} ${config.symbol}`; - const txid = transactionHash.replace(/^0x/, ''); + const quantity = `${amount} ${config.symbol}` + const txid = transactionHash.replace(/^0x/, '') - return { chain_id, confirmed: true, quantity, to, oracle_name: config.eos.oracleAccount, ref: txid }; + return { chain_id, confirmed: true, quantity, to, oracle_name: config.eos.oracleAccount, ref: txid } } - async await_confirmation(txid: string) { - return new Promise(async (resolve) => { - let resolved = false; - while (!resolved) { - this.ethProvider.getTransactionReceipt(txid).then((receipt) => { - console.log(`Cofirmations ${receipt.confirmations}`) //- - - if (receipt && receipt.confirmations > this.DEFAULT_BLOCKS_TO_WAIT) { - console.log(`TX ${txid} has ${receipt.confirmations} confirmations`) - resolve(receipt); - resolved = true; + /** + * Wait until an event got enough confirmations and validations by other endpoints + * @param entry.transactionHash Hash of the transaction which contains the event + * @param entry.data Event data in raw format + * @returns False if there are not enough endpoints which validate the event + */ + async await_confirmation(entry:{ transactionHash: string, data: string}) { + let validators = new Set() + if(this.eth_api.get_EndpointAmount() < this.config.eth.epVerifications){ + throw Error('Not enough eth endpoints for validation ❌') + } + + let firstEp = undefined + while (true) { + try{ + const receipt = await this.eth_api.getProvider().getTransactionReceipt(entry.transactionHash) + + if(receipt){ + const overConfs = receipt.confirmations - this.DEFAULT_BLOCKS_TO_WAIT + if (overConfs > 0) { + let ep = this.eth_api.getEndpoint() + validators.add(ep) + + if(receipt.logs.find(e=>{ return e.data == entry.data}) == undefined){ + console.log(`Event data of ${entry.transactionHash} was not found by ${ep} ❌`) + return false + } + + console.log(`Cofirmations ${receipt.confirmations} by ${ep}`) + + if(validators.size >= this.config.eth.epVerifications){ + console.log(`TX ${entry.transactionHash} has ${receipt.confirmations} confirmations`) + return true + } + + // If one endpoint reaches one more confirmations as needed, check each endpoint again and thow an error if they still not confirm + if(overConfs > 1){ + if(firstEp == undefined){ + firstEp = ep + } else if(firstEp == ep){ + console.error(`Verification failed, only ${validators.size} eth endpoints verified the transaction ${entry.transactionHash} ❌`); + return false + } + // Do not sleep to check all other endpoints after reaching one more confirmation than needed + } else { + // Sleep one second to check other endpoints if the confirmation amount is just reached + await sleep(1000) + } } - }) - await sleep(10000); + } else { + await sleep(10000) + } + } catch (e) { + console.error('Error on get transaction receipt', e); + await sleep(1000) } - }) + await this.eth_api.nextEndpoint() + } } static async save_block_to_file(block_num: number, blocks_file: string){ fs.writeFileSync(blocks_file, block_num.toString()) - }; + } /** * Check for "claimed" events and store them on eosio chain @@ -112,17 +156,25 @@ class EthOracle { address: this.config.eth.teleportContract, topics: [this.claimed_topic], } - const res = await this.ethProvider.getLogs(query); + const res = await this.eth_api.getProvider().getLogs(query) // Mark each claimed event on eosio chain as claimed - for await (const { transactionHash, data } of res) { + for await (const entry of res) { // Extract data from eth claimed event - const decodedData = ethers.utils.defaultAbiCoder.decode(['uint64', 'address', 'uint'], data); - const eosioData = EthOracle.extractEthClaimedData(decodedData, this.config); - console.log('claimed eosioData', eosioData); - + const decodedData = ethers.utils.defaultAbiCoder.decode(['uint64', 'address', 'uint'], entry.data) + const eosioData = EthOracle.extractEthClaimedData(decodedData, this.config) + // Wait for confirmation of each transaction before continuing - await this.await_confirmation(transactionHash); + if(!await this.await_confirmation(entry)){ + console.log(`Skip claimed event with ${eosioData.to_eth} as recipient and the id ${eosioData.id}`) + continue + } + + // Continue this event if it was marked as removed + if(entry.removed){ + console.log(`Claimed event with trx hash ${entry.transactionHash} got removed and will be skipped ❌`) + continue + } // Create action const actions = [{ @@ -136,31 +188,45 @@ class EthOracle { }] // Send transaction on eosio chain + const eos_res = await this.sendTransaction(actions, trxBroadcast) + if(eos_res === false){ + console.log(`Skip sending claimed of id ${eosioData.id} to the eosio chain ❌`) + } else if(eos_res === true){ + console.log(`Id ${eosioData.id} is already claimed, account 0x${eosioData.to_eth.substring(0, 40)}, quantity ${eosioData.quantity} ✔️`) + } else { + console.log(`Send claimed of id ${eosioData.id}, account 0x${eosioData.to_eth.substring(0, 40)}, quantity ${eosioData.quantity + }. EOSIO blocknumber ${eos_res.processed.block_num} and trx id ${eos_res.transaction_id} ✔️`); + } + } + } + + /** + * Send transaction to EOSIO chain + * @param actions EOSIO transaction actions + * @param trxBroadcast Boolean to broadcast a transaction + * @returns False if it fails, true if a transaction was already marked as claimed or the object of the transaction result + */ + async sendTransaction(actions: any, trxBroadcast: boolean = true){ + for(let tries = 0; tries < this.minTrySend; tries++){ try { - console.log(`Send claimed: ${this.config.eos.endpoints[0]} submit: ${trxBroadcast} pk: ${this.config.eos.privateKey}`, actions); //- - - const eos_res = await this.eos_api.getAPI().transact({ - actions - }, { - blocksBehind: 3, - expireSeconds: 30, - broadcast: trxBroadcast - }) as TransactResult - - console.log(`Sent notification of claim with txid ${eos_res.transaction_id}, for ID ${eosioData.id - }, account 0x${eosioData.to_eth.substring(0, 40)}, quantity ${eosioData.quantity}`) - - console.log('Claimed result', eos_res); //- - + const eos_res = await this.eos_api.getAPI().transact({ actions }, { + blocksBehind: 3, + expireSeconds: 30, + broadcast: trxBroadcast + }) as TransactResult + return eos_res } catch (e: any) { - // Check if the error appears because the transaction is already claimed - if (e.message.indexOf('Already marked as claimed') > -1) { - console.log(`ID ${eosioData.id} is already claimed, account 0x${eosioData.to_eth.substring(0, 40)}, quantity ${eosioData.quantity} ✔️`) + // Check if the error appears because the transaction is already claimed or approved + if (e.message.indexOf('Already marked as claimed') > -1 || e.message.indexOf('Oracle has already approved') > -1) { + return true } else { - console.error(`Error sending confirm ${e.message} ❌`) + console.error(`Error while sending to eosio chain with ${this.eos_api}: ${e.message} ❌`) + await this.eos_api.nextEndpoint() + await sleep(1000) } } } + return false } /** @@ -177,16 +243,27 @@ class EthOracle { address: this.config.eth.teleportContract, topics: [this.teleport_topic], } - const res = await this.ethProvider.getLogs(query) + const res = await this.eth_api.getProvider().getLogs(query) // Confirm each teleport event on eosio chain - for await (const { transactionHash, data } of res) { + for await (const entry of res) { // Extract data from teleport eth event - const decodedData = ethers.utils.defaultAbiCoder.decode(['string', 'uint', 'uint'], data) - const eosioData = EthOracle.extractEthTeleportData(decodedData, transactionHash, this.config) + const decodedData = ethers.utils.defaultAbiCoder.decode(['string', 'uint', 'uint'], entry.data) + const eosioData = EthOracle.extractEthTeleportData(decodedData, entry.transactionHash, this.config) // Wait for confirmation of each transaction before continuing - await this.await_confirmation(transactionHash); + if(!await this.await_confirmation(entry)){ + console.log(`Skip teleport event with ${eosioData.to} as recipient and ref of ${eosioData.ref}`) + continue + } + + // Continue this event if it was marked as removed + if(entry.removed){ + console.log(`Teleport with trx hash ${entry.transactionHash} got removed and will be skipped ❌`) + continue + } + + // Create action const actions = [{ account: this.config.eos.teleportContract, name: 'received', @@ -198,24 +275,15 @@ class EthOracle { }] // Send transaction on eosio chain - try { - const eos_res = await this.eos_api.getAPI().transact({ - actions - }, { - blocksBehind: 3, - expireSeconds: 30, - broadcast: trxBroadcast - }) as TransactResult - - console.log(`Sent notification of teleport with txid ${eos_res.transaction_id}`); - } catch (e: any) { - if (e.message.indexOf('Oracle has already approved') > -1) { - console.log('Oracle has already approved ✔️') - } else { - console.error(`Error sending teleport ${e.message} ❌`) - } + const eos_res = await this.sendTransaction(actions, trxBroadcast) + if(eos_res === false){ + console.log(`Skip sending teleport to ${eosioData.to} with ref ${eosioData.ref} and quantity of ${eosioData.quantity} ❌`) + } else if(eos_res === true){ + console.log(`Oracle has already approved teleport to ${eosioData.to} with ref ${eosioData.ref} and quantity of ${eosioData.quantity} ✔️`) + } else { + console.log(`Send teleport to ${eosioData.to} with ref ${eosioData.ref} and quantity of ${eosioData.quantity + }. EOSIO blocknumber ${eos_res.processed.block_num} and trx id ${eos_res.transaction_id} ✔️`); } - await sleep(500); } } @@ -224,7 +292,7 @@ class EthOracle { * @returns a saved block number from a file */ static async load_block_number_from_file(blocks_file: string) { - // let block_number: string | number = 'latest'; + // let block_number: string | number = 'latest' if (!fs.existsSync(blocks_file)) throw new Error('block file does not exist.') @@ -234,7 +302,32 @@ class EthOracle { const block_number = parseInt(file_contents) if (isNaN(block_number)) throw new Error('No block number in file.') - return block_number; + return block_number + } + + /** + * Get latest block of eth blockchain + * @returns latest block number + */ + private async getLatestBlock() { + let tries = 0 + while(true) { + try{ + const block = await this.eth_api.getProvider().getBlock('latest') + return block.number + } catch(e){ + if(tries >= this.eth_api.get_EndpointAmount()){ + console.log('Could not get latest block by any eth endpoint ❌') + return undefined + } else { + console.error(`Could not get latest block with ${this.eth_api.getEndpoint()} ❌`) + await this.eth_api.nextEndpoint() + console.log(`Try ${this.eth_api.getEndpoint()} in a second...`) + tries++ + await sleep(1000) + } + } + } } /** @@ -243,29 +336,41 @@ class EthOracle { * @param trxBroadcast False if transactions should not be broadcasted (not submitted to the block chain) */ async run(start_ref: 'latest' | number, trxBroadcast: boolean = true){ - let from_block: number | undefined; - this.running = true - try{ - while (this.running) { - try { - const block = await this.ethProvider.getBlock('latest'); - const latest_block = block.number; + let from_block: number | undefined + this.running = true + await this.eth_api.nextEndpoint() + while (this.running) { + try { + // Get latest block from chain + const latest_block = await this.getLatestBlock() + if(typeof latest_block != 'number'){ + console.error('Latest block number is not a number', latest_block) + return + } + + // Get block number to start from if (!from_block) { - if (start_ref === 'latest') { - try { - from_block = await EthOracle.load_block_number_from_file(this.blocks_file_name); - from_block -= 50; // for fresh start go back 50 blocks - console.log(`Starting from saved block with additional previous 50 blocks for safety: ${from_block}.`); - } catch (err) { - console.log('Could not get block from file and it was not specified ❌'); - from_block = latest_block - 100 // go back 100 blocks from latest + if (start_ref === 'latest') { + try { + from_block = await EthOracle.load_block_number_from_file(this.blocks_file_name) + from_block -= 50 // for fresh start go back 50 blocks + console.log(`Starting from saved block with additional previous 50 blocks for safety: ${from_block}.`) + } catch (err) { + console.log('Could not get block from file and it was not specified ❌') + if(this.config.eth.genesisBlock){ + from_block = this.config.eth.genesisBlock + console.log('Start by genesis block.') + } else { + from_block = latest_block - 100 // go back 100 blocks from latest + console.log('Start 100 blocks before the latest block.') + } + } + } else if (typeof start_ref === 'number') { + from_block = start_ref + } else { + from_block = this.config.eth.genesisBlock } - } else if (typeof start_ref === 'number') { - from_block = start_ref; - } else { - from_block = this.config.eth.genesisBlock; - } } if(from_block < 0){ from_block = 0 @@ -275,61 +380,58 @@ class EthOracle { if (start_ref >= latest_block) { console.log(`Up to date at block ${to_block}`) - await sleep(10000); + await sleep(10000) } console.log(`Getting events from block ${from_block} to ${to_block}`) await this.process_claimed(from_block, to_block, trxBroadcast) await this.process_teleported(from_block, to_block, trxBroadcast) - from_block = to_block; + from_block = to_block // Save last block received await EthOracle.save_block_to_file(to_block, this.blocks_file_name) if (latest_block - from_block <= 1000) { - console.log('Waiting...'); - await sleep(30000); + await EthOracle.WaitWithAnimation(30, 'Wait for new blocks...') } else { console.log(`Not waiting... ${latest_block} - ${from_block}`) } - } catch (e: any) { - console.error('⚡️ ' + e.message) - - console.error('Try again in 5 seconds') - await sleep(5000) - } - } - } catch (e){ - console.error('⚡️ ' + e); - } - console.log('Thread closed 💀') + } catch (e: any) { + console.error('⚡️ ' + e.message) + + console.error('Try again in 5 seconds') + await sleep(5000) + } + // Select the next endpoint to distribute the requests + await this.eos_api.nextEndpoint() + } } + + /** + * Wait for a defined amount of time and show remaining seconds + * @param s Seconds to wait + */ + static async WaitWithAnimation(s: number, info: string = ""){ + process.stdout.write(info + "\n\x1b[?25l") + for(let i = 0; i < s; i++){ + process.stdout.write(`💤 ${i} s / ${s} s 💤`) + await sleep(1000) + process.stdout.write("\r\x1b[K") + } + + process.stdout.moveCursor(0, -1) // up one line + process.stdout.clearLine(1) // from cursor to end + } } // Handle params from console const argv = yargs .version().alias('version', 'v') - // .option('id', { - // alias: 'n', - // description: 'Teleport id to start from', - // type: 'number' - // }) - // .option('amount', { - // alias: 'a', - // description: 'Amount of handled teleports per requests', - // type: 'number' - // }) .option('block', { alias: 'b', description: 'Block number to start scanning from', - type: 'number' }) - // .option('signs', { - // alias: 's', - // description: 'Amount of signatures until this oracle will sign too', - // type: 'number' - // }) .option('config', { alias: 'c', description: 'Path of config file', @@ -342,39 +444,36 @@ const argv = yargs default: true, }) .help().alias('help', 'h').argv as { - // id: number, block: number, - // signs: number, config: string, broadcast: boolean, - }; - + } + // Load config and set title const config_path = argv.config || process.env['CONFIG'] || './config' process.title = `oracle-eth ${config_path}` const configFile : ConfigType = require(config_path) // Check and set start parameters -let startRef: 'latest' | number = 'latest' -if(argv.block) { - startRef = argv.block; +let startRef: 'latest' | number = 'latest' +if(typeof argv.block == 'number' || argv.block == 'latest') { + startRef = argv.block } else if(process.env['START_BLOCK']) { const start_block_env = parseInt(process.env['START_BLOCK']) if(isNaN(start_block_env)) { - console.error(`You must supply start block as an integer in env`) - process.exit(1); + console.error('You must supply start block as an integer in env') + process.exit(1) } - startRef = start_block_env; + startRef = start_block_env } if(configFile.eos.epVerifications > configFile.eos.endpoints.length){ - console.error('Error: epVerifications cannot be greater than given amount of endpints') + console.error('Error: epVerifications cannot be greater than given amount of endpoints') process.exit(1) } -const eosSigProvider = new JsSignatureProvider([configFile.eos.privateKey]) -const ethProvider = new ethers.providers.StaticJsonRpcProvider(configFile.eth.endpoint) // Set up the oracle -const ethOracle = new EthOracle(configFile, ethProvider, eosSigProvider) +const eosSigProvider = new JsSignatureProvider([configFile.eos.privateKey]) +const ethOracle = new EthOracle(configFile, eosSigProvider) // Run the process ethOracle.run(startRef, argv.broadcast) \ No newline at end of file diff --git a/oracle/package.json b/oracle/package.json index cbcf2dc..016376e 100644 --- a/oracle/package.json +++ b/oracle/package.json @@ -14,18 +14,19 @@ "abi-decoder": "^2.4.0", "child-process": "^1.0.2", "cross-fetch": "^3.1.5", - "eosio-helpers": "^0.1.4", "eosjs": "^22.0.0", "ethereumjs-util": "^7.0.4", "ethers": "^5.6.2", "node-fetch": "^3.2.3", "text-encoding": "^0.7.0", - "web3": "^1.2.11", - "yargs": "^17.4.0" + "web3": "^1.7.3", + "yargs": "^17.4.1" }, "devDependencies": { "@types/elliptic": "^6.4.14", "@types/ethereumjs-util": "^6.1.0", - "@types/text-encoding": "0.0.36" + "@types/text-encoding": "0.0.36", + "@types/yargs": "^17.0.10", + "typescript": "^4.6.3" } } diff --git a/oracle/yarn.lock b/oracle/yarn.lock index e4bcfe8..c3655ae 100644 --- a/oracle/yarn.lock +++ b/oracle/yarn.lock @@ -409,13 +409,6 @@ dependencies: "@types/node" "*" -"@types/csv-parse@^1.2.2": - version "1.2.2" - resolved "https://registry.yarnpkg.com/@types/csv-parse/-/csv-parse-1.2.2.tgz#713486235759d615dc8e6a6a979170ada76701d5" - integrity sha512-k33tLtRKTQxf7hQfMlkWoS2TQYsnpk1ibZN+rzbuCkeBs8m23nHTeDTF1wb/e7/MSLdtgCzqu3oM1I101kd6yw== - dependencies: - csv-parse "*" - "@types/elliptic@^6.4.14": version "6.4.14" resolved "https://registry.yarnpkg.com/@types/elliptic/-/elliptic-6.4.14.tgz#7bbaad60567a588c1f08b10893453e6b9b4de48e" @@ -430,14 +423,6 @@ dependencies: ethereumjs-util "*" -"@types/node-fetch@^2.5.10": - version "2.6.1" - resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.6.1.tgz#8f127c50481db65886800ef496f20bbf15518975" - integrity sha512-oMqjURCaxoSIsHSr1E47QHzbmzNR5rK8McHuNb11BOM9cHcIK3Avy0s/b2JlXHoQGTYS3NsvWzV1M0iK7l0wbA== - dependencies: - "@types/node" "*" - form-data "^3.0.0" - "@types/node@*": version "17.0.23" resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.23.tgz#3b41a6e643589ac6442bdbd7a4a3ded62f33f7da" @@ -448,11 +433,6 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.47.tgz#ca9237d51f2a2557419688511dab1c8daf475188" integrity sha512-BzcaRsnFuznzOItW1WpQrDHM7plAa7GIDMZ6b5pnMbkqEtM/6WCOhvZar39oeMQP79gwvFUWjjptE7/KGcNqFg== -"@types/node@^15.12.5": - version "15.14.9" - resolved "https://registry.yarnpkg.com/@types/node/-/node-15.14.9.tgz#bc43c990c3c9be7281868bbc7b8fdd6e2b57adfa" - integrity sha512-qjd88DrCxupx/kJD5yQgZdcYKZKSIGBVDIBE1/LTGcNm3d2Np/jxojkdePDdfnBHJc5W7vSMpbJ1aB7p/Py69A== - "@types/pbkdf2@^3.0.0": version "3.1.0" resolved "https://registry.yarnpkg.com/@types/pbkdf2/-/pbkdf2-3.1.0.tgz#039a0e9b67da0cdc4ee5dab865caa6b267bb66b1" @@ -477,7 +457,7 @@ resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.0.tgz#0c60e537fa790f5f9472ed2776c2b71ec117351b" integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA== -"@types/yargs@^17.0.2": +"@types/yargs@^17.0.10": version "17.0.10" resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.10.tgz#591522fce85d8739bca7b8bb90d048e4478d186a" integrity sha512-gmEaFwpj/7f/ROdtIlci1R1VYU1J4j95m8T+Tj3iBgiBFKg1foE/PSl93bBd5T9LDXNPo8UlNN6W0qwD8O5OaA== @@ -842,7 +822,7 @@ color-name@~1.1.4: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== -combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: +combined-stream@^1.0.6, combined-stream@~1.0.6: version "1.0.8" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== @@ -961,16 +941,6 @@ crypto-browserify@3.12.0: randombytes "^2.0.0" randomfill "^1.0.3" -csv-parse@*: - version "5.0.4" - resolved "https://registry.yarnpkg.com/csv-parse/-/csv-parse-5.0.4.tgz#97e5e654413bcf95f2714ce09bcb2be6de0eb8e3" - integrity sha512-5AIdl8l6n3iYQYxan5djB5eKDa+vBnhfWZtRpJTcrETWfVLYN0WSj3L9RwvgYt+psoO77juUr8TG8qpfGZifVQ== - -csv-parse@^4.16.0: - version "4.16.3" - resolved "https://registry.yarnpkg.com/csv-parse/-/csv-parse-4.16.3.tgz#7ca624d517212ebc520a36873c3478fa66efbaf7" - integrity sha512-cO1I/zmz4w2dcKHVvpCr7JVRu8/FymG5OEpmvsZYlccYolPBLoVGKUHgNoc4ZGkFeFlWGEDmMyBM+TTqRdW/wg== - d@1, d@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a" @@ -1107,22 +1077,6 @@ end-of-stream@^1.1.0: dependencies: once "^1.4.0" -eosio-helpers@^0.1.4: - version "0.1.16" - resolved "https://registry.yarnpkg.com/eosio-helpers/-/eosio-helpers-0.1.16.tgz#f892d8a6501e1f31d9010559d99e8c1a25382379" - integrity sha512-F68cYLBnStvE8sAjvPsC4oV174WStZzYG7HC6uauB2hQQZ5okDYQXWUKOhbr7iewijt07Y7HEb+tAgIhpiNX8g== - dependencies: - "@types/csv-parse" "^1.2.2" - "@types/node" "^15.12.5" - "@types/node-fetch" "^2.5.10" - "@types/yargs" "^17.0.2" - csv-parse "^4.16.0" - int64-buffer "^1.0.0" - node-fetch "^2.6.1" - text-encoding "^0.7.0" - typescript "^4.3.4" - yargs "^17.1.1" - eosjs@^21.0.3: version "21.0.4" resolved "https://registry.yarnpkg.com/eosjs/-/eosjs-21.0.4.tgz#67794a9fbc3c7659de19a7926c2c13cce4515571" @@ -1448,15 +1402,6 @@ forever-agent@~0.6.1: resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= -form-data@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f" - integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.8" - mime-types "^2.1.12" - form-data@~2.3.2: version "2.3.3" resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" @@ -1731,11 +1676,6 @@ inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4: resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== -int64-buffer@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/int64-buffer/-/int64-buffer-1.0.1.tgz#c78d841b444cadf036cd04f8683696c740f15dca" - integrity sha512-+3azY4pXrjAupJHU1V9uGERWlhoqNswJNji6aD/02xac7oxol508AsMC5lxKhEqyZeDFy3enq5OGWXF4u75hiw== - internal-slot@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c" @@ -2170,7 +2110,7 @@ node-domexception@^1.0.0: resolved "https://registry.yarnpkg.com/node-domexception/-/node-domexception-1.0.0.tgz#6888db46a1f71c0b76b3f7555016b63fe64766e5" integrity sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ== -node-fetch@2.6.7, node-fetch@^2.6.1: +node-fetch@2.6.7: version "2.6.7" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== @@ -2779,7 +2719,7 @@ typedarray-to-buffer@^3.1.5: dependencies: is-typedarray "^1.0.0" -typescript@^4.3.4: +typescript@^4.6.3: version "4.6.3" resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.6.3.tgz#eefeafa6afdd31d725584c67a0eaba80f6fc6c6c" integrity sha512-yNIatDa5iaofVozS/uQJEl3JRWLKKGJKh6Yaiv0GLGSuhpFJe7P3SbHZ8/yjAHRQwKRoA6YZqlfjXWmVzoVSMw== @@ -2908,74 +2848,82 @@ web-streams-polyfill@^3.0.3: resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-3.2.0.tgz#a6b74026b38e4885869fb5c589e90b95ccfc7965" integrity sha512-EqPmREeOzttaLRm5HS7io98goBgZ7IVz79aDvqjD0kYXLtFZTc0T/U6wHTPKyIjb+MdN7DFIIX6hgdBEpWmfPA== -web3-bzz@1.7.1: - version "1.7.1" - resolved "https://registry.yarnpkg.com/web3-bzz/-/web3-bzz-1.7.1.tgz#ea1e7d27050eca089bc5d71b7f7688d20b68a25d" - integrity sha512-sVeUSINx4a4pfdnT+3ahdRdpDPvZDf4ZT/eBF5XtqGWq1mhGTl8XaQAk15zafKVm6Onq28vN8abgB/l+TrG8kA== +web3-bzz@1.7.3: + version "1.7.3" + resolved "https://registry.yarnpkg.com/web3-bzz/-/web3-bzz-1.7.3.tgz#6860a584f748838af5e3932b6798e024ab8ae951" + integrity sha512-y2i2IW0MfSqFc1JBhBSQ59Ts9xE30hhxSmLS13jLKWzie24/An5dnoGarp2rFAy20tevJu1zJVPYrEl14jiL5w== dependencies: "@types/node" "^12.12.6" got "9.6.0" swarm-js "^0.1.40" -web3-core-helpers@1.7.1: - version "1.7.1" - resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.7.1.tgz#6dc34eff6ad31149db6c7cc2babbf574a09970cd" - integrity sha512-xn7Sx+s4CyukOJdlW8bBBDnUCWndr+OCJAlUe/dN2wXiyaGRiCWRhuQZrFjbxLeBt1fYFH7uWyYHhYU6muOHgw== +web3-core-helpers@1.7.3: + version "1.7.3" + resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.7.3.tgz#9a8d7830737d0e9c48694b244f4ce0f769ba67b9" + integrity sha512-qS2t6UKLhRV/6C7OFHtMeoHphkcA+CKUr2vfpxy4hubs3+Nj28K9pgiqFuvZiXmtEEwIAE2A28GBOC3RdcSuFg== dependencies: - web3-eth-iban "1.7.1" - web3-utils "1.7.1" + web3-eth-iban "1.7.3" + web3-utils "1.7.3" -web3-core-method@1.7.1: - version "1.7.1" - resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.7.1.tgz#912c87d0f107d3f823932cf8a716852e3250e557" - integrity sha512-383wu5FMcEphBFl5jCjk502JnEg3ugHj7MQrsX7DY76pg5N5/dEzxeEMIJFCN6kr5Iq32NINOG3VuJIyjxpsEg== +web3-core-method@1.7.3: + version "1.7.3" + resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.7.3.tgz#eb2a4f140448445c939518c0fa6216b3d265c5e9" + integrity sha512-SeF8YL/NVFbj/ddwLhJeS0io8y7wXaPYA2AVT0h2C2ESYkpvOtQmyw2Bc3aXxBmBErKcbOJjE2ABOKdUmLSmMA== dependencies: "@ethersproject/transactions" "^5.0.0-beta.135" - web3-core-helpers "1.7.1" - web3-core-promievent "1.7.1" - web3-core-subscriptions "1.7.1" - web3-utils "1.7.1" + web3-core-helpers "1.7.3" + web3-core-promievent "1.7.3" + web3-core-subscriptions "1.7.3" + web3-utils "1.7.3" -web3-core-promievent@1.7.1: - version "1.7.1" - resolved "https://registry.yarnpkg.com/web3-core-promievent/-/web3-core-promievent-1.7.1.tgz#7f78ec100a696954d0c882dac619fec28b2efc96" - integrity sha512-Vd+CVnpPejrnevIdxhCkzMEywqgVbhHk/AmXXceYpmwA6sX41c5a65TqXv1i3FWRJAz/dW7oKz9NAzRIBAO/kA== +web3-core-promievent@1.7.3: + version "1.7.3" + resolved "https://registry.yarnpkg.com/web3-core-promievent/-/web3-core-promievent-1.7.3.tgz#2d0eeef694569b61355054c721578f67df925b80" + integrity sha512-+mcfNJLP8h2JqcL/UdMGdRVfTdm+bsoLzAFtLpazE4u9kU7yJUgMMAqnK59fKD3Zpke3DjaUJKwz1TyiGM5wig== dependencies: eventemitter3 "4.0.4" -web3-core-requestmanager@1.7.1: - version "1.7.1" - resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.7.1.tgz#5cd7507276ca449538fe11cb4f363de8507502e5" - integrity sha512-/EHVTiMShpZKiq0Jka0Vgguxi3vxq1DAHKxg42miqHdUsz4/cDWay2wGALDR2x3ofDB9kqp7pb66HsvQImQeag== +web3-core-requestmanager@1.7.3: + version "1.7.3" + resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.7.3.tgz#226f79d16e546c9157d00908de215e984cae84e9" + integrity sha512-bC+jeOjPbagZi2IuL1J5d44f3zfPcgX+GWYUpE9vicNkPUxFBWRG+olhMo7L+BIcD57cTmukDlnz+1xBULAjFg== dependencies: util "^0.12.0" - web3-core-helpers "1.7.1" - web3-providers-http "1.7.1" - web3-providers-ipc "1.7.1" - web3-providers-ws "1.7.1" + web3-core-helpers "1.7.3" + web3-providers-http "1.7.3" + web3-providers-ipc "1.7.3" + web3-providers-ws "1.7.3" -web3-core-subscriptions@1.7.1: - version "1.7.1" - resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.7.1.tgz#f7c834ee3544f4a5641a989304f61fde6a523e0b" - integrity sha512-NZBsvSe4J+Wt16xCf4KEtBbxA9TOwSVr8KWfUQ0tC2KMdDYdzNswl0Q9P58xaVuNlJ3/BH+uDFZJJ5E61BSA1Q== +web3-core-subscriptions@1.7.3: + version "1.7.3" + resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.7.3.tgz#ca456dfe2c219a0696c5cf34c13b03c3599ec5d5" + integrity sha512-/i1ZCLW3SDxEs5mu7HW8KL4Vq7x4/fDXY+yf/vPoDljlpvcLEOnI8y9r7om+0kYwvuTlM6DUHHafvW0221TyRQ== dependencies: eventemitter3 "4.0.4" - web3-core-helpers "1.7.1" + web3-core-helpers "1.7.3" -web3-core@1.7.1: - version "1.7.1" - resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.7.1.tgz#ef9b7f03909387b9ab783f34cdc5ebcb50248368" - integrity sha512-HOyDPj+4cNyeNPwgSeUkhtS0F+Pxc2obcm4oRYPW5ku6jnTO34pjaij0us+zoY3QEusR8FfAKVK1kFPZnS7Dzw== +web3-core@1.7.3: + version "1.7.3" + resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.7.3.tgz#2ef25c4cc023997f43af9f31a03b571729ff3cda" + integrity sha512-4RNxueGyevD1XSjdHE57vz/YWRHybpcd3wfQS33fgMyHZBVLFDNwhn+4dX4BeofVlK/9/cmPAokLfBUStZMLdw== dependencies: "@types/bn.js" "^4.11.5" "@types/node" "^12.12.6" bignumber.js "^9.0.0" - web3-core-helpers "1.7.1" - web3-core-method "1.7.1" - web3-core-requestmanager "1.7.1" - web3-utils "1.7.1" + web3-core-helpers "1.7.3" + web3-core-method "1.7.3" + web3-core-requestmanager "1.7.3" + web3-utils "1.7.3" + +web3-eth-abi@1.7.3: + version "1.7.3" + resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.7.3.tgz#2a1123c7252c37100eecd0b1fb2fb2c51366071f" + integrity sha512-ZlD8DrJro0ocnbZViZpAoMX44x5aYAb73u2tMq557rMmpiluZNnhcCYF/NnVMy6UIkn7SF/qEA45GXA1ne6Tnw== + dependencies: + "@ethersproject/abi" "5.0.7" + web3-utils "1.7.3" -web3-eth-abi@1.7.1, web3-eth-abi@^1.2.1: +web3-eth-abi@^1.2.1: version "1.7.1" resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.7.1.tgz#6632003220a4defee4de8215dc703e43147382ea" integrity sha512-8BVBOoFX1oheXk+t+uERBibDaVZ5dxdcefpbFTWcBs7cdm0tP8CD1ZTCLi5Xo+1bolVHNH2dMSf/nEAssq5pUA== @@ -2983,10 +2931,10 @@ web3-eth-abi@1.7.1, web3-eth-abi@^1.2.1: "@ethersproject/abi" "5.0.7" web3-utils "1.7.1" -web3-eth-accounts@1.7.1: - version "1.7.1" - resolved "https://registry.yarnpkg.com/web3-eth-accounts/-/web3-eth-accounts-1.7.1.tgz#f938060d08f4b641bebe743809b0018fd4e4ba51" - integrity sha512-3xGQ2bkTQc7LFoqGWxp5cQDrKndlX05s7m0rAFVoyZZODMqrdSGjMPMqmWqHzJRUswNEMc+oelqSnGBubqhguQ== +web3-eth-accounts@1.7.3: + version "1.7.3" + resolved "https://registry.yarnpkg.com/web3-eth-accounts/-/web3-eth-accounts-1.7.3.tgz#cd1789000f13ed3c438e96b3e80ee7be8d3f1a9b" + integrity sha512-aDaWjW1oJeh0LeSGRVyEBiTe/UD2/cMY4dD6pQYa8dOhwgMtNQjxIQ7kacBBXe7ZKhjbIFZDhvXN4mjXZ82R2Q== dependencies: "@ethereumjs/common" "^2.5.0" "@ethereumjs/tx" "^3.3.2" @@ -2995,120 +2943,120 @@ web3-eth-accounts@1.7.1: ethereumjs-util "^7.0.10" scrypt-js "^3.0.1" uuid "3.3.2" - web3-core "1.7.1" - web3-core-helpers "1.7.1" - web3-core-method "1.7.1" - web3-utils "1.7.1" + web3-core "1.7.3" + web3-core-helpers "1.7.3" + web3-core-method "1.7.3" + web3-utils "1.7.3" -web3-eth-contract@1.7.1: - version "1.7.1" - resolved "https://registry.yarnpkg.com/web3-eth-contract/-/web3-eth-contract-1.7.1.tgz#3f5147e5f1441ae388c985ba95023d02503378ae" - integrity sha512-HpnbkPYkVK3lOyos2SaUjCleKfbF0SP3yjw7l551rAAi5sIz/vwlEzdPWd0IHL7ouxXbO0tDn7jzWBRcD3sTbA== +web3-eth-contract@1.7.3: + version "1.7.3" + resolved "https://registry.yarnpkg.com/web3-eth-contract/-/web3-eth-contract-1.7.3.tgz#c4efc118ed7adafbc1270b633f33e696a39c7fc7" + integrity sha512-7mjkLxCNMWlQrlfM/MmNnlKRHwFk5XrZcbndoMt3KejcqDP6dPHi2PZLutEcw07n/Sk8OMpSamyF3QiGfmyRxw== dependencies: "@types/bn.js" "^4.11.5" - web3-core "1.7.1" - web3-core-helpers "1.7.1" - web3-core-method "1.7.1" - web3-core-promievent "1.7.1" - web3-core-subscriptions "1.7.1" - web3-eth-abi "1.7.1" - web3-utils "1.7.1" - -web3-eth-ens@1.7.1: - version "1.7.1" - resolved "https://registry.yarnpkg.com/web3-eth-ens/-/web3-eth-ens-1.7.1.tgz#18ddb22e14e50108f9515c9d17f14560d69ff397" - integrity sha512-DVCF76i9wM93DrPQwLrYiCw/UzxFuofBsuxTVugrnbm0SzucajLLNftp3ITK0c4/lV3x9oo5ER/wD6RRMHQnvw== + web3-core "1.7.3" + web3-core-helpers "1.7.3" + web3-core-method "1.7.3" + web3-core-promievent "1.7.3" + web3-core-subscriptions "1.7.3" + web3-eth-abi "1.7.3" + web3-utils "1.7.3" + +web3-eth-ens@1.7.3: + version "1.7.3" + resolved "https://registry.yarnpkg.com/web3-eth-ens/-/web3-eth-ens-1.7.3.tgz#ebc56a4dc7007f4f899259bbae1237d3095e2f3f" + integrity sha512-q7+hFGHIc0mBI3LwgRVcLCQmp6GItsWgUtEZ5bjwdjOnJdbjYddm7PO9RDcTDQ6LIr7hqYaY4WTRnDHZ6BEt5Q== dependencies: content-hash "^2.5.2" eth-ens-namehash "2.0.8" - web3-core "1.7.1" - web3-core-helpers "1.7.1" - web3-core-promievent "1.7.1" - web3-eth-abi "1.7.1" - web3-eth-contract "1.7.1" - web3-utils "1.7.1" - -web3-eth-iban@1.7.1: - version "1.7.1" - resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.7.1.tgz#2148dff256392491df36b175e393b03c6874cd31" - integrity sha512-XG4I3QXuKB/udRwZdNEhdYdGKjkhfb/uH477oFVMLBqNimU/Cw8yXUI5qwFKvBHM+hMQWfzPDuSDEDKC2uuiMg== + web3-core "1.7.3" + web3-core-helpers "1.7.3" + web3-core-promievent "1.7.3" + web3-eth-abi "1.7.3" + web3-eth-contract "1.7.3" + web3-utils "1.7.3" + +web3-eth-iban@1.7.3: + version "1.7.3" + resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.7.3.tgz#47433a73380322bba04e17b91fccd4a0e63a390a" + integrity sha512-1GPVWgajwhh7g53mmYDD1YxcftQniIixMiRfOqlnA1w0mFGrTbCoPeVaSQ3XtSf+rYehNJIZAUeDBnONVjXXmg== dependencies: bn.js "^4.11.9" - web3-utils "1.7.1" + web3-utils "1.7.3" -web3-eth-personal@1.7.1: - version "1.7.1" - resolved "https://registry.yarnpkg.com/web3-eth-personal/-/web3-eth-personal-1.7.1.tgz#38635f94223f951422105e5fcb7f7ba767a3ee9f" - integrity sha512-02H6nFBNfNmFjMGZL6xcDi0r7tUhxrUP91FTFdoLyR94eIJDadPp4rpXfG7MVES873i1PReh4ep5pSCHbc3+Pg== +web3-eth-personal@1.7.3: + version "1.7.3" + resolved "https://registry.yarnpkg.com/web3-eth-personal/-/web3-eth-personal-1.7.3.tgz#ca2464dca356d4335aa8141cf75a6947f10f45a6" + integrity sha512-iTLz2OYzEsJj2qGE4iXC1Gw+KZN924fTAl0ESBFs2VmRhvVaM7GFqZz/wx7/XESl3GVxGxlRje3gNK0oGIoYYQ== dependencies: "@types/node" "^12.12.6" - web3-core "1.7.1" - web3-core-helpers "1.7.1" - web3-core-method "1.7.1" - web3-net "1.7.1" - web3-utils "1.7.1" - -web3-eth@1.7.1: - version "1.7.1" - resolved "https://registry.yarnpkg.com/web3-eth/-/web3-eth-1.7.1.tgz#721599865f675b43877f5a18babfb7ae087449f7" - integrity sha512-Uz3gO4CjTJ+hMyJZAd2eiv2Ur1uurpN7sTMATWKXYR/SgG+SZgncnk/9d8t23hyu4lyi2GiVL1AqVqptpRElxg== - dependencies: - web3-core "1.7.1" - web3-core-helpers "1.7.1" - web3-core-method "1.7.1" - web3-core-subscriptions "1.7.1" - web3-eth-abi "1.7.1" - web3-eth-accounts "1.7.1" - web3-eth-contract "1.7.1" - web3-eth-ens "1.7.1" - web3-eth-iban "1.7.1" - web3-eth-personal "1.7.1" - web3-net "1.7.1" - web3-utils "1.7.1" - -web3-net@1.7.1: - version "1.7.1" - resolved "https://registry.yarnpkg.com/web3-net/-/web3-net-1.7.1.tgz#c75ff7ccabb949cf15e9098505516eb1ed8e37de" - integrity sha512-8yPNp2gvjInWnU7DCoj4pIPNhxzUjrxKlODsyyXF8j0q3Z2VZuQp+c63gL++r2Prg4fS8t141/HcJw4aMu5sVA== - dependencies: - web3-core "1.7.1" - web3-core-method "1.7.1" - web3-utils "1.7.1" - -web3-providers-http@1.7.1: - version "1.7.1" - resolved "https://registry.yarnpkg.com/web3-providers-http/-/web3-providers-http-1.7.1.tgz#3e00e013f013766aade28da29247daa1a937e759" - integrity sha512-dmiO6G4dgAa3yv+2VD5TduKNckgfR97VI9YKXVleWdcpBoKXe2jofhdvtafd42fpIoaKiYsErxQNcOC5gI/7Vg== - dependencies: - web3-core-helpers "1.7.1" + web3-core "1.7.3" + web3-core-helpers "1.7.3" + web3-core-method "1.7.3" + web3-net "1.7.3" + web3-utils "1.7.3" + +web3-eth@1.7.3: + version "1.7.3" + resolved "https://registry.yarnpkg.com/web3-eth/-/web3-eth-1.7.3.tgz#9e92785ea18d682548b6044551abe7f2918fc0b5" + integrity sha512-BCIRMPwaMlTCbswXyGT6jj9chCh9RirbDFkPtvqozfQ73HGW7kP78TXXf9+Xdo1GjutQfxi/fQ9yPdxtDJEpDA== + dependencies: + web3-core "1.7.3" + web3-core-helpers "1.7.3" + web3-core-method "1.7.3" + web3-core-subscriptions "1.7.3" + web3-eth-abi "1.7.3" + web3-eth-accounts "1.7.3" + web3-eth-contract "1.7.3" + web3-eth-ens "1.7.3" + web3-eth-iban "1.7.3" + web3-eth-personal "1.7.3" + web3-net "1.7.3" + web3-utils "1.7.3" + +web3-net@1.7.3: + version "1.7.3" + resolved "https://registry.yarnpkg.com/web3-net/-/web3-net-1.7.3.tgz#54e35bcc829fdc40cf5001a3870b885d95069810" + integrity sha512-zAByK0Qrr71k9XW0Adtn+EOuhS9bt77vhBO6epAeQ2/VKl8rCGLAwrl3GbeEl7kWa8s/su72cjI5OetG7cYR0g== + dependencies: + web3-core "1.7.3" + web3-core-method "1.7.3" + web3-utils "1.7.3" + +web3-providers-http@1.7.3: + version "1.7.3" + resolved "https://registry.yarnpkg.com/web3-providers-http/-/web3-providers-http-1.7.3.tgz#8ea5e39f6ceee0b5bc4e45403fae75cad8ff4cf7" + integrity sha512-TQJfMsDQ5Uq9zGMYlu7azx1L7EvxW+Llks3MaWn3cazzr5tnrDbGh6V17x6LN4t8tFDHWx0rYKr3mDPqyTjOZw== + dependencies: + web3-core-helpers "1.7.3" xhr2-cookies "1.1.0" -web3-providers-ipc@1.7.1: - version "1.7.1" - resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.7.1.tgz#cde879a2ba57b1deac2e1030de90d185b793dd50" - integrity sha512-uNgLIFynwnd5M9ZC0lBvRQU5iLtU75hgaPpc7ZYYR+kjSk2jr2BkEAQhFVJ8dlqisrVmmqoAPXOEU0flYZZgNQ== +web3-providers-ipc@1.7.3: + version "1.7.3" + resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.7.3.tgz#a34872103a8d37a03795fa2f9b259e869287dcaa" + integrity sha512-Z4EGdLKzz6I1Bw+VcSyqVN4EJiT2uAro48Am1eRvxUi4vktGoZtge1ixiyfrRIVb6nPe7KnTFl30eQBtMqS0zA== dependencies: oboe "2.1.5" - web3-core-helpers "1.7.1" + web3-core-helpers "1.7.3" -web3-providers-ws@1.7.1: - version "1.7.1" - resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.7.1.tgz#b6b3919ce155eff29b21bc3f205a098299a8c1b2" - integrity sha512-Uj0n5hdrh0ESkMnTQBsEUS2u6Unqdc7Pe4Zl+iZFb7Yn9cIGsPJBl7/YOP4137EtD5ueXAv+MKwzcelpVhFiFg== +web3-providers-ws@1.7.3: + version "1.7.3" + resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.7.3.tgz#87564facc47387c9004a043a6686e4881ed6acfe" + integrity sha512-PpykGbkkkKtxPgv7U4ny4UhnkqSZDfLgBEvFTXuXLAngbX/qdgfYkhIuz3MiGplfL7Yh93SQw3xDjImXmn2Rgw== dependencies: eventemitter3 "4.0.4" - web3-core-helpers "1.7.1" + web3-core-helpers "1.7.3" websocket "^1.0.32" -web3-shh@1.7.1: - version "1.7.1" - resolved "https://registry.yarnpkg.com/web3-shh/-/web3-shh-1.7.1.tgz#c6a0fc67321dd585085e3e3be8f2c1c8d61636ef" - integrity sha512-NO+jpEjo8kYX6c7GiaAm57Sx93PLYkWYUCWlZmUOW7URdUcux8VVluvTWklGPvdM9H1WfDrol91DjuSW+ykyqg== +web3-shh@1.7.3: + version "1.7.3" + resolved "https://registry.yarnpkg.com/web3-shh/-/web3-shh-1.7.3.tgz#84e10adf628556798244b58f73cda1447bb7075e" + integrity sha512-bQTSKkyG7GkuULdZInJ0osHjnmkHij9tAySibpev1XjYdjLiQnd0J9YGF4HjvxoG3glNROpuCyTaRLrsLwaZuw== dependencies: - web3-core "1.7.1" - web3-core-method "1.7.1" - web3-core-subscriptions "1.7.1" - web3-net "1.7.1" + web3-core "1.7.3" + web3-core-method "1.7.3" + web3-core-subscriptions "1.7.3" + web3-net "1.7.3" web3-utils@1.7.1, web3-utils@^1.2.1: version "1.7.1" @@ -3123,18 +3071,31 @@ web3-utils@1.7.1, web3-utils@^1.2.1: randombytes "^2.1.0" utf8 "3.0.0" -web3@^1.2.11: - version "1.7.1" - resolved "https://registry.yarnpkg.com/web3/-/web3-1.7.1.tgz#4d01371a2c0c07dba089f8009dabd2b11821c5e8" - integrity sha512-RKVdyZ5FuVEykj62C1o2tc0teJciSOh61jpVB9yb344dBHO3ZV4XPPP24s/PPqIMXmVFN00g2GD9M/v1SoHO/A== - dependencies: - web3-bzz "1.7.1" - web3-core "1.7.1" - web3-eth "1.7.1" - web3-eth-personal "1.7.1" - web3-net "1.7.1" - web3-shh "1.7.1" - web3-utils "1.7.1" +web3-utils@1.7.3: + version "1.7.3" + resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.7.3.tgz#b214d05f124530d8694ad364509ac454d05f207c" + integrity sha512-g6nQgvb/bUpVUIxJE+ezVN+rYwYmlFyMvMIRSuqpi1dk6ApDD00YNArrk7sPcZnjvxOJ76813Xs2vIN2rgh4lg== + dependencies: + bn.js "^4.11.9" + ethereum-bloom-filters "^1.0.6" + ethereumjs-util "^7.1.0" + ethjs-unit "0.1.6" + number-to-bn "1.7.0" + randombytes "^2.1.0" + utf8 "3.0.0" + +web3@^1.7.3: + version "1.7.3" + resolved "https://registry.yarnpkg.com/web3/-/web3-1.7.3.tgz#30fe786338b2cc775881cb28c056ee5da4be65b8" + integrity sha512-UgBvQnKIXncGYzsiGacaiHtm0xzQ/JtGqcSO/ddzQHYxnNuwI72j1Pb4gskztLYihizV9qPNQYHMSCiBlStI9A== + dependencies: + web3-bzz "1.7.3" + web3-core "1.7.3" + web3-eth "1.7.3" + web3-eth-personal "1.7.3" + web3-net "1.7.3" + web3-shh "1.7.3" + web3-utils "1.7.3" webidl-conversions@^3.0.0: version "3.0.1" @@ -3281,10 +3242,10 @@ yargs-parser@^21.0.0: resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.0.1.tgz#0267f286c877a4f0f728fceb6f8a3e4cb95c6e35" integrity sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg== -yargs@^17.1.1, yargs@^17.4.0: - version "17.4.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.4.0.tgz#9fc9efc96bd3aa2c1240446af28499f0e7593d00" - integrity sha512-WJudfrk81yWFSOkZYpAZx4Nt7V4xp7S/uJkX0CnxovMCt1wCE8LNftPpNuF9X/u9gN5nsD7ycYtRcDf2pL3UiA== +yargs@^17.4.1: + version "17.4.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.4.1.tgz#ebe23284207bb75cee7c408c33e722bfb27b5284" + integrity sha512-WSZD9jgobAg3ZKuCQZSa3g9QOJeCCqLoLAykiWgmXnDo9EPnn4RPf5qVTtzgOx66o6/oqhcA5tHtJXpG8pMt3g== dependencies: cliui "^7.0.2" escalade "^3.1.1" From 0e66a68fc92c6cfe6af5ac930772400e7eaefff3 Mon Sep 17 00:00:00 2001 From: Kevin Kei Tuncer Date: Fri, 15 Apr 2022 01:38:42 +0200 Subject: [PATCH 07/24] - Show contract configuration in RAM table - Different freeze options for oracle actions, cancel action, incoming and outgoing funds - Changeable min amount - Include a fix fee and a variable fee - Make fees changeable - Pay off collected fees to all oracles - Describe the README to run tests for the EOSIO contract in more detail --- contracts/teleporteos/README.md | 29 ++- .../contracts/teleport/teleporteos.cpp | 232 +++++++++++++----- .../contracts/teleport/teleporteos.hpp | 107 +++++++- .../contracts/teleport/teleporteos.test.ts | 7 +- contracts/teleporteos/yarn.lock | 34 ++- 5 files changed, 334 insertions(+), 75 deletions(-) diff --git a/contracts/teleporteos/README.md b/contracts/teleporteos/README.md index 9e1ab53..a0ee640 100644 --- a/contracts/teleporteos/README.md +++ b/contracts/teleporteos/README.md @@ -1,5 +1,22 @@ # Install test suite on windows +You need to activate the windows feature Hyper-V, but it is not available on Windows 10 Home. SO you might need to upgrade your Windows to Windows Pro. + +## Activate WSL 2 +Start windows PowerShell as administrator and run the following commands +``` +dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart +``` + +``` +dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart +``` + +``` +wsl --set-default-version 2 +``` + +## Set up linux environment Install Debian from microsoft store, start it, create your user account and run the following commands ``` sudo apt-get update @@ -15,17 +32,21 @@ Install yarn globally ``` sudo npm install --global yarn ``` -Navigate in the console to the folder teleporteos in which you can install the modules (run the following command again if it fails) +Navigate in the console to the folder teleporteos in which you can install the modules (**run the following command again if it fails**) ``` -yarn install +sudo yarn install ``` -Install and start Docker, open its menu by double clicking the icon in the task bar and go to settings ⚙️. + +## Set up docker +Install and start Docker, check for updates and install them. Open Dockers menu by double clicking the icon in the task bar and go to settings ⚙️. Check "Use the WSL 2 based engine" Enable Debian in the settings at Resources / WSL INTEGRATION +## Usage + Run the tests with the following command in the debian console ``` -yarn test +sudo yarn test ``` \ No newline at end of file diff --git a/contracts/teleporteos/contracts/teleport/teleporteos.cpp b/contracts/teleporteos/contracts/teleport/teleporteos.cpp index 6cab62d..76c0e0b 100644 --- a/contracts/teleporteos/contracts/teleport/teleporteos.cpp +++ b/contracts/teleporteos/contracts/teleport/teleporteos.cpp @@ -3,43 +3,55 @@ using namespace alienworlds; teleporteos::teleporteos(name s, name code, datastream ds) - : contract(s, code, ds), _deposits(get_self(), get_self().value), - _oracles(get_self(), get_self().value), - _receipts(get_self(), get_self().value), - _teleports(get_self(), get_self().value), - _cancels(get_self(), get_self().value) {} - -/* Notifications for tlm transfer */ -void teleporteos::transfer(name from, name to, asset quantity, string memo) { - if (to == get_self()) { - check(quantity.amount >= 100'0000, "Transfer is below minimum of 100 TLM"); - - auto deposit = _deposits.find(from.value); - if (deposit == _deposits.end()) { - _deposits.emplace(get_self(), [&](auto &d) { - d.account = from; - d.quantity = quantity; - }); - } else { - _deposits.modify(deposit, get_self(), - [&](auto &d) { d.quantity += quantity; }); - } + : contract(s, code, ds), + _stats(get_self(), get_self().value), + _deposits(get_self(), get_self().value), + _oracles(get_self(), get_self().value), + _receipts(get_self(), get_self().value), + _teleports(get_self(), get_self().value), + _cancels(get_self(), get_self().value) {} + +ACTION teleporteos::ini(const asset min, const uint64_t fixfee, const double varfee, const bool freeze){ + require_auth(get_self()); + _stats.emplace(get_self(), [&](auto &s) { + s.symbol = TOKEN_SYMBOL; + s.min = min.amount; + s.fixfee = 0; + s.varfee = varfee; + s.collected = 0; + s.fin = freeze; + s.fout = freeze; + s.foracles = freeze; + s.fcancel = freeze; + s.oracles = 0; + }); +} + +/* Notifications for token transfer */ +ACTION teleporteos::transfer(name from, name to, asset quantity, string memo) { + if (to == get_self() && TOKEN_SYMBOL == quantity.symbol) { + auto stat = _stats.find(TOKEN_SYMBOL.raw()); + check(quantity.amount >= stat->min, "Transfer is below minimum token amount"); + check(!stat->fin, "Token transfer is currently deactivated"); + + addDeposit(from, quantity); } } -void teleporteos::withdraw(name account, asset quantity) { +ACTION teleporteos::withdraw(name account, asset quantity) { require_auth(account); auto deposit = _deposits.find(account.value); - check(deposit != _deposits.end(), - "Deposit not found, please transfer the tokens first"); + check(deposit != _deposits.end(), "Deposit not found, please transfer the tokens first"); check(deposit->quantity >= quantity, "Withdraw amount exceeds deposit"); + auto stat = _stats.find(TOKEN_SYMBOL.raw()); + check(!stat->fout, "Withdraw is currently deactivated"); + if (deposit->quantity == quantity) { _deposits.erase(deposit); } else { - _deposits.modify(*deposit, same_payer, - [&](auto &d) { d.quantity -= quantity; }); + _deposits.modify(*deposit, same_payer, [&](auto &d) { d.quantity -= quantity; }); } string memo = "Return of deposit"; @@ -48,27 +60,34 @@ void teleporteos::withdraw(name account, asset quantity) { .send(); } -void teleporteos::teleport(name from, asset quantity, uint8_t chain_id, - checksum256 eth_address) { +ACTION teleporteos::teleport(name from, asset quantity, uint8_t chain_id, checksum256 eth_address) { require_auth(from); check(quantity.is_valid(), "Amount is not valid"); - check(quantity.amount >= 100'0000, "Transfer is below minimum of 100 TLM"); + + auto stat = _stats.find(TOKEN_SYMBOL.raw()); + check(quantity.amount >= stat->min, "Transfer is below minimum token amount"); + check(!stat->fin, "Teleport is currently deactivated"); auto deposit = _deposits.find(from.value); - check(deposit != _deposits.end(), - "Deposit not found, please transfer the tokens first"); + check(deposit != _deposits.end(), "Deposit not found, please transfer the tokens first"); check(deposit->quantity >= quantity, "Not enough deposited"); - // tokens owned by this contract are inaccessible so just remove the deposit - // record + // Reduce the deposit amount by the teleport amount and delete the deposit if it would be zero if (deposit->quantity == quantity) { _deposits.erase(deposit); } else { - _deposits.modify(*deposit, same_payer, - [&](auto &d) { d.quantity -= quantity; }); + _deposits.modify(*deposit, same_payer, [&](auto &d) { d.quantity -= quantity; }); } + // Pay fee + uint64_t fee = calc_fee(stat, quantity.amount); + _stats.modify(*stat, get_self(), [&](auto &s) { + s.collected += fee; + }); + quantity.amount -= fee; + + // Emplace teleport uint64_t next_teleport_id = _teleports.available_primary_key(); uint32_t now = current_time_point().sec_since_epoch(); _teleports.emplace(from, [&](auto &t) { @@ -88,7 +107,7 @@ void teleporteos::teleport(name from, asset quantity, uint8_t chain_id, } /* Cancels a teleport after 30 days and no claim */ -void teleporteos::cancel(uint64_t id) { +ACTION teleporteos::cancel(uint64_t id) { auto teleport = _teleports.find(id); check(teleport != _teleports.end(), "Teleport not found"); @@ -104,6 +123,9 @@ void teleporteos::cancel(uint64_t id) { auto existing = _cancels.find(id); check(existing == _cancels.end(), "Teleport has already been cancelled"); + auto stat = _stats.find(TOKEN_SYMBOL.raw()); + check(!stat->fcancel, "Cancelation is deactivated"); + _cancels.emplace(teleport->account, [&](auto &c) { c.teleport_id = id; }); string memo = "Cancel teleport"; @@ -112,17 +134,17 @@ void teleporteos::cancel(uint64_t id) { .send(); } -void teleporteos::logteleport(uint64_t id, uint32_t timestamp, name from, - asset quantity, uint8_t chain_id, - checksum256 eth_address) { +ACTION teleporteos::logteleport(uint64_t id, uint32_t timestamp, name from, asset quantity, uint8_t chain_id, checksum256 eth_address) { // Logs the teleport id for the oracle to listen to require_auth(get_self()); } -void teleporteos::sign(name oracle_name, uint64_t id, string signature) { +ACTION teleporteos::sign(name oracle_name, uint64_t id, string signature) { // Signs receipt of tokens, these signatures must be passed to the eth // blockchain in the claim function on the eth contract require_oracle(oracle_name); + auto stat = _stats.find(TOKEN_SYMBOL.raw()); + check(!stat->foracles, "Oracle actions are freezed"); auto teleport = _teleports.find(id); check(teleport != _teleports.end(), "Teleport not found"); @@ -137,10 +159,11 @@ void teleporteos::sign(name oracle_name, uint64_t id, string signature) { }); } -// Receiving TLM from BSC/ETH -void teleporteos::received(name oracle_name, name to, checksum256 ref, - asset quantity, uint8_t chain_id, bool confirmed) { +// Receiving token from BSC/ETH +ACTION teleporteos::received(name oracle_name, name to, checksum256 ref, asset quantity, uint8_t chain_id, bool confirmed) { require_oracle(oracle_name); + auto stat = _stats.find(TOKEN_SYMBOL.raw()); + check(!stat->foracles, "Oracle actions are freezed"); auto ref_ind = _receipts.get_index<"byref"_n>(); auto receipt = ref_ind.find(ref); @@ -170,15 +193,20 @@ void teleporteos::received(name oracle_name, name to, checksum256 ref, check(receipt->quantity == quantity, "Quantity mismatch"); check(receipt->to == to, "Account mismatch"); - auto existing = find(receipt->approvers.begin(), receipt->approvers.end(), - oracle_name); - check(existing == receipt->approvers.end(), - "Oracle has already approved"); + auto existing = find(receipt->approvers.begin(), receipt->approvers.end(), oracle_name); + check(existing == receipt->approvers.end(), "Oracle has already approved"); bool completed = false; - if (receipt->confirmations >= - ORACLE_CONFIRMATIONS - - 1) { // check for one less because of this confirmation + + if (receipt->confirmations >= ORACLE_CONFIRMATIONS - 1) { // check for one less because of this confirmation + // Pay fee + uint64_t fee = calc_fee(stat, quantity.amount); + _stats.modify(*stat, get_self(), [&](auto &s) { + s.collected += fee; + }); + quantity.amount -= fee; + + // Pay out recipient string memo = "Teleport"; action(permission_level{get_self(), "active"_n}, TOKEN_CONTRACT, "transfer"_n, make_tuple(get_self(), to, quantity, memo)) @@ -198,8 +226,7 @@ void teleporteos::received(name oracle_name, name to, checksum256 ref, } } -void teleporteos::repairrec(uint64_t id, asset quantity, vector approvers, - bool completed) { +ACTION teleporteos::repairrec(uint64_t id, asset quantity, vector approvers, bool completed) { require_auth(get_self()); auto receipt = _receipts.require_find(id, "Receipt does not exist."); @@ -218,10 +245,12 @@ void teleporteos::repairrec(uint64_t id, asset quantity, vector approvers, /* * Marks a teleport as claimed */ -void teleporteos::claimed(name oracle_name, uint64_t id, checksum256 to_eth, - asset quantity) { +ACTION teleporteos::claimed(name oracle_name, uint64_t id, checksum256 to_eth, asset quantity) { require_oracle(oracle_name); + auto stat = _stats.find(TOKEN_SYMBOL.raw()); + check(!stat->foracles, "Oracle actions are freezed"); + auto teleport = _teleports.find(id); check(teleport != _teleports.end(), "Teleport not found"); @@ -232,24 +261,32 @@ void teleporteos::claimed(name oracle_name, uint64_t id, checksum256 to_eth, _teleports.modify(*teleport, same_payer, [&](auto &t) { t.claimed = true; }); } -void teleporteos::regoracle(name oracle_name) { +ACTION teleporteos::regoracle(name oracle_name) { require_auth(get_self()); check(is_account(oracle_name), "Oracle account does not exist"); _oracles.emplace(get_self(), [&](auto &o) { o.account = oracle_name; }); + + auto stat = _stats.find(TOKEN_SYMBOL.raw()); + _stats.modify(*stat, same_payer, [&](auto &s) { s.oracles++; }); } -void teleporteos::unregoracle(name oracle_name) { +ACTION teleporteos::unregoracle(name oracle_name) { require_auth(get_self()); auto oracle = _oracles.find(oracle_name.value); check(oracle != _oracles.end(), "Oracle does not exist"); _oracles.erase(oracle); + + auto stat = _stats.find(TOKEN_SYMBOL.raw()); + _stats.modify(*stat, same_payer, [&](auto &s) { + s.oracles--; + }); } -void teleporteos::delreceipts() { +ACTION teleporteos::delreceipts() { require_auth(get_self()); auto receipt = _receipts.begin(); @@ -258,7 +295,7 @@ void teleporteos::delreceipts() { } } -void teleporteos::delteles() { +ACTION teleporteos::delteles() { require_auth(get_self()); auto tp = _teleports.begin(); @@ -267,9 +304,86 @@ void teleporteos::delteles() { } } +ACTION teleporteos::freeze(const bool in, const bool out, const bool oracles, const bool cancel){ + require_auth(get_self()); + auto stat = _stats.find(TOKEN_SYMBOL.raw()); + _stats.modify(*stat, same_payer, [&](auto &s) { + s.fin = in; + s.fout = out; + s.foracles = oracles; + s.fcancel = cancel; + }); +} + +ACTION teleporteos::changemin(const asset min){ + require_auth(get_self()); + + check(min.symbol == TOKEN_SYMBOL, "Wrong token"); + + auto stat = _stats.find(TOKEN_SYMBOL.raw()); + uint64_t fee = calc_fee(stat, min.amount); + check(fee < min.amount, "Fees are too high relative to the minimum amount of token transfers"); + + _stats.modify(*stat, same_payer, [&](auto &s) { + s.min = min.amount; + }); +} + +ACTION teleporteos::changefee(const asset fixfee, const double varfee){ + require_auth(get_self()); + auto stat = _stats.find(TOKEN_SYMBOL.raw()); + check(fixfee.symbol == TOKEN_SYMBOL, "Wrong token"); + check(varfee <= 0.2 && varfee >= 0, "Variable fee has to be between 0 and 0.20"); + + payOffOracles(stat); + + _stats.modify(*stat, same_payer, [&](auto &s) { + s.fixfee = fixfee.amount; + s.varfee = varfee; + s.collected = 0; + }); + + uint64_t fee = calc_fee(stat, stat->min); + check(fee < stat->min, "Fees are too high relative to the minimum amount of token transfers"); +} + +ACTION teleporteos::payoracles(){ + auto stat = _stats.find(TOKEN_SYMBOL.raw()); + payOffOracles(stat); +} + /* Private */ -void teleporteos::require_oracle(name account) { +void teleporteos::require_oracle(const name account) { require_auth(account); _oracles.get(account.value, "Account is not an oracle"); } + +uint64_t teleporteos::calc_fee(stats_table::const_iterator stat, const uint64_t amount){ + uint64_t fee = ((uint64_t)(amount * stat->varfee)) + stat->fixfee; + if(fee > amount){ + fee = amount; + } + return fee; +} + +void teleporteos::addDeposit(const name from, const asset quantity){ + auto deposit = _deposits.find(from.value); + if (deposit == _deposits.end()) { + _deposits.emplace(get_self(), [&](auto &d) { + d.account = from; + d.quantity = quantity; + }); + } else { + _deposits.modify(deposit, get_self(), [&](auto &d) { d.quantity += quantity; }); + } +} + +void teleporteos::payOffOracles(stats_table::const_iterator stat){ + check(stat->oracles <= 0, "There are no oracles"); + uint64_t quantity = stat->collected / stat->oracles; + check(quantity == 0, "Pay off amount is too low"); + for (auto itr = _oracles.cbegin(); itr != _oracles.cend(); itr++) { + addDeposit(itr->account, asset(quantity, stat->symbol)); + } +} \ No newline at end of file diff --git a/contracts/teleporteos/contracts/teleport/teleporteos.hpp b/contracts/teleporteos/contracts/teleport/teleporteos.hpp index 7078246..7718d14 100644 --- a/contracts/teleporteos/contracts/teleport/teleporteos.hpp +++ b/contracts/teleporteos/contracts/teleport/teleporteos.hpp @@ -7,12 +7,30 @@ using namespace eosio; using namespace std; #define ORACLE_CONFIRMATIONS 3 -#define TOKEN_CONTRACT_STR "exampletoken" +#define TOKEN_CONTRACT_STR "alien.worlds" #define TOKEN_CONTRACT name(TOKEN_CONTRACT_STR) +#define TOKEN_SYMBOL symbol("TLM", 4) namespace alienworlds { class [[eosio::contract("teleporteos")]] teleporteos : public contract { private: + + struct [[eosio::table("stats")]] stats_item { + symbol symbol; // Symbol for the token + uint64_t min; // Minimum amount for token teleport + uint64_t fixfee; // Fix fee for teleports and receipts + double varfee; // Variable fee for teleports and receipts + uint64_t collected; // Collected fees which are not payed off yet + uint32_t oracles; // Amount of oracles + bool fin; // Freeze incoming funds + bool fout; // Freeze outgoing funds + bool foracles; // Freeze oracles + bool fcancel; // Freeze cancel action + + uint64_t primary_key() const { return symbol.raw(); } + }; + typedef multi_index stats_table; + /* Represents a user deposit before teleporting */ struct [[eosio::table("deposits")]] deposit_item { name account; @@ -20,7 +38,7 @@ class [[eosio::contract("teleporteos")]] teleporteos : public contract { uint64_t primary_key() const { return account.value; } }; - typedef multi_index<"deposits"_n, deposit_item> deposits_table; + typedef multi_index deposits_table; /* Represents a teleport in progress */ struct [[eosio::table("teleports")]] teleport_item { @@ -38,8 +56,8 @@ class [[eosio::contract("teleporteos")]] teleporteos : public contract { uint64_t by_account() const { return account.value; } }; typedef multi_index< - "teleports"_n, teleport_item, - indexed_by<"byaccount"_n, const_mem_fun>> teleports_table; @@ -48,7 +66,7 @@ class [[eosio::contract("teleporteos")]] teleporteos : public contract { uint64_t primary_key() const { return teleport_id; } }; - typedef multi_index<"cancels"_n, cancel_item> cancels_table; + typedef multi_index cancels_table; /* Oracles authorised to send receipts */ struct [[eosio::table("oracles")]] oracle_item { @@ -56,7 +74,7 @@ class [[eosio::contract("teleporteos")]] teleporteos : public contract { uint64_t primary_key() const { return account.value; } }; - typedef multi_index<"oracles"_n, oracle_item> oracles_table; + typedef multi_index oracles_table; /* Oracles authorised to send receipts */ struct [[eosio::table("receipts")]] receipt_item { @@ -75,24 +93,58 @@ class [[eosio::contract("teleporteos")]] teleporteos : public contract { checksum256 by_ref() const { return ref; } }; typedef multi_index< - "receipts"_n, receipt_item, - indexed_by<"byref"_n, const_mem_fun>, - indexed_by<"byto"_n, const_mem_fun>> + name("receipts"), receipt_item, + indexed_by>, + indexed_by>> receipts_table; + stats_table _stats; deposits_table _deposits; oracles_table _oracles; receipts_table _receipts; teleports_table _teleports; cancels_table _cancels; - void require_oracle(name account); + void require_oracle(const name account); + + /** + * @brief Calc fee amount + * + * @param stat Status table entry + * @param amount Initial amount + * @return Fee amount + */ + uint64_t calc_fee(stats_table::const_iterator stat, const uint64_t amount); + + /** + * @brief Add amount to a deposit. Create an entry if necessary + * + * @param from Deposit account + * @param quantity Asset of the deposit amount + */ + void addDeposit(const name from, const asset quantity); + + /** + * @brief Pay off all oracles + * @param stat + */ + void payOffOracles(stats_table::const_iterator stat); public: using contract::contract; teleporteos(name s, name code, datastream ds); + /** + * @brief Initialize this contract + * + * @param min Minimum amount for a token transfer + * @param fixfee Fix fee for teleports and receipts + * @param varfee Variable fee for teleports and receipts + * @param freeze Freeze all freezable actions + */ + ACTION ini(const asset min, const uint64_t fixfee, const double varfee, const bool freeze); + /* Fungible token transfer (only trilium) */ [[eosio::on_notify(TOKEN_CONTRACT_STR "::transfer")]] void transfer( name from, name to, asset quantity, string memo); @@ -105,6 +157,11 @@ class [[eosio::contract("teleporteos")]] teleporteos : public contract { ACTION repairrec(uint64_t id, asset quantity, vector approvers, bool completed); ACTION withdraw(name from, asset quantity); + /** + * @brief Cancel a teleport which is not claimed yet and 32 days old. Consider, you will not get back payed fees + * + * @param id Teleport id + */ ACTION cancel(uint64_t id); ACTION received(name oracle_name, name to, checksum256 ref, asset quantity, uint8_t chain_id, bool confirmed); @@ -115,5 +172,35 @@ class [[eosio::contract("teleporteos")]] teleporteos : public contract { ACTION sign(string signature); ACTION delreceipts(); ACTION delteles(); + + /** + * @brief Freeze specific actions + * + * @param in Freeze incoming funds + * @param out Freeze outgoing funds + * @param oracles Freeze oracles + * @param cancel Freeze cancel action + */ + ACTION freeze(const bool in, const bool out, const bool oracles, const bool cancel); + + /** + * @brief Change the minimum amount for a token transfer + * + * @param min Minimum amount + */ + ACTION changemin(const asset min); + + /** + * @brief Change fee + * + * @param fee New fee + * @return ACTION + */ + ACTION changefee(const asset fixfee, const double varfee); + + /** + * @brief Pay out the collected fees to the oracles. Everyone can run this action + */ + ACTION payoracles(); }; } // namespace alienworlds diff --git a/contracts/teleporteos/contracts/teleport/teleporteos.test.ts b/contracts/teleporteos/contracts/teleport/teleporteos.test.ts index 369cdb2..550123b 100644 --- a/contracts/teleporteos/contracts/teleport/teleporteos.test.ts +++ b/contracts/teleporteos/contracts/teleport/teleporteos.test.ts @@ -37,6 +37,11 @@ describe('teleporteos', async () => { before(async () => { await seedAccounts(); }); + context('initialize contract', async () => { + it('should succeed', async () => { + await teleporteos.ini('100.0000 TLM', 0, '0', false, { from: teleporteos.account }); + }); + }); context('regoracle', async () => { context('without correct auth', async () => { it('should fail with auth error', async () => { @@ -402,7 +407,7 @@ describe('teleporteos', async () => { teleporteos.teleport(sender1.name, '23.0000 TLM', 2, ethToken, { from: sender1, }), - 'Transfer is below minimum of 100 TLM' + 'Transfer is below minimum token amount' ); }); }); diff --git a/contracts/teleporteos/yarn.lock b/contracts/teleporteos/yarn.lock index dc0ef16..4c73ae3 100644 --- a/contracts/teleporteos/yarn.lock +++ b/contracts/teleporteos/yarn.lock @@ -340,6 +340,13 @@ chai-as-promised@^7.1.1: dependencies: check-error "^1.0.2" +chai-datetime@^1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/chai-datetime/-/chai-datetime-1.8.0.tgz#95a1ff58130f60f16f6d882ec5c014e63aa6d75f" + integrity sha512-qBG84K8oQNz8LWacuzmCBfdoeG2UBFfbGKTSQj6lS+sjuzGUdBvjJxfZfGA4zDAMiCSqApKcuqSLO0lQQ25cHw== + dependencies: + chai ">1.9.0" + chai@4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/chai/-/chai-4.2.0.tgz#760aa72cf20e3795e84b12877ce0e83737aa29e5" @@ -352,7 +359,7 @@ chai@4.2.0: pathval "^1.1.0" type-detect "^4.0.5" -chai@latest: +chai@>1.9.0, chai@latest: version "4.3.6" resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.6.tgz#ffe4ba2d9fa9d6680cc0b370adae709ec9011e9c" integrity sha512-bbcp3YfHCUzMOvKqsztczerVgBKSsEijCySNlHHbX3VG1nskvqjz5Rfso1gGwD6w6oOV3eI60pKuMOV5MV7p3Q== @@ -1392,6 +1399,13 @@ node-fetch@2.6.1: resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== +node-fetch@^2.0.0: + version "2.6.7" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" + integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== + dependencies: + whatwg-url "^5.0.0" + nodeify-ts@1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/nodeify-ts/-/nodeify-ts-1.0.6.tgz#ceef172c4fad1a45a1ae60a31c7e295150b5e221" @@ -1831,6 +1845,11 @@ to-regex-range@^5.0.1: dependencies: is-number "^7.0.0" +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= + trace@3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/trace/-/trace-3.1.1.tgz#061eebf012805611cb02138440bc716979b0eb11" @@ -1903,6 +1922,19 @@ wcwidth@^1.0.1: dependencies: defaults "^1.0.3" +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + integrity sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE= + +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + integrity sha1-lmRU6HZUYuN2RNNib2dCzotwll0= + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + which-boxed-primitive@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" From 9386e62f44928edf84094c6d1cc50d9e37156d3c Mon Sep 17 00:00:00 2001 From: Kevin Kei Tuncer Date: Fri, 15 Apr 2022 19:21:17 +0200 Subject: [PATCH 08/24] EOS Contract: - Adjustable amount of threshold - Check parameters of ini action - Delete all cancels and claimed teleports until a specific id --- contracts/teleporteos/README.md | 43 +++++++++-- .../contracts/teleport/teleporteos.cpp | 59 ++++++++++++--- .../contracts/teleport/teleporteos.hpp | 36 +++++----- .../contracts/teleport/teleporteos.test.ts | 72 +++++++++---------- 4 files changed, 141 insertions(+), 69 deletions(-) diff --git a/contracts/teleporteos/README.md b/contracts/teleporteos/README.md index a0ee640..d50e51e 100644 --- a/contracts/teleporteos/README.md +++ b/contracts/teleporteos/README.md @@ -1,6 +1,39 @@ +# New features +- Optional fix and variable fees which fund the oracles +- Freeze options for specific parts of the contract +- Adjustable amount of needed oracle confirmations for a receiving teleport +- Adjustable minimum amount for deposits and teleports +- Option to delete old teleport and cancel entries without losing consensus + +# Deployment and initialization + +1. Deploy the contract +2. Run the ini action of the contract with the following parameters +``` +ACTION ini(asset min, uint64_t fixfee, double varfee, bool freeze, uint32_t threshold); +``` +- ***min*** Minimum amount for a deposit and teleport +- ***fixfee*** Fix fee for teleports and receipts. Together with the variable fee (varfee) the resulting fee has to be less than minimum transfer amount (min). +- ***varfee*** Variable fee for teleports and receipts. This has to be between 0 and 0.20 which equals to 0% and 20%. +- ***freeze*** True to freeze the contract until you unfreeze it with the freeze action. +- ***threshold*** Amount of needed oracle confirmations for a receiving teleport + +With the freeze action you can freeze and unfreeze specific parts of the contract +``` +ACTION freeze(const bool in, const bool out, const bool oracles, const bool cancel); +``` +- ***in*** True to freeze incoming funds, false to unfreeze +- ***out*** True to freeze outgoing funds, false to unfreeze +- ***oracles*** True to freeze oracles, false to unfreeze +- ***cancel*** True to freeze cancel action, false to unfreeze + +## Upgrade from running teleport contract of alien world + +Just deploy the contract over the old teleport contract account and run the ini action. (In this upgrade the old table structures are not changed. There are only new tables) + # Install test suite on windows -You need to activate the windows feature Hyper-V, but it is not available on Windows 10 Home. SO you might need to upgrade your Windows to Windows Pro. +You need to activate the windows feature Hyper-V, but it is not available on Windows 10 Home. So you might need to upgrade your Windows to Windows Pro. ## Activate WSL 2 Start windows PowerShell as administrator and run the following commands @@ -16,8 +49,8 @@ dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /nores wsl --set-default-version 2 ``` -## Set up linux environment -Install Debian from microsoft store, start it, create your user account and run the following commands +## Set up Linux environment +Install Debian from Microsoft store, start it, create your user account and run the following commands ``` sudo apt-get update ``` @@ -44,9 +77,9 @@ Check "Use the WSL 2 based engine" Enable Debian in the settings at Resources / WSL INTEGRATION -## Usage +## Run tests -Run the tests with the following command in the debian console +Docker must be running. Start the tests with the following command in the debian console ``` sudo yarn test ``` \ No newline at end of file diff --git a/contracts/teleporteos/contracts/teleport/teleporteos.cpp b/contracts/teleporteos/contracts/teleport/teleporteos.cpp index 76c0e0b..3b6318b 100644 --- a/contracts/teleporteos/contracts/teleport/teleporteos.cpp +++ b/contracts/teleporteos/contracts/teleport/teleporteos.cpp @@ -11,9 +11,15 @@ teleporteos::teleporteos(name s, name code, datastream ds) _teleports(get_self(), get_self().value), _cancels(get_self(), get_self().value) {} -ACTION teleporteos::ini(const asset min, const uint64_t fixfee, const double varfee, const bool freeze){ +ACTION teleporteos::ini(const asset min, const asset fixfee, const double varfee, const bool freeze, const uint32_t threshold){ require_auth(get_self()); - _stats.emplace(get_self(), [&](auto &s) { + + check(min.symbol == TOKEN_SYMBOL, "Wrong token symbol of min amount"); + check(fixfee.symbol == TOKEN_SYMBOL, "Wrong token symbol of fee"); + check(threshold > 0, "Needed confirmation amount has to be grater than 0"); + check(varfee <= 0.2 && varfee >= 0, "Variable fee has to be between 0 and 0.20"); + + auto stat = _stats.emplace(get_self(), [&](auto &s) { s.symbol = TOKEN_SYMBOL; s.min = min.amount; s.fixfee = 0; @@ -24,7 +30,11 @@ ACTION teleporteos::ini(const asset min, const uint64_t fixfee, const double var s.foracles = freeze; s.fcancel = freeze; s.oracles = 0; + s.threshold = threshold; }); + + uint64_t fee = calc_fee(stat, min.amount); + check(fee < min.amount, "Fees are too high relative to the minimum amount of token transfers"); } /* Notifications for token transfer */ @@ -198,7 +208,7 @@ ACTION teleporteos::received(name oracle_name, name to, checksum256 ref, asset q bool completed = false; - if (receipt->confirmations >= ORACLE_CONFIRMATIONS - 1) { // check for one less because of this confirmation + if (receipt->confirmations >= stat->threshold - 1) { // check for one less because of this confirmation // Pay fee uint64_t fee = calc_fee(stat, quantity.amount); _stats.modify(*stat, get_self(), [&](auto &s) { @@ -295,12 +305,27 @@ ACTION teleporteos::delreceipts() { } } -ACTION teleporteos::delteles() { +ACTION teleporteos::delteles(uint64_t to_id) { require_auth(get_self()); + auto del_to = _teleports.find(to_id); + check(del_to != _teleports.end(), "Teleport id not found"); + + // Delete all cancels and regarding teleports which id is less than to_id + auto ci = _cancels.begin(); + while (ci != _cancels.end() && ci->teleport_id < to_id) { + auto tp = _teleports.find(ci->teleport_id); + if(tp != _teleports.end()){ + _teleports.erase(tp); + } + ci = _cancels.erase(ci); + } + // Delete all remaining teleports which are claimed and id is less than to_id auto tp = _teleports.begin(); - while (tp != _teleports.end()) { - tp = _teleports.erase(tp); + while (tp != del_to) { + if(tp->claimed){ + tp = _teleports.erase(tp); + } } } @@ -315,7 +340,7 @@ ACTION teleporteos::freeze(const bool in, const bool out, const bool oracles, co }); } -ACTION teleporteos::changemin(const asset min){ +ACTION teleporteos::setmin(const asset min){ require_auth(get_self()); check(min.symbol == TOKEN_SYMBOL, "Wrong token"); @@ -329,13 +354,13 @@ ACTION teleporteos::changemin(const asset min){ }); } -ACTION teleporteos::changefee(const asset fixfee, const double varfee){ +ACTION teleporteos::setfee(const asset fixfee, const double varfee){ require_auth(get_self()); auto stat = _stats.find(TOKEN_SYMBOL.raw()); check(fixfee.symbol == TOKEN_SYMBOL, "Wrong token"); check(varfee <= 0.2 && varfee >= 0, "Variable fee has to be between 0 and 0.20"); - payOffOracles(stat); + paymentsToOracles(stat); _stats.modify(*stat, same_payer, [&](auto &s) { s.fixfee = fixfee.amount; @@ -347,9 +372,21 @@ ACTION teleporteos::changefee(const asset fixfee, const double varfee){ check(fee < stat->min, "Fees are too high relative to the minimum amount of token transfers"); } +ACTION teleporteos::setthreshold(const uint32_t threshold){ + require_auth(get_self()); + check(threshold > 0, "Needed confirmation amount has to be grater than 0"); + auto stat = _stats.find(TOKEN_SYMBOL.raw()); + _stats.modify(*stat, same_payer, [&](auto &s) { + s.threshold = threshold; + }); +} + ACTION teleporteos::payoracles(){ auto stat = _stats.find(TOKEN_SYMBOL.raw()); - payOffOracles(stat); + paymentsToOracles(stat); + _stats.modify(*stat, same_payer, [&](auto &s) { + s.collected = 0; + }); } /* Private */ @@ -379,7 +416,7 @@ void teleporteos::addDeposit(const name from, const asset quantity){ } } -void teleporteos::payOffOracles(stats_table::const_iterator stat){ +void teleporteos::paymentsToOracles(stats_table::const_iterator stat){ check(stat->oracles <= 0, "There are no oracles"); uint64_t quantity = stat->collected / stat->oracles; check(quantity == 0, "Pay off amount is too low"); diff --git a/contracts/teleporteos/contracts/teleport/teleporteos.hpp b/contracts/teleporteos/contracts/teleport/teleporteos.hpp index 7718d14..a600d7b 100644 --- a/contracts/teleporteos/contracts/teleport/teleporteos.hpp +++ b/contracts/teleporteos/contracts/teleport/teleporteos.hpp @@ -6,7 +6,6 @@ using namespace eosio; using namespace std; -#define ORACLE_CONFIRMATIONS 3 #define TOKEN_CONTRACT_STR "alien.worlds" #define TOKEN_CONTRACT name(TOKEN_CONTRACT_STR) #define TOKEN_SYMBOL symbol("TLM", 4) @@ -22,6 +21,7 @@ class [[eosio::contract("teleporteos")]] teleporteos : public contract { double varfee; // Variable fee for teleports and receipts uint64_t collected; // Collected fees which are not payed off yet uint32_t oracles; // Amount of oracles + uint32_t threshold; // Amount of oracle confirmations which are needed to confirm a received teleport bool fin; // Freeze incoming funds bool fout; // Freeze outgoing funds bool foracles; // Freeze oracles @@ -125,10 +125,10 @@ class [[eosio::contract("teleporteos")]] teleporteos : public contract { void addDeposit(const name from, const asset quantity); /** - * @brief Pay off all oracles + * @brief Send payments to all oracles * @param stat */ - void payOffOracles(stats_table::const_iterator stat); + void paymentsToOracles(stats_table::const_iterator stat); public: using contract::contract; @@ -143,16 +143,13 @@ class [[eosio::contract("teleporteos")]] teleporteos : public contract { * @param varfee Variable fee for teleports and receipts * @param freeze Freeze all freezable actions */ - ACTION ini(const asset min, const uint64_t fixfee, const double varfee, const bool freeze); + ACTION ini(const asset min, const asset fixfee, const double varfee, const bool freeze, const uint32_t threshold); /* Fungible token transfer (only trilium) */ - [[eosio::on_notify(TOKEN_CONTRACT_STR "::transfer")]] void transfer( - name from, name to, asset quantity, string memo); + [[eosio::on_notify(TOKEN_CONTRACT_STR "::transfer")]] void transfer(name from, name to, asset quantity, string memo); - ACTION teleport(name from, asset quantity, uint8_t chain_id, - checksum256 eth_address); - ACTION logteleport(uint64_t id, uint32_t timestamp, name from, asset quantity, - uint8_t chain_id, checksum256 eth_address); + ACTION teleport(name from, asset quantity, uint8_t chain_id, checksum256 eth_address); + ACTION logteleport(uint64_t id, uint32_t timestamp, name from, asset quantity, uint8_t chain_id, checksum256 eth_address); ACTION sign(name oracle_name, uint64_t id, string signature); ACTION repairrec(uint64_t id, asset quantity, vector approvers, bool completed); @@ -163,15 +160,13 @@ class [[eosio::contract("teleporteos")]] teleporteos : public contract { * @param id Teleport id */ ACTION cancel(uint64_t id); - ACTION received(name oracle_name, name to, checksum256 ref, asset quantity, - uint8_t chain_id, bool confirmed); - ACTION claimed(name oracle_name, uint64_t id, checksum256 to_eth, - asset quantity); + ACTION received(name oracle_name, name to, checksum256 ref, asset quantity, uint8_t chain_id, bool confirmed); + ACTION claimed(name oracle_name, uint64_t id, checksum256 to_eth, asset quantity); ACTION regoracle(name oracle_name); ACTION unregoracle(name oracle_name); ACTION sign(string signature); ACTION delreceipts(); - ACTION delteles(); + ACTION delteles(uint64_t to_id); /** * @brief Freeze specific actions @@ -188,7 +183,7 @@ class [[eosio::contract("teleporteos")]] teleporteos : public contract { * * @param min Minimum amount */ - ACTION changemin(const asset min); + ACTION setmin(const asset min); /** * @brief Change fee @@ -196,7 +191,14 @@ class [[eosio::contract("teleporteos")]] teleporteos : public contract { * @param fee New fee * @return ACTION */ - ACTION changefee(const asset fixfee, const double varfee); + ACTION setfee(const asset fixfee, const double varfee); + + /** + * @brief Change the amount of needed confirmations + * + * @param confirms New amount of needed confirations + */ + ACTION setthreshold(const uint32_t threshold); /** * @brief Pay out the collected fees to the oracles. Everyone can run this action diff --git a/contracts/teleporteos/contracts/teleport/teleporteos.test.ts b/contracts/teleporteos/contracts/teleport/teleporteos.test.ts index 550123b..e6089d9 100644 --- a/contracts/teleporteos/contracts/teleport/teleporteos.test.ts +++ b/contracts/teleporteos/contracts/teleport/teleporteos.test.ts @@ -20,8 +20,9 @@ import { Teleporteos } from './teleporteos'; import { EosioToken } from '../eosio.token/eosio.token'; import { assert } from 'console'; -const ethToken = - '2222222222222222222222222222222222222222222222222222222222222222'; +const ethToken = '2222222222222222222222222222222222222222222222222222222222222222'; + +const token_symbol = 'TLM'; let teleporteos: Teleporteos; let alienworldsToken: EosioToken; @@ -39,7 +40,7 @@ describe('teleporteos', async () => { }); context('initialize contract', async () => { it('should succeed', async () => { - await teleporteos.ini('100.0000 TLM', 0, '0', false, { from: teleporteos.account }); + await teleporteos.ini(`100.0000 ${token_symbol}`, `0.0000 ${token_symbol}`, '0', false, 3, { from: teleporteos.account }); }); }); context('regoracle', async () => { @@ -112,7 +113,7 @@ describe('teleporteos', async () => { sender1.name, sender1.name, '1111111111111111111111111111111111111111111111111111111111111111', - '123.0000 TLM', + `123.0000 ${token_symbol}`, 2, true, { @@ -131,7 +132,7 @@ describe('teleporteos', async () => { oracle3.name, sender1.name, '1111111111111111111111111111111111111111111111111111111111111111', - '123.0000 TLM', + `123.0000 ${token_symbol}`, 2, true, { @@ -147,7 +148,7 @@ describe('teleporteos', async () => { oracle3.name, sender1.name, '1111111111111111111111111111111111111111111111111111111111111111', - '123.0000 TLM', + `123.0000 ${token_symbol}`, 2, true, { @@ -164,7 +165,7 @@ describe('teleporteos', async () => { confirmations: 1, date: new Date(), id: 0, - quantity: '123.0000 TLM', + quantity: `123.0000 ${token_symbol}`, ref: '1111111111111111111111111111111111111111111111111111111111111111', to: sender1.name, }, @@ -178,7 +179,7 @@ describe('teleporteos', async () => { oracle1.name, sender1.name, '1111111111111111111111111111111111111111111111111111111111111111', - '123.0000 TLM', + `123.0000 ${token_symbol}`, 2, true, { @@ -194,7 +195,7 @@ describe('teleporteos', async () => { oracle3.name, sender1.name, '1111111111111111111111111111111111111111111111111111111111111111', - '0.1230 TLM', + `0.1230 ${token_symbol}`, 2, true, { @@ -212,7 +213,7 @@ describe('teleporteos', async () => { oracle3.name, sender2.name, '1111111111111111111111111111111111111111111111111111111111111111', - '123.0000 TLM', + `123.0000 ${token_symbol}`, 2, true, { @@ -230,7 +231,7 @@ describe('teleporteos', async () => { oracle3.name, sender1.name, '1111111111111111111111111111111111111111111111111111111111111111', - '123.0000 TLM', + `123.0000 ${token_symbol}`, 2, true, { @@ -247,7 +248,7 @@ describe('teleporteos', async () => { oracle2.name, sender1.name, '1111111111111111111111111111111111111111111111111111111111111111', - '123.0000 TLM', + `123.0000 ${token_symbol}`, 2, true, { @@ -260,7 +261,7 @@ describe('teleporteos', async () => { alienworldsToken.accountsTable({ scope: sender1.name }), [ { - balance: '1000123.0000 TLM', + balance: `1000123.0000 ${token_symbol}`, }, ] ); @@ -274,7 +275,7 @@ describe('teleporteos', async () => { confirmations: 3, date: new Date(), id: 0, - quantity: '123.0000 TLM', + quantity: `123.0000 ${token_symbol}`, ref: '1111111111111111111111111111111111111111111111111111111111111111', to: sender1.name, }, @@ -288,7 +289,7 @@ describe('teleporteos', async () => { oracle1.name, sender1.name, '1111111111111111111111111111111111111111111111111111111111111112', - '0.1230 TLM', + `0.1230 ${token_symbol}`, 2, true, { @@ -299,7 +300,7 @@ describe('teleporteos', async () => { context('with wrong auth', async () => { it('should fail', async () => { await assertMissingAuthority( - teleporteos.repairrec(1, '123.0000 TLM', [oracle1.name], true, { + teleporteos.repairrec(1, `123.0000 ${token_symbol}`, [oracle1.name], true, { from: sender1, }) ); @@ -309,7 +310,7 @@ describe('teleporteos', async () => { context('with non-existing receipt', async () => { it('should fail', async () => { await assertEOSErrorIncludesMessage( - teleporteos.repairrec(4, '123.0000 TLM', [oracle1.name], true, { + teleporteos.repairrec(4, `123.0000 ${token_symbol}`, [oracle1.name], true, { from: teleporteos.account, }), 'Receipt does not exist.' @@ -331,7 +332,7 @@ describe('teleporteos', async () => { context('with negative quantity', async () => { it('should fail', async () => { await assertEOSErrorIncludesMessage( - teleporteos.repairrec(1, '-123.0000 TLM', [oracle1.name], true, { + teleporteos.repairrec(1, `-123.0000 ${token_symbol}`, [oracle1.name], true, { from: teleporteos.account, }), 'Quantity cannot be negative' @@ -342,7 +343,7 @@ describe('teleporteos', async () => { it('should succeed', async () => { await teleporteos.repairrec( 1, - '124.0000 TLM', + `124.0000 ${token_symbol}`, [oracle1.name], false, { @@ -359,7 +360,7 @@ describe('teleporteos', async () => { confirmations: 3, date: new Date(), id: 0, - quantity: '123.0000 TLM', + quantity: `123.0000 ${token_symbol}`, ref: '1111111111111111111111111111111111111111111111111111111111111111', to: sender1.name, }, @@ -370,7 +371,7 @@ describe('teleporteos', async () => { confirmations: 1, date: new Date(), id: 1, - quantity: '124.0000 TLM', + quantity: `124.0000 ${token_symbol}`, ref: '1111111111111111111111111111111111111111111111111111111111111112', to: sender1.name, }, @@ -383,10 +384,9 @@ describe('teleporteos', async () => { context('without valid auth', async () => { it('should fail with auth error', async () => { await assertMissingAuthority( - teleporteos.teleport(sender1.name, '123.0000 TLM', 2, ethToken, { + teleporteos.teleport(sender1.name, `123.0000 ${token_symbol}`, 2, ethToken, { from: sender2, - }), - '' + }) ); }); }); @@ -404,7 +404,7 @@ describe('teleporteos', async () => { context('with amount below minimum', async () => { it('should fail with below min error error', async () => { await assertEOSErrorIncludesMessage( - teleporteos.teleport(sender1.name, '23.0000 TLM', 2, ethToken, { + teleporteos.teleport(sender1.name, `23.0000 ${token_symbol}`, 2, ethToken, { from: sender1, }), 'Transfer is below minimum token amount' @@ -414,7 +414,7 @@ describe('teleporteos', async () => { context('with no available deposit', async () => { it('should fail with no deposit error', async () => { await assertEOSErrorIncludesMessage( - teleporteos.teleport(sender1.name, '123.0000 TLM', 2, ethToken, { + teleporteos.teleport(sender1.name, `123.0000 ${token_symbol}`, 2, ethToken, { from: sender1, }), 'Deposit not found' @@ -426,14 +426,14 @@ describe('teleporteos', async () => { await alienworldsToken.transfer( sender1.name, teleporteos.account.name, - '120.0000 TLM', + `120.0000 ${token_symbol}`, 'teleport test', { from: sender1 } ); }); it('should fail with not enough deposit error', async () => { await assertEOSErrorIncludesMessage( - teleporteos.teleport(sender1.name, '123.0000 TLM', 2, ethToken, { + teleporteos.teleport(sender1.name, `123.0000 ${token_symbol}`, 2, ethToken, { from: sender1, }), 'Not enough deposited' @@ -445,7 +445,7 @@ describe('teleporteos', async () => { await alienworldsToken.transfer( sender1.name, teleporteos.account.name, - '104.0000 TLM', + `104.0000 ${token_symbol}`, 'teleport test extra amount', { from: sender1 } ); @@ -453,7 +453,7 @@ describe('teleporteos', async () => { it('should succeed', async () => { await teleporteos.teleport( sender1.name, - '123.0000 TLM', + `123.0000 ${token_symbol}`, 2, ethToken, { @@ -468,7 +468,7 @@ describe('teleporteos', async () => { chai.expect(item.account).equal(sender1.name); chai.expect(item.chain_id).equal(2); chai.expect(item.id).equal(0); - chai.expect(item.quantity).equal('123.0000 TLM'); + chai.expect(item.quantity).equal(`123.0000 ${token_symbol}`); chai.expect(item.eth_address).equal(ethToken); chai.expect(item.oracles).empty; chai.expect(item.signatures).empty; @@ -535,7 +535,7 @@ async function issueTokens() { try { await alienworldsToken.create( alienworldsToken.account.name, - '1000000000.0000 TLM', + `1000000000.0000 ${token_symbol}`, { from: alienworldsToken.account, } @@ -543,14 +543,14 @@ async function issueTokens() { await alienworldsToken.issue( alienworldsToken.account.name, - '10000000.0000 TLM', + `10000000.0000 ${token_symbol}`, 'initial deposit', { from: alienworldsToken.account, } ); } catch (e) { - if (e.json.error.what != 'eosio_assert_message assertion failure') { + if ((e as { json: {error: {what: string } } }).json.error.what != 'eosio_assert_message assertion failure') { throw e; } } @@ -558,7 +558,7 @@ async function issueTokens() { await alienworldsToken.transfer( alienworldsToken.account.name, sender1.name, - '1000000.0000 TLM', + `1000000.0000 ${token_symbol}`, 'inital balance', { from: alienworldsToken.account } ); @@ -566,7 +566,7 @@ async function issueTokens() { await alienworldsToken.transfer( alienworldsToken.account.name, teleporteos.account.name, - '1000000.0000 TLM', + `1000000.0000 ${token_symbol}`, 'inital balance', { from: alienworldsToken.account } ); From c185ff5ce42beaaf55c6e86864a0b09cd52af8cb Mon Sep 17 00:00:00 2001 From: Kevin Kei Tuncer Date: Sat, 16 Apr 2022 01:12:04 +0200 Subject: [PATCH 09/24] EOSIO Contract - delete receipts until a defined date - add some tests and solve some small bugs --- contracts/teleporteos/README.md | 3 +- .../contracts/teleport/teleporteos.cpp | 15 +- .../contracts/teleport/teleporteos.hpp | 19 +- .../contracts/teleport/teleporteos.test.ts | 177 +++++++++++++++++- 4 files changed, 198 insertions(+), 16 deletions(-) diff --git a/contracts/teleporteos/README.md b/contracts/teleporteos/README.md index d50e51e..992972c 100644 --- a/contracts/teleporteos/README.md +++ b/contracts/teleporteos/README.md @@ -29,7 +29,8 @@ ACTION freeze(const bool in, const bool out, const bool oracles, const bool canc ## Upgrade from running teleport contract of alien world -Just deploy the contract over the old teleport contract account and run the ini action. (In this upgrade the old table structures are not changed. There are only new tables) +Just deploy the contract over the old teleport contract account and run the ini action. +Note: In this upgrade are additional tables, the structure of the old tables is not changed. # Install test suite on windows diff --git a/contracts/teleporteos/contracts/teleport/teleporteos.cpp b/contracts/teleporteos/contracts/teleport/teleporteos.cpp index 3b6318b..c600295 100644 --- a/contracts/teleporteos/contracts/teleport/teleporteos.cpp +++ b/contracts/teleporteos/contracts/teleport/teleporteos.cpp @@ -18,6 +18,7 @@ ACTION teleporteos::ini(const asset min, const asset fixfee, const double varfee check(fixfee.symbol == TOKEN_SYMBOL, "Wrong token symbol of fee"); check(threshold > 0, "Needed confirmation amount has to be grater than 0"); check(varfee <= 0.2 && varfee >= 0, "Variable fee has to be between 0 and 0.20"); + check(_stats.find(TOKEN_SYMBOL.raw()) == _stats.end(), "Already initialized"); auto stat = _stats.emplace(get_self(), [&](auto &s) { s.symbol = TOKEN_SYMBOL; @@ -296,12 +297,16 @@ ACTION teleporteos::unregoracle(name oracle_name) { }); } -ACTION teleporteos::delreceipts() { +ACTION teleporteos::delreceipts(time_point_sec to_date) { require_auth(get_self()); auto receipt = _receipts.begin(); while (receipt != _receipts.end()) { - receipt = _receipts.erase(receipt); + if(receipt->date < to_date){ + receipt = _receipts.erase(receipt); + } else { + receipt++; + } } } @@ -317,7 +322,7 @@ ACTION teleporteos::delteles(uint64_t to_id) { if(tp != _teleports.end()){ _teleports.erase(tp); } - ci = _cancels.erase(ci); + ci = _cancels.erase(ci); } // Delete all remaining teleports which are claimed and id is less than to_id @@ -325,6 +330,8 @@ ACTION teleporteos::delteles(uint64_t to_id) { while (tp != del_to) { if(tp->claimed){ tp = _teleports.erase(tp); + } else { + tp++; } } } @@ -417,7 +424,7 @@ void teleporteos::addDeposit(const name from, const asset quantity){ } void teleporteos::paymentsToOracles(stats_table::const_iterator stat){ - check(stat->oracles <= 0, "There are no oracles"); + check(stat->oracles > 0, "There are no oracles"); uint64_t quantity = stat->collected / stat->oracles; check(quantity == 0, "Pay off amount is too low"); for (auto itr = _oracles.cbegin(); itr != _oracles.cend(); itr++) { diff --git a/contracts/teleporteos/contracts/teleport/teleporteos.hpp b/contracts/teleporteos/contracts/teleport/teleporteos.hpp index a600d7b..9a40cf7 100644 --- a/contracts/teleporteos/contracts/teleport/teleporteos.hpp +++ b/contracts/teleporteos/contracts/teleport/teleporteos.hpp @@ -151,8 +151,7 @@ class [[eosio::contract("teleporteos")]] teleporteos : public contract { ACTION teleport(name from, asset quantity, uint8_t chain_id, checksum256 eth_address); ACTION logteleport(uint64_t id, uint32_t timestamp, name from, asset quantity, uint8_t chain_id, checksum256 eth_address); ACTION sign(name oracle_name, uint64_t id, string signature); - ACTION repairrec(uint64_t id, asset quantity, vector approvers, - bool completed); + ACTION repairrec(uint64_t id, asset quantity, vector approvers, bool completed); ACTION withdraw(name from, asset quantity); /** * @brief Cancel a teleport which is not claimed yet and 32 days old. Consider, you will not get back payed fees @@ -165,7 +164,21 @@ class [[eosio::contract("teleporteos")]] teleporteos : public contract { ACTION regoracle(name oracle_name); ACTION unregoracle(name oracle_name); ACTION sign(string signature); - ACTION delreceipts(); + + /** + * @brief Delete all receipt entries until a specific date + * Note: Oracles have to ignore old receipts to avoid double spending + * + * @param to_date + */ + ACTION delreceipts(time_point_sec to_date); + + /** + * @brief Delete claimed and canceled teleports in teleport and cancel table + * Note: The last entry cannot be deleted, so the deletion causes no further risk of double spending + * + * @param to_id Delete all entries until this id. + */ ACTION delteles(uint64_t to_id); /** diff --git a/contracts/teleporteos/contracts/teleport/teleporteos.test.ts b/contracts/teleporteos/contracts/teleport/teleporteos.test.ts index e6089d9..6427976 100644 --- a/contracts/teleporteos/contracts/teleport/teleporteos.test.ts +++ b/contracts/teleporteos/contracts/teleport/teleporteos.test.ts @@ -39,8 +39,36 @@ describe('teleporteos', async () => { await seedAccounts(); }); context('initialize contract', async () => { - it('should succeed', async () => { - await teleporteos.ini(`100.0000 ${token_symbol}`, `0.0000 ${token_symbol}`, '0', false, 3, { from: teleporteos.account }); + context('without correct auth', async () => { + it('should fail with auth error', async () => { + await assertMissingAuthority( + teleporteos.ini(`100.0000 ${token_symbol}`, `0.0000 ${token_symbol}`, '0', false, 3, { from: sender1 }) + ); + }); + }); + context('with correct auth', async () => { + it('should succeed', async () => { + await teleporteos.ini(`100.0000 ${token_symbol}`, `0.0000 ${token_symbol}`, '0', false, 3, { from: teleporteos.account }); + }); + + it('execute again should fail', async () => { + await assertEOSErrorIncludesMessage( + teleporteos.ini(`50.0000 ${token_symbol}`, `0.0000 ${token_symbol}`, '0', false, 3, { from: teleporteos.account }), + 'Already initialized' + ); + }); + it('should update stats table', async () => { + let { rows: [item] } = await teleporteos.statsTable(); + chai.expect(item.collected).equal(0, 'Wrong collected'); + chai.expect(item.fin).equal(false, 'Wrong freeze in'); + chai.expect(item.fout).equal(false, 'Wrong freeze out'); + chai.expect(item.fcancel).equal(false, 'Wrong freeze cancel'); + chai.expect(item.foracles).equal(false, 'Wrong freeze oracles'); + chai.expect(item.oracles).equal(0, 'Wrong oracle amount'); + chai.expect(item.min).equal(1000000, 'Wrong minimum transfer amount'); + chai.expect(item.fixfee).equal(0, 'Wrong fix fee'); + chai.expect(item.varfee).equal('0.00000000000000000', 'Wrong variable fee'); + }); }); }); context('regoracle', async () => { @@ -456,15 +484,11 @@ describe('teleporteos', async () => { `123.0000 ${token_symbol}`, 2, ethToken, - { - from: sender1, - } + { from: sender1 } ); }); it('should update table', async () => { - let { - rows: [item], - } = await teleporteos.teleportsTable(); + let { rows: [item] } = await teleporteos.teleportsTable(); chai.expect(item.account).equal(sender1.name); chai.expect(item.chain_id).equal(2); chai.expect(item.id).equal(0); @@ -477,6 +501,143 @@ describe('teleporteos', async () => { }); }); }); + + context('adjust minimum amount', async () => { + context('with incorrect auth', async () => { + it('should fail with auth error', async () => { + await assertMissingAuthority( + teleporteos.setmin(`200.0000 ${token_symbol}`, { from: sender1 }) + ); + }); + }); + context('with correct auth', async () => { + it('wrong symbol name should fail', async () => { + await assertEOSErrorIncludesMessage( + teleporteos.setmin(`200.0000 ${token_symbol.length <= 3? token_symbol + 'A': 'AAA'}`, { from: teleporteos.account }), + 'Wrong token' + ); + }); + it('wrong symbol precision should fail', async () => { + await assertEOSErrorIncludesMessage( + teleporteos.setmin(`200 ${token_symbol}`, { from: teleporteos.account }), + 'Wrong token' + ); + }); + it('should succeed', async () => { + await teleporteos.setmin(`200.0000 ${token_symbol}`, { from: teleporteos.account }) + }); + it('should update threshold', async () => { + let { rows: [item] } = await teleporteos.statsTable(); + chai.expect(item.min).equal(2000000); + }); + }); + }); + + context('adjust fee', async () => { + context('with incorrect auth', async () => { + it('should fail with auth error', async () => { + await assertMissingAuthority( + teleporteos.setfee(`0.1000 ${token_symbol}`, '0.003', { from: sender1 }) + ); + }); + }); + context('with correct auth', async () => { + context('with wrong variable fee', async () => { + it('should fail', async () => { + await assertEOSErrorIncludesMessage( + teleporteos.setfee(`0.0000 ${token_symbol}`, '-0.01', { from: teleporteos.account }), + 'Variable fee has to be between 0 and 0.20' + ); + }); + it('should fail', async () => { + await assertEOSErrorIncludesMessage( + teleporteos.setfee(`0.0000 ${token_symbol}`, '1', { from: teleporteos.account }), + 'Variable fee has to be between 0 and 0.20' + ); + }); + }); + context('with wrong fix fee', async () => { + it('wrong symbol name should fail', async () => { + await assertEOSErrorIncludesMessage( + teleporteos.setfee(`0.0001 ${token_symbol.length <= 3? token_symbol + 'A': 'AAA'}`, '0', { from: teleporteos.account }), + 'Wrong token' + ); + }); + it('wrong symbol precision should fail', async () => { + await assertEOSErrorIncludesMessage( + teleporteos.setfee(`1 ${token_symbol}`, '0.003', { from: teleporteos.account }), + 'Wrong token' + ); + }); + it('too high amount should fail', async () => { + await assertEOSErrorIncludesMessage( + teleporteos.setfee(`200.0000 ${token_symbol}`, '0.003', { from: teleporteos.account }), + 'Fees are too high relative to the minimum amount of token transfers' + ); + }); + }); + it('should succeed', async () => { + await teleporteos.setfee(`0.1000 ${token_symbol}`, '0.003', { from: teleporteos.account }); + }); + }); + // TODO: Check stats table + // TODO: Withdraw and Deposit with no fees + // TODO: Teleport, fee reduces the + }); + + context('adjust threshold', async () => { + context('with incorrect auth', async () => { + it('should fail with auth error', async () => { + await assertMissingAuthority( + teleporteos.setthreshold(2, { from: sender1 }) + ); + }); + }); + context('with correct auth', async () => { + context('incorrect amount', async () => { + it('should fail', async () => { + await assertEOSErrorIncludesMessage( + teleporteos.setthreshold(0, { from: teleporteos.account }), + 'Needed confirmation amount has to be grater than 0' + ); + }); + }); + // TODO: Add new receipts + // TODO: Check if it is not confirmed + // TODO: Confirm one more time + // TODO: Check if it is confirmed now + // TODO: Check if further confirmation fails + }); + }); + + context('delete teleports', async () => { + context('with incorrect auth', async () => { + it('should fail with auth error', async () => { + await assertMissingAuthority( + teleporteos.delteles('0', { from: sender1 }) + ); + }); + }); + + context('with not available id', async () => { + it('should fail', async () => { + await assertEOSErrorIncludesMessage( + teleporteos.delteles('1', { from: teleporteos.account }), + 'Teleport id not found' + ); + }); + }); + context('with correct auth', async () => { + // TODO: Add three teleports + // TODO: Delete until a speific one + // TODO: Specific one should still be there and all below deleted + // TODO: Should fail to sign a deleted teleport + // TODO: Should add a new teleport in the front + // TODO: Should fail to sign a old + // TODO: Delete until last id + // TODO: Last if should still be there and all below deleted + }); + }); }); async function seedAccounts() { From b75a67079916c29881822270c952a4bb8a13e4e3 Mon Sep 17 00:00:00 2001 From: Kevin Kei Tuncer Date: Sat, 16 Apr 2022 17:30:57 +0200 Subject: [PATCH 10/24] - Store contract version on stats table - Initiate only tables which are needed while an action - Add some tests for fees and fix some bugs --- .../contracts/teleport/teleporteos.cpp | 51 +++-- .../contracts/teleport/teleporteos.hpp | 12 +- .../contracts/teleport/teleporteos.test.ts | 182 ++++++++++++++---- 3 files changed, 185 insertions(+), 60 deletions(-) diff --git a/contracts/teleporteos/contracts/teleport/teleporteos.cpp b/contracts/teleporteos/contracts/teleport/teleporteos.cpp index c600295..20ddc45 100644 --- a/contracts/teleporteos/contracts/teleport/teleporteos.cpp +++ b/contracts/teleporteos/contracts/teleport/teleporteos.cpp @@ -4,12 +4,7 @@ using namespace alienworlds; teleporteos::teleporteos(name s, name code, datastream ds) : contract(s, code, ds), - _stats(get_self(), get_self().value), - _deposits(get_self(), get_self().value), - _oracles(get_self(), get_self().value), - _receipts(get_self(), get_self().value), - _teleports(get_self(), get_self().value), - _cancels(get_self(), get_self().value) {} + _stats(get_self(), get_self().value) {} ACTION teleporteos::ini(const asset min, const asset fixfee, const double varfee, const bool freeze, const uint32_t threshold){ require_auth(get_self()); @@ -18,6 +13,7 @@ ACTION teleporteos::ini(const asset min, const asset fixfee, const double varfee check(fixfee.symbol == TOKEN_SYMBOL, "Wrong token symbol of fee"); check(threshold > 0, "Needed confirmation amount has to be grater than 0"); check(varfee <= 0.2 && varfee >= 0, "Variable fee has to be between 0 and 0.20"); + check(_stats.find(TOKEN_SYMBOL.raw()) == _stats.end(), "Already initialized"); auto stat = _stats.emplace(get_self(), [&](auto &s) { @@ -32,6 +28,7 @@ ACTION teleporteos::ini(const asset min, const asset fixfee, const double varfee s.fcancel = freeze; s.oracles = 0; s.threshold = threshold; + s.version = 1; }); uint64_t fee = calc_fee(stat, min.amount); @@ -52,6 +49,7 @@ ACTION teleporteos::transfer(name from, name to, asset quantity, string memo) { ACTION teleporteos::withdraw(name account, asset quantity) { require_auth(account); + deposits_table _deposits(get_self(), get_self().value); auto deposit = _deposits.find(account.value); check(deposit != _deposits.end(), "Deposit not found, please transfer the tokens first"); check(deposit->quantity >= quantity, "Withdraw amount exceeds deposit"); @@ -80,6 +78,7 @@ ACTION teleporteos::teleport(name from, asset quantity, uint8_t chain_id, checks check(quantity.amount >= stat->min, "Transfer is below minimum token amount"); check(!stat->fin, "Teleport is currently deactivated"); + deposits_table _deposits(get_self(), get_self().value); auto deposit = _deposits.find(from.value); check(deposit != _deposits.end(), "Deposit not found, please transfer the tokens first"); check(deposit->quantity >= quantity, "Not enough deposited"); @@ -99,6 +98,7 @@ ACTION teleporteos::teleport(name from, asset quantity, uint8_t chain_id, checks quantity.amount -= fee; // Emplace teleport + teleports_table _teleports(get_self(), get_self().value); uint64_t next_teleport_id = _teleports.available_primary_key(); uint32_t now = current_time_point().sec_since_epoch(); _teleports.emplace(from, [&](auto &t) { @@ -119,6 +119,7 @@ ACTION teleporteos::teleport(name from, asset quantity, uint8_t chain_id, checks /* Cancels a teleport after 30 days and no claim */ ACTION teleporteos::cancel(uint64_t id) { + teleports_table _teleports(get_self(), get_self().value); auto teleport = _teleports.find(id); check(teleport != _teleports.end(), "Teleport not found"); @@ -131,6 +132,7 @@ ACTION teleporteos::cancel(uint64_t id) { check((teleport->time + thirty_two_days) < now, "Teleport has not expired"); // Refund the teleport and mark it as cancelled + cancels_table _cancels(get_self(), get_self().value); auto existing = _cancels.find(id); check(existing == _cancels.end(), "Teleport has already been cancelled"); @@ -157,6 +159,7 @@ ACTION teleporteos::sign(name oracle_name, uint64_t id, string signature) { auto stat = _stats.find(TOKEN_SYMBOL.raw()); check(!stat->foracles, "Oracle actions are freezed"); + teleports_table _teleports(get_self(), get_self().value); auto teleport = _teleports.find(id); check(teleport != _teleports.end(), "Teleport not found"); @@ -176,6 +179,7 @@ ACTION teleporteos::received(name oracle_name, name to, checksum256 ref, asset q auto stat = _stats.find(TOKEN_SYMBOL.raw()); check(!stat->foracles, "Oracle actions are freezed"); + receipts_table _receipts(get_self(), get_self().value); auto ref_ind = _receipts.get_index<"byref"_n>(); auto receipt = ref_ind.find(ref); @@ -240,6 +244,7 @@ ACTION teleporteos::received(name oracle_name, name to, checksum256 ref, asset q ACTION teleporteos::repairrec(uint64_t id, asset quantity, vector approvers, bool completed) { require_auth(get_self()); + receipts_table _receipts(get_self(), get_self().value); auto receipt = _receipts.require_find(id, "Receipt does not exist."); check(quantity.amount > 0, "Quantity cannot be negative"); @@ -262,6 +267,7 @@ ACTION teleporteos::claimed(name oracle_name, uint64_t id, checksum256 to_eth, a auto stat = _stats.find(TOKEN_SYMBOL.raw()); check(!stat->foracles, "Oracle actions are freezed"); + teleports_table _teleports(get_self(), get_self().value); auto teleport = _teleports.find(id); check(teleport != _teleports.end(), "Teleport not found"); @@ -277,6 +283,7 @@ ACTION teleporteos::regoracle(name oracle_name) { check(is_account(oracle_name), "Oracle account does not exist"); + oracles_table _oracles(get_self(), get_self().value); _oracles.emplace(get_self(), [&](auto &o) { o.account = oracle_name; }); auto stat = _stats.find(TOKEN_SYMBOL.raw()); @@ -286,6 +293,7 @@ ACTION teleporteos::regoracle(name oracle_name) { ACTION teleporteos::unregoracle(name oracle_name) { require_auth(get_self()); + oracles_table _oracles(get_self(), get_self().value); auto oracle = _oracles.find(oracle_name.value); check(oracle != _oracles.end(), "Oracle does not exist"); @@ -300,6 +308,7 @@ ACTION teleporteos::unregoracle(name oracle_name) { ACTION teleporteos::delreceipts(time_point_sec to_date) { require_auth(get_self()); + receipts_table _receipts(get_self(), get_self().value); auto receipt = _receipts.begin(); while (receipt != _receipts.end()) { if(receipt->date < to_date){ @@ -312,10 +321,12 @@ ACTION teleporteos::delreceipts(time_point_sec to_date) { ACTION teleporteos::delteles(uint64_t to_id) { require_auth(get_self()); + teleports_table _teleports(get_self(), get_self().value); auto del_to = _teleports.find(to_id); check(del_to != _teleports.end(), "Teleport id not found"); // Delete all cancels and regarding teleports which id is less than to_id + cancels_table _cancels(get_self(), get_self().value); auto ci = _cancels.begin(); while (ci != _cancels.end() && ci->teleport_id < to_id) { auto tp = _teleports.find(ci->teleport_id); @@ -367,12 +378,14 @@ ACTION teleporteos::setfee(const asset fixfee, const double varfee){ check(fixfee.symbol == TOKEN_SYMBOL, "Wrong token"); check(varfee <= 0.2 && varfee >= 0, "Variable fee has to be between 0 and 0.20"); - paymentsToOracles(stat); + // Pay off all oracles first + auto rest = paymentsToOracles(stat); + // Set new fee and remaining collected _stats.modify(*stat, same_payer, [&](auto &s) { s.fixfee = fixfee.amount; s.varfee = varfee; - s.collected = 0; + s.collected = rest; }); uint64_t fee = calc_fee(stat, stat->min); @@ -390,9 +403,9 @@ ACTION teleporteos::setthreshold(const uint32_t threshold){ ACTION teleporteos::payoracles(){ auto stat = _stats.find(TOKEN_SYMBOL.raw()); - paymentsToOracles(stat); + auto rest = paymentsToOracles(stat); _stats.modify(*stat, same_payer, [&](auto &s) { - s.collected = 0; + s.collected = rest; }); } @@ -400,6 +413,7 @@ ACTION teleporteos::payoracles(){ void teleporteos::require_oracle(const name account) { require_auth(account); + oracles_table _oracles(get_self(), get_self().value); _oracles.get(account.value, "Account is not an oracle"); } @@ -412,6 +426,7 @@ uint64_t teleporteos::calc_fee(stats_table::const_iterator stat, const uint64_t } void teleporteos::addDeposit(const name from, const asset quantity){ + deposits_table _deposits(get_self(), get_self().value); auto deposit = _deposits.find(from.value); if (deposit == _deposits.end()) { _deposits.emplace(get_self(), [&](auto &d) { @@ -423,11 +438,17 @@ void teleporteos::addDeposit(const name from, const asset quantity){ } } -void teleporteos::paymentsToOracles(stats_table::const_iterator stat){ - check(stat->oracles > 0, "There are no oracles"); +uint64_t teleporteos::paymentsToOracles(stats_table::const_iterator stat){ + if(stat->collected == 0 || stat->oracles == 0){ + return stat->collected; + } uint64_t quantity = stat->collected / stat->oracles; - check(quantity == 0, "Pay off amount is too low"); - for (auto itr = _oracles.cbegin(); itr != _oracles.cend(); itr++) { - addDeposit(itr->account, asset(quantity, stat->symbol)); + uint64_t rest = stat->collected - (quantity * stat->oracles); + if(quantity != 0){ + oracles_table _oracles(get_self(), get_self().value); + for (auto itr = _oracles.cbegin(); itr != _oracles.cend(); itr++) { + addDeposit(itr->account, asset(quantity, stat->symbol)); + } } + return rest; } \ No newline at end of file diff --git a/contracts/teleporteos/contracts/teleport/teleporteos.hpp b/contracts/teleporteos/contracts/teleport/teleporteos.hpp index 9a40cf7..80e2c89 100644 --- a/contracts/teleporteos/contracts/teleport/teleporteos.hpp +++ b/contracts/teleporteos/contracts/teleport/teleporteos.hpp @@ -26,6 +26,7 @@ class [[eosio::contract("teleporteos")]] teleporteos : public contract { bool fout; // Freeze outgoing funds bool foracles; // Freeze oracles bool fcancel; // Freeze cancel action + uint32_t version; // Version of this teleport contract uint64_t primary_key() const { return symbol.raw(); } }; @@ -99,11 +100,6 @@ class [[eosio::contract("teleporteos")]] teleporteos : public contract { receipts_table; stats_table _stats; - deposits_table _deposits; - oracles_table _oracles; - receipts_table _receipts; - teleports_table _teleports; - cancels_table _cancels; void require_oracle(const name account); @@ -126,9 +122,11 @@ class [[eosio::contract("teleporteos")]] teleporteos : public contract { /** * @brief Send payments to all oracles - * @param stat + * + * @param stat Iterator to the stats table entry + * @return The rest amount which can not be divided */ - void paymentsToOracles(stats_table::const_iterator stat); + uint64_t paymentsToOracles(stats_table::const_iterator stat); public: using contract::contract; diff --git a/contracts/teleporteos/contracts/teleport/teleporteos.test.ts b/contracts/teleporteos/contracts/teleport/teleporteos.test.ts index 6427976..0f4d213 100644 --- a/contracts/teleporteos/contracts/teleport/teleporteos.test.ts +++ b/contracts/teleporteos/contracts/teleport/teleporteos.test.ts @@ -38,6 +38,7 @@ describe('teleporteos', async () => { before(async () => { await seedAccounts(); }); + // Initialize contract context('initialize contract', async () => { context('without correct auth', async () => { it('should fail with auth error', async () => { @@ -68,9 +69,11 @@ describe('teleporteos', async () => { chai.expect(item.min).equal(1000000, 'Wrong minimum transfer amount'); chai.expect(item.fixfee).equal(0, 'Wrong fix fee'); chai.expect(item.varfee).equal('0.00000000000000000', 'Wrong variable fee'); + chai.expect(item.version).above(0, 'Wrong version'); }); }); }); + // Recoracle context('regoracle', async () => { context('without correct auth', async () => { it('should fail with auth error', async () => { @@ -110,6 +113,7 @@ describe('teleporteos', async () => { }); }); }); + // Unrecoracle context('unregoracle', async () => { context('with incorrect auth', async () => { it('should fail with auth error', async () => { @@ -163,9 +167,7 @@ describe('teleporteos', async () => { `123.0000 ${token_symbol}`, 2, true, - { - from: sender1, - } + { from: sender1 } ) ); }); @@ -179,9 +181,7 @@ describe('teleporteos', async () => { `123.0000 ${token_symbol}`, 2, true, - { - from: oracle3, - } + { from: oracle3 } ); }); it('should insert into receipt table', async () => { @@ -210,9 +210,7 @@ describe('teleporteos', async () => { `123.0000 ${token_symbol}`, 2, true, - { - from: oracle1, - } + { from: oracle1 } ); }); }); @@ -226,9 +224,7 @@ describe('teleporteos', async () => { `0.1230 ${token_symbol}`, 2, true, - { - from: oracle3, - } + { from: oracle3 } ), 'Quantity mismatch' ); @@ -244,9 +240,7 @@ describe('teleporteos', async () => { `123.0000 ${token_symbol}`, 2, true, - { - from: oracle3, - } + { from: oracle3 } ), 'Account mismatch' ); @@ -262,9 +256,7 @@ describe('teleporteos', async () => { `123.0000 ${token_symbol}`, 2, true, - { - from: oracle3, - } + { from: oracle3 } ), 'Oracle has already approved' ); @@ -311,6 +303,7 @@ describe('teleporteos', async () => { }); }); }); + // Recrepair context('recrepair', async () => { before(async () => { await teleporteos.received( @@ -320,9 +313,7 @@ describe('teleporteos', async () => { `0.1230 ${token_symbol}`, 2, true, - { - from: oracle1, - } + { from: oracle1 } ); }); context('with wrong auth', async () => { @@ -374,9 +365,7 @@ describe('teleporteos', async () => { `124.0000 ${token_symbol}`, [oracle1.name], false, - { - from: teleporteos.account, - } + { from: teleporteos.account } ); }); it('should update the receipts table', async () => { @@ -408,6 +397,7 @@ describe('teleporteos', async () => { }); }); }); + // Teleport context('teleport', async () => { context('without valid auth', async () => { it('should fail with auth error', async () => { @@ -501,7 +491,7 @@ describe('teleporteos', async () => { }); }); }); - + // Adjust minimum amount context('adjust minimum amount', async () => { context('with incorrect auth', async () => { it('should fail with auth error', async () => { @@ -532,7 +522,7 @@ describe('teleporteos', async () => { }); }); }); - + // Adjust fee context('adjust fee', async () => { context('with incorrect auth', async () => { it('should fail with auth error', async () => { @@ -579,12 +569,112 @@ describe('teleporteos', async () => { it('should succeed', async () => { await teleporteos.setfee(`0.1000 ${token_symbol}`, '0.003', { from: teleporteos.account }); }); + it('should update stats table', async () => { + let { rows: [item] } = await teleporteos.statsTable(); + chai.expect(item.fixfee).equal(1000, 'Wrong fix fee'); + chai.expect(item.varfee).equal('0.00300000000000000', 'Wrong variable fee'); + }); + it('should succeed withdraw and deposit', async () => { + await teleporteos.withdraw(sender1.name, `1.0000 ${token_symbol}`, { from: sender1 }); + { + let { rows } = await teleporteos.depositsTable(); + for(let item of rows){ + if(item.account == sender1.name){ + chai.expect(item.quantity).equal(`100.0000 ${token_symbol}`, 'Wrong deposit on withdraw'); + break; + } + } + } + let { rows: [item_balance] } = await alienworldsToken.accountsTable({scope: sender1.name}) + chai.expect(item_balance.balance).equal(`999900.0000 ${token_symbol}`, 'Wrong balance after withdraw'); + await alienworldsToken.transfer( + sender1.name, + teleporteos.account.name, + `200.0000 ${token_symbol}`, + 'teleport test', + { from: sender1 } + ); + let deposits = await teleporteos.depositsTable(); + for(let item of deposits.rows){ + if(item.account == sender1.name){ + chai.expect(item.quantity).equal(`300.0000 ${token_symbol}`, 'Wrong balance on deposit'); + break; + } + } + }); + it('should succeed teleport', async () => { + await teleporteos.teleport(sender1.name, `200.0000 ${token_symbol}`, 2, ethToken, { from: sender1 }); + let deposits = await teleporteos.depositsTable(); + for(let item of deposits.rows){ + if(item.account == sender1.name){ + chai.expect(item.quantity).equal(`100.0000 ${token_symbol}`, 'Wrong balance on deposit'); + break; + } + } + // Check collected amount + const value = BigInt(2000000); + const fee = calcFee(value, BigInt(1000), 0.003); + let { rows: [stat] } = await teleporteos.statsTable(); + chai.expect(stat.collected.toString()).equal(fee.toString(), "Wrong collected fee amount"); + // check teleport amount + let teleports = await teleporteos.teleportsTable({reverse: true}); + chai.expect(teleports.rows[0].quantity).equal(amountToAsset(value - fee, token_symbol, 4), "Wrong fee calculation"); + }); + it('should succeed receipt', async () => { + // Get current balance of sender 1 on token contract + let { rows: [a_item_old] } = await alienworldsToken.accountsTable({scope: sender1.name}) + let sender1Balance = stringToAsset(a_item_old.balance).amount; + // Get current balance of sender 1 on deposits + let sender1DepositBalance = BigInt(0); + let deposits_old = await teleporteos.depositsTable(); + for(let item of deposits_old.rows){ + if(item.account == sender1.name){ + sender1DepositBalance = stringToAsset(item.quantity).amount + break; + } + } + // Get current stat + let { rows: [stat_old] } = await teleporteos.statsTable() + // Send received action by three oracles, so it should be completed + const hash = '1111111111111111111111111111111111111111111111111111111111111113'; + const sendAmount = BigInt(1230); + const sendAsset = amountToAsset(sendAmount, token_symbol, 4); + // Execute recepits with three oracles + await teleporteos.received( + oracle1.name, sender1.name, hash, sendAsset, 2, true, { from: oracle1 } + ); + await teleporteos.received( + oracle2.name, sender1.name, hash, sendAsset, 2, true, { from: oracle2 } + ); + await teleporteos.received( + oracle3.name, sender1.name, hash, sendAsset, 2, true, { from: oracle3 } + ); + let { rows: [confirmedItem] } = await teleporteos.receiptsTable({ + keyType: 'sha256', + indexPosition: 2, + tableKey: hash + }); + chai.expect(confirmedItem.confirmations).equal(3, "Wrong amount of confirmations"); + chai.expect(confirmedItem.completed).equal(true, "Not completed"); + // Check collected + const fee = calcFee(sendAmount, BigInt(1000), 0.003); + let { rows: [stat_new] } = await teleporteos.statsTable(); + chai.expect(stat_new.collected.toString()).equal((BigInt(stat_old.collected) + fee).toString(), "Collected got wrong amount of fees"); + // Check new balance on token contract + let { rows: [a_item_new] } = await alienworldsToken.accountsTable({scope: sender1.name}) + chai.expect(stringToAsset(a_item_new.balance).amount.toString()).equal((sender1Balance + sendAmount - fee).toString(), "New Balance reduced by a fee is wrong"); + // Check if deposit table is unchanged + let deposits_new = await teleporteos.depositsTable(); + for(let item of deposits_new.rows){ + if(item.account == sender1.name){ + chai.expect(stringToAsset(item.quantity).amount.toString()).equal(sender1DepositBalance.toString(), "Deposit has changed") + break; + } + } + }); }); - // TODO: Check stats table - // TODO: Withdraw and Deposit with no fees - // TODO: Teleport, fee reduces the }); - + // Adjust threshold context('adjust threshold', async () => { context('with incorrect auth', async () => { it('should fail with auth error', async () => { @@ -609,7 +699,7 @@ describe('teleporteos', async () => { // TODO: Check if further confirmation fails }); }); - + // Delete teleports context('delete teleports', async () => { context('with incorrect auth', async () => { it('should fail with auth error', async () => { @@ -622,7 +712,7 @@ describe('teleporteos', async () => { context('with not available id', async () => { it('should fail', async () => { await assertEOSErrorIncludesMessage( - teleporteos.delteles('1', { from: teleporteos.account }), + teleporteos.delteles('100', { from: teleporteos.account }), 'Teleport id not found' ); }); @@ -697,18 +787,14 @@ async function issueTokens() { await alienworldsToken.create( alienworldsToken.account.name, `1000000000.0000 ${token_symbol}`, - { - from: alienworldsToken.account, - } + { from: alienworldsToken.account } ); await alienworldsToken.issue( alienworldsToken.account.name, `10000000.0000 ${token_symbol}`, 'initial deposit', - { - from: alienworldsToken.account, - } + { from: alienworldsToken.account } ); } catch (e) { if ((e as { json: {error: {what: string } } }).json.error.what != 'eosio_assert_message assertion failure') { @@ -732,3 +818,23 @@ async function issueTokens() { { from: alienworldsToken.account } ); } + +function amountToAsset(amount: bigint, symbol_name: string, precision: number){ + let s = amount.toString(); + let p = s.length - precision; + let int = s.substring(0, p); + return `${int? int : '0'}${'.'}${s.substring(p)} ${symbol_name}`; +} + +function stringToAsset(asset_str: string){ + let s = asset_str.indexOf('.'); + let e = asset_str.indexOf(' ', s); + let precision = e - s; + let name = asset_str.substring(e + 1).trim(); + let amount = BigInt(asset_str.substring(0, s) + asset_str.substring(s + 1, e)); + return {amount, symbol: {precision, name}} +} + +function calcFee(amount: bigint, fixfeeAmount: bigint, varfee: number){ + return BigInt(Math.floor(Number(amount) * varfee)) + fixfeeAmount; +} \ No newline at end of file From 93ca2fa6efbe74c6377136ac9cfb09401b937d50 Mon Sep 17 00:00:00 2001 From: Kevin Kei Tuncer Date: Sun, 17 Apr 2022 14:57:37 +0200 Subject: [PATCH 11/24] Finish tests of the eosio teleport contract functions --- .../contracts/teleport/teleporteos.cpp | 6 +- .../contracts/teleport/teleporteos.test.ts | 264 +++++++++++++++++- 2 files changed, 254 insertions(+), 16 deletions(-) diff --git a/contracts/teleporteos/contracts/teleport/teleporteos.cpp b/contracts/teleporteos/contracts/teleport/teleporteos.cpp index 20ddc45..78bb83d 100644 --- a/contracts/teleporteos/contracts/teleport/teleporteos.cpp +++ b/contracts/teleporteos/contracts/teleport/teleporteos.cpp @@ -167,6 +167,10 @@ ACTION teleporteos::sign(name oracle_name, uint64_t id, string signature) { oracle_name); check(find_res == teleport->oracles.end(), "Oracle has already signed"); + for(auto &sig : teleport->signatures){ + check(sig != signature, "Already signed with this signature"); + } + _teleports.modify(*teleport, get_self(), [&](auto &t) { t.oracles.push_back(oracle_name); t.signatures.push_back(signature); @@ -204,7 +208,7 @@ ACTION teleporteos::received(name oracle_name, name to, checksum256 ref, asset q }); } else { if (confirmed) { - check(!receipt->completed, "This teleport has already completed"); + check(!receipt->completed, "This teleport is already completed"); check(receipt->quantity == quantity, "Quantity mismatch"); check(receipt->to == to, "Account mismatch"); diff --git a/contracts/teleporteos/contracts/teleport/teleporteos.test.ts b/contracts/teleporteos/contracts/teleport/teleporteos.test.ts index 0f4d213..51a178e 100644 --- a/contracts/teleporteos/contracts/teleport/teleporteos.test.ts +++ b/contracts/teleporteos/contracts/teleport/teleporteos.test.ts @@ -113,6 +113,7 @@ describe('teleporteos', async () => { }); }); }); + // Unrecoracle context('unregoracle', async () => { context('with incorrect auth', async () => { @@ -303,6 +304,7 @@ describe('teleporteos', async () => { }); }); }); + // Recrepair context('recrepair', async () => { before(async () => { @@ -397,6 +399,7 @@ describe('teleporteos', async () => { }); }); }); + // Teleport context('teleport', async () => { context('without valid auth', async () => { @@ -491,6 +494,85 @@ describe('teleporteos', async () => { }); }); }); + + // Sign + context('sign teleport', async () => { + context('with incorrect auth', async () => { + it('should fail', async () => { + await assertMissingAuthority( + teleporteos.sign(oracle1.name, 0, 'abcdefghijklmnopabcdefghijklmnopabcdefghijklmnop', { from: sender1 }) + ); + await assertMissingAuthority( + teleporteos.sign(oracle1.name, 0, 'abcdefghijklmnopabcdefghijklmnopabcdefghijklmnop', { from: oracle2 }) + ); + }); + }); + context('with correct auth', async () => { + it('wrong parameters', async () => { + await assertEOSErrorIncludesMessage( + teleporteos.sign(oracle1.name, 10, 'abcdefghijklmnopabcdefghijklmnopabcdefghijklmnop', { from: oracle1 }), + 'Teleport not found' + ); + }); + it('should succeed', async () => { + await teleporteos.sign(oracle1.name, 0, 'abcdefghijklmnopabcdefghijklmnopabcdefghijklmnop', { from: oracle1 }); + const { rows: [item] } = await teleporteos.teleportsTable({lowerBound: '0'}); + chai.expect(item.id).equal(0, 'Wrong id'); + chai.expect(item.oracles.length).equal(1, 'Wrong sign amount of oracles'); + chai.expect(item.oracles[0]).equal(oracle1.name, 'Wrong oracle'); + }); + it('refuse double signing', async () => { + await assertEOSErrorIncludesMessage( + teleporteos.sign(oracle1.name, 0, 'abc', { from: oracle1 }), + 'Oracle has already signed' + ); + }); + it('refuse same signature', async () => { + await assertEOSErrorIncludesMessage( + teleporteos.sign(oracle2.name, 0, 'abcdefghijklmnopabcdefghijklmnopabcdefghijklmnop', { from: oracle2 }), + 'Already signed with this signature' + ); + }); + }); + }); + + // Teleport claimed + context('set teleport claimed', async () => { + context('with incorrect auth', async () => { + it('should fail', async () => { + await assertMissingAuthority( + teleporteos.claimed(oracle1.name, 0, ethToken, `123.0000 ${token_symbol}`, { from: sender1 }) + ); + }); + }); + context('with correct auth', async () => { + context('wrong parameters', async () => { + it('should fail', async () => { + await assertEOSErrorIncludesMessage( + teleporteos.claimed(oracle1.name, 10, ethToken, `123.0000 ${token_symbol}`, { from: oracle1 }), + 'Teleport not found' + ) + await assertEOSErrorIncludesMessage( + teleporteos.claimed(oracle1.name, 0, ethToken, `1.0000 ${token_symbol}`, { from: oracle1 }), + 'Quantity mismatch' + ) + }); + }); + it('should succeed', async () => { + await teleporteos.claimed(oracle1.name, 0, ethToken, `123.0000 ${token_symbol}`, { from: oracle1 }); + const { rows: [item] } = await teleporteos.teleportsTable({lowerBound: '0'}); + chai.expect(item.id).equal(0, 'Wrong id'); + chai.expect(item.claimed).equal(true); + }); + it('should refuse double claiming', async () => { + await assertEOSErrorIncludesMessage( + teleporteos.claimed(oracle1.name, 0, ethToken, `123.0000 ${token_symbol}`, { from: oracle1 }), + 'Already marked as claimed' + ) + }); + }); + }); + // Adjust minimum amount context('adjust minimum amount', async () => { context('with incorrect auth', async () => { @@ -522,6 +604,7 @@ describe('teleporteos', async () => { }); }); }); + // Adjust fee context('adjust fee', async () => { context('with incorrect auth', async () => { @@ -652,7 +735,7 @@ describe('teleporteos', async () => { let { rows: [confirmedItem] } = await teleporteos.receiptsTable({ keyType: 'sha256', indexPosition: 2, - tableKey: hash + lowerBound: hash }); chai.expect(confirmedItem.confirmations).equal(3, "Wrong amount of confirmations"); chai.expect(confirmedItem.completed).equal(true, "Not completed"); @@ -674,6 +757,7 @@ describe('teleporteos', async () => { }); }); }); + // Adjust threshold context('adjust threshold', async () => { context('with incorrect auth', async () => { @@ -692,13 +776,48 @@ describe('teleporteos', async () => { ); }); }); - // TODO: Add new receipts - // TODO: Check if it is not confirmed - // TODO: Confirm one more time - // TODO: Check if it is confirmed now - // TODO: Check if further confirmation fails + it('should succeed receipt', async () => { + // Set threshold to 2 + await teleporteos.setthreshold(2, { from: teleporteos.account }) + // Check stats + let { rows: [stat] } = await teleporteos.statsTable(); + chai.expect(stat.threshold).equal(2, "Threshold was not was not inherited"); + // Send received action by three oracles, so it should be completed + const hash = '1111111111111111111111111111111111111111111111111111111111111114'; + const sendAmount = BigInt(10000); + const sendAsset = amountToAsset(sendAmount, token_symbol, 4); + // Execute recepits by one oracles + await teleporteos.received( + oracle1.name, sender1.name, hash, sendAsset, 1, true, { from: oracle1 } + ); + let { rows: [unconfItem] } = await teleporteos.receiptsTable({ + keyType: 'sha256', + indexPosition: 2, + lowerBound: hash + }); + chai.expect(unconfItem.confirmations).equal(1, "Wrong amount of confirmations"); + chai.expect(unconfItem.completed).equal(false, "Is completed"); + // Execute recepits by a second oracles + await teleporteos.received( + oracle2.name, sender1.name, hash, sendAsset, 1, true, { from: oracle2 } + ); + let { rows: [confItem] } = await teleporteos.receiptsTable({ + keyType: 'sha256', + indexPosition: 2, + lowerBound: hash + }); + chai.expect(confItem.confirmations).equal(2, "Wrong amount of confirmations"); + chai.expect(confItem.completed).equal(true, "Is not completed"); + + // Execute recepits by a third oracles + await assertEOSErrorIncludesMessage( + teleporteos.received(oracle3.name, sender1.name, hash, sendAsset, 1, true, { from: oracle3 }), + 'This teleport is already completed' + ); + }); }); }); + // Delete teleports context('delete teleports', async () => { context('with incorrect auth', async () => { @@ -706,9 +825,11 @@ describe('teleporteos', async () => { await assertMissingAuthority( teleporteos.delteles('0', { from: sender1 }) ); + await assertMissingAuthority( + teleporteos.delteles('0', { from: oracle1 }) + ); }); }); - context('with not available id', async () => { it('should fail', async () => { await assertEOSErrorIncludesMessage( @@ -717,15 +838,128 @@ describe('teleporteos', async () => { ); }); }); + it('preparation', async () => { + // Add three teleports + await teleporteos.teleport(alienworldsToken.account.name, `203.0000 ${token_symbol}`, 1, ethToken, { from: alienworldsToken.account }); + await teleporteos.teleport(alienworldsToken.account.name, `203.0000 ${token_symbol}`, 2, ethToken, { from: alienworldsToken.account }); + await teleporteos.teleport(alienworldsToken.account.name, `203.0000 ${token_symbol}`, 3, ethToken, { from: alienworldsToken.account }); + const fee = calcFee(BigInt(2030000), BigInt(1000), 0.003); + const sendAsset = amountToAsset(BigInt(2030000) - fee, token_symbol, 4); + // Claim all teleports but not the second in table + await teleporteos.claimed(oracle1.name, 2, ethToken, sendAsset, { from: oracle1 }); + await teleporteos.claimed(oracle1.name, 3, ethToken, sendAsset, { from: oracle1 }); + await teleporteos.claimed(oracle1.name, 4, ethToken, sendAsset, { from: oracle1 }); + }); context('with correct auth', async () => { - // TODO: Add three teleports - // TODO: Delete until a speific one - // TODO: Specific one should still be there and all below deleted - // TODO: Should fail to sign a deleted teleport - // TODO: Should add a new teleport in the front - // TODO: Should fail to sign a old - // TODO: Delete until last id - // TODO: Last if should still be there and all below deleted + context('delete to id 2', async () => { + it('should succeed', async () => { + // Delete until the third one + await teleporteos.delteles('2', { from: teleporteos.account }); + const teleports = await teleporteos.teleportsTable(); + chai.expect(teleports.rows.length).equal(4, 'Wrong amount of teleports are deleted'); + chai.expect(teleports.rows[0].id).equal(1, 'Wrong deletion'); + chai.expect(teleports.rows[1].id).equal(2, 'Wrong deletion'); + chai.expect(teleports.rows[2].id).equal(3, 'Wrong deletion'); + chai.expect(teleports.rows[3].id).equal(4, 'Wrong deletion'); + }); + }); + context('delete to last id', async () => { + it('should fail', async () => { + await assertEOSErrorIncludesMessage( + teleporteos.delteles('5', { from: teleporteos.account }), + 'Teleport id not found' + ); + }); + it('should succeed', async () => { + // Delete until the third one + await teleporteos.delteles('4', { from: teleporteos.account }); + const teleports = await teleporteos.teleportsTable(); + chai.expect(teleports.rows.length).equal(2, 'Wrong amount of teleports are deleted'); + chai.expect(teleports.rows[0].id).equal(1, 'Wrong deletion'); + chai.expect(teleports.rows[1].id).equal(4, 'Wrong deletion'); + }); + }); + }); + }); + + // Cancel action + context('cancel teleport', async () => { + context('with incorrect auth', async () => { + it('should fail with auth error', async () => { + await assertMissingAuthority( + teleporteos.cancel('1', { from: oracle1 }) + ); + }); + }); + context('with correct auth', async () => { + it('should fail when it is claimed', async () => { + await assertEOSErrorIncludesMessage( + teleporteos.cancel('4', { from: alienworldsToken.account }), + 'Teleport is already claimed' + ); + }); + it('should fail when it is too early', async () => { + await assertEOSErrorIncludesMessage( + teleporteos.cancel('1', { from: sender1 }), + 'Teleport has not expired' + ); + }); + }); + }); + + // Pay oracles + context('pay oracles', async () => { + const {rows: [initialStat]} = await teleporteos.statsTable(); + const amountPerOracle = Math.floor(Number(initialStat.collected) / initialStat.oracles); + const rest = Number(initialStat.collected) - amountPerOracle; + it('should succeed', async () => { + await teleporteos.payoracles({ from: sender1 }); + }); + // Check rest + const {rows: [stat]} = await teleporteos.statsTable(); + chai.expect(stat.collected).equal(rest, 'Wrong collected rest'); + // Check oracle deposit amounts + const deposits = await teleporteos.depositsTable({lowerBound: oracle1.name}); + chai.expect(stringToAsset(deposits.rows[0].quantity).amount).equal(amountPerOracle, 'Wrong amount for oracle'); + chai.expect(stringToAsset(deposits.rows[1].quantity).amount).equal(amountPerOracle, 'Wrong amount for oracle'); + chai.expect(stringToAsset(deposits.rows[2].quantity).amount).equal(amountPerOracle, 'Wrong amount for oracle'); + }); + + // Delete receipts + context('delete receipts', async () => { + const initialReceipts = await teleporteos.receiptsTable(); + const secondDate = initialReceipts.rows[1].date; + const lastDate = initialReceipts.rows[initialReceipts.rows.length - 1].date; + context('with incorrect auth', async () => { + it('should fail with auth error', async () => { + await assertMissingAuthority( + teleporteos.delreceipts(lastDate, { from: sender1 }) + ); + await assertMissingAuthority( + teleporteos.delreceipts(lastDate, { from: oracle1 }) + ); + }); + }); + context('with correct auth', async () => { + context('delete to id 2', async () => { + it('should succeed', async () => { + // Delete until the third one + await teleporteos.delreceipts(secondDate, { from: teleporteos.account }); + const receipts = await teleporteos.receiptsTable(); + chai.expect(receipts.rows.length).equal(3, 'Wrong amount of receipts are deleted'); + chai.expect(receipts.rows[0].id).equal(1, 'Wrong deletion'); + chai.expect(receipts.rows[1].id).equal(2, 'Wrong deletion'); + chai.expect(receipts.rows[2].id).equal(3, 'Wrong deletion'); + }); + }); + context('delete all', async () => { + it('should succeed', async () => { + // Delete until the third one + await teleporteos.delreceipts(new Date(lastDate.getTime() + 1), { from: teleporteos.account }); + const receipts = await teleporteos.receiptsTable(); + chai.expect(receipts.rows.length).equal(0, 'Not all deleted'); + }); + }); }); }); }); From 5a7dfef57194f6aebfbd185a5ce5a4ee5f03664b Mon Sep 17 00:00:00 2001 From: Kevin Kei Tuncer Date: Wed, 27 Apr 2022 18:57:27 +0200 Subject: [PATCH 12/24] EOSIO contract - Store all needed bridge data in stats table for interoperability with custom front end apps. - Check chain id of incoming and outgoing teleports. - Add tests to add and remove connected chains --- contracts/teleporteos/README.md | 18 ++++- .../contracts/teleport/teleporteos.cpp | 46 +++++++++++- .../contracts/teleport/teleporteos.hpp | 38 +++++++++- .../contracts/teleport/teleporteos.test.ts | 74 +++++++++++++++++-- 4 files changed, 167 insertions(+), 9 deletions(-) diff --git a/contracts/teleporteos/README.md b/contracts/teleporteos/README.md index 992972c..a5e7cb2 100644 --- a/contracts/teleporteos/README.md +++ b/contracts/teleporteos/README.md @@ -4,6 +4,7 @@ - Adjustable amount of needed oracle confirmations for a receiving teleport - Adjustable minimum amount for deposits and teleports - Option to delete old teleport and cancel entries without losing consensus +- Store all needed bridge data in stats table for interoperability with custom front end apps # Deployment and initialization @@ -18,6 +19,18 @@ ACTION ini(asset min, uint64_t fixfee, double varfee, bool freeze, uint32_t thre - ***freeze*** True to freeze the contract until you unfreeze it with the freeze action. - ***threshold*** Amount of needed oracle confirmations for a receiving teleport +3. Add the ethereum chains which are allowed +``` +/** + * @brief Add a bridge to a new chain + * + * @param name Name of the chain to bridge + * @param chain_id Identification number for this new chain + * @param net_id Unique network id to distinguish different chains. See "ChainID" for ethereum based chains on https://chainlist.org/ + * @param contract Contract address + */ + ACTION addchain(string name, uint8_t chain_id, string net_id, string contract); +``` With the freeze action you can freeze and unfreeze specific parts of the contract ``` ACTION freeze(const bool in, const bool out, const bool oracles, const bool cancel); @@ -29,8 +42,9 @@ ACTION freeze(const bool in, const bool out, const bool oracles, const bool canc ## Upgrade from running teleport contract of alien world -Just deploy the contract over the old teleport contract account and run the ini action. -Note: In this upgrade are additional tables, the structure of the old tables is not changed. +Just deploy the contract over the old teleport contract account, run the ini action and add all connected chains by executing the addchain action. + +**Note:** In this upgrade are additional tables, the structure of the old tables is not changed. # Install test suite on windows diff --git a/contracts/teleporteos/contracts/teleport/teleporteos.cpp b/contracts/teleporteos/contracts/teleport/teleporteos.cpp index 78bb83d..19904b9 100644 --- a/contracts/teleporteos/contracts/teleport/teleporteos.cpp +++ b/contracts/teleporteos/contracts/teleport/teleporteos.cpp @@ -6,7 +6,7 @@ teleporteos::teleporteos(name s, name code, datastream ds) : contract(s, code, ds), _stats(get_self(), get_self().value) {} -ACTION teleporteos::ini(const asset min, const asset fixfee, const double varfee, const bool freeze, const uint32_t threshold){ +ACTION teleporteos::ini(const asset min, const asset fixfee, const double varfee, const bool freeze, const uint32_t threshold, const uint8_t chain_id){ require_auth(get_self()); check(min.symbol == TOKEN_SYMBOL, "Wrong token symbol of min amount"); @@ -29,6 +29,7 @@ ACTION teleporteos::ini(const asset min, const asset fixfee, const double varfee s.oracles = 0; s.threshold = threshold; s.version = 1; + s.id = chain_id; }); uint64_t fee = calc_fee(stat, min.amount); @@ -83,6 +84,8 @@ ACTION teleporteos::teleport(name from, asset quantity, uint8_t chain_id, checks check(deposit != _deposits.end(), "Deposit not found, please transfer the tokens first"); check(deposit->quantity >= quantity, "Not enough deposited"); + check(hasId(chain_id, stat), "This chain id is not available"); + // Reduce the deposit amount by the teleport amount and delete the deposit if it would be zero if (deposit->quantity == quantity) { _deposits.erase(deposit); @@ -117,6 +120,45 @@ ACTION teleporteos::teleport(name from, asset quantity, uint8_t chain_id, checks .send(); } +bool teleporteos::hasId(uint8_t chain_id, stats_table::const_iterator stat){ + for(auto itr = stat->chains.begin(); itr != stat->chains.end(); itr++){ + if(itr->id == chain_id){ + return true; + } + } + return false; +} + +ACTION teleporteos::addchain(string name, uint8_t chain_id, string net_id, string contract){ + require_auth(get_self()); + auto stat = _stats.find(TOKEN_SYMBOL.raw()); + check(!hasId(chain_id, stat), "This chain is already listed"); + + chainData chain; + chain.id = chain_id; + chain.name = name; + chain.net_id = net_id; + chain.contract = contract; + + _stats.modify(*stat, get_self(), [&](auto &s) { + s.chains.push_back(chain); + }); +} + +ACTION teleporteos::rmchain(uint8_t chain_id){ + require_auth(get_self()); + auto stat = _stats.find(TOKEN_SYMBOL.raw()); + + _stats.modify(*stat, get_self(), [&](auto &s) { + for(auto itr = stat->chains.begin(); itr != stat->chains.end(); itr++){ + if(itr->id == chain_id){ + s.chains.erase(itr); + break; + } + } + }); +} + /* Cancels a teleport after 30 days and no claim */ ACTION teleporteos::cancel(uint64_t id) { teleports_table _teleports(get_self(), get_self().value); @@ -190,6 +232,8 @@ ACTION teleporteos::received(name oracle_name, name to, checksum256 ref, asset q check(quantity.amount > 0, "Quantity cannot be negative"); check(quantity.is_valid(), "Asset not valid"); + check(hasId(chain_id, stat), "This chain id is not available"); + if (receipt == ref_ind.end()) { _receipts.emplace(get_self(), [&](auto &r) { r.id = _receipts.available_primary_key(); diff --git a/contracts/teleporteos/contracts/teleport/teleporteos.hpp b/contracts/teleporteos/contracts/teleport/teleporteos.hpp index 80e2c89..dfd4963 100644 --- a/contracts/teleporteos/contracts/teleport/teleporteos.hpp +++ b/contracts/teleporteos/contracts/teleport/teleporteos.hpp @@ -14,6 +14,13 @@ namespace alienworlds { class [[eosio::contract("teleporteos")]] teleporteos : public contract { private: + struct chainData{ + uint8_t id; + string name; + string net_id; + string contract; + }; + struct [[eosio::table("stats")]] stats_item { symbol symbol; // Symbol for the token uint64_t min; // Minimum amount for token teleport @@ -26,7 +33,9 @@ class [[eosio::contract("teleporteos")]] teleporteos : public contract { bool fout; // Freeze outgoing funds bool foracles; // Freeze oracles bool fcancel; // Freeze cancel action + uint8_t id; // Id number of this chain uint32_t version; // Version of this teleport contract + vector chains; // Connected chains uint64_t primary_key() const { return symbol.raw(); } }; @@ -128,6 +137,14 @@ class [[eosio::contract("teleporteos")]] teleporteos : public contract { */ uint64_t paymentsToOracles(stats_table::const_iterator stat); + /** + * @brief Check if id already exists + * + * @param chain_id Identification number for a chain + * @param stat Iterator to the stats table entry + * @return true if it exists otherwise false + */ + static bool hasId(uint8_t chain_id, stats_table::const_iterator stat); public: using contract::contract; @@ -140,8 +157,27 @@ class [[eosio::contract("teleporteos")]] teleporteos : public contract { * @param fixfee Fix fee for teleports and receipts * @param varfee Variable fee for teleports and receipts * @param freeze Freeze all freezable actions + * @param threshold Amount of oracle validations until a receipt teleport is completed + * @param chain_id Self defined identification number of this chain + */ + ACTION ini(const asset min, const asset fixfee, const double varfee, const bool freeze, const uint32_t threshold, const uint8_t chain_id); + + /** + * @brief Add a bridge to a new chain + * + * @param name Name of the chain to bridge + * @param chain_id Identification number for this new chain + * @param net_id Unique network id to distinguish different chains. See "ChainID" for ethereum based chains on https://chainlist.org/ + * @param contract Contract address + */ + ACTION addchain(string name, uint8_t chain_id, string net_id, string contract); + + /** + * @brief Remove a bridge + * + * @param chain_id Identification number for this new chain */ - ACTION ini(const asset min, const asset fixfee, const double varfee, const bool freeze, const uint32_t threshold); + ACTION rmchain(uint8_t chain_id); /* Fungible token transfer (only trilium) */ [[eosio::on_notify(TOKEN_CONTRACT_STR "::transfer")]] void transfer(name from, name to, asset quantity, string memo); diff --git a/contracts/teleporteos/contracts/teleport/teleporteos.test.ts b/contracts/teleporteos/contracts/teleport/teleporteos.test.ts index 51a178e..d1f6850 100644 --- a/contracts/teleporteos/contracts/teleport/teleporteos.test.ts +++ b/contracts/teleporteos/contracts/teleport/teleporteos.test.ts @@ -43,18 +43,18 @@ describe('teleporteos', async () => { context('without correct auth', async () => { it('should fail with auth error', async () => { await assertMissingAuthority( - teleporteos.ini(`100.0000 ${token_symbol}`, `0.0000 ${token_symbol}`, '0', false, 3, { from: sender1 }) + teleporteos.ini(`100.0000 ${token_symbol}`, `0.0000 ${token_symbol}`, '0', false, 3, 0, { from: sender1 }) ); }); }); context('with correct auth', async () => { it('should succeed', async () => { - await teleporteos.ini(`100.0000 ${token_symbol}`, `0.0000 ${token_symbol}`, '0', false, 3, { from: teleporteos.account }); + await teleporteos.ini(`100.0000 ${token_symbol}`, `0.0000 ${token_symbol}`, '0', false, 3, 0, { from: teleporteos.account }); }); it('execute again should fail', async () => { await assertEOSErrorIncludesMessage( - teleporteos.ini(`50.0000 ${token_symbol}`, `0.0000 ${token_symbol}`, '0', false, 3, { from: teleporteos.account }), + teleporteos.ini(`50.0000 ${token_symbol}`, `0.0000 ${token_symbol}`, '0', false, 3, 0, { from: teleporteos.account }), 'Already initialized' ); }); @@ -70,6 +70,70 @@ describe('teleporteos', async () => { chai.expect(item.fixfee).equal(0, 'Wrong fix fee'); chai.expect(item.varfee).equal('0.00000000000000000', 'Wrong variable fee'); chai.expect(item.version).above(0, 'Wrong version'); + chai.expect(item.chains.length).equal(0, 'Wrong amount of added chains'); + }); + }); + }); + // Add chains + context('add chain', async () => { + context('without correct auth', async () => { + it('should fail with auth error', async () => { + await assertMissingAuthority( + teleporteos.addchain('ETH', 1, '1', '0x497329439abdc323u497329439abdc323u', { from: sender1 }) + ); + }); + }); + context('with correct auth', async () => { + const ethName = 'ETH' + const ethId = 1 + const ethNetId = '1' + const ethContract = '0x497329439abdc323u497329439abdc323u' + it('should succeed', async () => { + await teleporteos.addchain(ethName, ethId, ethNetId, ethContract, { from: teleporteos.account }) + }); + it('should update stats table', async () => { + const { rows: [item] } = await teleporteos.statsTable() + chai.expect(item.chains.length).equal(1, 'Wrong amount of added chains') + chai.expect(item.chains[0].name).equal(ethName, 'Wrong chain name') + chai.expect(item.chains[0].id).equal(ethId, 'Wrong chain id') + chai.expect(item.chains[0].net_id).equal(ethNetId, 'Wrong chain name') + chai.expect(item.chains[0].contract).equal(ethContract, 'Wrong chain id') + }); + it('should fail with already existing id', async () => { + await assertEOSErrorIncludesMessage( + teleporteos.addchain('ETH', 1, '1', '0x497329439abdc323u497329439abdc323u', { from: teleporteos.account }), + 'This chain is already listed' + ) + }); + it('should succeed to add another three chains', async () => { + await teleporteos.addchain('BSC', 2, '2', '0x497329439abdc323u497329439abdc323u', { from: teleporteos.account }) + await teleporteos.addchain('WAX', 6, '6', 'bridge.chain', { from: teleporteos.account }) + await teleporteos.addchain('BTC', 3, '3', '0x497329439abdc323u497329439abdc323u', { from: teleporteos.account }) + await teleporteos.addchain('TRON', 4, '4', '0x497329439abdc323u497329439abdc323u', { from: teleporteos.account }) + await teleporteos.addchain('XMR', 5, '5', '0x497329439abdc323u497329439abdc323u', { from: teleporteos.account }) + }); + it('should update stats table', async () => { + const { rows: [item] } = await teleporteos.statsTable() + chai.expect(item.chains.length).equal(6, 'Wrong amount of added chains') + }); + }); + }); + // Remove chain + context('remove chain', async () => { + context('without correct auth', async () => { + it('should fail with auth error', async () => { + await assertMissingAuthority( + teleporteos.rmchain(6, { from: sender1 }) + ); + }); + }); + context('with correct auth', async () => { + it('should succeed', async () => { + await teleporteos.rmchain(6, { from: teleporteos.account }) + }); + it('should update stats table', async () => { + const { rows: [item] } = await teleporteos.statsTable() + chai.expect(item.chains.length).equal(5, 'Wrong amount of remaining chains') }); }); }); @@ -480,7 +544,7 @@ describe('teleporteos', async () => { { from: sender1 } ); }); - it('should update table', async () => { + it('should update teleports table', async () => { let { rows: [item] } = await teleporteos.teleportsTable(); chai.expect(item.account).equal(sender1.name); chai.expect(item.chain_id).equal(2); @@ -1054,7 +1118,7 @@ async function issueTokens() { } function amountToAsset(amount: bigint, symbol_name: string, precision: number){ - let s = amount.toString(); + let s = amount.toString().padStart(precision, '0');; let p = s.length - precision; let int = s.substring(0, p); return `${int? int : '0'}${'.'}${s.substring(p)} ${symbol_name}`; From 7ebfed5add6c8ee8a4fea82d95da57d89b8138e6 Mon Sep 17 00:00:00 2001 From: Kevin Kei Tuncer Date: Sat, 30 Apr 2022 14:50:09 +0200 Subject: [PATCH 13/24] Add more parameters to stats table -> EOSIO token contract name -> ETH token contract address -> ETH abbreviation name -> Adjust the tests for it -> Adjust md file for new addchain action --- contracts/teleporteos/README.md | 17 +- .../contracts/teleport/teleporteos.cpp | 7 +- .../contracts/teleport/teleporteos.hpp | 17 +- .../contracts/teleport/teleporteos.test.ts | 837 +++++++++--------- contracts/teleporteos/yarn.lock | 201 +++-- 5 files changed, 561 insertions(+), 518 deletions(-) diff --git a/contracts/teleporteos/README.md b/contracts/teleporteos/README.md index a5e7cb2..8d35342 100644 --- a/contracts/teleporteos/README.md +++ b/contracts/teleporteos/README.md @@ -21,16 +21,15 @@ ACTION ini(asset min, uint64_t fixfee, double varfee, bool freeze, uint32_t thre 3. Add the ethereum chains which are allowed ``` -/** - * @brief Add a bridge to a new chain - * - * @param name Name of the chain to bridge - * @param chain_id Identification number for this new chain - * @param net_id Unique network id to distinguish different chains. See "ChainID" for ethereum based chains on https://chainlist.org/ - * @param contract Contract address - */ - ACTION addchain(string name, uint8_t chain_id, string net_id, string contract); + ACTION addchain(string name, uint8_t chain_id, string teleaddr, string tokenaddr); ``` +- ***name*** Name of the chain to bridge +- ***abbreviation*** Short name of the chain +- ***chain_id*** Identification number for this new chain +- ***net_id*** Unique network id to distinguish different chains. See "ChainID" for ethereum based chains on https://chainlist.org/ +- ***teleaddr*** Teleport contract address +- ***tokenaddr*** Token contract address + With the freeze action you can freeze and unfreeze specific parts of the contract ``` ACTION freeze(const bool in, const bool out, const bool oracles, const bool cancel); diff --git a/contracts/teleporteos/contracts/teleport/teleporteos.cpp b/contracts/teleporteos/contracts/teleport/teleporteos.cpp index 19904b9..b46144a 100644 --- a/contracts/teleporteos/contracts/teleport/teleporteos.cpp +++ b/contracts/teleporteos/contracts/teleport/teleporteos.cpp @@ -18,6 +18,7 @@ ACTION teleporteos::ini(const asset min, const asset fixfee, const double varfee auto stat = _stats.emplace(get_self(), [&](auto &s) { s.symbol = TOKEN_SYMBOL; + s.tokencontr = TOKEN_CONTRACT; s.min = min.amount; s.fixfee = 0; s.varfee = varfee; @@ -129,7 +130,7 @@ bool teleporteos::hasId(uint8_t chain_id, stats_table::const_iterator stat){ return false; } -ACTION teleporteos::addchain(string name, uint8_t chain_id, string net_id, string contract){ +ACTION teleporteos::addchain(string name, string abbreviation, uint8_t chain_id, string net_id, string teleaddr, string tokenaddr){ require_auth(get_self()); auto stat = _stats.find(TOKEN_SYMBOL.raw()); check(!hasId(chain_id, stat), "This chain is already listed"); @@ -137,8 +138,10 @@ ACTION teleporteos::addchain(string name, uint8_t chain_id, string net_id, strin chainData chain; chain.id = chain_id; chain.name = name; + chain.abbreviation = abbreviation; chain.net_id = net_id; - chain.contract = contract; + chain.teleaddr = teleaddr; + chain.tokenaddr = tokenaddr; _stats.modify(*stat, get_self(), [&](auto &s) { s.chains.push_back(chain); diff --git a/contracts/teleporteos/contracts/teleport/teleporteos.hpp b/contracts/teleporteos/contracts/teleport/teleporteos.hpp index dfd4963..5cc1747 100644 --- a/contracts/teleporteos/contracts/teleport/teleporteos.hpp +++ b/contracts/teleporteos/contracts/teleport/teleporteos.hpp @@ -15,14 +15,17 @@ class [[eosio::contract("teleporteos")]] teleporteos : public contract { private: struct chainData{ - uint8_t id; - string name; - string net_id; - string contract; + uint8_t id; // Id to specify the chain + string name; // Chain name + string abbreviation; // Abbreviation of the chain name + string net_id; // Id used in metamask + string teleaddr; // Teleport contract address + string tokenaddr; // Token contract address }; struct [[eosio::table("stats")]] stats_item { symbol symbol; // Symbol for the token + name tokencontr; // Contract of the token uint64_t min; // Minimum amount for token teleport uint64_t fixfee; // Fix fee for teleports and receipts double varfee; // Variable fee for teleports and receipts @@ -166,11 +169,13 @@ class [[eosio::contract("teleporteos")]] teleporteos : public contract { * @brief Add a bridge to a new chain * * @param name Name of the chain to bridge + * @param abbreviation Short name of the chain * @param chain_id Identification number for this new chain * @param net_id Unique network id to distinguish different chains. See "ChainID" for ethereum based chains on https://chainlist.org/ - * @param contract Contract address + * @param teleaddr Teleport contract address + * @param tokenaddr Token contract address */ - ACTION addchain(string name, uint8_t chain_id, string net_id, string contract); + ACTION addchain(string name, string abbreviation, uint8_t chain_id, string net_id, string teleaddr, string tokenaddr); /** * @brief Remove a bridge diff --git a/contracts/teleporteos/contracts/teleport/teleporteos.test.ts b/contracts/teleporteos/contracts/teleport/teleporteos.test.ts index d1f6850..38f5fe1 100644 --- a/contracts/teleporteos/contracts/teleport/teleporteos.test.ts +++ b/contracts/teleporteos/contracts/teleport/teleporteos.test.ts @@ -13,170 +13,175 @@ import { assertEOSError, UpdateAuth, assertRowsContain, -} from 'lamington'; -import * as chai from 'chai'; +} from 'lamington' +import * as chai from 'chai' -import { Teleporteos } from './teleporteos'; -import { EosioToken } from '../eosio.token/eosio.token'; -import { assert } from 'console'; +import { Teleporteos } from './teleporteos' +import { EosioToken } from '../eosio.token/eosio.token' -const ethToken = '2222222222222222222222222222222222222222222222222222222222222222'; +const ethToken = '2222222222222222222222222222222222222222222222222222222222222222' -const token_symbol = 'TLM'; +const token_contract = 'alien.worlds' +const token_symbol = 'TLM' -let teleporteos: Teleporteos; -let alienworldsToken: EosioToken; +let teleporteos: Teleporteos +let alienworldsToken: EosioToken -let sender1: Account; -let sender2: Account; -let oracle1: Account; -let oracle2: Account; -let oracle3: Account; -let oracle4: Account; +let sender1: Account +let sender2: Account +let oracle1: Account +let oracle2: Account +let oracle3: Account +let oracle4: Account describe('teleporteos', async () => { before(async () => { - await seedAccounts(); - }); + await seedAccounts() + }) // Initialize contract context('initialize contract', async () => { context('without correct auth', async () => { it('should fail with auth error', async () => { await assertMissingAuthority( teleporteos.ini(`100.0000 ${token_symbol}`, `0.0000 ${token_symbol}`, '0', false, 3, 0, { from: sender1 }) - ); - }); - }); + ) + }) + }) context('with correct auth', async () => { it('should succeed', async () => { - await teleporteos.ini(`100.0000 ${token_symbol}`, `0.0000 ${token_symbol}`, '0', false, 3, 0, { from: teleporteos.account }); - }); + await teleporteos.ini(`100.0000 ${token_symbol}`, `0.0000 ${token_symbol}`, '0', false, 3, 0, { from: teleporteos.account }) + }) it('execute again should fail', async () => { await assertEOSErrorIncludesMessage( teleporteos.ini(`50.0000 ${token_symbol}`, `0.0000 ${token_symbol}`, '0', false, 3, 0, { from: teleporteos.account }), 'Already initialized' - ); - }); + ) + }) it('should update stats table', async () => { - let { rows: [item] } = await teleporteos.statsTable(); - chai.expect(item.collected).equal(0, 'Wrong collected'); - chai.expect(item.fin).equal(false, 'Wrong freeze in'); - chai.expect(item.fout).equal(false, 'Wrong freeze out'); - chai.expect(item.fcancel).equal(false, 'Wrong freeze cancel'); - chai.expect(item.foracles).equal(false, 'Wrong freeze oracles'); - chai.expect(item.oracles).equal(0, 'Wrong oracle amount'); - chai.expect(item.min).equal(1000000, 'Wrong minimum transfer amount'); - chai.expect(item.fixfee).equal(0, 'Wrong fix fee'); - chai.expect(item.varfee).equal('0.00000000000000000', 'Wrong variable fee'); - chai.expect(item.version).above(0, 'Wrong version'); - chai.expect(item.chains.length).equal(0, 'Wrong amount of added chains'); - }); - }); - }); + let { rows: [item] } = await teleporteos.statsTable() + chai.expect(item.tokencontr).equal(token_contract, 'Wrong token contract') + chai.expect(item.collected).equal(0, 'Wrong collected') + chai.expect(item.fin).equal(false, 'Wrong freeze in') + chai.expect(item.fout).equal(false, 'Wrong freeze out') + chai.expect(item.fcancel).equal(false, 'Wrong freeze cancel') + chai.expect(item.foracles).equal(false, 'Wrong freeze oracles') + chai.expect(item.oracles).equal(0, 'Wrong oracle amount') + chai.expect(item.min).equal(1000000, 'Wrong minimum transfer amount') + chai.expect(item.fixfee).equal(0, 'Wrong fix fee') + chai.expect(item.varfee).equal('0.00000000000000000', 'Wrong variable fee') + chai.expect(item.version).above(0, 'Wrong version') + chai.expect(item.chains.length).equal(0, 'Wrong amount of added chains') + }) + }) + }) // Add chains context('add chain', async () => { context('without correct auth', async () => { it('should fail with auth error', async () => { await assertMissingAuthority( - teleporteos.addchain('ETH', 1, '1', '0x497329439abdc323u497329439abdc323u', { from: sender1 }) - ); - }); - }); + teleporteos.addchain('Ethereum', 'ETH', 1, '1', '0x497329439abdc323u497329439abdc323u', '0x497329439abdc323u497329439abdc323u', { from: sender1 }) + ) + }) + }) context('with correct auth', async () => { - const ethName = 'ETH' + const ethName = 'Ethereum' + const ethShortName = 'ETH' const ethId = 1 const ethNetId = '1' const ethContract = '0x497329439abdc323u497329439abdc323u' + const ethTokenContract = '0x557329439abdc323u497329439abdc3266' + it('should succeed', async () => { - await teleporteos.addchain(ethName, ethId, ethNetId, ethContract, { from: teleporteos.account }) - }); + await teleporteos.addchain(ethName, ethShortName, ethId, ethNetId, ethContract, ethTokenContract, { from: teleporteos.account }) + }) it('should update stats table', async () => { const { rows: [item] } = await teleporteos.statsTable() chai.expect(item.chains.length).equal(1, 'Wrong amount of added chains') chai.expect(item.chains[0].name).equal(ethName, 'Wrong chain name') chai.expect(item.chains[0].id).equal(ethId, 'Wrong chain id') chai.expect(item.chains[0].net_id).equal(ethNetId, 'Wrong chain name') - chai.expect(item.chains[0].contract).equal(ethContract, 'Wrong chain id') - }); + chai.expect(item.chains[0].teleaddr).equal(ethContract, 'Wrong chain id') + chai.expect(item.chains[0].tokenaddr).equal(ethTokenContract, 'Wrong chain id') + }) it('should fail with already existing id', async () => { await assertEOSErrorIncludesMessage( - teleporteos.addchain('ETH', 1, '1', '0x497329439abdc323u497329439abdc323u', { from: teleporteos.account }), + teleporteos.addchain(ethName, ethShortName, ethId, ethNetId, ethContract, ethTokenContract, { from: teleporteos.account }), 'This chain is already listed' ) - }); + }) it('should succeed to add another three chains', async () => { - await teleporteos.addchain('BSC', 2, '2', '0x497329439abdc323u497329439abdc323u', { from: teleporteos.account }) - await teleporteos.addchain('WAX', 6, '6', 'bridge.chain', { from: teleporteos.account }) - await teleporteos.addchain('BTC', 3, '3', '0x497329439abdc323u497329439abdc323u', { from: teleporteos.account }) - await teleporteos.addchain('TRON', 4, '4', '0x497329439abdc323u497329439abdc323u', { from: teleporteos.account }) - await teleporteos.addchain('XMR', 5, '5', '0x497329439abdc323u497329439abdc323u', { from: teleporteos.account }) - }); + await teleporteos.addchain('Binance Smart Chain', 'BSC', 2, '2', ethContract, ethTokenContract, { from: teleporteos.account }) + await teleporteos.addchain('WAX', 'WAX', 6, '6', 'bridge.chain', 'my.token', { from: teleporteos.account }) + await teleporteos.addchain('Bitcoin', 'BTC', 3, '3', ethContract, ethTokenContract, { from: teleporteos.account }) + await teleporteos.addchain('TRON', 'TRON', 4, '4', ethContract, ethTokenContract, { from: teleporteos.account }) + await teleporteos.addchain('XMR', 'XMR', 5, '5', ethContract, ethTokenContract, { from: teleporteos.account }) + }) it('should update stats table', async () => { const { rows: [item] } = await teleporteos.statsTable() chai.expect(item.chains.length).equal(6, 'Wrong amount of added chains') - }); - }); - }); + }) + }) + }) // Remove chain context('remove chain', async () => { context('without correct auth', async () => { it('should fail with auth error', async () => { await assertMissingAuthority( teleporteos.rmchain(6, { from: sender1 }) - ); - }); - }); + ) + }) + }) context('with correct auth', async () => { it('should succeed', async () => { await teleporteos.rmchain(6, { from: teleporteos.account }) - }); + }) it('should update stats table', async () => { const { rows: [item] } = await teleporteos.statsTable() chai.expect(item.chains.length).equal(5, 'Wrong amount of remaining chains') - }); - }); - }); + }) + }) + }) // Recoracle context('regoracle', async () => { context('without correct auth', async () => { it('should fail with auth error', async () => { await assertMissingAuthority( teleporteos.regoracle(oracle1.name, { from: sender1 }) - ); - }); - }); + ) + }) + }) context('with correct auth', async () => { it('should succeed for oracle1', async () => { await teleporteos.regoracle(oracle1.name, { from: teleporteos.account, - }); - }); + }) + }) it('should succeed to add another oracle', async () => { await teleporteos.regoracle(oracle2.name, { from: teleporteos.account, - }); - }); + }) + }) it('should succeed to add another oracle', async () => { await teleporteos.regoracle(oracle3.name, { from: teleporteos.account, - }); - }); + }) + }) it('should succeed to add another oracle', async () => { await teleporteos.regoracle(oracle4.name, { from: teleporteos.account, - }); - }); + }) + }) it('should update oracles table', async () => { await assertRowsEqual(teleporteos.oraclesTable(), [ { account: oracle1.name }, { account: oracle2.name }, { account: oracle3.name }, { account: oracle4.name }, - ]); - }); - }); - }); + ]) + }) + }) + }) // Unrecoracle context('unregoracle', async () => { @@ -184,24 +189,24 @@ describe('teleporteos', async () => { it('should fail with auth error', async () => { await assertMissingAuthority( teleporteos.unregoracle(oracle4.name, { from: sender1 }) - ); - }); - }); + ) + }) + }) context('with correct auth', async () => { it('should succeed', async () => { await teleporteos.unregoracle(oracle4.name, { from: teleporteos.account, - }); - }); + }) + }) it('should update oracles table', async () => { await assertRowsEqual(teleporteos.oraclesTable(), [ { account: oracle1.name }, { account: oracle2.name }, { account: oracle3.name }, - ]); - }); - }); - }); + ]) + }) + }) + }) context('received from BSC/ETH', async () => { context('with unregistered oracle', async () => { it('should fail', async () => { @@ -218,9 +223,9 @@ describe('teleporteos', async () => { } ), 'Account is not an oracle' - ); - }); - }); + ) + }) + }) context('with registered oracle', async () => { context('with wrong auth', async () => { it('should fail with auth error', async () => { @@ -234,9 +239,9 @@ describe('teleporteos', async () => { true, { from: sender1 } ) - ); - }); - }); + ) + }) + }) context('with correct auth', async () => { it('should succeed', async () => { await teleporteos.received( @@ -247,8 +252,8 @@ describe('teleporteos', async () => { 2, true, { from: oracle3 } - ); - }); + ) + }) it('should insert into receipt table', async () => { await assertRowsEqual(teleporteos.receiptsTable(), [ { @@ -262,10 +267,10 @@ describe('teleporteos', async () => { ref: '1111111111111111111111111111111111111111111111111111111111111111', to: sender1.name, }, - ]); - }); - }); - }); + ]) + }) + }) + }) context('with another registered oracle', async () => { it('should add another receipt to existing', async () => { await teleporteos.received( @@ -276,9 +281,9 @@ describe('teleporteos', async () => { 2, true, { from: oracle1 } - ); - }); - }); + ) + }) + }) context('with mismatch quantity', async () => { it('should fail with Quantity mismatch error', async () => { await assertEOSErrorIncludesMessage( @@ -292,9 +297,9 @@ describe('teleporteos', async () => { { from: oracle3 } ), 'Quantity mismatch' - ); - }); - }); + ) + }) + }) context('with account mismatch', async () => { it('should fail with account mismatch error', async () => { await assertEOSErrorIncludesMessage( @@ -308,9 +313,9 @@ describe('teleporteos', async () => { { from: oracle3 } ), 'Account mismatch' - ); - }); - }); + ) + }) + }) context('with already signed oracle', async () => { it('should fail with already approved error', async () => { await assertEOSErrorIncludesMessage( @@ -324,9 +329,9 @@ describe('teleporteos', async () => { { from: oracle3 } ), 'Oracle has already approved' - ); - }); - }); + ) + }) + }) context('with 3 full approvals', async () => { it('should succeed', async () => { await teleporteos.received( @@ -339,8 +344,8 @@ describe('teleporteos', async () => { { from: oracle2, } - ); - }); + ) + }) it('should transfer tokens', async () => { await assertRowsEqual( alienworldsToken.accountsTable({ scope: sender1.name }), @@ -349,8 +354,8 @@ describe('teleporteos', async () => { balance: `1000123.0000 ${token_symbol}`, }, ] - ); - }); + ) + }) it('should update receipt table', async () => { await assertRowsEqual(teleporteos.receiptsTable(), [ { @@ -364,10 +369,10 @@ describe('teleporteos', async () => { ref: '1111111111111111111111111111111111111111111111111111111111111111', to: sender1.name, }, - ]); - }); - }); - }); + ]) + }) + }) + }) // Recrepair context('recrepair', async () => { @@ -380,17 +385,17 @@ describe('teleporteos', async () => { 2, true, { from: oracle1 } - ); - }); + ) + }) context('with wrong auth', async () => { it('should fail', async () => { await assertMissingAuthority( teleporteos.repairrec(1, `123.0000 ${token_symbol}`, [oracle1.name], true, { from: sender1, }) - ); - }); - }); + ) + }) + }) context('wirth correct auth', async () => { context('with non-existing receipt', async () => { it('should fail', async () => { @@ -399,10 +404,10 @@ describe('teleporteos', async () => { from: teleporteos.account, }), 'Receipt does not exist.' - ); - }); - }); - }); + ) + }) + }) + }) context('with existing receipt', async () => { context('with invalid quantity', async () => { it('should fail', async () => { @@ -411,9 +416,9 @@ describe('teleporteos', async () => { from: teleporteos.account, }), 'Asset not valid' - ); - }); - }); + ) + }) + }) context('with negative quantity', async () => { it('should fail', async () => { await assertEOSErrorIncludesMessage( @@ -421,9 +426,9 @@ describe('teleporteos', async () => { from: teleporteos.account, }), 'Quantity cannot be negative' - ); - }); - }); + ) + }) + }) context('with valid params', async () => { it('should succeed', async () => { await teleporteos.repairrec( @@ -432,8 +437,8 @@ describe('teleporteos', async () => { [oracle1.name], false, { from: teleporteos.account } - ); - }); + ) + }) it('should update the receipts table', async () => { await assertRowsEqual(teleporteos.receiptsTable(), [ { @@ -458,11 +463,11 @@ describe('teleporteos', async () => { ref: '1111111111111111111111111111111111111111111111111111111111111112', to: sender1.name, }, - ]); - }); - }); - }); - }); + ]) + }) + }) + }) + }) // Teleport context('teleport', async () => { @@ -472,9 +477,9 @@ describe('teleporteos', async () => { teleporteos.teleport(sender1.name, `123.0000 ${token_symbol}`, 2, ethToken, { from: sender2, }) - ); - }); - }); + ) + }) + }) context('with valid auth', async () => { context('with invalid quantity', async () => { it('should fail with valid error', async () => { @@ -483,9 +488,9 @@ describe('teleporteos', async () => { from: sender1, }), 'Amount is not valid' - ); - }); - }); + ) + }) + }) context('with amount below minimum', async () => { it('should fail with below min error error', async () => { await assertEOSErrorIncludesMessage( @@ -493,9 +498,9 @@ describe('teleporteos', async () => { from: sender1, }), 'Transfer is below minimum token amount' - ); - }); - }); + ) + }) + }) context('with no available deposit', async () => { it('should fail with no deposit error', async () => { await assertEOSErrorIncludesMessage( @@ -503,9 +508,9 @@ describe('teleporteos', async () => { from: sender1, }), 'Deposit not found' - ); - }); - }); + ) + }) + }) context('with not enough deposit', async () => { before(async () => { await alienworldsToken.transfer( @@ -514,17 +519,17 @@ describe('teleporteos', async () => { `120.0000 ${token_symbol}`, 'teleport test', { from: sender1 } - ); - }); + ) + }) it('should fail with not enough deposit error', async () => { await assertEOSErrorIncludesMessage( teleporteos.teleport(sender1.name, `123.0000 ${token_symbol}`, 2, ethToken, { from: sender1, }), 'Not enough deposited' - ); - }); - }); + ) + }) + }) context('with enough deposit', async () => { before(async () => { await alienworldsToken.transfer( @@ -533,8 +538,8 @@ describe('teleporteos', async () => { `104.0000 ${token_symbol}`, 'teleport test extra amount', { from: sender1 } - ); - }); + ) + }) it('should succeed', async () => { await teleporteos.teleport( sender1.name, @@ -542,22 +547,22 @@ describe('teleporteos', async () => { 2, ethToken, { from: sender1 } - ); - }); + ) + }) it('should update teleports table', async () => { - let { rows: [item] } = await teleporteos.teleportsTable(); - chai.expect(item.account).equal(sender1.name); - chai.expect(item.chain_id).equal(2); - chai.expect(item.id).equal(0); - chai.expect(item.quantity).equal(`123.0000 ${token_symbol}`); - chai.expect(item.eth_address).equal(ethToken); - chai.expect(item.oracles).empty; - chai.expect(item.signatures).empty; - chai.expect(item.claimed).false; - }); - }); - }); - }); + let { rows: [item] } = await teleporteos.teleportsTable() + chai.expect(item.account).equal(sender1.name) + chai.expect(item.chain_id).equal(2) + chai.expect(item.id).equal(0) + chai.expect(item.quantity).equal(`123.0000 ${token_symbol}`) + chai.expect(item.eth_address).equal(ethToken) + chai.expect(item.oracles).empty + chai.expect(item.signatures).empty + chai.expect(item.claimed).false + }) + }) + }) + }) // Sign context('sign teleport', async () => { @@ -565,40 +570,40 @@ describe('teleporteos', async () => { it('should fail', async () => { await assertMissingAuthority( teleporteos.sign(oracle1.name, 0, 'abcdefghijklmnopabcdefghijklmnopabcdefghijklmnop', { from: sender1 }) - ); + ) await assertMissingAuthority( teleporteos.sign(oracle1.name, 0, 'abcdefghijklmnopabcdefghijklmnopabcdefghijklmnop', { from: oracle2 }) - ); - }); - }); + ) + }) + }) context('with correct auth', async () => { it('wrong parameters', async () => { await assertEOSErrorIncludesMessage( teleporteos.sign(oracle1.name, 10, 'abcdefghijklmnopabcdefghijklmnopabcdefghijklmnop', { from: oracle1 }), 'Teleport not found' - ); - }); + ) + }) it('should succeed', async () => { - await teleporteos.sign(oracle1.name, 0, 'abcdefghijklmnopabcdefghijklmnopabcdefghijklmnop', { from: oracle1 }); - const { rows: [item] } = await teleporteos.teleportsTable({lowerBound: '0'}); - chai.expect(item.id).equal(0, 'Wrong id'); - chai.expect(item.oracles.length).equal(1, 'Wrong sign amount of oracles'); - chai.expect(item.oracles[0]).equal(oracle1.name, 'Wrong oracle'); - }); + await teleporteos.sign(oracle1.name, 0, 'abcdefghijklmnopabcdefghijklmnopabcdefghijklmnop', { from: oracle1 }) + const { rows: [item] } = await teleporteos.teleportsTable({lowerBound: '0'}) + chai.expect(item.id).equal(0, 'Wrong id') + chai.expect(item.oracles.length).equal(1, 'Wrong sign amount of oracles') + chai.expect(item.oracles[0]).equal(oracle1.name, 'Wrong oracle') + }) it('refuse double signing', async () => { await assertEOSErrorIncludesMessage( teleporteos.sign(oracle1.name, 0, 'abc', { from: oracle1 }), 'Oracle has already signed' - ); - }); + ) + }) it('refuse same signature', async () => { await assertEOSErrorIncludesMessage( teleporteos.sign(oracle2.name, 0, 'abcdefghijklmnopabcdefghijklmnopabcdefghijklmnop', { from: oracle2 }), 'Already signed with this signature' - ); - }); - }); - }); + ) + }) + }) + }) // Teleport claimed context('set teleport claimed', async () => { @@ -606,9 +611,9 @@ describe('teleporteos', async () => { it('should fail', async () => { await assertMissingAuthority( teleporteos.claimed(oracle1.name, 0, ethToken, `123.0000 ${token_symbol}`, { from: sender1 }) - ); - }); - }); + ) + }) + }) context('with correct auth', async () => { context('wrong parameters', async () => { it('should fail', async () => { @@ -620,22 +625,22 @@ describe('teleporteos', async () => { teleporteos.claimed(oracle1.name, 0, ethToken, `1.0000 ${token_symbol}`, { from: oracle1 }), 'Quantity mismatch' ) - }); - }); + }) + }) it('should succeed', async () => { - await teleporteos.claimed(oracle1.name, 0, ethToken, `123.0000 ${token_symbol}`, { from: oracle1 }); - const { rows: [item] } = await teleporteos.teleportsTable({lowerBound: '0'}); - chai.expect(item.id).equal(0, 'Wrong id'); - chai.expect(item.claimed).equal(true); - }); + await teleporteos.claimed(oracle1.name, 0, ethToken, `123.0000 ${token_symbol}`, { from: oracle1 }) + const { rows: [item] } = await teleporteos.teleportsTable({lowerBound: '0'}) + chai.expect(item.id).equal(0, 'Wrong id') + chai.expect(item.claimed).equal(true) + }) it('should refuse double claiming', async () => { await assertEOSErrorIncludesMessage( teleporteos.claimed(oracle1.name, 0, ethToken, `123.0000 ${token_symbol}`, { from: oracle1 }), 'Already marked as claimed' ) - }); - }); - }); + }) + }) + }) // Adjust minimum amount context('adjust minimum amount', async () => { @@ -643,31 +648,31 @@ describe('teleporteos', async () => { it('should fail with auth error', async () => { await assertMissingAuthority( teleporteos.setmin(`200.0000 ${token_symbol}`, { from: sender1 }) - ); - }); - }); + ) + }) + }) context('with correct auth', async () => { it('wrong symbol name should fail', async () => { await assertEOSErrorIncludesMessage( teleporteos.setmin(`200.0000 ${token_symbol.length <= 3? token_symbol + 'A': 'AAA'}`, { from: teleporteos.account }), 'Wrong token' - ); - }); + ) + }) it('wrong symbol precision should fail', async () => { await assertEOSErrorIncludesMessage( teleporteos.setmin(`200 ${token_symbol}`, { from: teleporteos.account }), 'Wrong token' - ); - }); + ) + }) it('should succeed', async () => { await teleporteos.setmin(`200.0000 ${token_symbol}`, { from: teleporteos.account }) - }); + }) it('should update threshold', async () => { - let { rows: [item] } = await teleporteos.statsTable(); - chai.expect(item.min).equal(2000000); - }); - }); - }); + let { rows: [item] } = await teleporteos.statsTable() + chai.expect(item.min).equal(2000000) + }) + }) + }) // Adjust fee context('adjust fee', async () => { @@ -675,152 +680,152 @@ describe('teleporteos', async () => { it('should fail with auth error', async () => { await assertMissingAuthority( teleporteos.setfee(`0.1000 ${token_symbol}`, '0.003', { from: sender1 }) - ); - }); - }); + ) + }) + }) context('with correct auth', async () => { context('with wrong variable fee', async () => { it('should fail', async () => { await assertEOSErrorIncludesMessage( teleporteos.setfee(`0.0000 ${token_symbol}`, '-0.01', { from: teleporteos.account }), 'Variable fee has to be between 0 and 0.20' - ); - }); + ) + }) it('should fail', async () => { await assertEOSErrorIncludesMessage( teleporteos.setfee(`0.0000 ${token_symbol}`, '1', { from: teleporteos.account }), 'Variable fee has to be between 0 and 0.20' - ); - }); - }); + ) + }) + }) context('with wrong fix fee', async () => { it('wrong symbol name should fail', async () => { await assertEOSErrorIncludesMessage( teleporteos.setfee(`0.0001 ${token_symbol.length <= 3? token_symbol + 'A': 'AAA'}`, '0', { from: teleporteos.account }), 'Wrong token' - ); - }); + ) + }) it('wrong symbol precision should fail', async () => { await assertEOSErrorIncludesMessage( teleporteos.setfee(`1 ${token_symbol}`, '0.003', { from: teleporteos.account }), 'Wrong token' - ); - }); + ) + }) it('too high amount should fail', async () => { await assertEOSErrorIncludesMessage( teleporteos.setfee(`200.0000 ${token_symbol}`, '0.003', { from: teleporteos.account }), 'Fees are too high relative to the minimum amount of token transfers' - ); - }); - }); + ) + }) + }) it('should succeed', async () => { - await teleporteos.setfee(`0.1000 ${token_symbol}`, '0.003', { from: teleporteos.account }); - }); + await teleporteos.setfee(`0.1000 ${token_symbol}`, '0.003', { from: teleporteos.account }) + }) it('should update stats table', async () => { - let { rows: [item] } = await teleporteos.statsTable(); - chai.expect(item.fixfee).equal(1000, 'Wrong fix fee'); - chai.expect(item.varfee).equal('0.00300000000000000', 'Wrong variable fee'); - }); + let { rows: [item] } = await teleporteos.statsTable() + chai.expect(item.fixfee).equal(1000, 'Wrong fix fee') + chai.expect(item.varfee).equal('0.00300000000000000', 'Wrong variable fee') + }) it('should succeed withdraw and deposit', async () => { - await teleporteos.withdraw(sender1.name, `1.0000 ${token_symbol}`, { from: sender1 }); + await teleporteos.withdraw(sender1.name, `1.0000 ${token_symbol}`, { from: sender1 }) { - let { rows } = await teleporteos.depositsTable(); + let { rows } = await teleporteos.depositsTable() for(let item of rows){ if(item.account == sender1.name){ - chai.expect(item.quantity).equal(`100.0000 ${token_symbol}`, 'Wrong deposit on withdraw'); - break; + chai.expect(item.quantity).equal(`100.0000 ${token_symbol}`, 'Wrong deposit on withdraw') + break } } } let { rows: [item_balance] } = await alienworldsToken.accountsTable({scope: sender1.name}) - chai.expect(item_balance.balance).equal(`999900.0000 ${token_symbol}`, 'Wrong balance after withdraw'); + chai.expect(item_balance.balance).equal(`999900.0000 ${token_symbol}`, 'Wrong balance after withdraw') await alienworldsToken.transfer( sender1.name, teleporteos.account.name, `200.0000 ${token_symbol}`, 'teleport test', { from: sender1 } - ); - let deposits = await teleporteos.depositsTable(); + ) + let deposits = await teleporteos.depositsTable() for(let item of deposits.rows){ if(item.account == sender1.name){ - chai.expect(item.quantity).equal(`300.0000 ${token_symbol}`, 'Wrong balance on deposit'); - break; + chai.expect(item.quantity).equal(`300.0000 ${token_symbol}`, 'Wrong balance on deposit') + break } } - }); + }) it('should succeed teleport', async () => { - await teleporteos.teleport(sender1.name, `200.0000 ${token_symbol}`, 2, ethToken, { from: sender1 }); - let deposits = await teleporteos.depositsTable(); + await teleporteos.teleport(sender1.name, `200.0000 ${token_symbol}`, 2, ethToken, { from: sender1 }) + let deposits = await teleporteos.depositsTable() for(let item of deposits.rows){ if(item.account == sender1.name){ - chai.expect(item.quantity).equal(`100.0000 ${token_symbol}`, 'Wrong balance on deposit'); - break; + chai.expect(item.quantity).equal(`100.0000 ${token_symbol}`, 'Wrong balance on deposit') + break } } // Check collected amount - const value = BigInt(2000000); - const fee = calcFee(value, BigInt(1000), 0.003); - let { rows: [stat] } = await teleporteos.statsTable(); - chai.expect(stat.collected.toString()).equal(fee.toString(), "Wrong collected fee amount"); + const value = BigInt(2000000) + const fee = calcFee(value, BigInt(1000), 0.003) + let { rows: [stat] } = await teleporteos.statsTable() + chai.expect(stat.collected.toString()).equal(fee.toString(), "Wrong collected fee amount") // check teleport amount - let teleports = await teleporteos.teleportsTable({reverse: true}); - chai.expect(teleports.rows[0].quantity).equal(amountToAsset(value - fee, token_symbol, 4), "Wrong fee calculation"); - }); + let teleports = await teleporteos.teleportsTable({reverse: true}) + chai.expect(teleports.rows[0].quantity).equal(amountToAsset(value - fee, token_symbol, 4), "Wrong fee calculation") + }) it('should succeed receipt', async () => { // Get current balance of sender 1 on token contract let { rows: [a_item_old] } = await alienworldsToken.accountsTable({scope: sender1.name}) - let sender1Balance = stringToAsset(a_item_old.balance).amount; + let sender1Balance = stringToAsset(a_item_old.balance).amount // Get current balance of sender 1 on deposits - let sender1DepositBalance = BigInt(0); - let deposits_old = await teleporteos.depositsTable(); + let sender1DepositBalance = BigInt(0) + let deposits_old = await teleporteos.depositsTable() for(let item of deposits_old.rows){ if(item.account == sender1.name){ sender1DepositBalance = stringToAsset(item.quantity).amount - break; + break } } // Get current stat let { rows: [stat_old] } = await teleporteos.statsTable() // Send received action by three oracles, so it should be completed - const hash = '1111111111111111111111111111111111111111111111111111111111111113'; - const sendAmount = BigInt(1230); - const sendAsset = amountToAsset(sendAmount, token_symbol, 4); + const hash = '1111111111111111111111111111111111111111111111111111111111111113' + const sendAmount = BigInt(1230) + const sendAsset = amountToAsset(sendAmount, token_symbol, 4) // Execute recepits with three oracles await teleporteos.received( oracle1.name, sender1.name, hash, sendAsset, 2, true, { from: oracle1 } - ); + ) await teleporteos.received( oracle2.name, sender1.name, hash, sendAsset, 2, true, { from: oracle2 } - ); + ) await teleporteos.received( oracle3.name, sender1.name, hash, sendAsset, 2, true, { from: oracle3 } - ); + ) let { rows: [confirmedItem] } = await teleporteos.receiptsTable({ keyType: 'sha256', indexPosition: 2, lowerBound: hash - }); - chai.expect(confirmedItem.confirmations).equal(3, "Wrong amount of confirmations"); - chai.expect(confirmedItem.completed).equal(true, "Not completed"); + }) + chai.expect(confirmedItem.confirmations).equal(3, "Wrong amount of confirmations") + chai.expect(confirmedItem.completed).equal(true, "Not completed") // Check collected - const fee = calcFee(sendAmount, BigInt(1000), 0.003); - let { rows: [stat_new] } = await teleporteos.statsTable(); - chai.expect(stat_new.collected.toString()).equal((BigInt(stat_old.collected) + fee).toString(), "Collected got wrong amount of fees"); + const fee = calcFee(sendAmount, BigInt(1000), 0.003) + let { rows: [stat_new] } = await teleporteos.statsTable() + chai.expect(stat_new.collected.toString()).equal((BigInt(stat_old.collected) + fee).toString(), "Collected got wrong amount of fees") // Check new balance on token contract let { rows: [a_item_new] } = await alienworldsToken.accountsTable({scope: sender1.name}) - chai.expect(stringToAsset(a_item_new.balance).amount.toString()).equal((sender1Balance + sendAmount - fee).toString(), "New Balance reduced by a fee is wrong"); + chai.expect(stringToAsset(a_item_new.balance).amount.toString()).equal((sender1Balance + sendAmount - fee).toString(), "New Balance reduced by a fee is wrong") // Check if deposit table is unchanged - let deposits_new = await teleporteos.depositsTable(); + let deposits_new = await teleporteos.depositsTable() for(let item of deposits_new.rows){ if(item.account == sender1.name){ chai.expect(stringToAsset(item.quantity).amount.toString()).equal(sender1DepositBalance.toString(), "Deposit has changed") - break; + break } } - }); - }); - }); + }) + }) + }) // Adjust threshold context('adjust threshold', async () => { @@ -828,59 +833,59 @@ describe('teleporteos', async () => { it('should fail with auth error', async () => { await assertMissingAuthority( teleporteos.setthreshold(2, { from: sender1 }) - ); - }); - }); + ) + }) + }) context('with correct auth', async () => { context('incorrect amount', async () => { it('should fail', async () => { await assertEOSErrorIncludesMessage( teleporteos.setthreshold(0, { from: teleporteos.account }), 'Needed confirmation amount has to be grater than 0' - ); - }); - }); + ) + }) + }) it('should succeed receipt', async () => { // Set threshold to 2 await teleporteos.setthreshold(2, { from: teleporteos.account }) // Check stats - let { rows: [stat] } = await teleporteos.statsTable(); - chai.expect(stat.threshold).equal(2, "Threshold was not was not inherited"); + let { rows: [stat] } = await teleporteos.statsTable() + chai.expect(stat.threshold).equal(2, "Threshold was not was not inherited") // Send received action by three oracles, so it should be completed - const hash = '1111111111111111111111111111111111111111111111111111111111111114'; - const sendAmount = BigInt(10000); - const sendAsset = amountToAsset(sendAmount, token_symbol, 4); + const hash = '1111111111111111111111111111111111111111111111111111111111111114' + const sendAmount = BigInt(10000) + const sendAsset = amountToAsset(sendAmount, token_symbol, 4) // Execute recepits by one oracles await teleporteos.received( oracle1.name, sender1.name, hash, sendAsset, 1, true, { from: oracle1 } - ); + ) let { rows: [unconfItem] } = await teleporteos.receiptsTable({ keyType: 'sha256', indexPosition: 2, lowerBound: hash - }); - chai.expect(unconfItem.confirmations).equal(1, "Wrong amount of confirmations"); - chai.expect(unconfItem.completed).equal(false, "Is completed"); + }) + chai.expect(unconfItem.confirmations).equal(1, "Wrong amount of confirmations") + chai.expect(unconfItem.completed).equal(false, "Is completed") // Execute recepits by a second oracles await teleporteos.received( oracle2.name, sender1.name, hash, sendAsset, 1, true, { from: oracle2 } - ); + ) let { rows: [confItem] } = await teleporteos.receiptsTable({ keyType: 'sha256', indexPosition: 2, lowerBound: hash - }); - chai.expect(confItem.confirmations).equal(2, "Wrong amount of confirmations"); - chai.expect(confItem.completed).equal(true, "Is not completed"); + }) + chai.expect(confItem.confirmations).equal(2, "Wrong amount of confirmations") + chai.expect(confItem.completed).equal(true, "Is not completed") // Execute recepits by a third oracles await assertEOSErrorIncludesMessage( teleporteos.received(oracle3.name, sender1.name, hash, sendAsset, 1, true, { from: oracle3 }), 'This teleport is already completed' - ); - }); - }); - }); + ) + }) + }) + }) // Delete teleports context('delete teleports', async () => { @@ -888,63 +893,63 @@ describe('teleporteos', async () => { it('should fail with auth error', async () => { await assertMissingAuthority( teleporteos.delteles('0', { from: sender1 }) - ); + ) await assertMissingAuthority( teleporteos.delteles('0', { from: oracle1 }) - ); - }); - }); + ) + }) + }) context('with not available id', async () => { it('should fail', async () => { await assertEOSErrorIncludesMessage( teleporteos.delteles('100', { from: teleporteos.account }), 'Teleport id not found' - ); - }); - }); + ) + }) + }) it('preparation', async () => { // Add three teleports - await teleporteos.teleport(alienworldsToken.account.name, `203.0000 ${token_symbol}`, 1, ethToken, { from: alienworldsToken.account }); - await teleporteos.teleport(alienworldsToken.account.name, `203.0000 ${token_symbol}`, 2, ethToken, { from: alienworldsToken.account }); - await teleporteos.teleport(alienworldsToken.account.name, `203.0000 ${token_symbol}`, 3, ethToken, { from: alienworldsToken.account }); - const fee = calcFee(BigInt(2030000), BigInt(1000), 0.003); - const sendAsset = amountToAsset(BigInt(2030000) - fee, token_symbol, 4); + await teleporteos.teleport(alienworldsToken.account.name, `203.0000 ${token_symbol}`, 1, ethToken, { from: alienworldsToken.account }) + await teleporteos.teleport(alienworldsToken.account.name, `203.0000 ${token_symbol}`, 2, ethToken, { from: alienworldsToken.account }) + await teleporteos.teleport(alienworldsToken.account.name, `203.0000 ${token_symbol}`, 3, ethToken, { from: alienworldsToken.account }) + const fee = calcFee(BigInt(2030000), BigInt(1000), 0.003) + const sendAsset = amountToAsset(BigInt(2030000) - fee, token_symbol, 4) // Claim all teleports but not the second in table - await teleporteos.claimed(oracle1.name, 2, ethToken, sendAsset, { from: oracle1 }); - await teleporteos.claimed(oracle1.name, 3, ethToken, sendAsset, { from: oracle1 }); - await teleporteos.claimed(oracle1.name, 4, ethToken, sendAsset, { from: oracle1 }); - }); + await teleporteos.claimed(oracle1.name, 2, ethToken, sendAsset, { from: oracle1 }) + await teleporteos.claimed(oracle1.name, 3, ethToken, sendAsset, { from: oracle1 }) + await teleporteos.claimed(oracle1.name, 4, ethToken, sendAsset, { from: oracle1 }) + }) context('with correct auth', async () => { context('delete to id 2', async () => { it('should succeed', async () => { // Delete until the third one - await teleporteos.delteles('2', { from: teleporteos.account }); - const teleports = await teleporteos.teleportsTable(); - chai.expect(teleports.rows.length).equal(4, 'Wrong amount of teleports are deleted'); - chai.expect(teleports.rows[0].id).equal(1, 'Wrong deletion'); - chai.expect(teleports.rows[1].id).equal(2, 'Wrong deletion'); - chai.expect(teleports.rows[2].id).equal(3, 'Wrong deletion'); - chai.expect(teleports.rows[3].id).equal(4, 'Wrong deletion'); - }); - }); + await teleporteos.delteles('2', { from: teleporteos.account }) + const teleports = await teleporteos.teleportsTable() + chai.expect(teleports.rows.length).equal(4, 'Wrong amount of teleports are deleted') + chai.expect(teleports.rows[0].id).equal(1, 'Wrong deletion') + chai.expect(teleports.rows[1].id).equal(2, 'Wrong deletion') + chai.expect(teleports.rows[2].id).equal(3, 'Wrong deletion') + chai.expect(teleports.rows[3].id).equal(4, 'Wrong deletion') + }) + }) context('delete to last id', async () => { it('should fail', async () => { await assertEOSErrorIncludesMessage( teleporteos.delteles('5', { from: teleporteos.account }), 'Teleport id not found' - ); - }); + ) + }) it('should succeed', async () => { // Delete until the third one - await teleporteos.delteles('4', { from: teleporteos.account }); - const teleports = await teleporteos.teleportsTable(); - chai.expect(teleports.rows.length).equal(2, 'Wrong amount of teleports are deleted'); - chai.expect(teleports.rows[0].id).equal(1, 'Wrong deletion'); - chai.expect(teleports.rows[1].id).equal(4, 'Wrong deletion'); - }); - }); - }); - }); + await teleporteos.delteles('4', { from: teleporteos.account }) + const teleports = await teleporteos.teleportsTable() + chai.expect(teleports.rows.length).equal(2, 'Wrong amount of teleports are deleted') + chai.expect(teleports.rows[0].id).equal(1, 'Wrong deletion') + chai.expect(teleports.rows[1].id).equal(4, 'Wrong deletion') + }) + }) + }) + }) // Cancel action context('cancel teleport', async () => { @@ -952,102 +957,102 @@ describe('teleporteos', async () => { it('should fail with auth error', async () => { await assertMissingAuthority( teleporteos.cancel('1', { from: oracle1 }) - ); - }); - }); + ) + }) + }) context('with correct auth', async () => { it('should fail when it is claimed', async () => { await assertEOSErrorIncludesMessage( teleporteos.cancel('4', { from: alienworldsToken.account }), 'Teleport is already claimed' - ); - }); + ) + }) it('should fail when it is too early', async () => { await assertEOSErrorIncludesMessage( teleporteos.cancel('1', { from: sender1 }), 'Teleport has not expired' - ); - }); - }); - }); + ) + }) + }) + }) // Pay oracles context('pay oracles', async () => { - const {rows: [initialStat]} = await teleporteos.statsTable(); - const amountPerOracle = Math.floor(Number(initialStat.collected) / initialStat.oracles); - const rest = Number(initialStat.collected) - amountPerOracle; + const {rows: [initialStat]} = await teleporteos.statsTable() + const amountPerOracle = Math.floor(Number(initialStat.collected) / initialStat.oracles) + const rest = Number(initialStat.collected) - amountPerOracle it('should succeed', async () => { - await teleporteos.payoracles({ from: sender1 }); - }); + await teleporteos.payoracles({ from: sender1 }) + }) // Check rest - const {rows: [stat]} = await teleporteos.statsTable(); - chai.expect(stat.collected).equal(rest, 'Wrong collected rest'); + const {rows: [stat]} = await teleporteos.statsTable() + chai.expect(stat.collected).equal(rest, 'Wrong collected rest') // Check oracle deposit amounts - const deposits = await teleporteos.depositsTable({lowerBound: oracle1.name}); - chai.expect(stringToAsset(deposits.rows[0].quantity).amount).equal(amountPerOracle, 'Wrong amount for oracle'); - chai.expect(stringToAsset(deposits.rows[1].quantity).amount).equal(amountPerOracle, 'Wrong amount for oracle'); - chai.expect(stringToAsset(deposits.rows[2].quantity).amount).equal(amountPerOracle, 'Wrong amount for oracle'); - }); + const deposits = await teleporteos.depositsTable({lowerBound: oracle1.name}) + chai.expect(stringToAsset(deposits.rows[0].quantity).amount).equal(amountPerOracle, 'Wrong amount for oracle') + chai.expect(stringToAsset(deposits.rows[1].quantity).amount).equal(amountPerOracle, 'Wrong amount for oracle') + chai.expect(stringToAsset(deposits.rows[2].quantity).amount).equal(amountPerOracle, 'Wrong amount for oracle') + }) // Delete receipts context('delete receipts', async () => { - const initialReceipts = await teleporteos.receiptsTable(); - const secondDate = initialReceipts.rows[1].date; - const lastDate = initialReceipts.rows[initialReceipts.rows.length - 1].date; + const initialReceipts = await teleporteos.receiptsTable() + const secondDate = initialReceipts.rows[1].date + const lastDate = initialReceipts.rows[initialReceipts.rows.length - 1].date context('with incorrect auth', async () => { it('should fail with auth error', async () => { await assertMissingAuthority( teleporteos.delreceipts(lastDate, { from: sender1 }) - ); + ) await assertMissingAuthority( teleporteos.delreceipts(lastDate, { from: oracle1 }) - ); - }); - }); + ) + }) + }) context('with correct auth', async () => { context('delete to id 2', async () => { it('should succeed', async () => { // Delete until the third one - await teleporteos.delreceipts(secondDate, { from: teleporteos.account }); - const receipts = await teleporteos.receiptsTable(); - chai.expect(receipts.rows.length).equal(3, 'Wrong amount of receipts are deleted'); - chai.expect(receipts.rows[0].id).equal(1, 'Wrong deletion'); - chai.expect(receipts.rows[1].id).equal(2, 'Wrong deletion'); - chai.expect(receipts.rows[2].id).equal(3, 'Wrong deletion'); - }); - }); + await teleporteos.delreceipts(secondDate, { from: teleporteos.account }) + const receipts = await teleporteos.receiptsTable() + chai.expect(receipts.rows.length).equal(3, 'Wrong amount of receipts are deleted') + chai.expect(receipts.rows[0].id).equal(1, 'Wrong deletion') + chai.expect(receipts.rows[1].id).equal(2, 'Wrong deletion') + chai.expect(receipts.rows[2].id).equal(3, 'Wrong deletion') + }) + }) context('delete all', async () => { it('should succeed', async () => { // Delete until the third one - await teleporteos.delreceipts(new Date(lastDate.getTime() + 1), { from: teleporteos.account }); - const receipts = await teleporteos.receiptsTable(); - chai.expect(receipts.rows.length).equal(0, 'Not all deleted'); - }); - }); - }); - }); -}); + await teleporteos.delreceipts(new Date(lastDate.getTime() + 1), { from: teleporteos.account }) + const receipts = await teleporteos.receiptsTable() + chai.expect(receipts.rows.length).equal(0, 'Not all deleted') + }) + }) + }) + }) +}) async function seedAccounts() { teleporteos = await ContractDeployer.deployWithName( 'contracts/teleport/teleporteos', 'teleporteos' - ); + ) alienworldsToken = await ContractDeployer.deployWithName( 'contracts/eosio.token/eosio.token', 'alien.worlds' - ); + ) - sender1 = await AccountManager.createAccount('sender1'); - sender2 = await AccountManager.createAccount('sender2'); - oracle1 = await AccountManager.createAccount('oracle1'); - oracle2 = await AccountManager.createAccount('oracle2'); - oracle3 = await AccountManager.createAccount('oracle3'); - oracle4 = await AccountManager.createAccount('oracle4'); + sender1 = await AccountManager.createAccount('sender1') + sender2 = await AccountManager.createAccount('sender2') + oracle1 = await AccountManager.createAccount('oracle1') + oracle2 = await AccountManager.createAccount('oracle2') + oracle3 = await AccountManager.createAccount('oracle3') + oracle4 = await AccountManager.createAccount('oracle4') - await issueTokens(); - await updateAuths(); + await issueTokens() + await updateAuths() } async function updateAuths() { @@ -1069,7 +1074,7 @@ async function updateAuths() { ], [{ key: teleporteos.account.publicKey!, weight: 1 }] ) - ); + ) // await UpdateAuth.execLinkAuth( // landholders.account.active, @@ -1077,7 +1082,7 @@ async function updateAuths() { // eosioToken.account.name, // 'transfer', // 'distribpay' - // ); + // ) } async function issueTokens() { @@ -1086,17 +1091,17 @@ async function issueTokens() { alienworldsToken.account.name, `1000000000.0000 ${token_symbol}`, { from: alienworldsToken.account } - ); + ) await alienworldsToken.issue( alienworldsToken.account.name, `10000000.0000 ${token_symbol}`, 'initial deposit', { from: alienworldsToken.account } - ); + ) } catch (e) { if ((e as { json: {error: {what: string } } }).json.error.what != 'eosio_assert_message assertion failure') { - throw e; + throw e } } @@ -1106,7 +1111,7 @@ async function issueTokens() { `1000000.0000 ${token_symbol}`, 'inital balance', { from: alienworldsToken.account } - ); + ) await alienworldsToken.transfer( alienworldsToken.account.name, @@ -1114,25 +1119,25 @@ async function issueTokens() { `1000000.0000 ${token_symbol}`, 'inital balance', { from: alienworldsToken.account } - ); + ) } function amountToAsset(amount: bigint, symbol_name: string, precision: number){ - let s = amount.toString().padStart(precision, '0');; - let p = s.length - precision; - let int = s.substring(0, p); - return `${int? int : '0'}${'.'}${s.substring(p)} ${symbol_name}`; + let s = amount.toString().padStart(precision, '0') + let p = s.length - precision + let int = s.substring(0, p) + return `${int? int : '0'}${'.'}${s.substring(p)} ${symbol_name}` } function stringToAsset(asset_str: string){ - let s = asset_str.indexOf('.'); - let e = asset_str.indexOf(' ', s); - let precision = e - s; - let name = asset_str.substring(e + 1).trim(); - let amount = BigInt(asset_str.substring(0, s) + asset_str.substring(s + 1, e)); + let s = asset_str.indexOf('.') + let e = asset_str.indexOf(' ', s) + let precision = e - s + let name = asset_str.substring(e + 1).trim() + let amount = BigInt(asset_str.substring(0, s) + asset_str.substring(s + 1, e)) return {amount, symbol: {precision, name}} } function calcFee(amount: bigint, fixfeeAmount: bigint, varfee: number){ - return BigInt(Math.floor(Number(amount) * varfee)) + fixfeeAmount; + return BigInt(Math.floor(Number(amount) * varfee)) + fixfeeAmount } \ No newline at end of file diff --git a/contracts/teleporteos/yarn.lock b/contracts/teleporteos/yarn.lock index 4c73ae3..b10995a 100644 --- a/contracts/teleporteos/yarn.lock +++ b/contracts/teleporteos/yarn.lock @@ -47,9 +47,9 @@ "@types/responselike" "*" "@types/chai-as-promised@^7.1.2", "@types/chai-as-promised@^7.1.3": - version "7.1.4" - resolved "https://registry.yarnpkg.com/@types/chai-as-promised/-/chai-as-promised-7.1.4.tgz#caf64e76fb056b8c8ced4b761ed499272b737601" - integrity sha512-1y3L1cHePcIm5vXkh1DSGf/zQq5n5xDKG1fpCvf18+uOkpce0Z1ozNFPkyWsVswK7ntN1sZBw3oU6gmN+pDUcA== + version "7.1.5" + resolved "https://registry.yarnpkg.com/@types/chai-as-promised/-/chai-as-promised-7.1.5.tgz#6e016811f6c7a64f2eed823191c3a6955094e255" + integrity sha512-jStwss93SITGBwt/niYrkf2C+/1KTeZCZl1LaeezTlqppAKeoQC7jxyqYuP72sxBGKCIbw7oHgbYssIRzT5FCQ== dependencies: "@types/chai" "*" @@ -61,9 +61,9 @@ "@types/chai" "*" "@types/chai@*", "@types/chai@latest": - version "4.3.0" - resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.0.tgz#23509ebc1fa32f1b4d50d6a66c4032d5b8eaabdc" - integrity sha512-/ceqdqeRraGolFTcfoXNiqjyQhZzbINDngeoAq9GoHa8PPK1yNzTaxWjA6BFWp5Ua9JpXEMSS4s5i9tS0hOJtw== + version "4.3.1" + resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.1.tgz#e2c6e73e0bdeb2521d00756d099218e9f5d90a04" + integrity sha512-/zPMqDkzSZ8t3VtxOa4KPq7uzzW978M9Tvh+j7GHKuo6k6GTLxPJ4J5gE5cjfJ26pnXst0N5Hax8Sr0T2Mi9zQ== "@types/elliptic@^6.4.12": version "6.4.14" @@ -77,15 +77,20 @@ resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz#0ea7b61496902b95890dc4c3a116b60cb8dae812" integrity sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ== +"@types/json-buffer@~3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/json-buffer/-/json-buffer-3.0.0.tgz#85c1ff0f0948fc159810d4b5be35bf8c20875f64" + integrity sha512-3YP80IxxFJB4b5tYC2SUPwkg0XQLiu0nWvhRgEatgjf+29IcWO9X1k8xRv5DGssJ/lCrjYTjQPcobJr2yWIVuQ== + "@types/json5@^0.0.29": version "0.0.29" resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4= "@types/keyv@*": - version "3.1.3" - resolved "https://registry.yarnpkg.com/@types/keyv/-/keyv-3.1.3.tgz#1c9aae32872ec1f20dcdaee89a9f3ba88f465e41" - integrity sha512-FXCJgyyN3ivVgRoml4h94G/p3kY+u/B86La+QptcqJaWtBWtmc6TtkNfS40n9bIvyLteHh7zXOtgbobORKPbDg== + version "3.1.4" + resolved "https://registry.yarnpkg.com/@types/keyv/-/keyv-3.1.4.tgz#3ccdb1c6751b0c7e52300bcdacd5bcbf8faa75b6" + integrity sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg== dependencies: "@types/node" "*" @@ -95,14 +100,14 @@ integrity sha512-Z3TNyBL8Vd/M9D9Ms2S3LmFq2sSMzahodD6rCS9V2N44HUMINb75jNkSuwAx7eo2ufqTdfOdtGQpNbieUjPQmw== "@types/mocha@latest": - version "9.1.0" - resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-9.1.0.tgz#baf17ab2cca3fcce2d322ebc30454bff487efad5" - integrity sha512-QCWHkbMv4Y5U9oW10Uxbr45qMMSzl4OzijsozynUAgx3kEHUdXB00udx2dWDQ7f2TU2a2uuiFaRZjCe3unPpeg== + version "9.1.1" + resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-9.1.1.tgz#e7c4f1001eefa4b8afbd1eee27a237fee3bf29c4" + integrity sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw== "@types/node@*": - version "17.0.15" - resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.15.tgz#97779282c09c09577120a2162e71d8380003590a" - integrity sha512-zWt4SDDv1S9WRBNxLFxFRHxdD9tvH8f5/kg5/IaLFdnSNXsDY4eL3Q3XXN+VxUnWIhyVFDwcsmAprvwXoM/ClA== + version "17.0.30" + resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.30.tgz#2c6e8512acac70815e8176aa30c38025067880ef" + integrity sha512-oNBIZjIqyHYP8VCNAV9uEytXVeXG2oR0w9lgAXro20eugRQfY002qr3CUl6BAe+Yf/z3CRjPdz27Pu6WWtuSRw== "@types/responselike@*", "@types/responselike@^1.0.0": version "1.0.0" @@ -124,14 +129,14 @@ ansi-colors@4.1.1: integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== ansi-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" - integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= + version "3.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.1.tgz#123d6479e92ad45ad897d4054e3c7ca7db4944e1" + integrity sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw== ansi-regex@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" - integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== + version "4.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.1.tgz#164daac87ab2d6f6db3a29875e2d1766582dabed" + integrity sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g== ansi-regex@^5.0.1: version "5.0.1" @@ -513,6 +518,14 @@ commander@6.0.0: resolved "https://registry.yarnpkg.com/commander/-/commander-6.0.0.tgz#2b270da94f8fb9014455312f829a1129dbf8887e" integrity sha512-s7EA+hDtTYNhuXkTlhqew4txMZVdszBmKWSPEMxGr8ru8JXR7bLUFIAtPhcSuFdJQ0ILMxnJi8GkQL0yvDy/YA== +compress-brotli@^1.3.6: + version "1.3.6" + resolved "https://registry.yarnpkg.com/compress-brotli/-/compress-brotli-1.3.6.tgz#64bd6f21f4f3e9841dbac392f4c29218caf5e9d9" + integrity sha512-au99/GqZtUtiCBliqLFbWlhnCxn+XSYjwZ77q6mKN4La4qOXDoLVPZ50iXr0WmAyMxl8yqoq3Yq4OeQNPPkyeQ== + dependencies: + "@types/json-buffer" "~3.0.0" + json-buffer "~3.0.1" + concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" @@ -603,11 +616,12 @@ defer-to-connect@^2.0.0: integrity sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg== define-properties@^1.1.2, define-properties@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" - integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== + version "1.1.4" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.4.tgz#0b14d7bd7fbeb2f3572c3a7eda80ea5d57fb05b1" + integrity sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA== dependencies: - object-keys "^1.0.12" + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" diff@4.0.2: version "4.0.2" @@ -686,9 +700,9 @@ eosjs@^20.0.0: text-encoding "0.7.0" es-abstract@^1.17.0-next.1, es-abstract@^1.19.0: - version "1.19.1" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.19.1.tgz#d4885796876916959de78edaa0df456627115ec3" - integrity sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w== + version "1.19.5" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.19.5.tgz#a2cb01eb87f724e815b278b0dd0d00f36ca9a7f1" + integrity sha512-Aa2G2+Rd3b6kxEUKTF4TaW67czBLyAv3z7VOhYRU50YBx+bbsYZ9xQP4lMNazePuFlybXI0V4MruPos7qUo5fA== dependencies: call-bind "^1.0.2" es-to-primitive "^1.2.1" @@ -696,15 +710,15 @@ es-abstract@^1.17.0-next.1, es-abstract@^1.19.0: get-intrinsic "^1.1.1" get-symbol-description "^1.0.0" has "^1.0.3" - has-symbols "^1.0.2" + has-symbols "^1.0.3" internal-slot "^1.0.3" is-callable "^1.2.4" - is-negative-zero "^2.0.1" + is-negative-zero "^2.0.2" is-regex "^1.1.4" - is-shared-array-buffer "^1.0.1" + is-shared-array-buffer "^1.0.2" is-string "^1.0.7" - is-weakref "^1.0.1" - object-inspect "^1.11.0" + is-weakref "^1.0.2" + object-inspect "^1.12.0" object-keys "^1.1.1" object.assign "^4.1.2" string.prototype.trimend "^1.0.4" @@ -787,9 +801,9 @@ flat@^4.1.0: is-buffer "~2.0.3" follow-redirects@^1.14.4: - version "1.14.7" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.7.tgz#2004c02eb9436eee9a21446a6477debf17e81685" - integrity sha512-+hbxoLbFMbRKDwohX8GkTataGqO6Jb7jGwpAlwgy2bIz25XtRm7KEzJM76R1WiNT5SwZkX4Y75SwBolkpmE7iQ== + version "1.14.9" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.9.tgz#dd4ea157de7bfaf9ea9b3fbd85aa16951f78d8d7" + integrity sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w== fs-constants@^1.0.0: version "1.0.0" @@ -905,10 +919,10 @@ growl@1.10.5: resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== -has-bigints@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113" - integrity sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA== +has-bigints@^1.0.1, has-bigints@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" + integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== has-flag@^3.0.0: version "3.0.0" @@ -920,10 +934,17 @@ has-flag@^4.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== -has-symbols@^1.0.0, has-symbols@^1.0.1, has-symbols@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" - integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw== +has-property-descriptors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861" + integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== + dependencies: + get-intrinsic "^1.1.1" + +has-symbols@^1.0.0, has-symbols@^1.0.1, has-symbols@^1.0.2, has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== has-tostringtag@^1.0.0: version "1.0.0" @@ -1067,15 +1088,15 @@ is-map@^2.0.2: resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.2.tgz#00922db8c9bf73e81b7a335827bc2a43f2b91127" integrity sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg== -is-negative-zero@^2.0.1: +is-negative-zero@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== is-number-object@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.6.tgz#6a7aaf838c7f0686a50b4553f7e54a96494e89f0" - integrity sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g== + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" + integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== dependencies: has-tostringtag "^1.0.0" @@ -1102,10 +1123,12 @@ is-set@^2.0.2: resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.2.tgz#90755fa4c2562dc1c5d4024760d6119b94ca18ec" integrity sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g== -is-shared-array-buffer@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz#97b0c85fbdacb59c9c446fe653b82cf2b5b7cfe6" - integrity sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA== +is-shared-array-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" + integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== + dependencies: + call-bind "^1.0.2" is-string@^1.0.5, is-string@^1.0.7: version "1.0.7" @@ -1126,7 +1149,7 @@ is-unicode-supported@^0.1.0: resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== -is-weakref@^1.0.1: +is-weakref@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== @@ -1164,7 +1187,7 @@ js-yaml@3.13.1: argparse "^1.0.7" esprima "^4.0.0" -json-buffer@3.0.1: +json-buffer@3.0.1, json-buffer@~3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== @@ -1177,15 +1200,16 @@ json5@^1.0.1: minimist "^1.2.0" keyv@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.1.0.tgz#8ab5ca4ae6a34e05c629531d9a7f871575af0d5b" - integrity sha512-YsY3wr6HabE11/sscee+3nZ03XjvkrPWGouAmJFBdZoK92wiOlJCzI5/sDEIKdJhdhHO144ei45U9gXfbu14Uw== + version "4.2.2" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.2.2.tgz#4b6f602c0228ef4d8214c03c520bef469ed6b768" + integrity sha512-uYS0vKTlBIjNCAUqrjlxmruxOEiZxZIHXyp32sdcGmP+ukFrmWUnE//RcPXJH3Vxrni1H2gsQbjHE0bH7MtMQQ== dependencies: + compress-brotli "^1.3.6" json-buffer "3.0.1" "lamington@https://github.com/Alien-Worlds/lamington.git": version "1.0.0-alpha.6" - resolved "https://github.com/Alien-Worlds/lamington.git#5fc2f5c49d03a1bd1f15399a1326bf323ac56039" + resolved "https://github.com/Alien-Worlds/lamington.git#eb4c1be33d5cdd5a76b3d670735483e2d35302af" dependencies: "@types/chai-as-promised" "^7.1.3" "@types/elliptic" "^6.4.12" @@ -1264,9 +1288,9 @@ long@~3: integrity sha1-2CG3E4yhy1gcFymQ7xTbIAtcR0s= loupe@^2.3.1: - version "2.3.3" - resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.3.tgz#5a92027d54cfb6de4c327d3c3b705561d394d3c6" - integrity sha512-krIV4Cf1BIGIx2t1e6tucThhrBemUnIUjMtD2vN4mrMxnxpBvrcosBSpooqunBqP/hOEEV1w/Cr1YskGtqw5Jg== + version "2.3.4" + resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.4.tgz#7e0b9bffc76f148f9be769cb1321d3dcf3cb25f3" + integrity sha512-OvKfgCC2Ndby6aSTREl5aCCPTNIzlDfQZvZxNUrBrihDhL3xcrYegTblhmEiCrg2kKQz4XsFIaemE5BF4ybSaQ== dependencies: get-func-name "^2.0.0" @@ -1304,17 +1328,24 @@ mimic-response@^3.1.0: resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== -minimatch@3.0.4, minimatch@^3.0.4: +minimatch@3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== dependencies: brace-expansion "^1.1.7" -minimist@^1.2.0, minimist@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" - integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== +minimatch@^3.0.4: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimist@^1.2.0, minimist@^1.2.6: + version "1.2.6" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44" + integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== minipass@^3.0.0: version "3.1.6" @@ -1337,11 +1368,11 @@ mkdirp@1.0.4, mkdirp@^1.0.3: integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== mkdirp@^0.5.1: - version "0.5.5" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" - integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== + version "0.5.6" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" + integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== dependencies: - minimist "^1.2.5" + minimist "^1.2.6" mocha@8.1.1: version "8.1.1" @@ -1421,12 +1452,12 @@ normalize-url@^6.0.1: resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a" integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A== -object-inspect@^1.11.0, object-inspect@^1.9.0: +object-inspect@^1.12.0, object-inspect@^1.9.0: version "1.12.0" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.0.tgz#6e2c120e868fd1fd18cb4f18c31741d0d6e776f0" integrity sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g== -object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: +object-keys@^1.0.11, object-keys@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== @@ -1881,13 +1912,13 @@ ts-node@7.0.1: yn "^2.0.0" tsconfig-paths@^3.5.0: - version "3.12.0" - resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.12.0.tgz#19769aca6ee8f6a1a341e38c8fa45dd9fb18899b" - integrity sha512-e5adrnOYT6zqVnWqZu7i/BQ3BnhzvGbjEjejFXO20lKIKpwTaupkCPgEfv4GZK1IBciJUEhYs3J3p75FdaTFVg== + version "3.14.1" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz#ba0734599e8ea36c862798e920bcf163277b137a" + integrity sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ== dependencies: "@types/json5" "^0.0.29" json5 "^1.0.1" - minimist "^1.2.0" + minimist "^1.2.6" strip-bom "^3.0.0" type-detect@^4.0.0, type-detect@^4.0.5: @@ -1896,18 +1927,18 @@ type-detect@^4.0.0, type-detect@^4.0.5: integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== typescript@^4.4.3: - version "4.5.5" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.5.5.tgz#d8c953832d28924a9e3d37c73d729c846c5896f3" - integrity sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA== + version "4.6.4" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.6.4.tgz#caa78bbc3a59e6a5c510d35703f6a09877ce45e9" + integrity sha512-9ia/jWHIEbo49HfjrLGfKbZSuWo9iTMwXO+Ca3pRsSpbsMbc7/IU8NKdCZVRRBafVPGnoJeFL76ZOAA84I9fEg== unbox-primitive@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471" - integrity sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw== + version "1.0.2" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" + integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== dependencies: - function-bind "^1.1.1" - has-bigints "^1.0.1" - has-symbols "^1.0.2" + call-bind "^1.0.2" + has-bigints "^1.0.2" + has-symbols "^1.0.3" which-boxed-primitive "^1.0.2" util-deprecate@^1.0.1: From be78be5fe9223f62c7c44e061a65d8afd1b246b8 Mon Sep 17 00:00:00 2001 From: Kevin Kei Tuncer Date: Thu, 5 May 2022 03:19:18 +0200 Subject: [PATCH 14/24] BugFix eth oracle check id --- .../teleporteth/contracts/TeleportToken.sol | 2 +- contracts/teleporteth/package.json | 1 + contracts/teleporteth/truffle-config.js | 22 +- contracts/teleporteth/yarn.lock | 1570 ++++++++++++++++- oracle/CommonTypes.ts | 10 +- oracle/EndpointSwitcher.js | 17 +- oracle/EndpointSwitcher.ts | 16 +- oracle/oracle-eos.js | 38 +- oracle/oracle-eos.ts | 52 +- oracle/oracle-eth.js | 106 +- oracle/oracle-eth.ts | 39 +- oracle/yarn.lock | 385 ++-- 12 files changed, 1889 insertions(+), 369 deletions(-) diff --git a/contracts/teleporteth/contracts/TeleportToken.sol b/contracts/teleporteth/contracts/TeleportToken.sol index f4433df..82f938f 100644 --- a/contracts/teleporteth/contracts/TeleportToken.sol +++ b/contracts/teleporteth/contracts/TeleportToken.sol @@ -234,7 +234,7 @@ contract TeleportToken is ERC20Interface, Owned, Oracled, Verify { _totalSupply = 10000000000 * 10**uint(decimals); balances[address(0)] = _totalSupply; threshold = 3; - thisChainId = 1; + thisChainId = 2; } diff --git a/contracts/teleporteth/package.json b/contracts/teleporteth/package.json index fb038ee..b316419 100644 --- a/contracts/teleporteth/package.json +++ b/contracts/teleporteth/package.json @@ -1,6 +1,7 @@ { "type": "commonjs", "dependencies": { + "@truffle/hdwallet-provider": "^2.0.8", "eosjs": "^22.1.0", "eosjs-ecc": "^4.0.7", "ethereumjs-util": "^7.0.4", diff --git a/contracts/teleporteth/truffle-config.js b/contracts/teleporteth/truffle-config.js index ba05e9f..6176534 100644 --- a/contracts/teleporteth/truffle-config.js +++ b/contracts/teleporteth/truffle-config.js @@ -18,10 +18,10 @@ * */ -// const HDWalletProvider = require('@truffle/hdwallet-provider'); -// -// const fs = require('fs'); -// const mnemonic = fs.readFileSync(".secret").toString().trim(); +const HDWalletProvider = require('@truffle/hdwallet-provider'); + +const fs = require('fs'); +const mnemonic = fs.readFileSync(".secret").toString().trim(); module.exports = { /** @@ -46,6 +46,20 @@ module.exports = { port: 8545, // Standard Ethereum port (default: none) network_id: "*", // Any network (default: none) }, + testnet: { + provider: () => new HDWalletProvider(mnemonic, `https://data-seed-prebsc-1-s1.binance.org:8545`), + network_id: 97, + confirmations: 10, + timeoutBlocks: 200, + skipDryRun: true + }, + bsc: { + provider: () => new HDWalletProvider(mnemonic, `https://bsc-dataseed1.binance.org`), + network_id: 56, + confirmations: 10, + timeoutBlocks: 200, + skipDryRun: true + }, // Another network with more advanced options... // advanced: { // port: 8777, // Custom port diff --git a/contracts/teleporteth/yarn.lock b/contracts/teleporteth/yarn.lock index 8f49539..45e75e2 100644 --- a/contracts/teleporteth/yarn.lock +++ b/contracts/teleporteth/yarn.lock @@ -2,6 +2,128 @@ # yarn lockfile v1 +"@babel/code-frame@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.16.7.tgz#44416b6bd7624b998f5b1af5d470856c40138789" + integrity sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg== + dependencies: + "@babel/highlight" "^7.16.7" + +"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.17.10": + version "7.17.10" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.17.10.tgz#711dc726a492dfc8be8220028b1b92482362baab" + integrity sha512-GZt/TCsG70Ms19gfZO1tM4CVnXsPgEPBCpJu+Qz3L0LUDsY5nZqFZglIoPC1kIYOtNBZlrnFT+klg12vFGZXrw== + +"@babel/generator@^7.17.10": + version "7.17.10" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.17.10.tgz#c281fa35b0c349bbe9d02916f4ae08fc85ed7189" + integrity sha512-46MJZZo9y3o4kmhBVc7zW7i8dtR1oIK/sdO5NcfcZRhTGYi+KKJRtHNgsU6c4VUcJmUNV/LQdebD/9Dlv4K+Tg== + dependencies: + "@babel/types" "^7.17.10" + "@jridgewell/gen-mapping" "^0.1.0" + jsesc "^2.5.1" + +"@babel/helper-compilation-targets@^7.13.0": + version "7.17.10" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.17.10.tgz#09c63106d47af93cf31803db6bc49fef354e2ebe" + integrity sha512-gh3RxjWbauw/dFiU/7whjd0qN9K6nPJMqe6+Er7rOavFh0CQUSwhAE3IcTho2rywPJFxej6TUUHDkWcYI6gGqQ== + dependencies: + "@babel/compat-data" "^7.17.10" + "@babel/helper-validator-option" "^7.16.7" + browserslist "^4.20.2" + semver "^6.3.0" + +"@babel/helper-define-polyfill-provider@^0.3.1": + version "0.3.1" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.1.tgz#52411b445bdb2e676869e5a74960d2d3826d2665" + integrity sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA== + dependencies: + "@babel/helper-compilation-targets" "^7.13.0" + "@babel/helper-module-imports" "^7.12.13" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/traverse" "^7.13.0" + debug "^4.1.1" + lodash.debounce "^4.0.8" + resolve "^1.14.2" + semver "^6.1.2" + +"@babel/helper-environment-visitor@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz#ff484094a839bde9d89cd63cba017d7aae80ecd7" + integrity sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-function-name@^7.17.9": + version "7.17.9" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz#136fcd54bc1da82fcb47565cf16fd8e444b1ff12" + integrity sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg== + dependencies: + "@babel/template" "^7.16.7" + "@babel/types" "^7.17.0" + +"@babel/helper-hoist-variables@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz#86bcb19a77a509c7b77d0e22323ef588fa58c246" + integrity sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz#25612a8091a999704461c8a222d0efec5d091437" + integrity sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-plugin-utils@^7.13.0", "@babel/helper-plugin-utils@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz#aa3a8ab4c3cceff8e65eb9e73d87dc4ff320b2f5" + integrity sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA== + +"@babel/helper-split-export-declaration@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz#0b648c0c42da9d3920d85ad585f2778620b8726b" + integrity sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-validator-identifier@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz#e8c602438c4a8195751243da9031d1607d247cad" + integrity sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw== + +"@babel/helper-validator-option@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz#b203ce62ce5fe153899b617c08957de860de4d23" + integrity sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ== + +"@babel/highlight@^7.16.7": + version "7.17.9" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.17.9.tgz#61b2ee7f32ea0454612def4fccdae0de232b73e3" + integrity sha512-J9PfEKCbFIv2X5bjTMiZu6Vf341N05QIY+d6FvVKynkG1S7G0j3I0QoRtWIrXhZ+/Nlb5Q0MzqL7TokEJ5BNHg== + dependencies: + "@babel/helper-validator-identifier" "^7.16.7" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@babel/parser@^7.16.7", "@babel/parser@^7.17.10": + version "7.17.10" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.17.10.tgz#873b16db82a8909e0fbd7f115772f4b739f6ce78" + integrity sha512-n2Q6i+fnJqzOaq2VkdXxy2TCPCWQZHiCo0XqmrCvDWcZQKRyZzYi4Z0yxlBuN0w+r2ZHmre+Q087DSrw3pbJDQ== + +"@babel/plugin-transform-runtime@^7.5.5": + version "7.17.10" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.17.10.tgz#b89d821c55d61b5e3d3c3d1d636d8d5a81040ae1" + integrity sha512-6jrMilUAJhktTr56kACL8LnWC5hx3Lf27BS0R0DSyW/OoJfb/iTHeE96V3b1dgKG3FSFdd/0culnYWMkjcKCig== + dependencies: + "@babel/helper-module-imports" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + babel-plugin-polyfill-corejs2 "^0.3.0" + babel-plugin-polyfill-corejs3 "^0.5.0" + babel-plugin-polyfill-regenerator "^0.3.0" + semver "^6.3.0" + "@babel/runtime@7.6.0": version "7.6.0" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.6.0.tgz#4fc1d642a9fd0299754e8b5de62c631cf5568205" @@ -9,6 +131,138 @@ dependencies: regenerator-runtime "^0.13.2" +"@babel/runtime@^7.5.5": + version "7.17.9" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.17.9.tgz#d19fbf802d01a8cb6cf053a64e472d42c434ba72" + integrity sha512-lSiBBvodq29uShpWGNbgFdKYNiFDo5/HIYsaCEY9ff4sb10x9jizo2+pRrSyF4jKZCXqgzuqBOQKbUm90gQwJg== + dependencies: + regenerator-runtime "^0.13.4" + +"@babel/template@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.16.7.tgz#8d126c8701fde4d66b264b3eba3d96f07666d155" + integrity sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w== + dependencies: + "@babel/code-frame" "^7.16.7" + "@babel/parser" "^7.16.7" + "@babel/types" "^7.16.7" + +"@babel/traverse@^7.13.0": + version "7.17.10" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.17.10.tgz#1ee1a5ac39f4eac844e6cf855b35520e5eb6f8b5" + integrity sha512-VmbrTHQteIdUUQNTb+zE12SHS/xQVIShmBPhlNP12hD5poF2pbITW1Z4172d03HegaQWhLffdkRJYtAzp0AGcw== + dependencies: + "@babel/code-frame" "^7.16.7" + "@babel/generator" "^7.17.10" + "@babel/helper-environment-visitor" "^7.16.7" + "@babel/helper-function-name" "^7.17.9" + "@babel/helper-hoist-variables" "^7.16.7" + "@babel/helper-split-export-declaration" "^7.16.7" + "@babel/parser" "^7.17.10" + "@babel/types" "^7.17.10" + debug "^4.1.0" + globals "^11.1.0" + +"@babel/types@^7.16.7", "@babel/types@^7.17.0", "@babel/types@^7.17.10": + version "7.17.10" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.17.10.tgz#d35d7b4467e439fcf06d195f8100e0fea7fc82c4" + integrity sha512-9O26jG0mBYfGkUYCYZRnBwbVLd1UZOICEr2Em6InB6jVfsAv1GKgwXHmrSg+WFWDmeKTA6vyTZiN8tCSM5Oo3A== + dependencies: + "@babel/helper-validator-identifier" "^7.16.7" + to-fast-properties "^2.0.0" + +"@ethereumjs/common@^2.4.0", "@ethereumjs/common@^2.6.3": + version "2.6.4" + resolved "https://registry.yarnpkg.com/@ethereumjs/common/-/common-2.6.4.tgz#1b3cdd3aa4ee3b0ca366756fc35e4a03022a01cc" + integrity sha512-RDJh/R/EAr+B7ZRg5LfJ0BIpf/1LydFgYdvZEuTraojCbVypO2sQ+QnpP5u2wJf9DASyooKqu8O4FJEWUV6NXw== + dependencies: + crc-32 "^1.2.0" + ethereumjs-util "^7.1.4" + +"@ethereumjs/tx@^3.3.0": + version "3.5.1" + resolved "https://registry.yarnpkg.com/@ethereumjs/tx/-/tx-3.5.1.tgz#8d941b83a602b4a89949c879615f7ea9a90e6671" + integrity sha512-xzDrTiu4sqZXUcaBxJ4n4W5FrppwxLxZB4ZDGVLtxSQR4lVuOnFR6RcUHdg1mpUhAPVrmnzLJpxaeXnPxIyhWA== + dependencies: + "@ethereumjs/common" "^2.6.3" + ethereumjs-util "^7.1.4" + +"@jridgewell/gen-mapping@^0.1.0": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz#e5d2e450306a9491e3bd77e323e38d7aff315996" + integrity sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w== + dependencies: + "@jridgewell/set-array" "^1.0.0" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@jridgewell/set-array@^1.0.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.0.tgz#1179863356ac8fbea64a5a4bcde93a4871012c01" + integrity sha512-SfJxIxNVYLTsKwzB3MoOQ1yxf4w/E6MdkvTgrgAt1bfxjSrLUoHMKrDOykwN14q65waezZIdqDneUIPh4/sKxg== + +"@jridgewell/sourcemap-codec@^1.4.10": + version "1.4.12" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.12.tgz#7ed98f6fa525ffb7c56a2cbecb5f7bb91abd2baf" + integrity sha512-az/NhpIwP3K33ILr0T2bso+k2E/SLf8Yidd8mHl0n6sCQ4YdyC8qDhZA6kOPDNDBA56ZnIjngVl0U3jREA0BUA== + +"@metamask/safe-event-emitter@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@metamask/safe-event-emitter/-/safe-event-emitter-2.0.0.tgz#af577b477c683fad17c619a78208cede06f9605c" + integrity sha512-/kSXhY692qiV1MXu6EeOZvg5nECLclxNXcKCxJ3cXQgYuRymRHpdx/t7JXfsK+JLjwA1e1c1/SBrlQYpusC29Q== + +"@noble/hashes@1.0.0", "@noble/hashes@~1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.0.0.tgz#d5e38bfbdaba174805a4e649f13be9a9ed3351ae" + integrity sha512-DZVbtY62kc3kkBtMHqwCOfXrT/hnoORy5BJ4+HU1IR59X0KWAOqsfzQPcUl/lQLlG7qXbe/fZ3r/emxtAl+sqg== + +"@noble/secp256k1@1.5.5", "@noble/secp256k1@~1.5.2": + version "1.5.5" + resolved "https://registry.yarnpkg.com/@noble/secp256k1/-/secp256k1-1.5.5.tgz#315ab5745509d1a8c8e90d0bdf59823ccf9bcfc3" + integrity sha512-sZ1W6gQzYnu45wPrWx8D3kwI2/U29VYTx9OjbDAd7jwRItJ0cSTMPRL/C8AWZFn9kWFLQGqEXVEE86w4Z8LpIQ== + +"@scure/base@~1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.0.0.tgz#109fb595021de285f05a7db6806f2f48296fcee7" + integrity sha512-gIVaYhUsy+9s58m/ETjSJVKHhKTBMmcRb9cEV5/5dwvfDlfORjKrFsDeDHWRrm6RjcPvCLZFwGJjAjLj1gg4HA== + +"@scure/bip32@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.0.1.tgz#1409bdf9f07f0aec99006bb0d5827693418d3aa5" + integrity sha512-AU88KKTpQ+YpTLoicZ/qhFhRRIo96/tlb+8YmDDHR9yiKVjSsFZiefJO4wjS2PMTkz5/oIcw84uAq/8pleQURA== + dependencies: + "@noble/hashes" "~1.0.0" + "@noble/secp256k1" "~1.5.2" + "@scure/base" "~1.0.0" + +"@scure/bip39@1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.0.0.tgz#47504e58de9a56a4bbed95159d2d6829fa491bb0" + integrity sha512-HrtcikLbd58PWOkl02k9V6nXWQyoa7A0+Ek9VF7z17DDk9XZAFUcIdqfh0jJXLypmizc5/8P6OxoUeKliiWv4w== + dependencies: + "@noble/hashes" "~1.0.0" + "@scure/base" "~1.0.0" + +"@truffle/hdwallet-provider@^2.0.8": + version "2.0.8" + resolved "https://registry.yarnpkg.com/@truffle/hdwallet-provider/-/hdwallet-provider-2.0.8.tgz#4f2edde26b36356ac8dfe993ed4dece415005be8" + integrity sha512-K58AdmEqfHg3o/EERX3YJHDfNcFYOKBpmxi3l/mn8NVXJUXlIkM3eYYKdLilArHcqvp+BYWu7l2tQF8Tt5ozdg== + dependencies: + "@ethereumjs/common" "^2.4.0" + "@ethereumjs/tx" "^3.3.0" + eth-sig-util "^3.0.1" + ethereum-cryptography "1.0.3" + ethereum-protocol "^1.0.1" + ethereumjs-util "^6.1.0" + ethereumjs-wallet "^1.0.1" + web3-provider-engine "16.0.3" + +"@types/bn.js@^4.11.3": + version "4.11.6" + resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-4.11.6.tgz#c306c70d9358aaea33cd4eda092a742b9505967c" + integrity sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg== + dependencies: + "@types/node" "*" + "@types/bn.js@^5.1.0": version "5.1.0" resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-5.1.0.tgz#32c5d271503a12653c62cf4d2b45e6eab8cebc68" @@ -35,6 +289,131 @@ dependencies: "@types/node" "*" +abstract-leveldown@~2.6.0: + version "2.6.3" + resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-2.6.3.tgz#1c5e8c6a5ef965ae8c35dfb3a8770c476b82c4b8" + integrity sha512-2++wDf/DYqkPR3o5tbfdhF96EfMApo1GpPfzOsR/ZYXdkSmELlvOOEAl9iKkRsktMPHdGjO4rtkBpf2I7TiTeA== + dependencies: + xtend "~4.0.0" + +abstract-leveldown@~2.7.1: + version "2.7.2" + resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-2.7.2.tgz#87a44d7ebebc341d59665204834c8b7e0932cc93" + integrity sha512-+OVvxH2rHVEhWLdbudP6p0+dNMXu8JA1CbhP19T8paTYAcX7oJ4OVjT+ZUVpv7mITxXHqDMej+GdqXBmXkw09w== + dependencies: + xtend "~4.0.0" + +aes-js@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-3.1.2.tgz#db9aabde85d5caabbfc0d4f2a4446960f627146a" + integrity sha512-e5pEa2kBnBOgR4Y/p20pskXI74UEz7de8ZGVo58asOtvSVG5YAbJeELPZxOmt+Bnz3rX753YKhfIn4X4l1PPRQ== + +ajv@^6.12.3: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +asn1@~0.2.3: + version "0.2.6" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.6.tgz#0d3a7bb6e64e02a90c0303b31f292868ea09a08d" + integrity sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ== + dependencies: + safer-buffer "~2.1.0" + +assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= + +async-eventemitter@^0.2.2: + version "0.2.4" + resolved "https://registry.yarnpkg.com/async-eventemitter/-/async-eventemitter-0.2.4.tgz#f5e7c8ca7d3e46aab9ec40a292baf686a0bafaca" + integrity sha512-pd20BwL7Yt1zwDFy+8MX8F1+WCT8aQeKj0kQnTrH9WaeRETlRamVhD0JtRPmrV4GfOJ2F9CvdQkZeZhnh2TuHw== + dependencies: + async "^2.4.0" + +async-limiter@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" + integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== + +async-mutex@^0.2.6: + version "0.2.6" + resolved "https://registry.yarnpkg.com/async-mutex/-/async-mutex-0.2.6.tgz#0d7a3deb978bc2b984d5908a2038e1ae2e54ff40" + integrity sha512-Hs4R+4SPgamu6rSGW8C7cV9gaWUKEHykfzCCvIRuaVv636Ju10ZdeUbvb4TBEW0INuq2DHZqXbK4Nd3yG4RaRw== + dependencies: + tslib "^2.0.0" + +async@^1.4.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" + integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo= + +async@^2.0.1, async@^2.1.2, async@^2.4.0, async@^2.5.0: + version "2.6.4" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.4.tgz#706b7ff6084664cd7eae713f6f965433b5504221" + integrity sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA== + dependencies: + lodash "^4.17.14" + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= + +aws-sign2@~0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= + +aws4@^1.8.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59" + integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== + +babel-plugin-polyfill-corejs2@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.1.tgz#440f1b70ccfaabc6b676d196239b138f8a2cfba5" + integrity sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w== + dependencies: + "@babel/compat-data" "^7.13.11" + "@babel/helper-define-polyfill-provider" "^0.3.1" + semver "^6.1.1" + +babel-plugin-polyfill-corejs3@^0.5.0: + version "0.5.2" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.2.tgz#aabe4b2fa04a6e038b688c5e55d44e78cd3a5f72" + integrity sha512-G3uJih0XWiID451fpeFaYGVuxHEjzKTHtc9uGFEjR6hHrvNzeS/PX+LLLcetJcytsB5m4j+K3o/EpXJNb/5IEQ== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.3.1" + core-js-compat "^3.21.0" + +babel-plugin-polyfill-regenerator@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz#2c0678ea47c75c8cc2fbb1852278d8fb68233990" + integrity sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.3.1" + +backoff@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/backoff/-/backoff-2.5.0.tgz#f616eda9d3e4b66b8ca7fca79f695722c5f8e26f" + integrity sha1-9hbtqdPktmuMp/ynn2lXIsX44m8= + dependencies: + precond "0.2" + base-x@^3.0.2: version "3.0.9" resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.9.tgz#6349aaabb58526332de9f60995e548a53fe21320" @@ -42,6 +421,13 @@ base-x@^3.0.2: dependencies: safe-buffer "^5.0.1" +bcrypt-pbkdf@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" + integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= + dependencies: + tweetnacl "^0.14.3" + bigi@1.4.2, bigi@^1.1.0: version "1.4.2" resolved "https://registry.yarnpkg.com/bigi/-/bigi-1.4.2.tgz#9c665a95f88b8b08fc05cfd731f561859d725825" @@ -57,7 +443,7 @@ bn.js@5.2.0, bn.js@^5.1.2, bn.js@^5.2.0: resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.0.tgz#358860674396c6997771a9d051fcc1b57d4ae002" integrity sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw== -bn.js@^4.11.9: +bn.js@^4.11.0, bn.js@^4.11.8, bn.js@^4.11.9: version "4.12.0" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== @@ -90,6 +476,17 @@ browserify-aes@^1.2.0: inherits "^2.0.1" safe-buffer "^5.0.1" +browserslist@^4.20.2, browserslist@^4.20.3: + version "4.20.3" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.20.3.tgz#eb7572f49ec430e054f56d52ff0ebe9be915f8bf" + integrity sha512-NBhymBQl1zM0Y5dQT/O+xiLP9/rzOIQdKM/eMJBAq7yBgaB6krIYLGejrwVYnSHZdqjscB1SPuAjHwxjvN6Wdg== + dependencies: + caniuse-lite "^1.0.30001332" + electron-to-chromium "^1.4.118" + escalade "^3.1.1" + node-releases "^2.0.3" + picocolors "^1.0.0" + bs58@4.0.1, bs58@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a" @@ -106,6 +503,11 @@ bs58check@^2.1.2: create-hash "^1.1.0" safe-buffer "^5.1.2" +btoa@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/btoa/-/btoa-1.2.1.tgz#01a9909f8b2c93f6bf680ba26131eb30f7fa3d73" + integrity sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g== + buffer-xor@^1.0.2, buffer-xor@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" @@ -118,6 +520,32 @@ bytebuffer@5.0.1: dependencies: long "~3" +caniuse-lite@^1.0.30001332: + version "1.0.30001335" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001335.tgz#899254a0b70579e5a957c32dced79f0727c61f2a" + integrity sha512-ddP1Tgm7z2iIxu6QTtbZUv6HJxSaV/PZeSrWFZtbY4JZ69tOeNhBCl3HyRQgeNZKE5AOn1kpV7fhljigy0Ty3w== + +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= + +chalk@^2.0.0: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +checkpoint-store@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/checkpoint-store/-/checkpoint-store-1.1.0.tgz#04e4cb516b91433893581e6d4601a78e9552ea06" + integrity sha1-BOTLUWuRQziTWB5tRgGnjpVS6gY= + dependencies: + functional-red-black-tree "^1.0.1" + cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" @@ -126,6 +554,53 @@ cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: inherits "^2.0.1" safe-buffer "^5.0.1" +clone@^2.0.0, clone@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f" + integrity sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18= + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + +combined-stream@^1.0.6, combined-stream@~1.0.6: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +core-js-compat@^3.21.0: + version "3.22.4" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.22.4.tgz#d700f451e50f1d7672dcad0ac85d910e6691e579" + integrity sha512-dIWcsszDezkFZrfm1cnB4f/J85gyhiCpxbgBdohWCDtSVuAaChTSpPV7ldOQf/Xds2U5xCIJZOK82G4ZPAIswA== + dependencies: + browserslist "^4.20.3" + semver "7.0.0" + +core-util-is@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= + +core-util-is@~1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" + integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== + +crc-32@^1.2.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/crc-32/-/crc-32-1.2.2.tgz#3cad35a934b8bf71f25ca524b6da51fb7eace2ff" + integrity sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ== + create-hash@1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.1.3.tgz#606042ac8b9262750f483caddab0f5819172d8fd" @@ -171,6 +646,53 @@ create-hmac@^1.1.4, create-hmac@^1.1.7: safe-buffer "^5.0.1" sha.js "^2.4.8" +cross-fetch@^2.1.0: + version "2.2.6" + resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-2.2.6.tgz#2ef0bb39a24ac034787965c457368a28730e220a" + integrity sha512-9JZz+vXCmfKUZ68zAptS7k4Nu8e2qcibe7WVZYps7sAgk5R8GYTc+T1WR0v1rlP9HxgARmOX1UTIJZFytajpNA== + dependencies: + node-fetch "^2.6.7" + whatwg-fetch "^2.0.4" + +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= + dependencies: + assert-plus "^1.0.0" + +debug@^4.1.0, debug@^4.1.1: + version "4.3.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +deferred-leveldown@~1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/deferred-leveldown/-/deferred-leveldown-1.2.2.tgz#3acd2e0b75d1669924bc0a4b642851131173e1eb" + integrity sha512-uukrWD2bguRtXilKt6cAWKyoXrTSMo5m7crUdLfWQmu8kIm88w3QZoUL+6nhpfKVmhHANER6Re3sKoNoZ3IKMA== + dependencies: + abstract-leveldown "~2.6.0" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= + +dom-walk@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.2.tgz#0c548bef048f4d1f2a97249002236060daa3fd84" + integrity sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w== + +ecc-jsbn@~0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" + integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= + dependencies: + jsbn "~0.1.0" + safer-buffer "^2.1.0" + ecurve@1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/ecurve/-/ecurve-1.0.5.tgz#d148e8fe50a674f983bb5bae09da0ea23e10535e" @@ -178,7 +700,12 @@ ecurve@1.0.5: dependencies: bigi "^1.1.0" -elliptic@6.5.4, elliptic@^6.5.4: +electron-to-chromium@^1.4.118: + version "1.4.132" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.132.tgz#b64599eb018221e52e2e4129de103b03a413c55d" + integrity sha512-JYdZUw/1068NWN+SwXQ7w6Ue0bWYGihvSUNNQwurvcDV/SM7vSiGZ3NuFvFgoEiCs4kB8xs3cX2an3wB7d4TBw== + +elliptic@6.5.4, elliptic@^6.5.2, elliptic@^6.5.4: version "6.5.4" resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== @@ -216,6 +743,134 @@ eosjs@^22.1.0: hash.js "1.1.7" pako "2.0.3" +errno@~0.1.1: + version "0.1.8" + resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f" + integrity sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A== + dependencies: + prr "~1.0.1" + +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + +eth-block-tracker@^4.4.2: + version "4.4.3" + resolved "https://registry.yarnpkg.com/eth-block-tracker/-/eth-block-tracker-4.4.3.tgz#766a0a0eb4a52c867a28328e9ae21353812cf626" + integrity sha512-A8tG4Z4iNg4mw5tP1Vung9N9IjgMNqpiMoJ/FouSFwNCGHv2X0mmOYwtQOJzki6XN7r7Tyo01S29p7b224I4jw== + dependencies: + "@babel/plugin-transform-runtime" "^7.5.5" + "@babel/runtime" "^7.5.5" + eth-query "^2.1.0" + json-rpc-random-id "^1.0.1" + pify "^3.0.0" + safe-event-emitter "^1.0.1" + +eth-json-rpc-filters@^4.2.1: + version "4.2.2" + resolved "https://registry.yarnpkg.com/eth-json-rpc-filters/-/eth-json-rpc-filters-4.2.2.tgz#eb35e1dfe9357ace8a8908e7daee80b2cd60a10d" + integrity sha512-DGtqpLU7bBg63wPMWg1sCpkKCf57dJ+hj/k3zF26anXMzkmtSBDExL8IhUu7LUd34f0Zsce3PYNO2vV2GaTzaw== + dependencies: + "@metamask/safe-event-emitter" "^2.0.0" + async-mutex "^0.2.6" + eth-json-rpc-middleware "^6.0.0" + eth-query "^2.1.2" + json-rpc-engine "^6.1.0" + pify "^5.0.0" + +eth-json-rpc-infura@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/eth-json-rpc-infura/-/eth-json-rpc-infura-5.1.0.tgz#e6da7dc47402ce64c54e7018170d89433c4e8fb6" + integrity sha512-THzLye3PHUSGn1EXMhg6WTLW9uim7LQZKeKaeYsS9+wOBcamRiCQVGHa6D2/4P0oS0vSaxsBnU/J6qvn0MPdow== + dependencies: + eth-json-rpc-middleware "^6.0.0" + eth-rpc-errors "^3.0.0" + json-rpc-engine "^5.3.0" + node-fetch "^2.6.0" + +eth-json-rpc-middleware@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/eth-json-rpc-middleware/-/eth-json-rpc-middleware-6.0.0.tgz#4fe16928b34231a2537856f08a5ebbc3d0c31175" + integrity sha512-qqBfLU2Uq1Ou15Wox1s+NX05S9OcAEL4JZ04VZox2NS0U+RtCMjSxzXhLFWekdShUPZ+P8ax3zCO2xcPrp6XJQ== + dependencies: + btoa "^1.2.1" + clone "^2.1.1" + eth-query "^2.1.2" + eth-rpc-errors "^3.0.0" + eth-sig-util "^1.4.2" + ethereumjs-util "^5.1.2" + json-rpc-engine "^5.3.0" + json-stable-stringify "^1.0.1" + node-fetch "^2.6.1" + pify "^3.0.0" + safe-event-emitter "^1.0.1" + +eth-query@^2.1.0, eth-query@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/eth-query/-/eth-query-2.1.2.tgz#d6741d9000106b51510c72db92d6365456a6da5e" + integrity sha1-1nQdkAAQa1FRDHLbktY2VFam2l4= + dependencies: + json-rpc-random-id "^1.0.0" + xtend "^4.0.1" + +eth-rpc-errors@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/eth-rpc-errors/-/eth-rpc-errors-3.0.0.tgz#d7b22653c70dbf9defd4ef490fd08fe70608ca10" + integrity sha512-iPPNHPrLwUlR9xCSYm7HHQjWBasor3+KZfRvwEWxMz3ca0yqnlBeJrnyphkGIXZ4J7AMAaOLmwy4AWhnxOiLxg== + dependencies: + fast-safe-stringify "^2.0.6" + +eth-rpc-errors@^4.0.2: + version "4.0.3" + resolved "https://registry.yarnpkg.com/eth-rpc-errors/-/eth-rpc-errors-4.0.3.tgz#6ddb6190a4bf360afda82790bb7d9d5e724f423a" + integrity sha512-Z3ymjopaoft7JDoxZcEb3pwdGh7yiYMhOwm2doUt6ASXlMavpNlK6Cre0+IMl2VSGyEU9rkiperQhp5iRxn5Pg== + dependencies: + fast-safe-stringify "^2.0.6" + +eth-sig-util@^1.4.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/eth-sig-util/-/eth-sig-util-1.4.2.tgz#8d958202c7edbaae839707fba6f09ff327606210" + integrity sha1-jZWCAsftuq6Dlwf7pvCf8ydgYhA= + dependencies: + ethereumjs-abi "git+https://github.com/ethereumjs/ethereumjs-abi.git" + ethereumjs-util "^5.1.1" + +eth-sig-util@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/eth-sig-util/-/eth-sig-util-3.0.1.tgz#8753297c83a3f58346bd13547b59c4b2cd110c96" + integrity sha512-0Us50HiGGvZgjtWTyAI/+qTzYPMLy5Q451D0Xy68bxq1QMWdoOddDwGvsqcFT27uohKgalM9z/yxplyt+mY2iQ== + dependencies: + ethereumjs-abi "^0.6.8" + ethereumjs-util "^5.1.1" + tweetnacl "^1.0.3" + tweetnacl-util "^0.15.0" + +ethereum-common@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/ethereum-common/-/ethereum-common-0.2.0.tgz#13bf966131cce1eeade62a1b434249bb4cb120ca" + integrity sha512-XOnAR/3rntJgbCdGhqdaLIxDLWKLmsZOGhHdBKadEr6gEnJLH52k93Ou+TUdFaPN3hJc3isBZBal3U/XZ15abA== + +ethereum-common@^0.0.18: + version "0.0.18" + resolved "https://registry.yarnpkg.com/ethereum-common/-/ethereum-common-0.0.18.tgz#2fdc3576f232903358976eb39da783213ff9523f" + integrity sha1-L9w1dvIykDNYl26znaeDIT/5Uj8= + +ethereum-cryptography@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-1.0.3.tgz#b1f8f4e702434b2016248dbb2f9fdd60c54772d8" + integrity sha512-NQLTW0x0CosoVb/n79x/TRHtfvS3hgNUPTUSCu0vM+9k6IIhHFFrAOJReneexjZsoZxMjJHnJn4lrE8EbnSyqQ== + dependencies: + "@noble/hashes" "1.0.0" + "@noble/secp256k1" "1.5.5" + "@scure/bip32" "1.0.1" + "@scure/bip39" "1.0.0" + ethereum-cryptography@^0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz#8d6143cfc3d74bf79bbd8edecdf29e4ae20dd191" @@ -237,7 +892,105 @@ ethereum-cryptography@^0.1.3: secp256k1 "^4.0.1" setimmediate "^1.0.5" -ethereumjs-util@^7.0.4: +ethereum-protocol@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ethereum-protocol/-/ethereum-protocol-1.0.1.tgz#b7d68142f4105e0ae7b5e178cf42f8d4dc4b93cf" + integrity sha512-3KLX1mHuEsBW0dKG+c6EOJS1NBNqdCICvZW9sInmZTt5aY0oxmHVggYRE0lJu1tcnMD1K+AKHdLi6U43Awm1Vg== + +ethereumjs-abi@^0.6.8: + version "0.6.8" + resolved "https://registry.yarnpkg.com/ethereumjs-abi/-/ethereumjs-abi-0.6.8.tgz#71bc152db099f70e62f108b7cdfca1b362c6fcae" + integrity sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA== + dependencies: + bn.js "^4.11.8" + ethereumjs-util "^6.0.0" + +"ethereumjs-abi@git+https://github.com/ethereumjs/ethereumjs-abi.git": + version "0.6.8" + resolved "git+https://github.com/ethereumjs/ethereumjs-abi.git#ee3994657fa7a427238e6ba92a84d0b529bbcde0" + dependencies: + bn.js "^4.11.8" + ethereumjs-util "^6.0.0" + +ethereumjs-account@^2.0.3: + version "2.0.5" + resolved "https://registry.yarnpkg.com/ethereumjs-account/-/ethereumjs-account-2.0.5.tgz#eeafc62de544cb07b0ee44b10f572c9c49e00a84" + integrity sha512-bgDojnXGjhMwo6eXQC0bY6UK2liSFUSMwwylOmQvZbSl/D7NXQ3+vrGO46ZeOgjGfxXmgIeVNDIiHw7fNZM4VA== + dependencies: + ethereumjs-util "^5.0.0" + rlp "^2.0.0" + safe-buffer "^5.1.1" + +ethereumjs-block@^1.2.2: + version "1.7.1" + resolved "https://registry.yarnpkg.com/ethereumjs-block/-/ethereumjs-block-1.7.1.tgz#78b88e6cc56de29a6b4884ee75379b6860333c3f" + integrity sha512-B+sSdtqm78fmKkBq78/QLKJbu/4Ts4P2KFISdgcuZUPDm9x+N7qgBPIIFUGbaakQh8bzuquiRVbdmvPKqbILRg== + dependencies: + async "^2.0.1" + ethereum-common "0.2.0" + ethereumjs-tx "^1.2.2" + ethereumjs-util "^5.0.0" + merkle-patricia-tree "^2.1.2" + +ethereumjs-block@~2.2.0: + version "2.2.2" + resolved "https://registry.yarnpkg.com/ethereumjs-block/-/ethereumjs-block-2.2.2.tgz#c7654be7e22df489fda206139ecd63e2e9c04965" + integrity sha512-2p49ifhek3h2zeg/+da6XpdFR3GlqY3BIEiqxGF8j9aSRIgkb7M1Ky+yULBKJOu8PAZxfhsYA+HxUk2aCQp3vg== + dependencies: + async "^2.0.1" + ethereumjs-common "^1.5.0" + ethereumjs-tx "^2.1.1" + ethereumjs-util "^5.0.0" + merkle-patricia-tree "^2.1.2" + +ethereumjs-common@^1.1.0, ethereumjs-common@^1.5.0: + version "1.5.2" + resolved "https://registry.yarnpkg.com/ethereumjs-common/-/ethereumjs-common-1.5.2.tgz#2065dbe9214e850f2e955a80e650cb6999066979" + integrity sha512-hTfZjwGX52GS2jcVO6E2sx4YuFnf0Fhp5ylo4pEPhEffNln7vS59Hr5sLnp3/QCazFLluuBZ+FZ6J5HTp0EqCA== + +ethereumjs-tx@^1.2.2: + version "1.3.7" + resolved "https://registry.yarnpkg.com/ethereumjs-tx/-/ethereumjs-tx-1.3.7.tgz#88323a2d875b10549b8347e09f4862b546f3d89a" + integrity sha512-wvLMxzt1RPhAQ9Yi3/HKZTn0FZYpnsmQdbKYfUUpi4j1SEIcbkd9tndVjcPrufY3V7j2IebOpC00Zp2P/Ay2kA== + dependencies: + ethereum-common "^0.0.18" + ethereumjs-util "^5.0.0" + +ethereumjs-tx@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ethereumjs-tx/-/ethereumjs-tx-2.1.2.tgz#5dfe7688bf177b45c9a23f86cf9104d47ea35fed" + integrity sha512-zZEK1onCeiORb0wyCXUvg94Ve5It/K6GD1K+26KfFKodiBiS6d9lfCXlUKGBBdQ+bv7Day+JK0tj1K+BeNFRAw== + dependencies: + ethereumjs-common "^1.5.0" + ethereumjs-util "^6.0.0" + +ethereumjs-util@^5.0.0, ethereumjs-util@^5.1.1, ethereumjs-util@^5.1.2, ethereumjs-util@^5.1.5: + version "5.2.1" + resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz#a833f0e5fca7e5b361384dc76301a721f537bf65" + integrity sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ== + dependencies: + bn.js "^4.11.0" + create-hash "^1.1.2" + elliptic "^6.5.2" + ethereum-cryptography "^0.1.3" + ethjs-util "^0.1.3" + rlp "^2.0.0" + safe-buffer "^5.1.1" + +ethereumjs-util@^6.0.0, ethereumjs-util@^6.1.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz#fcb4e4dd5ceacb9d2305426ab1a5cd93e3163b69" + integrity sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw== + dependencies: + "@types/bn.js" "^4.11.3" + bn.js "^4.11.0" + create-hash "^1.1.2" + elliptic "^6.5.2" + ethereum-cryptography "^0.1.3" + ethjs-util "0.1.6" + rlp "^2.2.3" + +ethereumjs-util@^7.0.4, ethereumjs-util@^7.1.2, ethereumjs-util@^7.1.4: version "7.1.4" resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-7.1.4.tgz#a6885bcdd92045b06f596c7626c3e89ab3312458" integrity sha512-p6KmuPCX4mZIqsQzXfmSx9Y0l2hqf+VkAiwSisW3UKUFdk8ZkAt+AYaor83z2nSi6CU2zSsXMlD80hAbNEGM0A== @@ -248,6 +1001,50 @@ ethereumjs-util@^7.0.4: ethereum-cryptography "^0.1.3" rlp "^2.2.4" +ethereumjs-vm@^2.3.4: + version "2.6.0" + resolved "https://registry.yarnpkg.com/ethereumjs-vm/-/ethereumjs-vm-2.6.0.tgz#76243ed8de031b408793ac33907fb3407fe400c6" + integrity sha512-r/XIUik/ynGbxS3y+mvGnbOKnuLo40V5Mj1J25+HEO63aWYREIqvWeRO/hnROlMBE5WoniQmPmhiaN0ctiHaXw== + dependencies: + async "^2.1.2" + async-eventemitter "^0.2.2" + ethereumjs-account "^2.0.3" + ethereumjs-block "~2.2.0" + ethereumjs-common "^1.1.0" + ethereumjs-util "^6.0.0" + fake-merkle-patricia-tree "^1.0.1" + functional-red-black-tree "^1.0.1" + merkle-patricia-tree "^2.3.2" + rustbn.js "~0.2.0" + safe-buffer "^5.1.1" + +ethereumjs-wallet@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/ethereumjs-wallet/-/ethereumjs-wallet-1.0.2.tgz#2c000504b4c71e8f3782dabe1113d192522e99b6" + integrity sha512-CCWV4RESJgRdHIvFciVQFnCHfqyhXWchTPlkfp28Qc53ufs+doi5I/cV2+xeK9+qEo25XCWfP9MiL+WEPAZfdA== + dependencies: + aes-js "^3.1.2" + bs58check "^2.1.2" + ethereum-cryptography "^0.1.3" + ethereumjs-util "^7.1.2" + randombytes "^2.1.0" + scrypt-js "^3.0.1" + utf8 "^3.0.0" + uuid "^8.3.2" + +ethjs-util@0.1.6, ethjs-util@^0.1.3: + version "0.1.6" + resolved "https://registry.yarnpkg.com/ethjs-util/-/ethjs-util-0.1.6.tgz#f308b62f185f9fe6237132fb2a9818866a5cd536" + integrity sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w== + dependencies: + is-hex-prefixed "1.0.0" + strip-hex-prefix "1.0.0" + +events@^3.0.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== + evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" @@ -256,6 +1053,112 @@ evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: md5.js "^1.3.4" safe-buffer "^5.1.1" +extend@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + +extsprintf@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= + +extsprintf@^1.2.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.1.tgz#8d172c064867f235c0c84a596806d279bf4bcc07" + integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA== + +fake-merkle-patricia-tree@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/fake-merkle-patricia-tree/-/fake-merkle-patricia-tree-1.0.1.tgz#4b8c3acfb520afadf9860b1f14cd8ce3402cddd3" + integrity sha1-S4w6z7Ugr635hgsfFM2M40As3dM= + dependencies: + checkpoint-store "^1.1.0" + +fast-deep-equal@^3.1.1: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-safe-stringify@^2.0.6: + version "2.1.1" + resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz#c406a83b6e70d9e35ce3b30a81141df30aeba884" + integrity sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA== + +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= + +form-data@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" + integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.6" + mime-types "^2.1.12" + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +functional-red-black-tree@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" + integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= + +getpass@^0.1.1: + version "0.1.7" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= + dependencies: + assert-plus "^1.0.0" + +global@~4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/global/-/global-4.4.0.tgz#3e7b105179006a323ed71aafca3e9c57a5cc6406" + integrity sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w== + dependencies: + min-document "^2.19.0" + process "^0.11.10" + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +har-schema@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" + integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= + +har-validator@~5.1.3: + version "5.1.5" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd" + integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w== + dependencies: + ajv "^6.12.3" + har-schema "^2.0.0" + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + +has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + hash-base@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33" @@ -282,11 +1185,140 @@ hmac-drbg@^1.0.1: minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.1" -inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4: +http-signature@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= + dependencies: + assert-plus "^1.0.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +immediate@^3.2.3: + version "3.3.0" + resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.3.0.tgz#1aef225517836bcdf7f2a2de2600c79ff0269266" + integrity sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q== + +inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== +is-core-module@^2.8.1: + version "2.9.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.9.0.tgz#e1c34429cd51c6dd9e09e0799e396e27b19a9c69" + integrity sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A== + dependencies: + has "^1.0.3" + +is-fn@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-fn/-/is-fn-1.0.0.tgz#9543d5de7bcf5b08a22ec8a20bae6e286d510d8c" + integrity sha1-lUPV3nvPWwiiLsiiC65uKG1RDYw= + +is-function@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.2.tgz#4f097f30abf6efadac9833b17ca5dc03f8144e08" + integrity sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ== + +is-hex-prefixed@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz#7d8d37e6ad77e5d127148913c573e082d777f554" + integrity sha1-fY035q135dEnFIkTxXPggtd39VQ= + +is-typedarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= + +isarray@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= + +isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + +isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= + +js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +json-rpc-engine@^5.3.0: + version "5.4.0" + resolved "https://registry.yarnpkg.com/json-rpc-engine/-/json-rpc-engine-5.4.0.tgz#75758609d849e1dba1e09021ae473f3ab63161e5" + integrity sha512-rAffKbPoNDjuRnXkecTjnsE3xLLrb00rEkdgalINhaYVYIxDwWtvYBr9UFbhTvPB1B2qUOLoFd/cV6f4Q7mh7g== + dependencies: + eth-rpc-errors "^3.0.0" + safe-event-emitter "^1.0.1" + +json-rpc-engine@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/json-rpc-engine/-/json-rpc-engine-6.1.0.tgz#bf5ff7d029e1c1bf20cb6c0e9f348dcd8be5a393" + integrity sha512-NEdLrtrq1jUZyfjkr9OCz9EzCNhnRyWtt1PAnvnhwy6e8XETS0Dtc+ZNCO2gvuAoKsIn2+vCSowXTYE4CkgnAQ== + dependencies: + "@metamask/safe-event-emitter" "^2.0.0" + eth-rpc-errors "^4.0.2" + +json-rpc-random-id@^1.0.0, json-rpc-random-id@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-rpc-random-id/-/json-rpc-random-id-1.0.1.tgz#ba49d96aded1444dbb8da3d203748acbbcdec8c8" + integrity sha1-uknZat7RRE27jaPSA3SKy7zeyMg= + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-schema@0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.4.0.tgz#f7de4cf6efab838ebaeb3236474cbba5a1930ab5" + integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA== + +json-stable-stringify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" + integrity sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8= + dependencies: + jsonify "~0.0.0" + +json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= + +jsonify@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" + integrity sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM= + +jsprim@^1.2.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.2.tgz#712c65533a15c878ba59e9ed5f0e26d5b77c5feb" + integrity sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw== + dependencies: + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.4.0" + verror "1.10.0" + keccak@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/keccak/-/keccak-3.0.2.tgz#4c2c6e8c54e04f2670ee49fa734eb9da152206e0" @@ -296,11 +1328,76 @@ keccak@^3.0.0: node-gyp-build "^4.2.0" readable-stream "^3.6.0" +level-codec@~7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/level-codec/-/level-codec-7.0.1.tgz#341f22f907ce0f16763f24bddd681e395a0fb8a7" + integrity sha512-Ua/R9B9r3RasXdRmOtd+t9TCOEIIlts+TN/7XTT2unhDaL6sJn83S3rUyljbr6lVtw49N3/yA0HHjpV6Kzb2aQ== + +level-errors@^1.0.3: + version "1.1.2" + resolved "https://registry.yarnpkg.com/level-errors/-/level-errors-1.1.2.tgz#4399c2f3d3ab87d0625f7e3676e2d807deff404d" + integrity sha512-Sw/IJwWbPKF5Ai4Wz60B52yj0zYeqzObLh8k1Tk88jVmD51cJSKWSYpRyhVIvFzZdvsPqlH5wfhp/yxdsaQH4w== + dependencies: + errno "~0.1.1" + +level-errors@~1.0.3: + version "1.0.5" + resolved "https://registry.yarnpkg.com/level-errors/-/level-errors-1.0.5.tgz#83dbfb12f0b8a2516bdc9a31c4876038e227b859" + integrity sha512-/cLUpQduF6bNrWuAC4pwtUKA5t669pCsCi2XbmojG2tFeOr9j6ShtdDCtFFQO1DRt+EVZhx9gPzP9G2bUaG4ig== + dependencies: + errno "~0.1.1" + +level-iterator-stream@~1.3.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/level-iterator-stream/-/level-iterator-stream-1.3.1.tgz#e43b78b1a8143e6fa97a4f485eb8ea530352f2ed" + integrity sha1-5Dt4sagUPm+pek9IXrjqUwNS8u0= + dependencies: + inherits "^2.0.1" + level-errors "^1.0.3" + readable-stream "^1.0.33" + xtend "^4.0.0" + +level-ws@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/level-ws/-/level-ws-0.0.0.tgz#372e512177924a00424b0b43aef2bb42496d228b" + integrity sha1-Ny5RIXeSSgBCSwtDrvK7QkltIos= + dependencies: + readable-stream "~1.0.15" + xtend "~2.1.1" + +levelup@^1.2.1: + version "1.3.9" + resolved "https://registry.yarnpkg.com/levelup/-/levelup-1.3.9.tgz#2dbcae845b2bb2b6bea84df334c475533bbd82ab" + integrity sha512-VVGHfKIlmw8w1XqpGOAGwq6sZm2WwWLmlDcULkKWQXEA5EopA8OBNJ2Ck2v6bdk8HeEZSbCSEgzXadyQFm76sQ== + dependencies: + deferred-leveldown "~1.2.1" + level-codec "~7.0.0" + level-errors "~1.0.3" + level-iterator-stream "~1.3.0" + prr "~1.0.1" + semver "~5.4.1" + xtend "~4.0.0" + +lodash.debounce@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" + integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= + +lodash@^4.17.14: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + long@~3: version "3.2.0" resolved "https://registry.yarnpkg.com/long/-/long-3.2.0.tgz#d821b7138ca1cb581c172990ef14db200b5c474b" integrity sha1-2CG3E4yhy1gcFymQ7xTbIAtcR0s= +ltgt@~2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ltgt/-/ltgt-2.2.1.tgz#f35ca91c493f7b73da0e07495304f17b31f87ee5" + integrity sha1-81ypHEk/e3PaDgdJUwTxezH4fuU= + md5.js@^1.3.4: version "1.3.5" resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" @@ -310,6 +1407,51 @@ md5.js@^1.3.4: inherits "^2.0.1" safe-buffer "^5.1.2" +memdown@^1.0.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/memdown/-/memdown-1.4.1.tgz#b4e4e192174664ffbae41361aa500f3119efe215" + integrity sha1-tOThkhdGZP+65BNhqlAPMRnv4hU= + dependencies: + abstract-leveldown "~2.7.1" + functional-red-black-tree "^1.0.1" + immediate "^3.2.3" + inherits "~2.0.1" + ltgt "~2.2.0" + safe-buffer "~5.1.1" + +merkle-patricia-tree@^2.1.2, merkle-patricia-tree@^2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/merkle-patricia-tree/-/merkle-patricia-tree-2.3.2.tgz#982ca1b5a0fde00eed2f6aeed1f9152860b8208a" + integrity sha512-81PW5m8oz/pz3GvsAwbauj7Y00rqm81Tzad77tHBwU7pIAtN+TJnMSOJhxBKflSVYhptMMb9RskhqHqrSm1V+g== + dependencies: + async "^1.4.2" + ethereumjs-util "^5.0.0" + level-ws "0.0.0" + levelup "^1.2.1" + memdown "^1.0.0" + readable-stream "^2.0.0" + rlp "^2.0.0" + semaphore ">=1.0.1" + +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.12, mime-types@~2.1.19: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +min-document@^2.19.0: + version "2.19.0" + resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685" + integrity sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU= + dependencies: + dom-walk "^0.1.0" + minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" @@ -320,21 +1462,58 @@ minimalistic-crypto-utils@^1.0.1: resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + node-addon-api@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-2.0.2.tgz#432cfa82962ce494b132e9d72a15b29f71ff5d32" integrity sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA== +node-fetch@^2.6.0, node-fetch@^2.6.1, node-fetch@^2.6.7: + version "2.6.7" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" + integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== + dependencies: + whatwg-url "^5.0.0" + node-gyp-build@^4.2.0: version "4.3.0" resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.3.0.tgz#9f256b03e5826150be39c764bf51e993946d71a3" integrity sha512-iWjXZvmboq0ja1pUGULQBexmxq8CV4xBhX7VDOTbL7ZR4FOowwY/VOtRxBN/yKxmdGoIp4j5ysNT4u3S2pDQ3Q== +node-releases@^2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.4.tgz#f38252370c43854dc48aa431c766c6c398f40476" + integrity sha512-gbMzqQtTtDz/00jQzZ21PQzdI9PyLYqUSvD0p3naOhX4odFji0ZxYdnVwPTxmSwkmxhcFImpozceidSG+AgoPQ== + +oauth-sign@~0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" + integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== + +object-keys@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-0.4.0.tgz#28a6aae7428dd2c3a92f3d95f21335dd204e0336" + integrity sha1-KKaq50KN0sOpLz2V8hM13SBOAzY= + pako@2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/pako/-/pako-2.0.3.tgz#cdf475e31b678565251406de9e759196a0ea7a43" integrity sha512-WjR1hOeg+kki3ZIOjaf4b5WVcay1jaliKSYiEaB1XzwhMQZJxRdQRv0V31EKBYlxb4T7SK3hjfc/jxyU64BoSw== +parse-headers@^2.0.0: + version "2.0.5" + resolved "https://registry.yarnpkg.com/parse-headers/-/parse-headers-2.0.5.tgz#069793f9356a54008571eb7f9761153e6c770da9" + integrity sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + pbkdf2@^3.0.17: version "3.1.2" resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075" @@ -346,6 +1525,69 @@ pbkdf2@^3.0.17: safe-buffer "^5.0.1" sha.js "^2.4.8" +performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= + +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + +pify@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" + integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= + +pify@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-5.0.0.tgz#1f5eca3f5e87ebec28cc6d54a0e4aaf00acc127f" + integrity sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA== + +precond@0.2: + version "0.2.3" + resolved "https://registry.yarnpkg.com/precond/-/precond-0.2.3.tgz#aa9591bcaa24923f1e0f4849d240f47efc1075ac" + integrity sha1-qpWRvKokkj8eD0hJ0kD0fvwQdaw= + +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +process@^0.11.10: + version "0.11.10" + resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= + +promise-to-callback@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/promise-to-callback/-/promise-to-callback-1.0.0.tgz#5d2a749010bfb67d963598fcd3960746a68feef7" + integrity sha1-XSp0kBC/tn2WNZj805YHRqaP7vc= + dependencies: + is-fn "^1.0.0" + set-immediate-shim "^1.0.1" + +prr@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" + integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= + +psl@^1.1.28: + version "1.8.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" + integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== + +punycode@^2.1.0, punycode@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + +qs@~6.5.2: + version "6.5.3" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.3.tgz#3aeeffc91967ef6e35c0e488ef46fb296ab76aad" + integrity sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA== + randombytes@2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.0.5.tgz#dc009a246b8d09a177b4b7a0ae77bc570f4b1b79" @@ -360,6 +1602,29 @@ randombytes@^2.1.0: dependencies: safe-buffer "^5.1.0" +readable-stream@^1.0.33: + version "1.1.14" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" + integrity sha1-fPTFTvZI44EwhMY23SB54WbAgdk= + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + +readable-stream@^2.0.0, readable-stream@^2.2.9: + version "2.3.7" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" + integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + readable-stream@^3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" @@ -369,11 +1634,56 @@ readable-stream@^3.6.0: string_decoder "^1.1.1" util-deprecate "^1.0.1" -regenerator-runtime@^0.13.2: +readable-stream@~1.0.15: + version "1.0.34" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" + integrity sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw= + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + +regenerator-runtime@^0.13.2, regenerator-runtime@^0.13.4: version "0.13.9" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== +request@^2.85.0: + version "2.88.2" + resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" + integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.8.0" + caseless "~0.12.0" + combined-stream "~1.0.6" + extend "~3.0.2" + forever-agent "~0.6.1" + form-data "~2.3.2" + har-validator "~5.1.3" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.19" + oauth-sign "~0.9.0" + performance-now "^2.1.0" + qs "~6.5.2" + safe-buffer "^5.1.2" + tough-cookie "~2.5.0" + tunnel-agent "^0.6.0" + uuid "^3.3.2" + +resolve@^1.14.2: + version "1.22.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.0.tgz#5e0b8c67c15df57a89bdbabe603a002f21731198" + integrity sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw== + dependencies: + is-core-module "^2.8.1" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + ripemd160@^2.0.0, ripemd160@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" @@ -382,19 +1692,41 @@ ripemd160@^2.0.0, ripemd160@^2.0.1: hash-base "^3.0.0" inherits "^2.0.1" -rlp@^2.2.4: +rlp@^2.0.0, rlp@^2.2.3, rlp@^2.2.4: version "2.2.7" resolved "https://registry.yarnpkg.com/rlp/-/rlp-2.2.7.tgz#33f31c4afac81124ac4b283e2bd4d9720b30beaf" integrity sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ== dependencies: bn.js "^5.2.0" +rustbn.js@~0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/rustbn.js/-/rustbn.js-0.2.0.tgz#8082cb886e707155fd1cb6f23bd591ab8d55d0ca" + integrity sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA== + safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== -scrypt-js@^3.0.0: +safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-event-emitter@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/safe-event-emitter/-/safe-event-emitter-1.0.1.tgz#5b692ef22329ed8f69fdce607e50ca734f6f20af" + integrity sha512-e1wFe99A91XYYxoQbcq2ZJUWurxEyP8vfz7A7vuUe1s95q8r5ebraVaA1BukYJcpM6V16ugWoD9vngi8Ccu5fg== + dependencies: + events "^3.0.0" + +safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +scrypt-js@^3.0.0, scrypt-js@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-3.0.1.tgz#d314a57c2aef69d1ad98a138a21fe9eafa9ee312" integrity sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA== @@ -408,6 +1740,31 @@ secp256k1@^4.0.1: node-addon-api "^2.0.0" node-gyp-build "^4.2.0" +semaphore@>=1.0.1, semaphore@^1.0.3: + version "1.1.0" + resolved "https://registry.yarnpkg.com/semaphore/-/semaphore-1.1.0.tgz#aaad8b86b20fe8e9b32b16dc2ee682a8cd26a8aa" + integrity sha512-O4OZEaNtkMd/K0i6js9SL+gqy0ZCBMgUvlSqHKi4IBdjhe7wB8pwztUk1BbZ1fmrvpwFrPbHzqd2w5pTcJH6LA== + +semver@7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" + integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== + +semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +semver@~5.4.1: + version "5.4.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e" + integrity sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg== + +set-immediate-shim@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" + integrity sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E= + setimmediate@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" @@ -421,6 +1778,21 @@ sha.js@^2.4.0, sha.js@^2.4.8: inherits "^2.0.1" safe-buffer "^5.0.1" +sshpk@^1.7.0: + version "1.17.0" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.17.0.tgz#578082d92d4fe612b13007496e543fa0fbcbe4c5" + integrity sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ== + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + bcrypt-pbkdf "^1.0.0" + dashdash "^1.12.0" + ecc-jsbn "~0.1.1" + getpass "^0.1.1" + jsbn "~0.1.0" + safer-buffer "^2.0.2" + tweetnacl "~0.14.0" + string_decoder@^1.1.1: version "1.3.0" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" @@ -428,12 +1800,194 @@ string_decoder@^1.1.1: dependencies: safe-buffer "~5.2.0" +string_decoder@~0.10.x: + version "0.10.31" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" + integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ= + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +strip-hex-prefix@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz#0c5f155fef1151373377de9dbb588da05500e36f" + integrity sha1-DF8VX+8RUTczd96du1iNoFUA428= + dependencies: + is-hex-prefixed "1.0.0" + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + text-encoding@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/text-encoding/-/text-encoding-0.7.0.tgz#f895e836e45990624086601798ea98e8f36ee643" integrity sha512-oJQ3f1hrOnbRLOcwKz0Liq2IcrvDeZRHXhd9RgLrsT+DjWY/nty1Hi7v3dtkaEYbPYe0mUoOfzRrMwfXXwgPUA== -util-deprecate@^1.0.1: +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= + +tough-cookie@~2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" + integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== + dependencies: + psl "^1.1.28" + punycode "^2.1.1" + +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= + +tslib@^2.0.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3" + integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ== + +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= + dependencies: + safe-buffer "^5.0.1" + +tweetnacl-util@^0.15.0: + version "0.15.1" + resolved "https://registry.yarnpkg.com/tweetnacl-util/-/tweetnacl-util-0.15.1.tgz#b80fcdb5c97bcc508be18c44a4be50f022eea00b" + integrity sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw== + +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.5" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= + +tweetnacl@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-1.0.3.tgz#ac0af71680458d8a6378d0d0d050ab1407d35596" + integrity sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw== + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +utf8@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/utf8/-/utf8-3.0.0.tgz#f052eed1364d696e769ef058b183df88c87f69d1" + integrity sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ== + +util-deprecate@^1.0.1, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + +uuid@^3.3.2: + version "3.4.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" + integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== + +uuid@^8.3.2: + version "8.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + +verror@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + +web3-provider-engine@16.0.3: + version "16.0.3" + resolved "https://registry.yarnpkg.com/web3-provider-engine/-/web3-provider-engine-16.0.3.tgz#8ff93edf3a8da2f70d7f85c5116028c06a0d9f07" + integrity sha512-Q3bKhGqLfMTdLvkd4TtkGYJHcoVQ82D1l8jTIwwuJp/sAp7VHnRYb9YJ14SW/69VMWoOhSpPLZV2tWb9V0WJoA== + dependencies: + "@ethereumjs/tx" "^3.3.0" + async "^2.5.0" + backoff "^2.5.0" + clone "^2.0.0" + cross-fetch "^2.1.0" + eth-block-tracker "^4.4.2" + eth-json-rpc-filters "^4.2.1" + eth-json-rpc-infura "^5.1.0" + eth-json-rpc-middleware "^6.0.0" + eth-rpc-errors "^3.0.0" + eth-sig-util "^1.4.2" + ethereumjs-block "^1.2.2" + ethereumjs-util "^5.1.5" + ethereumjs-vm "^2.3.4" + json-stable-stringify "^1.0.1" + promise-to-callback "^1.0.0" + readable-stream "^2.2.9" + request "^2.85.0" + semaphore "^1.0.3" + ws "^5.1.1" + xhr "^2.2.0" + xtend "^4.0.1" + +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + integrity sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE= + +whatwg-fetch@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz#dde6a5df315f9d39991aa17621853d720b85566f" + integrity sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng== + +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + integrity sha1-lmRU6HZUYuN2RNNib2dCzotwll0= + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + +ws@^5.1.1: + version "5.2.3" + resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.3.tgz#05541053414921bc29c63bee14b8b0dd50b07b3d" + integrity sha512-jZArVERrMsKUatIdnLzqvcfydI85dvd/Fp1u/VOpfdDWQ4c9qWXe+VIeAbQ5FrDwciAkr+lzofXLz3Kuf26AOA== + dependencies: + async-limiter "~1.0.0" + +xhr@^2.2.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/xhr/-/xhr-2.6.0.tgz#b69d4395e792b4173d6b7df077f0fc5e4e2b249d" + integrity sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA== + dependencies: + global "~4.4.0" + is-function "^1.0.1" + parse-headers "^2.0.0" + xtend "^4.0.0" + +xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + +xtend@~2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-2.1.2.tgz#6efecc2a4dad8e6962c4901b337ce7ba87b5d28b" + integrity sha1-bv7MKk2tjmlixJAbM3znuoe10os= + dependencies: + object-keys "~0.4.0" diff --git a/oracle/CommonTypes.ts b/oracle/CommonTypes.ts index 982f136..21d74d8 100644 --- a/oracle/CommonTypes.ts +++ b/oracle/CommonTypes.ts @@ -6,7 +6,8 @@ export interface ConfigType { eos: { network: string, // wsEndpoint: string, - chainId: string, + netId: string, + id?: number, endpoint?: string, endpoints: Array, teleportContract: string, @@ -19,7 +20,8 @@ export interface ConfigType { eth: { network: string, // wsEndpoint: string, - chainId: number, + netId?: string, + id?: bigint | number | string, endpoint?: string, endpoints: Array, teleportContract: string, @@ -44,7 +46,7 @@ export interface TeleportTableEntry{ export interface eosio_claim_data { oracle_name: string; - id: string; + id: number; to_eth: string; quantity: string; } @@ -54,6 +56,6 @@ export interface eosio_teleport_data { to: string; ref: string; quantity: string; - chain_id: string; + chain_id: number; confirmed: boolean; } \ No newline at end of file diff --git a/oracle/EndpointSwitcher.js b/oracle/EndpointSwitcher.js index db63bc5..df3c374 100644 --- a/oracle/EndpointSwitcher.js +++ b/oracle/EndpointSwitcher.js @@ -55,9 +55,9 @@ var eosjs_1 = require("eosjs"); var cross_fetch_1 = __importDefault(require("cross-fetch")); var ethers_1 = require("ethers"); var EosApi = /** @class */ (function () { - function EosApi(chainId, endpointList, signatureProvider, timeout) { + function EosApi(netId, endpointList, signatureProvider, timeout) { if (timeout === void 0) { timeout = 10000; } - this.chainId = chainId; + this.netId = netId; this.signatureProvider = signatureProvider; this.timeout = timeout; this.api = null; @@ -133,7 +133,7 @@ var EosApi = /** @class */ (function () { return [4 /*yield*/, this.getRPC().get_info()]; case 1: _a.lastInfo = _c.sent(); - if (this.lastInfo.chain_id != this.chainId) { + if (this.lastInfo.chain_id != this.netId) { console.log('Delete endpoint because it uses another eosio chain', this.endpoint); this.endpointList.splice(this.epId, 1); this.gotRightInfo.splice(this.epId, 1); @@ -181,9 +181,8 @@ var EosApi = /** @class */ (function () { }()); exports.EosApi = EosApi; var EthApi = /** @class */ (function () { - function EthApi(chainId, endpointList, timeout) { + function EthApi(netIdStr, endpointList, timeout) { if (timeout === void 0) { timeout = 10000; } - this.chainId = chainId; this.timeout = timeout; this.epId = -1; this.providers = []; @@ -191,9 +190,13 @@ var EthApi = /** @class */ (function () { this.endpoint = this.endpointList[0]; this.lastInfo = null; this.gotRightInfo = []; + this.netId = undefined; if (endpointList.length <= 0) { throw ('No list of eth entpoints defined'); } + if (netIdStr) { + this.netId = Number(netIdStr); + } this.gotRightInfo = Array(endpointList.length).fill(false); this.endpointList = endpointList.map(function (ep) { var lastIndex = ep.length - 1; @@ -217,7 +220,9 @@ var EthApi = /** @class */ (function () { return [4 /*yield*/, this.providers[this.epId].getNetwork()]; case 1: _a.lastInfo = _b.sent(); - if (this.lastInfo.chainId != this.chainId) { + console.log('netId', this.netId); + console.log('this.lastInfo.chainId', this.lastInfo.chainId); + if (this.netId !== undefined && this.netId != this.lastInfo.chainId) { console.log('Delete endpoint because it uses another eosio chain', this.endpoint); this.endpointList.splice(this.epId, 1); this.gotRightInfo.splice(this.epId, 1); diff --git a/oracle/EndpointSwitcher.ts b/oracle/EndpointSwitcher.ts index 02a95b9..ff76559 100644 --- a/oracle/EndpointSwitcher.ts +++ b/oracle/EndpointSwitcher.ts @@ -14,7 +14,7 @@ export class EosApi { private lastInfo: GetInfoResult | null = null private gotRightInfo: Array = [] - constructor(private chainId: string, endpointList: Array, private signatureProvider: SignatureProvider, private timeout = 10000){ + constructor(private netId: string, endpointList: Array, private signatureProvider: SignatureProvider, private timeout = 10000){ if(endpointList.length <= 0){ throw('No list of eosio entpoints defined') } @@ -61,7 +61,7 @@ export class EosApi { private async checkInfo() { try{ this.lastInfo = await this.getRPC().get_info(); - if(this.lastInfo.chain_id != this.chainId){ + if(this.lastInfo.chain_id != this.netId){ console.log('Delete endpoint because it uses another eosio chain', this.endpoint) this.endpointList.splice(this.epId, 1) this.gotRightInfo.splice(this.epId, 1) @@ -114,11 +114,14 @@ export class EthApi{ private endpoint = this.endpointList[0] private lastInfo: ethers.providers.Network | null = null private gotRightInfo: Array = [] - - constructor(private chainId: number, endpointList: Array, private timeout = 10000){ + private netId: undefined | number = undefined + constructor(netIdStr: string | undefined, endpointList: Array, private timeout = 10000){ if(endpointList.length <= 0){ throw('No list of eth entpoints defined') } + if(netIdStr){ + this.netId = Number(netIdStr) + } this.gotRightInfo = Array(endpointList.length).fill(false) this.endpointList = endpointList.map(ep => { const lastIndex = ep.length - 1 @@ -138,7 +141,10 @@ export class EthApi{ try{ this.lastInfo = await this.providers[this.epId].getNetwork() - if(this.lastInfo.chainId != this.chainId){ + console.log('netId', this.netId); + console.log('this.lastInfo.chainId', this.lastInfo.chainId); + + if(this.netId !== undefined && this.netId != this.lastInfo.chainId){ console.log('Delete endpoint because it uses another eosio chain', this.endpoint) this.endpointList.splice(this.epId, 1) this.gotRightInfo.splice(this.epId, 1) diff --git a/oracle/oracle-eos.js b/oracle/oracle-eos.js index e537a93..2e9b3c9 100755 --- a/oracle/oracle-eos.js +++ b/oracle/oracle-eos.js @@ -94,22 +94,8 @@ var EosOracle = /** @class */ (function () { this.signatureProvider = signatureProvider; this.running = false; this.irreversible_time = 0; - this.eos_api = new EndpointSwitcher_1.EosApi(this.config.eos.chainId, this.config.eos.endpoints, this.signatureProvider); + this.eos_api = new EndpointSwitcher_1.EosApi(this.config.eos.netId, this.config.eos.endpoints, this.signatureProvider); } - // static async tryHard(tries: number, action : (tryNumber?: number) => Promise, onCatch: (e?: any, tryNumber?: number) => boolean | undefined) { - // let tryI = 0 - // let fin : any = false - // do{ - // try{ - // fin = await action(tryI) - // if(fin || typeof fin == 'number'){ - // return fin - // } - // } catch (e){ - // fin = onCatch(e, tryI)? true : false - // } - // } while (!fin && tryI < tries) - // } /** * Send sign a teleport. Repeats itself until a defined amount of tries are reached * @param id Teleport id @@ -239,25 +225,6 @@ var EosOracle = /** @class */ (function () { }); }); }; - // async function validateEntryByOtherEndpoints(id: number, logdata: Uint8Array, dataSize: number){ - // if(config.eos.epVerifications > eos_api.get_EndpointAmount()){ - // console.error('Not enough endpoints to verify data') - // process.exit(1) - // } - // const lastEndpoint = eos_api.getEndpoint() - // await eos_api.nextEndpoint() - // for(let i = 1; i < config.eos.epVerifications; i++){ - // const entries = (await getTableEntries(id, 1, false)).rows as Array - // if(lastEndpoint == eos_api.getEndpoint()){ - // throw('No available endpoints for verification') - // } - // const veriData = fromHexString(entries[0]).slice(0, dataSize) - // if(!arraysEqual(logdata, veriData)){ - // throw('Verification failed by' + eos_api.getEndpoint()) - // } - // console.log(`Teleport id ${id} verified ${i + 1} times`) - // } - // } /** * Serialize the table entry of a teleport * @param teleport Parameters of a teleport table entry @@ -270,7 +237,7 @@ var EosOracle = /** @class */ (function () { textEncoder: new text_encoding_1.TextEncoder, textDecoder: new text_encoding_1.TextDecoder }); - sb.pushNumberAsUint64(teleport.id); // TODO: use bigint + sb.pushNumberAsUint64(teleport.id); sb.pushUint32(teleport.time); sb.pushName(teleport.account); sb.pushAsset(teleport.quantity); @@ -599,7 +566,6 @@ var EosOracle = /** @class */ (function () { }); }); }; - // private current_block_time = 0 EosOracle.maxWait = 180; // The max amount of seconds to wait to check an entry again if it is irreversible now return EosOracle; }()); diff --git a/oracle/oracle-eos.ts b/oracle/oracle-eos.ts index af59f2b..5fcec98 100644 --- a/oracle/oracle-eos.ts +++ b/oracle/oracle-eos.ts @@ -57,27 +57,11 @@ class EosOracle{ private eos_api: EosApi public running = false private irreversible_time = 0 - // private current_block_time = 0 static maxWait = 180 // The max amount of seconds to wait to check an entry again if it is irreversible now constructor(private config: ConfigType, private signatureProvider: JsSignatureProvider){ - this.eos_api = new EosApi(this.config.eos.chainId, this.config.eos.endpoints, this.signatureProvider) + this.eos_api = new EosApi(this.config.eos.netId, this.config.eos.endpoints, this.signatureProvider) } - - // static async tryHard(tries: number, action : (tryNumber?: number) => Promise, onCatch: (e?: any, tryNumber?: number) => boolean | undefined) { - // let tryI = 0 - // let fin : any = false - // do{ - // try{ - // fin = await action(tryI) - // if(fin || typeof fin == 'number'){ - // return fin - // } - // } catch (e){ - // fin = onCatch(e, tryI)? true : false - // } - // } while (!fin && tryI < tries) - // } /** * Send sign a teleport. Repeats itself until a defined amount of tries are reached @@ -168,27 +152,7 @@ class EosOracle{ return teleport_res as GetTableRowsResult } - - // async function validateEntryByOtherEndpoints(id: number, logdata: Uint8Array, dataSize: number){ - // if(config.eos.epVerifications > eos_api.get_EndpointAmount()){ - // console.error('Not enough endpoints to verify data') - // process.exit(1) - // } - // const lastEndpoint = eos_api.getEndpoint() - // await eos_api.nextEndpoint() - // for(let i = 1; i < config.eos.epVerifications; i++){ - // const entries = (await getTableEntries(id, 1, false)).rows as Array - // if(lastEndpoint == eos_api.getEndpoint()){ - // throw('No available endpoints for verification') - // } - // const veriData = fromHexString(entries[0]).slice(0, dataSize) - // if(!arraysEqual(logdata, veriData)){ - // throw('Verification failed by' + eos_api.getEndpoint()) - // } - // console.log(`Teleport id ${id} verified ${i + 1} times`) - // } - // } - + /** * Serialize the table entry of a teleport * @param teleport Parameters of a teleport table entry @@ -201,7 +165,7 @@ class EosOracle{ textEncoder: new TextEncoder, textDecoder: new TextDecoder }) - sb.pushNumberAsUint64(teleport.id) // TODO: use bigint + sb.pushNumberAsUint64(teleport.id) sb.pushUint32(teleport.time) sb.pushName(teleport.account) sb.pushAsset(teleport.quantity) @@ -280,15 +244,6 @@ class EosOracle{ if(info.last_irreversible_block_time){ // Get last irreversible block time if available irr_time = new Date(info.last_irreversible_block_time + 'Z').getTime() - - // // Check current time - // let cur_time = new Date(info.head_block_time).getTime() - // if(cur_time <= minIrrTime){ - // throw(`Current time is lower than possible, occurred by using ${this.eos_api.getEndpoint()}`) - // } - // if(cur_time < minCurrentTimeMs){ - // minCurrentTimeMs = cur_time - // } } else if (info.last_irreversible_block_num){ // Get last irreversible block time from last irreversible block let irr_block = await this.eos_api.getRPC().get_block(info.last_irreversible_block_num) @@ -324,7 +279,6 @@ class EosOracle{ if(lowestIrr){ this.irreversible_time = lowestIrr } - // this.current_block_time = minCurrentTimeMs } /** diff --git a/oracle/oracle-eth.js b/oracle/oracle-eth.js index e48ae5e..7f27186 100755 --- a/oracle/oracle-eth.js +++ b/oracle/oracle-eth.js @@ -78,8 +78,8 @@ var EthOracle = /** @class */ (function () { this.DEFAULT_BLOCKS_TO_WAIT = 5; this.minTrySend = 3; this.blocks_file_name = ".oracle_".concat(configFile.eth.network, "_block-").concat(configFile.eth.oracleAccount); - this.eos_api = new EndpointSwitcher_1.EosApi(this.config.eos.chainId, this.config.eos.endpoints, this.signatureProvider); - this.eth_api = new EndpointSwitcher_1.EthApi(this.config.eth.chainId, this.config.eth.endpoints); + this.eos_api = new EndpointSwitcher_1.EosApi(this.config.eos.netId, this.config.eos.endpoints, this.signatureProvider); + this.eth_api = new EndpointSwitcher_1.EthApi(this.config.eth.netId, this.config.eth.endpoints); this.minTrySend = Math.max(this.minTrySend, config.eos.endpoints.length); } /** @@ -89,7 +89,7 @@ var EthOracle = /** @class */ (function () { * @returns */ EthOracle.extractEthClaimedData = function (data, config) { - var id = data[0].toNumber(); // TODO: .toBigInt() + var id = data[0].toNumber(); var to_eth = data[1].replace('0x', '') + '000000000000000000000000'; var quantity = (data[2].toNumber() / Math.pow(10, config.precision)).toFixed(config.precision) + ' ' + config.symbol; return { oracle_name: config.eos.oracleAccount, id: id, to_eth: to_eth, quantity: quantity, }; @@ -321,10 +321,10 @@ var EthOracle = /** @class */ (function () { return [2 /*return*/, eos_res]; case 4: e_3 = _a.sent(); - if (!(e_3.message.indexOf('Already marked as claimed') > -1 || e_3.message.indexOf('Oracle has already approved') > -1)) return [3 /*break*/, 5]; + if (!(e_3.message.indexOf('Already marked as claimed') > -1 || e_3.message.indexOf('Oracle has already approved') > -1 || e_3.message.indexOf('This teleport has already completed'))) return [3 /*break*/, 5]; return [2 /*return*/, true]; case 5: - console.error("Error while sending to eosio chain with ".concat(this.eos_api, ": ").concat(e_3.message, " \u274C")); + console.error("Error while sending to eosio chain with ".concat(this.eos_api.getEndpoint(), ": ").concat(e_3.message, " \u274C")); return [4 /*yield*/, this.eos_api.nextEndpoint()]; case 6: _a.sent(); @@ -377,6 +377,11 @@ var EthOracle = /** @class */ (function () { entry = res_2_1.value; decodedData = ethers_1.ethers.utils.defaultAbiCoder.decode(['string', 'uint', 'uint'], entry.data); eosioData = EthOracle.extractEthTeleportData(decodedData, entry.transactionHash, this.config); + // Check id is equal to recipient chain + if (this.config.eos.id !== undefined && eosioData.chain_id !== Number(this.config.eos.id)) { + console.log("Skip teleport event with ".concat(eosioData.to, " as recipient and ref of ").concat(eosioData.ref, " because the chain id ").concat(eosioData.chain_id, " referes to another blockchain.")); + return [3 /*break*/, 7]; + } return [4 /*yield*/, this.await_confirmation(entry)]; case 5: // Wait for confirmation of each transaction before continuing @@ -389,6 +394,10 @@ var EthOracle = /** @class */ (function () { console.log("Teleport with trx hash ".concat(entry.transactionHash, " got removed and will be skipped \u274C")); return [3 /*break*/, 7]; } + // Set the id as the id of the sender chain + if (this.config.eth.id !== undefined) { + eosioData.chain_id = Number(this.config.eth.id); + } actions = [{ account: this.config.eos.teleportContract, name: 'received', @@ -515,31 +524,40 @@ var EthOracle = /** @class */ (function () { return [4 /*yield*/, this.eth_api.nextEndpoint()]; case 1: _a.sent(); - _a.label = 2; + return [4 /*yield*/, this.eos_api.nextEndpoint()]; case 2: - if (!this.running) return [3 /*break*/, 23]; + _a.sent(); _a.label = 3; case 3: - _a.trys.push([3, 19, , 21]); - return [4 /*yield*/, this.getLatestBlock()]; + if (!this.running) return [3 /*break*/, 24]; + _a.label = 4; case 4: + _a.trys.push([4, 20, , 22]); + return [4 /*yield*/, this.getLatestBlock()]; + case 5: latest_block = _a.sent(); if (typeof latest_block != 'number') { console.error('Latest block number is not a number', latest_block); return [2 /*return*/]; } - if (!!from_block) return [3 /*break*/, 10]; - if (!(start_ref === 'latest')) return [3 /*break*/, 9]; - _a.label = 5; - case 5: - _a.trys.push([5, 7, , 8]); - return [4 /*yield*/, EthOracle.load_block_number_from_file(this.blocks_file_name)]; + if (!!from_block) return [3 /*break*/, 11]; + if (!(start_ref === 'latest')) return [3 /*break*/, 10]; + _a.label = 6; case 6: + _a.trys.push([6, 8, , 9]); + return [4 /*yield*/, EthOracle.load_block_number_from_file(this.blocks_file_name)]; + case 7: from_block = _a.sent(); from_block -= 50; // for fresh start go back 50 blocks - console.log("Starting from saved block with additional previous 50 blocks for safety: ".concat(from_block, ".")); - return [3 /*break*/, 8]; - case 7: + if (this.config.eth.genesisBlock && this.config.eth.genesisBlock > from_block) { + from_block = this.config.eth.genesisBlock; + console.log('Start by genesis block.'); + } + else { + console.log("Starting from saved block with additional previous 50 blocks for safety: ".concat(from_block, ".")); + } + return [3 /*break*/, 9]; + case 8: err_1 = _a.sent(); console.log('Could not get block from file and it was not specified ❌'); if (this.config.eth.genesisBlock) { @@ -550,66 +568,66 @@ var EthOracle = /** @class */ (function () { from_block = latest_block - 100; // go back 100 blocks from latest console.log('Start 100 blocks before the latest block.'); } - return [3 /*break*/, 8]; - case 8: return [3 /*break*/, 10]; - case 9: + return [3 /*break*/, 9]; + case 9: return [3 /*break*/, 11]; + case 10: if (typeof start_ref === 'number') { from_block = start_ref; } else { from_block = this.config.eth.genesisBlock; } - _a.label = 10; - case 10: + _a.label = 11; + case 11: if (from_block < 0) { from_block = 0; } to_block = Math.min(from_block + 100, latest_block); - if (!(start_ref >= latest_block)) return [3 /*break*/, 12]; + if (!(start_ref >= latest_block)) return [3 /*break*/, 13]; console.log("Up to date at block ".concat(to_block)); return [4 /*yield*/, sleep(10000)]; - case 11: - _a.sent(); - _a.label = 12; case 12: + _a.sent(); + _a.label = 13; + case 13: console.log("Getting events from block ".concat(from_block, " to ").concat(to_block)); return [4 /*yield*/, this.process_claimed(from_block, to_block, trxBroadcast)]; - case 13: + case 14: _a.sent(); return [4 /*yield*/, this.process_teleported(from_block, to_block, trxBroadcast)]; - case 14: + case 15: _a.sent(); from_block = to_block; // Save last block received return [4 /*yield*/, EthOracle.save_block_to_file(to_block, this.blocks_file_name)]; - case 15: + case 16: // Save last block received _a.sent(); - if (!(latest_block - from_block <= 1000)) return [3 /*break*/, 17]; + if (!(latest_block - from_block <= 1000)) return [3 /*break*/, 18]; return [4 /*yield*/, EthOracle.WaitWithAnimation(30, 'Wait for new blocks...')]; - case 16: - _a.sent(); - return [3 /*break*/, 18]; case 17: - console.log("Not waiting... ".concat(latest_block, " - ").concat(from_block)); - _a.label = 18; - case 18: return [3 /*break*/, 21]; - case 19: + _a.sent(); + return [3 /*break*/, 19]; + case 18: + console.log("Current block ".concat(from_block, " latest block ").concat(latest_block, ". Not waiting...")); + _a.label = 19; + case 19: return [3 /*break*/, 22]; + case 20: e_6 = _a.sent(); console.error('⚡️ ' + e_6.message); console.error('Try again in 5 seconds'); return [4 /*yield*/, sleep(5000)]; - case 20: + case 21: _a.sent(); - return [3 /*break*/, 21]; - case 21: + return [3 /*break*/, 22]; + case 22: // Select the next endpoint to distribute the requests return [4 /*yield*/, this.eos_api.nextEndpoint()]; - case 22: + case 23: // Select the next endpoint to distribute the requests _a.sent(); - return [3 /*break*/, 2]; - case 23: return [2 /*return*/]; + return [3 /*break*/, 3]; + case 24: return [2 /*return*/]; } }); }); diff --git a/oracle/oracle-eth.ts b/oracle/oracle-eth.ts index 5d1092f..edb1193 100755 --- a/oracle/oracle-eth.ts +++ b/oracle/oracle-eth.ts @@ -38,8 +38,8 @@ class EthOracle { constructor(private config: ConfigType, private signatureProvider: JsSignatureProvider){ this.blocks_file_name = `.oracle_${configFile.eth.network}_block-${configFile.eth.oracleAccount}` - this.eos_api = new EosApi(this.config.eos.chainId, this.config.eos.endpoints, this.signatureProvider) - this.eth_api = new EthApi(this.config.eth.chainId, this.config.eth.endpoints) + this.eos_api = new EosApi(this.config.eos.netId, this.config.eos.endpoints, this.signatureProvider) + this.eth_api = new EthApi(this.config.eth.netId, this.config.eth.endpoints) this.minTrySend = Math.max(this.minTrySend, config.eos.endpoints.length) } @@ -50,7 +50,7 @@ class EthOracle { * @returns */ static extractEthClaimedData (data: ethers.utils.Result, config: EthDataConfig): eosio_claim_data { - const id = data[0].toNumber() // TODO: .toBigInt() + const id = data[0].toNumber() const to_eth = data[1].replace('0x', '') + '000000000000000000000000' const quantity = (data[2].toNumber() / Math.pow(10, config.precision)).toFixed(config.precision) + ' ' + config.symbol return { oracle_name: config.eos.oracleAccount, id, to_eth, quantity, } @@ -63,12 +63,12 @@ class EthOracle { * @returns */ static extractEthTeleportData(data: ethers.utils.Result, transactionHash: string, config: EthDataConfig): eosio_teleport_data { - const tokens = data[1].toNumber() + const tokens = data[1].toNumber() as number if (tokens <= 0) { throw new Error('Tokens are less than or equal to 0') } const to = data[0] - const chain_id = data[2].toNumber() + const chain_id = data[2].toNumber() as number const amount = (tokens / Math.pow(10, config.precision)).toFixed( config.precision ) @@ -157,7 +157,7 @@ class EthOracle { topics: [this.claimed_topic], } const res = await this.eth_api.getProvider().getLogs(query) - + // Mark each claimed event on eosio chain as claimed for await (const entry of res) { // Extract data from eth claimed event @@ -217,10 +217,10 @@ class EthOracle { return eos_res } catch (e: any) { // Check if the error appears because the transaction is already claimed or approved - if (e.message.indexOf('Already marked as claimed') > -1 || e.message.indexOf('Oracle has already approved') > -1) { + if (e.message.indexOf('Already marked as claimed') > -1 || e.message.indexOf('Oracle has already approved') > -1 || e.message.indexOf('This teleport has already completed')) { return true } else { - console.error(`Error while sending to eosio chain with ${this.eos_api}: ${e.message} ❌`) + console.error(`Error while sending to eosio chain with ${this.eos_api.getEndpoint()}: ${e.message} ❌`) await this.eos_api.nextEndpoint() await sleep(1000) } @@ -250,7 +250,13 @@ class EthOracle { // Extract data from teleport eth event const decodedData = ethers.utils.defaultAbiCoder.decode(['string', 'uint', 'uint'], entry.data) const eosioData = EthOracle.extractEthTeleportData(decodedData, entry.transactionHash, this.config) - + + // Check id is equal to recipient chain + if(this.config.eos.id !== undefined && eosioData.chain_id !== Number(this.config.eos.id)){ + console.log(`Skip teleport event with ${eosioData.to} as recipient and ref of ${eosioData.ref} because the chain id ${eosioData.chain_id} referes to another blockchain.`) + continue + } + // Wait for confirmation of each transaction before continuing if(!await this.await_confirmation(entry)){ console.log(`Skip teleport event with ${eosioData.to} as recipient and ref of ${eosioData.ref}`) @@ -263,6 +269,11 @@ class EthOracle { continue } + // Set the id as the id of the sender chain + if(this.config.eth.id !== undefined){ + eosioData.chain_id = Number(this.config.eth.id) + } + // Create action const actions = [{ account: this.config.eos.teleportContract, @@ -339,6 +350,7 @@ class EthOracle { let from_block: number | undefined this.running = true await this.eth_api.nextEndpoint() + await this.eos_api.nextEndpoint() while (this.running) { try { @@ -355,7 +367,12 @@ class EthOracle { try { from_block = await EthOracle.load_block_number_from_file(this.blocks_file_name) from_block -= 50 // for fresh start go back 50 blocks - console.log(`Starting from saved block with additional previous 50 blocks for safety: ${from_block}.`) + if(this.config.eth.genesisBlock && this.config.eth.genesisBlock > from_block){ + from_block = this.config.eth.genesisBlock + console.log('Start by genesis block.') + } else { + console.log(`Starting from saved block with additional previous 50 blocks for safety: ${from_block}.`) + } } catch (err) { console.log('Could not get block from file and it was not specified ❌') if(this.config.eth.genesisBlock){ @@ -395,7 +412,7 @@ class EthOracle { if (latest_block - from_block <= 1000) { await EthOracle.WaitWithAnimation(30, 'Wait for new blocks...') } else { - console.log(`Not waiting... ${latest_block} - ${from_block}`) + console.log(`Current block ${from_block} latest block ${latest_block}. Not waiting...`) } } catch (e: any) { console.error('⚡️ ' + e.message) diff --git a/oracle/yarn.lock b/oracle/yarn.lock index c3655ae..ab02884 100644 --- a/oracle/yarn.lock +++ b/oracle/yarn.lock @@ -13,9 +13,9 @@ zlib "^1.0.5" "@ethereumjs/common@^2.5.0", "@ethereumjs/common@^2.6.3": - version "2.6.3" - resolved "https://registry.yarnpkg.com/@ethereumjs/common/-/common-2.6.3.tgz#39ddece7300b336276bad6c02f6a9f1a082caa05" - integrity sha512-mQwPucDL7FDYIg9XQ8DL31CnIYZwGhU5hyOO5E+BMmT71G0+RHvIT5rIkLBirJEKxV6+Rcf9aEIY0kXInxUWpQ== + version "2.6.4" + resolved "https://registry.yarnpkg.com/@ethereumjs/common/-/common-2.6.4.tgz#1b3cdd3aa4ee3b0ca366756fc35e4a03022a01cc" + integrity sha512-RDJh/R/EAr+B7ZRg5LfJ0BIpf/1LydFgYdvZEuTraojCbVypO2sQ+QnpP5u2wJf9DASyooKqu8O4FJEWUV6NXw== dependencies: crc-32 "^1.2.0" ethereumjs-util "^7.1.4" @@ -43,10 +43,10 @@ "@ethersproject/properties" "^5.0.3" "@ethersproject/strings" "^5.0.4" -"@ethersproject/abi@5.6.0", "@ethersproject/abi@^5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.6.0.tgz#ea07cbc1eec2374d32485679c12408005895e9f3" - integrity sha512-AhVByTwdXCc2YQ20v300w6KVHle9g2OFc28ZAFCPnJyEpkv1xKXjZcSTgWOlv1i+0dqlgF8RCF2Rn2KC1t+1Vg== +"@ethersproject/abi@5.6.1", "@ethersproject/abi@^5.6.0": + version "5.6.1" + resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.6.1.tgz#f7de888edeb56b0a657b672bdd1b3a1135cd14f7" + integrity sha512-0cqssYh6FXjlwKWBmLm3+zH2BNARoS5u/hxbz+LpQmcDB3w0W553h2btWui1/uZp2GBM/SI3KniTuMcYyHpA5w== dependencies: "@ethersproject/address" "^5.6.0" "@ethersproject/bignumber" "^5.6.0" @@ -211,10 +211,10 @@ resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.6.0.tgz#d7db1bfcc22fd2e4ab574cba0bb6ad779a9a3e7a" integrity sha512-BiBWllUROH9w+P21RzoxJKzqoqpkyM1pRnEKG69bulE9TSQD8SAIvTQqIMZmmCO8pUNkgLP1wndX1gKghSpBmg== -"@ethersproject/networks@5.6.1", "@ethersproject/networks@^5.6.0": - version "5.6.1" - resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.6.1.tgz#7a21ed1f83e86121737b16841961ec99ccf5c9c7" - integrity sha512-b2rrupf3kCTcc3jr9xOWBuHylSFtbpJf79Ga7QR98ienU2UqGimPGEsYMgbI29KHJfA5Us89XwGVmxrlxmSrMg== +"@ethersproject/networks@5.6.2", "@ethersproject/networks@^5.6.0": + version "5.6.2" + resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.6.2.tgz#2bacda62102c0b1fcee408315f2bed4f6fbdf336" + integrity sha512-9uEzaJY7j5wpYGTojGp8U89mSsgQLc40PCMJLMCnFXTs7nhBveZ0t7dbqWUNrepWTszDbFkYD6WlL8DKx5huHA== dependencies: "@ethersproject/logger" "^5.6.0" @@ -233,10 +233,10 @@ dependencies: "@ethersproject/logger" "^5.6.0" -"@ethersproject/providers@5.6.2": - version "5.6.2" - resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.6.2.tgz#b9807b1c8c6f59fa2ee4b3cf6519724d07a9f422" - integrity sha512-6/EaFW/hNWz+224FXwl8+HdMRzVHt8DpPmu5MZaIQqx/K/ELnC9eY236SMV7mleCM3NnEArFwcAAxH5kUUgaRg== +"@ethersproject/providers@5.6.5": + version "5.6.5" + resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.6.5.tgz#aefecf78459817a323452e05a16d56afcf807e27" + integrity sha512-TRS+c2Ud+cMpWodmGAc9xbnYRPWzRNYt2zkCSnj58nJoamBQ6x4cUbBeo0lTC3y+6RDVIBeJv18OqsDbSktLVg== dependencies: "@ethersproject/abstract-provider" "^5.6.0" "@ethersproject/abstract-signer" "^5.6.0" @@ -283,10 +283,10 @@ "@ethersproject/logger" "^5.6.0" hash.js "1.1.7" -"@ethersproject/signing-key@5.6.0", "@ethersproject/signing-key@^5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.6.0.tgz#4f02e3fb09e22b71e2e1d6dc4bcb5dafa69ce042" - integrity sha512-S+njkhowmLeUu/r7ir8n78OUKx63kBdMCPssePS89So1TH4hZqnWFsThEd/GiXYp9qMxVrydf7KdM9MTGPFukA== +"@ethersproject/signing-key@5.6.1", "@ethersproject/signing-key@^5.6.0": + version "5.6.1" + resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.6.1.tgz#31b0a531520616254eb0465b9443e49515c4d457" + integrity sha512-XvqQ20DH0D+bS3qlrrgh+axRMth5kD1xuvqUQUTeezxUTXBOeR6hWz2/C6FBEu39FRytyybIWrYf7YLSAKr1LQ== dependencies: "@ethersproject/bytes" "^5.6.0" "@ethersproject/logger" "^5.6.0" @@ -424,14 +424,14 @@ ethereumjs-util "*" "@types/node@*": - version "17.0.23" - resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.23.tgz#3b41a6e643589ac6442bdbd7a4a3ded62f33f7da" - integrity sha512-UxDxWn7dl97rKVeVS61vErvw086aCYhDLyvRQZ5Rk65rZKepaFdm53GeqXaKBuOhED4e9uWq34IC3TdSdJJ2Gw== + version "17.0.31" + resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.31.tgz#a5bb84ecfa27eec5e1c802c6bbf8139bdb163a5d" + integrity sha512-AR0x5HbXGqkEx9CadRH3EBYx/VkiUgZIhP4wvPn/+5KIsgpNoyFaRlVe0Zlx9gRtg8fA06a9tskE2MSN7TcG4Q== "@types/node@^12.12.6": - version "12.20.47" - resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.47.tgz#ca9237d51f2a2557419688511dab1c8daf475188" - integrity sha512-BzcaRsnFuznzOItW1WpQrDHM7plAa7GIDMZ6b5pnMbkqEtM/6WCOhvZar39oeMQP79gwvFUWjjptE7/KGcNqFg== + version "12.20.50" + resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.50.tgz#14ba5198f1754ffd0472a2f84ab433b45ee0b65e" + integrity sha512-+9axpWx2b2JCVovr7Ilgt96uc6C1zBKOQMpGtRbWT9IoR/8ue32GGMfGA4woP8QyP2gBs6GQWEVM3tCybGCxDA== "@types/pbkdf2@^3.0.0": version "3.1.0" @@ -613,21 +613,23 @@ bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.6, bn.js@^4.11.9: resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== -body-parser@1.19.2, body-parser@^1.16.0: - version "1.19.2" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.2.tgz#4714ccd9c157d44797b8b5607d72c0b89952f26e" - integrity sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw== +body-parser@1.20.0, body-parser@^1.16.0: + version "1.20.0" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.0.tgz#3de69bd89011c11573d7bfee6a64f11b6bd27cc5" + integrity sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg== dependencies: bytes "3.1.2" content-type "~1.0.4" debug "2.6.9" - depd "~1.1.2" - http-errors "1.8.1" + depd "2.0.0" + destroy "1.2.0" + http-errors "2.0.0" iconv-lite "0.4.24" - on-finished "~2.3.0" - qs "6.9.7" - raw-body "2.4.3" + on-finished "2.4.1" + qs "6.10.3" + raw-body "2.5.1" type-is "~1.6.18" + unpipe "1.0.0" brorand@^1.0.1, brorand@^1.1.0: version "1.1.0" @@ -855,10 +857,10 @@ cookie-signature@1.0.6: resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= -cookie@0.4.2: - version "0.4.2" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432" - integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== +cookie@0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" + integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== cookiejar@^2.1.1: version "2.1.3" @@ -879,12 +881,9 @@ cors@^2.8.1: vary "^1" crc-32@^1.2.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/crc-32/-/crc-32-1.2.1.tgz#436d2bcaad27bcb6bd073a2587139d3024a16460" - integrity sha512-Dn/xm/1vFFgs3nfrpEVScHoIslO9NZRITWGz/1E/St6u4xw99vfZzVkW0OSnzx2h9egej9xwMCEut6sqwokM/w== - dependencies: - exit-on-epipe "~1.0.1" - printj "~1.3.1" + version "1.2.2" + resolved "https://registry.yarnpkg.com/crc-32/-/crc-32-1.2.2.tgz#3cad35a934b8bf71f25ca524b6da51fb7eace2ff" + integrity sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ== create-ecdh@^4.0.0: version "4.0.4" @@ -985,22 +984,23 @@ defer-to-connect@^1.0.1: resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591" integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ== -define-properties@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" - integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== +define-properties@^1.1.3, define-properties@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.4.tgz#0b14d7bd7fbeb2f3572c3a7eda80ea5d57fb05b1" + integrity sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA== dependencies: - object-keys "^1.0.12" + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= -depd@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" - integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= +depd@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== des.js@^1.0.0: version "1.0.1" @@ -1010,10 +1010,10 @@ des.js@^1.0.0: inherits "^2.0.1" minimalistic-assert "^1.0.0" -destroy@~1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" - integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= +destroy@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" + integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== diffie-hellman@^5.0.0: version "5.0.3" @@ -1097,10 +1097,10 @@ eosjs@^22.0.0: hash.js "1.1.7" pako "2.0.3" -es-abstract@^1.18.5: - version "1.19.2" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.19.2.tgz#8f7b696d8f15b167ae3640b4060670f3d054143f" - integrity sha512-gfSBJoZdlL2xRiOCy0g8gLMryhoe1TlimjzU99L/31Z8QEGIhVQI+EWwt5lT+AuU9SnorVupXFqqOGqGfsyO6w== +es-abstract@^1.18.5, es-abstract@^1.19.5: + version "1.19.5" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.19.5.tgz#a2cb01eb87f724e815b278b0dd0d00f36ca9a7f1" + integrity sha512-Aa2G2+Rd3b6kxEUKTF4TaW67czBLyAv3z7VOhYRU50YBx+bbsYZ9xQP4lMNazePuFlybXI0V4MruPos7qUo5fA== dependencies: call-bind "^1.0.2" es-to-primitive "^1.2.1" @@ -1113,7 +1113,7 @@ es-abstract@^1.18.5: is-callable "^1.2.4" is-negative-zero "^2.0.2" is-regex "^1.1.4" - is-shared-array-buffer "^1.0.1" + is-shared-array-buffer "^1.0.2" is-string "^1.0.7" is-weakref "^1.0.2" object-inspect "^1.12.0" @@ -1133,9 +1133,9 @@ es-to-primitive@^1.2.1: is-symbol "^1.0.2" es5-ext@^0.10.35, es5-ext@^0.10.50: - version "0.10.59" - resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.59.tgz#71038939730eb6f4f165f1421308fb60be363bc6" - integrity sha512-cOgyhW0tIJyQY1Kfw6Kr0viu9ZlUctVchRMZ7R0HiH3dxTSp5zJDLecwxUqPUrGKMsgBI1wd1FL+d9Jxfi4cLw== + version "0.10.61" + resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.61.tgz#311de37949ef86b6b0dcea894d1ffedb909d3269" + integrity sha512-yFhIqQAzu2Ca2I4SE2Au3rxVfmohU9Y7wqGR+s7+H7krk26NXhIRAZDgqd6xqjCEFUomDEA3/Bo/7fKmIkW1kA== dependencies: es6-iterator "^2.0.3" es6-symbol "^3.1.3" @@ -1242,11 +1242,11 @@ ethereumjs-util@*, ethereumjs-util@^7.0.10, ethereumjs-util@^7.0.4, ethereumjs-u rlp "^2.2.4" ethers@^5.6.2: - version "5.6.2" - resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.6.2.tgz#e75bac7f038c5e0fdde667dba62fc223924143a2" - integrity sha512-EzGCbns24/Yluu7+ToWnMca3SXJ1Jk1BvWB7CCmVNxyOeM4LLvw2OLuIHhlkhQk1dtOcj9UMsdkxUh8RiG1dxQ== + version "5.6.5" + resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.6.5.tgz#3185ac7815dc640993408adf6f133ffabfbcbb63" + integrity sha512-9CTmplO9bv0s/aPw3HB3txGzKz3tUSI2EfO4dJo0W2WvaEq1ArgsEX6obV+bj5X3yY+Zgb1kAux8TDtJKe1FaA== dependencies: - "@ethersproject/abi" "5.6.0" + "@ethersproject/abi" "5.6.1" "@ethersproject/abstract-provider" "5.6.0" "@ethersproject/abstract-signer" "5.6.0" "@ethersproject/address" "5.6.0" @@ -1261,14 +1261,14 @@ ethers@^5.6.2: "@ethersproject/json-wallets" "5.6.0" "@ethersproject/keccak256" "5.6.0" "@ethersproject/logger" "5.6.0" - "@ethersproject/networks" "5.6.1" + "@ethersproject/networks" "5.6.2" "@ethersproject/pbkdf2" "5.6.0" "@ethersproject/properties" "5.6.0" - "@ethersproject/providers" "5.6.2" + "@ethersproject/providers" "5.6.5" "@ethersproject/random" "5.6.0" "@ethersproject/rlp" "5.6.0" "@ethersproject/sha2" "5.6.0" - "@ethersproject/signing-key" "5.6.0" + "@ethersproject/signing-key" "5.6.1" "@ethersproject/solidity" "5.6.0" "@ethersproject/strings" "5.6.0" "@ethersproject/transactions" "5.6.0" @@ -1298,43 +1298,39 @@ evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: md5.js "^1.3.4" safe-buffer "^5.1.1" -exit-on-epipe@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz#0bdd92e87d5285d267daa8171d0eb06159689692" - integrity sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw== - express@^4.14.0: - version "4.17.3" - resolved "https://registry.yarnpkg.com/express/-/express-4.17.3.tgz#f6c7302194a4fb54271b73a1fe7a06478c8f85a1" - integrity sha512-yuSQpz5I+Ch7gFrPCk4/c+dIBKlQUxtgwqzph132bsT6qhuzss6I8cLJQz7B3rFblzd6wtcI0ZbGltH/C4LjUg== + version "4.18.1" + resolved "https://registry.yarnpkg.com/express/-/express-4.18.1.tgz#7797de8b9c72c857b9cd0e14a5eea80666267caf" + integrity sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q== dependencies: accepts "~1.3.8" array-flatten "1.1.1" - body-parser "1.19.2" + body-parser "1.20.0" content-disposition "0.5.4" content-type "~1.0.4" - cookie "0.4.2" + cookie "0.5.0" cookie-signature "1.0.6" debug "2.6.9" - depd "~1.1.2" + depd "2.0.0" encodeurl "~1.0.2" escape-html "~1.0.3" etag "~1.8.1" - finalhandler "~1.1.2" + finalhandler "1.2.0" fresh "0.5.2" + http-errors "2.0.0" merge-descriptors "1.0.1" methods "~1.1.2" - on-finished "~2.3.0" + on-finished "2.4.1" parseurl "~1.3.3" path-to-regexp "0.1.7" proxy-addr "~2.0.7" - qs "6.9.7" + qs "6.10.3" range-parser "~1.2.1" safe-buffer "5.2.1" - send "0.17.2" - serve-static "1.14.2" + send "0.18.0" + serve-static "1.15.0" setprototypeof "1.2.0" - statuses "~1.5.0" + statuses "2.0.1" type-is "~1.6.18" utils-merge "1.0.1" vary "~1.1.2" @@ -1379,17 +1375,17 @@ fetch-blob@^3.1.2, fetch-blob@^3.1.4: node-domexception "^1.0.0" web-streams-polyfill "^3.0.3" -finalhandler@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" - integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== +finalhandler@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32" + integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== dependencies: debug "2.6.9" encodeurl "~1.0.2" escape-html "~1.0.3" - on-finished "~2.3.0" + on-finished "2.4.1" parseurl "~1.3.3" - statuses "~1.5.0" + statuses "2.0.1" unpipe "~1.0.0" foreach@^2.0.5: @@ -1543,9 +1539,9 @@ got@^7.1.0: url-to-options "^1.0.1" graceful-fs@^4.1.2, graceful-fs@^4.1.6: - version "4.2.9" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.9.tgz#041b05df45755e587a24942279b9d113146e1c96" - integrity sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ== + version "4.2.10" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" + integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== har-schema@^2.0.0: version "2.0.0" @@ -1560,10 +1556,17 @@ har-validator@~5.1.3: ajv "^6.12.3" har-schema "^2.0.0" -has-bigints@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113" - integrity sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA== +has-bigints@^1.0.1, has-bigints@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" + integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== + +has-property-descriptors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861" + integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== + dependencies: + get-intrinsic "^1.1.1" has-symbol-support-x@^1.4.1: version "1.4.2" @@ -1627,15 +1630,15 @@ http-cache-semantics@^4.0.0: resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390" integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ== -http-errors@1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.8.1.tgz#7c3f28577cbc8a207388455dbd62295ed07bd68c" - integrity sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g== +http-errors@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" + integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== dependencies: - depd "~1.1.2" + depd "2.0.0" inherits "2.0.4" setprototypeof "1.2.0" - statuses ">= 1.5.0 < 2" + statuses "2.0.1" toidentifier "1.0.1" http-https@^1.0.0: @@ -1753,9 +1756,9 @@ is-negative-zero@^2.0.2: integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== is-number-object@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.6.tgz#6a7aaf838c7f0686a50b4553f7e54a96494e89f0" - integrity sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g== + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" + integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== dependencies: has-tostringtag "^1.0.0" @@ -1782,10 +1785,12 @@ is-retry-allowed@^1.0.0: resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz#d778488bd0a4666a3be8a1482b9f2baafedea8b4" integrity sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg== -is-shared-array-buffer@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz#97b0c85fbdacb59c9c446fe653b82cf2b5b7cfe6" - integrity sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA== +is-shared-array-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" + integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== + dependencies: + call-bind "^1.0.2" is-stream@^1.0.0: version "1.1.0" @@ -2118,18 +2123,18 @@ node-fetch@2.6.7: whatwg-url "^5.0.0" node-fetch@^3.2.3: - version "3.2.3" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-3.2.3.tgz#a03c9cc2044d21d1a021566bd52f080f333719a6" - integrity sha512-AXP18u4pidSZ1xYXRDPY/8jdv3RAozIt/WLNR/MBGZAz+xjtlr90RvCnsvHQRiXyWliZF/CpytExp32UU67/SA== + version "3.2.4" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-3.2.4.tgz#3fbca2d8838111048232de54cb532bd3cf134947" + integrity sha512-WvYJRN7mMyOLurFR2YpysQGuwYrJN+qrrpHjJDuKMcSPdfFccRUla/kng2mz6HWSBxJcqPbvatS6Gb4RhOzCJw== dependencies: data-uri-to-buffer "^4.0.0" fetch-blob "^3.1.4" formdata-polyfill "^4.0.10" node-gyp-build@^4.2.0, node-gyp-build@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.3.0.tgz#9f256b03e5826150be39c764bf51e993946d71a3" - integrity sha512-iWjXZvmboq0ja1pUGULQBexmxq8CV4xBhX7VDOTbL7ZR4FOowwY/VOtRxBN/yKxmdGoIp4j5ysNT4u3S2pDQ3Q== + version "4.4.0" + resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.4.0.tgz#42e99687ce87ddeaf3a10b99dc06abc11021f3f4" + integrity sha512-amJnQCcgtRVw9SvoebO3BKGESClrfXGCUTX9hSn1OuGQTQBOZmVd0Z0OlecpuRksKvbsUqALE8jls/ErClAPuQ== normalize-url@^4.1.0: version "4.5.1" @@ -2159,7 +2164,7 @@ object-inspect@^1.12.0, object-inspect@^1.9.0: resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.0.tgz#6e2c120e868fd1fd18cb4f18c31741d0d6e776f0" integrity sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g== -object-keys@^1.0.12, object-keys@^1.1.1: +object-keys@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== @@ -2181,10 +2186,10 @@ oboe@2.1.5: dependencies: http-https "^1.0.0" -on-finished@~2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" - integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= +on-finished@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" + integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== dependencies: ee-first "1.1.1" @@ -2274,11 +2279,6 @@ prepend-http@^2.0.0: resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc= -printj@~1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/printj/-/printj-1.3.1.tgz#9af6b1d55647a1587ac44f4c1654a4b95b8e12cb" - integrity sha512-GA3TdL8szPK4AQ2YnOe/b+Y1jUFwmmGMMK/qbY7VcE3Z7FU8JstbKiKRzO6CIiAKPhTO8m01NoQ0V5f3jc4OGg== - process@^0.11.10: version "0.11.10" resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" @@ -2327,10 +2327,12 @@ punycode@^2.1.0, punycode@^2.1.1: resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== -qs@6.9.7: - version "6.9.7" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.7.tgz#4610846871485e1e048f44ae3b94033f0e675afe" - integrity sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw== +qs@6.10.3: + version "6.10.3" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.3.tgz#d6cde1b2ffca87b5aa57889816c5f81535e22e8e" + integrity sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ== + dependencies: + side-channel "^1.0.4" qs@~6.5.2: version "6.5.3" @@ -2366,13 +2368,13 @@ range-parser@~1.2.1: resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== -raw-body@2.4.3: - version "2.4.3" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.3.tgz#8f80305d11c2a0a545c2d9d89d7a0286fcead43c" - integrity sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g== +raw-body@2.5.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" + integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== dependencies: bytes "3.1.2" - http-errors "1.8.1" + http-errors "2.0.0" iconv-lite "0.4.24" unpipe "1.0.0" @@ -2467,34 +2469,34 @@ secp256k1@^4.0.1: node-addon-api "^2.0.0" node-gyp-build "^4.2.0" -send@0.17.2: - version "0.17.2" - resolved "https://registry.yarnpkg.com/send/-/send-0.17.2.tgz#926622f76601c41808012c8bf1688fe3906f7820" - integrity sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww== +send@0.18.0: + version "0.18.0" + resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" + integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== dependencies: debug "2.6.9" - depd "~1.1.2" - destroy "~1.0.4" + depd "2.0.0" + destroy "1.2.0" encodeurl "~1.0.2" escape-html "~1.0.3" etag "~1.8.1" fresh "0.5.2" - http-errors "1.8.1" + http-errors "2.0.0" mime "1.6.0" ms "2.1.3" - on-finished "~2.3.0" + on-finished "2.4.1" range-parser "~1.2.1" - statuses "~1.5.0" + statuses "2.0.1" -serve-static@1.14.2: - version "1.14.2" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.2.tgz#722d6294b1d62626d41b43a013ece4598d292bfa" - integrity sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ== +serve-static@1.15.0: + version "1.15.0" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" + integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== dependencies: encodeurl "~1.0.2" escape-html "~1.0.3" parseurl "~1.3.3" - send "0.17.2" + send "0.18.0" servify@^0.1.12: version "0.1.12" @@ -2563,10 +2565,10 @@ sshpk@^1.7.0: safer-buffer "^2.0.2" tweetnacl "~0.14.0" -"statuses@>= 1.5.0 < 2", statuses@~1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" - integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= +statuses@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== strict-uri-encode@^1.0.0: version "1.1.0" @@ -2583,20 +2585,22 @@ string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: strip-ansi "^6.0.1" string.prototype.trimend@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz#e75ae90c2942c63504686c18b287b4a0b1a45f80" - integrity sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A== + version "1.0.5" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz#914a65baaab25fbdd4ee291ca7dde57e869cb8d0" + integrity sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" + define-properties "^1.1.4" + es-abstract "^1.19.5" string.prototype.trimstart@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz#b36399af4ab2999b4c9c648bd7a3fb2bb26feeed" - integrity sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw== + version "1.0.5" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz#5466d93ba58cfa2134839f81d7f42437e8c01fef" + integrity sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" + define-properties "^1.1.4" + es-abstract "^1.19.5" string_decoder@^1.1.1: version "1.3.0" @@ -2720,9 +2724,9 @@ typedarray-to-buffer@^3.1.5: is-typedarray "^1.0.0" typescript@^4.6.3: - version "4.6.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.6.3.tgz#eefeafa6afdd31d725584c67a0eaba80f6fc6c6c" - integrity sha512-yNIatDa5iaofVozS/uQJEl3JRWLKKGJKh6Yaiv0GLGSuhpFJe7P3SbHZ8/yjAHRQwKRoA6YZqlfjXWmVzoVSMw== + version "4.6.4" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.6.4.tgz#caa78bbc3a59e6a5c510d35703f6a09877ce45e9" + integrity sha512-9ia/jWHIEbo49HfjrLGfKbZSuWo9iTMwXO+Ca3pRsSpbsMbc7/IU8NKdCZVRRBafVPGnoJeFL76ZOAA84I9fEg== ultron@~1.1.0: version "1.1.1" @@ -2730,13 +2734,13 @@ ultron@~1.1.0: integrity sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og== unbox-primitive@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471" - integrity sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw== + version "1.0.2" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" + integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== dependencies: - function-bind "^1.1.1" - has-bigints "^1.0.1" - has-symbols "^1.0.2" + call-bind "^1.0.2" + has-bigints "^1.0.2" + has-symbols "^1.0.3" which-boxed-primitive "^1.0.2" universalify@^0.1.0: @@ -2844,9 +2848,9 @@ verror@1.10.0: extsprintf "^1.2.0" web-streams-polyfill@^3.0.3: - version "3.2.0" - resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-3.2.0.tgz#a6b74026b38e4885869fb5c589e90b95ccfc7965" - integrity sha512-EqPmREeOzttaLRm5HS7io98goBgZ7IVz79aDvqjD0kYXLtFZTc0T/U6wHTPKyIjb+MdN7DFIIX6hgdBEpWmfPA== + version "3.2.1" + resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz#71c2718c52b45fd49dbeee88634b3a60ceab42a6" + integrity sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q== web3-bzz@1.7.3: version "1.7.3" @@ -2915,7 +2919,7 @@ web3-core@1.7.3: web3-core-requestmanager "1.7.3" web3-utils "1.7.3" -web3-eth-abi@1.7.3: +web3-eth-abi@1.7.3, web3-eth-abi@^1.2.1: version "1.7.3" resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.7.3.tgz#2a1123c7252c37100eecd0b1fb2fb2c51366071f" integrity sha512-ZlD8DrJro0ocnbZViZpAoMX44x5aYAb73u2tMq557rMmpiluZNnhcCYF/NnVMy6UIkn7SF/qEA45GXA1ne6Tnw== @@ -2923,14 +2927,6 @@ web3-eth-abi@1.7.3: "@ethersproject/abi" "5.0.7" web3-utils "1.7.3" -web3-eth-abi@^1.2.1: - version "1.7.1" - resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.7.1.tgz#6632003220a4defee4de8215dc703e43147382ea" - integrity sha512-8BVBOoFX1oheXk+t+uERBibDaVZ5dxdcefpbFTWcBs7cdm0tP8CD1ZTCLi5Xo+1bolVHNH2dMSf/nEAssq5pUA== - dependencies: - "@ethersproject/abi" "5.0.7" - web3-utils "1.7.1" - web3-eth-accounts@1.7.3: version "1.7.3" resolved "https://registry.yarnpkg.com/web3-eth-accounts/-/web3-eth-accounts-1.7.3.tgz#cd1789000f13ed3c438e96b3e80ee7be8d3f1a9b" @@ -3058,20 +3054,7 @@ web3-shh@1.7.3: web3-core-subscriptions "1.7.3" web3-net "1.7.3" -web3-utils@1.7.1, web3-utils@^1.2.1: - version "1.7.1" - resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.7.1.tgz#77d8bacaf426c66027d8aa4864d77f0ed211aacd" - integrity sha512-fef0EsqMGJUgiHPdX+KN9okVWshbIumyJPmR+btnD1HgvoXijKEkuKBv0OmUqjbeqmLKP2/N9EiXKJel5+E1Dw== - dependencies: - bn.js "^4.11.9" - ethereum-bloom-filters "^1.0.6" - ethereumjs-util "^7.1.0" - ethjs-unit "0.1.6" - number-to-bn "1.7.0" - randombytes "^2.1.0" - utf8 "3.0.0" - -web3-utils@1.7.3: +web3-utils@1.7.3, web3-utils@^1.2.1: version "1.7.3" resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.7.3.tgz#b214d05f124530d8694ad364509ac454d05f207c" integrity sha512-g6nQgvb/bUpVUIxJE+ezVN+rYwYmlFyMvMIRSuqpi1dk6ApDD00YNArrk7sPcZnjvxOJ76813Xs2vIN2rgh4lg== From ccb1e93a3b9e385325113f212360bcabc5d7c6a2 Mon Sep 17 00:00:00 2001 From: Kevin Kei Tuncer Date: Wed, 11 May 2022 21:46:14 +0200 Subject: [PATCH 15/24] - Better error messages on eth oracles - Use old amount of oracles if the contract overrides an old one --- .../contracts/teleport/teleporteos.cpp | 10 ++++- oracle/oracle-eth.js | 39 ++++++++++++------- oracle/oracle-eth.ts | 27 +++++++++---- 3 files changed, 53 insertions(+), 23 deletions(-) diff --git a/contracts/teleporteos/contracts/teleport/teleporteos.cpp b/contracts/teleporteos/contracts/teleport/teleporteos.cpp index b46144a..15c7d90 100644 --- a/contracts/teleporteos/contracts/teleport/teleporteos.cpp +++ b/contracts/teleporteos/contracts/teleport/teleporteos.cpp @@ -16,6 +16,14 @@ ACTION teleporteos::ini(const asset min, const asset fixfee, const double varfee check(_stats.find(TOKEN_SYMBOL.raw()) == _stats.end(), "Already initialized"); + // Get the amount of oracles if this contract overrides an old contract + oracles_table _oracles(get_self(), get_self().value); + auto oracle = _oracles.begin(); + int oracleCount = 0; + while (oracle != _oracles.end()) { + oracleCount++; + } + auto stat = _stats.emplace(get_self(), [&](auto &s) { s.symbol = TOKEN_SYMBOL; s.tokencontr = TOKEN_CONTRACT; @@ -27,7 +35,7 @@ ACTION teleporteos::ini(const asset min, const asset fixfee, const double varfee s.fout = freeze; s.foracles = freeze; s.fcancel = freeze; - s.oracles = 0; + s.oracles = oracleCount; s.threshold = threshold; s.version = 1; s.id = chain_id; diff --git a/oracle/oracle-eth.js b/oracle/oracle-eth.js index 7f27186..03789d3 100755 --- a/oracle/oracle-eth.js +++ b/oracle/oracle-eth.js @@ -300,17 +300,17 @@ var EthOracle = /** @class */ (function () { EthOracle.prototype.sendTransaction = function (actions, trxBroadcast) { if (trxBroadcast === void 0) { trxBroadcast = true; } return __awaiter(this, void 0, void 0, function () { - var tries, eos_res, e_3; + var tries, eos_res, e_3, error, s; return __generator(this, function (_a) { switch (_a.label) { case 0: tries = 0; _a.label = 1; case 1: - if (!(tries < this.minTrySend)) return [3 /*break*/, 10]; + if (!(tries < this.minTrySend)) return [3 /*break*/, 8]; _a.label = 2; case 2: - _a.trys.push([2, 4, , 9]); + _a.trys.push([2, 4, , 7]); return [4 /*yield*/, this.eos_api.getAPI().transact({ actions: actions }, { blocksBehind: 3, expireSeconds: 30, @@ -321,22 +321,33 @@ var EthOracle = /** @class */ (function () { return [2 /*return*/, eos_res]; case 4: e_3 = _a.sent(); - if (!(e_3.message.indexOf('Already marked as claimed') > -1 || e_3.message.indexOf('Oracle has already approved') > -1 || e_3.message.indexOf('This teleport has already completed'))) return [3 /*break*/, 5]; - return [2 /*return*/, true]; - case 5: - console.error("Error while sending to eosio chain with ".concat(this.eos_api.getEndpoint(), ": ").concat(e_3.message, " \u274C")); + error = 'Unkwon error'; + if (e_3.message) { + s = e_3.message.indexOf(':') + 1; + if (s > 0 && s < e_3.message.length) { + error = e_3.message.substring(s); + console.log(); + } + else { + error = e_3.message; + } + // Check if the error appears because the transaction is already claimed or approved + if (error.indexOf('Already marked as claimed') > -1 || error.indexOf('Oracle has already approved') > -1 || error.indexOf('This teleport has already completed') > -1) { + return [2 /*return*/, true]; + } + } + console.error("Error while sending to eosio chain with ".concat(this.eos_api.getEndpoint(), ": ").concat(error, " \u274C")); return [4 /*yield*/, this.eos_api.nextEndpoint()]; - case 6: + case 5: _a.sent(); return [4 /*yield*/, sleep(1000)]; - case 7: + case 6: _a.sent(); - _a.label = 8; - case 8: return [3 /*break*/, 9]; - case 9: + return [3 /*break*/, 7]; + case 7: tries++; return [3 /*break*/, 1]; - case 10: return [2 /*return*/, false]; + case 8: return [2 /*return*/, false]; } }); }); @@ -609,7 +620,7 @@ var EthOracle = /** @class */ (function () { _a.sent(); return [3 /*break*/, 19]; case 18: - console.log("Current block ".concat(from_block, " latest block ").concat(latest_block, ". Not waiting...")); + console.log("Latest block is ".concat(latest_block, ". Not waiting...")); _a.label = 19; case 19: return [3 /*break*/, 22]; case 20: diff --git a/oracle/oracle-eth.ts b/oracle/oracle-eth.ts index edb1193..83f7b32 100755 --- a/oracle/oracle-eth.ts +++ b/oracle/oracle-eth.ts @@ -216,14 +216,25 @@ class EthOracle { }) as TransactResult return eos_res } catch (e: any) { - // Check if the error appears because the transaction is already claimed or approved - if (e.message.indexOf('Already marked as claimed') > -1 || e.message.indexOf('Oracle has already approved') > -1 || e.message.indexOf('This teleport has already completed')) { - return true - } else { - console.error(`Error while sending to eosio chain with ${this.eos_api.getEndpoint()}: ${e.message} ❌`) - await this.eos_api.nextEndpoint() - await sleep(1000) + let error : string = 'Unkwon error' + if(e.message){ + // Get error message + const s = e.message.indexOf(':') + 1 + if(s > 0 && s < e.message.length){ + error = e.message.substring(s) + console.log(); + } else { + error = e.message + } + // Check if the error appears because the transaction is already claimed or approved + if (error.indexOf('Already marked as claimed') > -1 || error.indexOf('Oracle has already approved') > -1 || error.indexOf('This teleport has already completed') > -1) { + return true + } } + + console.error(`Error while sending to eosio chain with ${this.eos_api.getEndpoint()}: ${error} ❌`) + await this.eos_api.nextEndpoint() + await sleep(1000) } } return false @@ -412,7 +423,7 @@ class EthOracle { if (latest_block - from_block <= 1000) { await EthOracle.WaitWithAnimation(30, 'Wait for new blocks...') } else { - console.log(`Current block ${from_block} latest block ${latest_block}. Not waiting...`) + console.log(`Latest block is ${latest_block}. Not waiting...`) } } catch (e: any) { console.error('⚡️ ' + e.message) From fdbef57d6776671b50989db224cf35f350e7af41 Mon Sep 17 00:00:00 2001 From: Kevin Kei Tuncer Date: Sat, 14 May 2022 02:26:40 +0200 Subject: [PATCH 16/24] - Improvement of some spelling mistakes - Calc previous oracle number with a for loop --- LICENSE.md | 2 +- contracts/teleporteos/README.md | 12 ++-- .../contracts/teleport/teleporteos.cpp | 9 ++- .../contracts/teleport/teleporteos.test.ts | 2 +- oracle/README.md | 20 +++++- oracle/yarn.lock | 71 +++++++++++++------ 6 files changed, 78 insertions(+), 38 deletions(-) diff --git a/LICENSE.md b/LICENSE.md index 33ac9a4..74e28f8 100644 --- a/LICENSE.md +++ b/LICENSE.md @@ -1,7 +1,7 @@ The MIT License (MIT) ===================== -Copyright © `2020` `Dacoco GmbH` +Copyright © `2022` `Kevin Kei Tuncer` Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation diff --git a/contracts/teleporteos/README.md b/contracts/teleporteos/README.md index 8d35342..ac9b332 100644 --- a/contracts/teleporteos/README.md +++ b/contracts/teleporteos/README.md @@ -1,7 +1,7 @@ # New features - Optional fix and variable fees which fund the oracles - Freeze options for specific parts of the contract -- Adjustable amount of needed oracle confirmations for a receiving teleport +- Adjustable number of needed oracle confirmations for a receiving teleport - Adjustable minimum amount for deposits and teleports - Option to delete old teleport and cancel entries without losing consensus - Store all needed bridge data in stats table for interoperability with custom front end apps @@ -14,12 +14,12 @@ ACTION ini(asset min, uint64_t fixfee, double varfee, bool freeze, uint32_t threshold); ``` - ***min*** Minimum amount for a deposit and teleport -- ***fixfee*** Fix fee for teleports and receipts. Together with the variable fee (varfee) the resulting fee has to be less than minimum transfer amount (min). +- ***fixfee*** Fix fee for teleports and receipts. Together with the variable fee (varfee) the resulting fee has to be less than the minimum transfer amount (min). - ***varfee*** Variable fee for teleports and receipts. This has to be between 0 and 0.20 which equals to 0% and 20%. - ***freeze*** True to freeze the contract until you unfreeze it with the freeze action. - ***threshold*** Amount of needed oracle confirmations for a receiving teleport -3. Add the ethereum chains which are allowed +3. Add the allowed ethereum chains ``` ACTION addchain(string name, uint8_t chain_id, string teleaddr, string tokenaddr); ``` @@ -43,11 +43,11 @@ ACTION freeze(const bool in, const bool out, const bool oracles, const bool canc Just deploy the contract over the old teleport contract account, run the ini action and add all connected chains by executing the addchain action. -**Note:** In this upgrade are additional tables, the structure of the old tables is not changed. +**Note:** Additional tables are included in this upgrade, the structure of the old tables is not changed. # Install test suite on windows -You need to activate the windows feature Hyper-V, but it is not available on Windows 10 Home. So you might need to upgrade your Windows to Windows Pro. +You need to activate the windows feature Hyper-V, but it is not available on Windows 10 Home. You might need to upgrade your Windows to Windows Pro. ## Activate WSL 2 Start windows PowerShell as administrator and run the following commands @@ -85,7 +85,7 @@ sudo yarn install ``` ## Set up docker -Install and start Docker, check for updates and install them. Open Dockers menu by double clicking the icon in the task bar and go to settings ⚙️. +Install and start Docker, check for updates and install them. Open the Dockers menu by double clicking the icon in the task bar and go to settings ⚙️. Check "Use the WSL 2 based engine" diff --git a/contracts/teleporteos/contracts/teleport/teleporteos.cpp b/contracts/teleporteos/contracts/teleport/teleporteos.cpp index 15c7d90..2588e7e 100644 --- a/contracts/teleporteos/contracts/teleport/teleporteos.cpp +++ b/contracts/teleporteos/contracts/teleport/teleporteos.cpp @@ -18,17 +18,16 @@ ACTION teleporteos::ini(const asset min, const asset fixfee, const double varfee // Get the amount of oracles if this contract overrides an old contract oracles_table _oracles(get_self(), get_self().value); - auto oracle = _oracles.begin(); - int oracleCount = 0; - while (oracle != _oracles.end()) { - oracleCount++; + uint64_t oracleCount; + for (auto itr = _oracles.begin(); itr != _oracles.end(); ++itr) { + ++oracleCount; } auto stat = _stats.emplace(get_self(), [&](auto &s) { s.symbol = TOKEN_SYMBOL; s.tokencontr = TOKEN_CONTRACT; s.min = min.amount; - s.fixfee = 0; + s.fixfee = fixfee.amount; s.varfee = varfee; s.collected = 0; s.fin = freeze; diff --git a/contracts/teleporteos/contracts/teleport/teleporteos.test.ts b/contracts/teleporteos/contracts/teleport/teleporteos.test.ts index 38f5fe1..43bb4cc 100644 --- a/contracts/teleporteos/contracts/teleport/teleporteos.test.ts +++ b/contracts/teleporteos/contracts/teleport/teleporteos.test.ts @@ -396,7 +396,7 @@ describe('teleporteos', async () => { ) }) }) - context('wirth correct auth', async () => { + context('with correct auth', async () => { context('with non-existing receipt', async () => { it('should fail', async () => { await assertEOSErrorIncludesMessage( diff --git a/oracle/README.md b/oracle/README.md index cf71751..8edc6d5 100644 --- a/oracle/README.md +++ b/oracle/README.md @@ -13,13 +13,27 @@ Edit config.js file ``` yarn eos ``` -Start by a spezific teleport id +Start by a spezific teleport id with --id or -n ``` -yarn eos id {number} +yarn eos -n {number} ``` ## Compile and start eth oracle ``` yarn eth -``` \ No newline at end of file +``` +Start by a spezific block number --block or -b + +``` +yarn eth -b {number} +``` +## Config file +See the ***config-example.js*** for the structure of the config file. + +***endpoints*** is an array of different endpoints which are evenly used. For a higher reliability the oracle switches automatically to another endpoint if one fails. ***epVerifications*** defines the number of different endpoints which has to verify the same request. This protects the Oracle from manipulated data of hijacked endpoints in the ***endpoints*** array as long as there are less hijacked endpoints than ***epVerifications***. Set it to 1 to disable multiple verification. + +On default ***config.js*** will be used. To specify another config file use the command --config or -c +``` +yarn eos -c {path} +``` diff --git a/oracle/yarn.lock b/oracle/yarn.lock index ab02884..ea3f962 100644 --- a/oracle/yarn.lock +++ b/oracle/yarn.lock @@ -424,14 +424,14 @@ ethereumjs-util "*" "@types/node@*": - version "17.0.31" - resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.31.tgz#a5bb84ecfa27eec5e1c802c6bbf8139bdb163a5d" - integrity sha512-AR0x5HbXGqkEx9CadRH3EBYx/VkiUgZIhP4wvPn/+5KIsgpNoyFaRlVe0Zlx9gRtg8fA06a9tskE2MSN7TcG4Q== + version "17.0.33" + resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.33.tgz#3c1879b276dc63e73030bb91165e62a4509cd506" + integrity sha512-miWq2m2FiQZmaHfdZNcbpp9PuXg34W5JZ5CrJ/BaS70VuhoJENBEQybeiYSaPBRNq6KQGnjfEnc/F3PN++D+XQ== "@types/node@^12.12.6": - version "12.20.50" - resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.50.tgz#14ba5198f1754ffd0472a2f84ab433b45ee0b65e" - integrity sha512-+9axpWx2b2JCVovr7Ilgt96uc6C1zBKOQMpGtRbWT9IoR/8ue32GGMfGA4woP8QyP2gBs6GQWEVM3tCybGCxDA== + version "12.20.52" + resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.52.tgz#2fd2dc6bfa185601b15457398d4ba1ef27f81251" + integrity sha512-cfkwWw72849SNYp3Zx0IcIs25vABmFh73xicxhCkTcvtZQeIez15PpwQN8fY3RD7gv1Wrxlc9MEtfMORZDEsGw== "@types/pbkdf2@^3.0.0": version "3.1.0" @@ -1097,17 +1097,19 @@ eosjs@^22.0.0: hash.js "1.1.7" pako "2.0.3" -es-abstract@^1.18.5, es-abstract@^1.19.5: - version "1.19.5" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.19.5.tgz#a2cb01eb87f724e815b278b0dd0d00f36ca9a7f1" - integrity sha512-Aa2G2+Rd3b6kxEUKTF4TaW67czBLyAv3z7VOhYRU50YBx+bbsYZ9xQP4lMNazePuFlybXI0V4MruPos7qUo5fA== +es-abstract@^1.18.5, es-abstract@^1.19.0, es-abstract@^1.19.5: + version "1.20.0" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.20.0.tgz#b2d526489cceca004588296334726329e0a6bfb6" + integrity sha512-URbD8tgRthKD3YcC39vbvSDrX23upXnPcnGAjQfgxXF5ID75YcENawc9ZX/9iTP9ptUyfCLIxTTuMYoRfiOVKA== dependencies: call-bind "^1.0.2" es-to-primitive "^1.2.1" function-bind "^1.1.1" + function.prototype.name "^1.1.5" get-intrinsic "^1.1.1" get-symbol-description "^1.0.0" has "^1.0.3" + has-property-descriptors "^1.0.0" has-symbols "^1.0.3" internal-slot "^1.0.3" is-callable "^1.2.4" @@ -1119,9 +1121,10 @@ es-abstract@^1.18.5, es-abstract@^1.19.5: object-inspect "^1.12.0" object-keys "^1.1.1" object.assign "^4.1.2" - string.prototype.trimend "^1.0.4" - string.prototype.trimstart "^1.0.4" - unbox-primitive "^1.0.1" + regexp.prototype.flags "^1.4.1" + string.prototype.trimend "^1.0.5" + string.prototype.trimstart "^1.0.5" + unbox-primitive "^1.0.2" es-to-primitive@^1.2.1: version "1.2.1" @@ -1389,9 +1392,9 @@ finalhandler@1.2.0: unpipe "~1.0.0" foreach@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" - integrity sha1-C+4AUBiusmDQo6865ljdATbsG5k= + version "2.0.6" + resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.6.tgz#87bcc8a1a0e74000ff2bf9802110708cfb02eb6e" + integrity sha512-k6GAGDyqLe9JaebCsFCoudPPWfihKu8pylYXRlqP1J7ms39iPoTtk2fviNglIeQEwdh0bQeKJ01ZPyuyQvKzwg== forever-agent@~0.6.1: version "0.6.1" @@ -1445,6 +1448,21 @@ function-bind@^1.1.1: resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== +function.prototype.name@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.5.tgz#cce0505fe1ffb80503e6f9e46cc64e46a12a9621" + integrity sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.0" + functions-have-names "^1.2.2" + +functions-have-names@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" + integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== + get-caller-file@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" @@ -2387,6 +2405,15 @@ readable-stream@^3.6.0: string_decoder "^1.1.1" util-deprecate "^1.0.1" +regexp.prototype.flags@^1.4.1: + version "1.4.3" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz#87cab30f80f66660181a3bb7bf5981a872b367ac" + integrity sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + functions-have-names "^1.2.2" + request@^2.79.0: version "2.88.2" resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" @@ -2584,7 +2611,7 @@ string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" -string.prototype.trimend@^1.0.4: +string.prototype.trimend@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz#914a65baaab25fbdd4ee291ca7dde57e869cb8d0" integrity sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog== @@ -2593,7 +2620,7 @@ string.prototype.trimend@^1.0.4: define-properties "^1.1.4" es-abstract "^1.19.5" -string.prototype.trimstart@^1.0.4: +string.prototype.trimstart@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz#5466d93ba58cfa2134839f81d7f42437e8c01fef" integrity sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg== @@ -2733,7 +2760,7 @@ ultron@~1.1.0: resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.1.1.tgz#9fe1536a10a664a65266a1e3ccf85fd36302bc9c" integrity sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og== -unbox-primitive@^1.0.1: +unbox-primitive@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== @@ -3226,9 +3253,9 @@ yargs-parser@^21.0.0: integrity sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg== yargs@^17.4.1: - version "17.4.1" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.4.1.tgz#ebe23284207bb75cee7c408c33e722bfb27b5284" - integrity sha512-WSZD9jgobAg3ZKuCQZSa3g9QOJeCCqLoLAykiWgmXnDo9EPnn4RPf5qVTtzgOx66o6/oqhcA5tHtJXpG8pMt3g== + version "17.5.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.5.0.tgz#2706c5431f8c119002a2b106fc9f58b9bb9097a3" + integrity sha512-3sLxVhbAB5OC8qvVRebCLWuouhwh/rswsiDYx3WGxajUk/l4G20SKfrKKFeNIHboUFt2JFgv2yfn+5cgOr/t5A== dependencies: cliui "^7.0.2" escalade "^3.1.1" From cfad46448acf309ee4471c01b0206696464c4bdf Mon Sep 17 00:00:00 2001 From: Kevin Kei Tuncer Date: Sun, 15 May 2022 21:56:33 +0200 Subject: [PATCH 17/24] - Set and comment the example config file for the oracles - Edit readmes --- README.md | 10 ++++++-- contracts/teleporteos/README.md | 25 ++++++++++++++++++++ oracle/config-example.js | 42 ++++++++++++++++++++------------- 3 files changed, 59 insertions(+), 18 deletions(-) diff --git a/README.md b/README.md index d4799ea..51081ba 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,13 @@ then teleporting the tokens using the `teleport` action. Transferring from ETH -> EOSIO simply requires callint the `teleport` function on the Ethereum contract. +You can use the SavAct WebApp as frontend by entering your EOSIO contract and network. For direct selection add your settings to the URL +[https://savact.app/#/_trx_/teleport?bridge=**other.worlds**&eosio=**WAX**ð=**BSC**](https://savact.app/#/_trx_/teleport?bridge=other.worlds&eosio=WAXð=BSC) + +The App is only compatible with the EOSIO teleport contract of version 1 and higher. For more information see its [README.md](./contract/README.md) + +To add your teleport in a select box of the SavAct WebApp, feel free to request the admins of https://t.me/SavActGroup + ## Oracles Oracle accounts must be registered using the `regoracle` (EOSIO) or `regOracle` (Ethereum) functions. @@ -24,5 +31,4 @@ Oracles can then call the received function on each contract when they see a tra 1. Copy config-example.js to config.js 2. Change the configuration settings to match your tokens -3. Start the oracle using the following command `CONFIG=./[path/to/config] oracle-eos|eth.js` - +3. Start the oracle using the following command `CONFIG=./[path/to/config] oracle-eos|eth.js` \ No newline at end of file diff --git a/contracts/teleporteos/README.md b/contracts/teleporteos/README.md index ac9b332..7326843 100644 --- a/contracts/teleporteos/README.md +++ b/contracts/teleporteos/README.md @@ -6,6 +6,9 @@ - Option to delete old teleport and cancel entries without losing consensus - Store all needed bridge data in stats table for interoperability with custom front end apps +# Note +This version reduces the EOSIO RAM by half and therefore its running costs. Further reductions need breaking changes, therefore a second version will be provided by [SavAct](https://github.com/SavAct). + # Deployment and initialization 1. Deploy the contract @@ -39,12 +42,34 @@ ACTION freeze(const bool in, const bool out, const bool oracles, const bool canc - ***oracles*** True to freeze oracles, false to unfreeze - ***cancel*** True to freeze cancel action, false to unfreeze +Register oracles with regoracle +- ***oracle_name*** EOSIO account name of the oracle +``` +ACTION regoracle(name oracle_name); +``` + ## Upgrade from running teleport contract of alien world Just deploy the contract over the old teleport contract account, run the ini action and add all connected chains by executing the addchain action. **Note:** Additional tables are included in this upgrade, the structure of the old tables is not changed. +## Maintenance + +To pay off collected fees to the oracles run payoracles +``` +ACTION payoracles(); +``` + +Use delteles to free the EOSIO RAM of completed and canceled teleports +***to_id*** Delete all entries until this id +``` +ACTION delteles(uint64_t to_id); +``` + +**Note:** You can use the [SavAct WebApp](https://savact.app/#/_trx_/teleport/setup) in combination with the [Anchor Wallet by Greymass](https://greymass.com/en/anchor/) to execute these actions. + + # Install test suite on windows You need to activate the windows feature Hyper-V, but it is not available on Windows 10 Home. You might need to upgrade your Windows to Windows Pro. diff --git a/oracle/config-example.js b/oracle/config-example.js index fe66c96..6828457 100644 --- a/oracle/config-example.js +++ b/oracle/config-example.js @@ -1,24 +1,34 @@ module.exports = { - precision: 4, - symbol: 'TLM', - confirmations: 2, + precision: 4, // Token precision + symbol: 'TLM', // Token symbol + confirmations: 3, // Number of needed oracle confirmations per teleport eos: { - network: 'EOS', - chainId: "cf057bbfb72640471fd910bcb67639c22df9f92470936cddc1ade0e2f2e7dc4f", + network: 'EOS', // Abbreviation of the chain + id: 0, // Id of this chain for this bridge + netId: "e70aaab8997e1dfce58fbfac80cbbb8fecec7b99cf982a9444273cbc64c41473", // EOSIO identification for different chains endpoints: [ - 'https://jungle.eosphere.io:443', 'http://jungle2.cryptolions.io:80', 'http://jungle2.cryptolions.io:8888', + 'https://jungle.eosphere.io:443', + 'http://jungle2.cryptolions.io:80', + 'http://jungle2.cryptolions.io:8888', ], - epVerifications: 2, - teleportContract: 'eosiotestacc', - oracleAccount: 'anneliese', - privateKey: '5K29JmEvWEnfdD5DV1bm9Ro4qMrTKhBGmTXuaaqmrZSMEntqqZQ' - + epVerifications: 2, // Verify data by this number of endpoints + teleportContract: 'alein.worlds', // EOSIO token contract account + oracleAccount: 'oracle1', // EOSIO oracle account + privateKey: '5K29JmEvWEnfdD5DV1bm9Ro4qMrTKhBGmTXuaaqmrZSMEntqqZQ', // Example private EOSIO key. Do not use it. It is public! }, eth: { - network: 'BSC', - endpoint: 'http://localhost:8545/', - teleportContract: '0x0789a30aa30d6a7a7536a7ed26956bbdb0fc80bd', - oracleAccount: '0x111111111111111111111111111111111111111', - privateKey: '2a6bdd74caefd68f16f7ee06ad37c922502c9b081f2fa26a69a1c57cd0c118a2' + network: 'BSC', // Abbreviation of the chain + id: 2, // Id of this chain for this bridge + netId: '97', // Id of this chain defined on chailist.org + endpoints: [ + 'https://data-seed-prebsc-1-s1.binance.org:8545', + 'https://data-seed-prebsc-2-s2.binance.org:8545', + 'https://data-seed-prebsc-1-s2.binance.org:8545', + ], + genesisBlock: 19024616, // Initial block to start from + epVerifications: 2, // Verify data by this number of endpoints + teleportContract: '0x281D131268f5D257297DDDe4B4047EeF881db79d', // ETH teleport contract address + oracleAccount: '0x8353C7d4758D113Dd4407AC4b1115fF2E54D9eA0', + privateKey: '8940fbd7806ec09af7e1ceaf7ccac80e89eeeb1e85cee42f84c07b1d5a378100', // Example private ETH key. Do not use it. It is public! } } From 9aa1f355e19c424fc01bca390860fe5d3f80fbd3 Mon Sep 17 00:00:00 2001 From: Kevin Kei Tuncer Date: Mon, 16 May 2022 18:58:42 +0200 Subject: [PATCH 18/24] Add comment in example config and edit the main md file --- README.md | 6 +++--- oracle/README.md | 2 +- oracle/config-example.js | 8 ++++---- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 51081ba..3ace719 100644 --- a/README.md +++ b/README.md @@ -4,8 +4,8 @@ Contracts and tools to create a bridge between WAX tokens and an ERC-20 counterp ## Contracts -There are contracts available for both EOSIO chains and Ethereum, both should be deployed -on their respective chains. +There are contracts available for both EOSIO chains and Ethereum, both should be deployed on their respective chains. +After deploying the EOSIO contract call the `ini` function to initialize it. Each ETH chain must be registered on the EOSIO contract with the `addchain` function. ## Process @@ -17,7 +17,7 @@ Transferring from ETH -> EOSIO simply requires callint the `teleport` function o You can use the SavAct WebApp as frontend by entering your EOSIO contract and network. For direct selection add your settings to the URL [https://savact.app/#/_trx_/teleport?bridge=**other.worlds**&eosio=**WAX**ð=**BSC**](https://savact.app/#/_trx_/teleport?bridge=other.worlds&eosio=WAXð=BSC) -The App is only compatible with the EOSIO teleport contract of version 1 and higher. For more information see its [README.md](./contract/README.md) +The app is only compatible with the EOSIO teleport contract of version 1 and higher. For more information see its [README.md](./contracts/teleporteos/README.md) To add your teleport in a select box of the SavAct WebApp, feel free to request the admins of https://t.me/SavActGroup diff --git a/oracle/README.md b/oracle/README.md index 8edc6d5..72cb9c4 100644 --- a/oracle/README.md +++ b/oracle/README.md @@ -33,7 +33,7 @@ See the ***config-example.js*** for the structure of the config file. ***endpoints*** is an array of different endpoints which are evenly used. For a higher reliability the oracle switches automatically to another endpoint if one fails. ***epVerifications*** defines the number of different endpoints which has to verify the same request. This protects the Oracle from manipulated data of hijacked endpoints in the ***endpoints*** array as long as there are less hijacked endpoints than ***epVerifications***. Set it to 1 to disable multiple verification. -On default ***config.js*** will be used. To specify another config file use the command --config or -c +On default ***config.js*** will be used. To specify another config file, use the command --config or -c ``` yarn eos -c {path} ``` diff --git a/oracle/config-example.js b/oracle/config-example.js index 6828457..40f85a8 100644 --- a/oracle/config-example.js +++ b/oracle/config-example.js @@ -11,9 +11,9 @@ module.exports = { 'http://jungle2.cryptolions.io:80', 'http://jungle2.cryptolions.io:8888', ], - epVerifications: 2, // Verify data by this number of endpoints + epVerifications: 2, // Verify data by this number of endpoints teleportContract: 'alein.worlds', // EOSIO token contract account - oracleAccount: 'oracle1', // EOSIO oracle account + oracleAccount: 'oracle1', // EOSIO oracle account privateKey: '5K29JmEvWEnfdD5DV1bm9Ro4qMrTKhBGmTXuaaqmrZSMEntqqZQ', // Example private EOSIO key. Do not use it. It is public! }, eth: { @@ -26,9 +26,9 @@ module.exports = { 'https://data-seed-prebsc-1-s2.binance.org:8545', ], genesisBlock: 19024616, // Initial block to start from - epVerifications: 2, // Verify data by this number of endpoints + epVerifications: 2, // Verify data by this number of endpoints teleportContract: '0x281D131268f5D257297DDDe4B4047EeF881db79d', // ETH teleport contract address - oracleAccount: '0x8353C7d4758D113Dd4407AC4b1115fF2E54D9eA0', + oracleAccount: '0x8353C7d4758D113Dd4407AC4b1115fF2E54D9eA0', // ETH oracle address privateKey: '8940fbd7806ec09af7e1ceaf7ccac80e89eeeb1e85cee42f84c07b1d5a378100', // Example private ETH key. Do not use it. It is public! } } From db4406cfb92defd98de48cce6b2c7680bcc690e4 Mon Sep 17 00:00:00 2001 From: Kevin Kei Tuncer Date: Tue, 17 May 2022 13:28:45 +0200 Subject: [PATCH 19/24] Add comment on config-example.js and make transfer function on EOSIO contract invisible --- contracts/teleporteos/contracts/teleport/teleporteos.cpp | 2 +- oracle/config-example.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/contracts/teleporteos/contracts/teleport/teleporteos.cpp b/contracts/teleporteos/contracts/teleport/teleporteos.cpp index 2588e7e..71c4ccf 100644 --- a/contracts/teleporteos/contracts/teleport/teleporteos.cpp +++ b/contracts/teleporteos/contracts/teleport/teleporteos.cpp @@ -45,7 +45,7 @@ ACTION teleporteos::ini(const asset min, const asset fixfee, const double varfee } /* Notifications for token transfer */ -ACTION teleporteos::transfer(name from, name to, asset quantity, string memo) { +void teleporteos::transfer(name from, name to, asset quantity, string memo) { if (to == get_self() && TOKEN_SYMBOL == quantity.symbol) { auto stat = _stats.find(TOKEN_SYMBOL.raw()); check(quantity.amount >= stat->min, "Transfer is below minimum token amount"); diff --git a/oracle/config-example.js b/oracle/config-example.js index 40f85a8..3320808 100644 --- a/oracle/config-example.js +++ b/oracle/config-example.js @@ -18,7 +18,7 @@ module.exports = { }, eth: { network: 'BSC', // Abbreviation of the chain - id: 2, // Id of this chain for this bridge + id: 2, // Id of this chain for this bridge. Let it undefined to store the EOSIO recipient chain id on the recipient chain like the old way netId: '97', // Id of this chain defined on chailist.org endpoints: [ 'https://data-seed-prebsc-1-s1.binance.org:8545', From 13e87efb1deb3b47a797a95e03a160e8b3e9cdb4 Mon Sep 17 00:00:00 2001 From: Kevin Kei Tuncer Date: Tue, 17 May 2022 21:25:21 +0200 Subject: [PATCH 20/24] Use key value object to store chain information on EOSIO table --- contracts/teleporteos/README.md | 1 + .../contracts/teleport/teleporteos.cpp | 25 ++++++------------- .../contracts/teleport/teleporteos.hpp | 17 ++++++++++--- .../contracts/teleport/teleporteos.test.ts | 13 ++++++---- 4 files changed, 30 insertions(+), 26 deletions(-) diff --git a/contracts/teleporteos/README.md b/contracts/teleporteos/README.md index 7326843..f37f7c5 100644 --- a/contracts/teleporteos/README.md +++ b/contracts/teleporteos/README.md @@ -11,6 +11,7 @@ This version reduces the EOSIO RAM by half and therefore its running costs. Furt # Deployment and initialization +0. The EOSIO account of the contract needs the `eosio.code` permission activated. 1. Deploy the contract 2. Run the ini action of the contract with the following parameters ``` diff --git a/contracts/teleporteos/contracts/teleport/teleporteos.cpp b/contracts/teleporteos/contracts/teleport/teleporteos.cpp index 71c4ccf..391eaad 100644 --- a/contracts/teleporteos/contracts/teleport/teleporteos.cpp +++ b/contracts/teleporteos/contracts/teleport/teleporteos.cpp @@ -128,13 +128,9 @@ ACTION teleporteos::teleport(name from, asset quantity, uint8_t chain_id, checks .send(); } -bool teleporteos::hasId(uint8_t chain_id, stats_table::const_iterator stat){ - for(auto itr = stat->chains.begin(); itr != stat->chains.end(); itr++){ - if(itr->id == chain_id){ - return true; - } - } - return false; +inline bool teleporteos::hasId(uint8_t chain_id, stats_table::const_iterator stat){ + auto itr = stat->chains.find(chain_id); + return itr != stat->chains.end(); } ACTION teleporteos::addchain(string name, string abbreviation, uint8_t chain_id, string net_id, string teleaddr, string tokenaddr){ @@ -143,16 +139,17 @@ ACTION teleporteos::addchain(string name, string abbreviation, uint8_t chain_id, check(!hasId(chain_id, stat), "This chain is already listed"); chainData chain; - chain.id = chain_id; chain.name = name; chain.abbreviation = abbreviation; chain.net_id = net_id; chain.teleaddr = teleaddr; chain.tokenaddr = tokenaddr; + std::pair::iterator,bool> ret; _stats.modify(*stat, get_self(), [&](auto &s) { - s.chains.push_back(chain); + ret = s.chains.insert(std::pair(chain_id, chain)); }); + check(ret.second != false, "Chain was already added"); } ACTION teleporteos::rmchain(uint8_t chain_id){ @@ -160,12 +157,7 @@ ACTION teleporteos::rmchain(uint8_t chain_id){ auto stat = _stats.find(TOKEN_SYMBOL.raw()); _stats.modify(*stat, get_self(), [&](auto &s) { - for(auto itr = stat->chains.begin(); itr != stat->chains.end(); itr++){ - if(itr->id == chain_id){ - s.chains.erase(itr); - break; - } - } + s.chains.erase(chain_id); }); } @@ -215,8 +207,7 @@ ACTION teleporteos::sign(name oracle_name, uint64_t id, string signature) { auto teleport = _teleports.find(id); check(teleport != _teleports.end(), "Teleport not found"); - auto find_res = std::find(teleport->oracles.begin(), teleport->oracles.end(), - oracle_name); + auto find_res = std::find(teleport->oracles.begin(), teleport->oracles.end(), oracle_name); check(find_res == teleport->oracles.end(), "Oracle has already signed"); for(auto &sig : teleport->signatures){ diff --git a/contracts/teleporteos/contracts/teleport/teleporteos.hpp b/contracts/teleporteos/contracts/teleport/teleporteos.hpp index 5cc1747..0cca98f 100644 --- a/contracts/teleporteos/contracts/teleport/teleporteos.hpp +++ b/contracts/teleporteos/contracts/teleport/teleporteos.hpp @@ -2,6 +2,7 @@ #include #include #include +#include using namespace eosio; using namespace std; @@ -15,7 +16,6 @@ class [[eosio::contract("teleporteos")]] teleporteos : public contract { private: struct chainData{ - uint8_t id; // Id to specify the chain string name; // Chain name string abbreviation; // Abbreviation of the chain name string net_id; // Id used in metamask @@ -25,7 +25,7 @@ class [[eosio::contract("teleporteos")]] teleporteos : public contract { struct [[eosio::table("stats")]] stats_item { symbol symbol; // Symbol for the token - name tokencontr; // Contract of the token + name tokencontr; // Contract of the token uint64_t min; // Minimum amount for token teleport uint64_t fixfee; // Fix fee for teleports and receipts double varfee; // Variable fee for teleports and receipts @@ -38,7 +38,7 @@ class [[eosio::contract("teleporteos")]] teleporteos : public contract { bool fcancel; // Freeze cancel action uint8_t id; // Id number of this chain uint32_t version; // Version of this teleport contract - vector chains; // Connected chains + map chains; // Connected chains. The key is the self defined chain specific chain id uint64_t primary_key() const { return symbol.raw(); } }; @@ -147,7 +147,7 @@ class [[eosio::contract("teleporteos")]] teleporteos : public contract { * @param stat Iterator to the stats table entry * @return true if it exists otherwise false */ - static bool hasId(uint8_t chain_id, stats_table::const_iterator stat); + inline static bool hasId(uint8_t chain_id, stats_table::const_iterator stat); public: using contract::contract; @@ -256,5 +256,14 @@ class [[eosio::contract("teleporteos")]] teleporteos : public contract { * @brief Pay out the collected fees to the oracles. Everyone can run this action */ ACTION payoracles(); + + // // Should never execute + // ACTION delstats(){ + // require_auth(get_self()); + // auto stat = _stats.begin(); + // while (stat != _stats.end()) { + // stat = _stats.erase(stat); + // } + // } }; } // namespace alienworlds diff --git a/contracts/teleporteos/contracts/teleport/teleporteos.test.ts b/contracts/teleporteos/contracts/teleport/teleporteos.test.ts index 43bb4cc..97e4ae6 100644 --- a/contracts/teleporteos/contracts/teleport/teleporteos.test.ts +++ b/contracts/teleporteos/contracts/teleport/teleporteos.test.ts @@ -97,12 +97,15 @@ describe('teleporteos', async () => { }) it('should update stats table', async () => { const { rows: [item] } = await teleporteos.statsTable() + console.log(item.chains); + chai.expect(item.chains.length).equal(1, 'Wrong amount of added chains') - chai.expect(item.chains[0].name).equal(ethName, 'Wrong chain name') - chai.expect(item.chains[0].id).equal(ethId, 'Wrong chain id') - chai.expect(item.chains[0].net_id).equal(ethNetId, 'Wrong chain name') - chai.expect(item.chains[0].teleaddr).equal(ethContract, 'Wrong chain id') - chai.expect(item.chains[0].tokenaddr).equal(ethTokenContract, 'Wrong chain id') + const chain = item.chains[0] as unknown as {key: number, value: {name: string, net_id: string, teleaddr: string, tokenaddr: string}} + chai.expect(chain.key).equal(ethId, 'Wrong chain id' + ' got: ' + String(item.chains[0])) + chai.expect(chain.value.name).equal(ethName, 'Wrong chain name') + chai.expect(chain.value.net_id).equal(ethNetId, 'Wrong chain name') + chai.expect(chain.value.teleaddr).equal(ethContract, 'Wrong chain id') + chai.expect(chain.value.tokenaddr).equal(ethTokenContract, 'Wrong chain id') }) it('should fail with already existing id', async () => { await assertEOSErrorIncludesMessage( From 8144637d325d6d05a1744744fa1c1d6bce758676 Mon Sep 17 00:00:00 2001 From: Kevin Kei Tuncer Date: Wed, 18 May 2022 14:31:04 +0200 Subject: [PATCH 21/24] Fix test environment --- .../contracts/teleport/teleporteos.cpp | 2 +- .../contracts/teleport/teleporteos.test.ts | 402 +++++++++--------- 2 files changed, 212 insertions(+), 192 deletions(-) diff --git a/contracts/teleporteos/contracts/teleport/teleporteos.cpp b/contracts/teleporteos/contracts/teleport/teleporteos.cpp index 391eaad..a97c84f 100644 --- a/contracts/teleporteos/contracts/teleport/teleporteos.cpp +++ b/contracts/teleporteos/contracts/teleport/teleporteos.cpp @@ -149,7 +149,7 @@ ACTION teleporteos::addchain(string name, string abbreviation, uint8_t chain_id, _stats.modify(*stat, get_self(), [&](auto &s) { ret = s.chains.insert(std::pair(chain_id, chain)); }); - check(ret.second != false, "Chain was already added"); + check(ret.second != false, "This chain is already listed"); } ACTION teleporteos::rmchain(uint8_t chain_id){ diff --git a/contracts/teleporteos/contracts/teleport/teleporteos.test.ts b/contracts/teleporteos/contracts/teleport/teleporteos.test.ts index 97e4ae6..ebbc0a1 100644 --- a/contracts/teleporteos/contracts/teleport/teleporteos.test.ts +++ b/contracts/teleporteos/contracts/teleport/teleporteos.test.ts @@ -16,7 +16,7 @@ import { } from 'lamington' import * as chai from 'chai' -import { Teleporteos } from './teleporteos' +import { Teleporteos, TeleporteosStatsItem } from './teleporteos' import { EosioToken } from '../eosio.token/eosio.token' const ethToken = '2222222222222222222222222222222222222222222222222222222222222222' @@ -96,9 +96,7 @@ describe('teleporteos', async () => { await teleporteos.addchain(ethName, ethShortName, ethId, ethNetId, ethContract, ethTokenContract, { from: teleporteos.account }) }) it('should update stats table', async () => { - const { rows: [item] } = await teleporteos.statsTable() - console.log(item.chains); - + const { rows: [item] } = await teleporteos.statsTable() chai.expect(item.chains.length).equal(1, 'Wrong amount of added chains') const chain = item.chains[0] as unknown as {key: number, value: {name: string, net_id: string, teleaddr: string, tokenaddr: string}} chai.expect(chain.key).equal(ethId, 'Wrong chain id' + ' got: ' + String(item.chains[0])) @@ -630,17 +628,19 @@ describe('teleporteos', async () => { ) }) }) - it('should succeed', async () => { - await teleporteos.claimed(oracle1.name, 0, ethToken, `123.0000 ${token_symbol}`, { from: oracle1 }) - const { rows: [item] } = await teleporteos.teleportsTable({lowerBound: '0'}) - chai.expect(item.id).equal(0, 'Wrong id') - chai.expect(item.claimed).equal(true) - }) - it('should refuse double claiming', async () => { - await assertEOSErrorIncludesMessage( - teleporteos.claimed(oracle1.name, 0, ethToken, `123.0000 ${token_symbol}`, { from: oracle1 }), - 'Already marked as claimed' - ) + context('correct parameters', async () => { + it('should succeed', async () => { + await teleporteos.claimed(oracle1.name, 0, ethToken, `123.0000 ${token_symbol}`, { from: oracle1 }) + const { rows: [item] } = await teleporteos.teleportsTable({lowerBound: '0'}) + chai.expect(item.id).equal(0, 'Wrong id') + chai.expect(item.claimed).equal(true) + }) + it('should refuse double claiming', async () => { + await assertEOSErrorIncludesMessage( + teleporteos.claimed(oracle1.name, 0, ethToken, `123.0000 ${token_symbol}`, { from: oracle1 }), + 'Already marked as claimed' + ) + }) }) }) }) @@ -678,11 +678,12 @@ describe('teleporteos', async () => { }) // Adjust fee + const fixfee = BigInt(1102) context('adjust fee', async () => { context('with incorrect auth', async () => { it('should fail with auth error', async () => { await assertMissingAuthority( - teleporteos.setfee(`0.1000 ${token_symbol}`, '0.003', { from: sender1 }) + teleporteos.setfee(amountToAsset(fixfee, token_symbol, 4), '0.007', { from: sender1 }) ) }) }) @@ -710,122 +711,135 @@ describe('teleporteos', async () => { }) it('wrong symbol precision should fail', async () => { await assertEOSErrorIncludesMessage( - teleporteos.setfee(`1 ${token_symbol}`, '0.003', { from: teleporteos.account }), + teleporteos.setfee(`1 ${token_symbol}`, '0.007', { from: teleporteos.account }), 'Wrong token' ) }) it('too high amount should fail', async () => { await assertEOSErrorIncludesMessage( - teleporteos.setfee(`200.0000 ${token_symbol}`, '0.003', { from: teleporteos.account }), + teleporteos.setfee(`200.0000 ${token_symbol}`, '0.007', { from: teleporteos.account }), 'Fees are too high relative to the minimum amount of token transfers' ) }) }) - it('should succeed', async () => { - await teleporteos.setfee(`0.1000 ${token_symbol}`, '0.003', { from: teleporteos.account }) - }) - it('should update stats table', async () => { - let { rows: [item] } = await teleporteos.statsTable() - chai.expect(item.fixfee).equal(1000, 'Wrong fix fee') - chai.expect(item.varfee).equal('0.00300000000000000', 'Wrong variable fee') - }) - it('should succeed withdraw and deposit', async () => { - await teleporteos.withdraw(sender1.name, `1.0000 ${token_symbol}`, { from: sender1 }) - { - let { rows } = await teleporteos.depositsTable() - for(let item of rows){ + context('with valid fees', async () => { + it('should succeed', async () => { + await teleporteos.setfee(amountToAsset(fixfee, token_symbol, 4), '0.007', { from: teleporteos.account }) + }) + it('should update stats table', async () => { + let { rows: [item] } = await teleporteos.statsTable() + chai.expect(BigInt(item.fixfee)).equal(fixfee, 'Wrong fix fee') + chai.expect(item.varfee).equal('0.00700000000000000', 'Wrong variable fee') + }) + it('should succeed withdraw and deposit', async () => { + await teleporteos.withdraw(sender1.name, `1.0000 ${token_symbol}`, { from: sender1 }) + { + let { rows } = await teleporteos.depositsTable() + for(let item of rows){ + if(item.account == sender1.name){ + chai.expect(item.quantity).equal(`100.0000 ${token_symbol}`, 'Wrong deposit on withdraw') + break + } + } + } + let { rows: [item_balance] } = await alienworldsToken.accountsTable({scope: sender1.name}) + chai.expect(item_balance.balance).equal(`999900.0000 ${token_symbol}`, 'Wrong balance after withdraw') + await alienworldsToken.transfer( + sender1.name, + teleporteos.account.name, + `200.0000 ${token_symbol}`, + 'teleport test', + { from: sender1 } + ) + let deposits = await teleporteos.depositsTable() + for(let item of deposits.rows){ if(item.account == sender1.name){ - chai.expect(item.quantity).equal(`100.0000 ${token_symbol}`, 'Wrong deposit on withdraw') + chai.expect(item.quantity).equal(`300.0000 ${token_symbol}`, 'Wrong balance on deposit') break } } - } - let { rows: [item_balance] } = await alienworldsToken.accountsTable({scope: sender1.name}) - chai.expect(item_balance.balance).equal(`999900.0000 ${token_symbol}`, 'Wrong balance after withdraw') - await alienworldsToken.transfer( - sender1.name, - teleporteos.account.name, - `200.0000 ${token_symbol}`, - 'teleport test', - { from: sender1 } - ) - let deposits = await teleporteos.depositsTable() - for(let item of deposits.rows){ - if(item.account == sender1.name){ - chai.expect(item.quantity).equal(`300.0000 ${token_symbol}`, 'Wrong balance on deposit') - break - } - } - }) - it('should succeed teleport', async () => { - await teleporteos.teleport(sender1.name, `200.0000 ${token_symbol}`, 2, ethToken, { from: sender1 }) - let deposits = await teleporteos.depositsTable() - for(let item of deposits.rows){ - if(item.account == sender1.name){ - chai.expect(item.quantity).equal(`100.0000 ${token_symbol}`, 'Wrong balance on deposit') - break - } - } - // Check collected amount - const value = BigInt(2000000) - const fee = calcFee(value, BigInt(1000), 0.003) - let { rows: [stat] } = await teleporteos.statsTable() - chai.expect(stat.collected.toString()).equal(fee.toString(), "Wrong collected fee amount") - // check teleport amount - let teleports = await teleporteos.teleportsTable({reverse: true}) - chai.expect(teleports.rows[0].quantity).equal(amountToAsset(value - fee, token_symbol, 4), "Wrong fee calculation") - }) - it('should succeed receipt', async () => { - // Get current balance of sender 1 on token contract - let { rows: [a_item_old] } = await alienworldsToken.accountsTable({scope: sender1.name}) - let sender1Balance = stringToAsset(a_item_old.balance).amount - // Get current balance of sender 1 on deposits - let sender1DepositBalance = BigInt(0) - let deposits_old = await teleporteos.depositsTable() - for(let item of deposits_old.rows){ - if(item.account == sender1.name){ - sender1DepositBalance = stringToAsset(item.quantity).amount - break - } - } - // Get current stat - let { rows: [stat_old] } = await teleporteos.statsTable() - // Send received action by three oracles, so it should be completed - const hash = '1111111111111111111111111111111111111111111111111111111111111113' - const sendAmount = BigInt(1230) - const sendAsset = amountToAsset(sendAmount, token_symbol, 4) - // Execute recepits with three oracles - await teleporteos.received( - oracle1.name, sender1.name, hash, sendAsset, 2, true, { from: oracle1 } - ) - await teleporteos.received( - oracle2.name, sender1.name, hash, sendAsset, 2, true, { from: oracle2 } - ) - await teleporteos.received( - oracle3.name, sender1.name, hash, sendAsset, 2, true, { from: oracle3 } - ) - let { rows: [confirmedItem] } = await teleporteos.receiptsTable({ - keyType: 'sha256', - indexPosition: 2, - lowerBound: hash }) - chai.expect(confirmedItem.confirmations).equal(3, "Wrong amount of confirmations") - chai.expect(confirmedItem.completed).equal(true, "Not completed") - // Check collected - const fee = calcFee(sendAmount, BigInt(1000), 0.003) - let { rows: [stat_new] } = await teleporteos.statsTable() - chai.expect(stat_new.collected.toString()).equal((BigInt(stat_old.collected) + fee).toString(), "Collected got wrong amount of fees") - // Check new balance on token contract - let { rows: [a_item_new] } = await alienworldsToken.accountsTable({scope: sender1.name}) - chai.expect(stringToAsset(a_item_new.balance).amount.toString()).equal((sender1Balance + sendAmount - fee).toString(), "New Balance reduced by a fee is wrong") - // Check if deposit table is unchanged - let deposits_new = await teleporteos.depositsTable() - for(let item of deposits_new.rows){ - if(item.account == sender1.name){ - chai.expect(stringToAsset(item.quantity).amount.toString()).equal(sender1DepositBalance.toString(), "Deposit has changed") - break + it('should succeed teleport', async () => { + await teleporteos.teleport(sender1.name, `200.0000 ${token_symbol}`, 2, ethToken, { from: sender1 }) + }) + it('should have listed last teleport in table', async () => { + let deposits = await teleporteos.depositsTable() + for(let item of deposits.rows){ + if(item.account == sender1.name){ + chai.expect(item.quantity).equal(`100.0000 ${token_symbol}`, 'Wrong balance on deposit') + break + } } - } + // Check collected amount + const value = BigInt(2000000) + const fee = calcFee(value, fixfee, 0.007) + let { rows: [stat] } = await teleporteos.statsTable() + chai.expect(stat.collected.toString()).equal(fee.toString(), "Wrong collected fee amount") + // Check teleport amount + let teleports = await teleporteos.teleportsTable({reverse: true}) + chai.expect(teleports.rows[0].quantity).equal(amountToAsset(value - fee, token_symbol, 4), "Wrong fee calculation") + }) + context('valid received until confirmation', async () => { + let sender1Balance: bigint; + let sender1DepositBalance: bigint; + let oldStat: TeleporteosStatsItem + const hash = '1111111111111111111111111111111111111111111111111111111111111113' + const sendAmount = BigInt(1230) + const sendAsset = amountToAsset(sendAmount, token_symbol, 4) + before(async () => { + // Get current balance of sender 1 on token contract + let { rows: [a_item_old] } = await alienworldsToken.accountsTable({scope: sender1.name}) + sender1Balance = stringToAsset(a_item_old.balance).amount + // Get current balance of sender 1 on deposits + sender1DepositBalance = BigInt(0) + let deposits_old = await teleporteos.depositsTable() + for(let item of deposits_old.rows){ + if(item.account == sender1.name){ + sender1DepositBalance = stringToAsset(item.quantity).amount + break + } + } + // Get current stat + let stats = await teleporteos.statsTable() + oldStat = stats.rows[0] + }) + it('should succeed', async () => { + // Send received action by three oracles, so it should be completed + await teleporteos.received( + oracle1.name, sender1.name, hash, sendAsset, 2, true, { from: oracle1 } + ) + await teleporteos.received( + oracle2.name, sender1.name, hash, sendAsset, 2, true, { from: oracle2 } + ) + await teleporteos.received( + oracle3.name, sender1.name, hash, sendAsset, 2, true, { from: oracle3 } + ) + }) + it('should have expected table entries', async () => { + let { rows: [confirmedItem] } = await teleporteos.receiptsTable({ + keyType: 'sha256', + indexPosition: 2, + lowerBound: hash + }) + chai.expect(confirmedItem.confirmations).equal(3, "Wrong amount of confirmations") + chai.expect(confirmedItem.completed).equal(true, "Not completed") + // Check collected + const fee = calcFee(sendAmount, fixfee, 0.007) + let { rows: [stat_new] } = await teleporteos.statsTable() + chai.expect(stat_new.collected.toString()).equal((BigInt(oldStat.collected) + fee).toString(), "Collected got wrong amount of fees") + // Check new balance on token contract + let { rows: [a_item_new] } = await alienworldsToken.accountsTable({scope: sender1.name}) + chai.expect(stringToAsset(a_item_new.balance).amount.toString()).equal((sender1Balance + sendAmount - fee).toString(), "New Balance reduced by a fee is wrong") + // Check if deposit table is unchanged + let deposits_new = await teleporteos.depositsTable() + for(let item of deposits_new.rows){ + if(item.account == sender1.name){ + chai.expect(stringToAsset(item.quantity).amount.toString()).equal(sender1DepositBalance.toString(), "Deposit has changed") + break + } + } + }) + }) }) }) }) @@ -840,20 +854,18 @@ describe('teleporteos', async () => { }) }) context('with correct auth', async () => { - context('incorrect amount', async () => { - it('should fail', async () => { - await assertEOSErrorIncludesMessage( - teleporteos.setthreshold(0, { from: teleporteos.account }), - 'Needed confirmation amount has to be grater than 0' - ) - }) + it('and incorrect amount should fail', async () => { + await assertEOSErrorIncludesMessage( + teleporteos.setthreshold(0, { from: teleporteos.account }), + 'Needed confirmation amount has to be grater than 0' + ) }) it('should succeed receipt', async () => { // Set threshold to 2 await teleporteos.setthreshold(2, { from: teleporteos.account }) // Check stats let { rows: [stat] } = await teleporteos.statsTable() - chai.expect(stat.threshold).equal(2, "Threshold was not was not inherited") + chai.expect(stat.threshold).equal(2, "Threshold was not inherited") // Send received action by three oracles, so it should be completed const hash = '1111111111111111111111111111111111111111111111111111111111111114' const sendAmount = BigInt(10000) @@ -892,30 +904,26 @@ describe('teleporteos', async () => { // Delete teleports context('delete teleports', async () => { - context('with incorrect auth', async () => { - it('should fail with auth error', async () => { - await assertMissingAuthority( - teleporteos.delteles('0', { from: sender1 }) - ) - await assertMissingAuthority( - teleporteos.delteles('0', { from: oracle1 }) - ) - }) + it('with incorrect auth should fail with auth error', async () => { + await assertMissingAuthority( + teleporteos.delteles('0', { from: sender1 }) + ) + await assertMissingAuthority( + teleporteos.delteles('0', { from: oracle1 }) + ) }) - context('with not available id', async () => { - it('should fail', async () => { - await assertEOSErrorIncludesMessage( - teleporteos.delteles('100', { from: teleporteos.account }), - 'Teleport id not found' - ) - }) + it('with not available id should fail', async () => { + await assertEOSErrorIncludesMessage( + teleporteos.delteles('100', { from: teleporteos.account }), + 'Teleport id not found' + ) }) it('preparation', async () => { // Add three teleports await teleporteos.teleport(alienworldsToken.account.name, `203.0000 ${token_symbol}`, 1, ethToken, { from: alienworldsToken.account }) await teleporteos.teleport(alienworldsToken.account.name, `203.0000 ${token_symbol}`, 2, ethToken, { from: alienworldsToken.account }) await teleporteos.teleport(alienworldsToken.account.name, `203.0000 ${token_symbol}`, 3, ethToken, { from: alienworldsToken.account }) - const fee = calcFee(BigInt(2030000), BigInt(1000), 0.003) + const fee = calcFee(BigInt(2030000), fixfee, 0.007) const sendAsset = amountToAsset(BigInt(2030000) - fee, token_symbol, 4) // Claim all teleports but not the second in table await teleporteos.claimed(oracle1.name, 2, ethToken, sendAsset, { from: oracle1 }) @@ -925,14 +933,14 @@ describe('teleporteos', async () => { context('with correct auth', async () => { context('delete to id 2', async () => { it('should succeed', async () => { - // Delete until the third one - await teleporteos.delteles('2', { from: teleporteos.account }) - const teleports = await teleporteos.teleportsTable() - chai.expect(teleports.rows.length).equal(4, 'Wrong amount of teleports are deleted') - chai.expect(teleports.rows[0].id).equal(1, 'Wrong deletion') - chai.expect(teleports.rows[1].id).equal(2, 'Wrong deletion') - chai.expect(teleports.rows[2].id).equal(3, 'Wrong deletion') - chai.expect(teleports.rows[3].id).equal(4, 'Wrong deletion') + // Delete until the third one + await teleporteos.delteles('2', { from: teleporteos.account }) + const teleports = await teleporteos.teleportsTable() + chai.expect(teleports.rows.length).equal(4, 'Wrong amount of teleports are deleted') + chai.expect(teleports.rows[0].id).equal(1, 'Wrong deletion') + chai.expect(teleports.rows[1].id).equal(2, 'Wrong deletion') + chai.expect(teleports.rows[2].id).equal(3, 'Wrong deletion') + chai.expect(teleports.rows[3].id).equal(4, 'Wrong deletion') }) }) context('delete to last id', async () => { @@ -981,57 +989,56 @@ describe('teleporteos', async () => { // Pay oracles context('pay oracles', async () => { - const {rows: [initialStat]} = await teleporteos.statsTable() - const amountPerOracle = Math.floor(Number(initialStat.collected) / initialStat.oracles) - const rest = Number(initialStat.collected) - amountPerOracle it('should succeed', async () => { + const {rows: [initialStat]} = await teleporteos.statsTable() + const amountPerOracle = BigInt(Math.floor(Number(initialStat.collected) / initialStat.oracles)) + const rest = BigInt(initialStat.collected) - (amountPerOracle * BigInt(initialStat.oracles)) await teleporteos.payoracles({ from: sender1 }) + // Check rest + const {rows: [stat]} = await teleporteos.statsTable() + chai.expect(BigInt(stat.collected)).equal(rest, 'Wrong collected rest') + // Check oracle deposit amounts + const deposits = await teleporteos.depositsTable({lowerBound: oracle1.name}) + chai.expect(stringToAsset(deposits.rows[0].quantity).amount).equal(amountPerOracle, 'Wrong amount for oracle') + chai.expect(stringToAsset(deposits.rows[1].quantity).amount).equal(amountPerOracle, 'Wrong amount for oracle') + chai.expect(stringToAsset(deposits.rows[2].quantity).amount).equal(amountPerOracle, 'Wrong amount for oracle') }) - // Check rest - const {rows: [stat]} = await teleporteos.statsTable() - chai.expect(stat.collected).equal(rest, 'Wrong collected rest') - // Check oracle deposit amounts - const deposits = await teleporteos.depositsTable({lowerBound: oracle1.name}) - chai.expect(stringToAsset(deposits.rows[0].quantity).amount).equal(amountPerOracle, 'Wrong amount for oracle') - chai.expect(stringToAsset(deposits.rows[1].quantity).amount).equal(amountPerOracle, 'Wrong amount for oracle') - chai.expect(stringToAsset(deposits.rows[2].quantity).amount).equal(amountPerOracle, 'Wrong amount for oracle') }) // Delete receipts context('delete receipts', async () => { - const initialReceipts = await teleporteos.receiptsTable() - const secondDate = initialReceipts.rows[1].date - const lastDate = initialReceipts.rows[initialReceipts.rows.length - 1].date - context('with incorrect auth', async () => { - it('should fail with auth error', async () => { - await assertMissingAuthority( - teleporteos.delreceipts(lastDate, { from: sender1 }) + let initialReceipts; + let lastDate: Date; + let second: Date; + it('get initial receipt table', async () => { + initialReceipts = await teleporteos.receiptsTable() + lastDate = fixLamingtionDate(initialReceipts.rows[initialReceipts.rows.length - 1].date) + second = fixLamingtionDate(initialReceipts.rows[1].date) + }) + it('with user auth should fail with auth error', async () => { + await assertMissingAuthority( + teleporteos.delreceipts(lastDate, { from: sender1 }) ) - await assertMissingAuthority( + }) + it('with oracle auth should fail with auth error', async () => { + await assertMissingAuthority( teleporteos.delreceipts(lastDate, { from: oracle1 }) - ) - }) + ) }) - context('with correct auth', async () => { - context('delete to id 2', async () => { - it('should succeed', async () => { - // Delete until the third one - await teleporteos.delreceipts(secondDate, { from: teleporteos.account }) - const receipts = await teleporteos.receiptsTable() - chai.expect(receipts.rows.length).equal(3, 'Wrong amount of receipts are deleted') - chai.expect(receipts.rows[0].id).equal(1, 'Wrong deletion') - chai.expect(receipts.rows[1].id).equal(2, 'Wrong deletion') - chai.expect(receipts.rows[2].id).equal(3, 'Wrong deletion') - }) - }) - context('delete all', async () => { - it('should succeed', async () => { - // Delete until the third one - await teleporteos.delreceipts(new Date(lastDate.getTime() + 1), { from: teleporteos.account }) - const receipts = await teleporteos.receiptsTable() - chai.expect(receipts.rows.length).equal(0, 'Not all deleted') - }) - }) + it('with correct auth delete to id 2 should succeed', async () => { + // Delete until the third one + await teleporteos.delreceipts(second, { from: teleporteos.account }) + const receipts = await teleporteos.receiptsTable() + chai.expect(receipts.rows.length).equal(3, 'Wrong amount of receipts are deleted') + chai.expect(receipts.rows[0].id).equal(1, 'Wrong deletion') + chai.expect(receipts.rows[1].id).equal(2, 'Wrong deletion') + chai.expect(receipts.rows[2].id).equal(3, 'Wrong deletion') + }) + it('with correct auth delete all should succeed', async () => { + // Delete until the third one + await teleporteos.delreceipts(new Date(lastDate.getTime() + 1000), { from: teleporteos.account }) + const receipts = await teleporteos.receiptsTable() + chai.expect(receipts.rows.length).equal(0, 'Not all deleted') }) }) }) @@ -1143,4 +1150,17 @@ function stringToAsset(asset_str: string){ function calcFee(amount: bigint, fixfeeAmount: bigint, varfee: number){ return BigInt(Math.floor(Number(amount) * varfee)) + fixfeeAmount +} + +function fixLamingtionDate(date: Date){ + // Lamington converts the date wrong. This will fix it + const offset = (new Date()).getTimezoneOffset() * 60 * 1000 + return new Date(date.getTime() + offset) + + // let d = correctedDate.toString() + // const ms = d.indexOf('.') + // if(ms != -1){ + // return d.substring(0, ms) + // } + // return d } \ No newline at end of file From afe612a714875eb28ca925c99d5168d07d96bcb7 Mon Sep 17 00:00:00 2001 From: Kevin Kei Tuncer Date: Thu, 19 May 2022 00:04:00 +0200 Subject: [PATCH 22/24] Set eth test environment to the sample settings of the contract and mention in md file the location for the mnemonic. --- contracts/teleporteth/README.md | 2 +- contracts/teleporteth/test/TeleportToken.test.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/contracts/teleporteth/README.md b/contracts/teleporteth/README.md index af0dd3a..890049a 100644 --- a/contracts/teleporteth/README.md +++ b/contracts/teleporteth/README.md @@ -9,7 +9,7 @@ yarn install ``` ### Configutration -Use truffle-config.js file to change your test net settings. +Use truffle-config.js file to change your test net settings. The current settings need a mnemonic key phrase stored in a file called "`.secret`". ### Run eth contract tests 1. Start two consoles diff --git a/contracts/teleporteth/test/TeleportToken.test.js b/contracts/teleporteth/test/TeleportToken.test.js index d496ced..56ac60b 100644 --- a/contracts/teleporteth/test/TeleportToken.test.js +++ b/contracts/teleporteth/test/TeleportToken.test.js @@ -41,7 +41,7 @@ const TestSettings = { decimals: 4, }, threshold: 3, - chainId: 1, + chainId: 2, oracles: [{ eosio_name: 'klausklaus12', keys: generateAllKeys('8940fbd7806ec09af7e1ceaf7ccac80e89eeeb1e85cee42f84c07b1d5a378100'), From 3167c1494739f9a7eaa8ef23f5ff98a598e6534b Mon Sep 17 00:00:00 2001 From: Kevin Kei Tuncer Date: Wed, 25 May 2022 13:11:47 +0200 Subject: [PATCH 23/24] Oracles - Set wait circle by config or console - Set blocks to wait by config - Fix skipping endpoints that are not accessible --- .gitignore | 9 +- oracle/CommonTypes.ts | 7 +- oracle/EndpointSwitcher.js | 21 +- oracle/EndpointSwitcher.ts | 18 +- oracle/README.md | 2 +- oracle/config-example.js | 3 + oracle/oracle-eos.js | 20 +- oracle/oracle-eos.ts | 23 +- oracle/oracle-eth.js | 128 +- oracle/oracle-eth.ts | 179 +- oracle/package.json | 2 +- oracle/yarn.lock | 3271 ------------------------------------ yarn.lock | 393 ----- 13 files changed, 248 insertions(+), 3828 deletions(-) delete mode 100644 oracle/yarn.lock delete mode 100644 yarn.lock diff --git a/.gitignore b/.gitignore index af5636d..5acb5b8 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,13 @@ +.vs +.vscode config.js teleporteos.ts eosio.token.ts contracts/teleporteos/artifacts build -node_modules \ No newline at end of file +node_modules +.eosproj +.secret +*.code-workspace +teleporteos.abi +teleporteos.wasm \ No newline at end of file diff --git a/oracle/CommonTypes.ts b/oracle/CommonTypes.ts index 21d74d8..d4f2720 100644 --- a/oracle/CommonTypes.ts +++ b/oracle/CommonTypes.ts @@ -15,7 +15,8 @@ export interface ConfigType { privateKey: string, // genesisBlock: number, oraclePermission?: string, - epVerifications: number + epVerifications: number, + waitCycle: number, } eth: { network: string, @@ -28,7 +29,9 @@ export interface ConfigType { oracleAccount: string, privateKey: string, genesisBlock: number, - epVerifications: number + epVerifications: number, + waitCycle?: number, + blocksToWait?: number, } } diff --git a/oracle/EndpointSwitcher.js b/oracle/EndpointSwitcher.js index df3c374..6276d25 100644 --- a/oracle/EndpointSwitcher.js +++ b/oracle/EndpointSwitcher.js @@ -81,7 +81,7 @@ var EosApi = /** @class */ (function () { */ EosApi.prototype.nextEndpoint = function () { return __awaiter(this, void 0, void 0, function () { - var i; + var i, info; return __generator(this, function (_a) { switch (_a.label) { case 0: @@ -98,14 +98,13 @@ var EosApi = /** @class */ (function () { if (!!this.gotRightInfo[this.epId]) return [3 /*break*/, 3]; return [4 /*yield*/, this.checkInfo()]; case 2: - if (_a.sent()) { + info = _a.sent(); + if (info === true) { this.gotRightInfo[this.epId] = true; - // console.log('Use new endpoint', this.endpoint); return [2 /*return*/]; } - else { + else if (info === null) { i--; - return [3 /*break*/, 4]; } return [3 /*break*/, 4]; case 3: @@ -138,7 +137,7 @@ var EosApi = /** @class */ (function () { this.endpointList.splice(this.epId, 1); this.gotRightInfo.splice(this.epId, 1); this.epId--; - return [2 /*return*/, false]; + return [2 /*return*/, null]; } return [3 /*break*/, 3]; case 2: @@ -228,7 +227,7 @@ var EthApi = /** @class */ (function () { this.gotRightInfo.splice(this.epId, 1); this.providers.splice(this.epId, 1); this.epId--; - return [2 /*return*/, false]; + return [2 /*return*/, null]; } return [3 /*break*/, 3]; case 2: @@ -245,7 +244,7 @@ var EthApi = /** @class */ (function () { */ EthApi.prototype.nextEndpoint = function () { return __awaiter(this, void 0, void 0, function () { - var i; + var i, info; return __generator(this, function (_a) { switch (_a.label) { case 0: @@ -266,13 +265,13 @@ var EthApi = /** @class */ (function () { if (!!this.gotRightInfo[this.epId]) return [3 /*break*/, 3]; return [4 /*yield*/, this.checkInfo()]; case 2: - if (_a.sent()) { + info = _a.sent(); + if (info === true) { this.gotRightInfo[this.epId] = true; return [2 /*return*/]; } - else { + else if (info === null) { i--; - return [3 /*break*/, 4]; } return [3 /*break*/, 4]; case 3: diff --git a/oracle/EndpointSwitcher.ts b/oracle/EndpointSwitcher.ts index ff76559..e36db7a 100644 --- a/oracle/EndpointSwitcher.ts +++ b/oracle/EndpointSwitcher.ts @@ -38,13 +38,13 @@ export class EosApi { this.getAPI() if(!this.gotRightInfo[this.epId]){ - if(await this.checkInfo()){ + + const info = await this.checkInfo() + if(info === true){ this.gotRightInfo[this.epId] = true - // console.log('Use new endpoint', this.endpoint); return - } else { + } else if(info === null){ i-- - continue } } else { // console.log('Use next endpoint', this.endpoint); @@ -66,7 +66,7 @@ export class EosApi { this.endpointList.splice(this.epId, 1) this.gotRightInfo.splice(this.epId, 1) this.epId-- - return false + return null } } catch { console.log('Can not connect to endpoint', this.endpoint) @@ -150,7 +150,7 @@ export class EthApi{ this.gotRightInfo.splice(this.epId, 1) this.providers.splice(this.epId, 1) this.epId-- - return false + return null } } catch (e) { console.log('Can not connect to endpoint') @@ -178,12 +178,12 @@ export class EthApi{ // Check info of the rovider if it was never checked before if(!this.gotRightInfo[this.epId]){ - if(await this.checkInfo()){ + const info = await this.checkInfo() + if(info === true){ this.gotRightInfo[this.epId] = true return - } else { + } else if(info === null){ i-- - continue } } else { console.log('Use next endpoint', this.endpoint) //- diff --git a/oracle/README.md b/oracle/README.md index 72cb9c4..428fc06 100644 --- a/oracle/README.md +++ b/oracle/README.md @@ -7,7 +7,7 @@ yarn install ``` ## Configutration -Edit config.js file +Setup a file called `config.js` like the `config-example.js` ## Compile and start eos oracle ``` diff --git a/oracle/config-example.js b/oracle/config-example.js index 3320808..e49437e 100644 --- a/oracle/config-example.js +++ b/oracle/config-example.js @@ -15,6 +15,7 @@ module.exports = { teleportContract: 'alein.worlds', // EOSIO token contract account oracleAccount: 'oracle1', // EOSIO oracle account privateKey: '5K29JmEvWEnfdD5DV1bm9Ro4qMrTKhBGmTXuaaqmrZSMEntqqZQ', // Example private EOSIO key. Do not use it. It is public! + waitCycle: 165, // Seconds to wait to check for new teleports after all teleports are handled. EOSIO chains typically needs 165 seconds to set transactions as irreversible. }, eth: { network: 'BSC', // Abbreviation of the chain @@ -30,5 +31,7 @@ module.exports = { teleportContract: '0x281D131268f5D257297DDDe4B4047EeF881db79d', // ETH teleport contract address oracleAccount: '0x8353C7d4758D113Dd4407AC4b1115fF2E54D9eA0', // ETH oracle address privateKey: '8940fbd7806ec09af7e1ceaf7ccac80e89eeeb1e85cee42f84c07b1d5a378100', // Example private ETH key. Do not use it. It is public! + waitCycle: 10, // Seconds to wait to check for new teleports after all teleports are handled + blocksToWait: 6, // Amount of blocks to wait until it will be considered as irreversible. Lowest accepted value is 5 } } diff --git a/oracle/oracle-eos.js b/oracle/oracle-eos.js index 2e9b3c9..1c4b82d 100755 --- a/oracle/oracle-eos.js +++ b/oracle/oracle-eos.js @@ -523,9 +523,10 @@ var EosOracle = /** @class */ (function () { * @param id Teleport id to start from * @param requestAmount Amount of requested teleports per request */ - EosOracle.prototype.run = function (id, requestAmount) { + EosOracle.prototype.run = function (id, requestAmount, waitCycle) { if (id === void 0) { id = 0; } if (requestAmount === void 0) { requestAmount = 100; } + if (waitCycle === void 0) { waitCycle = EosOracle.maxWait; } return __awaiter(this, void 0, void 0, function () { var signProcessData, e_4; return __generator(this, function (_a) { @@ -550,7 +551,7 @@ var EosOracle = /** @class */ (function () { return [4 /*yield*/, this.signAllTeleportsUntilNow(signProcessData)]; case 5: _a.sent(); - return [4 /*yield*/, EosOracle.WaitWithAnimation(EosOracle.maxWait, 'All available teleports signed')]; + return [4 /*yield*/, EosOracle.WaitWithAnimation(waitCycle, 'All available teleports signed')]; case 6: _a.sent(); return [3 /*break*/, 2]; @@ -586,6 +587,11 @@ var argv = yargs_1.default alias: 's', description: 'Amount of signatures until this oracle will sign too', type: 'number' +}) + .option('waiter', { + alias: 'w', + description: 'Seconds to wait after finishing all current teleports', + type: 'number' }) .option('config', { alias: 'c', @@ -600,5 +606,13 @@ var configFile = require(config_path); // Configure eosjs specific propperties var signatureProvider = new eosjs_jssig_1.JsSignatureProvider([configFile.eos.privateKey]); var eosOracle = new EosOracle(configFile, signatureProvider); +// Get time to wait for each round by config file or comsole parameters +var waitCycle = undefined; +if (typeof configFile.eos.waitCycle == 'number') { + waitCycle = configFile.eos.waitCycle; +} +if (argv.waiter) { + waitCycle = argv.waiter; +} // Run the process -eosOracle.run(argv.id, argv.amount); +eosOracle.run(argv.id, argv.amount, waitCycle); diff --git a/oracle/oracle-eos.ts b/oracle/oracle-eos.ts index 5fcec98..a2b44ea 100644 --- a/oracle/oracle-eos.ts +++ b/oracle/oracle-eos.ts @@ -389,7 +389,7 @@ class EosOracle{ * @param id Teleport id to start from * @param requestAmount Amount of requested teleports per request */ - async run(id = 0, requestAmount = 100){ + async run(id = 0, requestAmount = 100, waitCycle = EosOracle.maxWait){ console.log(`Starting EOS watcher for ETH oracle ${this.config.eth.oracleAccount}`) // Create an object to change the current id on each run @@ -400,7 +400,7 @@ class EosOracle{ await this.eos_api.nextEndpoint() await this.updateTimes() await this.signAllTeleportsUntilNow(signProcessData) - await EosOracle.WaitWithAnimation(EosOracle.maxWait, 'All available teleports signed') + await EosOracle.WaitWithAnimation(waitCycle, 'All available teleports signed') } } catch (e){ console.error('⚡️ ' + e) @@ -427,6 +427,11 @@ const argv = yargs description: 'Amount of signatures until this oracle will sign too', type: 'number' }) + .option('waiter', { + alias: 'w', + description: 'Seconds to wait after finishing all current teleports', + type: 'number' + }) .option('config', { alias: 'c', description: 'Path of config file', @@ -436,7 +441,8 @@ const argv = yargs id: number, amount: number, signs: number, - config: string + waiter: number, + config: string, } // Load config and set title @@ -448,5 +454,14 @@ const configFile : ConfigType = require(config_path) const signatureProvider = new JsSignatureProvider([configFile.eos.privateKey]) const eosOracle = new EosOracle(configFile, signatureProvider) +// Get time to wait for each round by config file or comsole parameters +let waitCycle : undefined | number = undefined +if(typeof configFile.eos.waitCycle == 'number'){ + waitCycle = configFile.eos.waitCycle +} +if(argv.waiter) { + waitCycle = argv.waiter +} + // Run the process -eosOracle.run(argv.id, argv.amount) \ No newline at end of file +eosOracle.run(argv.id, argv.amount, waitCycle) \ No newline at end of file diff --git a/oracle/oracle-eth.js b/oracle/oracle-eth.js index 03789d3..3afd353 100755 --- a/oracle/oracle-eth.js +++ b/oracle/oracle-eth.js @@ -75,8 +75,8 @@ var EthOracle = /** @class */ (function () { this.running = false; this.claimed_topic = '0xf20fc6923b8057dd0c3b606483fcaa038229bb36ebc35a0040e3eaa39cf97b17'; this.teleport_topic = '0x622824274e0937ee319b036740cd0887131781bc2032b47eac3e88a1be17f5d5'; - this.DEFAULT_BLOCKS_TO_WAIT = 5; this.minTrySend = 3; + this.blocksToWait = typeof config.eth.blocksToWait == 'number' && config.eth.blocksToWait > EthOracle.MIN_BLOCKS_TO_WAIT ? config.eth.blocksToWait : EthOracle.MIN_BLOCKS_TO_WAIT; this.blocks_file_name = ".oracle_".concat(configFile.eth.network, "_block-").concat(configFile.eth.oracleAccount); this.eos_api = new EndpointSwitcher_1.EosApi(this.config.eos.netId, this.config.eos.endpoints, this.signatureProvider); this.eth_api = new EndpointSwitcher_1.EthApi(this.config.eth.netId, this.config.eth.endpoints); @@ -139,7 +139,7 @@ var EthOracle = /** @class */ (function () { case 3: receipt = _a.sent(); if (!receipt) return [3 /*break*/, 7]; - overConfs = receipt.confirmations - this.DEFAULT_BLOCKS_TO_WAIT; + overConfs = receipt.confirmations - this.blocksToWait; if (!(overConfs > 0)) return [3 /*break*/, 6]; ep = this.eth_api.getEndpoint(); validators.add(ep); @@ -524,40 +524,44 @@ var EthOracle = /** @class */ (function () { * @param start_ref Block number to start from. String 'latest' to start from the latest block in block number file * @param trxBroadcast False if transactions should not be broadcasted (not submitted to the block chain) */ - EthOracle.prototype.run = function (start_ref, trxBroadcast) { + EthOracle.prototype.run = function (start_ref, trxBroadcast, waitCycle) { if (trxBroadcast === void 0) { trxBroadcast = true; } + if (waitCycle === void 0) { waitCycle = 30; } return __awaiter(this, void 0, void 0, function () { - var from_block, latest_block, err_1, to_block, e_6; + var from_block, latest_block, err_1, to_block, e_6, e_7; return __generator(this, function (_a) { switch (_a.label) { case 0: this.running = true; - return [4 /*yield*/, this.eth_api.nextEndpoint()]; + _a.label = 1; case 1: - _a.sent(); - return [4 /*yield*/, this.eos_api.nextEndpoint()]; + _a.trys.push([1, 27, , 28]); + return [4 /*yield*/, this.eth_api.nextEndpoint()]; case 2: _a.sent(); - _a.label = 3; + return [4 /*yield*/, this.eos_api.nextEndpoint()]; case 3: - if (!this.running) return [3 /*break*/, 24]; + _a.sent(); _a.label = 4; case 4: - _a.trys.push([4, 20, , 22]); - return [4 /*yield*/, this.getLatestBlock()]; + if (!this.running) return [3 /*break*/, 26]; + _a.label = 5; case 5: + _a.trys.push([5, 22, , 24]); + return [4 /*yield*/, this.getLatestBlock()]; + case 6: latest_block = _a.sent(); if (typeof latest_block != 'number') { console.error('Latest block number is not a number', latest_block); return [2 /*return*/]; } - if (!!from_block) return [3 /*break*/, 11]; - if (!(start_ref === 'latest')) return [3 /*break*/, 10]; - _a.label = 6; - case 6: - _a.trys.push([6, 8, , 9]); - return [4 /*yield*/, EthOracle.load_block_number_from_file(this.blocks_file_name)]; + if (!!from_block) return [3 /*break*/, 12]; + if (!(start_ref === 'latest')) return [3 /*break*/, 11]; + _a.label = 7; case 7: + _a.trys.push([7, 9, , 10]); + return [4 /*yield*/, EthOracle.load_block_number_from_file(this.blocks_file_name)]; + case 8: from_block = _a.sent(); from_block -= 50; // for fresh start go back 50 blocks if (this.config.eth.genesisBlock && this.config.eth.genesisBlock > from_block) { @@ -567,8 +571,8 @@ var EthOracle = /** @class */ (function () { else { console.log("Starting from saved block with additional previous 50 blocks for safety: ".concat(from_block, ".")); } - return [3 /*break*/, 9]; - case 8: + return [3 /*break*/, 10]; + case 9: err_1 = _a.sent(); console.log('Could not get block from file and it was not specified ❌'); if (this.config.eth.genesisBlock) { @@ -579,66 +583,73 @@ var EthOracle = /** @class */ (function () { from_block = latest_block - 100; // go back 100 blocks from latest console.log('Start 100 blocks before the latest block.'); } - return [3 /*break*/, 9]; - case 9: return [3 /*break*/, 11]; - case 10: + return [3 /*break*/, 10]; + case 10: return [3 /*break*/, 12]; + case 11: if (typeof start_ref === 'number') { from_block = start_ref; } else { from_block = this.config.eth.genesisBlock; } - _a.label = 11; - case 11: + _a.label = 12; + case 12: if (from_block < 0) { from_block = 0; } to_block = Math.min(from_block + 100, latest_block); - if (!(start_ref >= latest_block)) return [3 /*break*/, 13]; - console.log("Up to date at block ".concat(to_block)); - return [4 /*yield*/, sleep(10000)]; - case 12: - _a.sent(); - _a.label = 13; - case 13: + if (!(from_block <= to_block)) return [3 /*break*/, 16]; console.log("Getting events from block ".concat(from_block, " to ").concat(to_block)); return [4 /*yield*/, this.process_claimed(from_block, to_block, trxBroadcast)]; - case 14: + case 13: _a.sent(); return [4 /*yield*/, this.process_teleported(from_block, to_block, trxBroadcast)]; - case 15: + case 14: _a.sent(); - from_block = to_block; - // Save last block received - return [4 /*yield*/, EthOracle.save_block_to_file(to_block, this.blocks_file_name)]; + from_block = to_block; // In next round the current to block is the from block + return [4 /*yield*/, EthOracle.save_block_to_file(to_block, this.blocks_file_name)]; // Save last block received + case 15: + _a.sent(); // Save last block received + return [3 /*break*/, 18]; case 16: - // Save last block received - _a.sent(); - if (!(latest_block - from_block <= 1000)) return [3 /*break*/, 18]; - return [4 /*yield*/, EthOracle.WaitWithAnimation(30, 'Wait for new blocks...')]; + console.log("\u26A1\uFE0F From block ".concat(from_block, " is higher than to block ").concat(to_block)); + return [4 /*yield*/, sleep(10000)]; case 17: _a.sent(); - return [3 /*break*/, 19]; + _a.label = 18; case 18: - console.log("Latest block is ".concat(latest_block, ". Not waiting...")); - _a.label = 19; - case 19: return [3 /*break*/, 22]; + if (!(latest_block - from_block <= 1000)) return [3 /*break*/, 20]; + return [4 /*yield*/, EthOracle.WaitWithAnimation(waitCycle, 'Wait for new blocks...')]; + case 19: + _a.sent(); + return [3 /*break*/, 21]; case 20: + console.log("Latest block is ".concat(latest_block, ". Not waiting...")); + _a.label = 21; + case 21: return [3 /*break*/, 24]; + case 22: e_6 = _a.sent(); console.error('⚡️ ' + e_6.message); console.error('Try again in 5 seconds'); return [4 /*yield*/, sleep(5000)]; - case 21: + case 23: _a.sent(); - return [3 /*break*/, 22]; - case 22: + return [3 /*break*/, 24]; + case 24: // Select the next endpoint to distribute the requests return [4 /*yield*/, this.eos_api.nextEndpoint()]; - case 23: + case 25: // Select the next endpoint to distribute the requests _a.sent(); - return [3 /*break*/, 3]; - case 24: return [2 /*return*/]; + return [3 /*break*/, 4]; + case 26: return [3 /*break*/, 28]; + case 27: + e_7 = _a.sent(); + console.error('⚡️ ' + e_7); + return [3 /*break*/, 28]; + case 28: + console.log('Thread closed 💀'); + return [2 /*return*/]; } }); }); @@ -648,7 +659,7 @@ var EthOracle = /** @class */ (function () { * @param s Seconds to wait */ EthOracle.WaitWithAnimation = function (s, info) { - if (info === void 0) { info = ""; } + if (info === void 0) { info = ''; } return __awaiter(this, void 0, void 0, function () { var i; return __generator(this, function (_a) { @@ -676,6 +687,7 @@ var EthOracle = /** @class */ (function () { }); }); }; + EthOracle.MIN_BLOCKS_TO_WAIT = 5; return EthOracle; }()); // Handle params from console @@ -684,6 +696,11 @@ var argv = yargs_1.default .option('block', { alias: 'b', description: 'Block number to start scanning from', +}) + .option('waiter', { + alias: 'w', + description: 'Seconds to wait after finishing all current teleports', + type: 'number' }) .option('config', { alias: 'c', @@ -718,8 +735,15 @@ if (configFile.eos.epVerifications > configFile.eos.endpoints.length) { console.error('Error: epVerifications cannot be greater than given amount of endpoints'); process.exit(1); } +var waitCycle = undefined; +if (typeof configFile.eth.waitCycle == 'number') { + waitCycle = configFile.eth.waitCycle; +} +if (argv.waiter) { + waitCycle = argv.waiter; +} // Set up the oracle var eosSigProvider = new eosjs_jssig_1.JsSignatureProvider([configFile.eos.privateKey]); var ethOracle = new EthOracle(configFile, eosSigProvider); // Run the process -ethOracle.run(startRef, argv.broadcast); +ethOracle.run(startRef, argv.broadcast, waitCycle); diff --git a/oracle/oracle-eth.ts b/oracle/oracle-eth.ts index 83f7b32..62221ba 100755 --- a/oracle/oracle-eth.ts +++ b/oracle/oracle-eth.ts @@ -8,7 +8,7 @@ When an event is received, it will call the `received` action on the EOS chain import fs from 'fs' import { ethers } from 'ethers' -import yargs from 'yargs' +import yargs, { number } from 'yargs' import { ConfigType, eosio_claim_data, eosio_teleport_data } from './CommonTypes' import { JsSignatureProvider } from 'eosjs/dist/eosjs-jssig' import { EosApi, EthApi } from './EndpointSwitcher' @@ -30,13 +30,15 @@ class EthOracle { public running = false private claimed_topic = '0xf20fc6923b8057dd0c3b606483fcaa038229bb36ebc35a0040e3eaa39cf97b17' private teleport_topic = '0x622824274e0937ee319b036740cd0887131781bc2032b47eac3e88a1be17f5d5' - private DEFAULT_BLOCKS_TO_WAIT = 5 + static MIN_BLOCKS_TO_WAIT = 5 + private blocksToWait : number private blocks_file_name : string private eos_api: EosApi private eth_api: EthApi private minTrySend = 3 constructor(private config: ConfigType, private signatureProvider: JsSignatureProvider){ + this.blocksToWait = typeof config.eth.blocksToWait == 'number' && config.eth.blocksToWait > EthOracle.MIN_BLOCKS_TO_WAIT? config.eth.blocksToWait : EthOracle.MIN_BLOCKS_TO_WAIT this.blocks_file_name = `.oracle_${configFile.eth.network}_block-${configFile.eth.oracleAccount}` this.eos_api = new EosApi(this.config.eos.netId, this.config.eos.endpoints, this.signatureProvider) this.eth_api = new EthApi(this.config.eth.netId, this.config.eth.endpoints) @@ -96,7 +98,8 @@ class EthOracle { const receipt = await this.eth_api.getProvider().getTransactionReceipt(entry.transactionHash) if(receipt){ - const overConfs = receipt.confirmations - this.DEFAULT_BLOCKS_TO_WAIT + // CHeck amount of block confirmations + const overConfs = receipt.confirmations - this.blocksToWait if (overConfs > 0) { let ep = this.eth_api.getEndpoint() validators.add(ep) @@ -335,7 +338,7 @@ class EthOracle { let tries = 0 while(true) { try{ - const block = await this.eth_api.getProvider().getBlock('latest') + const block = await this.eth_api.getProvider().getBlock('latest') return block.number } catch(e){ if(tries >= this.eth_api.get_EndpointAmount()){ @@ -357,100 +360,103 @@ class EthOracle { * @param start_ref Block number to start from. String 'latest' to start from the latest block in block number file * @param trxBroadcast False if transactions should not be broadcasted (not submitted to the block chain) */ - async run(start_ref: 'latest' | number, trxBroadcast: boolean = true){ + async run(start_ref: 'latest' | number, trxBroadcast: boolean = true, waitCycle = 30){ let from_block: number | undefined this.running = true - await this.eth_api.nextEndpoint() - await this.eos_api.nextEndpoint() - - while (this.running) { - try { - // Get latest block from chain - const latest_block = await this.getLatestBlock() - if(typeof latest_block != 'number'){ - console.error('Latest block number is not a number', latest_block) - return - } + try{ + await this.eth_api.nextEndpoint() + await this.eos_api.nextEndpoint() + + while (this.running) { + try { + // Get latest block from chain + const latest_block = await this.getLatestBlock() + if(typeof latest_block != 'number'){ + console.error('Latest block number is not a number', latest_block) + return + } - // Get block number to start from - if (!from_block) { - if (start_ref === 'latest') { - try { - from_block = await EthOracle.load_block_number_from_file(this.blocks_file_name) - from_block -= 50 // for fresh start go back 50 blocks - if(this.config.eth.genesisBlock && this.config.eth.genesisBlock > from_block){ - from_block = this.config.eth.genesisBlock - console.log('Start by genesis block.') - } else { - console.log(`Starting from saved block with additional previous 50 blocks for safety: ${from_block}.`) - } - } catch (err) { - console.log('Could not get block from file and it was not specified ❌') - if(this.config.eth.genesisBlock){ - from_block = this.config.eth.genesisBlock - console.log('Start by genesis block.') - } else { - from_block = latest_block - 100 // go back 100 blocks from latest - console.log('Start 100 blocks before the latest block.') + // Get block number to start from on this cycle + if (!from_block) { + if (start_ref === 'latest') { + try { + from_block = await EthOracle.load_block_number_from_file(this.blocks_file_name) + from_block -= 50 // for fresh start go back 50 blocks + if(this.config.eth.genesisBlock && this.config.eth.genesisBlock > from_block){ + from_block = this.config.eth.genesisBlock + console.log('Start by genesis block.') + } else { + console.log(`Starting from saved block with additional previous 50 blocks for safety: ${from_block}.`) + } + } catch (err) { + console.log('Could not get block from file and it was not specified ❌') + if(this.config.eth.genesisBlock){ + from_block = this.config.eth.genesisBlock + console.log('Start by genesis block.') + } else { + from_block = latest_block - 100 // go back 100 blocks from latest + console.log('Start 100 blocks before the latest block.') + } } + } else if (typeof start_ref === 'number') { + from_block = start_ref + } else { + from_block = this.config.eth.genesisBlock } - } else if (typeof start_ref === 'number') { - from_block = start_ref - } else { - from_block = this.config.eth.genesisBlock } - } - if(from_block < 0){ - from_block = 0 - } - - let to_block = Math.min(from_block + 100, latest_block) - - if (start_ref >= latest_block) { - console.log(`Up to date at block ${to_block}`) - await sleep(10000) - } - console.log(`Getting events from block ${from_block} to ${to_block}`) - - await this.process_claimed(from_block, to_block, trxBroadcast) - await this.process_teleported(from_block, to_block, trxBroadcast) + if(from_block < 0){ + from_block = 0 + } - from_block = to_block + // Get the last block number until teleports should be checked on this cycle + let to_block = Math.min(from_block + 100, latest_block) - // Save last block received - await EthOracle.save_block_to_file(to_block, this.blocks_file_name) + if (from_block <= to_block) { + console.log(`Getting events from block ${from_block} to ${to_block}`) + await this.process_claimed(from_block, to_block, trxBroadcast) + await this.process_teleported(from_block, to_block, trxBroadcast) + from_block = to_block // In next round the current to block is the from block + await EthOracle.save_block_to_file(to_block, this.blocks_file_name) // Save last block received + } else { + console.log(`⚡️ From block ${from_block} is higher than to block ${to_block}`) + await sleep(10000) + } + if (latest_block - from_block <= 1000) { + await EthOracle.WaitWithAnimation(waitCycle, 'Wait for new blocks...') + } else { + console.log(`Latest block is ${latest_block}. Not waiting...`) + } + } catch (e: any) { + console.error('⚡️ ' + e.message) - if (latest_block - from_block <= 1000) { - await EthOracle.WaitWithAnimation(30, 'Wait for new blocks...') - } else { - console.log(`Latest block is ${latest_block}. Not waiting...`) + console.error('Try again in 5 seconds') + await sleep(5000) } - } catch (e: any) { - console.error('⚡️ ' + e.message) - console.error('Try again in 5 seconds') - await sleep(5000) + // Select the next endpoint to distribute the requests + await this.eos_api.nextEndpoint() } - // Select the next endpoint to distribute the requests - await this.eos_api.nextEndpoint() + } catch(e){ + console.error('⚡️ ' + e) } + console.log('Thread closed 💀'); } /** * Wait for a defined amount of time and show remaining seconds * @param s Seconds to wait */ - static async WaitWithAnimation(s: number, info: string = ""){ - process.stdout.write(info + "\n\x1b[?25l") - for(let i = 0; i < s; i++){ - process.stdout.write(`💤 ${i} s / ${s} s 💤`) - await sleep(1000) - process.stdout.write("\r\x1b[K") - } - - process.stdout.moveCursor(0, -1) // up one line - process.stdout.clearLine(1) // from cursor to end + static async WaitWithAnimation(s: number, info: string = ''){ + process.stdout.write(info + "\n\x1b[?25l") + for(let i = 0; i < s; i++){ + process.stdout.write(`💤 ${i} s / ${s} s 💤`) + await sleep(1000) + process.stdout.write("\r\x1b[K") } + + process.stdout.moveCursor(0, -1) // up one line + process.stdout.clearLine(1) // from cursor to end + } } // Handle params from console @@ -460,6 +466,11 @@ const argv = yargs alias: 'b', description: 'Block number to start scanning from', }) + .option('waiter', { + alias: 'w', + description: 'Seconds to wait after finishing all current teleports', + type: 'number' + }) .option('config', { alias: 'c', description: 'Path of config file', @@ -473,6 +484,7 @@ const argv = yargs }) .help().alias('help', 'h').argv as { block: number, + waiter: number, config: string, broadcast: boolean, } @@ -498,10 +510,17 @@ if(configFile.eos.epVerifications > configFile.eos.endpoints.length){ console.error('Error: epVerifications cannot be greater than given amount of endpoints') process.exit(1) } +let waitCycle : undefined | number = undefined +if(typeof configFile.eth.waitCycle == 'number'){ + waitCycle = configFile.eth.waitCycle +} +if(argv.waiter) { + waitCycle = argv.waiter +} // Set up the oracle const eosSigProvider = new JsSignatureProvider([configFile.eos.privateKey]) const ethOracle = new EthOracle(configFile, eosSigProvider) - // Run the process -ethOracle.run(startRef, argv.broadcast) \ No newline at end of file +ethOracle.run(startRef, argv.broadcast, waitCycle) + diff --git a/oracle/package.json b/oracle/package.json index 016376e..024d71f 100644 --- a/oracle/package.json +++ b/oracle/package.json @@ -27,6 +27,6 @@ "@types/ethereumjs-util": "^6.1.0", "@types/text-encoding": "0.0.36", "@types/yargs": "^17.0.10", - "typescript": "^4.6.3" + "typescript": "^4.7.2" } } diff --git a/oracle/yarn.lock b/oracle/yarn.lock deleted file mode 100644 index ea3f962..0000000 --- a/oracle/yarn.lock +++ /dev/null @@ -1,3271 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@eosdacio/eosio-statereceiver@^1.0.2": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@eosdacio/eosio-statereceiver/-/eosio-statereceiver-1.1.1.tgz#656abf8e3f8dbad70eb622515ceca7d0a706102c" - integrity sha512-dfpScXUdJjQ5yHSDdtlHwNQiK7nS8jLAQ+Ofto+bvLyY8a0rfE0tHF2m5kkwNB0uktvPa0FnkSDzIyF8K4yNxw== - dependencies: - eosjs "^21.0.3" - text-encoding "^0.7.0" - ws "^6.1.3" - zlib "^1.0.5" - -"@ethereumjs/common@^2.5.0", "@ethereumjs/common@^2.6.3": - version "2.6.4" - resolved "https://registry.yarnpkg.com/@ethereumjs/common/-/common-2.6.4.tgz#1b3cdd3aa4ee3b0ca366756fc35e4a03022a01cc" - integrity sha512-RDJh/R/EAr+B7ZRg5LfJ0BIpf/1LydFgYdvZEuTraojCbVypO2sQ+QnpP5u2wJf9DASyooKqu8O4FJEWUV6NXw== - dependencies: - crc-32 "^1.2.0" - ethereumjs-util "^7.1.4" - -"@ethereumjs/tx@^3.3.2": - version "3.5.1" - resolved "https://registry.yarnpkg.com/@ethereumjs/tx/-/tx-3.5.1.tgz#8d941b83a602b4a89949c879615f7ea9a90e6671" - integrity sha512-xzDrTiu4sqZXUcaBxJ4n4W5FrppwxLxZB4ZDGVLtxSQR4lVuOnFR6RcUHdg1mpUhAPVrmnzLJpxaeXnPxIyhWA== - dependencies: - "@ethereumjs/common" "^2.6.3" - ethereumjs-util "^7.1.4" - -"@ethersproject/abi@5.0.7": - version "5.0.7" - resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.0.7.tgz#79e52452bd3ca2956d0e1c964207a58ad1a0ee7b" - integrity sha512-Cqktk+hSIckwP/W8O47Eef60VwmoSC/L3lY0+dIBhQPCNn9E4V7rwmm2aFrNRRDJfFlGuZ1khkQUOc3oBX+niw== - dependencies: - "@ethersproject/address" "^5.0.4" - "@ethersproject/bignumber" "^5.0.7" - "@ethersproject/bytes" "^5.0.4" - "@ethersproject/constants" "^5.0.4" - "@ethersproject/hash" "^5.0.4" - "@ethersproject/keccak256" "^5.0.3" - "@ethersproject/logger" "^5.0.5" - "@ethersproject/properties" "^5.0.3" - "@ethersproject/strings" "^5.0.4" - -"@ethersproject/abi@5.6.1", "@ethersproject/abi@^5.6.0": - version "5.6.1" - resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.6.1.tgz#f7de888edeb56b0a657b672bdd1b3a1135cd14f7" - integrity sha512-0cqssYh6FXjlwKWBmLm3+zH2BNARoS5u/hxbz+LpQmcDB3w0W553h2btWui1/uZp2GBM/SI3KniTuMcYyHpA5w== - dependencies: - "@ethersproject/address" "^5.6.0" - "@ethersproject/bignumber" "^5.6.0" - "@ethersproject/bytes" "^5.6.0" - "@ethersproject/constants" "^5.6.0" - "@ethersproject/hash" "^5.6.0" - "@ethersproject/keccak256" "^5.6.0" - "@ethersproject/logger" "^5.6.0" - "@ethersproject/properties" "^5.6.0" - "@ethersproject/strings" "^5.6.0" - -"@ethersproject/abstract-provider@5.6.0", "@ethersproject/abstract-provider@^5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.6.0.tgz#0c4ac7054650dbd9c476cf5907f588bbb6ef3061" - integrity sha512-oPMFlKLN+g+y7a79cLK3WiLcjWFnZQtXWgnLAbHZcN3s7L4v90UHpTOrLk+m3yr0gt+/h9STTM6zrr7PM8uoRw== - dependencies: - "@ethersproject/bignumber" "^5.6.0" - "@ethersproject/bytes" "^5.6.0" - "@ethersproject/logger" "^5.6.0" - "@ethersproject/networks" "^5.6.0" - "@ethersproject/properties" "^5.6.0" - "@ethersproject/transactions" "^5.6.0" - "@ethersproject/web" "^5.6.0" - -"@ethersproject/abstract-signer@5.6.0", "@ethersproject/abstract-signer@^5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.6.0.tgz#9cd7ae9211c2b123a3b29bf47aab17d4d016e3e7" - integrity sha512-WOqnG0NJKtI8n0wWZPReHtaLkDByPL67tn4nBaDAhmVq8sjHTPbCdz4DRhVu/cfTOvfy9w3iq5QZ7BX7zw56BQ== - dependencies: - "@ethersproject/abstract-provider" "^5.6.0" - "@ethersproject/bignumber" "^5.6.0" - "@ethersproject/bytes" "^5.6.0" - "@ethersproject/logger" "^5.6.0" - "@ethersproject/properties" "^5.6.0" - -"@ethersproject/address@5.6.0", "@ethersproject/address@^5.0.4", "@ethersproject/address@^5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.6.0.tgz#13c49836d73e7885fc148ad633afad729da25012" - integrity sha512-6nvhYXjbXsHPS+30sHZ+U4VMagFC/9zAk6Gd/h3S21YW4+yfb0WfRtaAIZ4kfM4rrVwqiy284LP0GtL5HXGLxQ== - dependencies: - "@ethersproject/bignumber" "^5.6.0" - "@ethersproject/bytes" "^5.6.0" - "@ethersproject/keccak256" "^5.6.0" - "@ethersproject/logger" "^5.6.0" - "@ethersproject/rlp" "^5.6.0" - -"@ethersproject/base64@5.6.0", "@ethersproject/base64@^5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.6.0.tgz#a12c4da2a6fb86d88563216b0282308fc15907c9" - integrity sha512-2Neq8wxJ9xHxCF9TUgmKeSh9BXJ6OAxWfeGWvbauPh8FuHEjamgHilllx8KkSd5ErxyHIX7Xv3Fkcud2kY9ezw== - dependencies: - "@ethersproject/bytes" "^5.6.0" - -"@ethersproject/basex@5.6.0", "@ethersproject/basex@^5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.6.0.tgz#9ea7209bf0a1c3ddc2a90f180c3a7f0d7d2e8a69" - integrity sha512-qN4T+hQd/Md32MoJpc69rOwLYRUXwjTlhHDIeUkUmiN/JyWkkLLMoG0TqvSQKNqZOMgN5stbUYN6ILC+eD7MEQ== - dependencies: - "@ethersproject/bytes" "^5.6.0" - "@ethersproject/properties" "^5.6.0" - -"@ethersproject/bignumber@5.6.0", "@ethersproject/bignumber@^5.0.7", "@ethersproject/bignumber@^5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.6.0.tgz#116c81b075c57fa765a8f3822648cf718a8a0e26" - integrity sha512-VziMaXIUHQlHJmkv1dlcd6GY2PmT0khtAqaMctCIDogxkrarMzA9L94KN1NeXqqOfFD6r0sJT3vCTOFSmZ07DA== - dependencies: - "@ethersproject/bytes" "^5.6.0" - "@ethersproject/logger" "^5.6.0" - bn.js "^4.11.9" - -"@ethersproject/bytes@5.6.1", "@ethersproject/bytes@^5.0.4", "@ethersproject/bytes@^5.6.0": - version "5.6.1" - resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.6.1.tgz#24f916e411f82a8a60412344bf4a813b917eefe7" - integrity sha512-NwQt7cKn5+ZE4uDn+X5RAXLp46E1chXoaMmrxAyA0rblpxz8t58lVkrHXoRIn0lz1joQElQ8410GqhTqMOwc6g== - dependencies: - "@ethersproject/logger" "^5.6.0" - -"@ethersproject/constants@5.6.0", "@ethersproject/constants@^5.0.4", "@ethersproject/constants@^5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.6.0.tgz#55e3eb0918584d3acc0688e9958b0cedef297088" - integrity sha512-SrdaJx2bK0WQl23nSpV/b1aq293Lh0sUaZT/yYKPDKn4tlAbkH96SPJwIhwSwTsoQQZxuh1jnqsKwyymoiBdWA== - dependencies: - "@ethersproject/bignumber" "^5.6.0" - -"@ethersproject/contracts@5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.6.0.tgz#60f2cfc7addd99a865c6c8cfbbcec76297386067" - integrity sha512-74Ge7iqTDom0NX+mux8KbRUeJgu1eHZ3iv6utv++sLJG80FVuU9HnHeKVPfjd9s3woFhaFoQGf3B3iH/FrQmgw== - dependencies: - "@ethersproject/abi" "^5.6.0" - "@ethersproject/abstract-provider" "^5.6.0" - "@ethersproject/abstract-signer" "^5.6.0" - "@ethersproject/address" "^5.6.0" - "@ethersproject/bignumber" "^5.6.0" - "@ethersproject/bytes" "^5.6.0" - "@ethersproject/constants" "^5.6.0" - "@ethersproject/logger" "^5.6.0" - "@ethersproject/properties" "^5.6.0" - "@ethersproject/transactions" "^5.6.0" - -"@ethersproject/hash@5.6.0", "@ethersproject/hash@^5.0.4", "@ethersproject/hash@^5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.6.0.tgz#d24446a5263e02492f9808baa99b6e2b4c3429a2" - integrity sha512-fFd+k9gtczqlr0/BruWLAu7UAOas1uRRJvOR84uDf4lNZ+bTkGl366qvniUZHKtlqxBRU65MkOobkmvmpHU+jA== - dependencies: - "@ethersproject/abstract-signer" "^5.6.0" - "@ethersproject/address" "^5.6.0" - "@ethersproject/bignumber" "^5.6.0" - "@ethersproject/bytes" "^5.6.0" - "@ethersproject/keccak256" "^5.6.0" - "@ethersproject/logger" "^5.6.0" - "@ethersproject/properties" "^5.6.0" - "@ethersproject/strings" "^5.6.0" - -"@ethersproject/hdnode@5.6.0", "@ethersproject/hdnode@^5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.6.0.tgz#9dcbe8d629bbbcf144f2cae476337fe92d320998" - integrity sha512-61g3Jp3nwDqJcL/p4nugSyLrpl/+ChXIOtCEM8UDmWeB3JCAt5FoLdOMXQc3WWkc0oM2C0aAn6GFqqMcS/mHTw== - dependencies: - "@ethersproject/abstract-signer" "^5.6.0" - "@ethersproject/basex" "^5.6.0" - "@ethersproject/bignumber" "^5.6.0" - "@ethersproject/bytes" "^5.6.0" - "@ethersproject/logger" "^5.6.0" - "@ethersproject/pbkdf2" "^5.6.0" - "@ethersproject/properties" "^5.6.0" - "@ethersproject/sha2" "^5.6.0" - "@ethersproject/signing-key" "^5.6.0" - "@ethersproject/strings" "^5.6.0" - "@ethersproject/transactions" "^5.6.0" - "@ethersproject/wordlists" "^5.6.0" - -"@ethersproject/json-wallets@5.6.0", "@ethersproject/json-wallets@^5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/json-wallets/-/json-wallets-5.6.0.tgz#4c2fc27f17e36c583e7a252fb938bc46f98891e5" - integrity sha512-fmh86jViB9r0ibWXTQipxpAGMiuxoqUf78oqJDlCAJXgnJF024hOOX7qVgqsjtbeoxmcLwpPsXNU0WEe/16qPQ== - dependencies: - "@ethersproject/abstract-signer" "^5.6.0" - "@ethersproject/address" "^5.6.0" - "@ethersproject/bytes" "^5.6.0" - "@ethersproject/hdnode" "^5.6.0" - "@ethersproject/keccak256" "^5.6.0" - "@ethersproject/logger" "^5.6.0" - "@ethersproject/pbkdf2" "^5.6.0" - "@ethersproject/properties" "^5.6.0" - "@ethersproject/random" "^5.6.0" - "@ethersproject/strings" "^5.6.0" - "@ethersproject/transactions" "^5.6.0" - aes-js "3.0.0" - scrypt-js "3.0.1" - -"@ethersproject/keccak256@5.6.0", "@ethersproject/keccak256@^5.0.3", "@ethersproject/keccak256@^5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.6.0.tgz#fea4bb47dbf8f131c2e1774a1cecbfeb9d606459" - integrity sha512-tk56BJ96mdj/ksi7HWZVWGjCq0WVl/QvfhFQNeL8fxhBlGoP+L80uDCiQcpJPd+2XxkivS3lwRm3E0CXTfol0w== - dependencies: - "@ethersproject/bytes" "^5.6.0" - js-sha3 "0.8.0" - -"@ethersproject/logger@5.6.0", "@ethersproject/logger@^5.0.5", "@ethersproject/logger@^5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.6.0.tgz#d7db1bfcc22fd2e4ab574cba0bb6ad779a9a3e7a" - integrity sha512-BiBWllUROH9w+P21RzoxJKzqoqpkyM1pRnEKG69bulE9TSQD8SAIvTQqIMZmmCO8pUNkgLP1wndX1gKghSpBmg== - -"@ethersproject/networks@5.6.2", "@ethersproject/networks@^5.6.0": - version "5.6.2" - resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.6.2.tgz#2bacda62102c0b1fcee408315f2bed4f6fbdf336" - integrity sha512-9uEzaJY7j5wpYGTojGp8U89mSsgQLc40PCMJLMCnFXTs7nhBveZ0t7dbqWUNrepWTszDbFkYD6WlL8DKx5huHA== - dependencies: - "@ethersproject/logger" "^5.6.0" - -"@ethersproject/pbkdf2@5.6.0", "@ethersproject/pbkdf2@^5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.6.0.tgz#04fcc2d7c6bff88393f5b4237d906a192426685a" - integrity sha512-Wu1AxTgJo3T3H6MIu/eejLFok9TYoSdgwRr5oGY1LTLfmGesDoSx05pemsbrPT2gG4cQME+baTSCp5sEo2erZQ== - dependencies: - "@ethersproject/bytes" "^5.6.0" - "@ethersproject/sha2" "^5.6.0" - -"@ethersproject/properties@5.6.0", "@ethersproject/properties@^5.0.3", "@ethersproject/properties@^5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.6.0.tgz#38904651713bc6bdd5bdd1b0a4287ecda920fa04" - integrity sha512-szoOkHskajKePTJSZ46uHUWWkbv7TzP2ypdEK6jGMqJaEt2sb0jCgfBo0gH0m2HBpRixMuJ6TBRaQCF7a9DoCg== - dependencies: - "@ethersproject/logger" "^5.6.0" - -"@ethersproject/providers@5.6.5": - version "5.6.5" - resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.6.5.tgz#aefecf78459817a323452e05a16d56afcf807e27" - integrity sha512-TRS+c2Ud+cMpWodmGAc9xbnYRPWzRNYt2zkCSnj58nJoamBQ6x4cUbBeo0lTC3y+6RDVIBeJv18OqsDbSktLVg== - dependencies: - "@ethersproject/abstract-provider" "^5.6.0" - "@ethersproject/abstract-signer" "^5.6.0" - "@ethersproject/address" "^5.6.0" - "@ethersproject/basex" "^5.6.0" - "@ethersproject/bignumber" "^5.6.0" - "@ethersproject/bytes" "^5.6.0" - "@ethersproject/constants" "^5.6.0" - "@ethersproject/hash" "^5.6.0" - "@ethersproject/logger" "^5.6.0" - "@ethersproject/networks" "^5.6.0" - "@ethersproject/properties" "^5.6.0" - "@ethersproject/random" "^5.6.0" - "@ethersproject/rlp" "^5.6.0" - "@ethersproject/sha2" "^5.6.0" - "@ethersproject/strings" "^5.6.0" - "@ethersproject/transactions" "^5.6.0" - "@ethersproject/web" "^5.6.0" - bech32 "1.1.4" - ws "7.4.6" - -"@ethersproject/random@5.6.0", "@ethersproject/random@^5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.6.0.tgz#1505d1ab6a250e0ee92f436850fa3314b2cb5ae6" - integrity sha512-si0PLcLjq+NG/XHSZz90asNf+YfKEqJGVdxoEkSukzbnBgC8rydbgbUgBbBGLeHN4kAJwUFEKsu3sCXT93YMsw== - dependencies: - "@ethersproject/bytes" "^5.6.0" - "@ethersproject/logger" "^5.6.0" - -"@ethersproject/rlp@5.6.0", "@ethersproject/rlp@^5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.6.0.tgz#55a7be01c6f5e64d6e6e7edb6061aa120962a717" - integrity sha512-dz9WR1xpcTL+9DtOT/aDO+YyxSSdO8YIS0jyZwHHSlAmnxA6cKU3TrTd4Xc/bHayctxTgGLYNuVVoiXE4tTq1g== - dependencies: - "@ethersproject/bytes" "^5.6.0" - "@ethersproject/logger" "^5.6.0" - -"@ethersproject/sha2@5.6.0", "@ethersproject/sha2@^5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.6.0.tgz#364c4c11cc753bda36f31f001628706ebadb64d9" - integrity sha512-1tNWCPFLu1n3JM9t4/kytz35DkuF9MxqkGGEHNauEbaARdm2fafnOyw1s0tIQDPKF/7bkP1u3dbrmjpn5CelyA== - dependencies: - "@ethersproject/bytes" "^5.6.0" - "@ethersproject/logger" "^5.6.0" - hash.js "1.1.7" - -"@ethersproject/signing-key@5.6.1", "@ethersproject/signing-key@^5.6.0": - version "5.6.1" - resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.6.1.tgz#31b0a531520616254eb0465b9443e49515c4d457" - integrity sha512-XvqQ20DH0D+bS3qlrrgh+axRMth5kD1xuvqUQUTeezxUTXBOeR6hWz2/C6FBEu39FRytyybIWrYf7YLSAKr1LQ== - dependencies: - "@ethersproject/bytes" "^5.6.0" - "@ethersproject/logger" "^5.6.0" - "@ethersproject/properties" "^5.6.0" - bn.js "^4.11.9" - elliptic "6.5.4" - hash.js "1.1.7" - -"@ethersproject/solidity@5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.6.0.tgz#64657362a596bf7f5630bdc921c07dd78df06dc3" - integrity sha512-YwF52vTNd50kjDzqKaoNNbC/r9kMDPq3YzDWmsjFTRBcIF1y4JCQJ8gB30wsTfHbaxgxelI5BfxQSxD/PbJOww== - dependencies: - "@ethersproject/bignumber" "^5.6.0" - "@ethersproject/bytes" "^5.6.0" - "@ethersproject/keccak256" "^5.6.0" - "@ethersproject/logger" "^5.6.0" - "@ethersproject/sha2" "^5.6.0" - "@ethersproject/strings" "^5.6.0" - -"@ethersproject/strings@5.6.0", "@ethersproject/strings@^5.0.4", "@ethersproject/strings@^5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.6.0.tgz#9891b26709153d996bf1303d39a7f4bc047878fd" - integrity sha512-uv10vTtLTZqrJuqBZR862ZQjTIa724wGPWQqZrofaPI/kUsf53TBG0I0D+hQ1qyNtllbNzaW+PDPHHUI6/65Mg== - dependencies: - "@ethersproject/bytes" "^5.6.0" - "@ethersproject/constants" "^5.6.0" - "@ethersproject/logger" "^5.6.0" - -"@ethersproject/transactions@5.6.0", "@ethersproject/transactions@^5.0.0-beta.135", "@ethersproject/transactions@^5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.6.0.tgz#4b594d73a868ef6e1529a2f8f94a785e6791ae4e" - integrity sha512-4HX+VOhNjXHZyGzER6E/LVI2i6lf9ejYeWD6l4g50AdmimyuStKc39kvKf1bXWQMg7QNVh+uC7dYwtaZ02IXeg== - dependencies: - "@ethersproject/address" "^5.6.0" - "@ethersproject/bignumber" "^5.6.0" - "@ethersproject/bytes" "^5.6.0" - "@ethersproject/constants" "^5.6.0" - "@ethersproject/keccak256" "^5.6.0" - "@ethersproject/logger" "^5.6.0" - "@ethersproject/properties" "^5.6.0" - "@ethersproject/rlp" "^5.6.0" - "@ethersproject/signing-key" "^5.6.0" - -"@ethersproject/units@5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/units/-/units-5.6.0.tgz#e5cbb1906988f5740254a21b9ded6bd51e826d9c" - integrity sha512-tig9x0Qmh8qbo1w8/6tmtyrm/QQRviBh389EQ+d8fP4wDsBrJBf08oZfoiz1/uenKK9M78yAP4PoR7SsVoTjsw== - dependencies: - "@ethersproject/bignumber" "^5.6.0" - "@ethersproject/constants" "^5.6.0" - "@ethersproject/logger" "^5.6.0" - -"@ethersproject/wallet@5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.6.0.tgz#33d11a806d783864208f348709a5a3badac8e22a" - integrity sha512-qMlSdOSTyp0MBeE+r7SUhr1jjDlC1zAXB8VD84hCnpijPQiSNbxr6GdiLXxpUs8UKzkDiNYYC5DRI3MZr+n+tg== - dependencies: - "@ethersproject/abstract-provider" "^5.6.0" - "@ethersproject/abstract-signer" "^5.6.0" - "@ethersproject/address" "^5.6.0" - "@ethersproject/bignumber" "^5.6.0" - "@ethersproject/bytes" "^5.6.0" - "@ethersproject/hash" "^5.6.0" - "@ethersproject/hdnode" "^5.6.0" - "@ethersproject/json-wallets" "^5.6.0" - "@ethersproject/keccak256" "^5.6.0" - "@ethersproject/logger" "^5.6.0" - "@ethersproject/properties" "^5.6.0" - "@ethersproject/random" "^5.6.0" - "@ethersproject/signing-key" "^5.6.0" - "@ethersproject/transactions" "^5.6.0" - "@ethersproject/wordlists" "^5.6.0" - -"@ethersproject/web@5.6.0", "@ethersproject/web@^5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.6.0.tgz#4bf8b3cbc17055027e1a5dd3c357e37474eaaeb8" - integrity sha512-G/XHj0hV1FxI2teHRfCGvfBUHFmU+YOSbCxlAMqJklxSa7QMiHFQfAxvwY2PFqgvdkxEKwRNr/eCjfAPEm2Ctg== - dependencies: - "@ethersproject/base64" "^5.6.0" - "@ethersproject/bytes" "^5.6.0" - "@ethersproject/logger" "^5.6.0" - "@ethersproject/properties" "^5.6.0" - "@ethersproject/strings" "^5.6.0" - -"@ethersproject/wordlists@5.6.0", "@ethersproject/wordlists@^5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.6.0.tgz#79e62c5276e091d8575f6930ba01a29218ded032" - integrity sha512-q0bxNBfIX3fUuAo9OmjlEYxP40IB8ABgb7HjEZCL5IKubzV3j30CWi2rqQbjTS2HfoyQbfINoKcTVWP4ejwR7Q== - dependencies: - "@ethersproject/bytes" "^5.6.0" - "@ethersproject/hash" "^5.6.0" - "@ethersproject/logger" "^5.6.0" - "@ethersproject/properties" "^5.6.0" - "@ethersproject/strings" "^5.6.0" - -"@sindresorhus/is@^0.14.0": - version "0.14.0" - resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" - integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ== - -"@szmarczak/http-timer@^1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421" - integrity sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA== - dependencies: - defer-to-connect "^1.0.1" - -"@types/bn.js@*", "@types/bn.js@^5.1.0": - version "5.1.0" - resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-5.1.0.tgz#32c5d271503a12653c62cf4d2b45e6eab8cebc68" - integrity sha512-QSSVYj7pYFN49kW77o2s9xTCwZ8F2xLbjLLSEVh8D2F4JUhZtPAGOFLTD+ffqksBx/u4cE/KImFjyhqCjn/LIA== - dependencies: - "@types/node" "*" - -"@types/bn.js@^4.11.5": - version "4.11.6" - resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-4.11.6.tgz#c306c70d9358aaea33cd4eda092a742b9505967c" - integrity sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg== - dependencies: - "@types/node" "*" - -"@types/elliptic@^6.4.14": - version "6.4.14" - resolved "https://registry.yarnpkg.com/@types/elliptic/-/elliptic-6.4.14.tgz#7bbaad60567a588c1f08b10893453e6b9b4de48e" - integrity sha512-z4OBcDAU0GVwDTuwJzQCiL6188QvZMkvoERgcVjq0/mPM8jCfdwZ3x5zQEVoL9WCAru3aG5wl3Z5Ww5wBWn7ZQ== - dependencies: - "@types/bn.js" "*" - -"@types/ethereumjs-util@^6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@types/ethereumjs-util/-/ethereumjs-util-6.1.0.tgz#9dabd7302ec9728a7d99be15f4143977c33cd5ac" - integrity sha512-5N0RJldhKCKwDksdnuNHbEJuwO5pjEdtwdHj/kZLxaS84s5R1NLgYfAuDF/VZ4whYABJJvv+o0O8TXLm+F/Byw== - dependencies: - ethereumjs-util "*" - -"@types/node@*": - version "17.0.33" - resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.33.tgz#3c1879b276dc63e73030bb91165e62a4509cd506" - integrity sha512-miWq2m2FiQZmaHfdZNcbpp9PuXg34W5JZ5CrJ/BaS70VuhoJENBEQybeiYSaPBRNq6KQGnjfEnc/F3PN++D+XQ== - -"@types/node@^12.12.6": - version "12.20.52" - resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.52.tgz#2fd2dc6bfa185601b15457398d4ba1ef27f81251" - integrity sha512-cfkwWw72849SNYp3Zx0IcIs25vABmFh73xicxhCkTcvtZQeIez15PpwQN8fY3RD7gv1Wrxlc9MEtfMORZDEsGw== - -"@types/pbkdf2@^3.0.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@types/pbkdf2/-/pbkdf2-3.1.0.tgz#039a0e9b67da0cdc4ee5dab865caa6b267bb66b1" - integrity sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ== - dependencies: - "@types/node" "*" - -"@types/secp256k1@^4.0.1": - version "4.0.3" - resolved "https://registry.yarnpkg.com/@types/secp256k1/-/secp256k1-4.0.3.tgz#1b8e55d8e00f08ee7220b4d59a6abe89c37a901c" - integrity sha512-Da66lEIFeIz9ltsdMZcpQvmrmmoqrfju8pm1BH8WbYjZSwUgCwXLb9C+9XYogwBITnbsSaMdVPb2ekf7TV+03w== - dependencies: - "@types/node" "*" - -"@types/text-encoding@0.0.36": - version "0.0.36" - resolved "https://registry.yarnpkg.com/@types/text-encoding/-/text-encoding-0.0.36.tgz#c1343e35188cb8f8d5f9ada4ff5b72829b29ea19" - integrity sha512-LfATA7bH+MtAPlOshYgQ1M3n2r0TSB6Ns5ESvKYlVugkKErQg5oFbR2qO7XrKtNsrtzedDvTeqQfyTjdPJH7jw== - -"@types/yargs-parser@*": - version "21.0.0" - resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.0.tgz#0c60e537fa790f5f9472ed2776c2b71ec117351b" - integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA== - -"@types/yargs@^17.0.10": - version "17.0.10" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.10.tgz#591522fce85d8739bca7b8bb90d048e4478d186a" - integrity sha512-gmEaFwpj/7f/ROdtIlci1R1VYU1J4j95m8T+Tj3iBgiBFKg1foE/PSl93bBd5T9LDXNPo8UlNN6W0qwD8O5OaA== - dependencies: - "@types/yargs-parser" "*" - -abi-decoder@^2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/abi-decoder/-/abi-decoder-2.4.0.tgz#99f72337c614d6ac45a28dbc83c08b44eba48ad5" - integrity sha512-TOLU2q1HgYOjs1GKGtVzaqrYkar6I2fT9a80rzx6/9EJ/5crb4nCGuro0grZayixem93T7omrajYmLiMkYDLDA== - dependencies: - web3-eth-abi "^1.2.1" - web3-utils "^1.2.1" - -accepts@~1.3.8: - version "1.3.8" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" - integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== - dependencies: - mime-types "~2.1.34" - negotiator "0.6.3" - -aes-js@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-3.0.0.tgz#e21df10ad6c2053295bcbb8dab40b09dbea87e4d" - integrity sha1-4h3xCtbCBTKVvLuNq0Cwnb6ofk0= - -ajv@^6.12.3: - version "6.12.6" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" - integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== - dependencies: - fast-deep-equal "^3.1.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - -ansi-regex@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" - integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== - -ansi-styles@^4.0.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -array-flatten@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" - integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= - -asn1.js@^5.2.0: - version "5.4.1" - resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07" - integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA== - dependencies: - bn.js "^4.0.0" - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - safer-buffer "^2.1.0" - -asn1@~0.2.3: - version "0.2.6" - resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.6.tgz#0d3a7bb6e64e02a90c0303b31f292868ea09a08d" - integrity sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ== - dependencies: - safer-buffer "~2.1.0" - -assert-plus@1.0.0, assert-plus@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" - integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= - -async-limiter@~1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" - integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== - -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= - -available-typed-arrays@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" - integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== - -aws-sign2@~0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" - integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= - -aws4@^1.8.0: - version "1.11.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59" - integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== - -base-x@^3.0.2, base-x@^3.0.8: - version "3.0.9" - resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.9.tgz#6349aaabb58526332de9f60995e548a53fe21320" - integrity sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ== - dependencies: - safe-buffer "^5.0.1" - -base64-js@^1.3.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" - integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== - -bcrypt-pbkdf@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" - integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= - dependencies: - tweetnacl "^0.14.3" - -bech32@1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/bech32/-/bech32-1.1.4.tgz#e38c9f37bf179b8eb16ae3a772b40c356d4832e9" - integrity sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ== - -bignumber.js@^9.0.0: - version "9.0.2" - resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.0.2.tgz#71c6c6bed38de64e24a65ebe16cfcf23ae693673" - integrity sha512-GAcQvbpsM0pUb0zw1EI0KhQEZ+lRwR5fYaAp3vPOYuP7aDvGy6cVN6XHLauvF8SOga2y0dcLcjt3iQDTSEliyw== - -blakejs@^1.1.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/blakejs/-/blakejs-1.2.1.tgz#5057e4206eadb4a97f7c0b6e197a505042fc3814" - integrity sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ== - -bluebird@^3.5.0: - version "3.7.2" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" - integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== - -bn.js@4.11.6: - version "4.11.6" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.6.tgz#53344adb14617a13f6e8dd2ce28905d1c0ba3215" - integrity sha1-UzRK2xRhehP26N0s4okF0cC6MhU= - -bn.js@5.2.0, bn.js@^5.0.0, bn.js@^5.1.1, bn.js@^5.1.2, bn.js@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.0.tgz#358860674396c6997771a9d051fcc1b57d4ae002" - integrity sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw== - -bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.6, bn.js@^4.11.9: - version "4.12.0" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" - integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== - -body-parser@1.20.0, body-parser@^1.16.0: - version "1.20.0" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.0.tgz#3de69bd89011c11573d7bfee6a64f11b6bd27cc5" - integrity sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg== - dependencies: - bytes "3.1.2" - content-type "~1.0.4" - debug "2.6.9" - depd "2.0.0" - destroy "1.2.0" - http-errors "2.0.0" - iconv-lite "0.4.24" - on-finished "2.4.1" - qs "6.10.3" - raw-body "2.5.1" - type-is "~1.6.18" - unpipe "1.0.0" - -brorand@^1.0.1, brorand@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" - integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= - -browserify-aes@^1.0.0, browserify-aes@^1.0.4, browserify-aes@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" - integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== - dependencies: - buffer-xor "^1.0.3" - cipher-base "^1.0.0" - create-hash "^1.1.0" - evp_bytestokey "^1.0.3" - inherits "^2.0.1" - safe-buffer "^5.0.1" - -browserify-cipher@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" - integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== - dependencies: - browserify-aes "^1.0.4" - browserify-des "^1.0.0" - evp_bytestokey "^1.0.0" - -browserify-des@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" - integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== - dependencies: - cipher-base "^1.0.1" - des.js "^1.0.0" - inherits "^2.0.1" - safe-buffer "^5.1.2" - -browserify-rsa@^4.0.0, browserify-rsa@^4.0.1: - version "4.1.0" - resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.1.0.tgz#b2fd06b5b75ae297f7ce2dc651f918f5be158c8d" - integrity sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog== - dependencies: - bn.js "^5.0.0" - randombytes "^2.0.1" - -browserify-sign@^4.0.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.1.tgz#eaf4add46dd54be3bb3b36c0cf15abbeba7956c3" - integrity sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg== - dependencies: - bn.js "^5.1.1" - browserify-rsa "^4.0.1" - create-hash "^1.2.0" - create-hmac "^1.1.7" - elliptic "^6.5.3" - inherits "^2.0.4" - parse-asn1 "^5.1.5" - readable-stream "^3.6.0" - safe-buffer "^5.2.0" - -bs58@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a" - integrity sha1-vhYedsNU9veIrkBx9j806MTwpCo= - dependencies: - base-x "^3.0.2" - -bs58check@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/bs58check/-/bs58check-2.1.2.tgz#53b018291228d82a5aa08e7d796fdafda54aebfc" - integrity sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA== - dependencies: - bs58 "^4.0.0" - create-hash "^1.1.0" - safe-buffer "^5.1.2" - -buffer-to-arraybuffer@^0.0.5: - version "0.0.5" - resolved "https://registry.yarnpkg.com/buffer-to-arraybuffer/-/buffer-to-arraybuffer-0.0.5.tgz#6064a40fa76eb43c723aba9ef8f6e1216d10511a" - integrity sha1-YGSkD6dutDxyOrqe+PbhIW0QURo= - -buffer-xor@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" - integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= - -buffer@^5.0.5, buffer@^5.5.0, buffer@^5.6.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" - integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.1.13" - -bufferutil@^4.0.1: - version "4.0.6" - resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.6.tgz#ebd6c67c7922a0e902f053e5d8be5ec850e48433" - integrity sha512-jduaYOYtnio4aIAyc6UbvPCVcgq7nYpVnucyxr6eCYg/Woad9Hf/oxxBRDnGGjPfjUm6j5O/uBWhIu4iLebFaw== - dependencies: - node-gyp-build "^4.3.0" - -bytes@3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" - integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== - -cacheable-request@^6.0.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.1.0.tgz#20ffb8bd162ba4be11e9567d823db651052ca912" - integrity sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg== - dependencies: - clone-response "^1.0.2" - get-stream "^5.1.0" - http-cache-semantics "^4.0.0" - keyv "^3.0.0" - lowercase-keys "^2.0.0" - normalize-url "^4.1.0" - responselike "^1.0.2" - -call-bind@^1.0.0, call-bind@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" - integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== - dependencies: - function-bind "^1.1.1" - get-intrinsic "^1.0.2" - -caseless@~0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" - integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= - -child-process@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/child-process/-/child-process-1.0.2.tgz#98974dc7ed1ee4c6229f8e305fa7313a6885a7f2" - integrity sha1-mJdNx+0e5MYin44wX6cxOmiFp/I= - -chownr@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" - integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== - -cids@^0.7.1: - version "0.7.5" - resolved "https://registry.yarnpkg.com/cids/-/cids-0.7.5.tgz#60a08138a99bfb69b6be4ceb63bfef7a396b28b2" - integrity sha512-zT7mPeghoWAu+ppn8+BS1tQ5qGmbMfB4AregnQjA/qHY3GC1m1ptI9GkWNlgeu38r7CuRdXB47uY2XgAYt6QVA== - dependencies: - buffer "^5.5.0" - class-is "^1.1.0" - multibase "~0.6.0" - multicodec "^1.0.0" - multihashes "~0.4.15" - -cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" - integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - -class-is@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/class-is/-/class-is-1.1.0.tgz#9d3c0fba0440d211d843cec3dedfa48055005825" - integrity sha512-rhjH9AG1fvabIDoGRVH587413LPjTZgmDF9fOFCbFJQV4yuocX1mHxxvXI4g3cGwbVY9wAYIoKlg1N79frJKQw== - -cliui@^7.0.2: - version "7.0.4" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" - integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.0" - wrap-ansi "^7.0.0" - -clone-response@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b" - integrity sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws= - dependencies: - mimic-response "^1.0.0" - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -combined-stream@^1.0.6, combined-stream@~1.0.6: - version "1.0.8" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" - integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== - dependencies: - delayed-stream "~1.0.0" - -content-disposition@0.5.4: - version "0.5.4" - resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" - integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== - dependencies: - safe-buffer "5.2.1" - -content-hash@^2.5.2: - version "2.5.2" - resolved "https://registry.yarnpkg.com/content-hash/-/content-hash-2.5.2.tgz#bbc2655e7c21f14fd3bfc7b7d4bfe6e454c9e211" - integrity sha512-FvIQKy0S1JaWV10sMsA7TRx8bpU+pqPkhbsfvOJAdjRXvYxEckAwQWGwtRjiaJfh+E0DvcWUGqcdjwMGFjsSdw== - dependencies: - cids "^0.7.1" - multicodec "^0.5.5" - multihashes "^0.4.15" - -content-type@~1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" - integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== - -cookie-signature@1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" - integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= - -cookie@0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" - integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== - -cookiejar@^2.1.1: - version "2.1.3" - resolved "https://registry.yarnpkg.com/cookiejar/-/cookiejar-2.1.3.tgz#fc7a6216e408e74414b90230050842dacda75acc" - integrity sha512-JxbCBUdrfr6AQjOXrxoTvAMJO4HBTUIlBzslcJPAz+/KT8yk53fXun51u+RenNYvad/+Vc2DIz5o9UxlCDymFQ== - -core-util-is@1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" - integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= - -cors@^2.8.1: - version "2.8.5" - resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" - integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== - dependencies: - object-assign "^4" - vary "^1" - -crc-32@^1.2.0: - version "1.2.2" - resolved "https://registry.yarnpkg.com/crc-32/-/crc-32-1.2.2.tgz#3cad35a934b8bf71f25ca524b6da51fb7eace2ff" - integrity sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ== - -create-ecdh@^4.0.0: - version "4.0.4" - resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e" - integrity sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A== - dependencies: - bn.js "^4.1.0" - elliptic "^6.5.3" - -create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" - integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== - dependencies: - cipher-base "^1.0.1" - inherits "^2.0.1" - md5.js "^1.3.4" - ripemd160 "^2.0.1" - sha.js "^2.4.0" - -create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: - version "1.1.7" - resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" - integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== - dependencies: - cipher-base "^1.0.3" - create-hash "^1.1.0" - inherits "^2.0.1" - ripemd160 "^2.0.0" - safe-buffer "^5.0.1" - sha.js "^2.4.8" - -cross-fetch@^3.1.5: - version "3.1.5" - resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.5.tgz#e1389f44d9e7ba767907f7af8454787952ab534f" - integrity sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw== - dependencies: - node-fetch "2.6.7" - -crypto-browserify@3.12.0: - version "3.12.0" - resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" - integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== - dependencies: - browserify-cipher "^1.0.0" - browserify-sign "^4.0.0" - create-ecdh "^4.0.0" - create-hash "^1.1.0" - create-hmac "^1.1.0" - diffie-hellman "^5.0.0" - inherits "^2.0.1" - pbkdf2 "^3.0.3" - public-encrypt "^4.0.0" - randombytes "^2.0.0" - randomfill "^1.0.3" - -d@1, d@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a" - integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA== - dependencies: - es5-ext "^0.10.50" - type "^1.0.1" - -dashdash@^1.12.0: - version "1.14.1" - resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" - integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= - dependencies: - assert-plus "^1.0.0" - -data-uri-to-buffer@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-4.0.0.tgz#b5db46aea50f6176428ac05b73be39a57701a64b" - integrity sha512-Vr3mLBA8qWmcuschSLAOogKgQ/Jwxulv3RNE4FXnYWRGujzrRWQI4m12fQqRkwX06C0KanhLr4hK+GydchZsaA== - -debug@2.6.9, debug@^2.2.0: - version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== - dependencies: - ms "2.0.0" - -decode-uri-component@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" - integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= - -decompress-response@^3.2.0, decompress-response@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" - integrity sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M= - dependencies: - mimic-response "^1.0.0" - -defer-to-connect@^1.0.1: - version "1.1.3" - resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591" - integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ== - -define-properties@^1.1.3, define-properties@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.4.tgz#0b14d7bd7fbeb2f3572c3a7eda80ea5d57fb05b1" - integrity sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA== - dependencies: - has-property-descriptors "^1.0.0" - object-keys "^1.1.1" - -delayed-stream@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= - -depd@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" - integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== - -des.js@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843" - integrity sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA== - dependencies: - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - -destroy@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" - integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== - -diffie-hellman@^5.0.0: - version "5.0.3" - resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" - integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== - dependencies: - bn.js "^4.1.0" - miller-rabin "^4.0.0" - randombytes "^2.0.0" - -dom-walk@^0.1.0: - version "0.1.2" - resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.2.tgz#0c548bef048f4d1f2a97249002236060daa3fd84" - integrity sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w== - -duplexer3@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" - integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= - -ecc-jsbn@~0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" - integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= - dependencies: - jsbn "~0.1.0" - safer-buffer "^2.1.0" - -ee-first@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" - integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= - -elliptic@6.5.4, elliptic@^6.4.0, elliptic@^6.5.3, elliptic@^6.5.4: - version "6.5.4" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" - integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== - dependencies: - bn.js "^4.11.9" - brorand "^1.1.0" - hash.js "^1.0.0" - hmac-drbg "^1.0.1" - inherits "^2.0.4" - minimalistic-assert "^1.0.1" - minimalistic-crypto-utils "^1.0.1" - -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - -encodeurl@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" - integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= - -end-of-stream@^1.1.0: - version "1.4.4" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" - integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== - dependencies: - once "^1.4.0" - -eosjs@^21.0.3: - version "21.0.4" - resolved "https://registry.yarnpkg.com/eosjs/-/eosjs-21.0.4.tgz#67794a9fbc3c7659de19a7926c2c13cce4515571" - integrity sha512-XbuIoidplA1hHIejy7VQ+hmBfC6T28kYFaQMsn6G1DMTg1CFwUzxwzUvZg/dGNPuf7hgPxOpaQvAUsdidTgGhQ== - dependencies: - bn.js "5.2.0" - elliptic "6.5.4" - hash.js "1.1.7" - pako "2.0.3" - -eosjs@^22.0.0: - version "22.1.0" - resolved "https://registry.yarnpkg.com/eosjs/-/eosjs-22.1.0.tgz#7ac40e2f1f959fab70539c30ac8ae46c9038aa3c" - integrity sha512-Ka8KO7akC3RxNdSg/3dkGWuUWUQESTzSUzQljBdVP16UG548vmQoBqSGnZdnjlZyfcab8VOu2iEt+JjyfYc5+A== - dependencies: - bn.js "5.2.0" - elliptic "6.5.4" - hash.js "1.1.7" - pako "2.0.3" - -es-abstract@^1.18.5, es-abstract@^1.19.0, es-abstract@^1.19.5: - version "1.20.0" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.20.0.tgz#b2d526489cceca004588296334726329e0a6bfb6" - integrity sha512-URbD8tgRthKD3YcC39vbvSDrX23upXnPcnGAjQfgxXF5ID75YcENawc9ZX/9iTP9ptUyfCLIxTTuMYoRfiOVKA== - dependencies: - call-bind "^1.0.2" - es-to-primitive "^1.2.1" - function-bind "^1.1.1" - function.prototype.name "^1.1.5" - get-intrinsic "^1.1.1" - get-symbol-description "^1.0.0" - has "^1.0.3" - has-property-descriptors "^1.0.0" - has-symbols "^1.0.3" - internal-slot "^1.0.3" - is-callable "^1.2.4" - is-negative-zero "^2.0.2" - is-regex "^1.1.4" - is-shared-array-buffer "^1.0.2" - is-string "^1.0.7" - is-weakref "^1.0.2" - object-inspect "^1.12.0" - object-keys "^1.1.1" - object.assign "^4.1.2" - regexp.prototype.flags "^1.4.1" - string.prototype.trimend "^1.0.5" - string.prototype.trimstart "^1.0.5" - unbox-primitive "^1.0.2" - -es-to-primitive@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" - integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== - dependencies: - is-callable "^1.1.4" - is-date-object "^1.0.1" - is-symbol "^1.0.2" - -es5-ext@^0.10.35, es5-ext@^0.10.50: - version "0.10.61" - resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.61.tgz#311de37949ef86b6b0dcea894d1ffedb909d3269" - integrity sha512-yFhIqQAzu2Ca2I4SE2Au3rxVfmohU9Y7wqGR+s7+H7krk26NXhIRAZDgqd6xqjCEFUomDEA3/Bo/7fKmIkW1kA== - dependencies: - es6-iterator "^2.0.3" - es6-symbol "^3.1.3" - next-tick "^1.1.0" - -es6-iterator@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" - integrity sha1-p96IkUGgWpSwhUQDstCg+/qY87c= - dependencies: - d "1" - es5-ext "^0.10.35" - es6-symbol "^3.1.1" - -es6-symbol@^3.1.1, es6-symbol@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18" - integrity sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA== - dependencies: - d "^1.0.1" - ext "^1.1.2" - -escalade@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" - integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== - -escape-html@~1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" - integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= - -etag@~1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" - integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= - -eth-ens-namehash@2.0.8: - version "2.0.8" - resolved "https://registry.yarnpkg.com/eth-ens-namehash/-/eth-ens-namehash-2.0.8.tgz#229ac46eca86d52e0c991e7cb2aef83ff0f68bcf" - integrity sha1-IprEbsqG1S4MmR58sq74P/D2i88= - dependencies: - idna-uts46-hx "^2.3.1" - js-sha3 "^0.5.7" - -eth-lib@0.2.8: - version "0.2.8" - resolved "https://registry.yarnpkg.com/eth-lib/-/eth-lib-0.2.8.tgz#b194058bef4b220ad12ea497431d6cb6aa0623c8" - integrity sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw== - dependencies: - bn.js "^4.11.6" - elliptic "^6.4.0" - xhr-request-promise "^0.1.2" - -eth-lib@^0.1.26: - version "0.1.29" - resolved "https://registry.yarnpkg.com/eth-lib/-/eth-lib-0.1.29.tgz#0c11f5060d42da9f931eab6199084734f4dbd1d9" - integrity sha512-bfttrr3/7gG4E02HoWTDUcDDslN003OlOoBxk9virpAZQ1ja/jDgwkWB8QfJF7ojuEowrqy+lzp9VcJG7/k5bQ== - dependencies: - bn.js "^4.11.6" - elliptic "^6.4.0" - nano-json-stream-parser "^0.1.2" - servify "^0.1.12" - ws "^3.0.0" - xhr-request-promise "^0.1.2" - -ethereum-bloom-filters@^1.0.6: - version "1.0.10" - resolved "https://registry.yarnpkg.com/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.10.tgz#3ca07f4aed698e75bd134584850260246a5fed8a" - integrity sha512-rxJ5OFN3RwjQxDcFP2Z5+Q9ho4eIdEmSc2ht0fCu8Se9nbXjZ7/031uXoUYJ87KHCOdVeiUuwSnoS7hmYAGVHA== - dependencies: - js-sha3 "^0.8.0" - -ethereum-cryptography@^0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz#8d6143cfc3d74bf79bbd8edecdf29e4ae20dd191" - integrity sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ== - dependencies: - "@types/pbkdf2" "^3.0.0" - "@types/secp256k1" "^4.0.1" - blakejs "^1.1.0" - browserify-aes "^1.2.0" - bs58check "^2.1.2" - create-hash "^1.2.0" - create-hmac "^1.1.7" - hash.js "^1.1.7" - keccak "^3.0.0" - pbkdf2 "^3.0.17" - randombytes "^2.1.0" - safe-buffer "^5.1.2" - scrypt-js "^3.0.0" - secp256k1 "^4.0.1" - setimmediate "^1.0.5" - -ethereumjs-util@*, ethereumjs-util@^7.0.10, ethereumjs-util@^7.0.4, ethereumjs-util@^7.1.0, ethereumjs-util@^7.1.4: - version "7.1.4" - resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-7.1.4.tgz#a6885bcdd92045b06f596c7626c3e89ab3312458" - integrity sha512-p6KmuPCX4mZIqsQzXfmSx9Y0l2hqf+VkAiwSisW3UKUFdk8ZkAt+AYaor83z2nSi6CU2zSsXMlD80hAbNEGM0A== - dependencies: - "@types/bn.js" "^5.1.0" - bn.js "^5.1.2" - create-hash "^1.1.2" - ethereum-cryptography "^0.1.3" - rlp "^2.2.4" - -ethers@^5.6.2: - version "5.6.5" - resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.6.5.tgz#3185ac7815dc640993408adf6f133ffabfbcbb63" - integrity sha512-9CTmplO9bv0s/aPw3HB3txGzKz3tUSI2EfO4dJo0W2WvaEq1ArgsEX6obV+bj5X3yY+Zgb1kAux8TDtJKe1FaA== - dependencies: - "@ethersproject/abi" "5.6.1" - "@ethersproject/abstract-provider" "5.6.0" - "@ethersproject/abstract-signer" "5.6.0" - "@ethersproject/address" "5.6.0" - "@ethersproject/base64" "5.6.0" - "@ethersproject/basex" "5.6.0" - "@ethersproject/bignumber" "5.6.0" - "@ethersproject/bytes" "5.6.1" - "@ethersproject/constants" "5.6.0" - "@ethersproject/contracts" "5.6.0" - "@ethersproject/hash" "5.6.0" - "@ethersproject/hdnode" "5.6.0" - "@ethersproject/json-wallets" "5.6.0" - "@ethersproject/keccak256" "5.6.0" - "@ethersproject/logger" "5.6.0" - "@ethersproject/networks" "5.6.2" - "@ethersproject/pbkdf2" "5.6.0" - "@ethersproject/properties" "5.6.0" - "@ethersproject/providers" "5.6.5" - "@ethersproject/random" "5.6.0" - "@ethersproject/rlp" "5.6.0" - "@ethersproject/sha2" "5.6.0" - "@ethersproject/signing-key" "5.6.1" - "@ethersproject/solidity" "5.6.0" - "@ethersproject/strings" "5.6.0" - "@ethersproject/transactions" "5.6.0" - "@ethersproject/units" "5.6.0" - "@ethersproject/wallet" "5.6.0" - "@ethersproject/web" "5.6.0" - "@ethersproject/wordlists" "5.6.0" - -ethjs-unit@0.1.6: - version "0.1.6" - resolved "https://registry.yarnpkg.com/ethjs-unit/-/ethjs-unit-0.1.6.tgz#c665921e476e87bce2a9d588a6fe0405b2c41699" - integrity sha1-xmWSHkduh7ziqdWIpv4EBbLEFpk= - dependencies: - bn.js "4.11.6" - number-to-bn "1.7.0" - -eventemitter3@4.0.4: - version "4.0.4" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.4.tgz#b5463ace635a083d018bdc7c917b4c5f10a85384" - integrity sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ== - -evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" - integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== - dependencies: - md5.js "^1.3.4" - safe-buffer "^5.1.1" - -express@^4.14.0: - version "4.18.1" - resolved "https://registry.yarnpkg.com/express/-/express-4.18.1.tgz#7797de8b9c72c857b9cd0e14a5eea80666267caf" - integrity sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q== - dependencies: - accepts "~1.3.8" - array-flatten "1.1.1" - body-parser "1.20.0" - content-disposition "0.5.4" - content-type "~1.0.4" - cookie "0.5.0" - cookie-signature "1.0.6" - debug "2.6.9" - depd "2.0.0" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - finalhandler "1.2.0" - fresh "0.5.2" - http-errors "2.0.0" - merge-descriptors "1.0.1" - methods "~1.1.2" - on-finished "2.4.1" - parseurl "~1.3.3" - path-to-regexp "0.1.7" - proxy-addr "~2.0.7" - qs "6.10.3" - range-parser "~1.2.1" - safe-buffer "5.2.1" - send "0.18.0" - serve-static "1.15.0" - setprototypeof "1.2.0" - statuses "2.0.1" - type-is "~1.6.18" - utils-merge "1.0.1" - vary "~1.1.2" - -ext@^1.1.2: - version "1.6.0" - resolved "https://registry.yarnpkg.com/ext/-/ext-1.6.0.tgz#3871d50641e874cc172e2b53f919842d19db4c52" - integrity sha512-sdBImtzkq2HpkdRLtlLWDa6w4DX22ijZLKx8BMPUuKe1c5lbN6xwQDQCxSfxBQnHZ13ls/FH0MQZx/q/gr6FQg== - dependencies: - type "^2.5.0" - -extend@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" - integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== - -extsprintf@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" - integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= - -extsprintf@^1.2.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.1.tgz#8d172c064867f235c0c84a596806d279bf4bcc07" - integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA== - -fast-deep-equal@^3.1.1: - version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" - integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== - -fast-json-stable-stringify@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" - integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== - -fetch-blob@^3.1.2, fetch-blob@^3.1.4: - version "3.1.5" - resolved "https://registry.yarnpkg.com/fetch-blob/-/fetch-blob-3.1.5.tgz#0077bf5f3fcdbd9d75a0b5362f77dbb743489863" - integrity sha512-N64ZpKqoLejlrwkIAnb9iLSA3Vx/kjgzpcDhygcqJ2KKjky8nCgUQ+dzXtbrLaWZGZNmNfQTsiQ0weZ1svglHg== - dependencies: - node-domexception "^1.0.0" - web-streams-polyfill "^3.0.3" - -finalhandler@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32" - integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== - dependencies: - debug "2.6.9" - encodeurl "~1.0.2" - escape-html "~1.0.3" - on-finished "2.4.1" - parseurl "~1.3.3" - statuses "2.0.1" - unpipe "~1.0.0" - -foreach@^2.0.5: - version "2.0.6" - resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.6.tgz#87bcc8a1a0e74000ff2bf9802110708cfb02eb6e" - integrity sha512-k6GAGDyqLe9JaebCsFCoudPPWfihKu8pylYXRlqP1J7ms39iPoTtk2fviNglIeQEwdh0bQeKJ01ZPyuyQvKzwg== - -forever-agent@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" - integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= - -form-data@~2.3.2: - version "2.3.3" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" - integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.6" - mime-types "^2.1.12" - -formdata-polyfill@^4.0.10: - version "4.0.10" - resolved "https://registry.yarnpkg.com/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz#24807c31c9d402e002ab3d8c720144ceb8848423" - integrity sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g== - dependencies: - fetch-blob "^3.1.2" - -forwarded@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" - integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== - -fresh@0.5.2: - version "0.5.2" - resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" - integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= - -fs-extra@^4.0.2: - version "4.0.3" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94" - integrity sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg== - dependencies: - graceful-fs "^4.1.2" - jsonfile "^4.0.0" - universalify "^0.1.0" - -fs-minipass@^1.2.7: - version "1.2.7" - resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7" - integrity sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA== - dependencies: - minipass "^2.6.0" - -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== - -function.prototype.name@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.5.tgz#cce0505fe1ffb80503e6f9e46cc64e46a12a9621" - integrity sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.0" - functions-have-names "^1.2.2" - -functions-have-names@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" - integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== - -get-caller-file@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" - integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== - -get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" - integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== - dependencies: - function-bind "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.1" - -get-stream@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" - integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ= - -get-stream@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" - integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== - dependencies: - pump "^3.0.0" - -get-stream@^5.1.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" - integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== - dependencies: - pump "^3.0.0" - -get-symbol-description@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" - integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.1" - -getpass@^0.1.1: - version "0.1.7" - resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" - integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= - dependencies: - assert-plus "^1.0.0" - -global@~4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/global/-/global-4.4.0.tgz#3e7b105179006a323ed71aafca3e9c57a5cc6406" - integrity sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w== - dependencies: - min-document "^2.19.0" - process "^0.11.10" - -got@9.6.0: - version "9.6.0" - resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85" - integrity sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q== - dependencies: - "@sindresorhus/is" "^0.14.0" - "@szmarczak/http-timer" "^1.1.2" - cacheable-request "^6.0.0" - decompress-response "^3.3.0" - duplexer3 "^0.1.4" - get-stream "^4.1.0" - lowercase-keys "^1.0.1" - mimic-response "^1.0.1" - p-cancelable "^1.0.0" - to-readable-stream "^1.0.0" - url-parse-lax "^3.0.0" - -got@^7.1.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/got/-/got-7.1.0.tgz#05450fd84094e6bbea56f451a43a9c289166385a" - integrity sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw== - dependencies: - decompress-response "^3.2.0" - duplexer3 "^0.1.4" - get-stream "^3.0.0" - is-plain-obj "^1.1.0" - is-retry-allowed "^1.0.0" - is-stream "^1.0.0" - isurl "^1.0.0-alpha5" - lowercase-keys "^1.0.0" - p-cancelable "^0.3.0" - p-timeout "^1.1.1" - safe-buffer "^5.0.1" - timed-out "^4.0.0" - url-parse-lax "^1.0.0" - url-to-options "^1.0.1" - -graceful-fs@^4.1.2, graceful-fs@^4.1.6: - version "4.2.10" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" - integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== - -har-schema@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" - integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= - -har-validator@~5.1.3: - version "5.1.5" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd" - integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w== - dependencies: - ajv "^6.12.3" - har-schema "^2.0.0" - -has-bigints@^1.0.1, has-bigints@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" - integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== - -has-property-descriptors@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861" - integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== - dependencies: - get-intrinsic "^1.1.1" - -has-symbol-support-x@^1.4.1: - version "1.4.2" - resolved "https://registry.yarnpkg.com/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz#1409f98bc00247da45da67cee0a36f282ff26455" - integrity sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw== - -has-symbols@^1.0.1, has-symbols@^1.0.2, has-symbols@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" - integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== - -has-to-string-tag-x@^1.2.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz#a045ab383d7b4b2012a00148ab0aa5f290044d4d" - integrity sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw== - dependencies: - has-symbol-support-x "^1.4.1" - -has-tostringtag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" - integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== - dependencies: - has-symbols "^1.0.2" - -has@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== - dependencies: - function-bind "^1.1.1" - -hash-base@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33" - integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA== - dependencies: - inherits "^2.0.4" - readable-stream "^3.6.0" - safe-buffer "^5.2.0" - -hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3, hash.js@^1.1.7: - version "1.1.7" - resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" - integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== - dependencies: - inherits "^2.0.3" - minimalistic-assert "^1.0.1" - -hmac-drbg@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" - integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= - dependencies: - hash.js "^1.0.3" - minimalistic-assert "^1.0.0" - minimalistic-crypto-utils "^1.0.1" - -http-cache-semantics@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390" - integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ== - -http-errors@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" - integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== - dependencies: - depd "2.0.0" - inherits "2.0.4" - setprototypeof "1.2.0" - statuses "2.0.1" - toidentifier "1.0.1" - -http-https@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/http-https/-/http-https-1.0.0.tgz#2f908dd5f1db4068c058cd6e6d4ce392c913389b" - integrity sha1-L5CN1fHbQGjAWM1ubUzjkskTOJs= - -http-signature@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" - integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= - dependencies: - assert-plus "^1.0.0" - jsprim "^1.2.2" - sshpk "^1.7.0" - -iconv-lite@0.4.24: - version "0.4.24" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" - integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== - dependencies: - safer-buffer ">= 2.1.2 < 3" - -idna-uts46-hx@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/idna-uts46-hx/-/idna-uts46-hx-2.3.1.tgz#a1dc5c4df37eee522bf66d969cc980e00e8711f9" - integrity sha512-PWoF9Keq6laYdIRwwCdhTPl60xRqAloYNMQLiyUnG42VjT53oW07BXIRM+NK7eQjzXjAk2gUvX9caRxlnF9TAA== - dependencies: - punycode "2.1.0" - -ieee754@^1.1.13: - version "1.2.1" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" - integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== - -inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -internal-slot@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c" - integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA== - dependencies: - get-intrinsic "^1.1.0" - has "^1.0.3" - side-channel "^1.0.4" - -ipaddr.js@1.9.1: - version "1.9.1" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" - integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== - -is-arguments@^1.0.4: - version "1.1.1" - resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" - integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-bigint@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" - integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== - dependencies: - has-bigints "^1.0.1" - -is-boolean-object@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" - integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-callable@^1.1.4, is-callable@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945" - integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w== - -is-date-object@^1.0.1: - version "1.0.5" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" - integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== - dependencies: - has-tostringtag "^1.0.0" - -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== - -is-function@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.2.tgz#4f097f30abf6efadac9833b17ca5dc03f8144e08" - integrity sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ== - -is-generator-function@^1.0.7: - version "1.0.10" - resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" - integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== - dependencies: - has-tostringtag "^1.0.0" - -is-hex-prefixed@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz#7d8d37e6ad77e5d127148913c573e082d777f554" - integrity sha1-fY035q135dEnFIkTxXPggtd39VQ= - -is-negative-zero@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" - integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== - -is-number-object@^1.0.4: - version "1.0.7" - resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" - integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== - dependencies: - has-tostringtag "^1.0.0" - -is-object@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.2.tgz#a56552e1c665c9e950b4a025461da87e72f86fcf" - integrity sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA== - -is-plain-obj@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" - integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= - -is-regex@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" - integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-retry-allowed@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz#d778488bd0a4666a3be8a1482b9f2baafedea8b4" - integrity sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg== - -is-shared-array-buffer@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" - integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== - dependencies: - call-bind "^1.0.2" - -is-stream@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" - integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= - -is-string@^1.0.5, is-string@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" - integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== - dependencies: - has-tostringtag "^1.0.0" - -is-symbol@^1.0.2, is-symbol@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" - integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== - dependencies: - has-symbols "^1.0.2" - -is-typed-array@^1.1.3, is-typed-array@^1.1.7: - version "1.1.8" - resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.8.tgz#cbaa6585dc7db43318bc5b89523ea384a6f65e79" - integrity sha512-HqH41TNZq2fgtGT8WHVFVJhBVGuY3AnP3Q36K8JKXUxSxRgk/d+7NjmwG2vo2mYmXK8UYZKu0qH8bVP5gEisjA== - dependencies: - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" - es-abstract "^1.18.5" - foreach "^2.0.5" - has-tostringtag "^1.0.0" - -is-typedarray@^1.0.0, is-typedarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" - integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= - -is-weakref@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" - integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== - dependencies: - call-bind "^1.0.2" - -isstream@~0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" - integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= - -isurl@^1.0.0-alpha5: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isurl/-/isurl-1.0.0.tgz#b27f4f49f3cdaa3ea44a0a5b7f3462e6edc39d67" - integrity sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w== - dependencies: - has-to-string-tag-x "^1.2.0" - is-object "^1.0.1" - -js-sha3@0.8.0, js-sha3@^0.8.0: - version "0.8.0" - resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" - integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== - -js-sha3@^0.5.7: - version "0.5.7" - resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.5.7.tgz#0d4ffd8002d5333aabaf4a23eed2f6374c9f28e7" - integrity sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc= - -jsbn@~0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" - integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= - -json-buffer@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898" - integrity sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg= - -json-schema-traverse@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" - integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== - -json-schema@0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.4.0.tgz#f7de4cf6efab838ebaeb3236474cbba5a1930ab5" - integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA== - -json-stringify-safe@~5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" - integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= - -jsonfile@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" - integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= - optionalDependencies: - graceful-fs "^4.1.6" - -jsprim@^1.2.2: - version "1.4.2" - resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.2.tgz#712c65533a15c878ba59e9ed5f0e26d5b77c5feb" - integrity sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw== - dependencies: - assert-plus "1.0.0" - extsprintf "1.3.0" - json-schema "0.4.0" - verror "1.10.0" - -keccak@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/keccak/-/keccak-3.0.2.tgz#4c2c6e8c54e04f2670ee49fa734eb9da152206e0" - integrity sha512-PyKKjkH53wDMLGrvmRGSNWgmSxZOUqbnXwKL9tmgbFYA1iAYqW21kfR7mZXV0MlESiefxQQE9X9fTa3X+2MPDQ== - dependencies: - node-addon-api "^2.0.0" - node-gyp-build "^4.2.0" - readable-stream "^3.6.0" - -keyv@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9" - integrity sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA== - dependencies: - json-buffer "3.0.0" - -lowercase-keys@^1.0.0, lowercase-keys@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" - integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== - -lowercase-keys@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" - integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== - -md5.js@^1.3.4: - version "1.3.5" - resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" - integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== - dependencies: - hash-base "^3.0.0" - inherits "^2.0.1" - safe-buffer "^5.1.2" - -media-typer@0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" - integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= - -merge-descriptors@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" - integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= - -methods@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" - integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= - -miller-rabin@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" - integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== - dependencies: - bn.js "^4.0.0" - brorand "^1.0.1" - -mime-db@1.52.0: - version "1.52.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" - integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== - -mime-types@^2.1.12, mime-types@^2.1.16, mime-types@~2.1.19, mime-types@~2.1.24, mime-types@~2.1.34: - version "2.1.35" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" - integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== - dependencies: - mime-db "1.52.0" - -mime@1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" - integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== - -mimic-response@^1.0.0, mimic-response@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" - integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== - -min-document@^2.19.0: - version "2.19.0" - resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685" - integrity sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU= - dependencies: - dom-walk "^0.1.0" - -minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" - integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== - -minimalistic-crypto-utils@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" - integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= - -minimist@^1.2.6: - version "1.2.6" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44" - integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== - -minipass@^2.6.0, minipass@^2.9.0: - version "2.9.0" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6" - integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg== - dependencies: - safe-buffer "^5.1.2" - yallist "^3.0.0" - -minizlib@^1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d" - integrity sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q== - dependencies: - minipass "^2.9.0" - -mkdirp-promise@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/mkdirp-promise/-/mkdirp-promise-5.0.1.tgz#e9b8f68e552c68a9c1713b84883f7a1dd039b8a1" - integrity sha1-6bj2jlUsaKnBcTuEiD96HdA5uKE= - dependencies: - mkdirp "*" - -mkdirp@*: - version "1.0.4" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" - integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== - -mkdirp@^0.5.5: - version "0.5.6" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" - integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== - dependencies: - minimist "^1.2.6" - -mock-fs@^4.1.0: - version "4.14.0" - resolved "https://registry.yarnpkg.com/mock-fs/-/mock-fs-4.14.0.tgz#ce5124d2c601421255985e6e94da80a7357b1b18" - integrity sha512-qYvlv/exQ4+svI3UOvPUpLDF0OMX5euvUH0Ny4N5QyRyhNdgAgUrVH3iUINSzEPLvx0kbo/Bp28GJKIqvE7URw== - -ms@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= - -ms@2.1.3: - version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - -multibase@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/multibase/-/multibase-0.7.0.tgz#1adfc1c50abe05eefeb5091ac0c2728d6b84581b" - integrity sha512-TW8q03O0f6PNFTQDvh3xxH03c8CjGaaYrjkl9UQPG6rz53TQzzxJVCIWVjzcbN/Q5Y53Zd0IBQBMVktVgNx4Fg== - dependencies: - base-x "^3.0.8" - buffer "^5.5.0" - -multibase@~0.6.0: - version "0.6.1" - resolved "https://registry.yarnpkg.com/multibase/-/multibase-0.6.1.tgz#b76df6298536cc17b9f6a6db53ec88f85f8cc12b" - integrity sha512-pFfAwyTjbbQgNc3G7D48JkJxWtoJoBMaR4xQUOuB8RnCgRqaYmWNFeJTTvrJ2w51bjLq2zTby6Rqj9TQ9elSUw== - dependencies: - base-x "^3.0.8" - buffer "^5.5.0" - -multicodec@^0.5.5: - version "0.5.7" - resolved "https://registry.yarnpkg.com/multicodec/-/multicodec-0.5.7.tgz#1fb3f9dd866a10a55d226e194abba2dcc1ee9ffd" - integrity sha512-PscoRxm3f+88fAtELwUnZxGDkduE2HD9Q6GHUOywQLjOGT/HAdhjLDYNZ1e7VR0s0TP0EwZ16LNUTFpoBGivOA== - dependencies: - varint "^5.0.0" - -multicodec@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/multicodec/-/multicodec-1.0.4.tgz#46ac064657c40380c28367c90304d8ed175a714f" - integrity sha512-NDd7FeS3QamVtbgfvu5h7fd1IlbaC4EQ0/pgU4zqE2vdHCmBGsUa0TiM8/TdSeG6BMPC92OOCf8F1ocE/Wkrrg== - dependencies: - buffer "^5.6.0" - varint "^5.0.0" - -multihashes@^0.4.15, multihashes@~0.4.15: - version "0.4.21" - resolved "https://registry.yarnpkg.com/multihashes/-/multihashes-0.4.21.tgz#dc02d525579f334a7909ade8a122dabb58ccfcb5" - integrity sha512-uVSvmeCWf36pU2nB4/1kzYZjsXD9vofZKpgudqkceYY5g2aZZXJ5r9lxuzoRLl1OAp28XljXsEJ/X/85ZsKmKw== - dependencies: - buffer "^5.5.0" - multibase "^0.7.0" - varint "^5.0.0" - -nano-json-stream-parser@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/nano-json-stream-parser/-/nano-json-stream-parser-0.1.2.tgz#0cc8f6d0e2b622b479c40d499c46d64b755c6f5f" - integrity sha1-DMj20OK2IrR5xA1JnEbWS3Vcb18= - -negotiator@0.6.3: - version "0.6.3" - resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" - integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== - -next-tick@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.1.0.tgz#1836ee30ad56d67ef281b22bd199f709449b35eb" - integrity sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ== - -node-addon-api@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-2.0.2.tgz#432cfa82962ce494b132e9d72a15b29f71ff5d32" - integrity sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA== - -node-domexception@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/node-domexception/-/node-domexception-1.0.0.tgz#6888db46a1f71c0b76b3f7555016b63fe64766e5" - integrity sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ== - -node-fetch@2.6.7: - version "2.6.7" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" - integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== - dependencies: - whatwg-url "^5.0.0" - -node-fetch@^3.2.3: - version "3.2.4" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-3.2.4.tgz#3fbca2d8838111048232de54cb532bd3cf134947" - integrity sha512-WvYJRN7mMyOLurFR2YpysQGuwYrJN+qrrpHjJDuKMcSPdfFccRUla/kng2mz6HWSBxJcqPbvatS6Gb4RhOzCJw== - dependencies: - data-uri-to-buffer "^4.0.0" - fetch-blob "^3.1.4" - formdata-polyfill "^4.0.10" - -node-gyp-build@^4.2.0, node-gyp-build@^4.3.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.4.0.tgz#42e99687ce87ddeaf3a10b99dc06abc11021f3f4" - integrity sha512-amJnQCcgtRVw9SvoebO3BKGESClrfXGCUTX9hSn1OuGQTQBOZmVd0Z0OlecpuRksKvbsUqALE8jls/ErClAPuQ== - -normalize-url@^4.1.0: - version "4.5.1" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.1.tgz#0dd90cf1288ee1d1313b87081c9a5932ee48518a" - integrity sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA== - -number-to-bn@1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/number-to-bn/-/number-to-bn-1.7.0.tgz#bb3623592f7e5f9e0030b1977bd41a0c53fe1ea0" - integrity sha1-uzYjWS9+X54AMLGXe9QaDFP+HqA= - dependencies: - bn.js "4.11.6" - strip-hex-prefix "1.0.0" - -oauth-sign@~0.9.0: - version "0.9.0" - resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" - integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== - -object-assign@^4, object-assign@^4.1.0, object-assign@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= - -object-inspect@^1.12.0, object-inspect@^1.9.0: - version "1.12.0" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.0.tgz#6e2c120e868fd1fd18cb4f18c31741d0d6e776f0" - integrity sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g== - -object-keys@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" - integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== - -object.assign@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" - integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== - dependencies: - call-bind "^1.0.0" - define-properties "^1.1.3" - has-symbols "^1.0.1" - object-keys "^1.1.1" - -oboe@2.1.5: - version "2.1.5" - resolved "https://registry.yarnpkg.com/oboe/-/oboe-2.1.5.tgz#5554284c543a2266d7a38f17e073821fbde393cd" - integrity sha1-VVQoTFQ6ImbXo48X4HOCH73jk80= - dependencies: - http-https "^1.0.0" - -on-finished@2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" - integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== - dependencies: - ee-first "1.1.1" - -once@^1.3.1, once@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= - dependencies: - wrappy "1" - -p-cancelable@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-0.3.0.tgz#b9e123800bcebb7ac13a479be195b507b98d30fa" - integrity sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw== - -p-cancelable@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc" - integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw== - -p-finally@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" - integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= - -p-timeout@^1.1.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-1.2.1.tgz#5eb3b353b7fce99f101a1038880bb054ebbea386" - integrity sha1-XrOzU7f86Z8QGhA4iAuwVOu+o4Y= - dependencies: - p-finally "^1.0.0" - -pako@2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/pako/-/pako-2.0.3.tgz#cdf475e31b678565251406de9e759196a0ea7a43" - integrity sha512-WjR1hOeg+kki3ZIOjaf4b5WVcay1jaliKSYiEaB1XzwhMQZJxRdQRv0V31EKBYlxb4T7SK3hjfc/jxyU64BoSw== - -parse-asn1@^5.0.0, parse-asn1@^5.1.5: - version "5.1.6" - resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.6.tgz#385080a3ec13cb62a62d39409cb3e88844cdaed4" - integrity sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw== - dependencies: - asn1.js "^5.2.0" - browserify-aes "^1.0.0" - evp_bytestokey "^1.0.0" - pbkdf2 "^3.0.3" - safe-buffer "^5.1.1" - -parse-headers@^2.0.0: - version "2.0.5" - resolved "https://registry.yarnpkg.com/parse-headers/-/parse-headers-2.0.5.tgz#069793f9356a54008571eb7f9761153e6c770da9" - integrity sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA== - -parseurl@~1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" - integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== - -path-to-regexp@0.1.7: - version "0.1.7" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" - integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= - -pbkdf2@^3.0.17, pbkdf2@^3.0.3: - version "3.1.2" - resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075" - integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA== - dependencies: - create-hash "^1.1.2" - create-hmac "^1.1.4" - ripemd160 "^2.0.1" - safe-buffer "^5.0.1" - sha.js "^2.4.8" - -performance-now@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" - integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= - -prepend-http@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" - integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw= - -prepend-http@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" - integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc= - -process@^0.11.10: - version "0.11.10" - resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" - integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= - -proxy-addr@~2.0.7: - version "2.0.7" - resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" - integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== - dependencies: - forwarded "0.2.0" - ipaddr.js "1.9.1" - -psl@^1.1.28: - version "1.8.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" - integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== - -public-encrypt@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" - integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== - dependencies: - bn.js "^4.1.0" - browserify-rsa "^4.0.0" - create-hash "^1.1.0" - parse-asn1 "^5.0.0" - randombytes "^2.0.1" - safe-buffer "^5.1.2" - -pump@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" - integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - -punycode@2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.0.tgz#5f863edc89b96db09074bad7947bf09056ca4e7d" - integrity sha1-X4Y+3Im5bbCQdLrXlHvwkFbKTn0= - -punycode@^2.1.0, punycode@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" - integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== - -qs@6.10.3: - version "6.10.3" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.3.tgz#d6cde1b2ffca87b5aa57889816c5f81535e22e8e" - integrity sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ== - dependencies: - side-channel "^1.0.4" - -qs@~6.5.2: - version "6.5.3" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.3.tgz#3aeeffc91967ef6e35c0e488ef46fb296ab76aad" - integrity sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA== - -query-string@^5.0.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/query-string/-/query-string-5.1.1.tgz#a78c012b71c17e05f2e3fa2319dd330682efb3cb" - integrity sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw== - dependencies: - decode-uri-component "^0.2.0" - object-assign "^4.1.0" - strict-uri-encode "^1.0.0" - -randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" - integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== - dependencies: - safe-buffer "^5.1.0" - -randomfill@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" - integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== - dependencies: - randombytes "^2.0.5" - safe-buffer "^5.1.0" - -range-parser@~1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" - integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== - -raw-body@2.5.1: - version "2.5.1" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" - integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== - dependencies: - bytes "3.1.2" - http-errors "2.0.0" - iconv-lite "0.4.24" - unpipe "1.0.0" - -readable-stream@^3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" - integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - -regexp.prototype.flags@^1.4.1: - version "1.4.3" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz#87cab30f80f66660181a3bb7bf5981a872b367ac" - integrity sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - functions-have-names "^1.2.2" - -request@^2.79.0: - version "2.88.2" - resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" - integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== - dependencies: - aws-sign2 "~0.7.0" - aws4 "^1.8.0" - caseless "~0.12.0" - combined-stream "~1.0.6" - extend "~3.0.2" - forever-agent "~0.6.1" - form-data "~2.3.2" - har-validator "~5.1.3" - http-signature "~1.2.0" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.19" - oauth-sign "~0.9.0" - performance-now "^2.1.0" - qs "~6.5.2" - safe-buffer "^5.1.2" - tough-cookie "~2.5.0" - tunnel-agent "^0.6.0" - uuid "^3.3.2" - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= - -responselike@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" - integrity sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec= - dependencies: - lowercase-keys "^1.0.0" - -ripemd160@^2.0.0, ripemd160@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" - integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== - dependencies: - hash-base "^3.0.0" - inherits "^2.0.1" - -rlp@^2.2.4: - version "2.2.7" - resolved "https://registry.yarnpkg.com/rlp/-/rlp-2.2.7.tgz#33f31c4afac81124ac4b283e2bd4d9720b30beaf" - integrity sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ== - dependencies: - bn.js "^5.2.0" - -safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@^5.2.1, safe-buffer@~5.2.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -safe-buffer@~5.1.0: - version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - -"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - -scrypt-js@3.0.1, scrypt-js@^3.0.0, scrypt-js@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-3.0.1.tgz#d314a57c2aef69d1ad98a138a21fe9eafa9ee312" - integrity sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA== - -secp256k1@^4.0.1: - version "4.0.3" - resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-4.0.3.tgz#c4559ecd1b8d3c1827ed2d1b94190d69ce267303" - integrity sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA== - dependencies: - elliptic "^6.5.4" - node-addon-api "^2.0.0" - node-gyp-build "^4.2.0" - -send@0.18.0: - version "0.18.0" - resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" - integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== - dependencies: - debug "2.6.9" - depd "2.0.0" - destroy "1.2.0" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - fresh "0.5.2" - http-errors "2.0.0" - mime "1.6.0" - ms "2.1.3" - on-finished "2.4.1" - range-parser "~1.2.1" - statuses "2.0.1" - -serve-static@1.15.0: - version "1.15.0" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" - integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== - dependencies: - encodeurl "~1.0.2" - escape-html "~1.0.3" - parseurl "~1.3.3" - send "0.18.0" - -servify@^0.1.12: - version "0.1.12" - resolved "https://registry.yarnpkg.com/servify/-/servify-0.1.12.tgz#142ab7bee1f1d033b66d0707086085b17c06db95" - integrity sha512-/xE6GvsKKqyo1BAY+KxOWXcLpPsUUyji7Qg3bVD7hh1eRze5bR1uYiuDA/k3Gof1s9BTzQZEJK8sNcNGFIzeWw== - dependencies: - body-parser "^1.16.0" - cors "^2.8.1" - express "^4.14.0" - request "^2.79.0" - xhr "^2.3.3" - -setimmediate@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" - integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= - -setprototypeof@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" - integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== - -sha.js@^2.4.0, sha.js@^2.4.8: - version "2.4.11" - resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" - integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - -side-channel@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" - integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== - dependencies: - call-bind "^1.0.0" - get-intrinsic "^1.0.2" - object-inspect "^1.9.0" - -simple-concat@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f" - integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q== - -simple-get@^2.7.0: - version "2.8.2" - resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-2.8.2.tgz#5708fb0919d440657326cd5fe7d2599d07705019" - integrity sha512-Ijd/rV5o+mSBBs4F/x9oDPtTx9Zb6X9brmnXvMW4J7IR15ngi9q5xxqWBKU744jTZiaXtxaPL7uHG6vtN8kUkw== - dependencies: - decompress-response "^3.3.0" - once "^1.3.1" - simple-concat "^1.0.0" - -sshpk@^1.7.0: - version "1.17.0" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.17.0.tgz#578082d92d4fe612b13007496e543fa0fbcbe4c5" - integrity sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ== - dependencies: - asn1 "~0.2.3" - assert-plus "^1.0.0" - bcrypt-pbkdf "^1.0.0" - dashdash "^1.12.0" - ecc-jsbn "~0.1.1" - getpass "^0.1.1" - jsbn "~0.1.0" - safer-buffer "^2.0.2" - tweetnacl "~0.14.0" - -statuses@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" - integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== - -strict-uri-encode@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" - integrity sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM= - -string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string.prototype.trimend@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz#914a65baaab25fbdd4ee291ca7dde57e869cb8d0" - integrity sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.19.5" - -string.prototype.trimstart@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz#5466d93ba58cfa2134839f81d7f42437e8c01fef" - integrity sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.19.5" - -string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-hex-prefix@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz#0c5f155fef1151373377de9dbb588da05500e36f" - integrity sha1-DF8VX+8RUTczd96du1iNoFUA428= - dependencies: - is-hex-prefixed "1.0.0" - -swarm-js@^0.1.40: - version "0.1.40" - resolved "https://registry.yarnpkg.com/swarm-js/-/swarm-js-0.1.40.tgz#b1bc7b6dcc76061f6c772203e004c11997e06b99" - integrity sha512-yqiOCEoA4/IShXkY3WKwP5PvZhmoOOD8clsKA7EEcRILMkTEYHCQ21HDCAcVpmIxZq4LyZvWeRJ6quIyHk1caA== - dependencies: - bluebird "^3.5.0" - buffer "^5.0.5" - eth-lib "^0.1.26" - fs-extra "^4.0.2" - got "^7.1.0" - mime-types "^2.1.16" - mkdirp-promise "^5.0.1" - mock-fs "^4.1.0" - setimmediate "^1.0.5" - tar "^4.0.2" - xhr-request "^1.0.1" - -tar@^4.0.2: - version "4.4.19" - resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.19.tgz#2e4d7263df26f2b914dee10c825ab132123742f3" - integrity sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA== - dependencies: - chownr "^1.1.4" - fs-minipass "^1.2.7" - minipass "^2.9.0" - minizlib "^1.3.3" - mkdirp "^0.5.5" - safe-buffer "^5.2.1" - yallist "^3.1.1" - -text-encoding@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/text-encoding/-/text-encoding-0.7.0.tgz#f895e836e45990624086601798ea98e8f36ee643" - integrity sha512-oJQ3f1hrOnbRLOcwKz0Liq2IcrvDeZRHXhd9RgLrsT+DjWY/nty1Hi7v3dtkaEYbPYe0mUoOfzRrMwfXXwgPUA== - -timed-out@^4.0.0, timed-out@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" - integrity sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8= - -to-readable-stream@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/to-readable-stream/-/to-readable-stream-1.0.0.tgz#ce0aa0c2f3df6adf852efb404a783e77c0475771" - integrity sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q== - -toidentifier@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" - integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== - -tough-cookie@~2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" - integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== - dependencies: - psl "^1.1.28" - punycode "^2.1.1" - -tr46@~0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" - integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= - -tunnel-agent@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" - integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= - dependencies: - safe-buffer "^5.0.1" - -tweetnacl@^0.14.3, tweetnacl@~0.14.0: - version "0.14.5" - resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" - integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= - -type-is@~1.6.18: - version "1.6.18" - resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" - integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== - dependencies: - media-typer "0.3.0" - mime-types "~2.1.24" - -type@^1.0.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0" - integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg== - -type@^2.5.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/type/-/type-2.6.0.tgz#3ca6099af5981d36ca86b78442973694278a219f" - integrity sha512-eiDBDOmkih5pMbo9OqsqPRGMljLodLcwd5XD5JbtNB0o89xZAwynY9EdCDsJU7LtcVCClu9DvM7/0Ep1hYX3EQ== - -typedarray-to-buffer@^3.1.5: - version "3.1.5" - resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" - integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== - dependencies: - is-typedarray "^1.0.0" - -typescript@^4.6.3: - version "4.6.4" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.6.4.tgz#caa78bbc3a59e6a5c510d35703f6a09877ce45e9" - integrity sha512-9ia/jWHIEbo49HfjrLGfKbZSuWo9iTMwXO+Ca3pRsSpbsMbc7/IU8NKdCZVRRBafVPGnoJeFL76ZOAA84I9fEg== - -ultron@~1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.1.1.tgz#9fe1536a10a664a65266a1e3ccf85fd36302bc9c" - integrity sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og== - -unbox-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" - integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== - dependencies: - call-bind "^1.0.2" - has-bigints "^1.0.2" - has-symbols "^1.0.3" - which-boxed-primitive "^1.0.2" - -universalify@^0.1.0: - version "0.1.2" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" - integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== - -unpipe@1.0.0, unpipe@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" - integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= - -uri-js@^4.2.2: - version "4.4.1" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" - integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== - dependencies: - punycode "^2.1.0" - -url-parse-lax@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73" - integrity sha1-evjzA2Rem9eaJy56FKxovAYJ2nM= - dependencies: - prepend-http "^1.0.1" - -url-parse-lax@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c" - integrity sha1-FrXK/Afb42dsGxmZF3gj1lA6yww= - dependencies: - prepend-http "^2.0.0" - -url-set-query@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/url-set-query/-/url-set-query-1.0.0.tgz#016e8cfd7c20ee05cafe7795e892bd0702faa339" - integrity sha1-AW6M/Xwg7gXK/neV6JK9BwL6ozk= - -url-to-options@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/url-to-options/-/url-to-options-1.0.1.tgz#1505a03a289a48cbd7a434efbaeec5055f5633a9" - integrity sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k= - -utf-8-validate@^5.0.2: - version "5.0.9" - resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-5.0.9.tgz#ba16a822fbeedff1a58918f2a6a6b36387493ea3" - integrity sha512-Yek7dAy0v3Kl0orwMlvi7TPtiCNrdfHNd7Gcc/pLq4BLXqfAmd0J7OWMizUQnTTJsyjKn02mU7anqwfmUP4J8Q== - dependencies: - node-gyp-build "^4.3.0" - -utf8@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/utf8/-/utf8-3.0.0.tgz#f052eed1364d696e769ef058b183df88c87f69d1" - integrity sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ== - -util-deprecate@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= - -util@^0.12.0: - version "0.12.4" - resolved "https://registry.yarnpkg.com/util/-/util-0.12.4.tgz#66121a31420df8f01ca0c464be15dfa1d1850253" - integrity sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw== - dependencies: - inherits "^2.0.3" - is-arguments "^1.0.4" - is-generator-function "^1.0.7" - is-typed-array "^1.1.3" - safe-buffer "^5.1.2" - which-typed-array "^1.1.2" - -utils-merge@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" - integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= - -uuid@3.3.2: - version "3.3.2" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" - integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA== - -uuid@^3.3.2: - version "3.4.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" - integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== - -varint@^5.0.0: - version "5.0.2" - resolved "https://registry.yarnpkg.com/varint/-/varint-5.0.2.tgz#5b47f8a947eb668b848e034dcfa87d0ff8a7f7a4" - integrity sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow== - -vary@^1, vary@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" - integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= - -verror@1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" - integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= - dependencies: - assert-plus "^1.0.0" - core-util-is "1.0.2" - extsprintf "^1.2.0" - -web-streams-polyfill@^3.0.3: - version "3.2.1" - resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz#71c2718c52b45fd49dbeee88634b3a60ceab42a6" - integrity sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q== - -web3-bzz@1.7.3: - version "1.7.3" - resolved "https://registry.yarnpkg.com/web3-bzz/-/web3-bzz-1.7.3.tgz#6860a584f748838af5e3932b6798e024ab8ae951" - integrity sha512-y2i2IW0MfSqFc1JBhBSQ59Ts9xE30hhxSmLS13jLKWzie24/An5dnoGarp2rFAy20tevJu1zJVPYrEl14jiL5w== - dependencies: - "@types/node" "^12.12.6" - got "9.6.0" - swarm-js "^0.1.40" - -web3-core-helpers@1.7.3: - version "1.7.3" - resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.7.3.tgz#9a8d7830737d0e9c48694b244f4ce0f769ba67b9" - integrity sha512-qS2t6UKLhRV/6C7OFHtMeoHphkcA+CKUr2vfpxy4hubs3+Nj28K9pgiqFuvZiXmtEEwIAE2A28GBOC3RdcSuFg== - dependencies: - web3-eth-iban "1.7.3" - web3-utils "1.7.3" - -web3-core-method@1.7.3: - version "1.7.3" - resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.7.3.tgz#eb2a4f140448445c939518c0fa6216b3d265c5e9" - integrity sha512-SeF8YL/NVFbj/ddwLhJeS0io8y7wXaPYA2AVT0h2C2ESYkpvOtQmyw2Bc3aXxBmBErKcbOJjE2ABOKdUmLSmMA== - dependencies: - "@ethersproject/transactions" "^5.0.0-beta.135" - web3-core-helpers "1.7.3" - web3-core-promievent "1.7.3" - web3-core-subscriptions "1.7.3" - web3-utils "1.7.3" - -web3-core-promievent@1.7.3: - version "1.7.3" - resolved "https://registry.yarnpkg.com/web3-core-promievent/-/web3-core-promievent-1.7.3.tgz#2d0eeef694569b61355054c721578f67df925b80" - integrity sha512-+mcfNJLP8h2JqcL/UdMGdRVfTdm+bsoLzAFtLpazE4u9kU7yJUgMMAqnK59fKD3Zpke3DjaUJKwz1TyiGM5wig== - dependencies: - eventemitter3 "4.0.4" - -web3-core-requestmanager@1.7.3: - version "1.7.3" - resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.7.3.tgz#226f79d16e546c9157d00908de215e984cae84e9" - integrity sha512-bC+jeOjPbagZi2IuL1J5d44f3zfPcgX+GWYUpE9vicNkPUxFBWRG+olhMo7L+BIcD57cTmukDlnz+1xBULAjFg== - dependencies: - util "^0.12.0" - web3-core-helpers "1.7.3" - web3-providers-http "1.7.3" - web3-providers-ipc "1.7.3" - web3-providers-ws "1.7.3" - -web3-core-subscriptions@1.7.3: - version "1.7.3" - resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.7.3.tgz#ca456dfe2c219a0696c5cf34c13b03c3599ec5d5" - integrity sha512-/i1ZCLW3SDxEs5mu7HW8KL4Vq7x4/fDXY+yf/vPoDljlpvcLEOnI8y9r7om+0kYwvuTlM6DUHHafvW0221TyRQ== - dependencies: - eventemitter3 "4.0.4" - web3-core-helpers "1.7.3" - -web3-core@1.7.3: - version "1.7.3" - resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.7.3.tgz#2ef25c4cc023997f43af9f31a03b571729ff3cda" - integrity sha512-4RNxueGyevD1XSjdHE57vz/YWRHybpcd3wfQS33fgMyHZBVLFDNwhn+4dX4BeofVlK/9/cmPAokLfBUStZMLdw== - dependencies: - "@types/bn.js" "^4.11.5" - "@types/node" "^12.12.6" - bignumber.js "^9.0.0" - web3-core-helpers "1.7.3" - web3-core-method "1.7.3" - web3-core-requestmanager "1.7.3" - web3-utils "1.7.3" - -web3-eth-abi@1.7.3, web3-eth-abi@^1.2.1: - version "1.7.3" - resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.7.3.tgz#2a1123c7252c37100eecd0b1fb2fb2c51366071f" - integrity sha512-ZlD8DrJro0ocnbZViZpAoMX44x5aYAb73u2tMq557rMmpiluZNnhcCYF/NnVMy6UIkn7SF/qEA45GXA1ne6Tnw== - dependencies: - "@ethersproject/abi" "5.0.7" - web3-utils "1.7.3" - -web3-eth-accounts@1.7.3: - version "1.7.3" - resolved "https://registry.yarnpkg.com/web3-eth-accounts/-/web3-eth-accounts-1.7.3.tgz#cd1789000f13ed3c438e96b3e80ee7be8d3f1a9b" - integrity sha512-aDaWjW1oJeh0LeSGRVyEBiTe/UD2/cMY4dD6pQYa8dOhwgMtNQjxIQ7kacBBXe7ZKhjbIFZDhvXN4mjXZ82R2Q== - dependencies: - "@ethereumjs/common" "^2.5.0" - "@ethereumjs/tx" "^3.3.2" - crypto-browserify "3.12.0" - eth-lib "0.2.8" - ethereumjs-util "^7.0.10" - scrypt-js "^3.0.1" - uuid "3.3.2" - web3-core "1.7.3" - web3-core-helpers "1.7.3" - web3-core-method "1.7.3" - web3-utils "1.7.3" - -web3-eth-contract@1.7.3: - version "1.7.3" - resolved "https://registry.yarnpkg.com/web3-eth-contract/-/web3-eth-contract-1.7.3.tgz#c4efc118ed7adafbc1270b633f33e696a39c7fc7" - integrity sha512-7mjkLxCNMWlQrlfM/MmNnlKRHwFk5XrZcbndoMt3KejcqDP6dPHi2PZLutEcw07n/Sk8OMpSamyF3QiGfmyRxw== - dependencies: - "@types/bn.js" "^4.11.5" - web3-core "1.7.3" - web3-core-helpers "1.7.3" - web3-core-method "1.7.3" - web3-core-promievent "1.7.3" - web3-core-subscriptions "1.7.3" - web3-eth-abi "1.7.3" - web3-utils "1.7.3" - -web3-eth-ens@1.7.3: - version "1.7.3" - resolved "https://registry.yarnpkg.com/web3-eth-ens/-/web3-eth-ens-1.7.3.tgz#ebc56a4dc7007f4f899259bbae1237d3095e2f3f" - integrity sha512-q7+hFGHIc0mBI3LwgRVcLCQmp6GItsWgUtEZ5bjwdjOnJdbjYddm7PO9RDcTDQ6LIr7hqYaY4WTRnDHZ6BEt5Q== - dependencies: - content-hash "^2.5.2" - eth-ens-namehash "2.0.8" - web3-core "1.7.3" - web3-core-helpers "1.7.3" - web3-core-promievent "1.7.3" - web3-eth-abi "1.7.3" - web3-eth-contract "1.7.3" - web3-utils "1.7.3" - -web3-eth-iban@1.7.3: - version "1.7.3" - resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.7.3.tgz#47433a73380322bba04e17b91fccd4a0e63a390a" - integrity sha512-1GPVWgajwhh7g53mmYDD1YxcftQniIixMiRfOqlnA1w0mFGrTbCoPeVaSQ3XtSf+rYehNJIZAUeDBnONVjXXmg== - dependencies: - bn.js "^4.11.9" - web3-utils "1.7.3" - -web3-eth-personal@1.7.3: - version "1.7.3" - resolved "https://registry.yarnpkg.com/web3-eth-personal/-/web3-eth-personal-1.7.3.tgz#ca2464dca356d4335aa8141cf75a6947f10f45a6" - integrity sha512-iTLz2OYzEsJj2qGE4iXC1Gw+KZN924fTAl0ESBFs2VmRhvVaM7GFqZz/wx7/XESl3GVxGxlRje3gNK0oGIoYYQ== - dependencies: - "@types/node" "^12.12.6" - web3-core "1.7.3" - web3-core-helpers "1.7.3" - web3-core-method "1.7.3" - web3-net "1.7.3" - web3-utils "1.7.3" - -web3-eth@1.7.3: - version "1.7.3" - resolved "https://registry.yarnpkg.com/web3-eth/-/web3-eth-1.7.3.tgz#9e92785ea18d682548b6044551abe7f2918fc0b5" - integrity sha512-BCIRMPwaMlTCbswXyGT6jj9chCh9RirbDFkPtvqozfQ73HGW7kP78TXXf9+Xdo1GjutQfxi/fQ9yPdxtDJEpDA== - dependencies: - web3-core "1.7.3" - web3-core-helpers "1.7.3" - web3-core-method "1.7.3" - web3-core-subscriptions "1.7.3" - web3-eth-abi "1.7.3" - web3-eth-accounts "1.7.3" - web3-eth-contract "1.7.3" - web3-eth-ens "1.7.3" - web3-eth-iban "1.7.3" - web3-eth-personal "1.7.3" - web3-net "1.7.3" - web3-utils "1.7.3" - -web3-net@1.7.3: - version "1.7.3" - resolved "https://registry.yarnpkg.com/web3-net/-/web3-net-1.7.3.tgz#54e35bcc829fdc40cf5001a3870b885d95069810" - integrity sha512-zAByK0Qrr71k9XW0Adtn+EOuhS9bt77vhBO6epAeQ2/VKl8rCGLAwrl3GbeEl7kWa8s/su72cjI5OetG7cYR0g== - dependencies: - web3-core "1.7.3" - web3-core-method "1.7.3" - web3-utils "1.7.3" - -web3-providers-http@1.7.3: - version "1.7.3" - resolved "https://registry.yarnpkg.com/web3-providers-http/-/web3-providers-http-1.7.3.tgz#8ea5e39f6ceee0b5bc4e45403fae75cad8ff4cf7" - integrity sha512-TQJfMsDQ5Uq9zGMYlu7azx1L7EvxW+Llks3MaWn3cazzr5tnrDbGh6V17x6LN4t8tFDHWx0rYKr3mDPqyTjOZw== - dependencies: - web3-core-helpers "1.7.3" - xhr2-cookies "1.1.0" - -web3-providers-ipc@1.7.3: - version "1.7.3" - resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.7.3.tgz#a34872103a8d37a03795fa2f9b259e869287dcaa" - integrity sha512-Z4EGdLKzz6I1Bw+VcSyqVN4EJiT2uAro48Am1eRvxUi4vktGoZtge1ixiyfrRIVb6nPe7KnTFl30eQBtMqS0zA== - dependencies: - oboe "2.1.5" - web3-core-helpers "1.7.3" - -web3-providers-ws@1.7.3: - version "1.7.3" - resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.7.3.tgz#87564facc47387c9004a043a6686e4881ed6acfe" - integrity sha512-PpykGbkkkKtxPgv7U4ny4UhnkqSZDfLgBEvFTXuXLAngbX/qdgfYkhIuz3MiGplfL7Yh93SQw3xDjImXmn2Rgw== - dependencies: - eventemitter3 "4.0.4" - web3-core-helpers "1.7.3" - websocket "^1.0.32" - -web3-shh@1.7.3: - version "1.7.3" - resolved "https://registry.yarnpkg.com/web3-shh/-/web3-shh-1.7.3.tgz#84e10adf628556798244b58f73cda1447bb7075e" - integrity sha512-bQTSKkyG7GkuULdZInJ0osHjnmkHij9tAySibpev1XjYdjLiQnd0J9YGF4HjvxoG3glNROpuCyTaRLrsLwaZuw== - dependencies: - web3-core "1.7.3" - web3-core-method "1.7.3" - web3-core-subscriptions "1.7.3" - web3-net "1.7.3" - -web3-utils@1.7.3, web3-utils@^1.2.1: - version "1.7.3" - resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.7.3.tgz#b214d05f124530d8694ad364509ac454d05f207c" - integrity sha512-g6nQgvb/bUpVUIxJE+ezVN+rYwYmlFyMvMIRSuqpi1dk6ApDD00YNArrk7sPcZnjvxOJ76813Xs2vIN2rgh4lg== - dependencies: - bn.js "^4.11.9" - ethereum-bloom-filters "^1.0.6" - ethereumjs-util "^7.1.0" - ethjs-unit "0.1.6" - number-to-bn "1.7.0" - randombytes "^2.1.0" - utf8 "3.0.0" - -web3@^1.7.3: - version "1.7.3" - resolved "https://registry.yarnpkg.com/web3/-/web3-1.7.3.tgz#30fe786338b2cc775881cb28c056ee5da4be65b8" - integrity sha512-UgBvQnKIXncGYzsiGacaiHtm0xzQ/JtGqcSO/ddzQHYxnNuwI72j1Pb4gskztLYihizV9qPNQYHMSCiBlStI9A== - dependencies: - web3-bzz "1.7.3" - web3-core "1.7.3" - web3-eth "1.7.3" - web3-eth-personal "1.7.3" - web3-net "1.7.3" - web3-shh "1.7.3" - web3-utils "1.7.3" - -webidl-conversions@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" - integrity sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE= - -websocket@^1.0.32: - version "1.0.34" - resolved "https://registry.yarnpkg.com/websocket/-/websocket-1.0.34.tgz#2bdc2602c08bf2c82253b730655c0ef7dcab3111" - integrity sha512-PRDso2sGwF6kM75QykIesBijKSVceR6jL2G8NGYyq2XrItNC2P5/qL5XeR056GhA+Ly7JMFvJb9I312mJfmqnQ== - dependencies: - bufferutil "^4.0.1" - debug "^2.2.0" - es5-ext "^0.10.50" - typedarray-to-buffer "^3.1.5" - utf-8-validate "^5.0.2" - yaeti "^0.0.6" - -whatwg-url@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" - integrity sha1-lmRU6HZUYuN2RNNib2dCzotwll0= - dependencies: - tr46 "~0.0.3" - webidl-conversions "^3.0.0" - -which-boxed-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" - integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== - dependencies: - is-bigint "^1.0.1" - is-boolean-object "^1.1.0" - is-number-object "^1.0.4" - is-string "^1.0.5" - is-symbol "^1.0.3" - -which-typed-array@^1.1.2: - version "1.1.7" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.7.tgz#2761799b9a22d4b8660b3c1b40abaa7739691793" - integrity sha512-vjxaB4nfDqwKI0ws7wZpxIlde1XrLX5uB0ZjpfshgmapJMD7jJWhZI+yToJTqaFByF0eNBcYxbjmCzoRP7CfEw== - dependencies: - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" - es-abstract "^1.18.5" - foreach "^2.0.5" - has-tostringtag "^1.0.0" - is-typed-array "^1.1.7" - -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= - -ws@7.4.6: - version "7.4.6" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c" - integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== - -ws@^3.0.0: - version "3.3.3" - resolved "https://registry.yarnpkg.com/ws/-/ws-3.3.3.tgz#f1cf84fe2d5e901ebce94efaece785f187a228f2" - integrity sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA== - dependencies: - async-limiter "~1.0.0" - safe-buffer "~5.1.0" - ultron "~1.1.0" - -ws@^6.1.3: - version "6.2.2" - resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.2.tgz#dd5cdbd57a9979916097652d78f1cc5faea0c32e" - integrity sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw== - dependencies: - async-limiter "~1.0.0" - -xhr-request-promise@^0.1.2: - version "0.1.3" - resolved "https://registry.yarnpkg.com/xhr-request-promise/-/xhr-request-promise-0.1.3.tgz#2d5f4b16d8c6c893be97f1a62b0ed4cf3ca5f96c" - integrity sha512-YUBytBsuwgitWtdRzXDDkWAXzhdGB8bYm0sSzMPZT7Z2MBjMSTHFsyCT1yCRATY+XC69DUrQraRAEgcoCRaIPg== - dependencies: - xhr-request "^1.1.0" - -xhr-request@^1.0.1, xhr-request@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/xhr-request/-/xhr-request-1.1.0.tgz#f4a7c1868b9f198723444d82dcae317643f2e2ed" - integrity sha512-Y7qzEaR3FDtL3fP30k9wO/e+FBnBByZeybKOhASsGP30NIkRAAkKD/sCnLvgEfAIEC1rcmK7YG8f4oEnIrrWzA== - dependencies: - buffer-to-arraybuffer "^0.0.5" - object-assign "^4.1.1" - query-string "^5.0.1" - simple-get "^2.7.0" - timed-out "^4.0.1" - url-set-query "^1.0.0" - xhr "^2.0.4" - -xhr2-cookies@1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/xhr2-cookies/-/xhr2-cookies-1.1.0.tgz#7d77449d0999197f155cb73b23df72505ed89d48" - integrity sha1-fXdEnQmZGX8VXLc7I99yUF7YnUg= - dependencies: - cookiejar "^2.1.1" - -xhr@^2.0.4, xhr@^2.3.3: - version "2.6.0" - resolved "https://registry.yarnpkg.com/xhr/-/xhr-2.6.0.tgz#b69d4395e792b4173d6b7df077f0fc5e4e2b249d" - integrity sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA== - dependencies: - global "~4.4.0" - is-function "^1.0.1" - parse-headers "^2.0.0" - xtend "^4.0.0" - -xtend@^4.0.0: - version "4.0.2" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" - integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== - -y18n@^5.0.5: - version "5.0.8" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" - integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== - -yaeti@^0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/yaeti/-/yaeti-0.0.6.tgz#f26f484d72684cf42bedfb76970aa1608fbf9577" - integrity sha1-8m9ITXJoTPQr7ft2lwqhYI+/lXc= - -yallist@^3.0.0, yallist@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" - integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== - -yargs-parser@^21.0.0: - version "21.0.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.0.1.tgz#0267f286c877a4f0f728fceb6f8a3e4cb95c6e35" - integrity sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg== - -yargs@^17.4.1: - version "17.5.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.5.0.tgz#2706c5431f8c119002a2b106fc9f58b9bb9097a3" - integrity sha512-3sLxVhbAB5OC8qvVRebCLWuouhwh/rswsiDYx3WGxajUk/l4G20SKfrKKFeNIHboUFt2JFgv2yfn+5cgOr/t5A== - dependencies: - cliui "^7.0.2" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.3" - y18n "^5.0.5" - yargs-parser "^21.0.0" - -zlib@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/zlib/-/zlib-1.0.5.tgz#6e7c972fc371c645a6afb03ab14769def114fcc0" - integrity sha1-bnyXL8NxxkWmr7A6sUdp3vEU/MA= diff --git a/yarn.lock b/yarn.lock deleted file mode 100644 index 1666c8f..0000000 --- a/yarn.lock +++ /dev/null @@ -1,393 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@cspotcode/source-map-consumer@0.8.0": - version "0.8.0" - resolved "https://registry.yarnpkg.com/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz#33bf4b7b39c178821606f669bbc447a6a629786b" - integrity sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg== - -"@cspotcode/source-map-support@0.7.0": - version "0.7.0" - resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.7.0.tgz#4789840aa859e46d2f3173727ab707c66bf344f5" - integrity sha512-X4xqRHqN8ACt2aHVe51OxeA2HjbcL4MqFqXkrmQszJ1NOUuUu5u6Vqx/0lZSVNku7velL5FC/s5uEAj1lsBMhA== - dependencies: - "@cspotcode/source-map-consumer" "0.8.0" - -"@tsconfig/node10@^1.0.7": - version "1.0.8" - resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.8.tgz#c1e4e80d6f964fbecb3359c43bd48b40f7cadad9" - integrity sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg== - -"@tsconfig/node12@^1.0.7": - version "1.0.9" - resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.9.tgz#62c1f6dee2ebd9aead80dc3afa56810e58e1a04c" - integrity sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw== - -"@tsconfig/node14@^1.0.0": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.1.tgz#95f2d167ffb9b8d2068b0b235302fafd4df711f2" - integrity sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg== - -"@tsconfig/node16@^1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.2.tgz#423c77877d0569db20e1fc80885ac4118314010e" - integrity sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA== - -"@types/csv-parse@^1.2.2": - version "1.2.2" - resolved "https://registry.yarnpkg.com/@types/csv-parse/-/csv-parse-1.2.2.tgz#713486235759d615dc8e6a6a979170ada76701d5" - integrity sha512-k33tLtRKTQxf7hQfMlkWoS2TQYsnpk1ibZN+rzbuCkeBs8m23nHTeDTF1wb/e7/MSLdtgCzqu3oM1I101kd6yw== - dependencies: - csv-parse "*" - -"@types/node-fetch@^2.5.10": - version "2.5.12" - resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.5.12.tgz#8a6f779b1d4e60b7a57fb6fd48d84fb545b9cc66" - integrity sha512-MKgC4dlq4kKNa/mYrwpKfzQMB5X3ee5U6fSprkKpToBqBmX4nFZL9cW5jl6sWn+xpRJ7ypWh2yyqqr8UUCstSw== - dependencies: - "@types/node" "*" - form-data "^3.0.0" - -"@types/node-fetch@^3.0.3": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-3.0.3.tgz#9d969c9a748e841554a40ee435d26e53fa3ee899" - integrity sha512-HhggYPH5N+AQe/OmN6fmhKmRRt2XuNJow+R3pQwJxOOF9GuwM7O2mheyGeIrs5MOIeNjDEdgdoyHBOrFeJBR3g== - dependencies: - node-fetch "*" - -"@types/node@*": - version "17.0.16" - resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.16.tgz#e3733f46797b9df9e853ca9f719c8a6f7b84cd26" - integrity sha512-ydLaGVfQOQ6hI1xK2A5nVh8bl0OGoIfYMxPWHqqYe9bTkWCfqiVvZoh2I/QF2sNSkZzZyROBoTefIEI+PB6iIA== - -"@types/node@^15.12.5": - version "15.14.9" - resolved "https://registry.yarnpkg.com/@types/node/-/node-15.14.9.tgz#bc43c990c3c9be7281868bbc7b8fdd6e2b57adfa" - integrity sha512-qjd88DrCxupx/kJD5yQgZdcYKZKSIGBVDIBE1/LTGcNm3d2Np/jxojkdePDdfnBHJc5W7vSMpbJ1aB7p/Py69A== - -"@types/text-encoding@^0.0.36": - version "0.0.36" - resolved "https://registry.yarnpkg.com/@types/text-encoding/-/text-encoding-0.0.36.tgz#c1343e35188cb8f8d5f9ada4ff5b72829b29ea19" - integrity sha512-LfATA7bH+MtAPlOshYgQ1M3n2r0TSB6Ns5ESvKYlVugkKErQg5oFbR2qO7XrKtNsrtzedDvTeqQfyTjdPJH7jw== - -"@types/yargs-parser@*": - version "20.2.1" - resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-20.2.1.tgz#3b9ce2489919d9e4fea439b76916abc34b2df129" - integrity sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw== - -"@types/yargs@^17.0.2": - version "17.0.8" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.8.tgz#d23a3476fd3da8a0ea44b5494ca7fa677b9dad4c" - integrity sha512-wDeUwiUmem9FzsyysEwRukaEdDNcwbROvQ9QGRKaLI6t+IltNzbn4/i4asmB10auvZGQCzSQ6t0GSczEThlUXw== - dependencies: - "@types/yargs-parser" "*" - -acorn-walk@^8.1.1: - version "8.2.0" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" - integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== - -acorn@^8.4.1: - version "8.7.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.0.tgz#90951fde0f8f09df93549481e5fc141445b791cf" - integrity sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ== - -ansi-regex@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" - integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== - -ansi-styles@^4.0.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -arg@^4.1.0: - version "4.1.3" - resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" - integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== - -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= - -cliui@^7.0.2: - version "7.0.4" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" - integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.0" - wrap-ansi "^7.0.0" - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -combined-stream@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" - integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== - dependencies: - delayed-stream "~1.0.0" - -create-require@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" - integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== - -csv-parse@*: - version "5.0.4" - resolved "https://registry.yarnpkg.com/csv-parse/-/csv-parse-5.0.4.tgz#97e5e654413bcf95f2714ce09bcb2be6de0eb8e3" - integrity sha512-5AIdl8l6n3iYQYxan5djB5eKDa+vBnhfWZtRpJTcrETWfVLYN0WSj3L9RwvgYt+psoO77juUr8TG8qpfGZifVQ== - -csv-parse@^4.16.0: - version "4.16.3" - resolved "https://registry.yarnpkg.com/csv-parse/-/csv-parse-4.16.3.tgz#7ca624d517212ebc520a36873c3478fa66efbaf7" - integrity sha512-cO1I/zmz4w2dcKHVvpCr7JVRu8/FymG5OEpmvsZYlccYolPBLoVGKUHgNoc4ZGkFeFlWGEDmMyBM+TTqRdW/wg== - -data-uri-to-buffer@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-4.0.0.tgz#b5db46aea50f6176428ac05b73be39a57701a64b" - integrity sha512-Vr3mLBA8qWmcuschSLAOogKgQ/Jwxulv3RNE4FXnYWRGujzrRWQI4m12fQqRkwX06C0KanhLr4hK+GydchZsaA== - -delayed-stream@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= - -diff@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" - integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== - -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - -eosio-helpers@^0.1.15: - version "0.1.15" - resolved "https://registry.yarnpkg.com/eosio-helpers/-/eosio-helpers-0.1.15.tgz#36fcec0cf0c0f24be82d569f038a2a53843825a7" - integrity sha512-9NjmubzUQ4aIxqcL9YFZcgcmBPvG8c3bGVUevzUOVgynxD8c+sD/DLkvPioG9wBHrT58i8zzz1iUyxsUF1l6RA== - dependencies: - "@types/csv-parse" "^1.2.2" - "@types/node" "^15.12.5" - "@types/node-fetch" "^2.5.10" - "@types/yargs" "^17.0.2" - csv-parse "^4.16.0" - int64-buffer "^1.0.0" - node-fetch "^2.6.1" - text-encoding "^0.7.0" - ts-node "^10.0.0" - typescript "^4.3.4" - yargs "^17.1.1" - -escalade@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" - integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== - -fetch-blob@^3.1.2, fetch-blob@^3.1.4: - version "3.1.4" - resolved "https://registry.yarnpkg.com/fetch-blob/-/fetch-blob-3.1.4.tgz#e8c6567f80ad7fc22fd302e7dcb72bafde9c1717" - integrity sha512-Eq5Xv5+VlSrYWEqKrusxY1C3Hm/hjeAsCGVG3ft7pZahlUAChpGZT/Ms1WmSLnEAisEXszjzu/s+ce6HZB2VHA== - dependencies: - node-domexception "^1.0.0" - web-streams-polyfill "^3.0.3" - -form-data@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f" - integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.8" - mime-types "^2.1.12" - -formdata-polyfill@^4.0.10: - version "4.0.10" - resolved "https://registry.yarnpkg.com/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz#24807c31c9d402e002ab3d8c720144ceb8848423" - integrity sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g== - dependencies: - fetch-blob "^3.1.2" - -get-caller-file@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" - integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== - -int64-buffer@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/int64-buffer/-/int64-buffer-1.0.1.tgz#c78d841b444cadf036cd04f8683696c740f15dca" - integrity sha512-+3azY4pXrjAupJHU1V9uGERWlhoqNswJNji6aD/02xac7oxol508AsMC5lxKhEqyZeDFy3enq5OGWXF4u75hiw== - -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== - -make-error@^1.1.1: - version "1.3.6" - resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" - integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== - -mime-db@1.51.0: - version "1.51.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.51.0.tgz#d9ff62451859b18342d960850dc3cfb77e63fb0c" - integrity sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g== - -mime-types@^2.1.12: - version "2.1.34" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.34.tgz#5a712f9ec1503511a945803640fafe09d3793c24" - integrity sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A== - dependencies: - mime-db "1.51.0" - -node-domexception@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/node-domexception/-/node-domexception-1.0.0.tgz#6888db46a1f71c0b76b3f7555016b63fe64766e5" - integrity sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ== - -node-fetch@*: - version "3.2.0" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-3.2.0.tgz#59390db4e489184fa35d4b74caf5510e8dfbaf3b" - integrity sha512-8xeimMwMItMw8hRrOl3C9/xzU49HV/yE6ORew/l+dxWimO5A4Ra8ld2rerlJvc/O7et5Z1zrWsPX43v1QBjCxw== - dependencies: - data-uri-to-buffer "^4.0.0" - fetch-blob "^3.1.4" - formdata-polyfill "^4.0.10" - -node-fetch@^2.6.1: - version "2.6.7" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" - integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== - dependencies: - whatwg-url "^5.0.0" - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= - -string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -text-encoding@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/text-encoding/-/text-encoding-0.7.0.tgz#f895e836e45990624086601798ea98e8f36ee643" - integrity sha512-oJQ3f1hrOnbRLOcwKz0Liq2IcrvDeZRHXhd9RgLrsT+DjWY/nty1Hi7v3dtkaEYbPYe0mUoOfzRrMwfXXwgPUA== - -tr46@~0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" - integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= - -ts-node@^10.0.0: - version "10.5.0" - resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.5.0.tgz#618bef5854c1fbbedf5e31465cbb224a1d524ef9" - integrity sha512-6kEJKwVxAJ35W4akuiysfKwKmjkbYxwQMTBaAxo9KKAx/Yd26mPUyhGz3ji+EsJoAgrLqVsYHNuuYwQe22lbtw== - dependencies: - "@cspotcode/source-map-support" "0.7.0" - "@tsconfig/node10" "^1.0.7" - "@tsconfig/node12" "^1.0.7" - "@tsconfig/node14" "^1.0.0" - "@tsconfig/node16" "^1.0.2" - acorn "^8.4.1" - acorn-walk "^8.1.1" - arg "^4.1.0" - create-require "^1.1.0" - diff "^4.0.1" - make-error "^1.1.1" - v8-compile-cache-lib "^3.0.0" - yn "3.1.1" - -typescript@^4.3.4: - version "4.5.5" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.5.5.tgz#d8c953832d28924a9e3d37c73d729c846c5896f3" - integrity sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA== - -v8-compile-cache-lib@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.0.tgz#0582bcb1c74f3a2ee46487ceecf372e46bce53e8" - integrity sha512-mpSYqfsFvASnSn5qMiwrr4VKfumbPyONLCOPmsR3A6pTY/r0+tSaVbgPWSAIuzbk3lCTa+FForeTiO+wBQGkjA== - -web-streams-polyfill@^3.0.3: - version "3.2.0" - resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-3.2.0.tgz#a6b74026b38e4885869fb5c589e90b95ccfc7965" - integrity sha512-EqPmREeOzttaLRm5HS7io98goBgZ7IVz79aDvqjD0kYXLtFZTc0T/U6wHTPKyIjb+MdN7DFIIX6hgdBEpWmfPA== - -webidl-conversions@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" - integrity sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE= - -whatwg-url@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" - integrity sha1-lmRU6HZUYuN2RNNib2dCzotwll0= - dependencies: - tr46 "~0.0.3" - webidl-conversions "^3.0.0" - -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -y18n@^5.0.5: - version "5.0.8" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" - integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== - -yargs-parser@^21.0.0: - version "21.0.0" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.0.0.tgz#a485d3966be4317426dd56bdb6a30131b281dc55" - integrity sha512-z9kApYUOCwoeZ78rfRYYWdiU/iNL6mwwYlkkZfJoyMR1xps+NEBX5X7XmRpxkZHhXJ6+Ey00IwKxBBSW9FIjyA== - -yargs@^17.1.1: - version "17.3.1" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.3.1.tgz#da56b28f32e2fd45aefb402ed9c26f42be4c07b9" - integrity sha512-WUANQeVgjLbNsEmGk20f+nlHgOqzRFpiGWVaBrYGYIGANIIu3lWjoyi0fNlFmJkvfhCZ6BXINe7/W2O2bV4iaA== - dependencies: - cliui "^7.0.2" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.3" - y18n "^5.0.5" - yargs-parser "^21.0.0" - -yn@3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" - integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== From 1060afb7d224b010290f9cac039ec2ec66f1cb46 Mon Sep 17 00:00:00 2001 From: Kevin Kei Tuncer Date: Fri, 25 Nov 2022 15:30:24 +0900 Subject: [PATCH 24/24] Explanation about the version numbers --- README.md | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 3ace719..64b348f 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,12 @@ Contracts and tools to create a bridge between WAX tokens and an ERC-20 counterpart. +## Versions + +The version numbers are necessary to make all teleports compatible with custom frontends. This project is called version 1 and is a backwards compatible fork of the origin [Alien Worlds teleport](https://github.com/Alien-Worlds/alienteleport). The project of [SavAct](https://github.com/SavAct/eosioteleport) is a fork of version 1 and is called version 2. Each fork brings up a lot of new features and reduces the running costs. + +[Version 2](https://github.com/SavAct/eosioteleport) is not backwards compatible, but recommended for new projects because it offers the most advantages, is fully tested and already used by real world applications. + ## Contracts There are contracts available for both EOSIO chains and Ethereum, both should be deployed on their respective chains. @@ -9,12 +15,12 @@ After deploying the EOSIO contract call the `ini` function to initialize it. Eac ## Process -Transferring from EOSIO -> ETH requires depositing the tokens to the EOSIO contract with a standard transfer (no memo required), +Transferring from EOSIO -> ETH requires depositing the tokens to the EOSIO contract with a standard transfer (no memo required), then teleporting the tokens using the `teleport` action. Transferring from ETH -> EOSIO simply requires callint the `teleport` function on the Ethereum contract. -You can use the SavAct WebApp as frontend by entering your EOSIO contract and network. For direct selection add your settings to the URL +You can use the SavAct WebApp as frontend by entering your EOSIO contract and network. For direct selection add your settings to the URL [https://savact.app/#/_trx_/teleport?bridge=**other.worlds**&eosio=**WAX**ð=**BSC**](https://savact.app/#/_trx_/teleport?bridge=other.worlds&eosio=WAXð=BSC) The app is only compatible with the EOSIO teleport contract of version 1 and higher. For more information see its [README.md](./contracts/teleporteos/README.md) @@ -31,4 +37,4 @@ Oracles can then call the received function on each contract when they see a tra 1. Copy config-example.js to config.js 2. Change the configuration settings to match your tokens -3. Start the oracle using the following command `CONFIG=./[path/to/config] oracle-eos|eth.js` \ No newline at end of file +3. Start the oracle using the following command `CONFIG=./[path/to/config] oracle-eos|eth.js`