├── .gitattributes ├── .gitignore ├── LICENSE ├── README.md ├── debug ├── base.json └── runner.sh ├── migrations └── 1_deploy_token.js ├── package-lock.json ├── package.json ├── scripts └── compile.js ├── src ├── allowance.etk ├── approve.etk ├── balance_of.etk ├── ctor.etk ├── jump_table.etk ├── token.abi ├── transfer.etk └── transfer_from.etk ├── test └── token.js └── truffle-config.js /.gitattributes: -------------------------------------------------------------------------------- 1 | *.etk linguist-language=asm 2 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | *.bin 3 | build 4 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Permission is hereby granted, free of charge, to any 2 | person obtaining a copy of this software and associated 3 | documentation files (the "Software"), to deal in the 4 | Software without restriction, including without 5 | limitation the rights to use, copy, modify, merge, 6 | publish, distribute, sublicense, and/or sell copies of 7 | the Software, and to permit persons to whom the Software 8 | is furnished to do so, subject to the following 9 | conditions: 10 | 11 | The above copyright notice and this permission notice 12 | shall be included in all copies or substantial portions 13 | of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF 16 | ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED 17 | TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A 18 | PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT 19 | SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY 20 | CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 21 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR 22 | IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 23 | DEALINGS IN THE SOFTWARE. 24 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # erc20.etk 2 | [![license](https://img.shields.io/github/license/lightclient/erc20?style=plastic)](LICENSE) 3 | 4 | This is an implementation of the [ERC-20](https://eips.ethereum.org/EIPS/eip-20) token standard in [`etk`](https://github.com/quilt/etk). 5 | 6 | Barely tested and not audited. Use at your own risk. 7 | -------------------------------------------------------------------------------- /debug/base.json: -------------------------------------------------------------------------------- 1 | { 2 | "env": { 3 | "currentCoinbase" : "0x2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", 4 | "currentDifficulty" : "0x020000", 5 | "currentGasLimit" : "0x3b9aca00", 6 | "currentNumber" : "0x01", 7 | "currentTimestamp" : "0x03e8" 8 | }, 9 | "alloc": { 10 | "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { 11 | "balance" : "0x0de0b6b3a7640000", 12 | "code" : "0x", 13 | "nonce" : "0x00", 14 | "storage" : {} 15 | }, 16 | "0x095e7baea6a6c7c4c2dfeb977efac326af552d87" : { 17 | "code": "0x366000803760005160e01c8063313ce5671463000000b157806318160ddd1463000000b257806370a08231146300000052578063a9059cbb14630000008d57806323b872dd1463000000b3575b60006000fd5b506000517f00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff1660201b60015160e01c17546000908152602090f35b503354601851818111630000004c5780919003335560045180549091019055600080f35b5b5b00", 18 | "storage": { 19 | "0x000000000000000000000000a94f5374fce5edbc8e2a8697c15331677e6ebf0b": "0x0000000000000000000000000000000000000000000000000000000000002710" 20 | }, 21 | "balance": "0x186a0", 22 | "nonce": "0x1" 23 | } 24 | }, 25 | "txs": [ 26 | { 27 | "input" : "0x70a08231000000000000000000000000a94f5374fce5edbc8e2a8697c15331677e6ebf0b", 28 | "gas" : "0x5f5e100", 29 | "gasPrice" : "0x1", 30 | "nonce" : "0x0", 31 | "to" : "0x095e7baea6a6c7c4c2dfeb977efac326af552d87", 32 | "value" : "0x186a0", 33 | "v" : "0x0", 34 | "r" : "0x0", 35 | "s" : "0x0", 36 | "secretKey": "0x45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8" 37 | } 38 | ] 39 | } 40 | -------------------------------------------------------------------------------- /debug/runner.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | # Usage: ./run.sh [contract] [hex args] 4 | 5 | target='0x095e7baea6a6c7c4c2dfeb977efac326af552d87' 6 | bin=$(eas $1) 7 | 8 | rm -f trace-0-* 9 | cat debug/base.json | 10 | jq ".alloc[\"$target\"].code = \"0x$bin\"" | 11 | jq ".txs[0].input = \"$2\"" | 12 | ~/dev/go-ethereum/cmd/evm/evm t8n --input.alloc=stdin --input.env=stdin --input.txs=stdin --output.result=stdout --output.alloc=stdout --trace && 13 | traceview trace-0-* 14 | rm -f trace-0-* 15 | -------------------------------------------------------------------------------- /migrations/1_deploy_token.js: -------------------------------------------------------------------------------- 1 | const Token = artifacts.require("Token"); 2 | 3 | module.exports = function (deployer) { 4 | deployer.deploy(Token); 5 | }; 6 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "erc20", 3 | "lockfileVersion": 2, 4 | "requires": true, 5 | "packages": { 6 | "": { 7 | "dependencies": { 8 | "@truffle/artifactor": "^4.0.94", 9 | "ethers": "^5.1.4", 10 | "truffle-assertions": "^0.9.2" 11 | } 12 | }, 13 | "node_modules/@ethersproject/abi": { 14 | "version": "5.4.1", 15 | "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.4.1.tgz", 16 | "integrity": "sha512-9mhbjUk76BiSluiiW4BaYyI58KSbDMMQpCLdsAR+RsT2GyATiNYxVv+pGWRrekmsIdY3I+hOqsYQSTkc8L/mcg==", 17 | "funding": [ 18 | { 19 | "type": "individual", 20 | "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" 21 | }, 22 | { 23 | "type": "individual", 24 | "url": "https://www.buymeacoffee.com/ricmoo" 25 | } 26 | ], 27 | "dependencies": { 28 | "@ethersproject/address": "^5.4.0", 29 | "@ethersproject/bignumber": "^5.4.0", 30 | "@ethersproject/bytes": "^5.4.0", 31 | "@ethersproject/constants": "^5.4.0", 32 | "@ethersproject/hash": "^5.4.0", 33 | "@ethersproject/keccak256": "^5.4.0", 34 | "@ethersproject/logger": "^5.4.0", 35 | "@ethersproject/properties": "^5.4.0", 36 | "@ethersproject/strings": "^5.4.0" 37 | } 38 | }, 39 | "node_modules/@ethersproject/abstract-provider": { 40 | "version": "5.4.1", 41 | "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.4.1.tgz", 42 | "integrity": "sha512-3EedfKI3LVpjSKgAxoUaI+gB27frKsxzm+r21w9G60Ugk+3wVLQwhi1LsEJAKNV7WoZc8CIpNrATlL1QFABjtQ==", 43 | "funding": [ 44 | { 45 | "type": "individual", 46 | "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" 47 | }, 48 | { 49 | "type": "individual", 50 | "url": "https://www.buymeacoffee.com/ricmoo" 51 | } 52 | ], 53 | "dependencies": { 54 | "@ethersproject/bignumber": "^5.4.0", 55 | "@ethersproject/bytes": "^5.4.0", 56 | "@ethersproject/logger": "^5.4.0", 57 | "@ethersproject/networks": "^5.4.0", 58 | "@ethersproject/properties": "^5.4.0", 59 | "@ethersproject/transactions": "^5.4.0", 60 | "@ethersproject/web": "^5.4.0" 61 | } 62 | }, 63 | "node_modules/@ethersproject/abstract-signer": { 64 | "version": "5.4.1", 65 | "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.4.1.tgz", 66 | "integrity": "sha512-SkkFL5HVq1k4/25dM+NWP9MILgohJCgGv5xT5AcRruGz4ILpfHeBtO/y6j+Z3UN/PAjDeb4P7E51Yh8wcGNLGA==", 67 | "funding": [ 68 | { 69 | "type": "individual", 70 | "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" 71 | }, 72 | { 73 | "type": "individual", 74 | "url": "https://www.buymeacoffee.com/ricmoo" 75 | } 76 | ], 77 | "dependencies": { 78 | "@ethersproject/abstract-provider": "^5.4.0", 79 | "@ethersproject/bignumber": "^5.4.0", 80 | "@ethersproject/bytes": "^5.4.0", 81 | "@ethersproject/logger": "^5.4.0", 82 | "@ethersproject/properties": "^5.4.0" 83 | } 84 | }, 85 | "node_modules/@ethersproject/address": { 86 | "version": "5.4.0", 87 | "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.4.0.tgz", 88 | "integrity": "sha512-SD0VgOEkcACEG/C6xavlU1Hy3m5DGSXW3CUHkaaEHbAPPsgi0coP5oNPsxau8eTlZOk/bpa/hKeCNoK5IzVI2Q==", 89 | "funding": [ 90 | { 91 | "type": "individual", 92 | "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" 93 | }, 94 | { 95 | "type": "individual", 96 | "url": "https://www.buymeacoffee.com/ricmoo" 97 | } 98 | ], 99 | "dependencies": { 100 | "@ethersproject/bignumber": "^5.4.0", 101 | "@ethersproject/bytes": "^5.4.0", 102 | "@ethersproject/keccak256": "^5.4.0", 103 | "@ethersproject/logger": "^5.4.0", 104 | "@ethersproject/rlp": "^5.4.0" 105 | } 106 | }, 107 | "node_modules/@ethersproject/base64": { 108 | "version": "5.4.0", 109 | "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.4.0.tgz", 110 | "integrity": "sha512-CjQw6E17QDSSC5jiM9YpF7N1aSCHmYGMt9bWD8PWv6YPMxjsys2/Q8xLrROKI3IWJ7sFfZ8B3flKDTM5wlWuZQ==", 111 | "funding": [ 112 | { 113 | "type": "individual", 114 | "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" 115 | }, 116 | { 117 | "type": "individual", 118 | "url": "https://www.buymeacoffee.com/ricmoo" 119 | } 120 | ], 121 | "dependencies": { 122 | "@ethersproject/bytes": "^5.4.0" 123 | } 124 | }, 125 | "node_modules/@ethersproject/basex": { 126 | "version": "5.4.0", 127 | "resolved": "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.4.0.tgz", 128 | "integrity": "sha512-J07+QCVJ7np2bcpxydFVf/CuYo9mZ7T73Pe7KQY4c1lRlrixMeblauMxHXD0MPwFmUHZIILDNViVkykFBZylbg==", 129 | "funding": [ 130 | { 131 | "type": "individual", 132 | "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" 133 | }, 134 | { 135 | "type": "individual", 136 | "url": "https://www.buymeacoffee.com/ricmoo" 137 | } 138 | ], 139 | "dependencies": { 140 | "@ethersproject/bytes": "^5.4.0", 141 | "@ethersproject/properties": "^5.4.0" 142 | } 143 | }, 144 | "node_modules/@ethersproject/bignumber": { 145 | "version": "5.4.2", 146 | "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.4.2.tgz", 147 | "integrity": "sha512-oIBDhsKy5bs7j36JlaTzFgNPaZjiNDOXsdSgSpXRucUl+UA6L/1YLlFeI3cPAoodcenzF4nxNPV13pcy7XbWjA==", 148 | "funding": [ 149 | { 150 | "type": "individual", 151 | "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" 152 | }, 153 | { 154 | "type": "individual", 155 | "url": "https://www.buymeacoffee.com/ricmoo" 156 | } 157 | ], 158 | "dependencies": { 159 | "@ethersproject/bytes": "^5.4.0", 160 | "@ethersproject/logger": "^5.4.0", 161 | "bn.js": "^4.11.9" 162 | } 163 | }, 164 | "node_modules/@ethersproject/bytes": { 165 | "version": "5.4.0", 166 | "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.4.0.tgz", 167 | "integrity": "sha512-H60ceqgTHbhzOj4uRc/83SCN9d+BSUnOkrr2intevqdtEMO1JFVZ1XL84OEZV+QjV36OaZYxtnt4lGmxcGsPfA==", 168 | "funding": [ 169 | { 170 | "type": "individual", 171 | "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" 172 | }, 173 | { 174 | "type": "individual", 175 | "url": "https://www.buymeacoffee.com/ricmoo" 176 | } 177 | ], 178 | "dependencies": { 179 | "@ethersproject/logger": "^5.4.0" 180 | } 181 | }, 182 | "node_modules/@ethersproject/constants": { 183 | "version": "5.4.0", 184 | "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.4.0.tgz", 185 | "integrity": "sha512-tzjn6S7sj9+DIIeKTJLjK9WGN2Tj0P++Z8ONEIlZjyoTkBuODN+0VfhAyYksKi43l1Sx9tX2VlFfzjfmr5Wl3Q==", 186 | "funding": [ 187 | { 188 | "type": "individual", 189 | "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" 190 | }, 191 | { 192 | "type": "individual", 193 | "url": "https://www.buymeacoffee.com/ricmoo" 194 | } 195 | ], 196 | "dependencies": { 197 | "@ethersproject/bignumber": "^5.4.0" 198 | } 199 | }, 200 | "node_modules/@ethersproject/contracts": { 201 | "version": "5.4.1", 202 | "resolved": "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.4.1.tgz", 203 | "integrity": "sha512-m+z2ZgPy4pyR15Je//dUaymRUZq5MtDajF6GwFbGAVmKz/RF+DNIPwF0k5qEcL3wPGVqUjFg2/krlCRVTU4T5w==", 204 | "funding": [ 205 | { 206 | "type": "individual", 207 | "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" 208 | }, 209 | { 210 | "type": "individual", 211 | "url": "https://www.buymeacoffee.com/ricmoo" 212 | } 213 | ], 214 | "dependencies": { 215 | "@ethersproject/abi": "^5.4.0", 216 | "@ethersproject/abstract-provider": "^5.4.0", 217 | "@ethersproject/abstract-signer": "^5.4.0", 218 | "@ethersproject/address": "^5.4.0", 219 | "@ethersproject/bignumber": "^5.4.0", 220 | "@ethersproject/bytes": "^5.4.0", 221 | "@ethersproject/constants": "^5.4.0", 222 | "@ethersproject/logger": "^5.4.0", 223 | "@ethersproject/properties": "^5.4.0", 224 | "@ethersproject/transactions": "^5.4.0" 225 | } 226 | }, 227 | "node_modules/@ethersproject/hash": { 228 | "version": "5.4.0", 229 | "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.4.0.tgz", 230 | "integrity": "sha512-xymAM9tmikKgbktOCjW60Z5sdouiIIurkZUr9oW5NOex5uwxrbsYG09kb5bMcNjlVeJD3yPivTNzViIs1GCbqA==", 231 | "funding": [ 232 | { 233 | "type": "individual", 234 | "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" 235 | }, 236 | { 237 | "type": "individual", 238 | "url": "https://www.buymeacoffee.com/ricmoo" 239 | } 240 | ], 241 | "dependencies": { 242 | "@ethersproject/abstract-signer": "^5.4.0", 243 | "@ethersproject/address": "^5.4.0", 244 | "@ethersproject/bignumber": "^5.4.0", 245 | "@ethersproject/bytes": "^5.4.0", 246 | "@ethersproject/keccak256": "^5.4.0", 247 | "@ethersproject/logger": "^5.4.0", 248 | "@ethersproject/properties": "^5.4.0", 249 | "@ethersproject/strings": "^5.4.0" 250 | } 251 | }, 252 | "node_modules/@ethersproject/hdnode": { 253 | "version": "5.4.0", 254 | "resolved": "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.4.0.tgz", 255 | "integrity": "sha512-pKxdS0KAaeVGfZPp1KOiDLB0jba11tG6OP1u11QnYfb7pXn6IZx0xceqWRr6ygke8+Kw74IpOoSi7/DwANhy8Q==", 256 | "funding": [ 257 | { 258 | "type": "individual", 259 | "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" 260 | }, 261 | { 262 | "type": "individual", 263 | "url": "https://www.buymeacoffee.com/ricmoo" 264 | } 265 | ], 266 | "dependencies": { 267 | "@ethersproject/abstract-signer": "^5.4.0", 268 | "@ethersproject/basex": "^5.4.0", 269 | "@ethersproject/bignumber": "^5.4.0", 270 | "@ethersproject/bytes": "^5.4.0", 271 | "@ethersproject/logger": "^5.4.0", 272 | "@ethersproject/pbkdf2": "^5.4.0", 273 | "@ethersproject/properties": "^5.4.0", 274 | "@ethersproject/sha2": "^5.4.0", 275 | "@ethersproject/signing-key": "^5.4.0", 276 | "@ethersproject/strings": "^5.4.0", 277 | "@ethersproject/transactions": "^5.4.0", 278 | "@ethersproject/wordlists": "^5.4.0" 279 | } 280 | }, 281 | "node_modules/@ethersproject/json-wallets": { 282 | "version": "5.4.0", 283 | "resolved": "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.4.0.tgz", 284 | "integrity": "sha512-igWcu3fx4aiczrzEHwG1xJZo9l1cFfQOWzTqwRw/xcvxTk58q4f9M7cjh51EKphMHvrJtcezJ1gf1q1AUOfEQQ==", 285 | "funding": [ 286 | { 287 | "type": "individual", 288 | "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" 289 | }, 290 | { 291 | "type": "individual", 292 | "url": "https://www.buymeacoffee.com/ricmoo" 293 | } 294 | ], 295 | "dependencies": { 296 | "@ethersproject/abstract-signer": "^5.4.0", 297 | "@ethersproject/address": "^5.4.0", 298 | "@ethersproject/bytes": "^5.4.0", 299 | "@ethersproject/hdnode": "^5.4.0", 300 | "@ethersproject/keccak256": "^5.4.0", 301 | "@ethersproject/logger": "^5.4.0", 302 | "@ethersproject/pbkdf2": "^5.4.0", 303 | "@ethersproject/properties": "^5.4.0", 304 | "@ethersproject/random": "^5.4.0", 305 | "@ethersproject/strings": "^5.4.0", 306 | "@ethersproject/transactions": "^5.4.0", 307 | "aes-js": "3.0.0", 308 | "scrypt-js": "3.0.1" 309 | } 310 | }, 311 | "node_modules/@ethersproject/keccak256": { 312 | "version": "5.4.0", 313 | "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.4.0.tgz", 314 | "integrity": "sha512-FBI1plWet+dPUvAzPAeHzRKiPpETQzqSUWR1wXJGHVWi4i8bOSrpC3NwpkPjgeXG7MnugVc1B42VbfnQikyC/A==", 315 | "funding": [ 316 | { 317 | "type": "individual", 318 | "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" 319 | }, 320 | { 321 | "type": "individual", 322 | "url": "https://www.buymeacoffee.com/ricmoo" 323 | } 324 | ], 325 | "dependencies": { 326 | "@ethersproject/bytes": "^5.4.0", 327 | "js-sha3": "0.5.7" 328 | } 329 | }, 330 | "node_modules/@ethersproject/logger": { 331 | "version": "5.4.1", 332 | "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.4.1.tgz", 333 | "integrity": "sha512-DZ+bRinnYLPw1yAC64oRl0QyVZj43QeHIhVKfD/+YwSz4wsv1pfwb5SOFjz+r710YEWzU6LrhuSjpSO+6PeE4A==", 334 | "funding": [ 335 | { 336 | "type": "individual", 337 | "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" 338 | }, 339 | { 340 | "type": "individual", 341 | "url": "https://www.buymeacoffee.com/ricmoo" 342 | } 343 | ] 344 | }, 345 | "node_modules/@ethersproject/networks": { 346 | "version": "5.4.2", 347 | "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.4.2.tgz", 348 | "integrity": "sha512-eekOhvJyBnuibfJnhtK46b8HimBc5+4gqpvd1/H9LEl7Q7/qhsIhM81dI9Fcnjpk3jB1aTy6bj0hz3cifhNeYw==", 349 | "funding": [ 350 | { 351 | "type": "individual", 352 | "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" 353 | }, 354 | { 355 | "type": "individual", 356 | "url": "https://www.buymeacoffee.com/ricmoo" 357 | } 358 | ], 359 | "dependencies": { 360 | "@ethersproject/logger": "^5.4.0" 361 | } 362 | }, 363 | "node_modules/@ethersproject/pbkdf2": { 364 | "version": "5.4.0", 365 | "resolved": "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.4.0.tgz", 366 | "integrity": "sha512-x94aIv6tiA04g6BnazZSLoRXqyusawRyZWlUhKip2jvoLpzJuLb//KtMM6PEovE47pMbW+Qe1uw+68ameJjB7g==", 367 | "funding": [ 368 | { 369 | "type": "individual", 370 | "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" 371 | }, 372 | { 373 | "type": "individual", 374 | "url": "https://www.buymeacoffee.com/ricmoo" 375 | } 376 | ], 377 | "dependencies": { 378 | "@ethersproject/bytes": "^5.4.0", 379 | "@ethersproject/sha2": "^5.4.0" 380 | } 381 | }, 382 | "node_modules/@ethersproject/properties": { 383 | "version": "5.4.1", 384 | "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.4.1.tgz", 385 | "integrity": "sha512-cyCGlF8wWlIZyizsj2PpbJ9I7rIlUAfnHYwy/T90pdkSn/NFTa5YWZx2wTJBe9V7dD65dcrrEMisCRUJiq6n3w==", 386 | "funding": [ 387 | { 388 | "type": "individual", 389 | "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" 390 | }, 391 | { 392 | "type": "individual", 393 | "url": "https://www.buymeacoffee.com/ricmoo" 394 | } 395 | ], 396 | "dependencies": { 397 | "@ethersproject/logger": "^5.4.0" 398 | } 399 | }, 400 | "node_modules/@ethersproject/providers": { 401 | "version": "5.4.5", 402 | "resolved": "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.4.5.tgz", 403 | "integrity": "sha512-1GkrvkiAw3Fj28cwi1Sqm8ED1RtERtpdXmRfwIBGmqBSN5MoeRUHuwHPppMtbPayPgpFcvD7/Gdc9doO5fGYgw==", 404 | "funding": [ 405 | { 406 | "type": "individual", 407 | "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" 408 | }, 409 | { 410 | "type": "individual", 411 | "url": "https://www.buymeacoffee.com/ricmoo" 412 | } 413 | ], 414 | "dependencies": { 415 | "@ethersproject/abstract-provider": "^5.4.0", 416 | "@ethersproject/abstract-signer": "^5.4.0", 417 | "@ethersproject/address": "^5.4.0", 418 | "@ethersproject/basex": "^5.4.0", 419 | "@ethersproject/bignumber": "^5.4.0", 420 | "@ethersproject/bytes": "^5.4.0", 421 | "@ethersproject/constants": "^5.4.0", 422 | "@ethersproject/hash": "^5.4.0", 423 | "@ethersproject/logger": "^5.4.0", 424 | "@ethersproject/networks": "^5.4.0", 425 | "@ethersproject/properties": "^5.4.0", 426 | "@ethersproject/random": "^5.4.0", 427 | "@ethersproject/rlp": "^5.4.0", 428 | "@ethersproject/sha2": "^5.4.0", 429 | "@ethersproject/strings": "^5.4.0", 430 | "@ethersproject/transactions": "^5.4.0", 431 | "@ethersproject/web": "^5.4.0", 432 | "bech32": "1.1.4", 433 | "ws": "7.4.6" 434 | } 435 | }, 436 | "node_modules/@ethersproject/random": { 437 | "version": "5.4.0", 438 | "resolved": "https://registry.npmjs.org/@ethersproject/random/-/random-5.4.0.tgz", 439 | "integrity": "sha512-pnpWNQlf0VAZDEOVp1rsYQosmv2o0ITS/PecNw+mS2/btF8eYdspkN0vIXrCMtkX09EAh9bdk8GoXmFXM1eAKw==", 440 | "funding": [ 441 | { 442 | "type": "individual", 443 | "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" 444 | }, 445 | { 446 | "type": "individual", 447 | "url": "https://www.buymeacoffee.com/ricmoo" 448 | } 449 | ], 450 | "dependencies": { 451 | "@ethersproject/bytes": "^5.4.0", 452 | "@ethersproject/logger": "^5.4.0" 453 | } 454 | }, 455 | "node_modules/@ethersproject/rlp": { 456 | "version": "5.4.0", 457 | "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.4.0.tgz", 458 | "integrity": "sha512-0I7MZKfi+T5+G8atId9QaQKHRvvasM/kqLyAH4XxBCBchAooH2EX5rL9kYZWwcm3awYV+XC7VF6nLhfeQFKVPg==", 459 | "funding": [ 460 | { 461 | "type": "individual", 462 | "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" 463 | }, 464 | { 465 | "type": "individual", 466 | "url": "https://www.buymeacoffee.com/ricmoo" 467 | } 468 | ], 469 | "dependencies": { 470 | "@ethersproject/bytes": "^5.4.0", 471 | "@ethersproject/logger": "^5.4.0" 472 | } 473 | }, 474 | "node_modules/@ethersproject/sha2": { 475 | "version": "5.4.0", 476 | "resolved": "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.4.0.tgz", 477 | "integrity": "sha512-siheo36r1WD7Cy+bDdE1BJ8y0bDtqXCOxRMzPa4bV1TGt/eTUUt03BHoJNB6reWJD8A30E/pdJ8WFkq+/uz4Gg==", 478 | "funding": [ 479 | { 480 | "type": "individual", 481 | "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" 482 | }, 483 | { 484 | "type": "individual", 485 | "url": "https://www.buymeacoffee.com/ricmoo" 486 | } 487 | ], 488 | "dependencies": { 489 | "@ethersproject/bytes": "^5.4.0", 490 | "@ethersproject/logger": "^5.4.0", 491 | "hash.js": "1.1.7" 492 | } 493 | }, 494 | "node_modules/@ethersproject/signing-key": { 495 | "version": "5.4.0", 496 | "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.4.0.tgz", 497 | "integrity": "sha512-q8POUeywx6AKg2/jX9qBYZIAmKSB4ubGXdQ88l40hmATj29JnG5pp331nAWwwxPn2Qao4JpWHNZsQN+bPiSW9A==", 498 | "funding": [ 499 | { 500 | "type": "individual", 501 | "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" 502 | }, 503 | { 504 | "type": "individual", 505 | "url": "https://www.buymeacoffee.com/ricmoo" 506 | } 507 | ], 508 | "dependencies": { 509 | "@ethersproject/bytes": "^5.4.0", 510 | "@ethersproject/logger": "^5.4.0", 511 | "@ethersproject/properties": "^5.4.0", 512 | "bn.js": "^4.11.9", 513 | "elliptic": "6.5.4", 514 | "hash.js": "1.1.7" 515 | } 516 | }, 517 | "node_modules/@ethersproject/solidity": { 518 | "version": "5.4.0", 519 | "resolved": "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.4.0.tgz", 520 | "integrity": "sha512-XFQTZ7wFSHOhHcV1DpcWj7VXECEiSrBuv7JErJvB9Uo+KfCdc3QtUZV+Vjh/AAaYgezUEKbCtE6Khjm44seevQ==", 521 | "funding": [ 522 | { 523 | "type": "individual", 524 | "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" 525 | }, 526 | { 527 | "type": "individual", 528 | "url": "https://www.buymeacoffee.com/ricmoo" 529 | } 530 | ], 531 | "dependencies": { 532 | "@ethersproject/bignumber": "^5.4.0", 533 | "@ethersproject/bytes": "^5.4.0", 534 | "@ethersproject/keccak256": "^5.4.0", 535 | "@ethersproject/sha2": "^5.4.0", 536 | "@ethersproject/strings": "^5.4.0" 537 | } 538 | }, 539 | "node_modules/@ethersproject/strings": { 540 | "version": "5.4.0", 541 | "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.4.0.tgz", 542 | "integrity": "sha512-k/9DkH5UGDhv7aReXLluFG5ExurwtIpUfnDNhQA29w896Dw3i4uDTz01Quaptbks1Uj9kI8wo9tmW73wcIEaWA==", 543 | "funding": [ 544 | { 545 | "type": "individual", 546 | "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" 547 | }, 548 | { 549 | "type": "individual", 550 | "url": "https://www.buymeacoffee.com/ricmoo" 551 | } 552 | ], 553 | "dependencies": { 554 | "@ethersproject/bytes": "^5.4.0", 555 | "@ethersproject/constants": "^5.4.0", 556 | "@ethersproject/logger": "^5.4.0" 557 | } 558 | }, 559 | "node_modules/@ethersproject/transactions": { 560 | "version": "5.4.0", 561 | "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.4.0.tgz", 562 | "integrity": "sha512-s3EjZZt7xa4BkLknJZ98QGoIza94rVjaEed0rzZ/jB9WrIuu/1+tjvYCWzVrystXtDswy7TPBeIepyXwSYa4WQ==", 563 | "funding": [ 564 | { 565 | "type": "individual", 566 | "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" 567 | }, 568 | { 569 | "type": "individual", 570 | "url": "https://www.buymeacoffee.com/ricmoo" 571 | } 572 | ], 573 | "dependencies": { 574 | "@ethersproject/address": "^5.4.0", 575 | "@ethersproject/bignumber": "^5.4.0", 576 | "@ethersproject/bytes": "^5.4.0", 577 | "@ethersproject/constants": "^5.4.0", 578 | "@ethersproject/keccak256": "^5.4.0", 579 | "@ethersproject/logger": "^5.4.0", 580 | "@ethersproject/properties": "^5.4.0", 581 | "@ethersproject/rlp": "^5.4.0", 582 | "@ethersproject/signing-key": "^5.4.0" 583 | } 584 | }, 585 | "node_modules/@ethersproject/units": { 586 | "version": "5.4.0", 587 | "resolved": "https://registry.npmjs.org/@ethersproject/units/-/units-5.4.0.tgz", 588 | "integrity": "sha512-Z88krX40KCp+JqPCP5oPv5p750g+uU6gopDYRTBGcDvOASh6qhiEYCRatuM/suC4S2XW9Zz90QI35MfSrTIaFg==", 589 | "funding": [ 590 | { 591 | "type": "individual", 592 | "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" 593 | }, 594 | { 595 | "type": "individual", 596 | "url": "https://www.buymeacoffee.com/ricmoo" 597 | } 598 | ], 599 | "dependencies": { 600 | "@ethersproject/bignumber": "^5.4.0", 601 | "@ethersproject/constants": "^5.4.0", 602 | "@ethersproject/logger": "^5.4.0" 603 | } 604 | }, 605 | "node_modules/@ethersproject/wallet": { 606 | "version": "5.4.0", 607 | "resolved": "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.4.0.tgz", 608 | "integrity": "sha512-wU29majLjM6AjCjpat21mPPviG+EpK7wY1+jzKD0fg3ui5fgedf2zEu1RDgpfIMsfn8fJHJuzM4zXZ2+hSHaSQ==", 609 | "funding": [ 610 | { 611 | "type": "individual", 612 | "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" 613 | }, 614 | { 615 | "type": "individual", 616 | "url": "https://www.buymeacoffee.com/ricmoo" 617 | } 618 | ], 619 | "dependencies": { 620 | "@ethersproject/abstract-provider": "^5.4.0", 621 | "@ethersproject/abstract-signer": "^5.4.0", 622 | "@ethersproject/address": "^5.4.0", 623 | "@ethersproject/bignumber": "^5.4.0", 624 | "@ethersproject/bytes": "^5.4.0", 625 | "@ethersproject/hash": "^5.4.0", 626 | "@ethersproject/hdnode": "^5.4.0", 627 | "@ethersproject/json-wallets": "^5.4.0", 628 | "@ethersproject/keccak256": "^5.4.0", 629 | "@ethersproject/logger": "^5.4.0", 630 | "@ethersproject/properties": "^5.4.0", 631 | "@ethersproject/random": "^5.4.0", 632 | "@ethersproject/signing-key": "^5.4.0", 633 | "@ethersproject/transactions": "^5.4.0", 634 | "@ethersproject/wordlists": "^5.4.0" 635 | } 636 | }, 637 | "node_modules/@ethersproject/web": { 638 | "version": "5.4.0", 639 | "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.4.0.tgz", 640 | "integrity": "sha512-1bUusGmcoRLYgMn6c1BLk1tOKUIFuTg8j+6N8lYlbMpDesnle+i3pGSagGNvwjaiLo4Y5gBibwctpPRmjrh4Og==", 641 | "funding": [ 642 | { 643 | "type": "individual", 644 | "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" 645 | }, 646 | { 647 | "type": "individual", 648 | "url": "https://www.buymeacoffee.com/ricmoo" 649 | } 650 | ], 651 | "dependencies": { 652 | "@ethersproject/base64": "^5.4.0", 653 | "@ethersproject/bytes": "^5.4.0", 654 | "@ethersproject/logger": "^5.4.0", 655 | "@ethersproject/properties": "^5.4.0", 656 | "@ethersproject/strings": "^5.4.0" 657 | } 658 | }, 659 | "node_modules/@ethersproject/wordlists": { 660 | "version": "5.4.0", 661 | "resolved": "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.4.0.tgz", 662 | "integrity": "sha512-FemEkf6a+EBKEPxlzeVgUaVSodU7G0Na89jqKjmWMlDB0tomoU8RlEMgUvXyqtrg8N4cwpLh8nyRnm1Nay1isA==", 663 | "funding": [ 664 | { 665 | "type": "individual", 666 | "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" 667 | }, 668 | { 669 | "type": "individual", 670 | "url": "https://www.buymeacoffee.com/ricmoo" 671 | } 672 | ], 673 | "dependencies": { 674 | "@ethersproject/bytes": "^5.4.0", 675 | "@ethersproject/hash": "^5.4.0", 676 | "@ethersproject/logger": "^5.4.0", 677 | "@ethersproject/properties": "^5.4.0", 678 | "@ethersproject/strings": "^5.4.0" 679 | } 680 | }, 681 | "node_modules/@truffle/artifactor": { 682 | "version": "4.0.94", 683 | "resolved": "https://registry.npmjs.org/@truffle/artifactor/-/artifactor-4.0.94.tgz", 684 | "integrity": "sha512-y7Rb2CCxEsLabahBv92W7CBCx7K7jMeeXrtNMGgx3ZNSuQk7Z/i7dwdSkIGQhZuMtxh7PBCDzigDckUVgGnEfA==", 685 | "dependencies": { 686 | "@truffle/contract-schema": "^3.3.3", 687 | "fs-extra": "^8.1.0", 688 | "lodash.assign": "^4.2.0", 689 | "lodash.merge": "^4.6.2", 690 | "source-map-support": "^0.5.19" 691 | } 692 | }, 693 | "node_modules/@truffle/contract-schema": { 694 | "version": "3.3.3", 695 | "resolved": "https://registry.npmjs.org/@truffle/contract-schema/-/contract-schema-3.3.3.tgz", 696 | "integrity": "sha512-4bvcEoGycopJBPoCiqHP5Q72/1t/ixYS/pVHru+Rzvad641BgvoGrkd4YnyJ+E/MVb4ZLrndL7whmdGqV5B7SA==", 697 | "dependencies": { 698 | "ajv": "^6.10.0", 699 | "crypto-js": "^3.1.9-1", 700 | "debug": "^4.1.0" 701 | } 702 | }, 703 | "node_modules/aes-js": { 704 | "version": "3.0.0", 705 | "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz", 706 | "integrity": "sha1-4h3xCtbCBTKVvLuNq0Cwnb6ofk0=" 707 | }, 708 | "node_modules/ajv": { 709 | "version": "6.12.6", 710 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", 711 | "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", 712 | "dependencies": { 713 | "fast-deep-equal": "^3.1.1", 714 | "fast-json-stable-stringify": "^2.0.0", 715 | "json-schema-traverse": "^0.4.1", 716 | "uri-js": "^4.2.2" 717 | }, 718 | "funding": { 719 | "type": "github", 720 | "url": "https://github.com/sponsors/epoberezkin" 721 | } 722 | }, 723 | "node_modules/assertion-error": { 724 | "version": "1.1.0", 725 | "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", 726 | "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", 727 | "engines": { 728 | "node": "*" 729 | } 730 | }, 731 | "node_modules/bech32": { 732 | "version": "1.1.4", 733 | "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz", 734 | "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==" 735 | }, 736 | "node_modules/bn.js": { 737 | "version": "4.12.0", 738 | "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", 739 | "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" 740 | }, 741 | "node_modules/brorand": { 742 | "version": "1.1.0", 743 | "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", 744 | "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" 745 | }, 746 | "node_modules/buffer-from": { 747 | "version": "1.1.1", 748 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", 749 | "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" 750 | }, 751 | "node_modules/crypto-js": { 752 | "version": "3.3.0", 753 | "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-3.3.0.tgz", 754 | "integrity": "sha512-DIT51nX0dCfKltpRiXV+/TVZq+Qq2NgF4644+K7Ttnla7zEzqc+kjJyiB96BHNyUTBxyjzRcZYpUdZa+QAqi6Q==" 755 | }, 756 | "node_modules/debug": { 757 | "version": "4.3.1", 758 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", 759 | "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", 760 | "dependencies": { 761 | "ms": "2.1.2" 762 | }, 763 | "engines": { 764 | "node": ">=6.0" 765 | }, 766 | "peerDependenciesMeta": { 767 | "supports-color": { 768 | "optional": true 769 | } 770 | } 771 | }, 772 | "node_modules/elliptic": { 773 | "version": "6.5.4", 774 | "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", 775 | "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", 776 | "dependencies": { 777 | "bn.js": "^4.11.9", 778 | "brorand": "^1.1.0", 779 | "hash.js": "^1.0.0", 780 | "hmac-drbg": "^1.0.1", 781 | "inherits": "^2.0.4", 782 | "minimalistic-assert": "^1.0.1", 783 | "minimalistic-crypto-utils": "^1.0.1" 784 | } 785 | }, 786 | "node_modules/ethers": { 787 | "version": "5.4.7", 788 | "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.4.7.tgz", 789 | "integrity": "sha512-iZc5p2nqfWK1sj8RabwsPM28cr37Bpq7ehTQ5rWExBr2Y09Sn1lDKZOED26n+TsZMye7Y6mIgQ/1cwpSD8XZew==", 790 | "funding": [ 791 | { 792 | "type": "individual", 793 | "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" 794 | }, 795 | { 796 | "type": "individual", 797 | "url": "https://www.buymeacoffee.com/ricmoo" 798 | } 799 | ], 800 | "dependencies": { 801 | "@ethersproject/abi": "5.4.1", 802 | "@ethersproject/abstract-provider": "5.4.1", 803 | "@ethersproject/abstract-signer": "5.4.1", 804 | "@ethersproject/address": "5.4.0", 805 | "@ethersproject/base64": "5.4.0", 806 | "@ethersproject/basex": "5.4.0", 807 | "@ethersproject/bignumber": "5.4.2", 808 | "@ethersproject/bytes": "5.4.0", 809 | "@ethersproject/constants": "5.4.0", 810 | "@ethersproject/contracts": "5.4.1", 811 | "@ethersproject/hash": "5.4.0", 812 | "@ethersproject/hdnode": "5.4.0", 813 | "@ethersproject/json-wallets": "5.4.0", 814 | "@ethersproject/keccak256": "5.4.0", 815 | "@ethersproject/logger": "5.4.1", 816 | "@ethersproject/networks": "5.4.2", 817 | "@ethersproject/pbkdf2": "5.4.0", 818 | "@ethersproject/properties": "5.4.1", 819 | "@ethersproject/providers": "5.4.5", 820 | "@ethersproject/random": "5.4.0", 821 | "@ethersproject/rlp": "5.4.0", 822 | "@ethersproject/sha2": "5.4.0", 823 | "@ethersproject/signing-key": "5.4.0", 824 | "@ethersproject/solidity": "5.4.0", 825 | "@ethersproject/strings": "5.4.0", 826 | "@ethersproject/transactions": "5.4.0", 827 | "@ethersproject/units": "5.4.0", 828 | "@ethersproject/wallet": "5.4.0", 829 | "@ethersproject/web": "5.4.0", 830 | "@ethersproject/wordlists": "5.4.0" 831 | } 832 | }, 833 | "node_modules/fast-deep-equal": { 834 | "version": "3.1.3", 835 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 836 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" 837 | }, 838 | "node_modules/fast-json-stable-stringify": { 839 | "version": "2.1.0", 840 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 841 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" 842 | }, 843 | "node_modules/fs-extra": { 844 | "version": "8.1.0", 845 | "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", 846 | "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", 847 | "dependencies": { 848 | "graceful-fs": "^4.2.0", 849 | "jsonfile": "^4.0.0", 850 | "universalify": "^0.1.0" 851 | }, 852 | "engines": { 853 | "node": ">=6 <7 || >=8" 854 | } 855 | }, 856 | "node_modules/graceful-fs": { 857 | "version": "4.2.6", 858 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", 859 | "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==" 860 | }, 861 | "node_modules/hash.js": { 862 | "version": "1.1.7", 863 | "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", 864 | "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", 865 | "dependencies": { 866 | "inherits": "^2.0.3", 867 | "minimalistic-assert": "^1.0.1" 868 | } 869 | }, 870 | "node_modules/hmac-drbg": { 871 | "version": "1.0.1", 872 | "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", 873 | "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", 874 | "dependencies": { 875 | "hash.js": "^1.0.3", 876 | "minimalistic-assert": "^1.0.0", 877 | "minimalistic-crypto-utils": "^1.0.1" 878 | } 879 | }, 880 | "node_modules/inherits": { 881 | "version": "2.0.4", 882 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 883 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 884 | }, 885 | "node_modules/js-sha3": { 886 | "version": "0.5.7", 887 | "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", 888 | "integrity": "sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc=" 889 | }, 890 | "node_modules/json-schema-traverse": { 891 | "version": "0.4.1", 892 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 893 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" 894 | }, 895 | "node_modules/jsonfile": { 896 | "version": "4.0.0", 897 | "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", 898 | "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", 899 | "optionalDependencies": { 900 | "graceful-fs": "^4.1.6" 901 | } 902 | }, 903 | "node_modules/lodash.assign": { 904 | "version": "4.2.0", 905 | "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", 906 | "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=" 907 | }, 908 | "node_modules/lodash.isequal": { 909 | "version": "4.5.0", 910 | "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", 911 | "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=" 912 | }, 913 | "node_modules/lodash.merge": { 914 | "version": "4.6.2", 915 | "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", 916 | "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" 917 | }, 918 | "node_modules/minimalistic-assert": { 919 | "version": "1.0.1", 920 | "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", 921 | "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" 922 | }, 923 | "node_modules/minimalistic-crypto-utils": { 924 | "version": "1.0.1", 925 | "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", 926 | "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" 927 | }, 928 | "node_modules/ms": { 929 | "version": "2.1.2", 930 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 931 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 932 | }, 933 | "node_modules/punycode": { 934 | "version": "2.1.1", 935 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", 936 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", 937 | "engines": { 938 | "node": ">=6" 939 | } 940 | }, 941 | "node_modules/scrypt-js": { 942 | "version": "3.0.1", 943 | "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", 944 | "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==" 945 | }, 946 | "node_modules/source-map": { 947 | "version": "0.6.1", 948 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 949 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 950 | "engines": { 951 | "node": ">=0.10.0" 952 | } 953 | }, 954 | "node_modules/source-map-support": { 955 | "version": "0.5.19", 956 | "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", 957 | "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", 958 | "dependencies": { 959 | "buffer-from": "^1.0.0", 960 | "source-map": "^0.6.0" 961 | } 962 | }, 963 | "node_modules/truffle-assertions": { 964 | "version": "0.9.2", 965 | "resolved": "https://registry.npmjs.org/truffle-assertions/-/truffle-assertions-0.9.2.tgz", 966 | "integrity": "sha512-9g2RhaxU2F8DeWhqoGQvL/bV8QVoSnQ6PY+ZPvYRP5eF7+/8LExb4mjLx/FeliLTjc3Tv1SABG05Gu5qQ/ErmA==", 967 | "dependencies": { 968 | "assertion-error": "^1.1.0", 969 | "lodash.isequal": "^4.5.0" 970 | } 971 | }, 972 | "node_modules/universalify": { 973 | "version": "0.1.2", 974 | "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", 975 | "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", 976 | "engines": { 977 | "node": ">= 4.0.0" 978 | } 979 | }, 980 | "node_modules/uri-js": { 981 | "version": "4.4.1", 982 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", 983 | "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", 984 | "dependencies": { 985 | "punycode": "^2.1.0" 986 | } 987 | }, 988 | "node_modules/ws": { 989 | "version": "7.4.6", 990 | "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", 991 | "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", 992 | "engines": { 993 | "node": ">=8.3.0" 994 | }, 995 | "peerDependencies": { 996 | "bufferutil": "^4.0.1", 997 | "utf-8-validate": "^5.0.2" 998 | }, 999 | "peerDependenciesMeta": { 1000 | "bufferutil": { 1001 | "optional": true 1002 | }, 1003 | "utf-8-validate": { 1004 | "optional": true 1005 | } 1006 | } 1007 | } 1008 | }, 1009 | "dependencies": { 1010 | "@ethersproject/abi": { 1011 | "version": "5.4.1", 1012 | "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.4.1.tgz", 1013 | "integrity": "sha512-9mhbjUk76BiSluiiW4BaYyI58KSbDMMQpCLdsAR+RsT2GyATiNYxVv+pGWRrekmsIdY3I+hOqsYQSTkc8L/mcg==", 1014 | "requires": { 1015 | "@ethersproject/address": "^5.4.0", 1016 | "@ethersproject/bignumber": "^5.4.0", 1017 | "@ethersproject/bytes": "^5.4.0", 1018 | "@ethersproject/constants": "^5.4.0", 1019 | "@ethersproject/hash": "^5.4.0", 1020 | "@ethersproject/keccak256": "^5.4.0", 1021 | "@ethersproject/logger": "^5.4.0", 1022 | "@ethersproject/properties": "^5.4.0", 1023 | "@ethersproject/strings": "^5.4.0" 1024 | } 1025 | }, 1026 | "@ethersproject/abstract-provider": { 1027 | "version": "5.4.1", 1028 | "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.4.1.tgz", 1029 | "integrity": "sha512-3EedfKI3LVpjSKgAxoUaI+gB27frKsxzm+r21w9G60Ugk+3wVLQwhi1LsEJAKNV7WoZc8CIpNrATlL1QFABjtQ==", 1030 | "requires": { 1031 | "@ethersproject/bignumber": "^5.4.0", 1032 | "@ethersproject/bytes": "^5.4.0", 1033 | "@ethersproject/logger": "^5.4.0", 1034 | "@ethersproject/networks": "^5.4.0", 1035 | "@ethersproject/properties": "^5.4.0", 1036 | "@ethersproject/transactions": "^5.4.0", 1037 | "@ethersproject/web": "^5.4.0" 1038 | } 1039 | }, 1040 | "@ethersproject/abstract-signer": { 1041 | "version": "5.4.1", 1042 | "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.4.1.tgz", 1043 | "integrity": "sha512-SkkFL5HVq1k4/25dM+NWP9MILgohJCgGv5xT5AcRruGz4ILpfHeBtO/y6j+Z3UN/PAjDeb4P7E51Yh8wcGNLGA==", 1044 | "requires": { 1045 | "@ethersproject/abstract-provider": "^5.4.0", 1046 | "@ethersproject/bignumber": "^5.4.0", 1047 | "@ethersproject/bytes": "^5.4.0", 1048 | "@ethersproject/logger": "^5.4.0", 1049 | "@ethersproject/properties": "^5.4.0" 1050 | } 1051 | }, 1052 | "@ethersproject/address": { 1053 | "version": "5.4.0", 1054 | "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.4.0.tgz", 1055 | "integrity": "sha512-SD0VgOEkcACEG/C6xavlU1Hy3m5DGSXW3CUHkaaEHbAPPsgi0coP5oNPsxau8eTlZOk/bpa/hKeCNoK5IzVI2Q==", 1056 | "requires": { 1057 | "@ethersproject/bignumber": "^5.4.0", 1058 | "@ethersproject/bytes": "^5.4.0", 1059 | "@ethersproject/keccak256": "^5.4.0", 1060 | "@ethersproject/logger": "^5.4.0", 1061 | "@ethersproject/rlp": "^5.4.0" 1062 | } 1063 | }, 1064 | "@ethersproject/base64": { 1065 | "version": "5.4.0", 1066 | "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.4.0.tgz", 1067 | "integrity": "sha512-CjQw6E17QDSSC5jiM9YpF7N1aSCHmYGMt9bWD8PWv6YPMxjsys2/Q8xLrROKI3IWJ7sFfZ8B3flKDTM5wlWuZQ==", 1068 | "requires": { 1069 | "@ethersproject/bytes": "^5.4.0" 1070 | } 1071 | }, 1072 | "@ethersproject/basex": { 1073 | "version": "5.4.0", 1074 | "resolved": "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.4.0.tgz", 1075 | "integrity": "sha512-J07+QCVJ7np2bcpxydFVf/CuYo9mZ7T73Pe7KQY4c1lRlrixMeblauMxHXD0MPwFmUHZIILDNViVkykFBZylbg==", 1076 | "requires": { 1077 | "@ethersproject/bytes": "^5.4.0", 1078 | "@ethersproject/properties": "^5.4.0" 1079 | } 1080 | }, 1081 | "@ethersproject/bignumber": { 1082 | "version": "5.4.2", 1083 | "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.4.2.tgz", 1084 | "integrity": "sha512-oIBDhsKy5bs7j36JlaTzFgNPaZjiNDOXsdSgSpXRucUl+UA6L/1YLlFeI3cPAoodcenzF4nxNPV13pcy7XbWjA==", 1085 | "requires": { 1086 | "@ethersproject/bytes": "^5.4.0", 1087 | "@ethersproject/logger": "^5.4.0", 1088 | "bn.js": "^4.11.9" 1089 | } 1090 | }, 1091 | "@ethersproject/bytes": { 1092 | "version": "5.4.0", 1093 | "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.4.0.tgz", 1094 | "integrity": "sha512-H60ceqgTHbhzOj4uRc/83SCN9d+BSUnOkrr2intevqdtEMO1JFVZ1XL84OEZV+QjV36OaZYxtnt4lGmxcGsPfA==", 1095 | "requires": { 1096 | "@ethersproject/logger": "^5.4.0" 1097 | } 1098 | }, 1099 | "@ethersproject/constants": { 1100 | "version": "5.4.0", 1101 | "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.4.0.tgz", 1102 | "integrity": "sha512-tzjn6S7sj9+DIIeKTJLjK9WGN2Tj0P++Z8ONEIlZjyoTkBuODN+0VfhAyYksKi43l1Sx9tX2VlFfzjfmr5Wl3Q==", 1103 | "requires": { 1104 | "@ethersproject/bignumber": "^5.4.0" 1105 | } 1106 | }, 1107 | "@ethersproject/contracts": { 1108 | "version": "5.4.1", 1109 | "resolved": "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.4.1.tgz", 1110 | "integrity": "sha512-m+z2ZgPy4pyR15Je//dUaymRUZq5MtDajF6GwFbGAVmKz/RF+DNIPwF0k5qEcL3wPGVqUjFg2/krlCRVTU4T5w==", 1111 | "requires": { 1112 | "@ethersproject/abi": "^5.4.0", 1113 | "@ethersproject/abstract-provider": "^5.4.0", 1114 | "@ethersproject/abstract-signer": "^5.4.0", 1115 | "@ethersproject/address": "^5.4.0", 1116 | "@ethersproject/bignumber": "^5.4.0", 1117 | "@ethersproject/bytes": "^5.4.0", 1118 | "@ethersproject/constants": "^5.4.0", 1119 | "@ethersproject/logger": "^5.4.0", 1120 | "@ethersproject/properties": "^5.4.0", 1121 | "@ethersproject/transactions": "^5.4.0" 1122 | } 1123 | }, 1124 | "@ethersproject/hash": { 1125 | "version": "5.4.0", 1126 | "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.4.0.tgz", 1127 | "integrity": "sha512-xymAM9tmikKgbktOCjW60Z5sdouiIIurkZUr9oW5NOex5uwxrbsYG09kb5bMcNjlVeJD3yPivTNzViIs1GCbqA==", 1128 | "requires": { 1129 | "@ethersproject/abstract-signer": "^5.4.0", 1130 | "@ethersproject/address": "^5.4.0", 1131 | "@ethersproject/bignumber": "^5.4.0", 1132 | "@ethersproject/bytes": "^5.4.0", 1133 | "@ethersproject/keccak256": "^5.4.0", 1134 | "@ethersproject/logger": "^5.4.0", 1135 | "@ethersproject/properties": "^5.4.0", 1136 | "@ethersproject/strings": "^5.4.0" 1137 | } 1138 | }, 1139 | "@ethersproject/hdnode": { 1140 | "version": "5.4.0", 1141 | "resolved": "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.4.0.tgz", 1142 | "integrity": "sha512-pKxdS0KAaeVGfZPp1KOiDLB0jba11tG6OP1u11QnYfb7pXn6IZx0xceqWRr6ygke8+Kw74IpOoSi7/DwANhy8Q==", 1143 | "requires": { 1144 | "@ethersproject/abstract-signer": "^5.4.0", 1145 | "@ethersproject/basex": "^5.4.0", 1146 | "@ethersproject/bignumber": "^5.4.0", 1147 | "@ethersproject/bytes": "^5.4.0", 1148 | "@ethersproject/logger": "^5.4.0", 1149 | "@ethersproject/pbkdf2": "^5.4.0", 1150 | "@ethersproject/properties": "^5.4.0", 1151 | "@ethersproject/sha2": "^5.4.0", 1152 | "@ethersproject/signing-key": "^5.4.0", 1153 | "@ethersproject/strings": "^5.4.0", 1154 | "@ethersproject/transactions": "^5.4.0", 1155 | "@ethersproject/wordlists": "^5.4.0" 1156 | } 1157 | }, 1158 | "@ethersproject/json-wallets": { 1159 | "version": "5.4.0", 1160 | "resolved": "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.4.0.tgz", 1161 | "integrity": "sha512-igWcu3fx4aiczrzEHwG1xJZo9l1cFfQOWzTqwRw/xcvxTk58q4f9M7cjh51EKphMHvrJtcezJ1gf1q1AUOfEQQ==", 1162 | "requires": { 1163 | "@ethersproject/abstract-signer": "^5.4.0", 1164 | "@ethersproject/address": "^5.4.0", 1165 | "@ethersproject/bytes": "^5.4.0", 1166 | "@ethersproject/hdnode": "^5.4.0", 1167 | "@ethersproject/keccak256": "^5.4.0", 1168 | "@ethersproject/logger": "^5.4.0", 1169 | "@ethersproject/pbkdf2": "^5.4.0", 1170 | "@ethersproject/properties": "^5.4.0", 1171 | "@ethersproject/random": "^5.4.0", 1172 | "@ethersproject/strings": "^5.4.0", 1173 | "@ethersproject/transactions": "^5.4.0", 1174 | "aes-js": "3.0.0", 1175 | "scrypt-js": "3.0.1" 1176 | } 1177 | }, 1178 | "@ethersproject/keccak256": { 1179 | "version": "5.4.0", 1180 | "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.4.0.tgz", 1181 | "integrity": "sha512-FBI1plWet+dPUvAzPAeHzRKiPpETQzqSUWR1wXJGHVWi4i8bOSrpC3NwpkPjgeXG7MnugVc1B42VbfnQikyC/A==", 1182 | "requires": { 1183 | "@ethersproject/bytes": "^5.4.0", 1184 | "js-sha3": "0.5.7" 1185 | } 1186 | }, 1187 | "@ethersproject/logger": { 1188 | "version": "5.4.1", 1189 | "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.4.1.tgz", 1190 | "integrity": "sha512-DZ+bRinnYLPw1yAC64oRl0QyVZj43QeHIhVKfD/+YwSz4wsv1pfwb5SOFjz+r710YEWzU6LrhuSjpSO+6PeE4A==" 1191 | }, 1192 | "@ethersproject/networks": { 1193 | "version": "5.4.2", 1194 | "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.4.2.tgz", 1195 | "integrity": "sha512-eekOhvJyBnuibfJnhtK46b8HimBc5+4gqpvd1/H9LEl7Q7/qhsIhM81dI9Fcnjpk3jB1aTy6bj0hz3cifhNeYw==", 1196 | "requires": { 1197 | "@ethersproject/logger": "^5.4.0" 1198 | } 1199 | }, 1200 | "@ethersproject/pbkdf2": { 1201 | "version": "5.4.0", 1202 | "resolved": "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.4.0.tgz", 1203 | "integrity": "sha512-x94aIv6tiA04g6BnazZSLoRXqyusawRyZWlUhKip2jvoLpzJuLb//KtMM6PEovE47pMbW+Qe1uw+68ameJjB7g==", 1204 | "requires": { 1205 | "@ethersproject/bytes": "^5.4.0", 1206 | "@ethersproject/sha2": "^5.4.0" 1207 | } 1208 | }, 1209 | "@ethersproject/properties": { 1210 | "version": "5.4.1", 1211 | "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.4.1.tgz", 1212 | "integrity": "sha512-cyCGlF8wWlIZyizsj2PpbJ9I7rIlUAfnHYwy/T90pdkSn/NFTa5YWZx2wTJBe9V7dD65dcrrEMisCRUJiq6n3w==", 1213 | "requires": { 1214 | "@ethersproject/logger": "^5.4.0" 1215 | } 1216 | }, 1217 | "@ethersproject/providers": { 1218 | "version": "5.4.5", 1219 | "resolved": "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.4.5.tgz", 1220 | "integrity": "sha512-1GkrvkiAw3Fj28cwi1Sqm8ED1RtERtpdXmRfwIBGmqBSN5MoeRUHuwHPppMtbPayPgpFcvD7/Gdc9doO5fGYgw==", 1221 | "requires": { 1222 | "@ethersproject/abstract-provider": "^5.4.0", 1223 | "@ethersproject/abstract-signer": "^5.4.0", 1224 | "@ethersproject/address": "^5.4.0", 1225 | "@ethersproject/basex": "^5.4.0", 1226 | "@ethersproject/bignumber": "^5.4.0", 1227 | "@ethersproject/bytes": "^5.4.0", 1228 | "@ethersproject/constants": "^5.4.0", 1229 | "@ethersproject/hash": "^5.4.0", 1230 | "@ethersproject/logger": "^5.4.0", 1231 | "@ethersproject/networks": "^5.4.0", 1232 | "@ethersproject/properties": "^5.4.0", 1233 | "@ethersproject/random": "^5.4.0", 1234 | "@ethersproject/rlp": "^5.4.0", 1235 | "@ethersproject/sha2": "^5.4.0", 1236 | "@ethersproject/strings": "^5.4.0", 1237 | "@ethersproject/transactions": "^5.4.0", 1238 | "@ethersproject/web": "^5.4.0", 1239 | "bech32": "1.1.4", 1240 | "ws": "7.4.6" 1241 | } 1242 | }, 1243 | "@ethersproject/random": { 1244 | "version": "5.4.0", 1245 | "resolved": "https://registry.npmjs.org/@ethersproject/random/-/random-5.4.0.tgz", 1246 | "integrity": "sha512-pnpWNQlf0VAZDEOVp1rsYQosmv2o0ITS/PecNw+mS2/btF8eYdspkN0vIXrCMtkX09EAh9bdk8GoXmFXM1eAKw==", 1247 | "requires": { 1248 | "@ethersproject/bytes": "^5.4.0", 1249 | "@ethersproject/logger": "^5.4.0" 1250 | } 1251 | }, 1252 | "@ethersproject/rlp": { 1253 | "version": "5.4.0", 1254 | "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.4.0.tgz", 1255 | "integrity": "sha512-0I7MZKfi+T5+G8atId9QaQKHRvvasM/kqLyAH4XxBCBchAooH2EX5rL9kYZWwcm3awYV+XC7VF6nLhfeQFKVPg==", 1256 | "requires": { 1257 | "@ethersproject/bytes": "^5.4.0", 1258 | "@ethersproject/logger": "^5.4.0" 1259 | } 1260 | }, 1261 | "@ethersproject/sha2": { 1262 | "version": "5.4.0", 1263 | "resolved": "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.4.0.tgz", 1264 | "integrity": "sha512-siheo36r1WD7Cy+bDdE1BJ8y0bDtqXCOxRMzPa4bV1TGt/eTUUt03BHoJNB6reWJD8A30E/pdJ8WFkq+/uz4Gg==", 1265 | "requires": { 1266 | "@ethersproject/bytes": "^5.4.0", 1267 | "@ethersproject/logger": "^5.4.0", 1268 | "hash.js": "1.1.7" 1269 | } 1270 | }, 1271 | "@ethersproject/signing-key": { 1272 | "version": "5.4.0", 1273 | "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.4.0.tgz", 1274 | "integrity": "sha512-q8POUeywx6AKg2/jX9qBYZIAmKSB4ubGXdQ88l40hmATj29JnG5pp331nAWwwxPn2Qao4JpWHNZsQN+bPiSW9A==", 1275 | "requires": { 1276 | "@ethersproject/bytes": "^5.4.0", 1277 | "@ethersproject/logger": "^5.4.0", 1278 | "@ethersproject/properties": "^5.4.0", 1279 | "bn.js": "^4.11.9", 1280 | "elliptic": "6.5.4", 1281 | "hash.js": "1.1.7" 1282 | } 1283 | }, 1284 | "@ethersproject/solidity": { 1285 | "version": "5.4.0", 1286 | "resolved": "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.4.0.tgz", 1287 | "integrity": "sha512-XFQTZ7wFSHOhHcV1DpcWj7VXECEiSrBuv7JErJvB9Uo+KfCdc3QtUZV+Vjh/AAaYgezUEKbCtE6Khjm44seevQ==", 1288 | "requires": { 1289 | "@ethersproject/bignumber": "^5.4.0", 1290 | "@ethersproject/bytes": "^5.4.0", 1291 | "@ethersproject/keccak256": "^5.4.0", 1292 | "@ethersproject/sha2": "^5.4.0", 1293 | "@ethersproject/strings": "^5.4.0" 1294 | } 1295 | }, 1296 | "@ethersproject/strings": { 1297 | "version": "5.4.0", 1298 | "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.4.0.tgz", 1299 | "integrity": "sha512-k/9DkH5UGDhv7aReXLluFG5ExurwtIpUfnDNhQA29w896Dw3i4uDTz01Quaptbks1Uj9kI8wo9tmW73wcIEaWA==", 1300 | "requires": { 1301 | "@ethersproject/bytes": "^5.4.0", 1302 | "@ethersproject/constants": "^5.4.0", 1303 | "@ethersproject/logger": "^5.4.0" 1304 | } 1305 | }, 1306 | "@ethersproject/transactions": { 1307 | "version": "5.4.0", 1308 | "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.4.0.tgz", 1309 | "integrity": "sha512-s3EjZZt7xa4BkLknJZ98QGoIza94rVjaEed0rzZ/jB9WrIuu/1+tjvYCWzVrystXtDswy7TPBeIepyXwSYa4WQ==", 1310 | "requires": { 1311 | "@ethersproject/address": "^5.4.0", 1312 | "@ethersproject/bignumber": "^5.4.0", 1313 | "@ethersproject/bytes": "^5.4.0", 1314 | "@ethersproject/constants": "^5.4.0", 1315 | "@ethersproject/keccak256": "^5.4.0", 1316 | "@ethersproject/logger": "^5.4.0", 1317 | "@ethersproject/properties": "^5.4.0", 1318 | "@ethersproject/rlp": "^5.4.0", 1319 | "@ethersproject/signing-key": "^5.4.0" 1320 | } 1321 | }, 1322 | "@ethersproject/units": { 1323 | "version": "5.4.0", 1324 | "resolved": "https://registry.npmjs.org/@ethersproject/units/-/units-5.4.0.tgz", 1325 | "integrity": "sha512-Z88krX40KCp+JqPCP5oPv5p750g+uU6gopDYRTBGcDvOASh6qhiEYCRatuM/suC4S2XW9Zz90QI35MfSrTIaFg==", 1326 | "requires": { 1327 | "@ethersproject/bignumber": "^5.4.0", 1328 | "@ethersproject/constants": "^5.4.0", 1329 | "@ethersproject/logger": "^5.4.0" 1330 | } 1331 | }, 1332 | "@ethersproject/wallet": { 1333 | "version": "5.4.0", 1334 | "resolved": "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.4.0.tgz", 1335 | "integrity": "sha512-wU29majLjM6AjCjpat21mPPviG+EpK7wY1+jzKD0fg3ui5fgedf2zEu1RDgpfIMsfn8fJHJuzM4zXZ2+hSHaSQ==", 1336 | "requires": { 1337 | "@ethersproject/abstract-provider": "^5.4.0", 1338 | "@ethersproject/abstract-signer": "^5.4.0", 1339 | "@ethersproject/address": "^5.4.0", 1340 | "@ethersproject/bignumber": "^5.4.0", 1341 | "@ethersproject/bytes": "^5.4.0", 1342 | "@ethersproject/hash": "^5.4.0", 1343 | "@ethersproject/hdnode": "^5.4.0", 1344 | "@ethersproject/json-wallets": "^5.4.0", 1345 | "@ethersproject/keccak256": "^5.4.0", 1346 | "@ethersproject/logger": "^5.4.0", 1347 | "@ethersproject/properties": "^5.4.0", 1348 | "@ethersproject/random": "^5.4.0", 1349 | "@ethersproject/signing-key": "^5.4.0", 1350 | "@ethersproject/transactions": "^5.4.0", 1351 | "@ethersproject/wordlists": "^5.4.0" 1352 | } 1353 | }, 1354 | "@ethersproject/web": { 1355 | "version": "5.4.0", 1356 | "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.4.0.tgz", 1357 | "integrity": "sha512-1bUusGmcoRLYgMn6c1BLk1tOKUIFuTg8j+6N8lYlbMpDesnle+i3pGSagGNvwjaiLo4Y5gBibwctpPRmjrh4Og==", 1358 | "requires": { 1359 | "@ethersproject/base64": "^5.4.0", 1360 | "@ethersproject/bytes": "^5.4.0", 1361 | "@ethersproject/logger": "^5.4.0", 1362 | "@ethersproject/properties": "^5.4.0", 1363 | "@ethersproject/strings": "^5.4.0" 1364 | } 1365 | }, 1366 | "@ethersproject/wordlists": { 1367 | "version": "5.4.0", 1368 | "resolved": "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.4.0.tgz", 1369 | "integrity": "sha512-FemEkf6a+EBKEPxlzeVgUaVSodU7G0Na89jqKjmWMlDB0tomoU8RlEMgUvXyqtrg8N4cwpLh8nyRnm1Nay1isA==", 1370 | "requires": { 1371 | "@ethersproject/bytes": "^5.4.0", 1372 | "@ethersproject/hash": "^5.4.0", 1373 | "@ethersproject/logger": "^5.4.0", 1374 | "@ethersproject/properties": "^5.4.0", 1375 | "@ethersproject/strings": "^5.4.0" 1376 | } 1377 | }, 1378 | "@truffle/artifactor": { 1379 | "version": "4.0.94", 1380 | "resolved": "https://registry.npmjs.org/@truffle/artifactor/-/artifactor-4.0.94.tgz", 1381 | "integrity": "sha512-y7Rb2CCxEsLabahBv92W7CBCx7K7jMeeXrtNMGgx3ZNSuQk7Z/i7dwdSkIGQhZuMtxh7PBCDzigDckUVgGnEfA==", 1382 | "requires": { 1383 | "@truffle/contract-schema": "^3.3.3", 1384 | "fs-extra": "^8.1.0", 1385 | "lodash.assign": "^4.2.0", 1386 | "lodash.merge": "^4.6.2", 1387 | "source-map-support": "^0.5.19" 1388 | } 1389 | }, 1390 | "@truffle/contract-schema": { 1391 | "version": "3.3.3", 1392 | "resolved": "https://registry.npmjs.org/@truffle/contract-schema/-/contract-schema-3.3.3.tgz", 1393 | "integrity": "sha512-4bvcEoGycopJBPoCiqHP5Q72/1t/ixYS/pVHru+Rzvad641BgvoGrkd4YnyJ+E/MVb4ZLrndL7whmdGqV5B7SA==", 1394 | "requires": { 1395 | "ajv": "^6.10.0", 1396 | "crypto-js": "^3.1.9-1", 1397 | "debug": "^4.1.0" 1398 | } 1399 | }, 1400 | "aes-js": { 1401 | "version": "3.0.0", 1402 | "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz", 1403 | "integrity": "sha1-4h3xCtbCBTKVvLuNq0Cwnb6ofk0=" 1404 | }, 1405 | "ajv": { 1406 | "version": "6.12.6", 1407 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", 1408 | "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", 1409 | "requires": { 1410 | "fast-deep-equal": "^3.1.1", 1411 | "fast-json-stable-stringify": "^2.0.0", 1412 | "json-schema-traverse": "^0.4.1", 1413 | "uri-js": "^4.2.2" 1414 | } 1415 | }, 1416 | "assertion-error": { 1417 | "version": "1.1.0", 1418 | "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", 1419 | "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==" 1420 | }, 1421 | "bech32": { 1422 | "version": "1.1.4", 1423 | "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz", 1424 | "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==" 1425 | }, 1426 | "bn.js": { 1427 | "version": "4.12.0", 1428 | "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", 1429 | "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" 1430 | }, 1431 | "brorand": { 1432 | "version": "1.1.0", 1433 | "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", 1434 | "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" 1435 | }, 1436 | "buffer-from": { 1437 | "version": "1.1.1", 1438 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", 1439 | "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" 1440 | }, 1441 | "crypto-js": { 1442 | "version": "3.3.0", 1443 | "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-3.3.0.tgz", 1444 | "integrity": "sha512-DIT51nX0dCfKltpRiXV+/TVZq+Qq2NgF4644+K7Ttnla7zEzqc+kjJyiB96BHNyUTBxyjzRcZYpUdZa+QAqi6Q==" 1445 | }, 1446 | "debug": { 1447 | "version": "4.3.1", 1448 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", 1449 | "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", 1450 | "requires": { 1451 | "ms": "2.1.2" 1452 | } 1453 | }, 1454 | "elliptic": { 1455 | "version": "6.5.4", 1456 | "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", 1457 | "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", 1458 | "requires": { 1459 | "bn.js": "^4.11.9", 1460 | "brorand": "^1.1.0", 1461 | "hash.js": "^1.0.0", 1462 | "hmac-drbg": "^1.0.1", 1463 | "inherits": "^2.0.4", 1464 | "minimalistic-assert": "^1.0.1", 1465 | "minimalistic-crypto-utils": "^1.0.1" 1466 | } 1467 | }, 1468 | "ethers": { 1469 | "version": "5.4.7", 1470 | "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.4.7.tgz", 1471 | "integrity": "sha512-iZc5p2nqfWK1sj8RabwsPM28cr37Bpq7ehTQ5rWExBr2Y09Sn1lDKZOED26n+TsZMye7Y6mIgQ/1cwpSD8XZew==", 1472 | "requires": { 1473 | "@ethersproject/abi": "5.4.1", 1474 | "@ethersproject/abstract-provider": "5.4.1", 1475 | "@ethersproject/abstract-signer": "5.4.1", 1476 | "@ethersproject/address": "5.4.0", 1477 | "@ethersproject/base64": "5.4.0", 1478 | "@ethersproject/basex": "5.4.0", 1479 | "@ethersproject/bignumber": "5.4.2", 1480 | "@ethersproject/bytes": "5.4.0", 1481 | "@ethersproject/constants": "5.4.0", 1482 | "@ethersproject/contracts": "5.4.1", 1483 | "@ethersproject/hash": "5.4.0", 1484 | "@ethersproject/hdnode": "5.4.0", 1485 | "@ethersproject/json-wallets": "5.4.0", 1486 | "@ethersproject/keccak256": "5.4.0", 1487 | "@ethersproject/logger": "5.4.1", 1488 | "@ethersproject/networks": "5.4.2", 1489 | "@ethersproject/pbkdf2": "5.4.0", 1490 | "@ethersproject/properties": "5.4.1", 1491 | "@ethersproject/providers": "5.4.5", 1492 | "@ethersproject/random": "5.4.0", 1493 | "@ethersproject/rlp": "5.4.0", 1494 | "@ethersproject/sha2": "5.4.0", 1495 | "@ethersproject/signing-key": "5.4.0", 1496 | "@ethersproject/solidity": "5.4.0", 1497 | "@ethersproject/strings": "5.4.0", 1498 | "@ethersproject/transactions": "5.4.0", 1499 | "@ethersproject/units": "5.4.0", 1500 | "@ethersproject/wallet": "5.4.0", 1501 | "@ethersproject/web": "5.4.0", 1502 | "@ethersproject/wordlists": "5.4.0" 1503 | } 1504 | }, 1505 | "fast-deep-equal": { 1506 | "version": "3.1.3", 1507 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 1508 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" 1509 | }, 1510 | "fast-json-stable-stringify": { 1511 | "version": "2.1.0", 1512 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 1513 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" 1514 | }, 1515 | "fs-extra": { 1516 | "version": "8.1.0", 1517 | "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", 1518 | "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", 1519 | "requires": { 1520 | "graceful-fs": "^4.2.0", 1521 | "jsonfile": "^4.0.0", 1522 | "universalify": "^0.1.0" 1523 | } 1524 | }, 1525 | "graceful-fs": { 1526 | "version": "4.2.6", 1527 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", 1528 | "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==" 1529 | }, 1530 | "hash.js": { 1531 | "version": "1.1.7", 1532 | "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", 1533 | "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", 1534 | "requires": { 1535 | "inherits": "^2.0.3", 1536 | "minimalistic-assert": "^1.0.1" 1537 | } 1538 | }, 1539 | "hmac-drbg": { 1540 | "version": "1.0.1", 1541 | "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", 1542 | "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", 1543 | "requires": { 1544 | "hash.js": "^1.0.3", 1545 | "minimalistic-assert": "^1.0.0", 1546 | "minimalistic-crypto-utils": "^1.0.1" 1547 | } 1548 | }, 1549 | "inherits": { 1550 | "version": "2.0.4", 1551 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 1552 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 1553 | }, 1554 | "js-sha3": { 1555 | "version": "0.5.7", 1556 | "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", 1557 | "integrity": "sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc=" 1558 | }, 1559 | "json-schema-traverse": { 1560 | "version": "0.4.1", 1561 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 1562 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" 1563 | }, 1564 | "jsonfile": { 1565 | "version": "4.0.0", 1566 | "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", 1567 | "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", 1568 | "requires": { 1569 | "graceful-fs": "^4.1.6" 1570 | } 1571 | }, 1572 | "lodash.assign": { 1573 | "version": "4.2.0", 1574 | "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", 1575 | "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=" 1576 | }, 1577 | "lodash.isequal": { 1578 | "version": "4.5.0", 1579 | "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", 1580 | "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=" 1581 | }, 1582 | "lodash.merge": { 1583 | "version": "4.6.2", 1584 | "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", 1585 | "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" 1586 | }, 1587 | "minimalistic-assert": { 1588 | "version": "1.0.1", 1589 | "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", 1590 | "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" 1591 | }, 1592 | "minimalistic-crypto-utils": { 1593 | "version": "1.0.1", 1594 | "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", 1595 | "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" 1596 | }, 1597 | "ms": { 1598 | "version": "2.1.2", 1599 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1600 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 1601 | }, 1602 | "punycode": { 1603 | "version": "2.1.1", 1604 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", 1605 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" 1606 | }, 1607 | "scrypt-js": { 1608 | "version": "3.0.1", 1609 | "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", 1610 | "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==" 1611 | }, 1612 | "source-map": { 1613 | "version": "0.6.1", 1614 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 1615 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" 1616 | }, 1617 | "source-map-support": { 1618 | "version": "0.5.19", 1619 | "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", 1620 | "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", 1621 | "requires": { 1622 | "buffer-from": "^1.0.0", 1623 | "source-map": "^0.6.0" 1624 | } 1625 | }, 1626 | "truffle-assertions": { 1627 | "version": "0.9.2", 1628 | "resolved": "https://registry.npmjs.org/truffle-assertions/-/truffle-assertions-0.9.2.tgz", 1629 | "integrity": "sha512-9g2RhaxU2F8DeWhqoGQvL/bV8QVoSnQ6PY+ZPvYRP5eF7+/8LExb4mjLx/FeliLTjc3Tv1SABG05Gu5qQ/ErmA==", 1630 | "requires": { 1631 | "assertion-error": "^1.1.0", 1632 | "lodash.isequal": "^4.5.0" 1633 | } 1634 | }, 1635 | "universalify": { 1636 | "version": "0.1.2", 1637 | "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", 1638 | "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" 1639 | }, 1640 | "uri-js": { 1641 | "version": "4.4.1", 1642 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", 1643 | "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", 1644 | "requires": { 1645 | "punycode": "^2.1.0" 1646 | } 1647 | }, 1648 | "ws": { 1649 | "version": "7.4.6", 1650 | "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", 1651 | "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", 1652 | "requires": {} 1653 | } 1654 | } 1655 | } 1656 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "scripts": { 3 | "compile": "node scripts/compile.js" 4 | }, 5 | "dependencies": { 6 | "@truffle/artifactor": "^4.0.94", 7 | "ethers": "^5.1.4", 8 | "truffle-assertions": "^0.9.2" 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /scripts/compile.js: -------------------------------------------------------------------------------- 1 | const Artifactor = require('@truffle/artifactor'); 2 | const ethers = require('ethers'); 3 | const { execSync } = require('child_process'); 4 | const fs = require('fs'); 5 | const path = require('path') 6 | 7 | const target_dir = './build'; 8 | const contracts_dir = './src'; 9 | 10 | 11 | function main() { 12 | if (!fs.existsSync(contracts_dir)) { 13 | console.error(`contracts directory (${contracts_dir}) does not exsit`) 14 | return 15 | } 16 | 17 | let bin = compile_asm("ctor.etk"); 18 | let abi = JSON.parse(fs.readFileSync(`${contracts_dir}/token.abi`, 'utf8')); 19 | abi = abi.map((el) => { 20 | let fragment = JSON.parse(ethers.utils.Fragment.from(el).format("json")); 21 | 22 | // ethers doesn't set "indexed" to false when it doesn't appear 23 | // in the fragment - so set it manually 24 | if (fragment.type == 'event') { 25 | for (i = 0; i < fragment.inputs.length; i++) { 26 | if (!('indexed' in fragment.inputs[i])) { 27 | fragment.inputs[i].indexed = false; 28 | } 29 | } 30 | } 31 | 32 | return fragment; 33 | }); 34 | 35 | save_artifact("Token", bin, abi); 36 | 37 | /* 38 | let files = fs.readdirSync(contracts_dir); 39 | files.forEach((file) => { 40 | let ext = path.extname(file); 41 | if (ext == '.etk') { 42 | let bin = compile_asm(file); 43 | let name = path.basename(file, '.etk'); 44 | let abi_path = path.format({dir: contracts_dir, name: `${name}.abi`}); 45 | let abi = JSON.parse(fs.readFileSync(abi_path, 'utf8')); 46 | abi = abi.map((el) => { 47 | return JSON.parse(ethers.utils.Fragment.from(el).format("json")) 48 | }); 49 | 50 | save_artifact(name, bin, abi); 51 | } 52 | }); 53 | */ 54 | } 55 | 56 | function compile_asm(file) { 57 | return execSync(`eas ${contracts_dir}/${file}`).toString().replace(/(\r\n|\n|\r)/gm, ""); 58 | } 59 | 60 | function save_artifact(name, bin, abi) { 61 | const contractData = { 62 | contractName: name[0].toUpperCase() + name.slice(1), 63 | abi: abi, 64 | bytecode: bin, 65 | }; 66 | 67 | if (!fs.existsSync(target_dir)){ 68 | fs.mkdirSync(target_dir); 69 | } 70 | const artifactor = new Artifactor(target_dir); 71 | artifactor.save(contractData); 72 | } 73 | 74 | main(); 75 | -------------------------------------------------------------------------------- /src/allowance.etk: -------------------------------------------------------------------------------- 1 | # allowance 2 | # 3 | # calldata structure 4 | # +--------------------+------------------+------------------+------------------+--------------------+ 5 | # | selector (4 bytes) | zeros (12 bytes) | owner (20 bytes) | zeros (20 bytes) | spender (20 bytes) | 6 | # +--------------------+------------------+------------------+------------------+--------------------+ 7 | 8 | push1 64 # [len] 9 | push1 4 # [offset] 10 | keccak256 # [key] 11 | 12 | sload # [allowance] 13 | push1 0 # [offset, allowance] 14 | mstore # [] 15 | 16 | push1 32 # [32] 17 | push1 0 # [0, 32] 18 | 19 | return # [] 20 | -------------------------------------------------------------------------------- /src/approve.etk: -------------------------------------------------------------------------------- 1 | # approve 2 | # 3 | # calldata structure 4 | # +--------------------+------------------+--------------------+-------------------+ 5 | # | selector (4 bytes) | zeros (12 bytes) | spender (20 bytes) | amount (32 bytes) | 6 | # +--------------------+------------------+--------------------+-------------------+ 7 | 8 | push1 36 # [36] 9 | mload # [amt] 10 | 11 | push1 4 # [4, amt] 12 | mload # [sender, amt] 13 | 14 | # write the sender to mem[36..68] 15 | push1 36 # [36, sender, amt] 16 | mstore # [amt] 17 | 18 | # write the caller to mem[4..36] 19 | caller # [caller, amt] 20 | push1 4 # [4, caller, amt] 21 | mstore # [amt] 22 | 23 | # hash mem[4..68] 24 | push1 64 # [len, amt] 25 | push1 4 # [offset, len, amt] 26 | keccak256 # [key, amt] 27 | dup1 # [key, key, amt] 28 | 29 | sload # [allowance, key, amt] 30 | swap1 # [key, allowance, amt] 31 | swap2 # [amt, allowance, key] 32 | add # [new_allowance, key] 33 | swap1 # [key, new_allowance] 34 | sstore # [] 35 | 36 | # output event 37 | push1 4 # [4] 38 | calldataload # [spender] 39 | caller # [owner, spender] 40 | push1 36 # [36, owner, spender] 41 | calldataload # [amt, owner, spender] 42 | push1 0 # [0, value, owner, spender] 43 | mstore # [owner, spender] 44 | push32 topic("Approval(address,address,uint256)") # [topic, owner, spender] 45 | push1 32 # [32, topic, owner, spender] 46 | push1 0 # [0, 32, topic, ownder, spender] 47 | 48 | log3 # [] 49 | -------------------------------------------------------------------------------- /src/balance_of.etk: -------------------------------------------------------------------------------- 1 | # balance_of 2 | # 3 | # calldata structure 4 | # +--------------------+------------------+--------------------+ 5 | # | selector (4 bytes) | zeros (12 bytes) | address (20 bytes) | 6 | # +--------------------+------------------+--------------------+ 7 | 8 | # prepare return parameters 9 | push1 32 # [ret_len] 10 | push1 0 # [ret_offset, ret_len] 11 | 12 | # skip the selector, load the address 13 | push1 4 # [4, ret_offset, ret_len] 14 | mload # [addr, ret_offset, ret_len] 15 | 16 | # load balance 17 | sload # [balance, ret_offset, ret_len] 18 | 19 | # prepare balance to return 20 | dup2 # [0, balance, ret_offset, ret_len] 21 | mstore # [ret_offset, ret_len] 22 | 23 | return # [] 24 | -------------------------------------------------------------------------------- /src/ctor.etk: -------------------------------------------------------------------------------- 1 | pc # [0] 2 | 3 | # give deployer initial supply 4 | push4 10000 # [balance, 0] 5 | caller # [caller, balance, 0] 6 | sstore # [0] 7 | 8 | push1 start # [start, 0] 9 | dup1 # [start, start, 0] 10 | codesize # [codesize, start, start, 0] 11 | sub # [length, start, 0] 12 | swap2 # [0, start, length] 13 | swap1 # [start, 0, length] 14 | dup3 # [length, start, 0, length] 15 | swap1 # [start, length, 0, length] 16 | dup3 # [0, start, length, 0, length] 17 | codecopy # [0, length] 18 | return # [] 19 | 20 | start: 21 | %include("jump_table.etk") 22 | -------------------------------------------------------------------------------- /src/jump_table.etk: -------------------------------------------------------------------------------- 1 | # 2 | # erc20 3 | # 4 | # Minimal ERC-20 implementation in raw assembly. 5 | # 6 | # Storage Layout 7 | # -- 8 | # balance(address) => 0x000000000000000000000000 || address 9 | # allowance(owner, spender) => keccak(owner || spender) 10 | 11 | 12 | start: 13 | # Read the calldata into memory. 14 | calldatasize # [calldatasize] 15 | push1 0 # [0, calldatasize] 16 | dup1 # [0, 0, calldatasize] 17 | calldatacopy # [] 18 | 19 | # Extract only the function selector 20 | push1 0 # [0] 21 | mload # [dirty_selector] 22 | push1 224 # [224, dirty_selector] 23 | shr # [selector] 24 | 25 | # Jump to the coresponding function. 26 | dup1 # [selector, selector] 27 | push4 selector("transferFrom(address,address,uint256)") # [candidate, selector, selector] 28 | eq # [success, selector] 29 | push4 transfer_from # [transfer_from, success, selector] 30 | jumpi # [selector] 31 | 32 | dup1 # [selector, selector] 33 | push4 selector("approve(address,uint256)") # [candidate, selector, selector] 34 | eq # [success, selector] 35 | push4 approve # [allowance, success, selector] 36 | jumpi # [selector] 37 | 38 | dup1 # [selector, selector] 39 | push4 selector("transfer(address,uint256)") # [candidate, selector, selector] 40 | eq # [selector, success] 41 | push4 transfer # [transfer, success, selector] 42 | jumpi # [selector] 43 | 44 | 45 | # Check the view functions last to not waste gas on-chain. 46 | dup1 # [selector, selector] 47 | push4 selector("decimals()") # [candidate, selector, selector] 48 | eq # [success, selector] 49 | push4 decimals # [decimals, success, selector] 50 | jumpi # [selector] 51 | 52 | dup1 # [selector, selector] 53 | push4 selector("totalSupply()") # [candidate, selector, selector] 54 | eq # [success, selector] 55 | push4 total_supply # [total_supply, success, selector] 56 | jumpi # [selector] 57 | 58 | dup1 # [selector, selector] 59 | push4 selector("balanceOf(address)") # [candidate, selector, selector] 60 | eq # [success, selector] 61 | push4 balance_of # [balance_of, success, selector] 62 | jumpi # [selector] 63 | 64 | dup1 # [selector, selector] 65 | push4 selector("allowance(address,address)") # candidate, selector, selector] 66 | eq # [success, selector] 67 | push4 allowance # [allowance, success, selector] 68 | jumpi # [selector] 69 | 70 | # Catchall for reverts. 71 | failure: 72 | jumpdest 73 | push1 0 74 | push1 0 75 | revert 76 | 77 | transfer_from: 78 | jumpdest 79 | %import("transfer_from.etk") 80 | stop 81 | approve: 82 | jumpdest 83 | %import("approve.etk") 84 | stop 85 | transfer: 86 | jumpdest 87 | %import("transfer.etk") 88 | stop 89 | balance_of: 90 | jumpdest 91 | %import("balance_of.etk") 92 | stop 93 | allowance: 94 | jumpdest 95 | %import("allowance.etk") 96 | stop 97 | decimals: 98 | jumpdest 99 | total_supply: 100 | jumpdest 101 | -------------------------------------------------------------------------------- /src/token.abi: -------------------------------------------------------------------------------- 1 | [ 2 | "function allowance(address owner, address spender) view returns (uint amount)", 3 | "function approve(address spender, uint amount)", 4 | "function balanceOf(address owner) view returns (uint balance)", 5 | "function transfer(address to, uint amount)", 6 | "function transferFrom(address from, address to, uint amount)", 7 | "event Approval(address indexed owner, address indexed spender, uint256 value)", 8 | "event Transfer(address indexed from, address indexed to, uint value)" 9 | ] 10 | -------------------------------------------------------------------------------- /src/transfer.etk: -------------------------------------------------------------------------------- 1 | # transfer 2 | # 3 | # calldata structure 4 | # +--------------------+------------------+---------------+-------------------+ 5 | # | selector (4 bytes) | zeros (12 bytes) | to (20 bytes) | amount (32 bytes) | 6 | # +--------------------+------------------+---------------+-------------------+ 7 | 8 | caller # [from] 9 | sload # [from_balance] 10 | push1 36 # [36, from_balance] 11 | mload # [amt, from_balance] 12 | dup2 # [from_balance, amt, from_balance] 13 | dup2 # [amt, from_balance, amt, from_balance] 14 | 15 | # if amt > from_balance, revert 16 | gt # [amt > from_balance, amt, from_balance] 17 | push4 failure # [failure, from_balance, amt, from_balance] 18 | jumpi # [amt, from_balance] 19 | 20 | # sstore(from, from_balance - amt) 21 | swap1 # [from_balance, amt] 22 | sub # [from_balance - amt] 23 | caller # [from, from_balance - amt] 24 | sstore # [] 25 | 26 | # sstore(to, to_balance + amt) 27 | push1 4 # [4] 28 | mload # [to] 29 | dup1 # [to, to] 30 | sload # [to_balance, to] 31 | push1 36 # [36, to_balance, to] 32 | mload # [amt, to_balance, to] 33 | add # [amt + to_balance, to] 34 | swap1 # [to, amt + to_balance] 35 | sstore # [] 36 | 37 | # output event 38 | push1 4 # [4] 39 | calldataload # [to] 40 | caller # [from, to] 41 | push1 36 # [36, from, to] 42 | calldataload # [amt, from, to] 43 | push1 0 # [0, amt, from, to] 44 | mstore # [from, to] 45 | push32 topic("Transfer(address,address,uint256)") # [topic, from, to] 46 | push1 32 # [32, topic, from, to] 47 | push1 0 # [0, 32, topic, from, to] 48 | 49 | log3 # [] 50 | -------------------------------------------------------------------------------- /src/transfer_from.etk: -------------------------------------------------------------------------------- 1 | # transfer_from 2 | # 3 | # calldata structure 4 | # +--------------------+-----------------+---------------+-------------------+ 5 | # | selector (4 bytes) | from (32 bytes) | to (32 bytes) | amount (32 bytes) | 6 | # +--------------------+-----------------+---------------+-------------------+ 7 | 8 | push1 64 # [len] 9 | push1 4 # [offset, len] 10 | keccak256 # [key] 11 | dup1 # [key, key] 12 | 13 | sload # [available, key] 14 | 15 | push1 68 # [68, available, key] 16 | mload # [amt, available, key] 17 | 18 | # if amt > available, revert 19 | dup2 # [available, amt, available, key] 20 | dup2 # [amt, available, amt, available, key] 21 | gt # [amt > available, amt, available, key] 22 | push4 failure # [failure, amt > available, amt, available, key] 23 | jumpi # [amt, available, key] 24 | 25 | check_sender: 26 | jumpdest # [amt, available, key] 27 | push1 4 # [4, amt, available, key] 28 | calldataload # [from, amt, available, key] 29 | sload # [from_balance, amt, available, key] 30 | 31 | lt # [from_balance < amt, available, key] 32 | push4 failure # [failure, from_balance < amt, available, key] 33 | jumpi # [available, key] 34 | 35 | # reduce allowance by amt 36 | push4 68 # [68, available, key] 37 | calldataload # [amt, available, key] 38 | swap1 # [available, amt, key] 39 | sub # [available - amt, key] 40 | swap1 # [key, available - amt] 41 | sstore # [] 42 | 43 | # reduce from balance by amt 44 | push4 4 # [4] 45 | calldataload # [from] 46 | dup1 # [from, from] 47 | sload # [from_balance, from] 48 | 49 | push1 68 # [68, from_balance, from] 50 | calldataload # [amt, from_balance, from] 51 | dup1 # [amt, amt, from_balance, from] 52 | 53 | swap2 # [from_balance, amt, amt, from] 54 | sub # [from_balance - amt, amt from] 55 | swap1 # [amt, from_balance - amt, from] 56 | swap2 # [from, from_balance - amt, amt]] 57 | sstore # [amt] 58 | 59 | # increase to balance by amt 60 | push1 36 # [36, amt] 61 | calldataload # [to, amt] 62 | dup1 # [to, to, amt] 63 | sload # [to_balance, to, amt] 64 | 65 | swap1 # [to, to_balance, amt] 66 | swap2 # [amt, to_balance, to] 67 | add # [amt + to_balance, to] 68 | swap1 # [to, amt + to_balance] 69 | sstore 70 | 71 | # output event 72 | push1 36 # [36] 73 | calldataload # [to] 74 | push1 4 # [4, to] 75 | calldataload # [from, to] 76 | push1 68 # [68, from, to] 77 | calldataload # [amt, from, to] 78 | push1 0 # [0, amt, from, to] 79 | mstore # [from, to] 80 | push32 topic("Transfer(address,address,uint256)") # [topic, from, to] 81 | push1 32 # [32, topic, from, to] 82 | push1 0 # [0, 32, topic, from, to] 83 | 84 | log3 # [] 85 | -------------------------------------------------------------------------------- /test/token.js: -------------------------------------------------------------------------------- 1 | const Token = artifacts.require("Token"); 2 | const truffleAssert = require("truffle-assertions"); 3 | 4 | contract("Token", accounts => { 5 | let token; 6 | 7 | before(async () => { 8 | token = await Token.deployed(); 9 | }); 10 | 11 | it("balance_of", async () => { 12 | balance = await token.balanceOf.call(accounts[0]) 13 | assert.strictEqual(balance.toNumber(), 10000) 14 | }); 15 | 16 | it("transfer", async () => { 17 | res = await token.transfer(accounts[1], 10, { from: accounts[0] }) 18 | balance = await token.balanceOf.call(accounts[0]) 19 | assert.strictEqual(balance.toNumber(), 9990) 20 | 21 | balance = await token.balanceOf.call(accounts[1]) 22 | assert.strictEqual(balance.toNumber(), 10) 23 | 24 | log = res.logs.find( 25 | element => element.event.match('Transfer') && 26 | element.address.match(token.address) 27 | ) 28 | 29 | assert.strictEqual(log != null, true) 30 | assert.strictEqual(log.args.from, accounts[0]) 31 | assert.strictEqual(log.args.to, accounts[1]) 32 | assert.strictEqual(log.args.value.toNumber(), 10) 33 | }); 34 | 35 | it("approve", async () => { 36 | res = await token.approve(accounts[1], 10, { from: accounts[0] }) 37 | allowance = await token.allowance.call(accounts[0], accounts[1]) 38 | assert.strictEqual(allowance.toNumber(), 10) 39 | 40 | log = res.logs.find( 41 | element => element.event.match('Approval') && 42 | element.address.match(token.address) 43 | ) 44 | 45 | assert.strictEqual(log != null, true) 46 | assert.strictEqual(log.args.owner, accounts[0]) 47 | assert.strictEqual(log.args.spender, accounts[1]) 48 | assert.strictEqual(log.args.value.toNumber(), 10) 49 | }); 50 | 51 | it("transfer_from", async () => { 52 | res = await token.transferFrom(accounts[0], accounts[1], 10, { from: accounts[1] }) 53 | 54 | allowance = await token.allowance.call(accounts[0], accounts[1]) 55 | assert.strictEqual(allowance.toNumber(), 0) 56 | 57 | balance = await token.balanceOf.call(accounts[0]) 58 | assert.strictEqual(balance.toNumber(), 9980) 59 | 60 | log = res.logs.find( 61 | element => element.event.match('Transfer') && 62 | element.address.match(token.address) 63 | ) 64 | 65 | assert.strictEqual(log != null, true) 66 | assert.strictEqual(log.args.from, accounts[0]) 67 | assert.strictEqual(log.args.to, accounts[1]) 68 | assert.strictEqual(log.args.value.toNumber(), 10) 69 | }); 70 | }); 71 | -------------------------------------------------------------------------------- /truffle-config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | contracts_build_directory: "./build", 3 | compilers: { 4 | external: { 5 | command: "npm run compile", 6 | targets: [{ 7 | path: "./build/*.json" 8 | }] 9 | } 10 | } 11 | }; 12 | --------------------------------------------------------------------------------